From cf00761902188aa1b0b044d06b3e7173281ce90f Mon Sep 17 00:00:00 2001 From: Foxushka <135865149+Foxushka@users.noreply.github.com> Date: Fri, 1 Aug 2025 23:12:07 +0300 Subject: [PATCH] Key recovery via backdoor for static encrypted nonce cards (#263) * Implement MF1_ENC_NESTED_ACQUIRE in firmware * Implement MF1_ENC_NESTED_ACQUIRE in software + fix code formatter * Remove xz and pthreads from sources, use CMake FetchContent * Update changelog * lzma.h * Update CMakeLists.txt * Update CMakeLists.txt * Probably fix workflow taking wrong commit for building * Fix CMake building tools into bin/Debug on Windows * Added cmd for fetching all slots nicks (without 16 commands) * Fix type and use temp directory instead cwd (https://github.com/RfidResearchGroup/ChameleonUltra/pull/261) * Fix endian for mfu_read_emu_counter_data and mfu_write_emu_counter_data * Fix --key interpreted as list --- .github/workflows/on_pr.yml | 4 +- CHANGELOG.md | 4 + firmware/application/src/app_cmd.c | 161 +- firmware/application/src/data_cmd.h | 3 + firmware/application/src/rfid/mf1_crypto1.c | 38 +- .../src/rfid/nfctag/hf/nfc_mf0_ntag.c | 447 +- .../src/rfid/nfctag/lf/lf_tag_em.c | 6 +- .../src/rfid/reader/hf/mf1_toolbox.c | 146 +- .../src/rfid/reader/hf/mf1_toolbox.h | 36 +- .../application/src/rfid/reader/hf/rc522.c | 18 +- .../application/src/rfid/reader/hf/rc522.h | 12 +- resource/tools/make_style.sh | 2 +- software/script/chameleon_cli_unit.py | 480 +- software/script/chameleon_cmd.py | 108 +- software/script/chameleon_enum.py | 8 +- software/script/chameleon_utils.py | 105 +- software/script/tests/output_grabber.py | 4 +- software/script/tests/test_hard_acquire.py | 16 +- software/src/CMakeLists.txt | 172 +- software/src/HardnestedRecovery/cmdhfmfhard.c | 109 +- software/src/HardnestedRecovery/cmdhfmfhard.h | 2 +- software/src/HardnestedRecovery/crapto1.c | 6 +- software/src/HardnestedRecovery/crypto1.c | 4 +- .../hardnested/hardnested_benchmark_data.h | 13352 ++++++++-------- .../hardnested/hardnested_bf_core.c | 24 +- .../hardnested/hardnested_bitarray_core.c | 6 +- .../hardnested/hardnested_bruteforce.c | 83 +- .../HardnestedRecovery/hardnested/tables.c | 8 +- .../HardnestedRecovery/hardnested/tables.h | 4 +- .../src/HardnestedRecovery/hardnested_main.c | 25 +- software/src/HardnestedRecovery/parity.h | 2 +- .../src/HardnestedRecovery/pm3/commonutil.c | 2 +- software/src/HardnestedRecovery/pm3/ui.c | 977 +- software/src/compat/fmemopen/libfmemopen.c | 53 +- software/src/darkside.c | 2 +- software/src/lib/pthread/ANNOUNCE | 483 - software/src/lib/pthread/BUGS | 141 - software/src/lib/pthread/CONTRIBUTORS | 140 - software/src/lib/pthread/COPYING | 150 - software/src/lib/pthread/COPYING.LIB | 504 - software/src/lib/pthread/ChangeLog | 5211 ------ software/src/lib/pthread/FAQ | 451 - software/src/lib/pthread/MAINTAINERS | 4 - software/src/lib/pthread/NEWS | 1241 -- software/src/lib/pthread/PROGRESS | 4 - software/src/lib/pthread/README | 601 - software/src/lib/pthread/README.Borland | 57 - software/src/lib/pthread/README.CV | 3036 ---- software/src/lib/pthread/README.NONPORTABLE | 783 - software/src/lib/pthread/README.Watcom | 62 - software/src/lib/pthread/README.WinCE | 6 - software/src/lib/pthread/WinCE-PORT | 222 - .../src/lib/pthread/dll/x64/pthreadGC2.dll | Bin 185976 -> 0 bytes .../src/lib/pthread/dll/x64/pthreadVC2.dll | Bin 82944 -> 0 bytes .../src/lib/pthread/dll/x86/pthreadGC2.dll | Bin 119888 -> 0 bytes .../src/lib/pthread/dll/x86/pthreadGCE2.dll | Bin 121953 -> 0 bytes .../src/lib/pthread/dll/x86/pthreadVC2.dll | Bin 55808 -> 0 bytes .../src/lib/pthread/dll/x86/pthreadVCE2.dll | Bin 61952 -> 0 bytes .../src/lib/pthread/dll/x86/pthreadVSE2.dll | Bin 57344 -> 0 bytes software/src/lib/pthread/include/pthread.h | 1362 -- software/src/lib/pthread/include/sched.h | 183 - software/src/lib/pthread/include/semaphore.h | 169 - .../src/lib/pthread/lib/x64/libpthreadGC2.a | Bin 93692 -> 0 bytes .../src/lib/pthread/lib/x64/pthreadVC2.lib | Bin 29738 -> 0 bytes .../src/lib/pthread/lib/x86/libpthreadGC2.a | Bin 93480 -> 0 bytes .../src/lib/pthread/lib/x86/libpthreadGCE2.a | Bin 93486 -> 0 bytes .../src/lib/pthread/lib/x86/pthreadVC2.lib | Bin 30334 -> 0 bytes .../src/lib/pthread/lib/x86/pthreadVCE2.lib | Bin 30460 -> 0 bytes .../src/lib/pthread/lib/x86/pthreadVSE2.lib | Bin 30460 -> 0 bytes software/src/nested_util.c | 2 +- software/src/staticnested_1nt.c | 184 + software/src/staticnested_2x1nt_rf08s.c | 279 + software/src/staticnested_2x1nt_rf08s_1key.c | 169 + software/src/xz/CMakeLists.txt | 2485 --- software/src/xz/COPYING | 70 - software/src/xz/COPYING.0BSD | 11 - software/src/xz/Makefile.am | 123 - software/src/xz/README | 3 - software/src/xz/cmake/remove-ordinals.cmake | 25 - software/src/xz/cmake/tuklib_common.cmake | 56 - software/src/xz/cmake/tuklib_cpucores.cmake | 184 - software/src/xz/cmake/tuklib_integer.cmake | 141 - .../xz/cmake/tuklib_large_file_support.cmake | 54 - software/src/xz/cmake/tuklib_mbstr.cmake | 25 - software/src/xz/cmake/tuklib_physmem.cmake | 153 - software/src/xz/cmake/tuklib_progname.cmake | 19 - software/src/xz/configure.ac | 1425 -- software/src/xz/lib/Makefile.am | 44 - software/src/xz/lib/getopt-cdefs.h | 72 - software/src/xz/lib/getopt-core.h | 98 - software/src/xz/lib/getopt-ext.h | 79 - software/src/xz/lib/getopt-pfx-core.h | 68 - software/src/xz/lib/getopt-pfx-ext.h | 72 - software/src/xz/lib/getopt.c | 823 - software/src/xz/lib/getopt.in.h | 60 - software/src/xz/lib/getopt1.c | 163 - software/src/xz/lib/getopt_int.h | 120 - software/src/xz/src/Makefile.am | 45 - software/src/xz/src/common/common_w32res.rc | 57 - software/src/xz/src/common/my_landlock.h | 141 - software/src/xz/src/common/mythread.h | 548 - software/src/xz/src/common/sysdefs.h | 229 - software/src/xz/src/common/tuklib_common.h | 95 - software/src/xz/src/common/tuklib_config.h | 12 - software/src/xz/src/common/tuklib_cpucores.c | 108 - software/src/xz/src/common/tuklib_cpucores.h | 22 - software/src/xz/src/common/tuklib_exit.c | 57 - software/src/xz/src/common/tuklib_exit.h | 24 - software/src/xz/src/common/tuklib_gettext.h | 54 - software/src/xz/src/common/tuklib_integer.h | 954 -- software/src/xz/src/common/tuklib_mbstr.h | 78 - software/src/xz/src/common/tuklib_mbstr_fw.c | 30 - .../src/xz/src/common/tuklib_mbstr_nonprint.c | 162 - .../src/xz/src/common/tuklib_mbstr_nonprint.h | 71 - .../src/xz/src/common/tuklib_mbstr_width.c | 86 - .../src/xz/src/common/tuklib_mbstr_wrap.c | 294 - .../src/xz/src/common/tuklib_mbstr_wrap.h | 204 - .../src/xz/src/common/tuklib_open_stdxxx.c | 56 - .../src/xz/src/common/tuklib_open_stdxxx.h | 22 - software/src/xz/src/common/tuklib_physmem.c | 224 - software/src/xz/src/common/tuklib_physmem.h | 27 - software/src/xz/src/common/tuklib_progname.c | 49 - software/src/xz/src/common/tuklib_progname.h | 31 - .../w32_application.manifest.comments.txt | 192 - software/src/xz/src/liblzma/Makefile.am | 126 - software/src/xz/src/liblzma/api/Makefile.am | 38 - software/src/xz/src/liblzma/api/lzma.h | 327 - software/src/xz/src/liblzma/api/lzma/base.h | 747 - software/src/xz/src/liblzma/api/lzma/bcj.h | 195 - software/src/xz/src/liblzma/api/lzma/block.h | 694 - software/src/xz/src/liblzma/api/lzma/check.h | 163 - .../src/xz/src/liblzma/api/lzma/container.h | 995 -- software/src/xz/src/liblzma/api/lzma/delta.h | 95 - software/src/xz/src/liblzma/api/lzma/filter.h | 769 - .../src/xz/src/liblzma/api/lzma/hardware.h | 62 - software/src/xz/src/liblzma/api/lzma/index.h | 882 - .../src/xz/src/liblzma/api/lzma/index_hash.h | 123 - software/src/xz/src/liblzma/api/lzma/lzma12.h | 568 - .../xz/src/liblzma/api/lzma/stream_flags.h | 265 - .../src/xz/src/liblzma/api/lzma/version.h | 134 - software/src/xz/src/liblzma/api/lzma/vli.h | 166 - .../src/xz/src/liblzma/check/Makefile.inc | 50 - software/src/xz/src/liblzma/check/check.c | 173 - software/src/xz/src/liblzma/check/check.h | 156 - .../src/xz/src/liblzma/check/crc32_arm64.h | 147 - .../src/xz/src/liblzma/check/crc32_fast.c | 196 - .../xz/src/liblzma/check/crc32_loongarch.h | 65 - .../src/xz/src/liblzma/check/crc32_small.c | 70 - .../src/xz/src/liblzma/check/crc32_table_be.h | 527 - .../src/xz/src/liblzma/check/crc32_table_le.h | 527 - .../src/xz/src/liblzma/check/crc32_tablegen.c | 120 - software/src/xz/src/liblzma/check/crc32_x86.S | 308 - .../src/xz/src/liblzma/check/crc64_fast.c | 169 - .../src/xz/src/liblzma/check/crc64_small.c | 57 - .../src/xz/src/liblzma/check/crc64_table_be.h | 523 - .../src/xz/src/liblzma/check/crc64_table_le.h | 523 - .../src/xz/src/liblzma/check/crc64_tablegen.c | 89 - software/src/xz/src/liblzma/check/crc64_x86.S | 291 - .../src/liblzma/check/crc_clmul_consts_gen.c | 160 - .../src/xz/src/liblzma/check/crc_common.h | 170 - .../src/xz/src/liblzma/check/crc_x86_clmul.h | 377 - software/src/xz/src/liblzma/check/sha256.c | 189 - .../src/xz/src/liblzma/common/Makefile.inc | 100 - .../src/xz/src/liblzma/common/alone_decoder.c | 247 - .../src/xz/src/liblzma/common/alone_decoder.h | 22 - .../src/xz/src/liblzma/common/alone_encoder.c | 151 - .../src/xz/src/liblzma/common/auto_decoder.c | 204 - .../src/liblzma/common/block_buffer_decoder.c | 79 - .../src/liblzma/common/block_buffer_encoder.c | 354 - .../src/liblzma/common/block_buffer_encoder.h | 23 - .../src/xz/src/liblzma/common/block_decoder.c | 286 - .../src/xz/src/liblzma/common/block_decoder.h | 21 - .../src/xz/src/liblzma/common/block_encoder.c | 224 - .../src/xz/src/liblzma/common/block_encoder.h | 46 - .../src/liblzma/common/block_header_decoder.c | 114 - .../src/liblzma/common/block_header_encoder.c | 131 - .../src/xz/src/liblzma/common/block_util.c | 89 - software/src/xz/src/liblzma/common/common.c | 486 - software/src/xz/src/liblzma/common/common.h | 412 - .../src/liblzma/common/easy_buffer_encoder.c | 26 - .../liblzma/common/easy_decoder_memusage.c | 23 - .../src/xz/src/liblzma/common/easy_encoder.c | 23 - .../liblzma/common/easy_encoder_memusage.c | 23 - .../src/xz/src/liblzma/common/easy_preset.c | 26 - .../src/xz/src/liblzma/common/easy_preset.h | 36 - .../src/xz/src/liblzma/common/file_info.c | 850 - .../liblzma/common/filter_buffer_decoder.c | 87 - .../liblzma/common/filter_buffer_encoder.c | 54 - .../src/xz/src/liblzma/common/filter_common.c | 393 - .../src/xz/src/liblzma/common/filter_common.h | 50 - .../xz/src/liblzma/common/filter_decoder.c | 214 - .../xz/src/liblzma/common/filter_decoder.h | 22 - .../xz/src/liblzma/common/filter_encoder.c | 330 - .../xz/src/liblzma/common/filter_encoder.h | 22 - .../src/liblzma/common/filter_flags_decoder.c | 45 - .../src/liblzma/common/filter_flags_encoder.c | 55 - .../src/liblzma/common/hardware_cputhreads.c | 33 - .../xz/src/liblzma/common/hardware_physmem.c | 24 - software/src/xz/src/liblzma/common/index.c | 1268 -- software/src/xz/src/liblzma/common/index.h | 80 - .../src/xz/src/liblzma/common/index_decoder.c | 369 - .../src/xz/src/liblzma/common/index_decoder.h | 24 - .../src/xz/src/liblzma/common/index_encoder.c | 260 - .../src/xz/src/liblzma/common/index_encoder.h | 22 - .../src/xz/src/liblzma/common/index_hash.c | 341 - .../src/xz/src/liblzma/common/lzip_decoder.c | 413 - .../src/xz/src/liblzma/common/lzip_decoder.h | 21 - .../src/xz/src/liblzma/common/memcmplen.h | 192 - .../xz/src/liblzma/common/microlzma_decoder.c | 220 - .../xz/src/liblzma/common/microlzma_encoder.c | 140 - software/src/xz/src/liblzma/common/outqueue.c | 286 - software/src/xz/src/liblzma/common/outqueue.h | 258 - .../liblzma/common/stream_buffer_decoder.c | 90 - .../liblzma/common/stream_buffer_encoder.c | 141 - .../xz/src/liblzma/common/stream_decoder.c | 469 - .../xz/src/liblzma/common/stream_decoder.h | 21 - .../xz/src/liblzma/common/stream_decoder_mt.c | 2015 --- .../xz/src/liblzma/common/stream_encoder.c | 354 - .../xz/src/liblzma/common/stream_encoder_mt.c | 1278 -- .../src/liblzma/common/stream_flags_common.c | 46 - .../src/liblzma/common/stream_flags_common.h | 35 - .../src/liblzma/common/stream_flags_decoder.c | 87 - .../src/liblzma/common/stream_flags_encoder.c | 85 - .../xz/src/liblzma/common/string_conversion.c | 1363 -- .../src/xz/src/liblzma/common/vli_decoder.c | 85 - .../src/xz/src/liblzma/common/vli_encoder.c | 68 - software/src/xz/src/liblzma/common/vli_size.c | 29 - .../src/xz/src/liblzma/delta/Makefile.inc | 19 - .../src/xz/src/liblzma/delta/delta_common.c | 72 - .../src/xz/src/liblzma/delta/delta_common.h | 19 - .../src/xz/src/liblzma/delta/delta_decoder.c | 87 - .../src/xz/src/liblzma/delta/delta_decoder.h | 25 - .../src/xz/src/liblzma/delta/delta_encoder.c | 132 - .../src/xz/src/liblzma/delta/delta_encoder.h | 23 - .../src/xz/src/liblzma/delta/delta_private.h | 36 - software/src/xz/src/liblzma/liblzma.pc.in | 16 - software/src/xz/src/liblzma/liblzma_w32res.rc | 19 - software/src/xz/src/liblzma/lz/Makefile.inc | 18 - software/src/xz/src/liblzma/lz/lz_decoder.c | 333 - software/src/xz/src/liblzma/lz/lz_decoder.h | 325 - software/src/xz/src/liblzma/lz/lz_encoder.c | 632 - software/src/xz/src/liblzma/lz/lz_encoder.h | 352 - .../src/xz/src/liblzma/lz/lz_encoder_hash.h | 122 - .../xz/src/liblzma/lz/lz_encoder_hash_table.h | 70 - .../src/xz/src/liblzma/lz/lz_encoder_mf.c | 744 - software/src/xz/src/liblzma/lzma/Makefile.inc | 40 - software/src/xz/src/liblzma/lzma/fastpos.h | 141 - .../src/xz/src/liblzma/lzma/fastpos_table.c | 521 - .../xz/src/liblzma/lzma/fastpos_tablegen.c | 58 - .../src/xz/src/liblzma/lzma/lzma2_decoder.c | 310 - .../src/xz/src/liblzma/lzma/lzma2_decoder.h | 28 - .../src/xz/src/liblzma/lzma/lzma2_encoder.c | 413 - .../src/xz/src/liblzma/lzma/lzma2_encoder.h | 42 - .../src/xz/src/liblzma/lzma/lzma_common.h | 240 - .../src/xz/src/liblzma/lzma/lzma_decoder.c | 1263 -- .../src/xz/src/liblzma/lzma/lzma_decoder.h | 52 - .../src/xz/src/liblzma/lzma/lzma_encoder.c | 786 - .../src/xz/src/liblzma/lzma/lzma_encoder.h | 58 - .../liblzma/lzma/lzma_encoder_optimum_fast.c | 169 - .../lzma/lzma_encoder_optimum_normal.c | 858 - .../src/liblzma/lzma/lzma_encoder_presets.c | 63 - .../src/liblzma/lzma/lzma_encoder_private.h | 161 - .../xz/src/liblzma/rangecoder/Makefile.inc | 17 - .../src/xz/src/liblzma/rangecoder/price.h | 92 - .../xz/src/liblzma/rangecoder/price_table.c | 24 - .../src/liblzma/rangecoder/price_tablegen.c | 93 - .../xz/src/liblzma/rangecoder/range_common.h | 77 - .../xz/src/liblzma/rangecoder/range_decoder.h | 966 -- .../xz/src/liblzma/rangecoder/range_encoder.h | 349 - .../src/xz/src/liblzma/simple/Makefile.inc | 51 - software/src/xz/src/liblzma/simple/arm.c | 76 - software/src/xz/src/liblzma/simple/arm64.c | 156 - software/src/xz/src/liblzma/simple/armthumb.c | 84 - software/src/xz/src/liblzma/simple/ia64.c | 117 - software/src/xz/src/liblzma/simple/powerpc.c | 81 - software/src/xz/src/liblzma/simple/riscv.c | 773 - .../src/xz/src/liblzma/simple/simple_coder.c | 291 - .../src/xz/src/liblzma/simple/simple_coder.h | 89 - .../xz/src/liblzma/simple/simple_decoder.c | 39 - .../xz/src/liblzma/simple/simple_decoder.h | 21 - .../xz/src/liblzma/simple/simple_encoder.c | 37 - .../xz/src/liblzma/simple/simple_encoder.h | 22 - .../xz/src/liblzma/simple/simple_private.h | 73 - software/src/xz/src/liblzma/simple/sparc.c | 87 - software/src/xz/src/liblzma/simple/x86.c | 181 - software/src/xz/src/liblzma/validate_map.sh | 163 - software/src/xz/src/scripts/Makefile.am | 85 - software/src/xz/src/scripts/xzdiff.1 | 99 - software/src/xz/src/scripts/xzdiff.in | 220 - software/src/xz/src/scripts/xzgrep.1 | 148 - software/src/xz/src/scripts/xzgrep.in | 300 - software/src/xz/src/scripts/xzless.1 | 69 - software/src/xz/src/scripts/xzless.in | 74 - software/src/xz/src/scripts/xzmore.1 | 69 - software/src/xz/src/scripts/xzmore.in | 80 - 295 files changed, 9127 insertions(+), 72962 deletions(-) delete mode 100644 software/src/lib/pthread/ANNOUNCE delete mode 100644 software/src/lib/pthread/BUGS delete mode 100644 software/src/lib/pthread/CONTRIBUTORS delete mode 100644 software/src/lib/pthread/COPYING delete mode 100644 software/src/lib/pthread/COPYING.LIB delete mode 100644 software/src/lib/pthread/ChangeLog delete mode 100644 software/src/lib/pthread/FAQ delete mode 100644 software/src/lib/pthread/MAINTAINERS delete mode 100644 software/src/lib/pthread/NEWS delete mode 100644 software/src/lib/pthread/PROGRESS delete mode 100644 software/src/lib/pthread/README delete mode 100644 software/src/lib/pthread/README.Borland delete mode 100644 software/src/lib/pthread/README.CV delete mode 100644 software/src/lib/pthread/README.NONPORTABLE delete mode 100644 software/src/lib/pthread/README.Watcom delete mode 100644 software/src/lib/pthread/README.WinCE delete mode 100644 software/src/lib/pthread/WinCE-PORT delete mode 100644 software/src/lib/pthread/dll/x64/pthreadGC2.dll delete mode 100644 software/src/lib/pthread/dll/x64/pthreadVC2.dll delete mode 100644 software/src/lib/pthread/dll/x86/pthreadGC2.dll delete mode 100644 software/src/lib/pthread/dll/x86/pthreadGCE2.dll delete mode 100644 software/src/lib/pthread/dll/x86/pthreadVC2.dll delete mode 100644 software/src/lib/pthread/dll/x86/pthreadVCE2.dll delete mode 100644 software/src/lib/pthread/dll/x86/pthreadVSE2.dll delete mode 100644 software/src/lib/pthread/include/pthread.h delete mode 100644 software/src/lib/pthread/include/sched.h delete mode 100644 software/src/lib/pthread/include/semaphore.h delete mode 100644 software/src/lib/pthread/lib/x64/libpthreadGC2.a delete mode 100644 software/src/lib/pthread/lib/x64/pthreadVC2.lib delete mode 100644 software/src/lib/pthread/lib/x86/libpthreadGC2.a delete mode 100644 software/src/lib/pthread/lib/x86/libpthreadGCE2.a delete mode 100644 software/src/lib/pthread/lib/x86/pthreadVC2.lib delete mode 100644 software/src/lib/pthread/lib/x86/pthreadVCE2.lib delete mode 100644 software/src/lib/pthread/lib/x86/pthreadVSE2.lib create mode 100644 software/src/staticnested_1nt.c create mode 100644 software/src/staticnested_2x1nt_rf08s.c create mode 100644 software/src/staticnested_2x1nt_rf08s_1key.c delete mode 100644 software/src/xz/CMakeLists.txt delete mode 100644 software/src/xz/COPYING delete mode 100644 software/src/xz/COPYING.0BSD delete mode 100644 software/src/xz/Makefile.am delete mode 100644 software/src/xz/README delete mode 100644 software/src/xz/cmake/remove-ordinals.cmake delete mode 100644 software/src/xz/cmake/tuklib_common.cmake delete mode 100644 software/src/xz/cmake/tuklib_cpucores.cmake delete mode 100644 software/src/xz/cmake/tuklib_integer.cmake delete mode 100644 software/src/xz/cmake/tuklib_large_file_support.cmake delete mode 100644 software/src/xz/cmake/tuklib_mbstr.cmake delete mode 100644 software/src/xz/cmake/tuklib_physmem.cmake delete mode 100644 software/src/xz/cmake/tuklib_progname.cmake delete mode 100644 software/src/xz/configure.ac delete mode 100644 software/src/xz/lib/Makefile.am delete mode 100644 software/src/xz/lib/getopt-cdefs.h delete mode 100644 software/src/xz/lib/getopt-core.h delete mode 100644 software/src/xz/lib/getopt-ext.h delete mode 100644 software/src/xz/lib/getopt-pfx-core.h delete mode 100644 software/src/xz/lib/getopt-pfx-ext.h delete mode 100644 software/src/xz/lib/getopt.c delete mode 100644 software/src/xz/lib/getopt.in.h delete mode 100644 software/src/xz/lib/getopt1.c delete mode 100644 software/src/xz/lib/getopt_int.h delete mode 100644 software/src/xz/src/Makefile.am delete mode 100644 software/src/xz/src/common/common_w32res.rc delete mode 100644 software/src/xz/src/common/my_landlock.h delete mode 100644 software/src/xz/src/common/mythread.h delete mode 100644 software/src/xz/src/common/sysdefs.h delete mode 100644 software/src/xz/src/common/tuklib_common.h delete mode 100644 software/src/xz/src/common/tuklib_config.h delete mode 100644 software/src/xz/src/common/tuklib_cpucores.c delete mode 100644 software/src/xz/src/common/tuklib_cpucores.h delete mode 100644 software/src/xz/src/common/tuklib_exit.c delete mode 100644 software/src/xz/src/common/tuklib_exit.h delete mode 100644 software/src/xz/src/common/tuklib_gettext.h delete mode 100644 software/src/xz/src/common/tuklib_integer.h delete mode 100644 software/src/xz/src/common/tuklib_mbstr.h delete mode 100644 software/src/xz/src/common/tuklib_mbstr_fw.c delete mode 100644 software/src/xz/src/common/tuklib_mbstr_nonprint.c delete mode 100644 software/src/xz/src/common/tuklib_mbstr_nonprint.h delete mode 100644 software/src/xz/src/common/tuklib_mbstr_width.c delete mode 100644 software/src/xz/src/common/tuklib_mbstr_wrap.c delete mode 100644 software/src/xz/src/common/tuklib_mbstr_wrap.h delete mode 100644 software/src/xz/src/common/tuklib_open_stdxxx.c delete mode 100644 software/src/xz/src/common/tuklib_open_stdxxx.h delete mode 100644 software/src/xz/src/common/tuklib_physmem.c delete mode 100644 software/src/xz/src/common/tuklib_physmem.h delete mode 100644 software/src/xz/src/common/tuklib_progname.c delete mode 100644 software/src/xz/src/common/tuklib_progname.h delete mode 100644 software/src/xz/src/common/w32_application.manifest.comments.txt delete mode 100644 software/src/xz/src/liblzma/Makefile.am delete mode 100644 software/src/xz/src/liblzma/api/Makefile.am delete mode 100644 software/src/xz/src/liblzma/api/lzma.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/base.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/bcj.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/block.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/check.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/container.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/delta.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/filter.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/hardware.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/index.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/index_hash.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/lzma12.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/stream_flags.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/version.h delete mode 100644 software/src/xz/src/liblzma/api/lzma/vli.h delete mode 100644 software/src/xz/src/liblzma/check/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/check/check.c delete mode 100644 software/src/xz/src/liblzma/check/check.h delete mode 100644 software/src/xz/src/liblzma/check/crc32_arm64.h delete mode 100644 software/src/xz/src/liblzma/check/crc32_fast.c delete mode 100644 software/src/xz/src/liblzma/check/crc32_loongarch.h delete mode 100644 software/src/xz/src/liblzma/check/crc32_small.c delete mode 100644 software/src/xz/src/liblzma/check/crc32_table_be.h delete mode 100644 software/src/xz/src/liblzma/check/crc32_table_le.h delete mode 100644 software/src/xz/src/liblzma/check/crc32_tablegen.c delete mode 100644 software/src/xz/src/liblzma/check/crc32_x86.S delete mode 100644 software/src/xz/src/liblzma/check/crc64_fast.c delete mode 100644 software/src/xz/src/liblzma/check/crc64_small.c delete mode 100644 software/src/xz/src/liblzma/check/crc64_table_be.h delete mode 100644 software/src/xz/src/liblzma/check/crc64_table_le.h delete mode 100644 software/src/xz/src/liblzma/check/crc64_tablegen.c delete mode 100644 software/src/xz/src/liblzma/check/crc64_x86.S delete mode 100644 software/src/xz/src/liblzma/check/crc_clmul_consts_gen.c delete mode 100644 software/src/xz/src/liblzma/check/crc_common.h delete mode 100644 software/src/xz/src/liblzma/check/crc_x86_clmul.h delete mode 100644 software/src/xz/src/liblzma/check/sha256.c delete mode 100644 software/src/xz/src/liblzma/common/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/common/alone_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/alone_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/alone_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/auto_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_buffer_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_buffer_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_buffer_encoder.h delete mode 100644 software/src/xz/src/liblzma/common/block_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/block_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_encoder.h delete mode 100644 software/src/xz/src/liblzma/common/block_header_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_header_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/block_util.c delete mode 100644 software/src/xz/src/liblzma/common/common.c delete mode 100644 software/src/xz/src/liblzma/common/common.h delete mode 100644 software/src/xz/src/liblzma/common/easy_buffer_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/easy_decoder_memusage.c delete mode 100644 software/src/xz/src/liblzma/common/easy_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/easy_encoder_memusage.c delete mode 100644 software/src/xz/src/liblzma/common/easy_preset.c delete mode 100644 software/src/xz/src/liblzma/common/easy_preset.h delete mode 100644 software/src/xz/src/liblzma/common/file_info.c delete mode 100644 software/src/xz/src/liblzma/common/filter_buffer_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/filter_buffer_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/filter_common.c delete mode 100644 software/src/xz/src/liblzma/common/filter_common.h delete mode 100644 software/src/xz/src/liblzma/common/filter_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/filter_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/filter_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/filter_encoder.h delete mode 100644 software/src/xz/src/liblzma/common/filter_flags_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/filter_flags_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/hardware_cputhreads.c delete mode 100644 software/src/xz/src/liblzma/common/hardware_physmem.c delete mode 100644 software/src/xz/src/liblzma/common/index.c delete mode 100644 software/src/xz/src/liblzma/common/index.h delete mode 100644 software/src/xz/src/liblzma/common/index_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/index_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/index_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/index_encoder.h delete mode 100644 software/src/xz/src/liblzma/common/index_hash.c delete mode 100644 software/src/xz/src/liblzma/common/lzip_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/lzip_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/memcmplen.h delete mode 100644 software/src/xz/src/liblzma/common/microlzma_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/microlzma_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/outqueue.c delete mode 100644 software/src/xz/src/liblzma/common/outqueue.h delete mode 100644 software/src/xz/src/liblzma/common/stream_buffer_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/stream_buffer_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/stream_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/stream_decoder.h delete mode 100644 software/src/xz/src/liblzma/common/stream_decoder_mt.c delete mode 100644 software/src/xz/src/liblzma/common/stream_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/stream_encoder_mt.c delete mode 100644 software/src/xz/src/liblzma/common/stream_flags_common.c delete mode 100644 software/src/xz/src/liblzma/common/stream_flags_common.h delete mode 100644 software/src/xz/src/liblzma/common/stream_flags_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/stream_flags_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/string_conversion.c delete mode 100644 software/src/xz/src/liblzma/common/vli_decoder.c delete mode 100644 software/src/xz/src/liblzma/common/vli_encoder.c delete mode 100644 software/src/xz/src/liblzma/common/vli_size.c delete mode 100644 software/src/xz/src/liblzma/delta/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/delta/delta_common.c delete mode 100644 software/src/xz/src/liblzma/delta/delta_common.h delete mode 100644 software/src/xz/src/liblzma/delta/delta_decoder.c delete mode 100644 software/src/xz/src/liblzma/delta/delta_decoder.h delete mode 100644 software/src/xz/src/liblzma/delta/delta_encoder.c delete mode 100644 software/src/xz/src/liblzma/delta/delta_encoder.h delete mode 100644 software/src/xz/src/liblzma/delta/delta_private.h delete mode 100644 software/src/xz/src/liblzma/liblzma.pc.in delete mode 100644 software/src/xz/src/liblzma/liblzma_w32res.rc delete mode 100644 software/src/xz/src/liblzma/lz/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/lz/lz_decoder.c delete mode 100644 software/src/xz/src/liblzma/lz/lz_decoder.h delete mode 100644 software/src/xz/src/liblzma/lz/lz_encoder.c delete mode 100644 software/src/xz/src/liblzma/lz/lz_encoder.h delete mode 100644 software/src/xz/src/liblzma/lz/lz_encoder_hash.h delete mode 100644 software/src/xz/src/liblzma/lz/lz_encoder_hash_table.h delete mode 100644 software/src/xz/src/liblzma/lz/lz_encoder_mf.c delete mode 100644 software/src/xz/src/liblzma/lzma/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/lzma/fastpos.h delete mode 100644 software/src/xz/src/liblzma/lzma/fastpos_table.c delete mode 100644 software/src/xz/src/liblzma/lzma/fastpos_tablegen.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma2_decoder.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma2_decoder.h delete mode 100644 software/src/xz/src/liblzma/lzma/lzma2_encoder.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma2_encoder.h delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_common.h delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_decoder.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_decoder.h delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder.h delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder_presets.c delete mode 100644 software/src/xz/src/liblzma/lzma/lzma_encoder_private.h delete mode 100644 software/src/xz/src/liblzma/rangecoder/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/rangecoder/price.h delete mode 100644 software/src/xz/src/liblzma/rangecoder/price_table.c delete mode 100644 software/src/xz/src/liblzma/rangecoder/price_tablegen.c delete mode 100644 software/src/xz/src/liblzma/rangecoder/range_common.h delete mode 100644 software/src/xz/src/liblzma/rangecoder/range_decoder.h delete mode 100644 software/src/xz/src/liblzma/rangecoder/range_encoder.h delete mode 100644 software/src/xz/src/liblzma/simple/Makefile.inc delete mode 100644 software/src/xz/src/liblzma/simple/arm.c delete mode 100644 software/src/xz/src/liblzma/simple/arm64.c delete mode 100644 software/src/xz/src/liblzma/simple/armthumb.c delete mode 100644 software/src/xz/src/liblzma/simple/ia64.c delete mode 100644 software/src/xz/src/liblzma/simple/powerpc.c delete mode 100644 software/src/xz/src/liblzma/simple/riscv.c delete mode 100644 software/src/xz/src/liblzma/simple/simple_coder.c delete mode 100644 software/src/xz/src/liblzma/simple/simple_coder.h delete mode 100644 software/src/xz/src/liblzma/simple/simple_decoder.c delete mode 100644 software/src/xz/src/liblzma/simple/simple_decoder.h delete mode 100644 software/src/xz/src/liblzma/simple/simple_encoder.c delete mode 100644 software/src/xz/src/liblzma/simple/simple_encoder.h delete mode 100644 software/src/xz/src/liblzma/simple/simple_private.h delete mode 100644 software/src/xz/src/liblzma/simple/sparc.c delete mode 100644 software/src/xz/src/liblzma/simple/x86.c delete mode 100644 software/src/xz/src/liblzma/validate_map.sh delete mode 100644 software/src/xz/src/scripts/Makefile.am delete mode 100644 software/src/xz/src/scripts/xzdiff.1 delete mode 100644 software/src/xz/src/scripts/xzdiff.in delete mode 100644 software/src/xz/src/scripts/xzgrep.1 delete mode 100644 software/src/xz/src/scripts/xzgrep.in delete mode 100644 software/src/xz/src/scripts/xzless.1 delete mode 100644 software/src/xz/src/scripts/xzless.in delete mode 100644 software/src/xz/src/scripts/xzmore.1 delete mode 100644 software/src/xz/src/scripts/xzmore.in diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml index fe0ff3b..2e55cef 100644 --- a/.github/workflows/on_pr.yml +++ b/.github/workflows/on_pr.yml @@ -10,12 +10,12 @@ jobs: contents: read uses: ./.github/workflows/build_firmware.yml with: - checkout-sha: "${{ github.event.pull_request.merge_commit_sha }}" + checkout-sha: "${{ github.event.pull_request.head.sha }}" client_pipeline: name: Build Firmware uses: ./.github/workflows/build_client.yml with: - checkout-sha: "${{ github.event.pull_request.merge_commit_sha }}" + checkout-sha: "${{ github.event.pull_request.head.sha }}" comment: runs-on: ubuntu-latest name: Comment on PR diff --git a/CHANGELOG.md b/CHANGELOG.md index bf32f05..24e27d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Added cmd for fetching all slots nicks (@Foxushka) + - Added `hf mf senested` for recovering keys from static encrypted cards via backdoor (https://eprint.iacr.org/2024/1275) (@Foxushka) + - Added cmd for faster bulk key checking on one block (~33 keys per second) (@Foxushka) + - Added cmd to acquire nonces for static encrypted cards via backdoor (@Foxushka) - Added `firmware/docker-compose.yml` to build firmware in local docker (@taichunmin) - Added cmd to acquire nonces for hardnested(Protocol doc need update) (@xianglin1998) - Added command to check keys of multiple sectors at once (@taichunmin) diff --git a/firmware/application/src/app_cmd.c b/firmware/application/src/app_cmd.c index 9958e66..b9d83e6 100644 --- a/firmware/application/src/app_cmd.c +++ b/firmware/application/src/app_cmd.c @@ -330,6 +330,33 @@ static data_frame_tx_t *cmd_processor_mf1_nested_acquire(uint16_t cmd, uint16_t return data_frame_make(cmd, STATUS_HF_TAG_OK, sizeof(ncs), (uint8_t *)(&ncs)); } +static data_frame_tx_t *cmd_processor_mf1_enc_nested_acquire(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + typedef struct { + uint8_t key[6]; + uint8_t sector_count; + uint8_t starting_sector; + } PACKED payload_t; + + if (length != sizeof(payload_t)) { + return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); + } + + payload_t *payload = (payload_t *)data; + + uint64_t ui64Key = bytes_to_num(payload->key, 6); + uint8_t sector_data[40][sizeof(mf1_static_nonce_sector_t)]; + uint8_t sectors_acquired = 0; + uint32_t cuid = 0; + + status = mf1_static_encrypted_nonces_acquire(ui64Key, payload->sector_count, payload->starting_sector, sector_data, §ors_acquired, &cuid); + + uint8_t response_data[sizeof(uint32_t) + sectors_acquired * sizeof(mf1_static_nonce_sector_t)]; + num_to_bytes(cuid, 4, response_data); + memcpy(response_data + sizeof(uint32_t), sector_data, sectors_acquired * sizeof(mf1_static_nonce_sector_t)); + + return data_frame_make(cmd, status, sectors_acquired * sizeof(mf1_static_nonce_sector_t) + sizeof(uint32_t), response_data); +} + static data_frame_tx_t *cmd_processor_mf1_auth_one_key_block(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { typedef struct { uint8_t type; @@ -363,8 +390,30 @@ static data_frame_tx_t *cmd_processor_mf1_check_keys_of_sectors(uint16_t cmd, ui return data_frame_make(cmd, status, sizeof(out), (uint8_t *)&out); } +static data_frame_tx_t *cmd_processor_mf1_check_keys_on_block(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + if (length < 3 || (length - 3) % 6 != 0) { + return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); + } + + mf1_toolbox_check_keys_on_block_in_t in = { + .block = data[0], + .key_type = data[1], + .keys_len = data[2], + .keys = (mf1_key_t *) &data[3] + }; + + if ((length - 3) / 6 != in.keys_len) { + return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); + } + + mf1_toolbox_check_keys_on_block_out_t out; + status = mf1_toolbox_check_keys_on_block(&in, &out); + + return data_frame_make(cmd, status, sizeof(out), (uint8_t *)&out); +} + static data_frame_tx_t *cmd_processor_mf1_hardnested_nonces_acquire(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { - typedef struct { + typedef struct { uint8_t slow; uint8_t type_known; uint8_t block_known; @@ -376,7 +425,7 @@ static data_frame_tx_t *cmd_processor_mf1_hardnested_nonces_acquire(uint16_t cmd return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); } payload_t *payload = (payload_t *)data; - + // It is enough to collect 110 nonces at a time. The total transmitted data payload is 495 + 1 bytes // Then, the total length can be controlled within 512, so that when encountering a BLE host that supports large packets, one communication can be completed. // There is no need to send or receive packets in separate packets, which improves communication speed. @@ -385,16 +434,16 @@ static data_frame_tx_t *cmd_processor_mf1_hardnested_nonces_acquire(uint16_t cmd return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); } status = mf1_hardnested_nonces_acquire( - payload->slow, - payload->block_known, - payload->type_known, - bytes_to_num(payload->key_known, 6), - payload->block_target, - payload->type_target, - nonces + 1, - sizeof(nonces) - 1, // The upper limit of the buffer size. Here we take out the first byte to mark the number of collections. - &nonces[0] // The number of random numbers collected above - ); + payload->slow, + payload->block_known, + payload->type_known, + bytes_to_num(payload->key_known, 6), + payload->block_target, + payload->type_target, + nonces + 1, + sizeof(nonces) - 1, // The upper limit of the buffer size. Here we take out the first byte to mark the number of collections. + &nonces[0] // The number of random numbers collected above + ); if (status != STATUS_HF_TAG_OK) { return data_frame_make(cmd, status, 0, NULL); } @@ -733,27 +782,27 @@ static nfc_tag_14a_coll_res_reference_t *get_coll_res_data(bool write) { tag_emulation_get_specific_types_by_slot(tag_emulation_get_slot(), &tag_types); switch (tag_types.tag_hf) { - case TAG_TYPE_MIFARE_1024: - case TAG_TYPE_MIFARE_2048: - case TAG_TYPE_MIFARE_4096: - case TAG_TYPE_MIFARE_Mini: - info = write ? get_mifare_coll_res() : get_saved_mifare_coll_res(); - break; - case TAG_TYPE_MF0ICU1: - case TAG_TYPE_MF0ICU2: - case TAG_TYPE_MF0UL11: - case TAG_TYPE_MF0UL21: - case TAG_TYPE_NTAG_210: - case TAG_TYPE_NTAG_212: - case TAG_TYPE_NTAG_213: - case TAG_TYPE_NTAG_215: - case TAG_TYPE_NTAG_216: - info = nfc_tag_mf0_ntag_get_coll_res(); - break; - default: - // no collision resolution data for slot - info = NULL; - break; + case TAG_TYPE_MIFARE_1024: + case TAG_TYPE_MIFARE_2048: + case TAG_TYPE_MIFARE_4096: + case TAG_TYPE_MIFARE_Mini: + info = write ? get_mifare_coll_res() : get_saved_mifare_coll_res(); + break; + case TAG_TYPE_MF0ICU1: + case TAG_TYPE_MF0ICU2: + case TAG_TYPE_MF0UL11: + case TAG_TYPE_MF0UL21: + case TAG_TYPE_NTAG_210: + case TAG_TYPE_NTAG_212: + case TAG_TYPE_NTAG_213: + case TAG_TYPE_NTAG_215: + case TAG_TYPE_NTAG_216: + info = nfc_tag_mf0_ntag_get_coll_res(); + break; + default: + // no collision resolution data for slot + info = NULL; + break; } return info; @@ -881,8 +930,8 @@ static data_frame_tx_t *cmd_processor_mf0_ntag_write_emu_page_data(uint16_t cmd, if (pages_count == 0) return data_frame_make(cmd, STATUS_SUCCESS, 0, NULL); else if ( - (page_index >= ((int)nr_pages)) - || (pages_count > (((int)nr_pages) - page_index)) + (page_index >= ((int)nr_pages)) + || (pages_count > (((int)nr_pages) - page_index)) || (((int)length - 2) < byte_length) ) { byte = nr_pages; @@ -1090,6 +1139,45 @@ static data_frame_tx_t *cmd_processor_get_slot_tag_nick(uint16_t cmd, uint16_t s return data_frame_make(cmd, STATUS_SUCCESS, buffer[0], &buffer[1]); } +static data_frame_tx_t *cmd_processor_get_all_slot_nicks(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { + uint8_t response_buffer[TAG_MAX_SLOT_NUM * 2 * 37]; // Max possible size: 8 slots * 2 sense types * (1 byte length + 36 bytes nick) + uint16_t response_length = 0; + + for (uint8_t slot = 0; slot < TAG_MAX_SLOT_NUM; slot++) { + uint8_t hf_buffer[36]; + fds_slot_record_map_t hf_map_info; + get_fds_map_by_slot_sense_type_for_nick(slot, TAG_SENSE_HF, &hf_map_info); + uint16_t hf_buffer_length = sizeof(hf_buffer); + bool hf_ret = fds_read_sync(hf_map_info.id, hf_map_info.key, &hf_buffer_length, hf_buffer); + + if (hf_ret && hf_buffer_length > 0) { + response_buffer[response_length++] = hf_buffer[0]; + for (uint8_t i = 1; i <= hf_buffer[0] && i < hf_buffer_length; i++) { + response_buffer[response_length++] = hf_buffer[i]; + } + } else { + response_buffer[response_length++] = 0; + } + + uint8_t lf_buffer[36]; + fds_slot_record_map_t lf_map_info; + get_fds_map_by_slot_sense_type_for_nick(slot, TAG_SENSE_LF, &lf_map_info); + uint16_t lf_buffer_length = sizeof(lf_buffer); + bool lf_ret = fds_read_sync(lf_map_info.id, lf_map_info.key, &lf_buffer_length, lf_buffer); + + if (lf_ret && lf_buffer_length > 0) { + response_buffer[response_length++] = lf_buffer[0]; + for (uint8_t i = 1; i <= lf_buffer[0] && i < lf_buffer_length; i++) { + response_buffer[response_length++] = lf_buffer[i]; + } + } else { + response_buffer[response_length++] = 0; + } + } + + return data_frame_make(cmd, STATUS_SUCCESS, response_length, response_buffer); +} + static data_frame_tx_t *cmd_processor_delete_slot_tag_nick(uint16_t cmd, uint16_t status, uint16_t length, uint8_t *data) { if (length != 2) { return data_frame_make(cmd, STATUS_PAR_ERR, 0, NULL); @@ -1327,6 +1415,7 @@ static cmd_data_map_t m_data_cmd_map[] = { { DATA_CMD_GET_DEVICE_CAPABILITIES, NULL, cmd_processor_get_device_capabilities, NULL }, { DATA_CMD_GET_BLE_PAIRING_ENABLE, NULL, cmd_processor_get_ble_pairing_enable, NULL }, { DATA_CMD_SET_BLE_PAIRING_ENABLE, NULL, cmd_processor_set_ble_pairing_enable, NULL }, + { DATA_CMD_GET_ALL_SLOT_NICKS, NULL, cmd_processor_get_all_slot_nicks, NULL }, #if defined(PROJECT_CHAMELEON_ULTRA) @@ -1337,6 +1426,7 @@ static cmd_data_map_t m_data_cmd_map[] = { { DATA_CMD_MF1_DARKSIDE_ACQUIRE, before_hf_reader_run, cmd_processor_mf1_darkside_acquire, after_hf_reader_run }, { DATA_CMD_MF1_DETECT_NT_DIST, before_hf_reader_run, cmd_processor_mf1_detect_nt_dist, after_hf_reader_run }, { DATA_CMD_MF1_NESTED_ACQUIRE, before_hf_reader_run, cmd_processor_mf1_nested_acquire, after_hf_reader_run }, + { DATA_CMD_MF1_ENC_NESTED_ACQUIRE, before_hf_reader_run, cmd_processor_mf1_enc_nested_acquire, after_hf_reader_run }, { DATA_CMD_MF1_AUTH_ONE_KEY_BLOCK, before_hf_reader_run, cmd_processor_mf1_auth_one_key_block, after_hf_reader_run }, { DATA_CMD_MF1_READ_ONE_BLOCK, before_hf_reader_run, cmd_processor_mf1_read_one_block, after_hf_reader_run }, @@ -1345,6 +1435,7 @@ static cmd_data_map_t m_data_cmd_map[] = { { DATA_CMD_MF1_MANIPULATE_VALUE_BLOCK, before_hf_reader_run, cmd_processor_mf1_manipulate_value_block, after_hf_reader_run }, { DATA_CMD_MF1_CHECK_KEYS_OF_SECTORS, before_hf_reader_run, cmd_processor_mf1_check_keys_of_sectors, after_hf_reader_run }, { DATA_CMD_MF1_HARDNESTED_ACQUIRE, before_hf_reader_run, cmd_processor_mf1_hardnested_nonces_acquire, after_hf_reader_run }, + { DATA_CMD_MF1_CHECK_KEYS_ON_BLOCK, before_hf_reader_run, cmd_processor_mf1_check_keys_on_block, after_hf_reader_run }, { DATA_CMD_EM410X_SCAN, before_reader_run, cmd_processor_em410x_scan, NULL }, { DATA_CMD_EM410X_WRITE_TO_T55XX, before_reader_run, cmd_processor_em410x_write_to_t55XX, NULL }, diff --git a/firmware/application/src/data_cmd.h b/firmware/application/src/data_cmd.h index a898ffb..1df66de 100644 --- a/firmware/application/src/data_cmd.h +++ b/firmware/application/src/data_cmd.h @@ -45,6 +45,7 @@ #define DATA_CMD_GET_DEVICE_CAPABILITIES (1035) #define DATA_CMD_GET_BLE_PAIRING_ENABLE (1036) #define DATA_CMD_SET_BLE_PAIRING_ENABLE (1037) +#define DATA_CMD_GET_ALL_SLOT_NICKS (1038) // // ****************************************************************** @@ -69,6 +70,8 @@ #define DATA_CMD_MF1_MANIPULATE_VALUE_BLOCK (2011) #define DATA_CMD_MF1_CHECK_KEYS_OF_SECTORS (2012) #define DATA_CMD_MF1_HARDNESTED_ACQUIRE (2013) +#define DATA_CMD_MF1_ENC_NESTED_ACQUIRE (2014) +#define DATA_CMD_MF1_CHECK_KEYS_ON_BLOCK (2015) // // ****************************************************************** diff --git a/firmware/application/src/rfid/mf1_crypto1.c b/firmware/application/src/rfid/mf1_crypto1.c index d7a0178..bdfc5e7 100644 --- a/firmware/application/src/rfid/mf1_crypto1.c +++ b/firmware/application/src/rfid/mf1_crypto1.c @@ -274,26 +274,26 @@ static const uint8_t TableC0[32] = { static const uint8_t TableC7[32] = { /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ FC(0, 0, 0, 0, 0) << 7, FC(0, 0, 0, 0, 1) << 7, FC(0, 0, 0, 1, 0) << 7, FC(0, 0, 0, 1, 1) << 7, - FC(0, 0, 1, 0, 0) << 7, FC(0, 0, 1, 0, 1) << 7, FC(0, 0, 1, 1, 0) << 7, FC(0, 0, 1, 1, 1) << 7, - FC(0, 1, 0, 0, 0) << 7, FC(0, 1, 0, 0, 1) << 7, FC(0, 1, 0, 1, 0) << 7, FC(0, 1, 0, 1, 1) << 7, - FC(0, 1, 1, 0, 0) << 7, FC(0, 1, 1, 0, 1) << 7, FC(0, 1, 1, 1, 0) << 7, FC(0, 1, 1, 1, 1) << 7, - FC(1, 0, 0, 0, 0) << 7, FC(1, 0, 0, 0, 1) << 7, FC(1, 0, 0, 1, 0) << 7, FC(1, 0, 0, 1, 1) << 7, - FC(1, 0, 1, 0, 0) << 7, FC(1, 0, 1, 0, 1) << 7, FC(1, 0, 1, 1, 0) << 7, FC(1, 0, 1, 1, 1) << 7, - FC(1, 1, 0, 0, 0) << 7, FC(1, 1, 0, 0, 1) << 7, FC(1, 1, 0, 1, 0) << 7, FC(1, 1, 0, 1, 1) << 7, - FC(1, 1, 1, 0, 0) << 7, FC(1, 1, 1, 0, 1) << 7, FC(1, 1, 1, 1, 0) << 7, FC(1, 1, 1, 1, 1) << 7 + FC(0, 0, 1, 0, 0) << 7, FC(0, 0, 1, 0, 1) << 7, FC(0, 0, 1, 1, 0) << 7, FC(0, 0, 1, 1, 1) << 7, + FC(0, 1, 0, 0, 0) << 7, FC(0, 1, 0, 0, 1) << 7, FC(0, 1, 0, 1, 0) << 7, FC(0, 1, 0, 1, 1) << 7, + FC(0, 1, 1, 0, 0) << 7, FC(0, 1, 1, 0, 1) << 7, FC(0, 1, 1, 1, 0) << 7, FC(0, 1, 1, 1, 1) << 7, + FC(1, 0, 0, 0, 0) << 7, FC(1, 0, 0, 0, 1) << 7, FC(1, 0, 0, 1, 0) << 7, FC(1, 0, 0, 1, 1) << 7, + FC(1, 0, 1, 0, 0) << 7, FC(1, 0, 1, 0, 1) << 7, FC(1, 0, 1, 1, 0) << 7, FC(1, 0, 1, 1, 1) << 7, + FC(1, 1, 0, 0, 0) << 7, FC(1, 1, 0, 0, 1) << 7, FC(1, 1, 0, 1, 0) << 7, FC(1, 1, 0, 1, 1) << 7, + FC(1, 1, 1, 0, 0) << 7, FC(1, 1, 1, 0, 1) << 7, FC(1, 1, 1, 1, 0) << 7, FC(1, 1, 1, 1, 1) << 7 }; /* Special table for nibble processing (e.g. ack), feedback at bit 3 */ static const uint8_t TableC3[32] = { /* fc with Input {4,3,2,1,0} = (0,0,0,0,0) to (1,1,1,1,1) */ FC(0, 0, 0, 0, 0) << 3, FC(0, 0, 0, 0, 1) << 3, FC(0, 0, 0, 1, 0) << 3, FC(0, 0, 0, 1, 1) << 3, - FC(0, 0, 1, 0, 0) << 3, FC(0, 0, 1, 0, 1) << 3, FC(0, 0, 1, 1, 0) << 3, FC(0, 0, 1, 1, 1) << 3, - FC(0, 1, 0, 0, 0) << 3, FC(0, 1, 0, 0, 1) << 3, FC(0, 1, 0, 1, 0) << 3, FC(0, 1, 0, 1, 1) << 3, - FC(0, 1, 1, 0, 0) << 3, FC(0, 1, 1, 0, 1) << 3, FC(0, 1, 1, 1, 0) << 3, FC(0, 1, 1, 1, 1) << 3, - FC(1, 0, 0, 0, 0) << 3, FC(1, 0, 0, 0, 1) << 3, FC(1, 0, 0, 1, 0) << 3, FC(1, 0, 0, 1, 1) << 3, - FC(1, 0, 1, 0, 0) << 3, FC(1, 0, 1, 0, 1) << 3, FC(1, 0, 1, 1, 0) << 3, FC(1, 0, 1, 1, 1) << 3, - FC(1, 1, 0, 0, 0) << 3, FC(1, 1, 0, 0, 1) << 3, FC(1, 1, 0, 1, 0) << 3, FC(1, 1, 0, 1, 1) << 3, - FC(1, 1, 1, 0, 0) << 3, FC(1, 1, 1, 0, 1) << 3, FC(1, 1, 1, 1, 0) << 3, FC(1, 1, 1, 1, 1) << 3 + FC(0, 0, 1, 0, 0) << 3, FC(0, 0, 1, 0, 1) << 3, FC(0, 0, 1, 1, 0) << 3, FC(0, 0, 1, 1, 1) << 3, + FC(0, 1, 0, 0, 0) << 3, FC(0, 1, 0, 0, 1) << 3, FC(0, 1, 0, 1, 0) << 3, FC(0, 1, 0, 1, 1) << 3, + FC(0, 1, 1, 0, 0) << 3, FC(0, 1, 1, 0, 1) << 3, FC(0, 1, 1, 1, 0) << 3, FC(0, 1, 1, 1, 1) << 3, + FC(1, 0, 0, 0, 0) << 3, FC(1, 0, 0, 0, 1) << 3, FC(1, 0, 0, 1, 0) << 3, FC(1, 0, 0, 1, 1) << 3, + FC(1, 0, 1, 0, 0) << 3, FC(1, 0, 1, 0, 1) << 3, FC(1, 0, 1, 1, 0) << 3, FC(1, 0, 1, 1, 1) << 3, + FC(1, 1, 0, 0, 0) << 3, FC(1, 1, 0, 0, 1) << 3, FC(1, 1, 0, 1, 0) << 3, FC(1, 1, 0, 1, 1) << 3, + FC(1, 1, 1, 0, 0) << 3, FC(1, 1, 1, 0, 1) << 3, FC(1, 1, 1, 1, 0) << 3, FC(1, 1, 1, 1, 1) << 3 }; /* Filter Output Macros */ @@ -340,11 +340,11 @@ void Crypto1GetState(uint8_t *pEven, uint8_t *pOdd) { /* Proceed LFSR by one clock cycle */ /* Prototype to force inlining */ static __inline__ uint8_t Crypto1LFSRbyteFeedback(uint8_t E0, - uint8_t E1, - uint8_t E2, - uint8_t O0, - uint8_t O1, - uint8_t O2) __attribute__((always_inline)); + uint8_t E1, + uint8_t E2, + uint8_t O0, + uint8_t O1, + uint8_t O2) __attribute__((always_inline)); static uint8_t Crypto1LFSRbyteFeedback(uint8_t E0, uint8_t E1, uint8_t E2, diff --git a/firmware/application/src/rfid/nfctag/hf/nfc_mf0_ntag.c b/firmware/application/src/rfid/nfctag/hf/nfc_mf0_ntag.c index 8623aa5..cadcaed 100644 --- a/firmware/application/src/rfid/nfctag/hf/nfc_mf0_ntag.c +++ b/firmware/application/src/rfid/nfctag/hf/nfc_mf0_ntag.c @@ -257,7 +257,7 @@ static int get_block_max_by_tag_type(tag_specific_type_t tag_type, bool read) { int first_cfg_page = get_first_cfg_page_by_tag_type(tag_type); if (first_cfg_page == 0 || m_tag_authenticated || m_tag_information->config.mode_uid_magic) return max_pages; - + uint8_t auth0 = m_tag_information->memory[first_cfg_page][CONF_AUTH0_BYTE]; uint8_t access = m_tag_information->memory[first_cfg_page + 1][0]; @@ -390,15 +390,15 @@ static void handle_read_sig_command() { static int mirror_size_for_mode(uint8_t mirror_mode) { switch (mirror_mode) { - case MIRROR_CONF_UID: - return MIRROR_UID_SIZE; - case MIRROR_CONF_CNT: - return MIRROR_CNT_SIZE; - case MIRROR_CONF_UID_CNT: - return MIRROR_UID_CNT_SIZE; - default: - ASSERT(false); - return 0; + case MIRROR_CONF_UID: + return MIRROR_UID_SIZE; + case MIRROR_CONF_CNT: + return MIRROR_CNT_SIZE; + case MIRROR_CONF_UID_CNT: + return MIRROR_UID_CNT_SIZE; + default: + ASSERT(false); + return 0; } } @@ -406,36 +406,36 @@ static int get_user_data_end_by_tag_type(tag_specific_type_t type) { int nr_pages = 0; switch (type) { - case TAG_TYPE_MF0ICU1: - nr_pages = MF0ICU1_PAGES; - break; - case TAG_TYPE_MF0ICU2: - nr_pages = MF0ICU2_USER_MEMORY_END; - break; - case TAG_TYPE_MF0UL11: - nr_pages = MF0UL11_USER_MEMORY_END; - break; - case TAG_TYPE_MF0UL21: - nr_pages = MF0UL21_USER_MEMORY_END; - break; - case TAG_TYPE_NTAG_210: - nr_pages = NTAG210_USER_MEMORY_END; - break; - case TAG_TYPE_NTAG_212: - nr_pages = NTAG212_USER_MEMORY_END; - break; - case TAG_TYPE_NTAG_213: - nr_pages = NTAG213_USER_MEMORY_END; - break; - case TAG_TYPE_NTAG_215: - nr_pages = NTAG215_USER_MEMORY_END; - break; - case TAG_TYPE_NTAG_216: - nr_pages = NTAG216_USER_MEMORY_END; - break; - default: - ASSERT(false); - break; + case TAG_TYPE_MF0ICU1: + nr_pages = MF0ICU1_PAGES; + break; + case TAG_TYPE_MF0ICU2: + nr_pages = MF0ICU2_USER_MEMORY_END; + break; + case TAG_TYPE_MF0UL11: + nr_pages = MF0UL11_USER_MEMORY_END; + break; + case TAG_TYPE_MF0UL21: + nr_pages = MF0UL21_USER_MEMORY_END; + break; + case TAG_TYPE_NTAG_210: + nr_pages = NTAG210_USER_MEMORY_END; + break; + case TAG_TYPE_NTAG_212: + nr_pages = NTAG212_USER_MEMORY_END; + break; + case TAG_TYPE_NTAG_213: + nr_pages = NTAG213_USER_MEMORY_END; + break; + case TAG_TYPE_NTAG_215: + nr_pages = NTAG215_USER_MEMORY_END; + break; + case TAG_TYPE_NTAG_216: + nr_pages = NTAG216_USER_MEMORY_END; + break; + default: + ASSERT(false); + break; } return nr_pages; @@ -534,18 +534,18 @@ static void handle_any_read(uint8_t block_num, uint8_t block_cnt, uint8_t block_ // NTAG 210/212 don't have a counter thus no mirror mode switch (m_tag_type) { - case TAG_TYPE_NTAG_210: - case TAG_TYPE_NTAG_212: - mirror_mode = MIRROR_CONF_UID; - break; - default: - break; + case TAG_TYPE_NTAG_210: + case TAG_TYPE_NTAG_212: + mirror_mode = MIRROR_CONF_UID; + break; + default: + break; } if ((mirror_page_off > 3) && (mirror_mode != MIRROR_CONF_DISABLED)) { mirror_size = mirror_size_for_mode(mirror_mode); int user_data_end = get_user_data_end_by_tag_type(m_tag_type); - int pages_needed = + int pages_needed = (mirror_byte_off + mirror_size + (NFC_TAG_MF0_NTAG_DATA_SIZE - 1)) / NFC_TAG_MF0_NTAG_DATA_SIZE; if ((pages_needed >= user_data_end) || ((user_data_end - pages_needed) < mirror_page_off)) { @@ -555,17 +555,17 @@ static void handle_any_read(uint8_t block_num, uint8_t block_cnt, uint8_t block_ mirror_page_end = mirror_page_off + pages_needed; switch (mirror_mode) { - case MIRROR_CONF_UID: - bytes2hex(m_tag_information->res_coll.uid, (char *)mirror_buf, 7); - break; - case MIRROR_CONF_CNT: - bytes2hex(get_counter_data_by_index(0, false), (char *)mirror_buf, 3); - break; - case MIRROR_CONF_UID_CNT: - bytes2hex(m_tag_information->res_coll.uid, (char *)mirror_buf, 7); - mirror_buf[7] = 'x'; - bytes2hex(get_counter_data_by_index(0, false), (char *)&mirror_buf[8], 3); - break; + case MIRROR_CONF_UID: + bytes2hex(m_tag_information->res_coll.uid, (char *)mirror_buf, 7); + break; + case MIRROR_CONF_CNT: + bytes2hex(get_counter_data_by_index(0, false), (char *)mirror_buf, 3); + break; + case MIRROR_CONF_UID_CNT: + bytes2hex(m_tag_information->res_coll.uid, (char *)mirror_buf, 7); + mirror_buf[7] = 'x'; + bytes2hex(get_counter_data_by_index(0, false), (char *)&mirror_buf[8], 3); + break; } } } @@ -584,7 +584,7 @@ static void handle_any_read(uint8_t block_num, uint8_t block_cnt, uint8_t block_ // apply mirroring if needed if ((mirror_page_off > 0) && (mirror_size > 0) && (block_to_read >= mirror_page_off) && (block_to_read < mirror_page_end)) { - // When accessing the first page that includes mirrored data the offset into the mirror buffer is + // When accessing the first page that includes mirrored data the offset into the mirror buffer is // definitely zero. Later pages need to account for the offset in the first page. Offset in the // destination page chunk will be zero however. int mirror_buf_off = (block_to_read - mirror_page_off) * NFC_TAG_MF0_NTAG_DATA_SIZE; @@ -610,26 +610,27 @@ static void handle_any_read(uint8_t block_num, uint8_t block_cnt, uint8_t block_ // update counter for NTAG cards if needed switch (m_tag_type) { - case TAG_TYPE_NTAG_213: - case TAG_TYPE_NTAG_215: - case TAG_TYPE_NTAG_216: if (!m_did_first_read) { - m_did_first_read = true; + case TAG_TYPE_NTAG_213: + case TAG_TYPE_NTAG_215: + case TAG_TYPE_NTAG_216: + if (!m_did_first_read) { + m_did_first_read = true; - int first_cfg_page = get_first_cfg_page_by_tag_type(m_tag_type); - int access = m_tag_information->memory[first_cfg_page + CONF_ACCESS_PAGE_OFFSET][CONF_ACCESS_BYTE]; + int first_cfg_page = get_first_cfg_page_by_tag_type(m_tag_type); + int access = m_tag_information->memory[first_cfg_page + CONF_ACCESS_PAGE_OFFSET][CONF_ACCESS_BYTE]; - if ((access & CONF_ACCESS_NFC_CNT_EN) != 0) { - uint8_t *ctr = get_counter_data_by_index(0, false); - uint32_t counter = (((uint32_t)ctr[0]) << 16) | (((uint32_t)ctr[1]) << 8) | ((uint32_t)ctr[2]); - if (counter < 0xFFFFFF) counter += 1; - ctr[0] = (uint8_t)(counter >> 16); - ctr[1] = (uint8_t)(counter >> 8); - ctr[2] = (uint8_t)(counter); - } - break; - } - default: - break; + if ((access & CONF_ACCESS_NFC_CNT_EN) != 0) { + uint8_t *ctr = get_counter_data_by_index(0, false); + uint32_t counter = (((uint32_t)ctr[0]) << 16) | (((uint32_t)ctr[1]) << 8) | ((uint32_t)ctr[2]); + if (counter < 0xFFFFFF) counter += 1; + ctr[0] = (uint8_t)(counter >> 16); + ctr[1] = (uint8_t)(counter >> 8); + ctr[2] = (uint8_t)(counter); + } + break; + } + default: + break; } nfc_tag_14a_tx_bytes(m_tag_tx_buffer.tx_buffer, ((int)block_cnt) * NFC_TAG_MF0_NTAG_DATA_SIZE, true); @@ -651,20 +652,19 @@ static void handle_read_command(uint8_t block_num) { } static void handle_fast_read_command(uint8_t block_num, uint8_t end_block_num) { - switch (m_tag_type) - { - case TAG_TYPE_MF0UL11: - case TAG_TYPE_MF0UL21: - case TAG_TYPE_NTAG_210: - case TAG_TYPE_NTAG_212: - case TAG_TYPE_NTAG_213: - case TAG_TYPE_NTAG_215: - case TAG_TYPE_NTAG_216: - // command is supported - break; - default: - if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); - return; + switch (m_tag_type) { + case TAG_TYPE_MF0UL11: + case TAG_TYPE_MF0UL21: + case TAG_TYPE_NTAG_210: + case TAG_TYPE_NTAG_212: + case TAG_TYPE_NTAG_213: + case TAG_TYPE_NTAG_215: + case TAG_TYPE_NTAG_216: + // command is supported + break; + default: + if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + return; } int block_max = get_block_max_by_tag_type(m_tag_type, true); @@ -699,67 +699,67 @@ static bool check_ro_lock_on_page(int block_num) { int index = block_num - MF0ICU1_PAGES; switch (m_tag_type) { - case TAG_TYPE_MF0ICU1: - return true; - case TAG_TYPE_MF0ICU2: { - p_lock_bytes = m_tag_information->memory[MF0ICU2_USER_MEMORY_END]; + case TAG_TYPE_MF0ICU1: + return true; + case TAG_TYPE_MF0ICU2: { + p_lock_bytes = m_tag_information->memory[MF0ICU2_USER_MEMORY_END]; - if (block_num < MF0ICU2_USER_MEMORY_END) { - uint8_t byte2 = p_lock_bytes[0]; + if (block_num < MF0ICU2_USER_MEMORY_END) { + uint8_t byte2 = p_lock_bytes[0]; - // Account for block locking bits first. - bool locked = (byte2 & (0x10 * (block_num >= 28))) != 0; - locked |= (byte2 >> (1 + (index / 4) + (block_num >= 28))); - return locked; - } else if (block_num == MF0ICU2_USER_MEMORY_END) { - return false; - } else if (block_num < MF0ICU2_FIRST_KEY_PAGE) { - uint8_t byte3 = p_lock_bytes[1]; - return ((byte3 >> (block_num - MF0ICU2_CNT_PAGE)) & 1) != 0; - } else { - uint8_t byte3 = p_lock_bytes[1]; - return (byte3 & 0x80) != 0; + // Account for block locking bits first. + bool locked = (byte2 & (0x10 * (block_num >= 28))) != 0; + locked |= (byte2 >> (1 + (index / 4) + (block_num >= 28))); + return locked; + } else if (block_num == MF0ICU2_USER_MEMORY_END) { + return false; + } else if (block_num < MF0ICU2_FIRST_KEY_PAGE) { + uint8_t byte3 = p_lock_bytes[1]; + return ((byte3 >> (block_num - MF0ICU2_CNT_PAGE)) & 1) != 0; + } else { + uint8_t byte3 = p_lock_bytes[1]; + return (byte3 & 0x80) != 0; + } } - } - // for the next two we reuse the check for CFGLCK bit used for NTAG - case TAG_TYPE_MF0UL11: - ASSERT(block_num >= MF0UL11_USER_MEMORY_END); - user_memory_end = MF0UL11_USER_MEMORY_END; - break; - case TAG_TYPE_MF0UL21: { - user_memory_end = MF0UL11_USER_MEMORY_END; - if (block_num < user_memory_end) { - p_lock_bytes = m_tag_information->memory[MF0UL21_USER_MEMORY_END]; - uint16_t lock_word = (((uint16_t)p_lock_bytes[1]) << 8) | (uint16_t)p_lock_bytes[0]; - bool locked = ((lock_word >> (index / 2)) & 1) != 0; - locked |= ((p_lock_bytes[2] >> (index / 4)) & 1) != 0; - return locked; + // for the next two we reuse the check for CFGLCK bit used for NTAG + case TAG_TYPE_MF0UL11: + ASSERT(block_num >= MF0UL11_USER_MEMORY_END); + user_memory_end = MF0UL11_USER_MEMORY_END; + break; + case TAG_TYPE_MF0UL21: { + user_memory_end = MF0UL11_USER_MEMORY_END; + if (block_num < user_memory_end) { + p_lock_bytes = m_tag_information->memory[MF0UL21_USER_MEMORY_END]; + uint16_t lock_word = (((uint16_t)p_lock_bytes[1]) << 8) | (uint16_t)p_lock_bytes[0]; + bool locked = ((lock_word >> (index / 2)) & 1) != 0; + locked |= ((p_lock_bytes[2] >> (index / 4)) & 1) != 0; + return locked; + } + break; } - break; - } - case TAG_TYPE_NTAG_210: - user_memory_end = NTAG210_USER_MEMORY_END; - dyn_lock_bit_page_cnt = 0; // NTAG 210 doesn't have dynamic lock bits - break; - case TAG_TYPE_NTAG_212: - user_memory_end = NTAG212_USER_MEMORY_END; - dyn_lock_bit_page_cnt = 2; - break; - case TAG_TYPE_NTAG_213: - user_memory_end = NTAG213_USER_MEMORY_END; - dyn_lock_bit_page_cnt = 2; - break; - case TAG_TYPE_NTAG_215: - user_memory_end = NTAG215_USER_MEMORY_END; - dyn_lock_bit_page_cnt = 16; - break; - case TAG_TYPE_NTAG_216: - user_memory_end = NTAG216_USER_MEMORY_END; - dyn_lock_bit_page_cnt = 16; - break; - default: - ASSERT(false); - break; + case TAG_TYPE_NTAG_210: + user_memory_end = NTAG210_USER_MEMORY_END; + dyn_lock_bit_page_cnt = 0; // NTAG 210 doesn't have dynamic lock bits + break; + case TAG_TYPE_NTAG_212: + user_memory_end = NTAG212_USER_MEMORY_END; + dyn_lock_bit_page_cnt = 2; + break; + case TAG_TYPE_NTAG_213: + user_memory_end = NTAG213_USER_MEMORY_END; + dyn_lock_bit_page_cnt = 2; + break; + case TAG_TYPE_NTAG_215: + user_memory_end = NTAG215_USER_MEMORY_END; + dyn_lock_bit_page_cnt = 16; + break; + case TAG_TYPE_NTAG_216: + user_memory_end = NTAG216_USER_MEMORY_END; + dyn_lock_bit_page_cnt = 16; + break; + default: + ASSERT(false); + break; } if (block_num < user_memory_end) { @@ -797,8 +797,7 @@ static int handle_write_command(uint8_t block_num, uint8_t *p_data) { // In this mode, reject all write operations NRF_LOG_INFO("Write denied due to WRITE_DENIED mode"); return NAK_INVALID_OPERATION_TBV; - } - else if (m_tag_information->config.mode_block_write == NFC_TAG_MF0_NTAG_WRITE_DECEIVE) { + } else if (m_tag_information->config.mode_block_write == NFC_TAG_MF0_NTAG_WRITE_DECEIVE) { // In this mode, pretend to accept the write but don't actually write anything NRF_LOG_INFO("Write deceived in WRITE_DECEIVE mode"); return ACK_VALUE; @@ -894,7 +893,7 @@ static void handle_incr_cnt_command(uint8_t block_num, uint8_t *p_data) { if ((0xFFFFFF - cnt) < incr_value) { // set tearing event flag cnt_data[MF0_NTAG_AUTHLIM_OFF_IN_CTR] |= MF0_NTAG_TEARING_MASK_IN_AUTHLIM; - + nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBIV, 4); } else { cnt += incr_value; @@ -944,39 +943,39 @@ static void handle_pwd_auth_command(uint8_t *p_data) { static void handle_check_tearing_event(int index) { switch (m_tag_type) { - case TAG_TYPE_MF0UL11: - case TAG_TYPE_MF0UL21: { - uint8_t *ctr_data = get_counter_data_by_index(index, true); + case TAG_TYPE_MF0UL11: + case TAG_TYPE_MF0UL21: { + uint8_t *ctr_data = get_counter_data_by_index(index, true); - if (ctr_data) { - m_tag_tx_buffer.tx_buffer[0] = (ctr_data[MF0_NTAG_AUTHLIM_OFF_IN_CTR] & MF0_NTAG_TEARING_MASK_IN_AUTHLIM) == 0 ? 0xBD : 0x00; - nfc_tag_14a_tx_bytes(m_tag_tx_buffer.tx_buffer, 1, true); - } else { - nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + if (ctr_data) { + m_tag_tx_buffer.tx_buffer[0] = (ctr_data[MF0_NTAG_AUTHLIM_OFF_IN_CTR] & MF0_NTAG_TEARING_MASK_IN_AUTHLIM) == 0 ? 0xBD : 0x00; + nfc_tag_14a_tx_bytes(m_tag_tx_buffer.tx_buffer, 1, true); + } else { + nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + } + + break; } - - break; - } - default: - if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); - break; + default: + if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + break; } } static void handle_vcsl_command(uint16_t szDataBits) { switch (m_tag_type) { - case TAG_TYPE_MF0UL11: - case TAG_TYPE_MF0UL21: - if (szDataBits < 168) { - nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + case TAG_TYPE_MF0UL11: + case TAG_TYPE_MF0UL21: + if (szDataBits < 168) { + nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); + break; + } + break; + default: + if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); break; - } - break; - default: - if (is_ntag()) nfc_tag_14a_tx_nbit(NAK_INVALID_OPERATION_TBV, 4); - break; } - + int first_cfg_page = get_first_cfg_page_by_tag_type(m_tag_type); m_tag_tx_buffer.tx_buffer[0] = m_tag_information->memory[first_cfg_page + CONF_VCTID_PAGE_OFFSET][CONF_VCTID_PAGE_BYTE]; @@ -1154,18 +1153,18 @@ bool nfc_tag_mf0_ntag_data_factory(uint8_t slot, tag_specific_type_t tag_type) { *(uint32_t *)p_ntag_information->memory[first_cfg_page + CONF_PWD_PAGE_OFFSET] = 0xFFFFFFFF; // set PWD to FFFFFFFF switch (tag_type) { - case TAG_TYPE_MF0UL11: - case TAG_TYPE_MF0UL21: - p_ntag_information->memory[first_cfg_page + 1][1] = 0x05; // set VCTID to 0x05 - break; - case TAG_TYPE_NTAG_213: - case TAG_TYPE_NTAG_215: - case TAG_TYPE_NTAG_216: - p_ntag_information->memory[first_cfg_page][0] = 0x04; // set MIRROR to 0x04 (STRG_MOD_EN to 1) - break; - default: - ASSERT(false); - break; + case TAG_TYPE_MF0UL11: + case TAG_TYPE_MF0UL21: + p_ntag_information->memory[first_cfg_page + 1][1] = 0x05; // set VCTID to 0x05 + break; + case TAG_TYPE_NTAG_213: + case TAG_TYPE_NTAG_215: + case TAG_TYPE_NTAG_216: + p_ntag_information->memory[first_cfg_page][0] = 0x04; // set MIRROR to 0x04 (STRG_MOD_EN to 1) + break; + default: + ASSERT(false); + break; } } @@ -1174,39 +1173,39 @@ bool nfc_tag_mf0_ntag_data_factory(uint8_t slot, tag_specific_type_t tag_type) { uint8_t *version_data = &p_ntag_information->memory[version_page][0]; switch (m_tag_type) { - case TAG_TYPE_MF0UL11: - version_data[6] = MF0UL11_VERSION_STORAGE_SIZE; - version_data[2] = MF0ULx1_VERSION_PRODUCT_TYPE; - break; - case TAG_TYPE_MF0UL21: - version_data[6] = MF0UL21_VERSION_STORAGE_SIZE; - version_data[2] = MF0ULx1_VERSION_PRODUCT_TYPE; - break; - case TAG_TYPE_NTAG_210: - version_data[6] = NTAG210_VERSION_STORAGE_SIZE; - version_data[2] = NTAG_VERSION_PRODUCT_TYPE; - version_data[3] = VERSION_PRODUCT_SUBTYPE_17pF; - break; - case TAG_TYPE_NTAG_212: - version_data[6] = NTAG212_VERSION_STORAGE_SIZE; - version_data[2] = NTAG_VERSION_PRODUCT_TYPE; - version_data[3] = VERSION_PRODUCT_SUBTYPE_17pF; - break; - case TAG_TYPE_NTAG_213: - version_data[6] = NTAG213_VERSION_STORAGE_SIZE; - version_data[2] = NTAG_VERSION_PRODUCT_TYPE; - break; - case TAG_TYPE_NTAG_215: - version_data[6] = NTAG215_VERSION_STORAGE_SIZE; - version_data[2] = NTAG_VERSION_PRODUCT_TYPE; - break; - case TAG_TYPE_NTAG_216: - version_data[6] = NTAG216_VERSION_STORAGE_SIZE; - version_data[2] = NTAG_VERSION_PRODUCT_TYPE; - break; - default: - ASSERT(false); - break; + case TAG_TYPE_MF0UL11: + version_data[6] = MF0UL11_VERSION_STORAGE_SIZE; + version_data[2] = MF0ULx1_VERSION_PRODUCT_TYPE; + break; + case TAG_TYPE_MF0UL21: + version_data[6] = MF0UL21_VERSION_STORAGE_SIZE; + version_data[2] = MF0ULx1_VERSION_PRODUCT_TYPE; + break; + case TAG_TYPE_NTAG_210: + version_data[6] = NTAG210_VERSION_STORAGE_SIZE; + version_data[2] = NTAG_VERSION_PRODUCT_TYPE; + version_data[3] = VERSION_PRODUCT_SUBTYPE_17pF; + break; + case TAG_TYPE_NTAG_212: + version_data[6] = NTAG212_VERSION_STORAGE_SIZE; + version_data[2] = NTAG_VERSION_PRODUCT_TYPE; + version_data[3] = VERSION_PRODUCT_SUBTYPE_17pF; + break; + case TAG_TYPE_NTAG_213: + version_data[6] = NTAG213_VERSION_STORAGE_SIZE; + version_data[2] = NTAG_VERSION_PRODUCT_TYPE; + break; + case TAG_TYPE_NTAG_215: + version_data[6] = NTAG215_VERSION_STORAGE_SIZE; + version_data[2] = NTAG_VERSION_PRODUCT_TYPE; + break; + case TAG_TYPE_NTAG_216: + version_data[6] = NTAG216_VERSION_STORAGE_SIZE; + version_data[2] = NTAG_VERSION_PRODUCT_TYPE; + break; + default: + ASSERT(false); + break; } version_data[0] = VERSION_FIXED_HEADER; @@ -1270,7 +1269,7 @@ bool nfc_tag_mf0_ntag_set_uid_mode(bool enabled) { void nfc_tag_mf0_ntag_set_write_mode(nfc_tag_mf0_ntag_write_mode_t write_mode) { if (m_tag_type == TAG_TYPE_UNDEFINED || m_tag_information == NULL) return; - + if (write_mode == NFC_TAG_MF0_NTAG_WRITE_SHADOW) { write_mode = NFC_TAG_MF0_NTAG_WRITE_SHADOW_REQ; } @@ -1278,8 +1277,8 @@ void nfc_tag_mf0_ntag_set_write_mode(nfc_tag_mf0_ntag_write_mode_t write_mode) { } nfc_tag_mf0_ntag_write_mode_t nfc_tag_mf0_ntag_get_write_mode(void) { - if (m_tag_type == TAG_TYPE_UNDEFINED || m_tag_information == NULL) + if (m_tag_type == TAG_TYPE_UNDEFINED || m_tag_information == NULL) return NFC_TAG_MF0_NTAG_WRITE_NORMAL; - + return m_tag_information->config.mode_block_write; -} \ No newline at end of file +} diff --git a/firmware/application/src/rfid/nfctag/lf/lf_tag_em.c b/firmware/application/src/rfid/nfctag/lf/lf_tag_em.c index 9a4b183..ffdf520 100644 --- a/firmware/application/src/rfid/nfctag/lf/lf_tag_em.c +++ b/firmware/application/src/rfid/nfctag/lf/lf_tag_em.c @@ -126,8 +126,8 @@ uint64_t em410x_id_to_memory64(uint8_t id[5]) { // Okay, it's the most critical time at present, and now you need to assign and calculate the Qiqi school inspection // 1. First assign the front guide code memory.bit.h00 = memory.bit.h01 = memory.bit.h02 = - memory.bit.h03 = memory.bit.h04 = memory.bit.h05 = - memory.bit.h06 = memory.bit.h07 = memory.bit.h08 = 1; + memory.bit.h03 = memory.bit.h04 = memory.bit.h05 = + memory.bit.h06 = memory.bit.h07 = memory.bit.h08 = 1; //2. Assign the 8bit version or custom ID memory.bit.d00 = GETBIT(id[0], 7); memory.bit.d01 = GETBIT(id[0], 6); @@ -261,7 +261,7 @@ void timer_ce_handler(nrf_timer_event_t event_type, void *p_context) { if (m_is_send_first_edge == true) { // The first edge of the next sends next time if (++m_bit_send_position >= LF_125KHZ_EM410X_BIT_SIZE) { m_bit_send_position = 0; // The broadcast is successful once, and the BIT position is zero - if(!lf_is_field_exists()){ // To avoid stopping sending when the reader field is present + if (!lf_is_field_exists()) { // To avoid stopping sending when the reader field is present m_send_id_count++; } if (m_send_id_count >= LF_125KHZ_BROADCAST_MAX) { diff --git a/firmware/application/src/rfid/reader/hf/mf1_toolbox.c b/firmware/application/src/rfid/reader/hf/mf1_toolbox.c index 6658af8..0c84d71 100644 --- a/firmware/application/src/rfid/reader/hf/mf1_toolbox.c +++ b/firmware/application/src/rfid/reader/hf/mf1_toolbox.c @@ -1014,18 +1014,18 @@ uint16_t auth_key_use_522_hw(uint8_t block, uint8_t type, uint8_t *key) { return pcd_14a_reader_mf1_auth(p_tag_info, type, block, key); } -inline void mf1_toolbox_antenna_restart () { +inline void mf1_toolbox_antenna_restart() { pcd_14a_reader_reset(); pcd_14a_reader_antenna_on(); bsp_delay_ms(8); } -inline void mf1_toolbox_report_healthy () { +inline void mf1_toolbox_report_healthy() { bsp_wdt_feed(); while (NRF_LOG_PROCESS()); } -uint16_t mf1_toolbox_check_keys_of_sectors ( +uint16_t mf1_toolbox_check_keys_of_sectors( mf1_toolbox_check_keys_of_sectors_in_t *in, mf1_toolbox_check_keys_of_sectors_out_t *out ) { @@ -1068,7 +1068,7 @@ uint16_t mf1_toolbox_check_keys_of_sectors ( // try to read keyB from trailer of sector status = pcd_14a_reader_mf1_read(trailerNo, trailer); // key B not in trailer - if (status != STATUS_HF_TAG_OK || 0 == *(uint64_t*) &trailer[10]) break; + if (status != STATUS_HF_TAG_OK || 0 == *(uint64_t *) &trailer[10]) break; // key B found skipKeyB = true; out->found.b[i / 4] |= 0b1 << maskShift; @@ -1110,8 +1110,8 @@ uint16_t mf1_toolbox_check_keys_of_sectors ( * @retval : STATUS_HF_TAG_OK is returned if the acquisition is successful, and non-HF_TAG_OK is returned if the acquisition is unsuccessful Value * */ -uint8_t mf1_hardnested_nonces_acquire(bool slow, uint8_t blkKnown, uint8_t typKnown, uint64_t keyKnown, - uint8_t targetBlk, uint8_t targetTyp, uint8_t* nonces, uint16_t noncesMax, uint8_t* num_nonces) { +uint8_t mf1_hardnested_nonces_acquire(bool slow, uint8_t blkKnown, uint8_t typKnown, uint64_t keyKnown, + uint8_t targetBlk, uint8_t targetTyp, uint8_t *nonces, uint16_t noncesMax, uint8_t *num_nonces) { struct Crypto1State mpcs = { 0, 0 }; struct Crypto1State *pcs = &mpcs; uint8_t answer[] = { 0x00, 0x00, 0x00, 0x00 }; @@ -1185,7 +1185,139 @@ uint8_t mf1_hardnested_nonces_acquire(bool slow, uint8_t blkKnown, uint8_t typKn tag_selected = true; } } - + // OK! return STATUS_HF_TAG_OK; } + +//----------------------------------------------------------------------------- +// acquire static encrypted nonces in order to perform the attack described in +// Philippe Teuwen, "MIFARE Classic: exposing the static encrypted nonce variant" +//----------------------------------------------------------------------------- +uint8_t mf1_static_encrypted_nonces_acquire(uint64_t keyKnown, uint8_t sector_count, uint8_t starting_sector, uint8_t sector_data[40][sizeof(mf1_static_nonce_sector_t)], uint8_t *sectors_acquired, uint32_t *cardUid) { + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs = &mpcs; + + uint8_t receivedAnswer[16] = {0x00}; + uint8_t par_enc[4] = {0x00}; + uint32_t cuid = 0; + bool have_uid = false; + + *sectors_acquired = 0; + + for (uint16_t sec = starting_sector; sec < sector_count && sec < 40; sec++) { + mf1_toolbox_report_healthy(); + uint16_t blockNo = (sec < 32) ? sec * 4 + 3 : 128 + (sec - 32) * 16 + 15; + + mf1_static_nonce_sector_t sector_nonces = {0}; + + for (uint8_t keyType = 0; keyType < 2; keyType++) { + memset(par_enc, 0, sizeof(par_enc)); + if (have_uid == false) { + if (pcd_14a_reader_scan_auto(p_tag_info) != STATUS_HF_TAG_OK) { + return STATUS_HF_TAG_NO; + } + cuid = get_u32_tag_uid(p_tag_info); + have_uid = true; + } else { + if (pcd_14a_reader_fast_select(p_tag_info) != STATUS_HF_TAG_OK) { + return STATUS_HF_TAG_NO; + } + } + + uint32_t nt1 = 0; + if (authex(pcs, cuid, blockNo, 0x60 + keyType + 4, keyKnown, AUTH_FIRST, &nt1) != STATUS_HF_TAG_OK) { + return STATUS_MF_ERR_AUTH; + } + + uint8_t cmd_status; + uint8_t res = send_cmd(pcs, AUTH_NESTED, 0x60 + keyType + 4, blockNo, &cmd_status, receivedAnswer, par_enc, sizeof(receivedAnswer) * 8); + if (res != 32) { + return STATUS_MF_ERR_AUTH; + } + + uint32_t nt_enc = bytes_to_num(receivedAnswer, 4); + crypto1_init(pcs, keyKnown); + uint32_t nt = crypto1_word(pcs, nt_enc ^ cuid, 1) ^ nt_enc; + + uint16_t nt_first_half = nt >> 16; + + if (pcd_14a_reader_fast_select(p_tag_info) != STATUS_HF_TAG_OK) { + return STATUS_HF_TAG_NO; + } + + if (authex(pcs, cuid, blockNo, 0x60 + keyType + 4, keyKnown, AUTH_FIRST, &nt1) != STATUS_HF_TAG_OK) { + return STATUS_MF_ERR_AUTH; + } + + res = send_cmd(pcs, AUTH_NESTED, 0x60 + keyType, blockNo, &cmd_status, receivedAnswer, par_enc, sizeof(receivedAnswer) * 8); + if (res != 32) { + return STATUS_MF_ERR_AUTH; + } + + uint32_t nt_enc_final = bytes_to_num(receivedAnswer, 4); + + uint8_t nt_par_err = ((par_enc[0] ^ oddparity8((nt_enc_final >> 24) & 0xFF)) << 3 | + (par_enc[1] ^ oddparity8((nt_enc_final >> 16) & 0xFF)) << 2 | + (par_enc[2] ^ oddparity8((nt_enc_final >> 8) & 0xFF)) << 1 | + (par_enc[3] ^ oddparity8((nt_enc_final >> 0) & 0xFF))); + + if (keyType == 0) { + num_to_bytes(nt_first_half, 2, sector_nonces.key_a.nt_first_half); + sector_nonces.key_a.nt_par_err = nt_par_err; + num_to_bytes(nt_enc_final, 4, sector_nonces.key_a.nt_enc); + } else { + num_to_bytes(nt_first_half, 2, sector_nonces.key_b.nt_first_half); + sector_nonces.key_b.nt_par_err = nt_par_err; + num_to_bytes(nt_enc_final, 4, sector_nonces.key_b.nt_enc); + } + } + + memcpy(sector_data[sec], §or_nonces, sizeof(sector_nonces)); + (*sectors_acquired)++; + } + + crypto1_deinit(pcs); + + *cardUid = cuid; + + return STATUS_HF_TAG_OK; +} + +uint16_t mf1_toolbox_check_keys_on_block( + mf1_toolbox_check_keys_on_block_in_t *in, + mf1_toolbox_check_keys_on_block_out_t *out +) { + memset(out, 0, sizeof(mf1_toolbox_check_keys_on_block_out_t)); + + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs = &mpcs; + uint32_t cuid = 0; + bool have_uid = false; + + for (int i = 0; i < in->keys_len; i++) { + mf1_toolbox_report_healthy(); + + if (have_uid == false) { + if (pcd_14a_reader_scan_auto(p_tag_info) != STATUS_HF_TAG_OK) { + return STATUS_HF_TAG_NO; + } + cuid = get_u32_tag_uid(p_tag_info); + have_uid = true; + } else { + if (pcd_14a_reader_fast_select(p_tag_info) != STATUS_HF_TAG_OK) { + return STATUS_HF_TAG_NO; + } + } + + uint32_t nt1 = 0; + uint64_t key_u64 = bytes_to_num(in->keys[i].key, 6); + if (authex(pcs, cuid, in->block, in->key_type, key_u64, AUTH_FIRST, &nt1) == STATUS_HF_TAG_OK) { + out->found = 1; + out->key = in->keys[i]; + return STATUS_HF_TAG_OK; + } + } + + return STATUS_HF_TAG_NO; +} diff --git a/firmware/application/src/rfid/reader/hf/mf1_toolbox.h b/firmware/application/src/rfid/reader/hf/mf1_toolbox.h index 128e82e..c107c4d 100644 --- a/firmware/application/src/rfid/reader/hf/mf1_toolbox.h +++ b/firmware/application/src/rfid/reader/hf/mf1_toolbox.h @@ -76,6 +76,29 @@ typedef struct { mf1_key_t keys[40][2]; // 6 bytes * 2 keys * 40 sectors = 480 bytes } PACKED mf1_toolbox_check_keys_of_sectors_out_t; +typedef struct { + uint8_t block; + uint8_t key_type; + uint8_t keys_len; + mf1_key_t *keys; +} mf1_toolbox_check_keys_on_block_in_t; + +typedef struct { + uint8_t found; + mf1_key_t key; +} PACKED mf1_toolbox_check_keys_on_block_out_t; + +typedef struct { + uint8_t nt_first_half[2]; + uint8_t nt_par_err; + uint8_t nt_enc[4]; +} PACKED mf1_static_nonce_keytype_t; + +typedef struct { + mf1_static_nonce_keytype_t key_a; + mf1_static_nonce_keytype_t key_b; +} PACKED mf1_static_nonce_sector_t; + #ifdef __cplusplus extern "C" { #endif @@ -113,13 +136,20 @@ uint8_t check_std_mifare_nt_support(); void antenna_switch_delay(uint32_t delay_ms); uint16_t auth_key_use_522_hw(uint8_t block, uint8_t type, uint8_t *key); -uint16_t mf1_toolbox_check_keys_of_sectors ( +uint16_t mf1_toolbox_check_keys_of_sectors( mf1_toolbox_check_keys_of_sectors_in_t *in, mf1_toolbox_check_keys_of_sectors_out_t *out ); -uint8_t mf1_hardnested_nonces_acquire(bool slow, uint8_t blkKnown, uint8_t typKnown, uint64_t keyKnown, - uint8_t targetBlk, uint8_t targetTyp, uint8_t* nonces, uint16_t noncesMax, uint8_t* num_nonces); +uint16_t mf1_toolbox_check_keys_on_block( + mf1_toolbox_check_keys_on_block_in_t *in, + mf1_toolbox_check_keys_on_block_out_t *out +); + +uint8_t mf1_hardnested_nonces_acquire(bool slow, uint8_t blkKnown, uint8_t typKnown, uint64_t keyKnown, + uint8_t targetBlk, uint8_t targetTyp, uint8_t *nonces, uint16_t noncesMax, uint8_t *num_nonces); + +uint8_t mf1_static_encrypted_nonces_acquire(uint64_t keyKnown, uint8_t sector_count, uint8_t starting_sector, uint8_t sector_data[40][sizeof(mf1_static_nonce_sector_t)], uint8_t *sectors_acquired, uint32_t *cardUid); #ifdef __cplusplus } diff --git a/firmware/application/src/rfid/reader/hf/rc522.c b/firmware/application/src/rfid/reader/hf/rc522.c index 17f6dd8..6ea17fd 100644 --- a/firmware/application/src/rfid/reader/hf/rc522.c +++ b/firmware/application/src/rfid/reader/hf/rc522.c @@ -622,7 +622,7 @@ uint8_t pcd_14a_reader_bytes_transfer_flags(uint8_t Command, uint8_t *pIn, uint8 * @param :tag: tag info buffer * @retval : if return STATUS_HF_TAG_OK, the tag is selected. */ -uint8_t pcd_14a_reader_fast_select(picc_14a_tag_t *tag) { +uint8_t pcd_14a_reader_fast_select(picc_14a_tag_t *tag) { uint8_t dat_buff[9] = { 0x00 }; uint8_t status = STATUS_HF_TAG_OK; uint8_t cascade_level = 0; @@ -1144,14 +1144,14 @@ uint8_t pcd_14a_reader_mf1_manipulate_value_block(uint8_t operator, uint8_t addr // 2. Transfer the operand to complete the value block manipulation status = pcd_14a_reader_bytes_transfer_flags( - PCD_TRANSCEIVE, - dat_buff, - 6, - dat_buff, - &dat_len, - U8ARR_BIT_LEN(dat_buff), - PCD_TRANSMIT_FLAG_NO_RESET_MF_CRYPTO1_ON); - + PCD_TRANSCEIVE, + dat_buff, + 6, + dat_buff, + &dat_len, + U8ARR_BIT_LEN(dat_buff), + PCD_TRANSMIT_FLAG_NO_RESET_MF_CRYPTO1_ON); + // Operand Part of Increment/Decrement/Restore does not acknowledge, so Timeout means success if (status != STATUS_HF_TAG_NO || dat_len != 0) { return status == STATUS_HF_TAG_OK ? STATUS_HF_ERR_STAT : status; diff --git a/firmware/application/src/rfid/reader/hf/rc522.h b/firmware/application/src/rfid/reader/hf/rc522.h index 98ec525..46876c0 100644 --- a/firmware/application/src/rfid/reader/hf/rc522.h +++ b/firmware/application/src/rfid/reader/hf/rc522.h @@ -196,12 +196,12 @@ uint8_t pcd_14a_reader_bytes_transfer(uint8_t Command, uint16_t *pOutLenBit, uint16_t maxOutLenBit); uint8_t pcd_14a_reader_bytes_transfer_flags(uint8_t Command, - uint8_t *pIn, - uint8_t InLenByte, - uint8_t *pOut, - uint16_t *pOutLenBit, - uint16_t maxOutLenBit, - uint32_t flags); + uint8_t *pIn, + uint8_t InLenByte, + uint8_t *pOut, + uint16_t *pOutLenBit, + uint16_t maxOutLenBit, + uint32_t flags); uint8_t pcd_14a_reader_bits_transfer(uint8_t *pTx, uint16_t szTxBits, uint8_t *pTxPar, diff --git a/resource/tools/make_style.sh b/resource/tools/make_style.sh index 4224288..315ec54 100755 --- a/resource/tools/make_style.sh +++ b/resource/tools/make_style.sh @@ -20,7 +20,7 @@ find . \( -not -path "./.git/*" -and -not -path "./firmware/nrf52_sdk/*" -and -n -name "*.[ch]" \) \ -exec astyle --formatted --mode=c --suffix=none \ --indent=spaces=4 --indent-switches \ - --keep-one-line-blocks --max-instatement-indent=60 \ + --keep-one-line-blocks \ --style=google --pad-oper --unpad-paren --pad-header \ --align-pointer=name {} \; # Apply autopep8 on *py diff --git a/software/script/chameleon_cli_unit.py b/software/script/chameleon_cli_unit.py index 5db243e..e51935f 100644 --- a/software/script/chameleon_cli_unit.py +++ b/software/script/chameleon_cli_unit.py @@ -1,4 +1,6 @@ import binascii +import glob +import math import os import tempfile import re @@ -7,7 +9,6 @@ import argparse import timeit import sys import time -from datetime import datetime import serial.tools.list_ports import threading import struct @@ -20,7 +21,8 @@ import hardnested_utils import chameleon_com import chameleon_cmd -from chameleon_utils import ArgumentParserNoExit, ArgsParserError, UnexpectedResponseError +from chameleon_utils import ArgumentParserNoExit, ArgsParserError, UnexpectedResponseError, execute_tool, \ + tqdm_if_exists, print_key_table from chameleon_utils import CLITree from chameleon_utils import CR, CG, CB, CC, CY, C0 from chameleon_utils import print_mem_dump @@ -45,6 +47,7 @@ type_id_SAK_dict = {0x00: "MIFARE Ultralight Classic/C/EV1/Nano | NTAG 2xx", default_cwd = Path.cwd() / Path(__file__).with_name("bin") + def load_key_file(import_key, keys): """ Load key file and append its content to the provided set of keys. @@ -54,11 +57,14 @@ def load_key_file(import_key, keys): keys.update(line.encode('utf-8') for line in file.read().decode('utf-8').splitlines()) return keys + def load_dic_file(import_dic, keys): return keys - + + def check_tools(): - tools = ['staticnested', 'nested', 'darkside', 'mfkey32v2'] + tools = ['staticnested', 'nested', 'darkside', 'mfkey32v2', 'staticnested_1nt', + 'staticnested_2x1nt_rf08s', 'staticnested_2x1nt_rf08s_1key'] if sys.platform == "win32": tools = [x+'.exe' for x in tools] missing_tools = [tool for tool in tools if not (default_cwd / tool).exists()] @@ -348,14 +354,14 @@ class MFUAuthArgsUnit(ReaderRequiredUnit): key = bytes.fromhex(key) except: raise ValueError("Key should be a hex string") - + if len(key) not in [4, 16]: raise ValueError("Key should either be 4 or 16 bytes long") elif len(key) == 16: raise ValueError("Ultralight-C authentication isn't supported yet") return key - + parser.add_argument( '-k', '--key', type=key_parser, metavar="", help="Authentication key (EV1/NTAG 4 bytes)." ) @@ -736,7 +742,7 @@ class HFMFNested(ReaderRequiredUnit): """ # check nt level, we can run static or nested auto... nt_level = self.cmd.mf1_detect_prng() - print(f" - NT vulnerable: {CY}{ self.from_nt_level_code_to_str(nt_level) }{C0}") + print(f" - NT vulnerable: {CY}{self.from_nt_level_code_to_str(nt_level)}{C0}") if nt_level == 2: print(" [!] HardNested has not been implemented yet.") return None @@ -892,6 +898,7 @@ class HFMFDarkside(ReaderRequiredUnit): print(" - Key recover fail.") return + @hf_mf.command('hardnested') class HFMFHardNested(ReaderRequiredUnit): def args_parser(self) -> ArgumentParserNoExit: @@ -933,15 +940,15 @@ class HFMFHardNested(ReaderRequiredUnit): :return: Recovered key as a hex string, or None if not found. """ print(f" - Starting HardNested attack...") - nonces_buffer = bytearray() # This will hold the final data for the file - uid_bytes = b'' # To store UID from the successful attempt + nonces_buffer = bytearray() # This will hold the final data for the file + uid_bytes = b'' # To store UID from the successful attempt # --- Outer loop for acquisition attempts --- - acquisition_success = False # Flag to indicate if any attempt was successful + acquisition_success = False # Flag to indicate if any attempt was successful for attempt in range(max_attempts): print(f"\n--- Starting Acquisition Attempt {attempt + 1}/{max_attempts} ---") - total_raw_nonces_bytes = bytearray() # Accumulator for raw nonces for THIS attempt - nonces_buffer.clear() # Clear buffer for each new attempt + total_raw_nonces_bytes = bytearray() # Accumulator for raw nonces for THIS attempt + nonces_buffer.clear() # Clear buffer for each new attempt # --- MSB Tracking Initialization (Reset for each attempt) --- seen_msbs = [False] * 256 @@ -967,7 +974,7 @@ class HFMFHardNested(ReaderRequiredUnit): if attempt + 1 < max_attempts: print(f"{CY} Retrying scan in 1 second...{C0}") time.sleep(1) - continue # Retry the outer loop (next attempt) + continue # Retry the outer loop (next attempt) else: print(f"{CR} Maximum attempts reached without finding tag. Attack failed.{C0}") return None @@ -977,7 +984,7 @@ class HFMFHardNested(ReaderRequiredUnit): return None tag_info = scan_resp[0] - uid_bytes = tag_info['uid'] # Store UID for later verification + uid_bytes = tag_info['uid'] # Store UID for later verification uid_len = len(uid_bytes) uid_for_file = b'' if uid_len == 4: @@ -985,17 +992,16 @@ class HFMFHardNested(ReaderRequiredUnit): elif uid_len == 7: uid_for_file = uid_bytes[3: 7] elif uid_len == 10: - uid_for_file = uid_bytes[6: 10] + uid_for_file = uid_bytes[6: 10] else: - print(f"{CR} Error: Unexpected UID length ({uid_len} bytes). Cannot create nonce file header.{C0}") - return None # Fail if UID length is unexpected + print(f"{CR} Error: Unexpected UID length ({uid_len} bytes). Cannot create nonce file header.{C0}") + return None # Fail if UID length is unexpected print(f" Tag found with UID: {uid_bytes.hex().upper()}") # Prepare header in the main buffer for this attempt nonces_buffer.extend(uid_for_file) nonces_buffer.extend(struct.pack('!BB', block_target, type_target.value & 0x01)) print(f" Nonce file header prepared: {nonces_buffer.hex().upper()}") - # 2. Acquire nonces dynamically based on MSB criteria (Inner loop for runs) print(f" Acquiring nonces (slow mode: {slow_mode}, max runs: {max_runs}). This may take a while...") while run_count < max_runs: @@ -1006,8 +1012,8 @@ class HFMFHardNested(ReaderRequiredUnit): current_scan = self.cmd.hf14a_scan() if current_scan is None or len(current_scan) == 0 or current_scan[0]['uid'] != uid_bytes: print(f"{CR} Error: Tag lost or changed before run {run_count}. Stopping acquisition attempt.{C0}") - acquisition_goal_met = False # Mark as failed - break # Exit inner run loop for this attempt + acquisition_goal_met = False # Mark as failed + break # Exit inner run loop for this attempt # Acquire nonces for this run raw_nonces_bytes_this_run = self.cmd.mf1_hard_nested_acquire( @@ -1016,7 +1022,7 @@ class HFMFHardNested(ReaderRequiredUnit): if not raw_nonces_bytes_this_run: print(f"{CY} Run {run_count}: No nonces acquired in this run. Continuing...{C0}") - time.sleep(0.1) # Small delay before retrying + time.sleep(0.1) # Small delay before retrying continue # Append successfully acquired nonces to the total buffer for this attempt @@ -1024,7 +1030,8 @@ class HFMFHardNested(ReaderRequiredUnit): # --- Process acquired nonces for MSB tracking --- num_pairs_this_run = len(raw_nonces_bytes_this_run) // 9 - print(f" Run {run_count}: Acquired {num_pairs_this_run * 2} nonces ({len(raw_nonces_bytes_this_run)} bytes raw). Processing MSBs...") + print( + f" Run {run_count}: Acquired {num_pairs_this_run * 2} nonces ({len(raw_nonces_bytes_this_run)} bytes raw). Processing MSBs...") new_msbs_found_this_run = 0 for i in range(num_pairs_this_run): @@ -1043,10 +1050,11 @@ class HFMFHardNested(ReaderRequiredUnit): new_msbs_found_this_run += 1 parity_bit = hardnested_utils.evenparity32((nt_enc & 0xff000000) | (par & 0x08)) msb_parity_sum += parity_bit - print(f"\r Unique MSBs: {unique_msb_count}/256 | Current Sum: {msb_parity_sum} ", end="") + print( + f"\r Unique MSBs: {unique_msb_count}/256 | Current Sum: {msb_parity_sum} ", end="") if new_msbs_found_this_run > 0: - print() # Print a newline after progress update + print() # Print a newline after progress update # --- Check termination condition --- if unique_msb_count == 256: @@ -1054,32 +1062,33 @@ class HFMFHardNested(ReaderRequiredUnit): if msb_parity_sum in hardnested_utils.hardnested_sums: print(f" {CG}Parity sum {msb_parity_sum} is VALID. Stopping acquisition runs.{C0}") acquisition_goal_met = True - acquisition_success = True # Mark attempt as successful - break # Exit the inner run loop successfully + acquisition_success = True # Mark attempt as successful + break # Exit the inner run loop successfully else: - print(f" {CR}Parity sum {msb_parity_sum} is INVALID (Expected one of {hardnested_utils.hardnested_sums}).{C0}") - acquisition_goal_met = False # Mark as failed + print( + f" {CR}Parity sum {msb_parity_sum} is INVALID (Expected one of {hardnested_utils.hardnested_sums}).{C0}") + acquisition_goal_met = False # Mark as failed acquisition_success = False - break # Exit the inner run loop to restart the attempt + break # Exit the inner run loop to restart the attempt except chameleon_com.CMDInvalidException: - print(f"{CR} Error: Hardnested command not supported by this firmware version.{C0}") - return None # Cannot proceed at all + print(f"{CR} Error: Hardnested command not supported by this firmware version.{C0}") + return None # Cannot proceed at all except UnexpectedResponseError as e: print(f"{CR} Error acquiring nonces during run {run_count}: {e}{C0}") print(f"{CY} Stopping acquisition runs for this attempt...{C0}") acquisition_goal_met = False - break # Exit inner run loop + break # Exit inner run loop except TimeoutError: print(f"{CR} Error: Timeout during nonce acquisition run {run_count}.{C0}") print(f"{CY} Stopping acquisition runs for this attempt...{C0}") acquisition_goal_met = False - break # Exit inner run loop + break # Exit inner run loop except Exception as e: print(f"{CR} Unexpected error during acquisition run {run_count}: {e}{C0}") print(f"{CY} Stopping acquisition runs for this attempt...{C0}") acquisition_goal_met = False - break # Exit inner run loop + break # Exit inner run loop # --- End of inner run loop (while run_count < max_runs) --- # --- Post-Acquisition Summary for this attempt --- @@ -1088,42 +1097,44 @@ class HFMFHardNested(ReaderRequiredUnit): print(f" {CG}Successfully acquired nonces meeting the MSB sum criteria in {run_count} runs.{C0}") # Append collected raw nonces to the main buffer for the file nonces_buffer.extend(total_raw_nonces_bytes) - break # Exit the outer attempt loop successfully + break # Exit the outer attempt loop successfully elif unique_msb_count == 256 and not acquisition_goal_met: - print(f" {CR}Found all 256 MSBs, but the parity sum was invalid.{C0}") - if attempt + 1 < max_attempts: - print(f" {CY}Restarting acquisition process...{C0}") - time.sleep(1) # Small delay before restarting - continue # Continue to the next iteration of the outer attempt loop - else: - print(f" {CR}Maximum attempts ({max_attempts}) reached with invalid sum. Attack failed.{C0}") - return None # Failed after max attempts + print(f" {CR}Found all 256 MSBs, but the parity sum was invalid.{C0}") + if attempt + 1 < max_attempts: + print(f" {CY}Restarting acquisition process...{C0}") + time.sleep(1) # Small delay before restarting + continue # Continue to the next iteration of the outer attempt loop + else: + print(f" {CR}Maximum attempts ({max_attempts}) reached with invalid sum. Attack failed.{C0}") + return None # Failed after max attempts elif run_count >= max_runs: - print(f" {CY}Warning: Reached max runs ({max_runs}) for attempt {attempt + 1}. Found {unique_msb_count}/256 unique MSBs.{C0}") + print( + f" {CY}Warning: Reached max runs ({max_runs}) for attempt {attempt + 1}. Found {unique_msb_count}/256 unique MSBs.{C0}") if attempt + 1 < max_attempts: print(f" {CY}Restarting acquisition process...{C0}") time.sleep(1) - continue # Continue to the next iteration of the outer attempt loop + continue # Continue to the next iteration of the outer attempt loop else: print(f" {CR}Maximum attempts ({max_attempts}) reached without meeting criteria. Attack failed.{C0}") - return None # Failed after max attempts - else: # Acquisition stopped due to error or tag loss - print(f" {CR}Acquisition attempt {attempt + 1} stopped prematurely due to an error after {run_count} runs.{C0}") - # Decide if we should retry or fail completely. Let's fail for now. - print(f" {CR}Attack failed due to error during acquisition.{C0}") - return None # Failed due to error + return None # Failed after max attempts + else: # Acquisition stopped due to error or tag loss + print(f" {CR}Acquisition attempt {attempt + 1} stopped prematurely due to an error after {run_count} runs.{C0}") + # Decide if we should retry or fail completely. Let's fail for now. + print(f" {CR}Attack failed due to error during acquisition.{C0}") + return None # Failed due to error # --- End of outer attempt loop --- # If we exited the loop successfully (acquisition_success is True) if not acquisition_success: - # This case should ideally be caught within the loop, but as a safeguard: - print(f"{CR} Error: Acquisition failed after {max_attempts} attempts.{C0}") - return None + # This case should ideally be caught within the loop, but as a safeguard: + print(f"{CR} Error: Acquisition failed after {max_attempts} attempts.{C0}") + return None # --- Proceed with the rest of the attack using the successfully collected nonces --- - total_nonce_pairs = len(total_raw_nonces_bytes) // 9 # Use data from the successful attempt - print(f"\n Proceeding with attack using {total_nonce_pairs * 2} nonces ({len(total_raw_nonces_bytes)} bytes raw).") + total_nonce_pairs = len(total_raw_nonces_bytes) // 9 # Use data from the successful attempt + print( + f"\n Proceeding with attack using {total_nonce_pairs * 2} nonces ({len(total_raw_nonces_bytes)} bytes raw).") print(f" Total nonce file size will be {len(nonces_buffer)} bytes.") if total_nonce_pairs == 0: @@ -1133,10 +1144,10 @@ class HFMFHardNested(ReaderRequiredUnit): # 3. Save nonces to a temporary file nonce_file_path = None temp_nonce_file = None - temp_output_file = None # For hardnested output - process = None # Define process here for finally block - output_str = "" # To store the output read from the file - output_log_path = "" # To store the path of the output log + temp_output_file = None # For hardnested output + process = None # Define process here for finally block + output_str = "" # To store the output read from the file + output_log_path = "" # To store the path of the output log try: # --- Nonce File Handling --- @@ -1146,12 +1157,13 @@ class HFMFHardNested(ReaderRequiredUnit): suffix=".bin", prefix="hardnested_nonces_", delete=False, mode='wb', dir='.' ) - temp_nonce_file.write(nonces_buffer) # Write the buffer from the successful attempt + temp_nonce_file.write(nonces_buffer) # Write the buffer from the successful attempt temp_nonce_file.flush() nonce_file_path = temp_nonce_file.name - temp_nonce_file.close() # Close it so hardnested can access it - temp_nonce_file = None # Clear variable after closing - print(f" Nonces saved to {'temporary ' if delete_nonce_on_close else ''}file: {os.path.abspath(nonce_file_path)}") + temp_nonce_file.close() # Close it so hardnested can access it + temp_nonce_file = None # Clear variable after closing + print( + f" Nonces saved to {'temporary ' if delete_nonce_on_close else ''}file: {os.path.abspath(nonce_file_path)}") # --- Output File Handling --- # Create a temporary file to capture hardnested's output @@ -1160,10 +1172,9 @@ class HFMFHardNested(ReaderRequiredUnit): suffix=".log", prefix="hardnested_output_", delete=False, mode='w+', encoding='utf-8', errors='replace', dir='.' ) - output_log_path = temp_output_file.name # Store path for potential error messages + output_log_path = temp_output_file.name # Store path for potential error messages print(f" Redirecting hardnested output to temporary log file: {os.path.abspath(output_log_path)}") - # 4. Prepare and run the external hardnested tool, redirecting output tool_name = "hardnested" if sys.platform == "win32": @@ -1181,21 +1192,21 @@ class HFMFHardNested(ReaderRequiredUnit): # Run the process, redirecting stdout and stderr to the output file process = subprocess.Popen( cmd_recover_list, - cwd=default_cwd, # Run from the bin directory - stdout=temp_output_file, # Redirect stdout to file - stderr=subprocess.STDOUT, # Redirect stderr to the same file as stdout + cwd=default_cwd, # Run from the bin directory + stdout=temp_output_file, # Redirect stdout to file + stderr=subprocess.STDOUT, # Redirect stderr to the same file as stdout ) # Wait for the process to complete - ret_code = process.wait() # This blocks until the tool finishes + ret_code = process.wait() # This blocks until the tool finishes print(f"{CC}--- Hardnested Tool Finished (Exit Code: {ret_code}) ---{C0}") # 5. Read the output from the temporary log file - temp_output_file.seek(0) # Go back to the start of the file - output_str = temp_output_file.read() # Read the entire content - temp_output_file.close() # Close the file - temp_output_file = None # Clear the variable + temp_output_file.seek(0) # Go back to the start of the file + output_str = temp_output_file.read() # Read the entire content + temp_output_file.close() # Close the file + temp_output_file = None # Clear the variable # Optional: Print the captured output if needed for debugging # print(f"{CY}--- Captured Hardnested Output ---{C0}\n{output_str}\n{CY}--- End Captured Output ---{C0}") @@ -1208,9 +1219,9 @@ class HFMFHardNested(ReaderRequiredUnit): return None key_list = [] - key_prefix = "Key found: " # Define the specific prefix to look for + key_prefix = "Key found: " # Define the specific prefix to look for for line in output_str.splitlines(): - line_stripped = line.strip() # Remove leading/trailing whitespace + line_stripped = line.strip() # Remove leading/trailing whitespace if line_stripped.startswith(key_prefix): # Found the target line, now extract the key using regex # Regex now looks for 12 hex chars specifically after the prefix @@ -1227,7 +1238,7 @@ class HFMFHardNested(ReaderRequiredUnit): # 7. Verify Keys (Same as before) print(f" [{len(key_list)} candidate key(s) found in output. Verifying...]") # Use the UID from the successful acquisition attempt - uid_bytes_for_verify = uid_bytes # From the last successful scan in the outer loop + uid_bytes_for_verify = uid_bytes # From the last successful scan in the outer loop for key_hex in key_list: key_bytes = bytes.fromhex(key_hex) @@ -1237,11 +1248,11 @@ class HFMFHardNested(ReaderRequiredUnit): scan_check = self.cmd.hf14a_scan() if scan_check is None or len(scan_check) == 0 or scan_check[0]['uid'] != uid_bytes_for_verify: print(f" {CR}Tag lost or changed during verification. Cannot verify.{C0}") - return None # Stop verification if tag is gone + return None # Stop verification if tag is gone if self.cmd.mf1_auth_one_key_block(block_target, type_target, key_bytes): print(f" {CG}Success!{C0}") - return key_hex # Return the verified key + return key_hex # Return the verified key else: print(f" {CR}Auth failed.{C0}") except UnexpectedResponseError as e: @@ -1276,35 +1287,33 @@ class HFMFHardNested(ReaderRequiredUnit): print(f"{CR} Error deleting temporary nonce file {nonce_file_path}: {e}{C0}") # Ensure output file is closed and deleted if an error occurred before its closure - if temp_output_file: # If it wasn't closed and cleared in the try block + if temp_output_file: # If it wasn't closed and cleared in the try block try: temp_output_file.close() except Exception: - pass # Ignore errors during cleanup close + pass # Ignore errors during cleanup close # Delete the output log file unless an error occurred and we want to keep it if output_log_path and os.path.exists(output_log_path): - # Keep log if hardnested failed (ret_code != 0) or if verification failed? - # For now, let's always delete it unless there was an exception *before* reading it. - # If ret_code != 0, the path was already printed. - try: - os.remove(output_log_path) - except OSError as e: - print(f"{CR} Error deleting temporary output log file {output_log_path}: {e}{C0}") - + # Keep log if hardnested failed (ret_code != 0) or if verification failed? + # For now, let's always delete it unless there was an exception *before* reading it. + # If ret_code != 0, the path was already printed. + try: + os.remove(output_log_path) + except OSError as e: + print(f"{CR} Error deleting temporary output log file {output_log_path}: {e}{C0}") # Ensure process is terminated if something went wrong if process and process.poll() is None: try: print(f"{CY} Terminating hardnested process...{C0}") - process.terminate() # Try graceful termination - process.wait(timeout=0.5) # Wait briefly + process.terminate() # Try graceful termination + process.wait(timeout=0.5) # Wait briefly if process.poll() is None: - process.kill() # Force kill if still running + process.kill() # Force kill if still running except Exception as kill_err: print(f"{CR} Error terminating process: {kill_err}{C0}") - def on_exec(self, args: argparse.Namespace): block_known = args.blk type_known = MfcKeyType.B if args.b else MfcKeyType.A @@ -1332,29 +1341,131 @@ class HFMFHardNested(ReaderRequiredUnit): print(f"{CR} - HardNested attack failed to recover the key.{C0}") +@hf_mf.command('senested') +class HFMFStaticEncryptedNested(ReaderRequiredUnit): + def args_parser(self) -> ArgumentParserNoExit: + parser = ArgumentParserNoExit() + parser.description = 'Mifare Classic static encrypted recover key via backdoor' + parser.add_argument( + '--key', '-k', help='Backdoor key (as hex[12] format), currently known: A396EFA4E24F (default), A31667A8CEC1, 518B3354E760. See https://eprint.iacr.org/2024/1275', metavar='', type=str) + parser.add_argument('--sectors', '-s', type=int, metavar="", help="Sector count") + parser.add_argument('--starting-sector', type=int, metavar="", help="Start recovery from this sector") + parser.set_defaults(sectors=16) + parser.set_defaults(starting_sector=0) + parser.set_defaults(key='A396EFA4E24F') + return parser + + def on_exec(self, args: argparse.Namespace): + acquire_datas = self.cmd.mf1_static_encrypted_nested_acquire( + bytes.fromhex(args.key), args.sectors, args.starting_sector) + + if not acquire_datas: + print('Failed to collect nonces, is card present and has backdoor?') + + uid = format(acquire_datas['uid'], 'x') + + key_map = {'A': {}, 'B': {}} + + check_speed = 1.95 # sec per 64 keys + + for sector in range(args.starting_sector, args.sectors): + sector_name = str(sector).zfill(2) + print('Recovering', sector, 'sector...') + execute_tool('staticnested_1nt', [uid, sector_name, format(acquire_datas['nts']['a'][sector]['nt'], 'x').zfill(8), format( + acquire_datas['nts']['a'][sector]['nt_enc'], 'x').zfill(8), str(acquire_datas['nts']['a'][sector]['parity']).zfill(4)]) + execute_tool('staticnested_1nt', [uid, sector_name, format(acquire_datas['nts']['b'][sector]['nt'], 'x').zfill(8), format( + acquire_datas['nts']['b'][sector]['nt_enc'], 'x').zfill(8), str(acquire_datas['nts']['b'][sector]['parity']).zfill(4)]) + a_key_dic = f"keys_{uid}_{sector_name}_{format(acquire_datas['nts']['a'][sector]['nt'], 'x').zfill(8)}.dic" + b_key_dic = f"keys_{uid}_{sector_name}_{format(acquire_datas['nts']['b'][sector]['nt'], 'x').zfill(8)}.dic" + execute_tool('staticnested_2x1nt_rf08s', [a_key_dic, b_key_dic]) + + keys = open(os.path.join(tempfile.gettempdir(), b_key_dic.replace('.dic', '_filtered.dic'))).readlines() + keys_bytes = [] + for key in keys: + keys_bytes.append(bytes.fromhex(key.strip())) + + key = None + + print('Start checking possible B keys, will take up to', math.floor( + len(keys_bytes) / 64 * check_speed), 'seconds for', len(keys_bytes), 'keys') + for i in tqdm_if_exists(range(0, len(keys_bytes), 64)): + data = self.cmd.mf1_check_keys_on_block(sector * 4 + 3, 0x61, keys_bytes[i:i + 64]) + if data: + key = data.hex().zfill(12) + key_map['B'][sector] = key + print('Found B key', key) + break + + if key: + a_key = execute_tool('staticnested_2x1nt_rf08s_1key', [format( + acquire_datas['nts']['b'][sector]['nt'], 'x').zfill(8), key, a_key_dic]) + keys_bytes = [] + for key in a_key.split('\n'): + keys_bytes.append(bytes.fromhex(key.strip())) + data = self.cmd.mf1_check_keys_on_block(sector * 4 + 3, 0x60, keys_bytes) + if data: + key = data.hex().zfill(12) + print('Found A key', key) + key_map['A'][sector] = key + continue + else: + print('Failed to find A key by fast method, trying all possible keys') + keys = open(os.path.join(tempfile.gettempdir(), a_key_dic.replace('.dic', '_filtered.dic'))).readlines() + keys_bytes = [] + for key in keys: + keys_bytes.append(bytes.fromhex(key.strip())) + + print('Start checking possible A keys, will take up to', math.floor( + len(keys_bytes) / 64 * check_speed), 'seconds for', len(keys_bytes), 'keys') + for i in tqdm_if_exists(range(0, len(keys_bytes), 64)): + data = self.cmd.mf1_check_keys_on_block(sector * 4 + 3, 0x60, keys_bytes[i:i + 64]) + if data: + key = data.hex().zfill(12) + print('Found A key', key) + key_map['A'][sector] = key + break + else: + print('Failed to find key') + + for file in glob.glob(tempfile.gettempdir() + '/keys_*.dic'): + os.remove(file) + + print_key_table(key_map) + + @hf_mf.command('fchk') class HFMFFCHK(ReaderRequiredUnit): def args_parser(self) -> ArgumentParserNoExit: parser = ArgumentParserNoExit() + parser.description = 'Mifare Classic fast key check on sectors' mifare_type_group = parser.add_mutually_exclusive_group() - mifare_type_group.add_argument('--mini', help='MIFARE Classic Mini / S20', action='store_const', dest='maxSectors', const=5) - mifare_type_group.add_argument('--1k', help='MIFARE Classic 1k / S50 (default)', action='store_const', dest='maxSectors', const=16) - mifare_type_group.add_argument('--2k', help='MIFARE Classic/Plus 2k', action='store_const', dest='maxSectors', const=32) - mifare_type_group.add_argument('--4k', help='MIFARE Classic 4k / S70', action='store_const', dest='maxSectors', const=40) + mifare_type_group.add_argument('--mini', help='MIFARE Classic Mini / S20', + action='store_const', dest='maxSectors', const=5) + mifare_type_group.add_argument('--1k', help='MIFARE Classic 1k / S50 (default)', + action='store_const', dest='maxSectors', const=16) + mifare_type_group.add_argument('--2k', help='MIFARE Classic/Plus 2k', + action='store_const', dest='maxSectors', const=32) + mifare_type_group.add_argument('--4k', help='MIFARE Classic 4k / S70', + action='store_const', dest='maxSectors', const=40) parser.add_argument(dest='keys', help='Key (as hex[12] format)', metavar='', type=str, nargs='*') - parser.add_argument('--key', dest='import_key', type=argparse.FileType('rb'), help='Read keys from .key format file') - parser.add_argument('--dic', dest='import_dic', type=argparse.FileType('r', encoding='utf8'), help='Read keys from .dic format file') + parser.add_argument('--key', dest='import_key', type=argparse.FileType('rb'), + help='Read keys from .key format file') + parser.add_argument('--dic', dest='import_dic', type=argparse.FileType('r', + encoding='utf8'), help='Read keys from .dic format file') - parser.add_argument('--export-key', type=argparse.FileType('wb'), help=f'Export result as .key format, file will be {CR}OVERWRITTEN{C0} if exists') - parser.add_argument('--export-dic', type=argparse.FileType('w', encoding='utf8'), help=f'Export result as .dic format, file will be {CR}OVERWRITTEN{C0} if exists') + parser.add_argument('--export-key', type=argparse.FileType('wb'), + help=f'Export result as .key format, file will be {CR}OVERWRITTEN{C0} if exists') + parser.add_argument('--export-dic', type=argparse.FileType('w', encoding='utf8'), + help=f'Export result as .dic format, file will be {CR}OVERWRITTEN{C0} if exists') - parser.add_argument('-m', '--mask', help='Which sectorKey to be skip, 1 bit per sectorKey. `0b1` represent to skip to check. (in hex[20] format)', type=str, default='00000000000000000000', metavar='') + parser.add_argument( + '-m', '--mask', help='Which sectorKey to be skip, 1 bit per sectorKey. `0b1` represent to skip to check. (in hex[20] format)', type=str, default='00000000000000000000', metavar='') parser.set_defaults(maxSectors=16) return parser - + def check_keys(self, mask: bytearray, keys: list[bytes], chunkSize=20): sectorKeys = dict() @@ -1482,18 +1593,24 @@ class HFMFWRBL(MF1AuthArgsUnit): else: print(f" - {CR}Write fail.{C0}") + @hf_mf.command('view') class HFMFView(MF1AuthArgsUnit): def args_parser(self) -> ArgumentParserNoExit: parser = ArgumentParserNoExit() parser.description = 'Display content from tag memory or dump file' mifare_type_group = parser.add_mutually_exclusive_group() - mifare_type_group.add_argument('--mini', help='MIFARE Classic Mini / S20', action='store_const', dest='maxSectors', const=5) - mifare_type_group.add_argument('--1k', help='MIFARE Classic 1k / S50 (default)', action='store_const', dest='maxSectors', const=16) - mifare_type_group.add_argument('--2k', help='MIFARE Classic/Plus 2k', action='store_const', dest='maxSectors', const=32) - mifare_type_group.add_argument('--4k', help='MIFARE Classic 4k / S70', action='store_const', dest='maxSectors', const=40) + mifare_type_group.add_argument('--mini', help='MIFARE Classic Mini / S20', + action='store_const', dest='maxSectors', const=5) + mifare_type_group.add_argument('--1k', help='MIFARE Classic 1k / S50 (default)', + action='store_const', dest='maxSectors', const=16) + mifare_type_group.add_argument('--2k', help='MIFARE Classic/Plus 2k', + action='store_const', dest='maxSectors', const=32) + mifare_type_group.add_argument('--4k', help='MIFARE Classic 4k / S70', + action='store_const', dest='maxSectors', const=40) parser.add_argument('-d', '--dump-file', required=False, type=argparse.FileType("rb"), help="Dump file to read") - parser.add_argument('-k', '--key-file', required=False, type=argparse.FileType("r"), help="File containing keys of tag to write (exported with fchk --export)") + parser.add_argument('-k', '--key-file', required=False, type=argparse.FileType("r"), + help="File containing keys of tag to write (exported with fchk --export)") parser.set_defaults(maxSectors=16) return parser @@ -1527,7 +1644,8 @@ class HFMFView(MF1AuthArgsUnit): data.extend(resp) else: raise ArgsParserError("Missing args. Specify --dump-file (-d) or --key-file (-k)") - print_mem_dump(data,16) + print_mem_dump(data, 16) + @hf_mf.command('value') class HFMFVALUE(ReaderRequiredUnit): @@ -1538,12 +1656,13 @@ class HFMFVALUE(ReaderRequiredUnit): operator_group = parser.add_mutually_exclusive_group() operator_group.add_argument('--get', action='store_true', help="get value from src block") operator_group.add_argument('--set', type=int, required=False, metavar="", - help="set value X (-2147483647 ~ 2147483647) to src block") + help="set value X (-2147483647 ~ 2147483647) to src block") operator_group.add_argument('--inc', type=int, required=False, metavar="", - help="increment value by X (0 ~ 2147483647) from src to dst") + help="increment value by X (0 ~ 2147483647) from src to dst") operator_group.add_argument('--dec', type=int, required=False, metavar="", - help="decrement value by X (0 ~ 2147483647) from src to dst") - operator_group.add_argument('--res', '--cp', action='store_true', help="copy value from src to dst (Restore and Transfer)") + help="decrement value by X (0 ~ 2147483647) from src to dst") + operator_group.add_argument('--res', '--cp', action='store_true', + help="copy value from src to dst (Restore and Transfer)") parser.add_argument('--blk', '--src-block', type=int, required=True, metavar="", help="block number of src") @@ -1589,7 +1708,7 @@ class HFMFVALUE(ReaderRequiredUnit): return dst_key = bytearray.fromhex(dst_key) # print(dst_blk, dst_type, dst_key) - + if args.inc is not None: self.inc_value(src_blk, src_type, src_key, args.inc, dst_blk, dst_type, dst_key) return @@ -1630,7 +1749,7 @@ class HFMFVALUE(ReaderRequiredUnit): if value < 0 or value > 2147483647: raise ArgsParserError(f"Increment value must be between 0 and 2147483647. Got {value}") resp = self.cmd.mf1_manipulate_value_block( - src_blk, src_type, src_key, + src_blk, src_type, src_key, MfcValueBlockOperator.INCREMENT, value, dst_blk, dst_type, dst_key ) @@ -1639,12 +1758,12 @@ class HFMFVALUE(ReaderRequiredUnit): self.get_value(dst_blk, dst_type, dst_key) else: print(f" - {CR}Increment fail.{C0}") - + def dec_value(self, src_blk, src_type, src_key, value, dst_blk, dst_type, dst_key): if value < 0 or value > 2147483647: raise ArgsParserError(f"Decrement value must be between 0 and 2147483647. Got {value}") resp = self.cmd.mf1_manipulate_value_block( - src_blk, src_type, src_key, + src_blk, src_type, src_key, MfcValueBlockOperator.DECREMENT, value, dst_blk, dst_type, dst_key ) @@ -1656,7 +1775,7 @@ class HFMFVALUE(ReaderRequiredUnit): def res_value(self, src_blk, src_type, src_key, dst_blk, dst_type, dst_key): resp = self.cmd.mf1_manipulate_value_block( - src_blk, src_type, src_key, + src_blk, src_type, src_key, MfcValueBlockOperator.RESTORE, 0, dst_blk, dst_type, dst_key ) @@ -1937,6 +2056,7 @@ class HFMFESave(SlotIndexArgsAndGoUnit, DeviceRequiredUnit): fd.write(data) print("\n - Read success") + @hf_mf.command('eview') class HFMFEView(SlotIndexArgsAndGoUnit, DeviceRequiredUnit): def args_parser(self) -> ArgumentParserNoExit: @@ -1944,12 +2064,12 @@ class HFMFEView(SlotIndexArgsAndGoUnit, DeviceRequiredUnit): parser.description = 'View data from emulator memory' self.add_slot_args(parser) return parser - + def on_exec(self, args: argparse.Namespace): selected_slot = self.cmd.get_active_slot() slot_info = self.cmd.get_slot_info() - tag_type = TagSpecificType(slot_info[selected_slot]['hf']) - + tag_type = TagSpecificType(slot_info[selected_slot]['hf']) + if tag_type == TagSpecificType.MIFARE_Mini: block_count = 20 elif tag_type == TagSpecificType.MIFARE_1024: @@ -1969,7 +2089,8 @@ class HFMFEView(SlotIndexArgsAndGoUnit, DeviceRequiredUnit): data.extend(self.cmd.mf1_read_emu_block_data(index, chunk_count)) index += chunk_count block_count -= chunk_count - print_mem_dump(data,16) + print_mem_dump(data, 16) + @hf_mf.command('econfig') class HFMFEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequiredUnit): @@ -2133,7 +2254,7 @@ class HFMFUVERSION(DeviceRequiredUnit): def on_exec(self, args: argparse.Namespace): value, no_tearing = self.cmd.mfu_read_emu_counter_data(args.counter) - print(f" - Value: {value:06x}") + print(f" - Value: {value:06x} ({value})") if no_tearing: print(f" - Tearing: {CG}not set{C0}") else: @@ -2144,7 +2265,7 @@ class HFMFUVERSION(DeviceRequiredUnit): class HFMFUVERSION(DeviceRequiredUnit): def args_parser(self) -> ArgumentParserNoExit: parser = ArgumentParserNoExit() - parser.description = 'Read MIFARE Ultralight / NTAG counter value.' + parser.description = 'Write MIFARE Ultralight / NTAG counter value.' parser.add_argument('-c', '--counter', type=int, required=True, help="Counter index.") parser.add_argument('-v', '--value', type=int, required=True, help="Counter value (24-bit).") parser.add_argument('-t', '--reset-tearing', action='store_true', help="Reset tearing event flag.") @@ -2237,7 +2358,7 @@ class HFMFUWRPG(MFUAuthArgsUnit): 'keep_rf_field': 0, 'check_response_crc': 0, } - + if param.key is not None: options['keep_rf_field'] = 1 options['check_response_crc'] = 1 @@ -2256,9 +2377,10 @@ class HFMFUWRPG(MFUAuthArgsUnit): options['check_response_crc'] = 0 else: failed_auth = False - + if not failed_auth: - resp = self.cmd.hf14a_raw(options=options, resp_timeout_ms=200, data=struct.pack('!BB', 0xA2, args.page)+data) + resp = self.cmd.hf14a_raw(options=options, resp_timeout_ms=200, + data=struct.pack('!BB', 0xA2, args.page)+data) if resp[0] == 0x0A: print(f" - Ok") @@ -2297,7 +2419,7 @@ class HFMFUEVIEW(DeviceRequiredUnit): count = min(nr_pages - page, 16) data = self.cmd.mfu_read_emu_page_data(page, count) for i in range(0, len(data), 4): - print(f"#{page+(i>>2):02x}: {data[i:i+4].hex()}") + print(f"#{page+(i >> 2):02x}: {data[i:i+4].hex()}") page += count @@ -2328,7 +2450,7 @@ class HFMFUELOAD(DeviceRequiredUnit): file_type = 'hex' else: file_type = 'bin' - + if file_type == 'hex': with open(args.file, 'r') as f: data = f.read() @@ -2349,7 +2471,7 @@ class HFMFUELOAD(DeviceRequiredUnit): return elif len(data) < size: print(f"{CY}Dump file is smaller than the current slot's memory ({len(data)} < {size}).{C0}") - + nr_pages = len(data) >> 2 page = 0 while page < nr_pages: @@ -2360,10 +2482,10 @@ class HFMFUELOAD(DeviceRequiredUnit): page_data = bytes.fromhex("00000000") * cur_count else: page_data = data[offset:offset + 4 * cur_count] - + self.cmd.mfu_write_emu_page_data(page, page_data) page += cur_count - + print(f" - Ok") @@ -2409,7 +2531,7 @@ class HFMFUESAVE(DeviceRequiredUnit): nr_pages = self.cmd.mfu_get_emu_pages_count() fd.truncate(0) - + # write version and signature as comments if saving as .eml if save_as_eml: try: @@ -2417,29 +2539,29 @@ class HFMFUESAVE(DeviceRequiredUnit): fd.write(f"# Version: {version.hex()}\n") except: - pass # slot does not have version data - + pass # slot does not have version data + try: signature = self.cmd.mf0_ntag_get_signature_data() if signature != b"\x00" * 32: fd.write(f"# Signature: {signature.hex()}\n") except: - pass # slot does not have signature data - + pass # slot does not have signature data + page = 0 while page < nr_pages: cur_count = min(32, nr_pages - page) - + data = self.cmd.mfu_read_emu_page_data(page, cur_count) if save_as_eml: for i in range(0, len(data), 4): fd.write(data[i:i+4].hex() + "\n") else: fd.write(data) - + page += cur_count - + print(f" - Ok") @@ -2463,7 +2585,7 @@ class HFMFURCNT(MFUAuthArgsUnit): 'keep_rf_field': 0, 'check_response_crc': 1, } - + if param.key is not None: options['keep_rf_field'] = 1 try: @@ -2480,7 +2602,7 @@ class HFMFURCNT(MFUAuthArgsUnit): options['auto_select'] = 0 else: failed_auth = False - + if not failed_auth: resp = self.cmd.hf14a_raw(options=options, resp_timeout_ms=200, data=struct.pack('!BB', 0x39, args.counter)) print(f" - Data: {resp[:3].hex()}") @@ -2504,16 +2626,16 @@ class HFMFUDUMP(MFUAuthArgsUnit): help="Manually set number of pages to dump") parser.add_argument('-f', '--file', type=str, required=False, default="", help="Specify a filename for dump file") - parser.add_argument('-t', '--type', type=str, required=False, choices=['bin', 'hex'], + parser.add_argument('-t', '--type', type=str, required=False, choices=['bin', 'hex'], help="Force writing as either raw binary or hex.") return parser - + def do_dump(self, args: argparse.Namespace, param, fd, save_as_eml): if args.qty is not None: stop_page = min(args.page + args.qty, 256) else: stop_page = None - + tags = self.cmd.hf14a_scan() if len(tags) > 1: print(f'- {CR}Collision detected, leave only one tag.{C0}') @@ -2522,9 +2644,10 @@ class HFMFUDUMP(MFUAuthArgsUnit): print(f'- {CR}No tag detected.{C0}') return elif tags[0]['atqa'] != b'\x44\x00' or tags[0]['sak'] != b'\x00': - print(f'- {CR}Tag is not Mifare Ultralight compatible (ATQA {tags[0]["atqa"].hex()} SAK {tags[0]["sak"].hex()}).{C0}') + print( + f'- {CR}Tag is not Mifare Ultralight compatible (ATQA {tags[0]["atqa"].hex()} SAK {tags[0]["sak"].hex()}).{C0}') return - + options = { 'activate_rf_field': 0, 'wait_response': 1, @@ -2533,7 +2656,7 @@ class HFMFUDUMP(MFUAuthArgsUnit): 'keep_rf_field': 1, 'check_response_crc': 1, } - + # if stop page isn't set manually, try autodetection if stop_page is None: tag_name = None @@ -2545,13 +2668,14 @@ class HFMFUDUMP(MFUAuthArgsUnit): version = None except: version = None - + # try sending AUTHENTICATE command and observe the result try: - supports_auth = len(self.cmd.hf14a_raw(options=options, resp_timeout_ms=100, data=struct.pack('!B', 0x1A))) != 0 + supports_auth = len(self.cmd.hf14a_raw( + options=options, resp_timeout_ms=100, data=struct.pack('!B', 0x1A))) != 0 except: supports_auth = False - + if version is not None and not supports_auth: # either ULEV1 or NTAG assert len(version) == 8 @@ -2574,7 +2698,7 @@ class HFMFUDUMP(MFUAuthArgsUnit): } else: size_map = {} - + if version[6] in size_map: tag_name, stop_page = size_map[version[6]] elif version is None and supports_auth: @@ -2595,14 +2719,14 @@ class HFMFUDUMP(MFUAuthArgsUnit): else: # This is probably Ultralight AES, but we don't support this one yet. pass - + if tag_name is not None: print(f' - Detected tag type as {tag_name}.') if stop_page is None: print(f' - {CY}Couldn\'t autodetect the expected card size, reading until first error.{C0}') stop_page = 256 - + needs_stop = False if param.key is not None: @@ -2617,7 +2741,7 @@ class HFMFUDUMP(MFUAuthArgsUnit): needs_stop = True options['auto_select'] = 0 - + # this handles auth failure if needs_stop: print(f" - {CR}Auth failed{C0}") @@ -2631,7 +2755,7 @@ class HFMFUDUMP(MFUAuthArgsUnit): resp = self.cmd.hf14a_raw(options=options, resp_timeout_ms=200, data=struct.pack('!B', 0x1B)+param.key) options['auto_select'] = 0 # prevent resets pack = resp[:2].hex() - + # disable the rf field after the last command if i == (stop_page - 1) or needs_stop: options['keep_rf_field'] = 0 @@ -2662,7 +2786,7 @@ class HFMFUDUMP(MFUAuthArgsUnit): fd.write(data.hex()+'\n') else: fd.write(data) - + if needs_stop and stop_page != 256: print(f' - {CY}Dump is shorter than expected.{C0}') if args.file != '': @@ -2748,21 +2872,24 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired uid_magic_group = parser.add_mutually_exclusive_group() uid_magic_group.add_argument('--enable-uid-magic', action='store_true', help="Enable UID magic mode") uid_magic_group.add_argument('--disable-uid-magic', action='store_true', help="Disable UID magic mode") - + # Add this new write mode parameter write_names = [w.name for w in MifareUltralightWriteMode.list()] help_str = "Write Mode: " + ", ".join(write_names) parser.add_argument('--write', type=str, help=help_str, metavar="MODE", choices=write_names) - - parser.add_argument('--set-version', type=bytes.fromhex, help="Set data to be returned by the GET_VERSION command.") - parser.add_argument('--set-signature', type=bytes.fromhex, help="Set data to be returned by the READ_SIG command.") - parser.add_argument('--reset-auth-cnt', action='store_true', help="Resets the counter of unsuccessful authentication attempts.") + + parser.add_argument('--set-version', type=bytes.fromhex, + help="Set data to be returned by the GET_VERSION command.") + parser.add_argument('--set-signature', type=bytes.fromhex, + help="Set data to be returned by the READ_SIG command.") + parser.add_argument('--reset-auth-cnt', action='store_true', + help="Resets the counter of unsuccessful authentication attempts.") return parser def on_exec(self, args: argparse.Namespace): aux_data_changed = False aux_data_change_requested = False - + if args.set_version is not None: aux_data_change_requested = True aux_data_changed = True @@ -2770,7 +2897,7 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired if len(args.set_version) != 8: print(f"{CR}Version data should be 8 bytes long.{C0}") return - + try: self.cmd.mf0_ntag_set_version_data(args.set_version) except: @@ -2784,13 +2911,13 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired if len(args.set_signature) != 32: print(f"{CR}Signature data should be 32 bytes long.{C0}") return - + try: self.cmd.mf0_ntag_set_signature_data(args.set_signature) except: print(f"{CR}Tag type does not support READ_SIG command.{C0}") return - + if args.reset_auth_cnt: aux_data_change_requested = True old_value = self.cmd.mfu_reset_auth_cnt() @@ -2835,7 +2962,7 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired magic_mode = False else: magic_mode = self.cmd.mf0_ntag_get_uid_magic_mode() - + # Add this new write mode handling write_mode = None if args.write is not None: @@ -2862,13 +2989,13 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired print(f'- {"SAK:":40}{CY}{sak.hex().upper()}{C0}') if len(ats) > 0: print(f'- {"ATS:":40}{CY}{ats.hex().upper()}{C0}') - + # Display UID Magic status - if magic_mode: + if magic_mode: print(f'- {"UID Magic:":40}{CY}enabled{C0}') else: print(f'- {"UID Magic:":40}{CY}disabled{C0}') - + # Add this to display write mode if available try: write_mode = self.cmd.mf0_ntag_get_write_mode() @@ -2876,14 +3003,14 @@ class HFMFUEConfig(SlotIndexArgsAndGoUnit, HF14AAntiCollArgsUnit, DeviceRequired except: # Write mode not supported in current firmware pass - + # Existing version/signature display code try: version = self.cmd.mf0_ntag_get_version_data() print(f'- {"Version:":40}{CY}{version.hex().upper()}{C0}') except: pass - + try: signature = self.cmd.mf0_ntag_get_signature_data() print(f'- {"Signature:":40}{CY}{signature.hex().upper()}{C0}') @@ -2948,9 +3075,10 @@ class HWSlotList(DeviceRequiredUnit): enabled = self.cmd.get_enabled_slots() maxnamelength = 0 slotnames = [] - for slot in SlotNumber: - hfn = self.get_slot_name(slot, TagSenseType.HF) - lfn = self.get_slot_name(slot, TagSenseType.LF) + all_nicks = self.cmd.get_all_slot_nicks() + for slot_data in all_nicks: + hfn = {'baselen': len(slot_data['hf']), 'metalen': len(CC+C0), 'name': f'{CC}{slot_data["hf"]}{C0}'} + lfn = {'baselen': len(slot_data['lf']), 'metalen': len(CC+C0), 'name': f'{CC}{slot_data["lf"]}{C0}'} m = max(hfn['baselen'], lfn['baselen']) maxnamelength = m if m > maxnamelength else maxnamelength slotnames.append({'hf': hfn, 'lf': lfn}) @@ -3450,7 +3578,7 @@ class HWSettingsBLEKey(DeviceRequiredUnit): self.cmd.set_ble_connect_key(args.key) print(" - Successfully set ble connect key to :", end='') print(f"{CG}" - f" { args.key }" + f" {args.key}" f"{C0}" ) print(f"{CY}Do not forget to store your settings in flash!{C0}") diff --git a/software/script/chameleon_cmd.py b/software/script/chameleon_cmd.py index a0f1c35..753ecd8 100644 --- a/software/script/chameleon_cmd.py +++ b/software/script/chameleon_cmd.py @@ -3,7 +3,7 @@ import ctypes from typing import Union import chameleon_com -from chameleon_utils import expect_response +from chameleon_utils import expect_response, reconstruct_full_nt, parity_to_str from chameleon_enum import Command, SlotNumber, Status, TagSenseType, TagSpecificType from chameleon_enum import ButtonPressFunction, ButtonType, MifareClassicDarksideStatus from chameleon_enum import MfcKeyType, MfcValueBlockOperator @@ -270,7 +270,7 @@ class ChameleonCMD: raise ValueError(f'bitlen={bitlen} but missing data') if not ((len(data) - 1) * 8 < bitlen <= len(data) * 8): raise ValueError(f'bitlen={bitlen} incompatible with provided data ({len(data)} bytes), ' - f'must be between {((len(data) - 1) * 8 )+1} and {len(data) * 8} included') + f'must be between {((len(data) - 1) * 8)+1} and {len(data) * 8} included') data = bytes(cs)+struct.pack(f'!HH{len(data)}s', resp_timeout_ms, bitlen, bytearray(data)) resp = self.device.send_cmd_sync(Command.HF14A_RAW, data, timeout=(resp_timeout_ms // 1000) + 1) @@ -312,16 +312,16 @@ class ChameleonCMD: raise ValueError("Invalid len(keys)") data = struct.pack(f'!10s{6*len(keys)}s', mask, b''.join(keys)) - bitsCnt = 80 # maximum sectorKey_to_be_checked + bitsCnt = 80 # maximum sectorKey_to_be_checked for b in mask: while b > 0: [bitsCnt, b] = [bitsCnt - (b & 0b1), b >> 1] if bitsCnt < 1: # All sectorKey is masked return chameleon_com.Response( - cmd=Command.MF1_CHECK_KEYS_OF_SECTORS, + cmd=Command.MF1_CHECK_KEYS_OF_SECTORS, status=Status.HF_TAG_OK, - parsed={ 'status': Status.HF_TAG_OK }, + parsed={'status': Status.HF_TAG_OK}, ) # base timeout: 1s # auth: len(keys) * sectorKey_to_be_checked * 0.1s @@ -329,7 +329,7 @@ class ChameleonCMD: timeout = 1 + (bitsCnt + 1) * len(keys) * 0.1 resp = self.device.send_cmd_sync(Command.MF1_CHECK_KEYS_OF_SECTORS, data, timeout=timeout) - resp.parsed = { 'status': resp.status } + resp.parsed = {'status': resp.status} if len(resp.data) == 490: found = ''.join([format(i, '08b') for i in resp.data[0:10]]) # print(f'{found = }') @@ -339,6 +339,23 @@ class ChameleonCMD: }) return resp + @expect_response([Status.HF_TAG_OK, Status.HF_TAG_NO]) + def mf1_check_keys_on_block(self, block: int, key_type: int, keys: list[bytes]): + if key_type not in [0x60, 0x61]: + raise ValueError("Wrong key type") + if len(keys) < 1 or len(keys) > 83: + raise ValueError("Invalid len(keys)") + data = struct.pack(f'!BBB{6*len(keys)}s', block, key_type, len(keys), b''.join(keys)) + + resp = self.device.send_cmd_sync(Command.MF1_CHECK_KEYS_ON_BLOCK, data, timeout=10) + + if resp.status == Status.HF_TAG_OK and len(resp.data) == 7: + found, key = struct.unpack('!B6s', resp.data) + if found: + resp.parsed = key + + return resp + @expect_response(Status.HF_TAG_OK) def mf1_static_nested_acquire(self, block_known, type_known, key_known, block_target, type_target): """ @@ -358,7 +375,7 @@ class ChameleonCMD: ] } return resp - + @expect_response(Status.HF_TAG_OK) def mf1_hard_nested_acquire(self, slow, block_known, type_known, key_known, block_target, type_target): """ @@ -366,11 +383,46 @@ class ChameleonCMD: :return: """ data = struct.pack('!BBB6sBB', slow, type_known, block_known, key_known, type_target, block_target) - resp = self.device.send_cmd_sync(Command.DATA_CMD_MF1_HARDNESTED_ACQUIRE, data, timeout=30) + resp = self.device.send_cmd_sync(Command.MF1_HARDNESTED_ACQUIRE, data, timeout=30) if resp.status == Status.HF_TAG_OK: resp.parsed = resp.data # we can return the raw nonces bytes return resp + @expect_response([Status.HF_TAG_OK, Status.HF_TAG_NO]) + def mf1_static_encrypted_nested_acquire(self, backdoor_key, sector_count, starting_sector): + data = struct.pack('!6sBB', backdoor_key, sector_count, starting_sector) + resp = self.device.send_cmd_sync(Command.MF1_ENC_NESTED_ACQUIRE, data, timeout=30) + if resp.status == Status.HF_TAG_OK: + resp.parsed = { + 'uid': struct.unpack('!I', resp.data[0:4])[0], + 'nts': { + 'a': [], + 'b': [] + } + } + + i = 4 + + while i < len(resp.data): + resp.parsed['nts']['a'].append( + { + 'nt': reconstruct_full_nt(resp.data, i), + 'nt_enc': int.from_bytes(resp.data[i + 3: i + 7]), + 'parity': parity_to_str(resp.data[i + 2]) + } + ) + + resp.parsed['nts']['b'].append( + { + 'nt': reconstruct_full_nt(resp.data, i + 7), + 'nt_enc': int.from_bytes(resp.data[i + 10: i + 14]), + 'parity': parity_to_str(resp.data[i + 9]) + } + ) + + i += 14 + return resp + @expect_response(Status.LF_TAG_OK) def em410x_scan(self): """ @@ -626,7 +678,7 @@ class ChameleonCMD: data = struct.pack('!B', index) resp = self.device.send_cmd_sync(Command.MF0_NTAG_GET_COUNTER_DATA, data) if resp.status == Status.SUCCESS: - resp.parsed = (((resp.data[0] << 16) | (resp.data[1] << 8) | resp.data[2]), resp.data[3] == 0xBD) + resp.parsed = (((resp.data[2] << 16) | (resp.data[1] << 8) | resp.data[0]), resp.data[3] == 0xBD) return resp @expect_response(Status.SUCCESS) @@ -634,7 +686,8 @@ class ChameleonCMD: """ Sets data for selected counter """ - data = struct.pack('!BBBB', index | (int(reset_tearing) << 7), (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF) + data = struct.pack('!BBBB', index | (int(reset_tearing) << 7), + value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF) resp = self.device.send_cmd_sync(Command.MF0_NTAG_SET_COUNTER_DATA, data) return resp @@ -694,6 +747,41 @@ class ChameleonCMD: resp.parsed = resp.data.decode(encoding="utf8") return resp + @expect_response(Status.SUCCESS) + def get_all_slot_nicks(self): + resp = self.device.send_cmd_sync(Command.GET_ALL_SLOT_NICKS, b'') + + slots = [] + i = 0 + slot_index = 0 + + while i < len(resp.data) and slot_index < 8: + slot_names = {'hf': '', 'lf': ''} + + if i < len(resp.data): + hf_len = resp.data[i] + i += 1 + if hf_len > 0 and i + hf_len <= len(resp.data): + slot_names['hf'] = resp.data[i:i + hf_len].decode(encoding="utf8", errors="ignore") + i += hf_len + else: + i += hf_len + + if i < len(resp.data): + lf_len = resp.data[i] + i += 1 + if lf_len > 0 and i + lf_len <= len(resp.data): + slot_names['lf'] = resp.data[i:i + lf_len].decode(encoding="utf8", errors="ignore") + i += lf_len + else: + i += lf_len + + slots.append(slot_names) + slot_index += 1 + + resp.parsed = slots + return resp + @expect_response(Status.SUCCESS) def delete_slot_tag_nick(self, slot: SlotNumber, sense_type: TagSenseType): """ diff --git a/software/script/chameleon_enum.py b/software/script/chameleon_enum.py index 453d5f3..43c6fad 100644 --- a/software/script/chameleon_enum.py +++ b/software/script/chameleon_enum.py @@ -13,6 +13,7 @@ class Command(enum.IntEnum): SET_SLOT_TAG_NICK = 1007 GET_SLOT_TAG_NICK = 1008 + GET_ALL_SLOT_NICKS = 1038 SLOT_DATA_CONFIG_SAVE = 1009 @@ -69,7 +70,9 @@ class Command(enum.IntEnum): HF14A_RAW = 2010 MF1_MANIPULATE_VALUE_BLOCK = 2011 MF1_CHECK_KEYS_OF_SECTORS = 2012 - DATA_CMD_MF1_HARDNESTED_ACQUIRE = 2013 + MF1_HARDNESTED_ACQUIRE = 2013 + MF1_ENC_NESTED_ACQUIRE = 2014 + MF1_CHECK_KEYS_ON_BLOCK = 2015 EM410X_SCAN = 3000 EM410X_WRITE_TO_T55XX = 3001 @@ -376,6 +379,7 @@ class MifareClassicWriteMode(enum.IntEnum): return "Shadow requested" return "None" + @enum.unique class MifareUltralightWriteMode(enum.IntEnum): # Normal write @@ -408,6 +412,7 @@ class MifareUltralightWriteMode(enum.IntEnum): return "Shadow requested" return "None" + @enum.unique class MifareClassicPrngType(enum.IntEnum): # the random number of the card response is fixed @@ -501,6 +506,7 @@ class ButtonPressFunction(enum.IntEnum): return "Show Battery Level" return "None" + @enum.unique class MfcValueBlockOperator(enum.IntEnum): DECREMENT = 0xC0 diff --git a/software/script/chameleon_utils.py b/software/script/chameleon_utils.py index b758b4a..60669af 100644 --- a/software/script/chameleon_utils.py +++ b/software/script/chameleon_utils.py @@ -1,4 +1,10 @@ import argparse +import subprocess +import sys +import tempfile +import os.path +from pathlib import Path + import colorama from functools import wraps # once Python3.10 is mainstream, we can replace Union[str, None] by str | None @@ -18,6 +24,8 @@ CY = colorama.Fore.YELLOW CM = colorama.Fore.MAGENTA C0 = colorama.Style.RESET_ALL +default_cwd = Path.cwd() / Path(__file__).with_name("bin") + class ArgsParserError(Exception): pass @@ -102,6 +110,7 @@ class ArgumentParserNoExit(argparse.ArgumentParser): print('') self.help_requested = True + def print_mem_dump(bindata, blocksize): hexadecimal_len = blocksize*3+1 @@ -114,10 +123,104 @@ def print_mem_dump(bindata, blocksize): blk_index = 1 for b in blocks: hexstr = ' '.join(b.hex()[i:i+2] for i in range(0, len(b.hex()), 2)) - asciistr = ''.join([chr(b[i]) if (b[i] > 31 and b[i] < 127) else '.' for i in range(0,len(b),1)]) + asciistr = ''.join([chr(b[i]) if (b[i] > 31 and b[i] < 127) else '.' for i in range(0, len(b), 1)]) print(f"[=] {blk_index:3} | {hexstr.upper()} | {asciistr} ") blk_index += 1 + +def print_key_table(key_map): + key_width = max( + max(len(k) for k in key_map["A"].values()), + max(len(k) for k in key_map["B"].values()), + len("key A"), + len("key B"), + ) + header_line = f"[=] {'-'*5}+{'-'*(key_width+2)}+{'-'*(key_width+2)}" + print(header_line) + print(f"[=] sec | key A{' '*(key_width-5)} | key B{' '*(key_width-5)}") + print(header_line) + for sec, (a, b) in enumerate(zip(key_map["A"].values(), key_map["B"].values())): + print(f"[=] {sec:02d} | {a:{key_width}} | {b:{key_width}}") + print(header_line) + + +def _swap_endian(x): + x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8) + x = (x >> 16) | (x << 16) + return x & 0xFFFFFFFF + + +def prng_successor(x, n): + x = _swap_endian(x) + + while n > 0: + x = (x >> 1) | ( + (((x >> 16) ^ (x >> 18) ^ (x >> 19) ^ (x >> 21)) & 0x1) << 31 + ) + x = x & 0xFFFFFFFF + n -= 1 + + return _swap_endian(x) + + +def reconstruct_full_nt(response_data, offset): + nt = int.from_bytes(response_data[offset: offset + 2]) + + return (nt << 16) | prng_successor(nt, 16) + + +def parity_to_str(nt_par_err): + return "".join( + [ + str((nt_par_err >> 3) & 1), + str((nt_par_err >> 2) & 1), + str((nt_par_err >> 1) & 1), + str(nt_par_err & 1), + ] + ) + + +def execute_tool(tool_name, args): + if sys.platform == "win32": + tool_executable = f"{tool_name}.exe" + else: + tool_executable = f"./{tool_name}" + + tool_path = os.path.join(default_cwd, tool_executable) + cmd_recover_list = [tool_path] + cmd_recover_list.extend(args) + + # print(f"Executing: {' '.join(cmd_recover_list)}") + + temp_output_file = tempfile.NamedTemporaryFile( + suffix=".log", prefix="output_", delete=True, + mode='w+', encoding='utf-8', errors='replace' + ) + + process = subprocess.Popen( + cmd_recover_list, + cwd=tempfile.gettempdir(), + stdout=temp_output_file, + stderr=subprocess.STDOUT, + ) + + ret_code = process.wait() + temp_output_file.seek(0) + + if ret_code: + raise Exception('Failed to execute tool: ' + temp_output_file.read()) + + return temp_output_file.read() + + +def tqdm_if_exists(iterator): + try: + import tqdm + return tqdm.tqdm(iterator) + except ImportError: + return iterator + + def expect_response(accepted_responses: Union[int, list[int]]) -> Callable[..., Any]: """ Decorator for wrapping a Chameleon CMD function to check its response diff --git a/software/script/tests/output_grabber.py b/software/script/tests/output_grabber.py index e09680b..3d4a0de 100644 --- a/software/script/tests/output_grabber.py +++ b/software/script/tests/output_grabber.py @@ -4,6 +4,8 @@ import threading import time # From https://stackoverflow.com/a/29834357 + + class OutputGrabber(object): """ Class used to grab standard output or another stream. @@ -72,7 +74,7 @@ class OutputGrabber(object): and save the text in `captured_text`. """ while True: - char = os.read(self.pipe_out,1).decode(self.origstream.encoding) + char = os.read(self.pipe_out, 1).decode(self.origstream.encoding) if not char or self.escape_char in char: break self.captured_text += char diff --git a/software/script/tests/test_hard_acquire.py b/software/script/tests/test_hard_acquire.py index b441273..f0ef424 100644 --- a/software/script/tests/test_hard_acquire.py +++ b/software/script/tests/test_hard_acquire.py @@ -1,24 +1,22 @@ #!/usr/bin/env python3 +import hardnested_utils +from chameleon_cmd import ChameleonCMD +from chameleon_com import ChameleonCom, OpenFailException import sys sys.path.append('..') -from chameleon_com import ChameleonCom, OpenFailException -from chameleon_cmd import ChameleonCMD -import hardnested_utils - def test_hardnested_acquire(): nonces_buffer = bytearray() acquire_count = 0 # known key and target block - key = bytes.fromhex("FFFFFFFFFFFF") # <-- Your known key + key = bytes.fromhex("FFFFFFFFFFFF") # <-- Your known key block_known = 0x00 type_known = 0x60 block_target = 0x00 type_target = 0x60 - # Before acquire start, we need to reset history hardnested_utils.reset() @@ -32,7 +30,7 @@ def test_hardnested_acquire(): cml = ChameleonCom().open('/dev/ttyACM0') cml_cmd = ChameleonCMD(cml) - # ------------------------ SET DEVICE MODE ------------------------ + # ------------------------ SET DEVICE MODE ------------------------ print("Setting device mode to HF Reader...") status = cml_cmd.set_device_reader_mode() @@ -59,7 +57,8 @@ def test_hardnested_acquire(): while True: # 1, acquire from device - acquire_datas = cml_cmd.mf1_hard_nested_acquire(0, block_known, type_known, key, block_target, type_target) # slow = 0 to fast acquire... + # slow = 0 to fast acquire... + acquire_datas = cml_cmd.mf1_hard_nested_acquire(0, block_known, type_known, key, block_target, type_target) if acquire_datas is not None: acquire_count += 1 print(f"Acquire success, count: {acquire_count}") @@ -102,6 +101,7 @@ def test_hardnested_acquire(): # You can decrypt nonce bin by pm3 client, or any app if support pm3 nonce bin format. # TODO If CU bin can decrypt, run cmd on here... + if __name__ == "__main__": try: test_hardnested_acquire() diff --git a/software/src/CMakeLists.txt b/software/src/CMakeLists.txt index 76b914a..d19d0cb 100644 --- a/software/src/CMakeLists.txt +++ b/software/src/CMakeLists.txt @@ -2,9 +2,20 @@ cmake_minimum_required (VERSION 3.5) project (mifare C) +include(FetchContent) + set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../script/bin) set(SRC_DIR ./) # Assuming source files are in the same directory as CMakeLists.txt +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) + +if(CMAKE_CONFIGURATION_TYPES) + foreach(config ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${config} config_upper) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config_upper} ${EXECUTABLE_OUTPUT_PATH}) + endforeach() +endif() + # Define a variable for the compatibility code directory set(COMPAT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/compat) @@ -25,76 +36,25 @@ set( ${SRC_DIR}/mfkey.c ) -# --- liblzma Build --- -# NOTE: Ensure the path 'xz' matches the actual directory name containing liblzma source -set(LIBLZMA_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xz) -# Define the build directory *relative* to the liblzma source directory -set(LIBLZMA_BUILD_SUBDIR build) -set(LIBLZMA_BUILD_DIR ${LIBLZMA_SRC_DIR}/${LIBLZMA_BUILD_SUBDIR}) - -# Define CMake arguments for configuring liblzma -set(LIBLZMA_CMAKE_ARGS - -DXZ_TOOL_XZ=OFF - -DXZ_TOOL_XZDEC=OFF - -DXZ_TOOL_LZMADEC=OFF - -DXZ_TOOL_LZMAINFO=OFF - -DXZ_TOOL_SCRIPTS=OFF - -DXZ_DOC=OFF - -DXZ_NLS=OFF - -DXZ_DOXYGEN=OFF - -DBUILD_SHARED_LIBS=OFF # Ensure static lib is built - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -) -# Add platform-specific args -if(CMAKE_SYSTEM_NAME MATCHES "Windows") - list(APPEND LIBLZMA_CMAKE_ARGS "-DXZ_SANDBOX=no") -endif() - -# --- Define the expected path for the built liblzma library --- -if(CMAKE_SYSTEM_NAME MATCHES "Windows") - if(MSVC) - # Point to the Release directory as the build command uses --config Release - set(LIBLZMA_LIB_PATH "${LIBLZMA_BUILD_DIR}/Release/lzma.lib") - else() # MinGW / Ninja - # Assuming liblzma.a goes directly into build/ for non-MSVC Windows - set(LIBLZMA_LIB_PATH "${LIBLZMA_BUILD_DIR}/liblzma.a") - endif() -else() - # Single-config (Linux Makefiles/Ninja): Library is typically directly in the build directory - set(LIBLZMA_LIB_PATH "${LIBLZMA_BUILD_DIR}/liblzma.a") -endif() -message(STATUS "Expecting liblzma at: ${LIBLZMA_LIB_PATH}") - -# --- Use add_custom_command to declare the output file and the commands to create it --- -add_custom_command( - OUTPUT ${LIBLZMA_LIB_PATH} # Declare the file that will be generated - # Command 1: Configure liblzma - COMMAND ${CMAKE_COMMAND} -B ${LIBLZMA_BUILD_SUBDIR} -S . ${LIBLZMA_CMAKE_ARGS} -G "${CMAKE_GENERATOR}" # Pass generator - # Command 2: Build liblzma (using CMake --build) - COMMAND ${CMAKE_COMMAND} --build ${LIBLZMA_BUILD_SUBDIR} --config Release # Force Release build for liblzma - WORKING_DIRECTORY ${LIBLZMA_SRC_DIR} - DEPENDS ${LIBLZMA_SRC_DIR}/CMakeLists.txt # Re-run if xz's CMakeLists changes - COMMENT "Configuring and building liblzma (${LIBLZMA_LIB_PATH})" - VERBATIM - USES_TERMINAL # Show output during build +FetchContent_Declare( + xz + GIT_REPOSITORY "https://github.com/tukaani-project/xz" + GIT_TAG "v5.8.1" + OVERRIDE_FIND_PACKAGE + EXCLUDE_FROM_ALL ) -# --- Custom target that DEPENDS on the output file --- -# This target ensures the add_custom_command runs. -# Add ALL so it runs as part of the default build. -add_custom_target(build_liblzma ALL - DEPENDS ${LIBLZMA_LIB_PATH} # Depend on the output file generated by add_custom_command -) +set(XZ_TOOL_XZ OFF CACHE BOOL "") +set(XZ_TOOL_XZDEC OFF CACHE BOOL "") +set(XZ_TOOL_LZMADEC OFF CACHE BOOL "") +set(XZ_TOOL_LZMAINFO OFF CACHE BOOL "") +set(XZ_TOOL_SCRIPTS OFF CACHE BOOL "") +set(XZ_DOC OFF CACHE BOOL "") +set(XZ_NLS OFF CACHE BOOL "") +set(XZ_DOXYGEN OFF CACHE BOOL "") +set(BUILD_SHARED_LIBS OFF CACHE BOOL "") -# --- Create an IMPORTED library target for liblzma --- -add_library(liblzma_imported STATIC IMPORTED GLOBAL) -set_target_properties(liblzma_imported PROPERTIES - IMPORTED_LOCATION "${LIBLZMA_LIB_PATH}" - INTERFACE_INCLUDE_DIRECTORIES "${LIBLZMA_SRC_DIR}/src/liblzma/api" # Public include path -) - -# --- Ensure the IMPORTED target depends on the custom target --- -add_dependencies(liblzma_imported build_liblzma) +FetchContent_MakeAvailable(xz) # --- Hardnested Recovery Sources --- @@ -137,42 +97,16 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "Windows") endif() endif() - # --- Pthread library handling for Windows --- - if(MSVC) - # MSVC: Find the specific pthreads-win32 library - message(STATUS "MSVC compiler detected. Looking for pthreads-win32 library.") - find_library(PTHREAD_LIB_PATH pthreadVC2.lib PATHS ${CMAKE_CURRENT_SOURCE_DIR}/lib/pthread/lib/x64/) - if (NOT PTHREAD_LIB_PATH) - message(FATAL_ERROR "pthreadVC2.lib not found in ${CMAKE_CURRENT_SOURCE_DIR}/lib/pthread/lib/x64/. Please provide pthreads-win32 for MSVC.") - endif() - - # Create an imported library for pthread on Windows for consistency - add_library(pthread STATIC IMPORTED GLOBAL) - set_target_properties(pthread PROPERTIES - IMPORTED_LOCATION ${PTHREAD_LIB_PATH} - INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/lib/pthread/include - ) - set(LIBTHREAD pthread) # Use the imported target name - - elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") # Check for MinGW (GCC) or Clang on Windows - # MinGW or Clang on Windows: Use find_package(Threads) to find the bundled winpthreads - message(STATUS "MinGW (GCC) or Clang compiler detected on Windows. Using find_package(Threads).") - find_package(Threads REQUIRED) - if(Threads_FOUND) - set(LIBTHREAD Threads::Threads) # Use the modern CMake target - message(STATUS "Found MinGW pthreads using find_package(Threads).") - else() - # This shouldn't happen if Threads is REQUIRED, but good practice - message(FATAL_ERROR "Could not find pthreads using find_package(Threads) with MinGW/Clang. Check your toolchain installation.") - endif() - - else() - message(FATAL_ERROR "Unsupported Windows compiler: ${CMAKE_C_COMPILER_ID}. Cannot determine how to find pthreads.") - endif() - # --- End Pthread library handling --- + FetchContent_Declare( + pthreads4w + GIT_REPOSITORY "https://github.com/GerHobbelt/pthread-win32" + OVERRIDE_FIND_PACKAGE + EXCLUDE_FROM_ALL + ) + find_package(pthreads4w CONFIG REQUIRED) + set(LIBTHREAD pthreads4w::pthreadVC3) set(LIBMATH "") # No separate math library needed on Windows - else() # Handle other platforms or provide a default/error MESSAGE(STATUS "Running on other platform: ${CMAKE_SYSTEM_NAME}") @@ -256,17 +190,43 @@ if (CMAKE_SYSTEM_NAME MATCHES "Windows") target_compile_definitions(mfkey64 PRIVATE HAVE_STRUCT_TIMESPEC) endif() +add_executable(staticnested_1nt ${COMMON_FILES} staticnested_1nt.c) +target_include_directories(staticnested_1nt PRIVATE ${SRC_DIR}) +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + target_compile_definitions(staticnested_1nt PRIVATE _GNU_SOURCE) +endif() +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_compile_definitions(staticnested_1nt PRIVATE HAVE_STRUCT_TIMESPEC) +endif() + +add_executable(staticnested_2x1nt_rf08s ${COMMON_FILES} staticnested_2x1nt_rf08s.c) +target_include_directories(staticnested_2x1nt_rf08s PRIVATE ${SRC_DIR}) +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + target_compile_definitions(staticnested_2x1nt_rf08s PRIVATE _GNU_SOURCE) +endif() +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_compile_definitions(staticnested_2x1nt_rf08s PRIVATE HAVE_STRUCT_TIMESPEC) +endif() + +add_executable(staticnested_2x1nt_rf08s_1key ${COMMON_FILES} staticnested_2x1nt_rf08s_1key.c) +target_include_directories(staticnested_2x1nt_rf08s_1key PRIVATE ${SRC_DIR}) +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + target_compile_definitions(staticnested_2x1nt_rf08s_1key PRIVATE _GNU_SOURCE) +endif() +if (CMAKE_SYSTEM_NAME MATCHES "Windows") + target_compile_definitions(staticnested_2x1nt_rf08s_1key PRIVATE HAVE_STRUCT_TIMESPEC) +endif() + # --- hardnested Executable --- add_executable(hardnested ${COMMON_FILES} ${HARDNESTED_SOURCES}) -add_dependencies(hardnested liblzma_imported) # Ensure liblzma is built first target_include_directories(hardnested PRIVATE ${SRC_DIR} ${HARDNESTED_RECOVERY_DIR} ${HARDNESTED_RECOVERY_DIR}/pm3 ${HARDNESTED_RECOVERY_DIR}/hardnested - # liblzma include dir comes via INTERFACE property of liblzma_imported + ${xz_SOURCE_DIR}/src/liblzma/api ) target_compile_options(hardnested PRIVATE -Wall) @@ -301,9 +261,5 @@ endif() # End Windows target_link_libraries(hardnested PRIVATE ${LIBTHREAD} # Handles pthread correctly now for Linux, MSVC, MinGW ${LIBMATH} # Handles 'm' on Linux, empty on Windows - liblzma_imported # Link against the IMPORTED target name + liblzma ) - -# Set the output directory for all executables at the end -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) - diff --git a/software/src/HardnestedRecovery/cmdhfmfhard.c b/software/src/HardnestedRecovery/cmdhfmfhard.c index 60f80f5..1b455e3 100755 --- a/software/src/HardnestedRecovery/cmdhfmfhard.c +++ b/software/src/HardnestedRecovery/cmdhfmfhard.c @@ -42,19 +42,19 @@ #include "pm3/commonutil.h" #include "pm3/util_posix.h" #include "hardnested/tables.h" -#include <../../xz/src/liblzma/api/lzma.h> +#include #define NUM_CHECK_BITFLIPS_THREADS (num_CPUs()) #if defined(_MSC_VER) - #define NUM_CHECK_BITFLIPS_THREADS_ALLOC 128 +#define NUM_CHECK_BITFLIPS_THREADS_ALLOC 128 #else - #define NUM_CHECK_BITFLIPS_THREADS_ALLOC (num_CPUs()) +#define NUM_CHECK_BITFLIPS_THREADS_ALLOC (num_CPUs()) #endif #define NUM_REDUCTION_WORKING_THREADS (num_CPUs()) #if defined(_MSC_VER) - #define NUM_REDUCTION_WORKING_THREADS_ALLOC 128 +#define NUM_REDUCTION_WORKING_THREADS_ALLOC 128 #else - #define NUM_REDUCTION_WORKING_THREADS_ALLOC (num_CPUs()) +#define NUM_REDUCTION_WORKING_THREADS_ALLOC (num_CPUs()) #endif #define IGNORE_BITFLIP_THRESHOLD 0.99 // ignore bitflip arrays which have nearly only valid states @@ -63,7 +63,8 @@ // possible sum property values static uint16_t sums[NUM_SUMS] = {0, 32, 56, 64, 80, 96, 104, 112, 120, 128, 136, 144, 152, 160, 176, 192, 200, 224, - 256}; + 256 + }; // number of possible partial sum property values #define NUM_PART_SUMS 9 @@ -104,9 +105,9 @@ static void get_SIMD_instruction_set(char *instruction_set) { break; #endif #if defined(COMPILER_HAS_SIMD_NEON) - case SIMD_NEON: - strcpy(instruction_set, "NEON"); - break; + case SIMD_NEON: + strcpy(instruction_set, "NEON"); + break; #endif case SIMD_AUTO: case SIMD_NONE: @@ -121,7 +122,7 @@ static void print_progress_header(void) { char instr_set[12] = ""; get_SIMD_instruction_set(instr_set); snprintf(progress_text, sizeof(progress_text), "Start using " - _YELLOW_("%d") + _YELLOW_("%d") " threads", num_CPUs()); PrintAndLogEx(INFO, "Hardnested attack starting..."); @@ -306,7 +307,7 @@ static void init_bitflip_bitarrays(void) { qsort(all_effective_bitflip + num_1st_byte_effective_bitflips, num_all_effective_bitflips - num_1st_byte_effective_bitflips, sizeof(uint16_t), compare_count_bitflip_bitarrays); char progress_text[80]; sprintf(progress_text, "Using %d precalculated bitflip state tables", num_all_effective_bitflips); - hardnested_print_progress(0, progress_text, (float) (1LL << 47), 0); + hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0); } static void free_bitflip_bitarrays(void) { @@ -440,8 +441,9 @@ static char failstr[250] = ""; #endif static const float p_K0[NUM_SUMS] = { // the probability that a random nonce has a Sum Property K - 0.0290, 0.0083, 0.0006, 0.0339, 0.0048, 0.0934, 0.0119, 0.0489, 0.0602, 0.4180, 0.0602, 0.0489, 0.0119, 0.0934, - 0.0048, 0.0339, 0.0006, 0.0083, 0.0290}; + 0.0290, 0.0083, 0.0006, 0.0339, 0.0048, 0.0934, 0.0119, 0.0489, 0.0602, 0.4180, 0.0602, 0.0489, 0.0119, 0.0934, + 0.0048, 0.0339, 0.0006, 0.0083, 0.0290 +}; static float my_p_K[NUM_SUMS]; static const float *p_K; @@ -641,7 +643,7 @@ static void update_allbitflips_array(void) { if (nonces[i].all_bitflips_dirty[odd_even]) { uint32_t old_count = num_all_bitflips_bitarray[odd_even]; num_all_bitflips_bitarray[odd_even] = count_bitarray_low20_AND(all_bitflips_bitarray[odd_even], - nonces[i].states_bitarray[odd_even]); + nonces[i].states_bitarray[odd_even]); nonces[i].all_bitflips_dirty[odd_even] = false; if (num_all_bitflips_bitarray[odd_even] != old_count) { all_bitflips_bitarray_dirty[odd_even] = true; @@ -658,7 +660,7 @@ estimated_num_states_part_sum_coarse(uint16_t part_sum_a0_idx, uint16_t part_sum } static uint32_t estimated_num_states_part_sum(uint8_t first_byte, uint16_t part_sum_a0_idx, uint16_t part_sum_a8_idx, - odd_even_t odd_even) { + odd_even_t odd_even) { if (odd_even == ODD_STATE) { return count_bitarray_AND3(part_sum_a0_bitarrays[odd_even][part_sum_a0_idx], part_sum_a8_bitarrays[odd_even][part_sum_a8_idx], @@ -746,7 +748,7 @@ static void update_sum_bitarrays(odd_even_t odd_even) { } for (uint16_t i = 0; i < 256; i++) { nonces[i].num_states_bitarray[odd_even] = count_bitarray_AND(nonces[i].states_bitarray[odd_even], - all_bitflips_bitarray[odd_even]); + all_bitflips_bitarray[odd_even]); } for (uint8_t part_sum_a0 = 0; part_sum_a0 < NUM_PART_SUMS; part_sum_a0++) { for (uint8_t part_sum_a8 = 0; part_sum_a8 < NUM_PART_SUMS; part_sum_a8++) { @@ -807,10 +809,10 @@ static void update_expected_brute_force(uint8_t best_byte) { nonces[best_byte].expected_num_brute_force = 0.0; for (uint8_t i = 0; i < NUM_SUMS; i++) { nonces[best_byte].expected_num_brute_force += - nonces[best_byte].sum_a8_guess[i].prob * (float) nonces[best_byte].sum_a8_guess[i].num_states / 2.0; + nonces[best_byte].sum_a8_guess[i].prob * (float) nonces[best_byte].sum_a8_guess[i].num_states / 2.0; prob_all_failed -= nonces[best_byte].sum_a8_guess[i].prob; nonces[best_byte].expected_num_brute_force += - prob_all_failed * (float) nonces[best_byte].sum_a8_guess[i].num_states / 2.0; + prob_all_failed * (float) nonces[best_byte].sum_a8_guess[i].num_states / 2.0; } return; } @@ -825,9 +827,9 @@ static float sort_best_first_bytes(void) { nonces[i].expected_num_brute_force = 0.0; for (uint8_t j = 0; j < NUM_SUMS; j++) { nonces[i].sum_a8_guess[j].num_states = estimated_num_states_coarse(sums[first_byte_Sum], - sums[nonces[i].sum_a8_guess[j].sum_a8_idx]); + sums[nonces[i].sum_a8_guess[j].sum_a8_idx]); nonces[i].expected_num_brute_force += - nonces[i].sum_a8_guess[j].prob * (float) nonces[i].sum_a8_guess[j].num_states / 2.0; + nonces[i].sum_a8_guess[j].prob * (float) nonces[i].sum_a8_guess[j].num_states / 2.0; prob_all_failed -= nonces[i].sum_a8_guess[j].prob; nonces[i].expected_num_brute_force += prob_all_failed * (float) nonces[i].sum_a8_guess[j].num_states / 2.0; } @@ -844,7 +846,7 @@ static float sort_best_first_bytes(void) { uint16_t first_byte = best_first_bytes[i]; for (uint8_t j = 0; j < NUM_SUMS && nonces[first_byte].sum_a8_guess[j].prob > 0.05; j++) { nonces[first_byte].sum_a8_guess[j].num_states = estimated_num_states(first_byte, sums[first_byte_Sum], - sums[nonces[first_byte].sum_a8_guess[j].sum_a8_idx]); + sums[nonces[first_byte].sum_a8_guess[j].sum_a8_idx]); } // while (nonces[first_byte].sum_a8_guess[0].num_states == 0 // || nonces[first_byte].sum_a8_guess[1].num_states == 0 @@ -881,11 +883,11 @@ static float sort_best_first_bytes(void) { nonces[first_byte].expected_num_brute_force = 0.0; for (uint8_t j = 0; j < NUM_SUMS; j++) { nonces[first_byte].expected_num_brute_force += - nonces[first_byte].sum_a8_guess[j].prob * (float) nonces[first_byte].sum_a8_guess[j].num_states / - 2.0; + nonces[first_byte].sum_a8_guess[j].prob * (float) nonces[first_byte].sum_a8_guess[j].num_states / + 2.0; prob_all_failed -= nonces[first_byte].sum_a8_guess[j].prob; nonces[first_byte].expected_num_brute_force += - prob_all_failed * (float) nonces[first_byte].sum_a8_guess[j].num_states / 2.0; + prob_all_failed * (float) nonces[first_byte].sum_a8_guess[j].num_states / 2.0; } } @@ -915,13 +917,13 @@ static float update_reduction_rate(float last, bool init) { for (uint16_t i = 0; i < QUEUE_LEN - 1; i++) { if (init) { - queue[i] = (float) (1LL << 48); + queue[i] = (float)(1LL << 48); } else { queue[i] = queue[i + 1]; } } if (init) { - queue[QUEUE_LEN - 1] = (float) (1LL << 48); + queue[QUEUE_LEN - 1] = (float)(1LL << 48); } else { queue[QUEUE_LEN - 1] = last; } @@ -956,7 +958,7 @@ static bool shrink_key_space(float *brute_forces) { PrintAndLogEx(INFO, "shrink_key_space() with stage = 0x%02x\n", hardnested_stage); #endif float brute_forces1 = check_smallest_bitflip_bitarrays(); - float brute_forces2 = (float) (1LL << 47); + float brute_forces2 = (float)(1LL << 47); if (hardnested_stage & CHECK_2ND_BYTES) { brute_forces2 = sort_best_first_bytes(); } @@ -1024,14 +1026,14 @@ __attribute__((force_align_arg_pointer)) for (uint16_t i = first_byte; i <= last_byte; i++) { if (nonces[i].BitFlips[bitflip] == 0 && nonces[i].BitFlips[bitflip ^ 0x100] == 0 && - nonces[i].first != NULL && nonces[i ^ (bitflip & 0xff)].first != NULL) { + nonces[i].first != NULL && nonces[i ^ (bitflip & 0xff)].first != NULL) { uint8_t parity1 = (nonces[i].first->par_enc) >> 3; // parity of first byte uint8_t parity2 = - (nonces[i ^ (bitflip & 0xff)].first->par_enc) >> 3; // parity of nonce with bits flipped + (nonces[i ^ (bitflip & 0xff)].first->par_enc) >> 3; // parity of nonce with bits flipped if ((parity1 == parity2 && !(bitflip & 0x100)) // bitflip - || (parity1 != parity2 && (bitflip & 0x100))) { // not bitflip + || (parity1 != parity2 && (bitflip & 0x100))) { // not bitflip nonces[i].BitFlips[bitflip] = 1; @@ -1051,7 +1053,7 @@ __attribute__((force_align_arg_pointer)) } } ((uint8_t *) args)[1] = - num_1st_byte_effective_bitflips - bitflip_idx - 1; // bitflips still to go in stage 1 + num_1st_byte_effective_bitflips - bitflip_idx - 1; // bitflips still to go in stage 1 } } @@ -1059,7 +1061,7 @@ __attribute__((force_align_arg_pointer)) if (hardnested_stage & CHECK_2ND_BYTES) { for (uint16_t bitflip_idx = num_1st_byte_effective_bitflips; - bitflip_idx < num_all_effective_bitflips; bitflip_idx++) { + bitflip_idx < num_all_effective_bitflips; bitflip_idx++) { uint16_t bitflip = all_effective_bitflip[bitflip_idx]; if (time_budget && timeout()) { #if defined (DEBUG_REDUCTION) @@ -1077,7 +1079,7 @@ __attribute__((force_align_arg_pointer)) uint8_t parity1 = byte1->par_enc >> 2 & 0x01; // parity of 2nd byte uint8_t parity2 = byte2->par_enc >> 2 & 0x01; // parity of 2nd byte with bits flipped if ((parity1 == parity2 && !(bitflip & 0x100)) // bitflip - || (parity1 != parity2 && (bitflip & 0x100))) { // not bitflip + || (parity1 != parity2 && (bitflip & 0x100))) { // not bitflip nonces[i].BitFlips[bitflip] = 1; for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { if (bitflip_bitarrays[odd_even][bitflip] != NULL) { @@ -1154,13 +1156,13 @@ static void update_nonce_data(bool time_budget) { static void apply_sum_a0(void) { uint32_t old_count = num_all_bitflips_bitarray[EVEN_STATE]; num_all_bitflips_bitarray[EVEN_STATE] = count_bitarray_AND(all_bitflips_bitarray[EVEN_STATE], - sum_a0_bitarrays[EVEN_STATE][first_byte_Sum]); + sum_a0_bitarrays[EVEN_STATE][first_byte_Sum]); if (num_all_bitflips_bitarray[EVEN_STATE] != old_count) { all_bitflips_bitarray_dirty[EVEN_STATE] = true; } old_count = num_all_bitflips_bitarray[ODD_STATE]; num_all_bitflips_bitarray[ODD_STATE] = count_bitarray_AND(all_bitflips_bitarray[ODD_STATE], - sum_a0_bitarrays[ODD_STATE][first_byte_Sum]); + sum_a0_bitarrays[ODD_STATE][first_byte_Sum]); if (num_all_bitflips_bitarray[ODD_STATE] != old_count) { all_bitflips_bitarray_dirty[ODD_STATE] = true; } @@ -1275,14 +1277,14 @@ static inline bool invariant_holds(uint_fast8_t byte_diff, uint_fast32_t state1, uint_fast8_t state_bit) { uint_fast8_t j_1_bit_mask = 0x01 << (bit - 1); uint_fast8_t bit_diff = - byte_diff & j_1_bit_mask; // difference of (j-1)th bit + byte_diff & j_1_bit_mask; // difference of (j-1)th bit uint_fast8_t filter_diff = - filter(state1 >> (4 - state_bit)) ^ filter(state2 >> (4 - state_bit)); // difference in filter function + filter(state1 >> (4 - state_bit)) ^ filter(state2 >> (4 - state_bit)); // difference in filter function uint_fast8_t mask_y12_y13 = (0xc0 >> state_bit); uint_fast8_t state_bits_diff = - (state1 ^ state2) & mask_y12_y13; // difference in state bits 12 and 13 + (state1 ^ state2) & mask_y12_y13; // difference in state bits 12 and 13 uint_fast8_t all_diff = evenparity8( - bit_diff ^ state_bits_diff ^ filter_diff); // use parity function to XOR all bits + bit_diff ^ state_bits_diff ^ filter_diff); // use parity function to XOR all bits return !all_diff; } @@ -1290,12 +1292,12 @@ static inline bool invalid_state(uint_fast8_t byte_diff, uint_fast32_t state1, u uint_fast8_t state_bit) { uint_fast8_t j_bit_mask = (0x01 << bit); uint_fast8_t bit_diff = - byte_diff & j_bit_mask; // difference of jth bit + byte_diff & j_bit_mask; // difference of jth bit uint_fast8_t mask_y13_y16 = (0x48 >> state_bit); uint_fast8_t state_bits_diff = - (state1 ^ state2) & mask_y13_y16; // difference in state bits 13 and 16 + (state1 ^ state2) & mask_y13_y16; // difference in state bits 13 and 16 uint_fast8_t all_diff = evenparity8( - bit_diff ^ state_bits_diff); // use parity function to XOR all bits + bit_diff ^ state_bits_diff); // use parity function to XOR all bits return all_diff; } @@ -1398,10 +1400,10 @@ static inline bool bitflips_match(uint8_t byte, uint32_t state, odd_even_t odd_e #ifdef DEBUG_KEY_ELIMINATION if (!quiet && known_target_key != -1 && state == test_state[odd_even]) { PrintAndLogEx(INFO, "Initial state lists: " - _YELLOW_("%s") + _YELLOW_("%s") " test state eliminated by bitflip property.", odd_even == EVEN_STATE ? "even" : "odd"); snprintf(failstr, sizeof(failstr), "Initial " - _YELLOW_("%s") + _YELLOW_("%s") " byte Bitflip property", odd_even == EVEN_STATE ? "even" : "odd"); } #endif @@ -1417,7 +1419,8 @@ static uint_fast8_t reverse(uint_fast8_t b) { static bool all_bitflips_match(uint8_t byte, uint32_t state, odd_even_t odd_even) { uint32_t masks[2][8] = {{0x00fffff0, 0x00fffff8, 0x00fffff8, 0x00fffffc, 0x00fffffc, 0x00fffffe, 0x00fffffe, 0x00ffffff}, - {0x00fffff0, 0x00fffff0, 0x00fffff8, 0x00fffff8, 0x00fffffc, 0x00fffffc, 0x00fffffe, 0x00fffffe}}; + {0x00fffff0, 0x00fffff0, 0x00fffff8, 0x00fffff8, 0x00fffffc, 0x00fffffc, 0x00fffffe, 0x00fffffe} + }; for (uint16_t i = 1; i < 256; i++) { uint_fast8_t bytes_diff = reverse(i); // start with most common bits @@ -1431,7 +1434,7 @@ static bool all_bitflips_match(uint8_t byte, uint32_t state, odd_even_t odd_even # ifdef DEBUG_KEY_ELIMINATION if (bitflips_match(byte2, (state & mask) | remaining_bits, odd_even, true)) # else - if (bitflips_match(byte2, (state & mask) | remaining_bits, odd_even)) + if (bitflips_match(byte2, (state & mask) | remaining_bits, odd_even)) # endif { found_match = true; @@ -1601,15 +1604,15 @@ __attribute__((force_align_arg_pointer)) if (2 * r * (16 - 2 * s) + (16 - 2 * r) * 2 * s == sum_a8) { pthread_mutex_lock(&book_of_work_mutex); if (book_of_work[p][q][r][s] != - TO_BE_DONE) { // this has been done or is currently been done by another thread. Look for some other work. + TO_BE_DONE) { // this has been done or is currently been done by another thread. Look for some other work. pthread_mutex_unlock(&book_of_work_mutex); continue; } pthread_mutex_lock(&statelist_cache_mutex); if (sl_cache[p][r][ODD_STATE].cache_status == WORK_IN_PROGRESS || - sl_cache[q][s][EVEN_STATE].cache_status == - WORK_IN_PROGRESS) { // defer until not blocked by another thread. + sl_cache[q][s][EVEN_STATE].cache_status == + WORK_IN_PROGRESS) { // defer until not blocked by another thread. pthread_mutex_unlock(&statelist_cache_mutex); pthread_mutex_unlock(&book_of_work_mutex); there_might_be_more_work = true; @@ -1860,7 +1863,7 @@ static void init_it_all(void) { int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, uint8_t trgKeyType, uint8_t *trgkey, - bool nonce_file_read, bool nonce_file_write, bool slow, uint64_t *foundkey, char *filename, uint32_t uid, char* path) { + bool nonce_file_read, bool nonce_file_write, bool slow, uint64_t *foundkey, char *filename, uint32_t uid, char *path) { char progress_text[80]; char instr_set[12] = {0}; @@ -1880,7 +1883,7 @@ mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, print_progress_header(); snprintf(progress_text, sizeof(progress_text), "Brute force benchmark: %1.0f million (2^%1.1f) keys/s", brute_force_per_second / 1000000, log(brute_force_per_second) / log(2.0)); - hardnested_print_progress(0, progress_text, (float) (1LL << 47), 0); + hardnested_print_progress(0, progress_text, (float)(1LL << 47), 0); if (trgkey != NULL) { known_target_key = bytes_to_num(trgkey, 6); @@ -1968,10 +1971,10 @@ mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, return key_found; } -char* run_hardnested(uint32_t uid, char* path) { +char *run_hardnested(uint32_t uid, char* path) { uint64_t foundkey = 0; if (mfnestedhard(0, 0, NULL, 0, 0, NULL, false, false, false, &foundkey, NULL, uid, path) == 1) { - char* keystr = malloc(14); + char *keystr = malloc(14); snprintf(keystr, 14, "%012" PRIx64 ";", foundkey); return keystr; } else { diff --git a/software/src/HardnestedRecovery/cmdhfmfhard.h b/software/src/HardnestedRecovery/cmdhfmfhard.h index 29b3bcb..84ef9b0 100755 --- a/software/src/HardnestedRecovery/cmdhfmfhard.h +++ b/software/src/HardnestedRecovery/cmdhfmfhard.h @@ -23,7 +23,7 @@ int mfnestedhard(uint8_t blockNo, uint8_t keyType, uint8_t *key, uint8_t trgBlockNo, uint8_t trgKeyType, uint8_t *trgkey, - bool nonce_file_read, bool nonce_file_write, bool slow, uint64_t *foundkey, char *filename, uint32_t uid, char* path); + bool nonce_file_read, bool nonce_file_write, bool slow, uint64_t *foundkey, char *filename, uint32_t uid, char *path); void hardnested_print_progress(uint32_t nonces, const char *activity, float brute_force, uint64_t min_diff_print_time); #endif diff --git a/software/src/HardnestedRecovery/crapto1.c b/software/src/HardnestedRecovery/crapto1.c index d418baa..bc63467 100755 --- a/software/src/HardnestedRecovery/crapto1.c +++ b/software/src/HardnestedRecovery/crapto1.c @@ -181,8 +181,8 @@ bool validate_prng_nonce(uint32_t nonce) { } static uint32_t fastfwd[2][8] = { - { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB}, - { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980} + { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB}, + { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980} }; /** lfsr_prefix_ks @@ -283,7 +283,7 @@ struct Crypto1State *lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8] } s->odd = s->even = 0; - out: +out: free(odd); free(even); return statelist; diff --git a/software/src/HardnestedRecovery/crypto1.c b/software/src/HardnestedRecovery/crypto1.c index b5be1ff..d4f9580 100755 --- a/software/src/HardnestedRecovery/crypto1.c +++ b/software/src/HardnestedRecovery/crypto1.c @@ -158,8 +158,8 @@ uint32_t prng_successor(uint32_t x, uint32_t n) { int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, const uint8_t *parity) { return ( - (oddparity8((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity8((NtEnc >> 24) & 0xFF) ^ BIT(Ks1, 16))) && \ + (oddparity8((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity8((NtEnc >> 24) & 0xFF) ^ BIT(Ks1, 16))) && \ (oddparity8((Nt >> 16) & 0xFF) == ((parity[1]) ^ oddparity8((NtEnc >> 16) & 0xFF) ^ BIT(Ks1, 8))) && \ (oddparity8((Nt >> 8) & 0xFF) == ((parity[2]) ^ oddparity8((NtEnc >> 8) & 0xFF) ^ BIT(Ks1, 0))) ) ? 1 : 0; -} \ No newline at end of file +} diff --git a/software/src/HardnestedRecovery/hardnested/hardnested_benchmark_data.h b/software/src/HardnestedRecovery/hardnested/hardnested_benchmark_data.h index f99be55..056fb4d 100755 --- a/software/src/HardnestedRecovery/hardnested/hardnested_benchmark_data.h +++ b/software/src/HardnestedRecovery/hardnested/hardnested_benchmark_data.h @@ -1,6679 +1,6679 @@ unsigned char client_resources_hardnested_bf_bench_data_bin[] = { - 0x12, 0x00, 0x00, 0x00, 0xb0, 0x94, 0xc9, 0x02, 0x04, 0x33, 0xd5, 0x49, - 0x02, 0x02, 0x11, 0x97, 0xc1, 0x02, 0x01, 0x90, 0xe0, 0x35, 0x02, 0x06, - 0xe4, 0x37, 0xbb, 0x02, 0x07, 0xc4, 0x87, 0xa7, 0x02, 0x03, 0x79, 0x66, - 0xa2, 0x02, 0x02, 0x2c, 0xe7, 0x98, 0x02, 0x02, 0xcb, 0x4f, 0x8b, 0x02, - 0x06, 0x48, 0x72, 0x83, 0x02, 0x02, 0x24, 0x0b, 0x68, 0x02, 0x01, 0xef, - 0xe1, 0x60, 0x02, 0x04, 0x33, 0xd5, 0x49, 0x02, 0x02, 0x89, 0x40, 0x46, - 0x02, 0x03, 0xe0, 0x67, 0x38, 0x02, 0x00, 0x90, 0xe0, 0x35, 0x02, 0x06, - 0xcd, 0x0e, 0x2f, 0x02, 0x02, 0xb4, 0xc0, 0x2e, 0x02, 0x04, 0x10, 0x27, - 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xeb, 0x07, - 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, 0xcb, 0x0f, 0x00, 0x00, 0xeb, 0x0f, - 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfe, 0x0f, - 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0x17, 0x00, 0x00, 0xfc, 0x17, - 0x00, 0x00, 0xfe, 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0x8b, 0x1b, - 0x00, 0x00, 0xeb, 0x23, 0x00, 0x00, 0xf8, 0x29, 0x00, 0x00, 0xfc, 0x29, - 0x00, 0x00, 0xfe, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xf0, 0x33, - 0x00, 0x00, 0xf1, 0x33, 0x00, 0x00, 0xf7, 0x33, 0x00, 0x00, 0xf9, 0x33, - 0x00, 0x00, 0xfd, 0x33, 0x00, 0x00, 0xb0, 0x44, 0x00, 0x00, 0xf7, 0x45, - 0x00, 0x00, 0xf8, 0x45, 0x00, 0x00, 0xfc, 0x45, 0x00, 0x00, 0xfe, 0x45, - 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xb0, 0x46, 0x00, 0x00, 0xf0, 0x4b, - 0x00, 0x00, 0xf7, 0x5f, 0x00, 0x00, 0xf8, 0x5f, 0x00, 0x00, 0xfc, 0x5f, - 0x00, 0x00, 0xfe, 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xfb, 0x65, - 0x00, 0x00, 0xfb, 0x7d, 0x00, 0x00, 0xf7, 0x83, 0x00, 0x00, 0xf1, 0x8b, - 0x00, 0x00, 0xf7, 0x8b, 0x00, 0x00, 0xf9, 0x8b, 0x00, 0x00, 0xfb, 0x95, - 0x00, 0x00, 0xbb, 0xb2, 0x00, 0x00, 0xbb, 0xbe, 0x00, 0x00, 0xf1, 0xbf, - 0x00, 0x00, 0xf7, 0xbf, 0x00, 0x00, 0xf9, 0xbf, 0x00, 0x00, 0xf6, 0xc5, - 0x00, 0x00, 0xf7, 0xc5, 0x00, 0x00, 0xf8, 0xc5, 0x00, 0x00, 0xfc, 0xc5, - 0x00, 0x00, 0xfe, 0xc5, 0x00, 0x00, 0xff, 0xc5, 0x00, 0x00, 0xf0, 0xc9, - 0x00, 0x00, 0xf1, 0xc9, 0x00, 0x00, 0xf9, 0xc9, 0x00, 0x00, 0xfd, 0xc9, - 0x00, 0x00, 0xf0, 0xcf, 0x00, 0x00, 0xf1, 0xcf, 0x00, 0x00, 0xf9, 0xcf, - 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xf8, 0xd5, 0x00, 0x00, 0xfc, 0xd5, - 0x00, 0x00, 0xfe, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xf8, 0xd9, - 0x00, 0x00, 0xfc, 0xd9, 0x00, 0x00, 0xfe, 0xd9, 0x00, 0x00, 0xff, 0xd9, - 0x00, 0x00, 0xf8, 0xdd, 0x00, 0x00, 0xfc, 0xdd, 0x00, 0x00, 0xfe, 0xdd, - 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0xf0, 0xe5, 0x00, 0x00, 0xf6, 0xe9, - 0x00, 0x00, 0xf7, 0xe9, 0x00, 0x00, 0xf8, 0xe9, 0x00, 0x00, 0xfc, 0xe9, - 0x00, 0x00, 0xfe, 0xe9, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xf0, 0xed, - 0x00, 0x00, 0xf0, 0xef, 0x00, 0x00, 0xf1, 0xef, 0x00, 0x00, 0xf9, 0xef, - 0x00, 0x00, 0xfd, 0xef, 0x00, 0x00, 0x88, 0xf3, 0x00, 0x00, 0x8b, 0xf3, - 0x00, 0x00, 0xf7, 0xf9, 0x00, 0x00, 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xf9, - 0x00, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xf0, 0xfd, - 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x8b, 0xff, 0x00, 0x00, 0xc6, 0xff, - 0x00, 0x00, 0xe6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, - 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf3, 0x01, 0x01, 0x00, 0xfb, 0x01, - 0x01, 0x00, 0xf4, 0x05, 0x01, 0x00, 0xf5, 0x05, 0x01, 0x00, 0xf8, 0x05, - 0x01, 0x00, 0xfc, 0x05, 0x01, 0x00, 0xfe, 0x05, 0x01, 0x00, 0xff, 0x05, - 0x01, 0x00, 0xf4, 0x11, 0x01, 0x00, 0xf5, 0x11, 0x01, 0x00, 0xf8, 0x11, - 0x01, 0x00, 0xfc, 0x11, 0x01, 0x00, 0xfe, 0x11, 0x01, 0x00, 0xff, 0x11, - 0x01, 0x00, 0xf3, 0x19, 0x01, 0x00, 0xfb, 0x19, 0x01, 0x00, 0xcb, 0x25, - 0x01, 0x00, 0x88, 0x33, 0x01, 0x00, 0x8b, 0x33, 0x01, 0x00, 0xcb, 0x39, - 0x01, 0x00, 0xf0, 0x39, 0x01, 0x00, 0xf1, 0x39, 0x01, 0x00, 0xf9, 0x39, - 0x01, 0x00, 0xfd, 0x39, 0x01, 0x00, 0xcb, 0x3d, 0x01, 0x00, 0xf0, 0x3d, - 0x01, 0x00, 0xf1, 0x3d, 0x01, 0x00, 0xf9, 0x3d, 0x01, 0x00, 0xfd, 0x3d, - 0x01, 0x00, 0x88, 0x3f, 0x01, 0x00, 0x8b, 0x3f, 0x01, 0x00, 0xf0, 0x41, - 0x01, 0x00, 0xf1, 0x41, 0x01, 0x00, 0xf9, 0x41, 0x01, 0x00, 0xfd, 0x41, - 0x01, 0x00, 0xf6, 0x43, 0x01, 0x00, 0xf7, 0x43, 0x01, 0x00, 0xf8, 0x43, - 0x01, 0x00, 0xfc, 0x43, 0x01, 0x00, 0xfe, 0x43, 0x01, 0x00, 0xff, 0x43, - 0x01, 0x00, 0xf6, 0x45, 0x01, 0x00, 0xf7, 0x45, 0x01, 0x00, 0xf8, 0x45, - 0x01, 0x00, 0xfc, 0x45, 0x01, 0x00, 0xfe, 0x45, 0x01, 0x00, 0xff, 0x45, - 0x01, 0x00, 0xf0, 0x47, 0x01, 0x00, 0xf1, 0x47, 0x01, 0x00, 0xf9, 0x47, - 0x01, 0x00, 0xfd, 0x47, 0x01, 0x00, 0xf0, 0x49, 0x01, 0x00, 0xf1, 0x49, - 0x01, 0x00, 0xf9, 0x49, 0x01, 0x00, 0xfd, 0x49, 0x01, 0x00, 0xe6, 0x4b, - 0x01, 0x00, 0xf0, 0x4b, 0x01, 0x00, 0xf0, 0x4f, 0x01, 0x00, 0xf1, 0x4f, - 0x01, 0x00, 0xf9, 0x4f, 0x01, 0x00, 0xfd, 0x4f, 0x01, 0x00, 0xf4, 0x61, - 0x01, 0x00, 0xf5, 0x61, 0x01, 0x00, 0xf8, 0x61, 0x01, 0x00, 0xfc, 0x61, - 0x01, 0x00, 0xfe, 0x61, 0x01, 0x00, 0xff, 0x61, 0x01, 0x00, 0xf3, 0x67, - 0x01, 0x00, 0xfb, 0x67, 0x01, 0x00, 0xf3, 0x69, 0x01, 0x00, 0xfb, 0x69, - 0x01, 0x00, 0xf4, 0x6f, 0x01, 0x00, 0xf5, 0x6f, 0x01, 0x00, 0xf8, 0x6f, - 0x01, 0x00, 0xfc, 0x6f, 0x01, 0x00, 0xfe, 0x6f, 0x01, 0x00, 0xff, 0x6f, - 0x01, 0x00, 0xf3, 0x77, 0x01, 0x00, 0xfb, 0x77, 0x01, 0x00, 0xf4, 0x7f, - 0x01, 0x00, 0xf5, 0x7f, 0x01, 0x00, 0xf8, 0x7f, 0x01, 0x00, 0xfc, 0x7f, - 0x01, 0x00, 0xfe, 0x7f, 0x01, 0x00, 0xff, 0x7f, 0x01, 0x00, 0xb1, 0x84, - 0x01, 0x00, 0xb9, 0x84, 0x01, 0x00, 0xb1, 0x86, 0x01, 0x00, 0xb9, 0x86, - 0x01, 0x00, 0xf1, 0x87, 0x01, 0x00, 0xf9, 0x87, 0x01, 0x00, 0xf1, 0x8b, - 0x01, 0x00, 0xf7, 0x8b, 0x01, 0x00, 0xf9, 0x8b, 0x01, 0x00, 0xb8, 0xa4, - 0x01, 0x00, 0xbc, 0xa4, 0x01, 0x00, 0xbe, 0xa4, 0x01, 0x00, 0xbf, 0xa4, - 0x01, 0x00, 0xeb, 0xa7, 0x01, 0x00, 0xf8, 0xab, 0x01, 0x00, 0xfc, 0xab, - 0x01, 0x00, 0xfe, 0xab, 0x01, 0x00, 0xff, 0xab, 0x01, 0x00, 0xeb, 0xb3, - 0x01, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0xf1, 0xb3, 0x01, 0x00, 0xf7, 0xb3, - 0x01, 0x00, 0xf9, 0xb3, 0x01, 0x00, 0xfd, 0xb3, 0x01, 0x00, 0xb0, 0xb8, - 0x01, 0x00, 0xb1, 0xb8, 0x01, 0x00, 0xb7, 0xb8, 0x01, 0x00, 0xb9, 0xb8, - 0x01, 0x00, 0xbd, 0xb8, 0x01, 0x00, 0xeb, 0xbb, 0x01, 0x00, 0xf0, 0xbb, - 0x01, 0x00, 0xf1, 0xbb, 0x01, 0x00, 0xf7, 0xbb, 0x01, 0x00, 0xf9, 0xbb, - 0x01, 0x00, 0xfd, 0xbb, 0x01, 0x00, 0xf8, 0xbf, 0x01, 0x00, 0xfc, 0xbf, - 0x01, 0x00, 0xfe, 0xbf, 0x01, 0x00, 0xff, 0xbf, 0x01, 0x00, 0xf7, 0xc5, - 0x01, 0x00, 0xcb, 0xdd, 0x01, 0x00, 0x88, 0x0b, 0x02, 0x00, 0x8b, 0x0b, - 0x02, 0x00, 0x88, 0x17, 0x02, 0x00, 0x8b, 0x17, 0x02, 0x00, 0xc8, 0x17, - 0x02, 0x00, 0xcb, 0x17, 0x02, 0x00, 0xe8, 0x17, 0x02, 0x00, 0xeb, 0x17, - 0x02, 0x00, 0xf8, 0x17, 0x02, 0x00, 0xfc, 0x17, 0x02, 0x00, 0xfe, 0x17, - 0x02, 0x00, 0xff, 0x17, 0x02, 0x00, 0x88, 0x1b, 0x02, 0x00, 0x8b, 0x1b, - 0x02, 0x00, 0xc8, 0x1f, 0x02, 0x00, 0xcb, 0x1f, 0x02, 0x00, 0xe8, 0x1f, - 0x02, 0x00, 0xeb, 0x1f, 0x02, 0x00, 0xf8, 0x1f, 0x02, 0x00, 0xfc, 0x1f, - 0x02, 0x00, 0xfe, 0x1f, 0x02, 0x00, 0xff, 0x1f, 0x02, 0x00, 0xe8, 0x23, - 0x02, 0x00, 0xeb, 0x23, 0x02, 0x00, 0xf8, 0x23, 0x02, 0x00, 0xfc, 0x23, - 0x02, 0x00, 0xfe, 0x23, 0x02, 0x00, 0xff, 0x23, 0x02, 0x00, 0xf8, 0x29, - 0x02, 0x00, 0xfc, 0x29, 0x02, 0x00, 0xfe, 0x29, 0x02, 0x00, 0xff, 0x29, - 0x02, 0x00, 0xf8, 0x2d, 0x02, 0x00, 0xfc, 0x2d, 0x02, 0x00, 0xfe, 0x2d, - 0x02, 0x00, 0xff, 0x2d, 0x02, 0x00, 0xe9, 0x33, 0x02, 0x00, 0xea, 0x33, - 0x02, 0x00, 0xf0, 0x33, 0x02, 0x00, 0xf1, 0x33, 0x02, 0x00, 0xf9, 0x33, - 0x02, 0x00, 0xfd, 0x33, 0x02, 0x00, 0xf7, 0x35, 0x02, 0x00, 0xf8, 0x35, - 0x02, 0x00, 0xfc, 0x35, 0x02, 0x00, 0xfe, 0x35, 0x02, 0x00, 0xff, 0x35, - 0x02, 0x00, 0xf7, 0x39, 0x02, 0x00, 0xf8, 0x39, 0x02, 0x00, 0xfc, 0x39, - 0x02, 0x00, 0xfe, 0x39, 0x02, 0x00, 0xff, 0x39, 0x02, 0x00, 0xf0, 0x3d, - 0x02, 0x00, 0xf1, 0x3d, 0x02, 0x00, 0xf9, 0x3d, 0x02, 0x00, 0xfd, 0x3d, - 0x02, 0x00, 0xb0, 0x44, 0x02, 0x00, 0xb1, 0x44, 0x02, 0x00, 0xb9, 0x44, - 0x02, 0x00, 0xbd, 0x44, 0x02, 0x00, 0xf7, 0x45, 0x02, 0x00, 0xf8, 0x45, - 0x02, 0x00, 0xfc, 0x45, 0x02, 0x00, 0xfe, 0x45, 0x02, 0x00, 0xff, 0x45, - 0x02, 0x00, 0xb0, 0x46, 0x02, 0x00, 0xb1, 0x46, 0x02, 0x00, 0xb9, 0x46, - 0x02, 0x00, 0xbd, 0x46, 0x02, 0x00, 0xf0, 0x47, 0x02, 0x00, 0xf1, 0x47, - 0x02, 0x00, 0xf9, 0x47, 0x02, 0x00, 0xfd, 0x47, 0x02, 0x00, 0xc7, 0x53, - 0x02, 0x00, 0xcb, 0x53, 0x02, 0x00, 0xf7, 0x53, 0x02, 0x00, 0xf8, 0x53, - 0x02, 0x00, 0xfc, 0x53, 0x02, 0x00, 0xfe, 0x53, 0x02, 0x00, 0xff, 0x53, - 0x02, 0x00, 0xf1, 0x81, 0x02, 0x00, 0xf9, 0x81, 0x02, 0x00, 0xf7, 0x85, - 0x02, 0x00, 0xf1, 0xb3, 0x02, 0x00, 0xf7, 0xb3, 0x02, 0x00, 0xf9, 0xb3, - 0x02, 0x00, 0xb1, 0xb8, 0x02, 0x00, 0xb7, 0xb8, 0x02, 0x00, 0xb9, 0xb8, - 0x02, 0x00, 0xf1, 0xbb, 0x02, 0x00, 0xf7, 0xbb, 0x02, 0x00, 0xf9, 0xbb, - 0x02, 0x00, 0xe6, 0xc3, 0x02, 0x00, 0xe7, 0xc3, 0x02, 0x00, 0xe8, 0xc3, - 0x02, 0x00, 0xeb, 0xc3, 0x02, 0x00, 0xf6, 0xc3, 0x02, 0x00, 0xf7, 0xc3, - 0x02, 0x00, 0xf8, 0xc3, 0x02, 0x00, 0xfc, 0xc3, 0x02, 0x00, 0xfe, 0xc3, - 0x02, 0x00, 0xff, 0xc3, 0x02, 0x00, 0xb8, 0xcc, 0x02, 0x00, 0xbc, 0xcc, - 0x02, 0x00, 0xbe, 0xcc, 0x02, 0x00, 0xbf, 0xcc, 0x02, 0x00, 0xb8, 0xce, - 0x02, 0x00, 0xbc, 0xce, 0x02, 0x00, 0xbe, 0xce, 0x02, 0x00, 0xbf, 0xce, - 0x02, 0x00, 0xc9, 0xcf, 0x02, 0x00, 0xca, 0xcf, 0x02, 0x00, 0xe9, 0xcf, - 0x02, 0x00, 0xea, 0xcf, 0x02, 0x00, 0xf0, 0xcf, 0x02, 0x00, 0xf1, 0xcf, - 0x02, 0x00, 0xf9, 0xcf, 0x02, 0x00, 0xfd, 0xcf, 0x02, 0x00, 0xe8, 0xdf, - 0x02, 0x00, 0xeb, 0xdf, 0x02, 0x00, 0xf8, 0xdf, 0x02, 0x00, 0xfc, 0xdf, - 0x02, 0x00, 0xfe, 0xdf, 0x02, 0x00, 0xff, 0xdf, 0x02, 0x00, 0xf0, 0xe3, - 0x02, 0x00, 0xf1, 0xe3, 0x02, 0x00, 0xf9, 0xe3, 0x02, 0x00, 0xfd, 0xe3, - 0x02, 0x00, 0xb8, 0xec, 0x02, 0x00, 0xbc, 0xec, 0x02, 0x00, 0xbe, 0xec, - 0x02, 0x00, 0xbf, 0xec, 0x02, 0x00, 0xc9, 0xef, 0x02, 0x00, 0xca, 0xef, - 0x02, 0x00, 0xe9, 0xef, 0x02, 0x00, 0xea, 0xef, 0x02, 0x00, 0xf0, 0xef, - 0x02, 0x00, 0xf1, 0xef, 0x02, 0x00, 0xf9, 0xef, 0x02, 0x00, 0xfd, 0xef, - 0x02, 0x00, 0xe6, 0xf3, 0x02, 0x00, 0xf6, 0xf3, 0x02, 0x00, 0xf7, 0xf3, - 0x02, 0x00, 0xf8, 0xf3, 0x02, 0x00, 0xfc, 0xf3, 0x02, 0x00, 0xfe, 0xf3, - 0x02, 0x00, 0xff, 0xf3, 0x02, 0x00, 0x88, 0xff, 0x02, 0x00, 0x8b, 0xff, - 0x02, 0x00, 0xc6, 0xff, 0x02, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xc8, 0xff, - 0x02, 0x00, 0xcb, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe7, 0xff, - 0x02, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xf6, 0xff, - 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfc, 0xff, - 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x73, 0x04, - 0x03, 0x00, 0x7b, 0x04, 0x03, 0x00, 0xf4, 0x05, 0x03, 0x00, 0xf5, 0x05, - 0x03, 0x00, 0xf8, 0x05, 0x03, 0x00, 0xfc, 0x05, 0x03, 0x00, 0xfe, 0x05, - 0x03, 0x00, 0xff, 0x05, 0x03, 0x00, 0x74, 0x06, 0x03, 0x00, 0x75, 0x06, - 0x03, 0x00, 0x78, 0x06, 0x03, 0x00, 0x7c, 0x06, 0x03, 0x00, 0x7e, 0x06, - 0x03, 0x00, 0x7f, 0x06, 0x03, 0x00, 0x78, 0x07, 0x03, 0x00, 0x7c, 0x07, - 0x03, 0x00, 0x7e, 0x07, 0x03, 0x00, 0x7f, 0x07, 0x03, 0x00, 0x74, 0x0a, - 0x03, 0x00, 0x75, 0x0a, 0x03, 0x00, 0x78, 0x0a, 0x03, 0x00, 0x7c, 0x0a, - 0x03, 0x00, 0x7e, 0x0a, 0x03, 0x00, 0x7f, 0x0a, 0x03, 0x00, 0xf4, 0x0b, - 0x03, 0x00, 0xf5, 0x0b, 0x03, 0x00, 0xf8, 0x0b, 0x03, 0x00, 0xfc, 0x0b, - 0x03, 0x00, 0xfe, 0x0b, 0x03, 0x00, 0xff, 0x0b, 0x03, 0x00, 0xf3, 0x0f, - 0x03, 0x00, 0xfb, 0x0f, 0x03, 0x00, 0x73, 0x16, 0x03, 0x00, 0x7b, 0x16, - 0x03, 0x00, 0x74, 0x17, 0x03, 0x00, 0x75, 0x17, 0x03, 0x00, 0x78, 0x17, - 0x03, 0x00, 0x7c, 0x17, 0x03, 0x00, 0x7e, 0x17, 0x03, 0x00, 0x7f, 0x17, - 0x03, 0x00, 0x98, 0x17, 0x03, 0x00, 0xd8, 0x17, 0x03, 0x00, 0xf3, 0x19, - 0x03, 0x00, 0xfb, 0x19, 0x03, 0x00, 0xf4, 0x1f, 0x03, 0x00, 0xf5, 0x1f, - 0x03, 0x00, 0xf8, 0x1f, 0x03, 0x00, 0xfc, 0x1f, 0x03, 0x00, 0xfe, 0x1f, - 0x03, 0x00, 0xff, 0x1f, 0x03, 0x00, 0xd0, 0x33, 0x03, 0x00, 0xd8, 0x33, - 0x03, 0x00, 0xdc, 0x33, 0x03, 0x00, 0xde, 0x33, 0x03, 0x00, 0xdf, 0x33, - 0x03, 0x00, 0xf0, 0x33, 0x03, 0x00, 0xf1, 0x33, 0x03, 0x00, 0xf9, 0x33, - 0x03, 0x00, 0xfd, 0x33, 0x03, 0x00, 0xf0, 0x3b, 0x03, 0x00, 0xf1, 0x3b, - 0x03, 0x00, 0xf9, 0x3b, 0x03, 0x00, 0xfd, 0x3b, 0x03, 0x00, 0x90, 0x3f, - 0x03, 0x00, 0x98, 0x3f, 0x03, 0x00, 0x9c, 0x3f, 0x03, 0x00, 0x9e, 0x3f, - 0x03, 0x00, 0x9f, 0x3f, 0x03, 0x00, 0xd0, 0x3f, 0x03, 0x00, 0xd8, 0x3f, - 0x03, 0x00, 0xdc, 0x3f, 0x03, 0x00, 0xde, 0x3f, 0x03, 0x00, 0xdf, 0x3f, - 0x03, 0x00, 0x70, 0x44, 0x03, 0x00, 0x71, 0x44, 0x03, 0x00, 0x79, 0x44, - 0x03, 0x00, 0x7d, 0x44, 0x03, 0x00, 0xf7, 0x45, 0x03, 0x00, 0xf8, 0x45, - 0x03, 0x00, 0xfc, 0x45, 0x03, 0x00, 0xfe, 0x45, 0x03, 0x00, 0xff, 0x45, - 0x03, 0x00, 0x70, 0x46, 0x03, 0x00, 0x71, 0x46, 0x03, 0x00, 0x79, 0x46, - 0x03, 0x00, 0x7d, 0x46, 0x03, 0x00, 0x6b, 0x49, 0x03, 0x00, 0xf0, 0x4b, - 0x03, 0x00, 0x6b, 0x4d, 0x03, 0x00, 0x8b, 0x4f, 0x03, 0x00, 0xcb, 0x4f, - 0x03, 0x00, 0xeb, 0x4f, 0x03, 0x00, 0xf0, 0x4f, 0x03, 0x00, 0xf1, 0x4f, - 0x03, 0x00, 0xf7, 0x4f, 0x03, 0x00, 0xf9, 0x4f, 0x03, 0x00, 0xfd, 0x4f, - 0x03, 0x00, 0xf0, 0x51, 0x03, 0x00, 0xf1, 0x51, 0x03, 0x00, 0xf9, 0x51, - 0x03, 0x00, 0xfd, 0x51, 0x03, 0x00, 0xb0, 0x54, 0x03, 0x00, 0x6b, 0x55, - 0x03, 0x00, 0x78, 0x55, 0x03, 0x00, 0x7c, 0x55, 0x03, 0x00, 0x7e, 0x55, - 0x03, 0x00, 0x7f, 0x55, 0x03, 0x00, 0xcb, 0x57, 0x03, 0x00, 0xeb, 0x57, - 0x03, 0x00, 0xf8, 0x57, 0x03, 0x00, 0xfc, 0x57, 0x03, 0x00, 0xfe, 0x57, - 0x03, 0x00, 0xff, 0x57, 0x03, 0x00, 0xb0, 0x58, 0x03, 0x00, 0xf7, 0x59, - 0x03, 0x00, 0xf8, 0x59, 0x03, 0x00, 0xfc, 0x59, 0x03, 0x00, 0xfe, 0x59, - 0x03, 0x00, 0xff, 0x59, 0x03, 0x00, 0xb0, 0x5a, 0x03, 0x00, 0xf7, 0x5d, - 0x03, 0x00, 0xf8, 0x5d, 0x03, 0x00, 0xfc, 0x5d, 0x03, 0x00, 0xfe, 0x5d, - 0x03, 0x00, 0xff, 0x5d, 0x03, 0x00, 0xf7, 0x5f, 0x03, 0x00, 0xf8, 0x5f, - 0x03, 0x00, 0xfc, 0x5f, 0x03, 0x00, 0xfe, 0x5f, 0x03, 0x00, 0xff, 0x5f, - 0x03, 0x00, 0xfb, 0x65, 0x03, 0x00, 0x0b, 0x67, 0x03, 0x00, 0xfb, 0x75, - 0x03, 0x00, 0x0b, 0x7b, 0x03, 0x00, 0xfb, 0x7d, 0x03, 0x00, 0xf0, 0x87, - 0x03, 0x00, 0xf1, 0x87, 0x03, 0x00, 0xf3, 0x87, 0x03, 0x00, 0xf9, 0x87, - 0x03, 0x00, 0xfb, 0x87, 0x03, 0x00, 0xfd, 0x87, 0x03, 0x00, 0x11, 0x8b, - 0x03, 0x00, 0x16, 0x8b, 0x03, 0x00, 0x17, 0x8b, 0x03, 0x00, 0x19, 0x8b, - 0x03, 0x00, 0x1d, 0x8b, 0x03, 0x00, 0x76, 0x8b, 0x03, 0x00, 0x77, 0x8b, - 0x03, 0x00, 0x78, 0x8b, 0x03, 0x00, 0x7c, 0x8b, 0x03, 0x00, 0x7e, 0x8b, - 0x03, 0x00, 0x7f, 0x8b, 0x03, 0x00, 0xf8, 0xa7, 0x03, 0x00, 0xfc, 0xa7, - 0x03, 0x00, 0xfe, 0xa7, 0x03, 0x00, 0xff, 0xa7, 0x03, 0x00, 0xd0, 0xb3, - 0x03, 0x00, 0xd8, 0xb3, 0x03, 0x00, 0xdc, 0xb3, 0x03, 0x00, 0xde, 0xb3, - 0x03, 0x00, 0xdf, 0xb3, 0x03, 0x00, 0xf0, 0xb3, 0x03, 0x00, 0xf1, 0xb3, - 0x03, 0x00, 0xf9, 0xb3, 0x03, 0x00, 0xfd, 0xb3, 0x03, 0x00, 0x77, 0xb8, - 0x03, 0x00, 0x78, 0xb8, 0x03, 0x00, 0x7c, 0xb8, 0x03, 0x00, 0x7e, 0xb8, - 0x03, 0x00, 0x7f, 0xb8, 0x03, 0x00, 0x90, 0xbb, 0x03, 0x00, 0x98, 0xbb, - 0x03, 0x00, 0x9c, 0xbb, 0x03, 0x00, 0x9e, 0xbb, 0x03, 0x00, 0x9f, 0xbb, - 0x03, 0x00, 0x90, 0xbf, 0x03, 0x00, 0x98, 0xbf, 0x03, 0x00, 0x9c, 0xbf, - 0x03, 0x00, 0x9e, 0xbf, 0x03, 0x00, 0x9f, 0xbf, 0x03, 0x00, 0xd0, 0xbf, - 0x03, 0x00, 0xd8, 0xbf, 0x03, 0x00, 0xdc, 0xbf, 0x03, 0x00, 0xde, 0xbf, - 0x03, 0x00, 0xdf, 0xbf, 0x03, 0x00, 0xf3, 0xd3, 0x03, 0x00, 0xfb, 0xd3, - 0x03, 0x00, 0xf4, 0xdb, 0x03, 0x00, 0xf5, 0xdb, 0x03, 0x00, 0xf8, 0xdb, - 0x03, 0x00, 0xfc, 0xdb, 0x03, 0x00, 0xfe, 0xdb, 0x03, 0x00, 0xff, 0xdb, - 0x03, 0x00, 0x0b, 0xe5, 0x03, 0x00, 0x08, 0xf3, 0x03, 0x00, 0x0b, 0xf3, - 0x03, 0x00, 0x0b, 0xf9, 0x03, 0x00, 0x0b, 0xfd, 0x03, 0x00, 0x74, 0xfe, - 0x03, 0x00, 0x75, 0xfe, 0x03, 0x00, 0x78, 0xfe, 0x03, 0x00, 0x7c, 0xfe, - 0x03, 0x00, 0x7e, 0xfe, 0x03, 0x00, 0x7f, 0xfe, 0x03, 0x00, 0x08, 0xff, - 0x03, 0x00, 0x0b, 0xff, 0x03, 0x00, 0x78, 0xff, 0x03, 0x00, 0x7c, 0xff, - 0x03, 0x00, 0x7e, 0xff, 0x03, 0x00, 0x7f, 0xff, 0x03, 0x00, 0xf8, 0x05, - 0x04, 0x00, 0xfc, 0x05, 0x04, 0x00, 0xfe, 0x05, 0x04, 0x00, 0xff, 0x05, - 0x04, 0x00, 0x78, 0x06, 0x04, 0x00, 0x7c, 0x06, 0x04, 0x00, 0x7e, 0x06, - 0x04, 0x00, 0x7f, 0x06, 0x04, 0x00, 0x8b, 0x07, 0x04, 0x00, 0xcb, 0x07, - 0x04, 0x00, 0xeb, 0x07, 0x04, 0x00, 0xf8, 0x07, 0x04, 0x00, 0xfc, 0x07, - 0x04, 0x00, 0xfe, 0x07, 0x04, 0x00, 0xff, 0x07, 0x04, 0x00, 0x78, 0x0a, - 0x04, 0x00, 0x7c, 0x0a, 0x04, 0x00, 0x7e, 0x0a, 0x04, 0x00, 0x7f, 0x0a, - 0x04, 0x00, 0xeb, 0x13, 0x04, 0x00, 0x78, 0x16, 0x04, 0x00, 0x7c, 0x16, - 0x04, 0x00, 0x7e, 0x16, 0x04, 0x00, 0x7f, 0x16, 0x04, 0x00, 0x78, 0x17, - 0x04, 0x00, 0x7c, 0x17, 0x04, 0x00, 0x7e, 0x17, 0x04, 0x00, 0x7f, 0x17, - 0x04, 0x00, 0xf8, 0x17, 0x04, 0x00, 0xfc, 0x17, 0x04, 0x00, 0xfe, 0x17, - 0x04, 0x00, 0xff, 0x17, 0x04, 0x00, 0x78, 0x1a, 0x04, 0x00, 0x7c, 0x1a, - 0x04, 0x00, 0x7e, 0x1a, 0x04, 0x00, 0x7f, 0x1a, 0x04, 0x00, 0xb8, 0x24, - 0x04, 0x00, 0xbc, 0x24, 0x04, 0x00, 0xbe, 0x24, 0x04, 0x00, 0xbf, 0x24, - 0x04, 0x00, 0xf8, 0x29, 0x04, 0x00, 0xfc, 0x29, 0x04, 0x00, 0xfe, 0x29, - 0x04, 0x00, 0xff, 0x29, 0x04, 0x00, 0xf8, 0x2b, 0x04, 0x00, 0xfc, 0x2b, - 0x04, 0x00, 0xfe, 0x2b, 0x04, 0x00, 0xff, 0x2b, 0x04, 0x00, 0xf8, 0x2d, - 0x04, 0x00, 0xfc, 0x2d, 0x04, 0x00, 0xfe, 0x2d, 0x04, 0x00, 0xff, 0x2d, - 0x04, 0x00, 0xb8, 0x30, 0x04, 0x00, 0xbc, 0x30, 0x04, 0x00, 0xbe, 0x30, - 0x04, 0x00, 0xbf, 0x30, 0x04, 0x00, 0xeb, 0x33, 0x04, 0x00, 0xf0, 0x33, - 0x04, 0x00, 0xf1, 0x33, 0x04, 0x00, 0xf7, 0x33, 0x04, 0x00, 0xf9, 0x33, - 0x04, 0x00, 0xfd, 0x33, 0x04, 0x00, 0xb0, 0x34, 0x04, 0x00, 0xb1, 0x34, - 0x04, 0x00, 0xb7, 0x34, 0x04, 0x00, 0xb9, 0x34, 0x04, 0x00, 0xbd, 0x34, - 0x04, 0x00, 0xb0, 0x38, 0x04, 0x00, 0xb1, 0x38, 0x04, 0x00, 0xb7, 0x38, - 0x04, 0x00, 0xb9, 0x38, 0x04, 0x00, 0xbd, 0x38, 0x04, 0x00, 0xeb, 0x3b, - 0x04, 0x00, 0xf0, 0x3b, 0x04, 0x00, 0xf1, 0x3b, 0x04, 0x00, 0xf7, 0x3b, - 0x04, 0x00, 0xf9, 0x3b, 0x04, 0x00, 0xfd, 0x3b, 0x04, 0x00, 0xb0, 0x44, - 0x04, 0x00, 0xb1, 0x44, 0x04, 0x00, 0xb9, 0x44, 0x04, 0x00, 0xbd, 0x44, - 0x04, 0x00, 0xb0, 0x46, 0x04, 0x00, 0xb1, 0x46, 0x04, 0x00, 0xb9, 0x46, - 0x04, 0x00, 0xbd, 0x46, 0x04, 0x00, 0xeb, 0x4b, 0x04, 0x00, 0xf8, 0x4b, - 0x04, 0x00, 0xfc, 0x4b, 0x04, 0x00, 0xfe, 0x4b, 0x04, 0x00, 0xff, 0x4b, - 0x04, 0x00, 0x78, 0x52, 0x04, 0x00, 0x7c, 0x52, 0x04, 0x00, 0x7e, 0x52, - 0x04, 0x00, 0x7f, 0x52, 0x04, 0x00, 0x8b, 0x53, 0x04, 0x00, 0x78, 0x5c, - 0x04, 0x00, 0x7c, 0x5c, 0x04, 0x00, 0x7e, 0x5c, 0x04, 0x00, 0x7f, 0x5c, - 0x04, 0x00, 0xf0, 0x5f, 0x04, 0x00, 0xf1, 0x5f, 0x04, 0x00, 0xf9, 0x5f, - 0x04, 0x00, 0xfd, 0x5f, 0x04, 0x00, 0x0b, 0x67, 0x04, 0x00, 0x78, 0x6b, - 0x04, 0x00, 0x7c, 0x6b, 0x04, 0x00, 0x7e, 0x6b, 0x04, 0x00, 0x7f, 0x6b, - 0x04, 0x00, 0xf7, 0x81, 0x04, 0x00, 0x78, 0x85, 0x04, 0x00, 0x7c, 0x85, - 0x04, 0x00, 0x7e, 0x85, 0x04, 0x00, 0x7f, 0x85, 0x04, 0x00, 0xf7, 0x87, - 0x04, 0x00, 0x0b, 0x8b, 0x04, 0x00, 0xf1, 0x8b, 0x04, 0x00, 0xf7, 0x8b, - 0x04, 0x00, 0xf9, 0x8b, 0x04, 0x00, 0xbb, 0x8e, 0x04, 0x00, 0x78, 0xa7, - 0x04, 0x00, 0x7c, 0xa7, 0x04, 0x00, 0x7e, 0xa7, 0x04, 0x00, 0x7f, 0xa7, - 0x04, 0x00, 0xf1, 0xb3, 0x04, 0x00, 0xf7, 0xb3, 0x04, 0x00, 0xf9, 0xb3, - 0x04, 0x00, 0x78, 0xbb, 0x04, 0x00, 0x7c, 0xbb, 0x04, 0x00, 0x7e, 0xbb, - 0x04, 0x00, 0x7f, 0xbb, 0x04, 0x00, 0xf1, 0xbf, 0x04, 0x00, 0xf7, 0xbf, - 0x04, 0x00, 0xf9, 0xbf, 0x04, 0x00, 0xb0, 0xc0, 0x04, 0x00, 0x78, 0xc2, - 0x04, 0x00, 0x7c, 0xc2, 0x04, 0x00, 0x7e, 0xc2, 0x04, 0x00, 0x7f, 0xc2, - 0x04, 0x00, 0x78, 0xc3, 0x04, 0x00, 0x7c, 0xc3, 0x04, 0x00, 0x7e, 0xc3, - 0x04, 0x00, 0x7f, 0xc3, 0x04, 0x00, 0xb0, 0xc6, 0x04, 0x00, 0xb0, 0xc8, - 0x04, 0x00, 0x18, 0xcf, 0x04, 0x00, 0x1c, 0xcf, 0x04, 0x00, 0x1e, 0xcf, - 0x04, 0x00, 0x1f, 0xcf, 0x04, 0x00, 0x91, 0xcf, 0x04, 0x00, 0x96, 0xcf, - 0x04, 0x00, 0x97, 0xcf, 0x04, 0x00, 0x98, 0xcf, 0x04, 0x00, 0x9c, 0xcf, - 0x04, 0x00, 0x9e, 0xcf, 0x04, 0x00, 0x9f, 0xcf, 0x04, 0x00, 0xd1, 0xcf, - 0x04, 0x00, 0xd6, 0xcf, 0x04, 0x00, 0xd7, 0xcf, 0x04, 0x00, 0xd8, 0xcf, - 0x04, 0x00, 0xdc, 0xcf, 0x04, 0x00, 0xde, 0xcf, 0x04, 0x00, 0xdf, 0xcf, - 0x04, 0x00, 0x88, 0xd7, 0x04, 0x00, 0x8b, 0xd7, 0x04, 0x00, 0xb0, 0xe0, - 0x04, 0x00, 0xb0, 0xe8, 0x04, 0x00, 0xb0, 0xf0, 0x04, 0x00, 0x88, 0xf3, - 0x04, 0x00, 0x8b, 0xf3, 0x04, 0x00, 0x90, 0xf3, 0x04, 0x00, 0xb0, 0xf4, - 0x04, 0x00, 0xb0, 0xf6, 0x04, 0x00, 0x78, 0xfe, 0x04, 0x00, 0x7c, 0xfe, - 0x04, 0x00, 0x7e, 0xfe, 0x04, 0x00, 0x7f, 0xfe, 0x04, 0x00, 0x90, 0xff, - 0x04, 0x00, 0x99, 0xff, 0x04, 0x00, 0x9d, 0xff, 0x04, 0x00, 0xd0, 0xff, - 0x04, 0x00, 0xd9, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x04, 0x00, 0x73, 0x01, - 0x05, 0x00, 0x7b, 0x01, 0x05, 0x00, 0xd8, 0x03, 0x05, 0x00, 0xf3, 0x03, - 0x05, 0x00, 0xfb, 0x03, 0x05, 0x00, 0x73, 0x04, 0x05, 0x00, 0x7b, 0x04, - 0x05, 0x00, 0xf4, 0x05, 0x05, 0x00, 0xf5, 0x05, 0x05, 0x00, 0xf8, 0x05, - 0x05, 0x00, 0xfc, 0x05, 0x05, 0x00, 0xfe, 0x05, 0x05, 0x00, 0xff, 0x05, - 0x05, 0x00, 0x74, 0x06, 0x05, 0x00, 0x75, 0x06, 0x05, 0x00, 0x78, 0x06, - 0x05, 0x00, 0x7c, 0x06, 0x05, 0x00, 0x7e, 0x06, 0x05, 0x00, 0x7f, 0x06, - 0x05, 0x00, 0x78, 0x07, 0x05, 0x00, 0x7c, 0x07, 0x05, 0x00, 0x7e, 0x07, - 0x05, 0x00, 0x7f, 0x07, 0x05, 0x00, 0xf4, 0x07, 0x05, 0x00, 0xf5, 0x07, - 0x05, 0x00, 0xf8, 0x07, 0x05, 0x00, 0xfc, 0x07, 0x05, 0x00, 0xfe, 0x07, - 0x05, 0x00, 0xff, 0x07, 0x05, 0x00, 0x74, 0x0a, 0x05, 0x00, 0x75, 0x0a, - 0x05, 0x00, 0x78, 0x0a, 0x05, 0x00, 0x7c, 0x0a, 0x05, 0x00, 0x7e, 0x0a, - 0x05, 0x00, 0x7f, 0x0a, 0x05, 0x00, 0x98, 0x0f, 0x05, 0x00, 0xd8, 0x0f, - 0x05, 0x00, 0x18, 0x11, 0x05, 0x00, 0x74, 0x11, 0x05, 0x00, 0x75, 0x11, - 0x05, 0x00, 0x78, 0x11, 0x05, 0x00, 0x7c, 0x11, 0x05, 0x00, 0x7e, 0x11, - 0x05, 0x00, 0x7f, 0x11, 0x05, 0x00, 0x73, 0x16, 0x05, 0x00, 0x7b, 0x16, - 0x05, 0x00, 0x74, 0x17, 0x05, 0x00, 0x75, 0x17, 0x05, 0x00, 0x78, 0x17, - 0x05, 0x00, 0x7c, 0x17, 0x05, 0x00, 0x7e, 0x17, 0x05, 0x00, 0x7f, 0x17, - 0x05, 0x00, 0xf3, 0x17, 0x05, 0x00, 0xfb, 0x17, 0x05, 0x00, 0xf3, 0x19, - 0x05, 0x00, 0xfb, 0x19, 0x05, 0x00, 0xf8, 0x27, 0x05, 0x00, 0xfc, 0x27, - 0x05, 0x00, 0xfe, 0x27, 0x05, 0x00, 0xff, 0x27, 0x05, 0x00, 0x88, 0x33, - 0x05, 0x00, 0x8b, 0x33, 0x05, 0x00, 0x90, 0x33, 0x05, 0x00, 0x98, 0x33, - 0x05, 0x00, 0x9c, 0x33, 0x05, 0x00, 0x9e, 0x33, 0x05, 0x00, 0x9f, 0x33, - 0x05, 0x00, 0x88, 0x3f, 0x05, 0x00, 0x8b, 0x3f, 0x05, 0x00, 0xf0, 0x3f, - 0x05, 0x00, 0xf1, 0x3f, 0x05, 0x00, 0xf9, 0x3f, 0x05, 0x00, 0xfd, 0x3f, - 0x05, 0x00, 0x78, 0x43, 0x05, 0x00, 0x7c, 0x43, 0x05, 0x00, 0x7e, 0x43, - 0x05, 0x00, 0x7f, 0x43, 0x05, 0x00, 0x70, 0x44, 0x05, 0x00, 0x71, 0x44, - 0x05, 0x00, 0x79, 0x44, 0x05, 0x00, 0x7d, 0x44, 0x05, 0x00, 0xf6, 0x45, - 0x05, 0x00, 0xf7, 0x45, 0x05, 0x00, 0xf8, 0x45, 0x05, 0x00, 0xfc, 0x45, - 0x05, 0x00, 0xfe, 0x45, 0x05, 0x00, 0xff, 0x45, 0x05, 0x00, 0x76, 0x46, - 0x05, 0x00, 0x77, 0x46, 0x05, 0x00, 0x78, 0x46, 0x05, 0x00, 0x7c, 0x46, - 0x05, 0x00, 0x7e, 0x46, 0x05, 0x00, 0x7f, 0x46, 0x05, 0x00, 0xf0, 0x49, - 0x05, 0x00, 0xf1, 0x49, 0x05, 0x00, 0xf9, 0x49, 0x05, 0x00, 0xfd, 0x49, - 0x05, 0x00, 0xd0, 0x4b, 0x05, 0x00, 0xe6, 0x4b, 0x05, 0x00, 0xf0, 0x4b, - 0x05, 0x00, 0xf0, 0x4f, 0x05, 0x00, 0xf1, 0x4f, 0x05, 0x00, 0xf9, 0x4f, - 0x05, 0x00, 0xfd, 0x4f, 0x05, 0x00, 0xb0, 0x50, 0x05, 0x00, 0xf0, 0x51, - 0x05, 0x00, 0xf1, 0x51, 0x05, 0x00, 0xf9, 0x51, 0x05, 0x00, 0xfd, 0x51, - 0x05, 0x00, 0xb0, 0x54, 0x05, 0x00, 0x78, 0x55, 0x05, 0x00, 0x7c, 0x55, - 0x05, 0x00, 0x7e, 0x55, 0x05, 0x00, 0x7f, 0x55, 0x05, 0x00, 0xf7, 0x55, - 0x05, 0x00, 0xf8, 0x55, 0x05, 0x00, 0xfc, 0x55, 0x05, 0x00, 0xfe, 0x55, - 0x05, 0x00, 0xff, 0x55, 0x05, 0x00, 0xb0, 0x56, 0x05, 0x00, 0x86, 0x57, - 0x05, 0x00, 0xc6, 0x57, 0x05, 0x00, 0xe6, 0x57, 0x05, 0x00, 0xf6, 0x57, - 0x05, 0x00, 0xf7, 0x57, 0x05, 0x00, 0xf8, 0x57, 0x05, 0x00, 0xfc, 0x57, - 0x05, 0x00, 0xfe, 0x57, 0x05, 0x00, 0xff, 0x57, 0x05, 0x00, 0xf6, 0x59, - 0x05, 0x00, 0xf7, 0x59, 0x05, 0x00, 0xf8, 0x59, 0x05, 0x00, 0xfc, 0x59, - 0x05, 0x00, 0xfe, 0x59, 0x05, 0x00, 0xff, 0x59, 0x05, 0x00, 0xb0, 0x5a, - 0x05, 0x00, 0xf6, 0x5d, 0x05, 0x00, 0xf7, 0x5d, 0x05, 0x00, 0xf8, 0x5d, - 0x05, 0x00, 0xfc, 0x5d, 0x05, 0x00, 0xfe, 0x5d, 0x05, 0x00, 0xff, 0x5d, - 0x05, 0x00, 0xf0, 0x5f, 0x05, 0x00, 0xf1, 0x5f, 0x05, 0x00, 0xf9, 0x5f, - 0x05, 0x00, 0xfd, 0x5f, 0x05, 0x00, 0x73, 0x66, 0x05, 0x00, 0x7b, 0x66, - 0x05, 0x00, 0x18, 0x67, 0x05, 0x00, 0x1c, 0x67, 0x05, 0x00, 0x1e, 0x67, - 0x05, 0x00, 0x1f, 0x67, 0x05, 0x00, 0x98, 0x67, 0x05, 0x00, 0xd8, 0x67, - 0x05, 0x00, 0xf3, 0x69, 0x05, 0x00, 0xfb, 0x69, 0x05, 0x00, 0xf4, 0x6f, - 0x05, 0x00, 0xf5, 0x6f, 0x05, 0x00, 0xf8, 0x6f, 0x05, 0x00, 0xfc, 0x6f, - 0x05, 0x00, 0xfe, 0x6f, 0x05, 0x00, 0xff, 0x6f, 0x05, 0x00, 0x73, 0x76, - 0x05, 0x00, 0x7b, 0x76, 0x05, 0x00, 0x74, 0x77, 0x05, 0x00, 0x75, 0x77, - 0x05, 0x00, 0x78, 0x77, 0x05, 0x00, 0x7c, 0x77, 0x05, 0x00, 0x7e, 0x77, - 0x05, 0x00, 0x7f, 0x77, 0x05, 0x00, 0x98, 0x77, 0x05, 0x00, 0xd8, 0x77, - 0x05, 0x00, 0xf4, 0x7f, 0x05, 0x00, 0xf5, 0x7f, 0x05, 0x00, 0xf8, 0x7f, - 0x05, 0x00, 0xfc, 0x7f, 0x05, 0x00, 0xfe, 0x7f, 0x05, 0x00, 0xff, 0x7f, - 0x05, 0x00, 0xb1, 0x84, 0x05, 0x00, 0xb9, 0x84, 0x05, 0x00, 0x6b, 0x85, - 0x05, 0x00, 0x78, 0x85, 0x05, 0x00, 0x7c, 0x85, 0x05, 0x00, 0x7e, 0x85, - 0x05, 0x00, 0x7f, 0x85, 0x05, 0x00, 0xb1, 0x86, 0x05, 0x00, 0xb9, 0x86, - 0x05, 0x00, 0x0b, 0x87, 0x05, 0x00, 0x78, 0x8b, 0x05, 0x00, 0x7c, 0x8b, - 0x05, 0x00, 0x7e, 0x8b, 0x05, 0x00, 0x7f, 0x8b, 0x05, 0x00, 0xf1, 0x8b, - 0x05, 0x00, 0xf7, 0x8b, 0x05, 0x00, 0xf9, 0x8b, 0x05, 0x00, 0xb8, 0xa4, - 0x05, 0x00, 0xbc, 0xa4, 0x05, 0x00, 0xbe, 0xa4, 0x05, 0x00, 0xbf, 0xa4, - 0x05, 0x00, 0xf8, 0xab, 0x05, 0x00, 0xfc, 0xab, 0x05, 0x00, 0xfe, 0xab, - 0x05, 0x00, 0xff, 0xab, 0x05, 0x00, 0x8b, 0xb3, 0x05, 0x00, 0xb0, 0xb8, - 0x05, 0x00, 0xb1, 0xb8, 0x05, 0x00, 0xb7, 0xb8, 0x05, 0x00, 0xb9, 0xb8, - 0x05, 0x00, 0xbd, 0xb8, 0x05, 0x00, 0xeb, 0xbb, 0x05, 0x00, 0xf0, 0xbb, - 0x05, 0x00, 0xf1, 0xbb, 0x05, 0x00, 0xf7, 0xbb, 0x05, 0x00, 0xf9, 0xbb, - 0x05, 0x00, 0xfd, 0xbb, 0x05, 0x00, 0x78, 0xbe, 0x05, 0x00, 0x7c, 0xbe, - 0x05, 0x00, 0x7e, 0xbe, 0x05, 0x00, 0x7f, 0xbe, 0x05, 0x00, 0xf8, 0xbf, - 0x05, 0x00, 0xfc, 0xbf, 0x05, 0x00, 0xfe, 0xbf, 0x05, 0x00, 0xff, 0xbf, - 0x05, 0x00, 0x6b, 0xc5, 0x05, 0x00, 0x78, 0xc5, 0x05, 0x00, 0x7c, 0xc5, - 0x05, 0x00, 0x7e, 0xc5, 0x05, 0x00, 0x7f, 0xc5, 0x05, 0x00, 0xf1, 0xc7, - 0x05, 0x00, 0xf9, 0xc7, 0x05, 0x00, 0x6b, 0xe5, 0x05, 0x00, 0x78, 0xe5, - 0x05, 0x00, 0x7c, 0xe5, 0x05, 0x00, 0x7e, 0xe5, 0x05, 0x00, 0x7f, 0xe5, - 0x05, 0x00, 0x78, 0xf9, 0x05, 0x00, 0x7c, 0xf9, 0x05, 0x00, 0x7e, 0xf9, - 0x05, 0x00, 0x7f, 0xf9, 0x05, 0x00, 0x6b, 0xfd, 0x05, 0x00, 0x78, 0xfd, - 0x05, 0x00, 0x7c, 0xfd, 0x05, 0x00, 0x7e, 0xfd, 0x05, 0x00, 0x7f, 0xfd, - 0x05, 0x00, 0x78, 0xff, 0x05, 0x00, 0x7c, 0xff, 0x05, 0x00, 0x7e, 0xff, - 0x05, 0x00, 0x7f, 0xff, 0x05, 0x00, 0xb8, 0x01, 0x06, 0x00, 0xbc, 0x01, - 0x06, 0x00, 0xbe, 0x01, 0x06, 0x00, 0xbf, 0x01, 0x06, 0x00, 0xe8, 0x02, - 0x06, 0x00, 0xeb, 0x02, 0x06, 0x00, 0xf8, 0x02, 0x06, 0x00, 0xfc, 0x02, - 0x06, 0x00, 0xfe, 0x02, 0x06, 0x00, 0xff, 0x02, 0x06, 0x00, 0xb8, 0x04, - 0x06, 0x00, 0xbc, 0x04, 0x06, 0x00, 0xbe, 0x04, 0x06, 0x00, 0xbf, 0x04, - 0x06, 0x00, 0x38, 0x07, 0x06, 0x00, 0x3c, 0x07, 0x06, 0x00, 0x3e, 0x07, - 0x06, 0x00, 0x3f, 0x07, 0x06, 0x00, 0xb8, 0x07, 0x06, 0x00, 0xbc, 0x07, - 0x06, 0x00, 0xbe, 0x07, 0x06, 0x00, 0xbf, 0x07, 0x06, 0x00, 0x38, 0x08, - 0x06, 0x00, 0x3c, 0x08, 0x06, 0x00, 0x3e, 0x08, 0x06, 0x00, 0x3f, 0x08, - 0x06, 0x00, 0x48, 0x0a, 0x06, 0x00, 0x4b, 0x0a, 0x06, 0x00, 0xb8, 0x0a, - 0x06, 0x00, 0xbc, 0x0a, 0x06, 0x00, 0xbe, 0x0a, 0x06, 0x00, 0xbf, 0x0a, - 0x06, 0x00, 0xe8, 0x0b, 0x06, 0x00, 0xeb, 0x0b, 0x06, 0x00, 0xf8, 0x0b, - 0x06, 0x00, 0xfc, 0x0b, 0x06, 0x00, 0xfe, 0x0b, 0x06, 0x00, 0xff, 0x0b, - 0x06, 0x00, 0xcb, 0x0d, 0x06, 0x00, 0xf8, 0x0d, 0x06, 0x00, 0xfc, 0x0d, - 0x06, 0x00, 0xfe, 0x0d, 0x06, 0x00, 0xff, 0x0d, 0x06, 0x00, 0xf8, 0x10, - 0x06, 0x00, 0xfc, 0x10, 0x06, 0x00, 0xfe, 0x10, 0x06, 0x00, 0xff, 0x10, - 0x06, 0x00, 0xf8, 0x13, 0x06, 0x00, 0xfc, 0x13, 0x06, 0x00, 0xfe, 0x13, - 0x06, 0x00, 0xff, 0x13, 0x06, 0x00, 0xe8, 0x14, 0x06, 0x00, 0xeb, 0x14, - 0x06, 0x00, 0xf8, 0x14, 0x06, 0x00, 0xfc, 0x14, 0x06, 0x00, 0xfe, 0x14, - 0x06, 0x00, 0xff, 0x14, 0x06, 0x00, 0xeb, 0x16, 0x06, 0x00, 0xf8, 0x16, - 0x06, 0x00, 0xfc, 0x16, 0x06, 0x00, 0xfe, 0x16, 0x06, 0x00, 0xff, 0x16, - 0x06, 0x00, 0x38, 0x19, 0x06, 0x00, 0x3c, 0x19, 0x06, 0x00, 0x3e, 0x19, - 0x06, 0x00, 0x3f, 0x19, 0x06, 0x00, 0xe8, 0x1b, 0x06, 0x00, 0xeb, 0x1b, - 0x06, 0x00, 0xc8, 0x1f, 0x06, 0x00, 0xcb, 0x1f, 0x06, 0x00, 0xe8, 0x1f, - 0x06, 0x00, 0xeb, 0x1f, 0x06, 0x00, 0xf8, 0x1f, 0x06, 0x00, 0xfc, 0x1f, - 0x06, 0x00, 0xfe, 0x1f, 0x06, 0x00, 0xff, 0x1f, 0x06, 0x00, 0x38, 0x22, - 0x06, 0x00, 0x3c, 0x22, 0x06, 0x00, 0x3e, 0x22, 0x06, 0x00, 0x3f, 0x22, - 0x06, 0x00, 0xe8, 0x23, 0x06, 0x00, 0xeb, 0x23, 0x06, 0x00, 0xf8, 0x23, - 0x06, 0x00, 0xfc, 0x23, 0x06, 0x00, 0xfe, 0x23, 0x06, 0x00, 0xff, 0x23, - 0x06, 0x00, 0x58, 0x29, 0x06, 0x00, 0x5c, 0x29, 0x06, 0x00, 0x5e, 0x29, - 0x06, 0x00, 0x5f, 0x29, 0x06, 0x00, 0x58, 0x2d, 0x06, 0x00, 0x5c, 0x2d, - 0x06, 0x00, 0x5e, 0x2d, 0x06, 0x00, 0x5f, 0x2d, 0x06, 0x00, 0x30, 0x35, - 0x06, 0x00, 0x31, 0x35, 0x06, 0x00, 0x39, 0x35, 0x06, 0x00, 0x3d, 0x35, - 0x06, 0x00, 0x50, 0x35, 0x06, 0x00, 0x51, 0x35, 0x06, 0x00, 0x56, 0x35, - 0x06, 0x00, 0x57, 0x35, 0x06, 0x00, 0x59, 0x35, 0x06, 0x00, 0x5d, 0x35, - 0x06, 0x00, 0xc7, 0x39, 0x06, 0x00, 0xcb, 0x39, 0x06, 0x00, 0xf7, 0x39, - 0x06, 0x00, 0xf8, 0x39, 0x06, 0x00, 0xfc, 0x39, 0x06, 0x00, 0xfe, 0x39, - 0x06, 0x00, 0xff, 0x39, 0x06, 0x00, 0xb8, 0x3d, 0x06, 0x00, 0xbc, 0x3d, - 0x06, 0x00, 0xbe, 0x3d, 0x06, 0x00, 0xbf, 0x3d, 0x06, 0x00, 0xf0, 0x3d, - 0x06, 0x00, 0xf1, 0x3d, 0x06, 0x00, 0xf9, 0x3d, 0x06, 0x00, 0xfd, 0x3d, - 0x06, 0x00, 0x88, 0x3f, 0x06, 0x00, 0x8b, 0x3f, 0x06, 0x00, 0xb0, 0x40, - 0x06, 0x00, 0xb1, 0x40, 0x06, 0x00, 0xb9, 0x40, 0x06, 0x00, 0xbd, 0x40, - 0x06, 0x00, 0xb0, 0x44, 0x06, 0x00, 0xb1, 0x44, 0x06, 0x00, 0xb9, 0x44, - 0x06, 0x00, 0xbd, 0x44, 0x06, 0x00, 0x47, 0x46, 0x06, 0x00, 0x4b, 0x46, - 0x06, 0x00, 0xb0, 0x46, 0x06, 0x00, 0xb1, 0x46, 0x06, 0x00, 0xb9, 0x46, - 0x06, 0x00, 0xbd, 0x46, 0x06, 0x00, 0xb8, 0x4c, 0x06, 0x00, 0xbc, 0x4c, - 0x06, 0x00, 0xbe, 0x4c, 0x06, 0x00, 0xbf, 0x4c, 0x06, 0x00, 0x30, 0x53, - 0x06, 0x00, 0x31, 0x53, 0x06, 0x00, 0x39, 0x53, 0x06, 0x00, 0x3d, 0x53, - 0x06, 0x00, 0xc7, 0x53, 0x06, 0x00, 0xcb, 0x53, 0x06, 0x00, 0xf7, 0x53, - 0x06, 0x00, 0xf8, 0x53, 0x06, 0x00, 0xfc, 0x53, 0x06, 0x00, 0xfe, 0x53, - 0x06, 0x00, 0xff, 0x53, 0x06, 0x00, 0x37, 0x59, 0x06, 0x00, 0x38, 0x59, - 0x06, 0x00, 0x3c, 0x59, 0x06, 0x00, 0x3e, 0x59, 0x06, 0x00, 0x3f, 0x59, - 0x06, 0x00, 0xb8, 0x59, 0x06, 0x00, 0xbc, 0x59, 0x06, 0x00, 0xbe, 0x59, - 0x06, 0x00, 0xbf, 0x59, 0x06, 0x00, 0xf0, 0x59, 0x06, 0x00, 0xf1, 0x59, - 0x06, 0x00, 0xf9, 0x59, 0x06, 0x00, 0xfd, 0x59, 0x06, 0x00, 0x30, 0x5d, - 0x06, 0x00, 0x31, 0x5d, 0x06, 0x00, 0x39, 0x5d, 0x06, 0x00, 0x3d, 0x5d, - 0x06, 0x00, 0xc7, 0x5d, 0x06, 0x00, 0xcb, 0x5d, 0x06, 0x00, 0xf7, 0x5d, - 0x06, 0x00, 0xf8, 0x5d, 0x06, 0x00, 0xfc, 0x5d, 0x06, 0x00, 0xfe, 0x5d, - 0x06, 0x00, 0xff, 0x5d, 0x06, 0x00, 0x37, 0x5f, 0x06, 0x00, 0x38, 0x5f, - 0x06, 0x00, 0x3c, 0x5f, 0x06, 0x00, 0x3e, 0x5f, 0x06, 0x00, 0x3f, 0x5f, - 0x06, 0x00, 0xb8, 0x5f, 0x06, 0x00, 0xbc, 0x5f, 0x06, 0x00, 0xbe, 0x5f, - 0x06, 0x00, 0xbf, 0x5f, 0x06, 0x00, 0xf0, 0x5f, 0x06, 0x00, 0xf1, 0x5f, - 0x06, 0x00, 0xf9, 0x5f, 0x06, 0x00, 0xfd, 0x5f, 0x06, 0x00, 0xeb, 0x64, - 0x06, 0x00, 0xeb, 0x66, 0x06, 0x00, 0xf8, 0x6a, 0x06, 0x00, 0xfc, 0x6a, - 0x06, 0x00, 0xfe, 0x6a, 0x06, 0x00, 0xff, 0x6a, 0x06, 0x00, 0xcb, 0x7a, - 0x06, 0x00, 0xeb, 0x7a, 0x06, 0x00, 0xf8, 0x7c, 0x06, 0x00, 0xfc, 0x7c, - 0x06, 0x00, 0xfe, 0x7c, 0x06, 0x00, 0xff, 0x7c, 0x06, 0x00, 0xf1, 0x80, - 0x06, 0x00, 0xf9, 0x80, 0x06, 0x00, 0xf7, 0x81, 0x06, 0x00, 0xf1, 0x82, - 0x06, 0x00, 0xf9, 0x82, 0x06, 0x00, 0x4b, 0x87, 0x06, 0x00, 0xf7, 0x87, - 0x06, 0x00, 0xbb, 0x89, 0x06, 0x00, 0x4b, 0x8b, 0x06, 0x00, 0xf1, 0x8b, - 0x06, 0x00, 0xf7, 0x8b, 0x06, 0x00, 0xf9, 0x8b, 0x06, 0x00, 0xbb, 0x8d, - 0x06, 0x00, 0x3b, 0x95, 0x06, 0x00, 0x4b, 0xa4, 0x06, 0x00, 0x3b, 0xa5, - 0x06, 0x00, 0x4b, 0xa7, 0x06, 0x00, 0x4b, 0xab, 0x06, 0x00, 0xbb, 0xb2, - 0x06, 0x00, 0xf1, 0xb3, 0x06, 0x00, 0xf7, 0xb3, 0x06, 0x00, 0xf9, 0xb3, - 0x06, 0x00, 0xf1, 0xb7, 0x06, 0x00, 0xf7, 0xb7, 0x06, 0x00, 0xf9, 0xb7, - 0x06, 0x00, 0x4b, 0xbb, 0x06, 0x00, 0xf1, 0xbb, 0x06, 0x00, 0xf7, 0xbb, - 0x06, 0x00, 0xf9, 0xbb, 0x06, 0x00, 0xbb, 0xbe, 0x06, 0x00, 0xf1, 0xbf, - 0x06, 0x00, 0xf7, 0xbf, 0x06, 0x00, 0xf9, 0xbf, 0x06, 0x00, 0x30, 0xc2, - 0x06, 0x00, 0xe6, 0xc3, 0x06, 0x00, 0xf6, 0xc3, 0x06, 0x00, 0xf7, 0xc3, - 0x06, 0x00, 0xf8, 0xc3, 0x06, 0x00, 0xfc, 0xc3, 0x06, 0x00, 0xfe, 0xc3, - 0x06, 0x00, 0xff, 0xc3, 0x06, 0x00, 0xf6, 0xc5, 0x06, 0x00, 0xf7, 0xc5, - 0x06, 0x00, 0xf8, 0xc5, 0x06, 0x00, 0xfc, 0xc5, 0x06, 0x00, 0xfe, 0xc5, - 0x06, 0x00, 0xff, 0xc5, 0x06, 0x00, 0x51, 0xc9, 0x06, 0x00, 0x56, 0xc9, - 0x06, 0x00, 0x57, 0xc9, 0x06, 0x00, 0x58, 0xc9, 0x06, 0x00, 0x5c, 0xc9, - 0x06, 0x00, 0x5e, 0xc9, 0x06, 0x00, 0x5f, 0xc9, 0x06, 0x00, 0xf0, 0xcf, - 0x06, 0x00, 0xf1, 0xcf, 0x06, 0x00, 0xf9, 0xcf, 0x06, 0x00, 0xfd, 0xcf, - 0x06, 0x00, 0xf8, 0xd9, 0x06, 0x00, 0xfc, 0xd9, 0x06, 0x00, 0xfe, 0xd9, - 0x06, 0x00, 0xff, 0xd9, 0x06, 0x00, 0xf8, 0xdd, 0x06, 0x00, 0xfc, 0xdd, - 0x06, 0x00, 0xfe, 0xdd, 0x06, 0x00, 0xff, 0xdd, 0x06, 0x00, 0xf0, 0xe5, - 0x06, 0x00, 0x30, 0xe9, 0x06, 0x00, 0x51, 0xe9, 0x06, 0x00, 0x56, 0xe9, - 0x06, 0x00, 0x57, 0xe9, 0x06, 0x00, 0x58, 0xe9, 0x06, 0x00, 0x5c, 0xe9, - 0x06, 0x00, 0x5e, 0xe9, 0x06, 0x00, 0x5f, 0xe9, 0x06, 0x00, 0x30, 0xec, - 0x06, 0x00, 0x30, 0xed, 0x06, 0x00, 0xf0, 0xef, 0x06, 0x00, 0xf1, 0xef, - 0x06, 0x00, 0xf9, 0xef, 0x06, 0x00, 0xfd, 0xef, 0x06, 0x00, 0x88, 0xf3, - 0x06, 0x00, 0x8b, 0xf3, 0x06, 0x00, 0xf7, 0xf9, 0x06, 0x00, 0xf8, 0xf9, - 0x06, 0x00, 0xfc, 0xf9, 0x06, 0x00, 0xfe, 0xf9, 0x06, 0x00, 0xff, 0xf9, - 0x06, 0x00, 0xf0, 0xfd, 0x06, 0x00, 0x30, 0xff, 0x06, 0x00, 0x33, 0x00, - 0x07, 0x00, 0x3b, 0x00, 0x07, 0x00, 0x33, 0x01, 0x07, 0x00, 0x3b, 0x01, - 0x07, 0x00, 0xb3, 0x01, 0x07, 0x00, 0xbb, 0x01, 0x07, 0x00, 0xc3, 0x01, - 0x07, 0x00, 0xc4, 0x01, 0x07, 0x00, 0xc5, 0x01, 0x07, 0x00, 0xc8, 0x01, - 0x07, 0x00, 0xcb, 0x01, 0x07, 0x00, 0xcc, 0x01, 0x07, 0x00, 0xce, 0x01, - 0x07, 0x00, 0xcf, 0x01, 0x07, 0x00, 0xf4, 0x01, 0x07, 0x00, 0xf5, 0x01, - 0x07, 0x00, 0xf8, 0x01, 0x07, 0x00, 0xfc, 0x01, 0x07, 0x00, 0xfe, 0x01, - 0x07, 0x00, 0xff, 0x01, 0x07, 0x00, 0x34, 0x02, 0x07, 0x00, 0x35, 0x02, - 0x07, 0x00, 0x38, 0x02, 0x07, 0x00, 0x3c, 0x02, 0x07, 0x00, 0x3e, 0x02, - 0x07, 0x00, 0x3f, 0x02, 0x07, 0x00, 0x34, 0x03, 0x07, 0x00, 0x35, 0x03, - 0x07, 0x00, 0x38, 0x03, 0x07, 0x00, 0x3c, 0x03, 0x07, 0x00, 0x3e, 0x03, - 0x07, 0x00, 0x3f, 0x03, 0x07, 0x00, 0xf3, 0x03, 0x07, 0x00, 0xfb, 0x03, - 0x07, 0x00, 0xb4, 0x04, 0x07, 0x00, 0xb5, 0x04, 0x07, 0x00, 0xb8, 0x04, - 0x07, 0x00, 0xbc, 0x04, 0x07, 0x00, 0xbe, 0x04, 0x07, 0x00, 0xbf, 0x04, - 0x07, 0x00, 0xb3, 0x06, 0x07, 0x00, 0xbb, 0x06, 0x07, 0x00, 0xc8, 0x06, - 0x07, 0x00, 0xcb, 0x06, 0x07, 0x00, 0xf8, 0x06, 0x07, 0x00, 0xfc, 0x06, - 0x07, 0x00, 0xfe, 0x06, 0x07, 0x00, 0xff, 0x06, 0x07, 0x00, 0x58, 0x09, - 0x07, 0x00, 0x5c, 0x09, 0x07, 0x00, 0x5e, 0x09, 0x07, 0x00, 0x5f, 0x09, - 0x07, 0x00, 0xcb, 0x09, 0x07, 0x00, 0x43, 0x0a, 0x07, 0x00, 0x44, 0x0a, - 0x07, 0x00, 0x45, 0x0a, 0x07, 0x00, 0x48, 0x0a, 0x07, 0x00, 0x4b, 0x0a, - 0x07, 0x00, 0x4c, 0x0a, 0x07, 0x00, 0x4e, 0x0a, 0x07, 0x00, 0x4f, 0x0a, - 0x07, 0x00, 0x48, 0x0b, 0x07, 0x00, 0x4b, 0x0b, 0x07, 0x00, 0x88, 0x0b, - 0x07, 0x00, 0x8b, 0x0b, 0x07, 0x00, 0x8c, 0x0b, 0x07, 0x00, 0x8e, 0x0b, - 0x07, 0x00, 0x8f, 0x0b, 0x07, 0x00, 0x53, 0x0d, 0x07, 0x00, 0x54, 0x0d, - 0x07, 0x00, 0x55, 0x0d, 0x07, 0x00, 0x5b, 0x0d, 0x07, 0x00, 0x33, 0x0f, - 0x07, 0x00, 0x3b, 0x0f, 0x07, 0x00, 0xe4, 0x0f, 0x07, 0x00, 0xe5, 0x0f, - 0x07, 0x00, 0xe8, 0x0f, 0x07, 0x00, 0xeb, 0x0f, 0x07, 0x00, 0xec, 0x0f, - 0x07, 0x00, 0xee, 0x0f, 0x07, 0x00, 0xef, 0x0f, 0x07, 0x00, 0xf4, 0x0f, - 0x07, 0x00, 0xf5, 0x0f, 0x07, 0x00, 0xf8, 0x0f, 0x07, 0x00, 0xfc, 0x0f, - 0x07, 0x00, 0xfe, 0x0f, 0x07, 0x00, 0xff, 0x0f, 0x07, 0x00, 0x33, 0x11, - 0x07, 0x00, 0x3b, 0x11, 0x07, 0x00, 0xf4, 0x11, 0x07, 0x00, 0xf5, 0x11, - 0x07, 0x00, 0xf8, 0x11, 0x07, 0x00, 0xfc, 0x11, 0x07, 0x00, 0xfe, 0x11, - 0x07, 0x00, 0xff, 0x11, 0x07, 0x00, 0x58, 0x15, 0x07, 0x00, 0x83, 0x17, - 0x07, 0x00, 0x84, 0x17, 0x07, 0x00, 0x85, 0x17, 0x07, 0x00, 0xe3, 0x17, - 0x07, 0x00, 0xf3, 0x17, 0x07, 0x00, 0xfb, 0x17, 0x07, 0x00, 0xc8, 0x18, - 0x07, 0x00, 0xcb, 0x18, 0x07, 0x00, 0xf8, 0x1a, 0x07, 0x00, 0xfc, 0x1a, - 0x07, 0x00, 0xfe, 0x1a, 0x07, 0x00, 0xff, 0x1a, 0x07, 0x00, 0x48, 0x1b, - 0x07, 0x00, 0x4b, 0x1b, 0x07, 0x00, 0xc8, 0x1c, 0x07, 0x00, 0xcb, 0x1c, - 0x07, 0x00, 0xf8, 0x1c, 0x07, 0x00, 0xfc, 0x1c, 0x07, 0x00, 0xfe, 0x1c, - 0x07, 0x00, 0xff, 0x1c, 0x07, 0x00, 0x38, 0x1e, 0x07, 0x00, 0x3c, 0x1e, - 0x07, 0x00, 0x3e, 0x1e, 0x07, 0x00, 0x3f, 0x1e, 0x07, 0x00, 0x33, 0x1f, - 0x07, 0x00, 0x3b, 0x1f, 0x07, 0x00, 0xc8, 0x23, 0x07, 0x00, 0xcb, 0x23, - 0x07, 0x00, 0xf8, 0x23, 0x07, 0x00, 0xfc, 0x23, 0x07, 0x00, 0xfe, 0x23, - 0x07, 0x00, 0xff, 0x23, 0x07, 0x00, 0x38, 0x25, 0x07, 0x00, 0x3c, 0x25, - 0x07, 0x00, 0x3e, 0x25, 0x07, 0x00, 0x3f, 0x25, 0x07, 0x00, 0xf8, 0x29, - 0x07, 0x00, 0xfc, 0x29, 0x07, 0x00, 0xfe, 0x29, 0x07, 0x00, 0xff, 0x29, - 0x07, 0x00, 0xf8, 0x2d, 0x07, 0x00, 0xfc, 0x2d, 0x07, 0x00, 0xfe, 0x2d, - 0x07, 0x00, 0xff, 0x2d, 0x07, 0x00, 0x36, 0x33, 0x07, 0x00, 0x37, 0x33, - 0x07, 0x00, 0x38, 0x33, 0x07, 0x00, 0x3c, 0x33, 0x07, 0x00, 0x3e, 0x33, - 0x07, 0x00, 0x3f, 0x33, 0x07, 0x00, 0xb8, 0x33, 0x07, 0x00, 0xbc, 0x33, - 0x07, 0x00, 0xbe, 0x33, 0x07, 0x00, 0xbf, 0x33, 0x07, 0x00, 0xe9, 0x33, - 0x07, 0x00, 0xea, 0x33, 0x07, 0x00, 0xf0, 0x33, 0x07, 0x00, 0xf1, 0x33, - 0x07, 0x00, 0xf9, 0x33, 0x07, 0x00, 0xfd, 0x33, 0x07, 0x00, 0xc7, 0x35, - 0x07, 0x00, 0xcb, 0x35, 0x07, 0x00, 0xf7, 0x35, 0x07, 0x00, 0xf8, 0x35, - 0x07, 0x00, 0xfc, 0x35, 0x07, 0x00, 0xfe, 0x35, 0x07, 0x00, 0xff, 0x35, - 0x07, 0x00, 0x30, 0x39, 0x07, 0x00, 0x31, 0x39, 0x07, 0x00, 0x39, 0x39, - 0x07, 0x00, 0x3d, 0x39, 0x07, 0x00, 0xc7, 0x39, 0x07, 0x00, 0xcb, 0x39, - 0x07, 0x00, 0xf7, 0x39, 0x07, 0x00, 0xf8, 0x39, 0x07, 0x00, 0xfc, 0x39, - 0x07, 0x00, 0xfe, 0x39, 0x07, 0x00, 0xff, 0x39, 0x07, 0x00, 0x37, 0x3d, - 0x07, 0x00, 0x38, 0x3d, 0x07, 0x00, 0x3c, 0x3d, 0x07, 0x00, 0x3e, 0x3d, - 0x07, 0x00, 0x3f, 0x3d, 0x07, 0x00, 0xb8, 0x3d, 0x07, 0x00, 0xbc, 0x3d, - 0x07, 0x00, 0xbe, 0x3d, 0x07, 0x00, 0xbf, 0x3d, 0x07, 0x00, 0xf0, 0x3d, - 0x07, 0x00, 0xf1, 0x3d, 0x07, 0x00, 0xf9, 0x3d, 0x07, 0x00, 0xfd, 0x3d, - 0x07, 0x00, 0x30, 0x3f, 0x07, 0x00, 0x31, 0x3f, 0x07, 0x00, 0x39, 0x3f, - 0x07, 0x00, 0x3d, 0x3f, 0x07, 0x00, 0xe6, 0x3f, 0x07, 0x00, 0xe7, 0x3f, - 0x07, 0x00, 0xe8, 0x3f, 0x07, 0x00, 0xeb, 0x3f, 0x07, 0x00, 0xf6, 0x3f, - 0x07, 0x00, 0xf7, 0x3f, 0x07, 0x00, 0xf8, 0x3f, 0x07, 0x00, 0xfc, 0x3f, - 0x07, 0x00, 0xfe, 0x3f, 0x07, 0x00, 0xff, 0x3f, 0x07, 0x00, 0x37, 0x40, - 0x07, 0x00, 0x38, 0x40, 0x07, 0x00, 0x3c, 0x40, 0x07, 0x00, 0x3e, 0x40, - 0x07, 0x00, 0x3f, 0x40, 0x07, 0x00, 0x30, 0x41, 0x07, 0x00, 0x31, 0x41, - 0x07, 0x00, 0x39, 0x41, 0x07, 0x00, 0x3d, 0x41, 0x07, 0x00, 0xb7, 0x41, - 0x07, 0x00, 0xb8, 0x41, 0x07, 0x00, 0xbc, 0x41, 0x07, 0x00, 0xbe, 0x41, - 0x07, 0x00, 0xbf, 0x41, 0x07, 0x00, 0xc7, 0x41, 0x07, 0x00, 0xcb, 0x41, - 0x07, 0x00, 0xf7, 0x41, 0x07, 0x00, 0xf8, 0x41, 0x07, 0x00, 0xfc, 0x41, - 0x07, 0x00, 0xfe, 0x41, 0x07, 0x00, 0xff, 0x41, 0x07, 0x00, 0x37, 0x42, - 0x07, 0x00, 0x38, 0x42, 0x07, 0x00, 0x3c, 0x42, 0x07, 0x00, 0x3e, 0x42, - 0x07, 0x00, 0x3f, 0x42, 0x07, 0x00, 0x37, 0x43, 0x07, 0x00, 0x38, 0x43, - 0x07, 0x00, 0x3c, 0x43, 0x07, 0x00, 0x3e, 0x43, 0x07, 0x00, 0x3f, 0x43, - 0x07, 0x00, 0xb8, 0x43, 0x07, 0x00, 0xbc, 0x43, 0x07, 0x00, 0xbe, 0x43, - 0x07, 0x00, 0xbf, 0x43, 0x07, 0x00, 0xf0, 0x43, 0x07, 0x00, 0xf1, 0x43, - 0x07, 0x00, 0xf9, 0x43, 0x07, 0x00, 0xfd, 0x43, 0x07, 0x00, 0xb0, 0x44, - 0x07, 0x00, 0xb1, 0x44, 0x07, 0x00, 0xb9, 0x44, 0x07, 0x00, 0xbd, 0x44, - 0x07, 0x00, 0x47, 0x46, 0x07, 0x00, 0x4b, 0x46, 0x07, 0x00, 0xb0, 0x46, - 0x07, 0x00, 0xb1, 0x46, 0x07, 0x00, 0xb9, 0x46, 0x07, 0x00, 0xbd, 0x46, - 0x07, 0x00, 0x8b, 0x4f, 0x07, 0x00, 0xcb, 0x4f, 0x07, 0x00, 0xeb, 0x4f, - 0x07, 0x00, 0xf0, 0x4f, 0x07, 0x00, 0xf1, 0x4f, 0x07, 0x00, 0xf7, 0x4f, - 0x07, 0x00, 0xf9, 0x4f, 0x07, 0x00, 0xfd, 0x4f, 0x07, 0x00, 0x30, 0x53, - 0x07, 0x00, 0x31, 0x53, 0x07, 0x00, 0x39, 0x53, 0x07, 0x00, 0x3d, 0x53, - 0x07, 0x00, 0xc7, 0x53, 0x07, 0x00, 0xcb, 0x53, 0x07, 0x00, 0xf7, 0x53, - 0x07, 0x00, 0xf8, 0x53, 0x07, 0x00, 0xfc, 0x53, 0x07, 0x00, 0xfe, 0x53, - 0x07, 0x00, 0xff, 0x53, 0x07, 0x00, 0x37, 0x59, 0x07, 0x00, 0x38, 0x59, - 0x07, 0x00, 0x3c, 0x59, 0x07, 0x00, 0x3e, 0x59, 0x07, 0x00, 0x3f, 0x59, - 0x07, 0x00, 0xb8, 0x59, 0x07, 0x00, 0xbc, 0x59, 0x07, 0x00, 0xbe, 0x59, - 0x07, 0x00, 0xbf, 0x59, 0x07, 0x00, 0xf0, 0x59, 0x07, 0x00, 0xf1, 0x59, - 0x07, 0x00, 0xf9, 0x59, 0x07, 0x00, 0xfd, 0x59, 0x07, 0x00, 0x30, 0x5d, - 0x07, 0x00, 0x31, 0x5d, 0x07, 0x00, 0x39, 0x5d, 0x07, 0x00, 0x3d, 0x5d, - 0x07, 0x00, 0xc7, 0x5d, 0x07, 0x00, 0xcb, 0x5d, 0x07, 0x00, 0xf7, 0x5d, - 0x07, 0x00, 0xf8, 0x5d, 0x07, 0x00, 0xfc, 0x5d, 0x07, 0x00, 0xfe, 0x5d, - 0x07, 0x00, 0xff, 0x5d, 0x07, 0x00, 0x37, 0x5f, 0x07, 0x00, 0x38, 0x5f, - 0x07, 0x00, 0x3c, 0x5f, 0x07, 0x00, 0x3e, 0x5f, 0x07, 0x00, 0x3f, 0x5f, - 0x07, 0x00, 0xb8, 0x5f, 0x07, 0x00, 0xbc, 0x5f, 0x07, 0x00, 0xbe, 0x5f, - 0x07, 0x00, 0xbf, 0x5f, 0x07, 0x00, 0xf0, 0x5f, 0x07, 0x00, 0xf1, 0x5f, - 0x07, 0x00, 0xf9, 0x5f, 0x07, 0x00, 0xfd, 0x5f, 0x07, 0x00, 0xeb, 0x64, - 0x07, 0x00, 0xeb, 0x66, 0x07, 0x00, 0xf8, 0x6a, 0x07, 0x00, 0xfc, 0x6a, - 0x07, 0x00, 0xfe, 0x6a, 0x07, 0x00, 0xff, 0x6a, 0x07, 0x00, 0xcb, 0x7a, - 0x07, 0x00, 0xeb, 0x7a, 0x07, 0x00, 0xf8, 0x7c, 0x07, 0x00, 0xfc, 0x7c, - 0x07, 0x00, 0xfe, 0x7c, 0x07, 0x00, 0xff, 0x7c, 0x07, 0x00, 0xb0, 0x80, - 0x07, 0x00, 0xb1, 0x80, 0x07, 0x00, 0xb3, 0x80, 0x07, 0x00, 0xb9, 0x80, - 0x07, 0x00, 0xbb, 0x80, 0x07, 0x00, 0xbd, 0x80, 0x07, 0x00, 0xb4, 0x82, - 0x07, 0x00, 0xb5, 0x82, 0x07, 0x00, 0xb8, 0x82, 0x07, 0x00, 0xbc, 0x82, - 0x07, 0x00, 0xbe, 0x82, 0x07, 0x00, 0xbf, 0x82, 0x07, 0x00, 0x40, 0x84, - 0x07, 0x00, 0x41, 0x84, 0x07, 0x00, 0x42, 0x84, 0x07, 0x00, 0x49, 0x84, - 0x07, 0x00, 0x4a, 0x84, 0x07, 0x00, 0x4d, 0x84, 0x07, 0x00, 0xb2, 0x84, - 0x07, 0x00, 0xb4, 0x84, 0x07, 0x00, 0xb5, 0x84, 0x07, 0x00, 0xb6, 0x84, - 0x07, 0x00, 0xb7, 0x84, 0x07, 0x00, 0xb8, 0x84, 0x07, 0x00, 0xba, 0x84, - 0x07, 0x00, 0xbc, 0x84, 0x07, 0x00, 0xbe, 0x84, 0x07, 0x00, 0xbf, 0x84, - 0x07, 0x00, 0xc6, 0x84, 0x07, 0x00, 0xc7, 0x84, 0x07, 0x00, 0xc8, 0x84, - 0x07, 0x00, 0xcb, 0x84, 0x07, 0x00, 0xf6, 0x84, 0x07, 0x00, 0xf7, 0x84, - 0x07, 0x00, 0xf8, 0x84, 0x07, 0x00, 0xfc, 0x84, 0x07, 0x00, 0xfe, 0x84, - 0x07, 0x00, 0xff, 0x84, 0x07, 0x00, 0x40, 0x86, 0x07, 0x00, 0x41, 0x86, - 0x07, 0x00, 0x42, 0x86, 0x07, 0x00, 0x49, 0x86, 0x07, 0x00, 0x4a, 0x86, - 0x07, 0x00, 0x4d, 0x86, 0x07, 0x00, 0xb0, 0x86, 0x07, 0x00, 0xb1, 0x86, - 0x07, 0x00, 0xb3, 0x86, 0x07, 0x00, 0xb9, 0x86, 0x07, 0x00, 0xbb, 0x86, - 0x07, 0x00, 0xbd, 0x86, 0x07, 0x00, 0xc9, 0x86, 0x07, 0x00, 0xca, 0x86, - 0x07, 0x00, 0xf0, 0x86, 0x07, 0x00, 0xf1, 0x86, 0x07, 0x00, 0xf9, 0x86, - 0x07, 0x00, 0xfd, 0x86, 0x07, 0x00, 0x49, 0x87, 0x07, 0x00, 0x4a, 0x87, - 0x07, 0x00, 0xb0, 0x88, 0x07, 0x00, 0xb1, 0x88, 0x07, 0x00, 0xb3, 0x88, - 0x07, 0x00, 0xb9, 0x88, 0x07, 0x00, 0xbb, 0x88, 0x07, 0x00, 0xbd, 0x88, - 0x07, 0x00, 0x43, 0x8a, 0x07, 0x00, 0x44, 0x8a, 0x07, 0x00, 0x45, 0x8a, - 0x07, 0x00, 0x46, 0x8a, 0x07, 0x00, 0x47, 0x8a, 0x07, 0x00, 0x48, 0x8a, - 0x07, 0x00, 0x4b, 0x8a, 0x07, 0x00, 0x4c, 0x8a, 0x07, 0x00, 0x4e, 0x8a, - 0x07, 0x00, 0x4f, 0x8a, 0x07, 0x00, 0xb7, 0x8a, 0x07, 0x00, 0xeb, 0x8a, - 0x07, 0x00, 0xf7, 0x8a, 0x07, 0x00, 0xf8, 0x8a, 0x07, 0x00, 0xfc, 0x8a, - 0x07, 0x00, 0xfe, 0x8a, 0x07, 0x00, 0xff, 0x8a, 0x07, 0x00, 0x46, 0x8b, - 0x07, 0x00, 0x47, 0x8b, 0x07, 0x00, 0x48, 0x8b, 0x07, 0x00, 0x4b, 0x8b, - 0x07, 0x00, 0x80, 0x8b, 0x07, 0x00, 0x81, 0x8b, 0x07, 0x00, 0x82, 0x8b, - 0x07, 0x00, 0x88, 0x8b, 0x07, 0x00, 0x8b, 0x8b, 0x07, 0x00, 0x8c, 0x8b, - 0x07, 0x00, 0x8e, 0x8b, 0x07, 0x00, 0x8f, 0x8b, 0x07, 0x00, 0xb3, 0x8c, - 0x07, 0x00, 0xbb, 0x8c, 0x07, 0x00, 0x88, 0x8f, 0x07, 0x00, 0x8b, 0x8f, - 0x07, 0x00, 0x8c, 0x8f, 0x07, 0x00, 0x8e, 0x8f, 0x07, 0x00, 0x8f, 0x8f, - 0x07, 0x00, 0xf4, 0x93, 0x07, 0x00, 0xf5, 0x93, 0x07, 0x00, 0xf8, 0x93, - 0x07, 0x00, 0xfc, 0x93, 0x07, 0x00, 0xfe, 0x93, 0x07, 0x00, 0xff, 0x93, - 0x07, 0x00, 0x34, 0x99, 0x07, 0x00, 0x35, 0x99, 0x07, 0x00, 0x38, 0x99, - 0x07, 0x00, 0x3c, 0x99, 0x07, 0x00, 0x3e, 0x99, 0x07, 0x00, 0x3f, 0x99, - 0x07, 0x00, 0xf3, 0x99, 0x07, 0x00, 0xfb, 0x99, 0x07, 0x00, 0xf3, 0x9d, - 0x07, 0x00, 0xfb, 0x9d, 0x07, 0x00, 0xf4, 0x9f, 0x07, 0x00, 0xf5, 0x9f, - 0x07, 0x00, 0xf8, 0x9f, 0x07, 0x00, 0xfc, 0x9f, 0x07, 0x00, 0xfe, 0x9f, - 0x07, 0x00, 0xff, 0x9f, 0x07, 0x00, 0xb8, 0xa0, 0x07, 0x00, 0xbc, 0xa0, - 0x07, 0x00, 0xbe, 0xa0, 0x07, 0x00, 0xbf, 0xa0, 0x07, 0x00, 0x4b, 0xa4, - 0x07, 0x00, 0xb8, 0xa4, 0x07, 0x00, 0xbc, 0xa4, 0x07, 0x00, 0xbe, 0xa4, - 0x07, 0x00, 0xbf, 0xa4, 0x07, 0x00, 0xb8, 0xa6, 0x07, 0x00, 0xbc, 0xa6, - 0x07, 0x00, 0xbe, 0xa6, 0x07, 0x00, 0xbf, 0xa6, 0x07, 0x00, 0xb6, 0xb0, - 0x07, 0x00, 0xb7, 0xb0, 0x07, 0x00, 0xb8, 0xb0, 0x07, 0x00, 0xbc, 0xb0, - 0x07, 0x00, 0xbe, 0xb0, 0x07, 0x00, 0xbf, 0xb0, 0x07, 0x00, 0xb0, 0xb4, - 0x07, 0x00, 0xb1, 0xb4, 0x07, 0x00, 0xb9, 0xb4, 0x07, 0x00, 0xbd, 0xb4, - 0x07, 0x00, 0xb0, 0xb6, 0x07, 0x00, 0xb1, 0xb6, 0x07, 0x00, 0xb9, 0xb6, - 0x07, 0x00, 0xbd, 0xb6, 0x07, 0x00, 0x88, 0xb7, 0x07, 0x00, 0x8b, 0xb7, - 0x07, 0x00, 0x47, 0xb8, 0x07, 0x00, 0x4b, 0xb8, 0x07, 0x00, 0xb0, 0xb8, - 0x07, 0x00, 0xb1, 0xb8, 0x07, 0x00, 0xb9, 0xb8, 0x07, 0x00, 0xbd, 0xb8, - 0x07, 0x00, 0x46, 0xba, 0x07, 0x00, 0x47, 0xba, 0x07, 0x00, 0x48, 0xba, - 0x07, 0x00, 0x4b, 0xba, 0x07, 0x00, 0xb7, 0xba, 0x07, 0x00, 0xb8, 0xba, - 0x07, 0x00, 0xbc, 0xba, 0x07, 0x00, 0xbe, 0xba, 0x07, 0x00, 0xbf, 0xba, - 0x07, 0x00, 0x88, 0xbb, 0x07, 0x00, 0x8b, 0xbb, 0x07, 0x00, 0x48, 0xbe, - 0x07, 0x00, 0x4b, 0xbe, 0x07, 0x00, 0x88, 0xbf, 0x07, 0x00, 0x8b, 0xbf, - 0x07, 0x00, 0xc0, 0xc3, 0x07, 0x00, 0xc1, 0xc3, 0x07, 0x00, 0xc2, 0xc3, - 0x07, 0x00, 0xc9, 0xc3, 0x07, 0x00, 0xca, 0xc3, 0x07, 0x00, 0xcd, 0xc3, - 0x07, 0x00, 0xf0, 0xc3, 0x07, 0x00, 0xf1, 0xc3, 0x07, 0x00, 0xf3, 0xc3, - 0x07, 0x00, 0xf9, 0xc3, 0x07, 0x00, 0xfb, 0xc3, 0x07, 0x00, 0xfd, 0xc3, - 0x07, 0x00, 0x30, 0xc5, 0x07, 0x00, 0x31, 0xc5, 0x07, 0x00, 0x33, 0xc5, - 0x07, 0x00, 0x39, 0xc5, 0x07, 0x00, 0x3b, 0xc5, 0x07, 0x00, 0x3d, 0xc5, - 0x07, 0x00, 0xb3, 0xc5, 0x07, 0x00, 0xbb, 0xc5, 0x07, 0x00, 0xc3, 0xc5, - 0x07, 0x00, 0xc4, 0xc5, 0x07, 0x00, 0xc5, 0xc5, 0x07, 0x00, 0xc6, 0xc5, - 0x07, 0x00, 0xc7, 0xc5, 0x07, 0x00, 0xc8, 0xc5, 0x07, 0x00, 0xcb, 0xc5, - 0x07, 0x00, 0xcc, 0xc5, 0x07, 0x00, 0xce, 0xc5, 0x07, 0x00, 0xcf, 0xc5, - 0x07, 0x00, 0xf2, 0xc5, 0x07, 0x00, 0xf4, 0xc5, 0x07, 0x00, 0xf5, 0xc5, - 0x07, 0x00, 0xf6, 0xc5, 0x07, 0x00, 0xf7, 0xc5, 0x07, 0x00, 0xf8, 0xc5, - 0x07, 0x00, 0xfa, 0xc5, 0x07, 0x00, 0xfc, 0xc5, 0x07, 0x00, 0xfe, 0xc5, - 0x07, 0x00, 0xff, 0xc5, 0x07, 0x00, 0xf7, 0xc9, 0x07, 0x00, 0xf7, 0xcd, - 0x07, 0x00, 0x88, 0xcf, 0x07, 0x00, 0x8b, 0xcf, 0x07, 0x00, 0x8c, 0xcf, - 0x07, 0x00, 0x8e, 0xcf, 0x07, 0x00, 0x8f, 0xcf, 0x07, 0x00, 0xc3, 0xcf, - 0x07, 0x00, 0xc4, 0xcf, 0x07, 0x00, 0xc5, 0xcf, 0x07, 0x00, 0xc6, 0xcf, - 0x07, 0x00, 0xc7, 0xcf, 0x07, 0x00, 0xc8, 0xcf, 0x07, 0x00, 0xcb, 0xcf, - 0x07, 0x00, 0xcc, 0xcf, 0x07, 0x00, 0xce, 0xcf, 0x07, 0x00, 0xcf, 0xcf, - 0x07, 0x00, 0xe0, 0xcf, 0x07, 0x00, 0xe1, 0xcf, 0x07, 0x00, 0xe2, 0xcf, - 0x07, 0x00, 0xe4, 0xcf, 0x07, 0x00, 0xe5, 0xcf, 0x07, 0x00, 0xe6, 0xcf, - 0x07, 0x00, 0xe7, 0xcf, 0x07, 0x00, 0xe8, 0xcf, 0x07, 0x00, 0xeb, 0xcf, - 0x07, 0x00, 0xec, 0xcf, 0x07, 0x00, 0xee, 0xcf, 0x07, 0x00, 0xef, 0xcf, - 0x07, 0x00, 0xf2, 0xcf, 0x07, 0x00, 0xf4, 0xcf, 0x07, 0x00, 0xf5, 0xcf, - 0x07, 0x00, 0xf6, 0xcf, 0x07, 0x00, 0xf7, 0xcf, 0x07, 0x00, 0xf8, 0xcf, - 0x07, 0x00, 0xfa, 0xcf, 0x07, 0x00, 0xfc, 0xcf, 0x07, 0x00, 0xfe, 0xcf, - 0x07, 0x00, 0xff, 0xcf, 0x07, 0x00, 0x34, 0xd3, 0x07, 0x00, 0x35, 0xd3, - 0x07, 0x00, 0x38, 0xd3, 0x07, 0x00, 0x3c, 0xd3, 0x07, 0x00, 0x3e, 0xd3, - 0x07, 0x00, 0x3f, 0xd3, 0x07, 0x00, 0xf3, 0xd3, 0x07, 0x00, 0xfb, 0xd3, - 0x07, 0x00, 0x34, 0xd9, 0x07, 0x00, 0x35, 0xd9, 0x07, 0x00, 0x38, 0xd9, - 0x07, 0x00, 0x3c, 0xd9, 0x07, 0x00, 0x3e, 0xd9, 0x07, 0x00, 0x3f, 0xd9, - 0x07, 0x00, 0xf3, 0xd9, 0x07, 0x00, 0xfb, 0xd9, 0x07, 0x00, 0x33, 0xdd, - 0x07, 0x00, 0x3b, 0xdd, 0x07, 0x00, 0xc3, 0xdd, 0x07, 0x00, 0xc4, 0xdd, - 0x07, 0x00, 0xc5, 0xdd, 0x07, 0x00, 0xc8, 0xdd, 0x07, 0x00, 0xcb, 0xdd, - 0x07, 0x00, 0xcc, 0xdd, 0x07, 0x00, 0xce, 0xdd, 0x07, 0x00, 0xcf, 0xdd, - 0x07, 0x00, 0xf4, 0xdd, 0x07, 0x00, 0xf5, 0xdd, 0x07, 0x00, 0xf8, 0xdd, - 0x07, 0x00, 0xfc, 0xdd, 0x07, 0x00, 0xfe, 0xdd, 0x07, 0x00, 0xff, 0xdd, - 0x07, 0x00, 0x38, 0xde, 0x07, 0x00, 0x3c, 0xde, 0x07, 0x00, 0x3e, 0xde, - 0x07, 0x00, 0x3f, 0xde, 0x07, 0x00, 0x33, 0xdf, 0x07, 0x00, 0x3b, 0xdf, - 0x07, 0x00, 0xc3, 0xdf, 0x07, 0x00, 0xc4, 0xdf, 0x07, 0x00, 0xc5, 0xdf, - 0x07, 0x00, 0xc8, 0xdf, 0x07, 0x00, 0xcb, 0xdf, 0x07, 0x00, 0xcc, 0xdf, - 0x07, 0x00, 0xce, 0xdf, 0x07, 0x00, 0xcf, 0xdf, 0x07, 0x00, 0xf4, 0xdf, - 0x07, 0x00, 0xf5, 0xdf, 0x07, 0x00, 0xf8, 0xdf, 0x07, 0x00, 0xfc, 0xdf, - 0x07, 0x00, 0xfe, 0xdf, 0x07, 0x00, 0xff, 0xdf, 0x07, 0x00, 0xb4, 0xe2, - 0x07, 0x00, 0xb5, 0xe2, 0x07, 0x00, 0xb8, 0xe2, 0x07, 0x00, 0xbc, 0xe2, - 0x07, 0x00, 0xbe, 0xe2, 0x07, 0x00, 0xbf, 0xe2, 0x07, 0x00, 0xf2, 0xe3, - 0x07, 0x00, 0xf4, 0xe3, 0x07, 0x00, 0xf5, 0xe3, 0x07, 0x00, 0xf6, 0xe3, - 0x07, 0x00, 0xf7, 0xe3, 0x07, 0x00, 0xf8, 0xe3, 0x07, 0x00, 0xfa, 0xe3, - 0x07, 0x00, 0xfc, 0xe3, 0x07, 0x00, 0xfe, 0xe3, 0x07, 0x00, 0xff, 0xe3, - 0x07, 0x00, 0x51, 0xe5, 0x07, 0x00, 0x56, 0xe5, 0x07, 0x00, 0x57, 0xe5, - 0x07, 0x00, 0x59, 0xe5, 0x07, 0x00, 0x5d, 0xe5, 0x07, 0x00, 0xf7, 0xe5, - 0x07, 0x00, 0xf0, 0xe9, 0x07, 0x00, 0xf1, 0xe9, 0x07, 0x00, 0xf3, 0xe9, - 0x07, 0x00, 0xf9, 0xe9, 0x07, 0x00, 0xfb, 0xe9, 0x07, 0x00, 0xfd, 0xe9, - 0x07, 0x00, 0xf0, 0xed, 0x07, 0x00, 0xf1, 0xed, 0x07, 0x00, 0xf3, 0xed, - 0x07, 0x00, 0xf9, 0xed, 0x07, 0x00, 0xfb, 0xed, 0x07, 0x00, 0xfd, 0xed, - 0x07, 0x00, 0xf2, 0xef, 0x07, 0x00, 0xf4, 0xef, 0x07, 0x00, 0xf5, 0xef, - 0x07, 0x00, 0xf6, 0xef, 0x07, 0x00, 0xf7, 0xef, 0x07, 0x00, 0xf8, 0xef, - 0x07, 0x00, 0xfa, 0xef, 0x07, 0x00, 0xfc, 0xef, 0x07, 0x00, 0xfe, 0xef, - 0x07, 0x00, 0xff, 0xef, 0x07, 0x00, 0xf2, 0xf3, 0x07, 0x00, 0xf4, 0xf3, - 0x07, 0x00, 0xf5, 0xf3, 0x07, 0x00, 0xf6, 0xf3, 0x07, 0x00, 0xf7, 0xf3, - 0x07, 0x00, 0xf8, 0xf3, 0x07, 0x00, 0xfa, 0xf3, 0x07, 0x00, 0xfc, 0xf3, - 0x07, 0x00, 0xfe, 0xf3, 0x07, 0x00, 0xff, 0xf3, 0x07, 0x00, 0xf7, 0xf5, - 0x07, 0x00, 0x31, 0xf9, 0x07, 0x00, 0x39, 0xf9, 0x07, 0x00, 0x50, 0xf9, - 0x07, 0x00, 0x51, 0xf9, 0x07, 0x00, 0x56, 0xf9, 0x07, 0x00, 0x57, 0xf9, - 0x07, 0x00, 0x59, 0xf9, 0x07, 0x00, 0x5d, 0xf9, 0x07, 0x00, 0xf7, 0xf9, - 0x07, 0x00, 0x51, 0xfd, 0x07, 0x00, 0x56, 0xfd, 0x07, 0x00, 0x57, 0xfd, - 0x07, 0x00, 0x59, 0xfd, 0x07, 0x00, 0x5d, 0xfd, 0x07, 0x00, 0xf7, 0xfd, - 0x07, 0x00, 0x88, 0xff, 0x07, 0x00, 0x8b, 0xff, 0x07, 0x00, 0x8c, 0xff, - 0x07, 0x00, 0x8e, 0xff, 0x07, 0x00, 0x8f, 0xff, 0x07, 0x00, 0xc3, 0xff, - 0x07, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc5, 0xff, 0x07, 0x00, 0xc6, 0xff, - 0x07, 0x00, 0xc7, 0xff, 0x07, 0x00, 0xc8, 0xff, 0x07, 0x00, 0xcb, 0xff, - 0x07, 0x00, 0xcc, 0xff, 0x07, 0x00, 0xce, 0xff, 0x07, 0x00, 0xcf, 0xff, - 0x07, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe1, 0xff, 0x07, 0x00, 0xe2, 0xff, - 0x07, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe5, 0xff, 0x07, 0x00, 0xe6, 0xff, - 0x07, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xeb, 0xff, - 0x07, 0x00, 0xec, 0xff, 0x07, 0x00, 0xee, 0xff, 0x07, 0x00, 0xef, 0xff, - 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, - 0x07, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, - 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfe, 0xff, - 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xf8, 0x00, 0x08, 0x00, 0xfc, 0x00, - 0x08, 0x00, 0xfe, 0x00, 0x08, 0x00, 0xff, 0x00, 0x08, 0x00, 0x78, 0x01, - 0x08, 0x00, 0x7c, 0x01, 0x08, 0x00, 0x7e, 0x01, 0x08, 0x00, 0x7f, 0x01, - 0x08, 0x00, 0xcb, 0x02, 0x08, 0x00, 0xeb, 0x02, 0x08, 0x00, 0xeb, 0x03, - 0x08, 0x00, 0xeb, 0x0b, 0x08, 0x00, 0xf8, 0x0b, 0x08, 0x00, 0xfc, 0x0b, - 0x08, 0x00, 0xfe, 0x0b, 0x08, 0x00, 0xff, 0x0b, 0x08, 0x00, 0xf8, 0x14, - 0x08, 0x00, 0xfc, 0x14, 0x08, 0x00, 0xfe, 0x14, 0x08, 0x00, 0xff, 0x14, - 0x08, 0x00, 0x2b, 0x16, 0x08, 0x00, 0x78, 0x16, 0x08, 0x00, 0x7c, 0x16, - 0x08, 0x00, 0x7e, 0x16, 0x08, 0x00, 0x7f, 0x16, 0x08, 0x00, 0x2b, 0x17, - 0x08, 0x00, 0x78, 0x17, 0x08, 0x00, 0x7c, 0x17, 0x08, 0x00, 0x7e, 0x17, - 0x08, 0x00, 0x7f, 0x17, 0x08, 0x00, 0xab, 0x17, 0x08, 0x00, 0xf8, 0x17, - 0x08, 0x00, 0xfc, 0x17, 0x08, 0x00, 0xfe, 0x17, 0x08, 0x00, 0xff, 0x17, - 0x08, 0x00, 0x4b, 0x18, 0x08, 0x00, 0xeb, 0x1b, 0x08, 0x00, 0x2b, 0x1f, - 0x08, 0x00, 0xf8, 0x21, 0x08, 0x00, 0xfc, 0x21, 0x08, 0x00, 0xfe, 0x21, - 0x08, 0x00, 0xff, 0x21, 0x08, 0x00, 0xcb, 0x22, 0x08, 0x00, 0xeb, 0x22, - 0x08, 0x00, 0xeb, 0x23, 0x08, 0x00, 0x8b, 0x27, 0x08, 0x00, 0xcb, 0x27, - 0x08, 0x00, 0xeb, 0x27, 0x08, 0x00, 0xf8, 0x27, 0x08, 0x00, 0xfc, 0x27, - 0x08, 0x00, 0xfe, 0x27, 0x08, 0x00, 0xff, 0x27, 0x08, 0x00, 0xf8, 0x29, - 0x08, 0x00, 0xfc, 0x29, 0x08, 0x00, 0xfe, 0x29, 0x08, 0x00, 0xff, 0x29, - 0x08, 0x00, 0x8b, 0x2b, 0x08, 0x00, 0x47, 0x30, 0x08, 0x00, 0xb0, 0x30, - 0x08, 0x00, 0xb0, 0x34, 0x08, 0x00, 0x0b, 0x35, 0x08, 0x00, 0xb0, 0x37, - 0x08, 0x00, 0x8b, 0x3b, 0x08, 0x00, 0xf0, 0x3f, 0x08, 0x00, 0xf1, 0x3f, - 0x08, 0x00, 0xf7, 0x3f, 0x08, 0x00, 0xf9, 0x3f, 0x08, 0x00, 0xfd, 0x3f, - 0x08, 0x00, 0x77, 0x40, 0x08, 0x00, 0x78, 0x40, 0x08, 0x00, 0x7c, 0x40, - 0x08, 0x00, 0x7e, 0x40, 0x08, 0x00, 0x7f, 0x40, 0x08, 0x00, 0xf0, 0x41, - 0x08, 0x00, 0xf1, 0x41, 0x08, 0x00, 0xf9, 0x41, 0x08, 0x00, 0xfd, 0x41, - 0x08, 0x00, 0x8b, 0x43, 0x08, 0x00, 0xb0, 0x44, 0x08, 0x00, 0xb0, 0x46, - 0x08, 0x00, 0xb0, 0x47, 0x08, 0x00, 0xb0, 0x48, 0x08, 0x00, 0x6b, 0x49, - 0x08, 0x00, 0x30, 0x4b, 0x08, 0x00, 0xf0, 0x4b, 0x08, 0x00, 0x6b, 0x4d, - 0x08, 0x00, 0x8b, 0x4f, 0x08, 0x00, 0xcb, 0x4f, 0x08, 0x00, 0xeb, 0x4f, - 0x08, 0x00, 0xf0, 0x4f, 0x08, 0x00, 0xf1, 0x4f, 0x08, 0x00, 0xf7, 0x4f, - 0x08, 0x00, 0xf9, 0x4f, 0x08, 0x00, 0xfd, 0x4f, 0x08, 0x00, 0x78, 0x52, - 0x08, 0x00, 0x7c, 0x52, 0x08, 0x00, 0x7e, 0x52, 0x08, 0x00, 0x7f, 0x52, - 0x08, 0x00, 0x6b, 0x55, 0x08, 0x00, 0x78, 0x55, 0x08, 0x00, 0x7c, 0x55, - 0x08, 0x00, 0x7e, 0x55, 0x08, 0x00, 0x7f, 0x55, 0x08, 0x00, 0xcb, 0x57, - 0x08, 0x00, 0xeb, 0x57, 0x08, 0x00, 0xf8, 0x57, 0x08, 0x00, 0xfc, 0x57, - 0x08, 0x00, 0xfe, 0x57, 0x08, 0x00, 0xff, 0x57, 0x08, 0x00, 0x8b, 0x5b, - 0x08, 0x00, 0x78, 0x5c, 0x08, 0x00, 0x7c, 0x5c, 0x08, 0x00, 0x7e, 0x5c, - 0x08, 0x00, 0x7f, 0x5c, 0x08, 0x00, 0x78, 0x5e, 0x08, 0x00, 0x7c, 0x5e, - 0x08, 0x00, 0x7e, 0x5e, 0x08, 0x00, 0x7f, 0x5e, 0x08, 0x00, 0xf7, 0x5f, - 0x08, 0x00, 0xf8, 0x5f, 0x08, 0x00, 0xfc, 0x5f, 0x08, 0x00, 0xfe, 0x5f, - 0x08, 0x00, 0xff, 0x5f, 0x08, 0x00, 0x0b, 0x67, 0x08, 0x00, 0xcb, 0x6a, - 0x08, 0x00, 0xeb, 0x6a, 0x08, 0x00, 0xf8, 0x6a, 0x08, 0x00, 0xfc, 0x6a, - 0x08, 0x00, 0xfe, 0x6a, 0x08, 0x00, 0xff, 0x6a, 0x08, 0x00, 0x0b, 0x6b, - 0x08, 0x00, 0x4b, 0x6b, 0x08, 0x00, 0x4b, 0x78, 0x08, 0x00, 0xcb, 0x7a, - 0x08, 0x00, 0xeb, 0x7a, 0x08, 0x00, 0x0b, 0x7b, 0x08, 0x00, 0x4b, 0x7b, - 0x08, 0x00, 0xf8, 0x7c, 0x08, 0x00, 0xfc, 0x7c, 0x08, 0x00, 0xfe, 0x7c, - 0x08, 0x00, 0xff, 0x7c, 0x08, 0x00, 0x2b, 0x7e, 0x08, 0x00, 0xc7, 0x84, - 0x08, 0x00, 0xf7, 0x84, 0x08, 0x00, 0xf8, 0x84, 0x08, 0x00, 0xfc, 0x84, - 0x08, 0x00, 0xfe, 0x84, 0x08, 0x00, 0xff, 0x84, 0x08, 0x00, 0xc7, 0x86, - 0x08, 0x00, 0xf7, 0x86, 0x08, 0x00, 0xf8, 0x86, 0x08, 0x00, 0xfc, 0x86, - 0x08, 0x00, 0xfe, 0x86, 0x08, 0x00, 0xff, 0x86, 0x08, 0x00, 0xf7, 0x87, - 0x08, 0x00, 0x0b, 0x8a, 0x08, 0x00, 0x4b, 0x8b, 0x08, 0x00, 0x78, 0x8b, - 0x08, 0x00, 0x7c, 0x8b, 0x08, 0x00, 0x7e, 0x8b, 0x08, 0x00, 0x7f, 0x8b, - 0x08, 0x00, 0x0b, 0x8e, 0x08, 0x00, 0xbb, 0x8e, 0x08, 0x00, 0xf1, 0x8f, - 0x08, 0x00, 0xf7, 0x8f, 0x08, 0x00, 0xf9, 0x8f, 0x08, 0x00, 0xfb, 0x95, - 0x08, 0x00, 0xf8, 0x9a, 0x08, 0x00, 0xfc, 0x9a, 0x08, 0x00, 0xfe, 0x9a, - 0x08, 0x00, 0xff, 0x9a, 0x08, 0x00, 0xeb, 0xa4, 0x08, 0x00, 0xf8, 0xa4, - 0x08, 0x00, 0xfc, 0xa4, 0x08, 0x00, 0xfe, 0xa4, 0x08, 0x00, 0xff, 0xa4, - 0x08, 0x00, 0x3b, 0xa5, 0x08, 0x00, 0x0b, 0xa6, 0x08, 0x00, 0x2b, 0xa6, - 0x08, 0x00, 0xeb, 0xa6, 0x08, 0x00, 0x4b, 0xab, 0x08, 0x00, 0x71, 0xb1, - 0x08, 0x00, 0x77, 0xb1, 0x08, 0x00, 0x79, 0xb1, 0x08, 0x00, 0xf1, 0xb3, - 0x08, 0x00, 0xf7, 0xb3, 0x08, 0x00, 0xf9, 0xb3, 0x08, 0x00, 0x0b, 0xb5, - 0x08, 0x00, 0xf1, 0xb7, 0x08, 0x00, 0xf7, 0xb7, 0x08, 0x00, 0xf9, 0xb7, - 0x08, 0x00, 0xf0, 0xb8, 0x08, 0x00, 0xf1, 0xb8, 0x08, 0x00, 0xf7, 0xb8, - 0x08, 0x00, 0xf9, 0xb8, 0x08, 0x00, 0xfd, 0xb8, 0x08, 0x00, 0xbb, 0xb9, - 0x08, 0x00, 0x0b, 0xba, 0x08, 0x00, 0x4b, 0xbb, 0x08, 0x00, 0x78, 0xbb, - 0x08, 0x00, 0x7c, 0xbb, 0x08, 0x00, 0x7e, 0xbb, 0x08, 0x00, 0x7f, 0xbb, - 0x08, 0x00, 0xbb, 0xbd, 0x08, 0x00, 0xb0, 0xc0, 0x08, 0x00, 0xf6, 0xc0, - 0x08, 0x00, 0xf7, 0xc0, 0x08, 0x00, 0xf8, 0xc0, 0x08, 0x00, 0xfc, 0xc0, - 0x08, 0x00, 0xfe, 0xc0, 0x08, 0x00, 0xff, 0xc0, 0x08, 0x00, 0xf0, 0xc1, - 0x08, 0x00, 0xf1, 0xc1, 0x08, 0x00, 0xf9, 0xc1, 0x08, 0x00, 0xfd, 0xc1, - 0x08, 0x00, 0x78, 0xc3, 0x08, 0x00, 0x7c, 0xc3, 0x08, 0x00, 0x7e, 0xc3, - 0x08, 0x00, 0x7f, 0xc3, 0x08, 0x00, 0x30, 0xc7, 0x08, 0x00, 0x47, 0xc8, - 0x08, 0x00, 0x4b, 0xc8, 0x08, 0x00, 0xb0, 0xc8, 0x08, 0x00, 0xf0, 0xc9, - 0x08, 0x00, 0xf1, 0xc9, 0x08, 0x00, 0xf9, 0xc9, 0x08, 0x00, 0xfd, 0xc9, - 0x08, 0x00, 0x30, 0xcb, 0x08, 0x00, 0xe6, 0xcb, 0x08, 0x00, 0xf0, 0xcb, - 0x08, 0x00, 0xd1, 0xcc, 0x08, 0x00, 0xd6, 0xcc, 0x08, 0x00, 0xd7, 0xcc, - 0x08, 0x00, 0xd8, 0xcc, 0x08, 0x00, 0xdc, 0xcc, 0x08, 0x00, 0xde, 0xcc, - 0x08, 0x00, 0xdf, 0xcc, 0x08, 0x00, 0xf0, 0xcc, 0x08, 0x00, 0xf1, 0xcc, - 0x08, 0x00, 0xf9, 0xcc, 0x08, 0x00, 0xfd, 0xcc, 0x08, 0x00, 0x2b, 0xce, - 0x08, 0x00, 0xf0, 0xce, 0x08, 0x00, 0xf1, 0xce, 0x08, 0x00, 0xf9, 0xce, - 0x08, 0x00, 0xfd, 0xce, 0x08, 0x00, 0x28, 0xcf, 0x08, 0x00, 0x2b, 0xcf, - 0x08, 0x00, 0xa8, 0xcf, 0x08, 0x00, 0xab, 0xcf, 0x08, 0x00, 0xf0, 0xcf, - 0x08, 0x00, 0xf1, 0xcf, 0x08, 0x00, 0xf9, 0xcf, 0x08, 0x00, 0xfd, 0xcf, - 0x08, 0x00, 0xc8, 0xd0, 0x08, 0x00, 0xcb, 0xd0, 0x08, 0x00, 0x48, 0xd1, - 0x08, 0x00, 0x4b, 0xd1, 0x08, 0x00, 0xf8, 0xd1, 0x08, 0x00, 0xfc, 0xd1, - 0x08, 0x00, 0xfe, 0xd1, 0x08, 0x00, 0xff, 0xd1, 0x08, 0x00, 0xc8, 0xd3, - 0x08, 0x00, 0xcb, 0xd3, 0x08, 0x00, 0xe8, 0xd4, 0x08, 0x00, 0xeb, 0xd4, - 0x08, 0x00, 0xf8, 0xd5, 0x08, 0x00, 0xfc, 0xd5, 0x08, 0x00, 0xfe, 0xd5, - 0x08, 0x00, 0xff, 0xd5, 0x08, 0x00, 0xeb, 0xd6, 0x08, 0x00, 0x88, 0xd7, - 0x08, 0x00, 0x8b, 0xd7, 0x08, 0x00, 0xc8, 0xd7, 0x08, 0x00, 0xcb, 0xd7, - 0x08, 0x00, 0xe8, 0xd7, 0x08, 0x00, 0xeb, 0xd7, 0x08, 0x00, 0xf8, 0xdb, - 0x08, 0x00, 0xfc, 0xdb, 0x08, 0x00, 0xfe, 0xdb, 0x08, 0x00, 0xff, 0xdb, - 0x08, 0x00, 0xb0, 0xe0, 0x08, 0x00, 0xf6, 0xe1, 0x08, 0x00, 0xf7, 0xe1, - 0x08, 0x00, 0xf8, 0xe1, 0x08, 0x00, 0xfc, 0xe1, 0x08, 0x00, 0xfe, 0xe1, - 0x08, 0x00, 0xff, 0xe1, 0x08, 0x00, 0x30, 0xe5, 0x08, 0x00, 0x30, 0xe7, - 0x08, 0x00, 0xb0, 0xe8, 0x08, 0x00, 0xf6, 0xe9, 0x08, 0x00, 0xf7, 0xe9, - 0x08, 0x00, 0xf8, 0xe9, 0x08, 0x00, 0xfc, 0xe9, 0x08, 0x00, 0xfe, 0xe9, - 0x08, 0x00, 0xff, 0xe9, 0x08, 0x00, 0x30, 0xeb, 0x08, 0x00, 0xf0, 0xeb, - 0x08, 0x00, 0xf0, 0xec, 0x08, 0x00, 0xf1, 0xec, 0x08, 0x00, 0xf9, 0xec, - 0x08, 0x00, 0xfd, 0xec, 0x08, 0x00, 0xf0, 0xed, 0x08, 0x00, 0xf6, 0xee, - 0x08, 0x00, 0xf7, 0xee, 0x08, 0x00, 0xf8, 0xee, 0x08, 0x00, 0xfc, 0xee, - 0x08, 0x00, 0xfe, 0xee, 0x08, 0x00, 0xff, 0xee, 0x08, 0x00, 0xf0, 0xef, - 0x08, 0x00, 0xf1, 0xef, 0x08, 0x00, 0xf9, 0xef, 0x08, 0x00, 0xfd, 0xef, - 0x08, 0x00, 0x47, 0xf0, 0x08, 0x00, 0x4b, 0xf0, 0x08, 0x00, 0xb0, 0xf0, - 0x08, 0x00, 0xf0, 0xf1, 0x08, 0x00, 0xf1, 0xf1, 0x08, 0x00, 0xf9, 0xf1, - 0x08, 0x00, 0xfd, 0xf1, 0x08, 0x00, 0x30, 0xf3, 0x08, 0x00, 0xd0, 0xf3, - 0x08, 0x00, 0xe6, 0xf3, 0x08, 0x00, 0xf0, 0xf3, 0x08, 0x00, 0xb0, 0xf4, - 0x08, 0x00, 0xf0, 0xf4, 0x08, 0x00, 0xf1, 0xf4, 0x08, 0x00, 0xf9, 0xf4, - 0x08, 0x00, 0xfd, 0xf4, 0x08, 0x00, 0xb0, 0xf6, 0x08, 0x00, 0xf0, 0xf6, - 0x08, 0x00, 0xf1, 0xf6, 0x08, 0x00, 0xf9, 0xf6, 0x08, 0x00, 0xfd, 0xf6, - 0x08, 0x00, 0x86, 0xf7, 0x08, 0x00, 0xf0, 0xf7, 0x08, 0x00, 0xf1, 0xf7, - 0x08, 0x00, 0xf9, 0xf7, 0x08, 0x00, 0xfd, 0xf7, 0x08, 0x00, 0x30, 0xf9, - 0x08, 0x00, 0x30, 0xfb, 0x08, 0x00, 0xe6, 0xfb, 0x08, 0x00, 0xf0, 0xfb, - 0x08, 0x00, 0x30, 0xfd, 0x08, 0x00, 0x78, 0xfe, 0x08, 0x00, 0x7c, 0xfe, - 0x08, 0x00, 0x7e, 0xfe, 0x08, 0x00, 0x7f, 0xfe, 0x08, 0x00, 0x30, 0xff, - 0x08, 0x00, 0x90, 0xff, 0x08, 0x00, 0x99, 0xff, 0x08, 0x00, 0x9d, 0xff, - 0x08, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x08, 0x00, 0xdd, 0xff, - 0x08, 0x00, 0xf3, 0x00, 0x09, 0x00, 0xfb, 0x00, 0x09, 0x00, 0xf3, 0x01, - 0x09, 0x00, 0xfb, 0x01, 0x09, 0x00, 0xf3, 0x02, 0x09, 0x00, 0xfb, 0x02, - 0x09, 0x00, 0x58, 0x05, 0x09, 0x00, 0x5c, 0x05, 0x09, 0x00, 0x5e, 0x05, - 0x09, 0x00, 0x5f, 0x05, 0x09, 0x00, 0xf4, 0x07, 0x09, 0x00, 0xf5, 0x07, - 0x09, 0x00, 0xf8, 0x07, 0x09, 0x00, 0xfc, 0x07, 0x09, 0x00, 0xfe, 0x07, - 0x09, 0x00, 0xff, 0x07, 0x09, 0x00, 0xf3, 0x08, 0x09, 0x00, 0xfb, 0x08, - 0x09, 0x00, 0xf4, 0x0b, 0x09, 0x00, 0xf5, 0x0b, 0x09, 0x00, 0xf8, 0x0b, - 0x09, 0x00, 0xfc, 0x0b, 0x09, 0x00, 0xfe, 0x0b, 0x09, 0x00, 0xff, 0x0b, - 0x09, 0x00, 0xf4, 0x0c, 0x09, 0x00, 0xf5, 0x0c, 0x09, 0x00, 0xf8, 0x0c, - 0x09, 0x00, 0xfc, 0x0c, 0x09, 0x00, 0xfe, 0x0c, 0x09, 0x00, 0xff, 0x0c, - 0x09, 0x00, 0xf4, 0x11, 0x09, 0x00, 0xf5, 0x11, 0x09, 0x00, 0xf8, 0x11, - 0x09, 0x00, 0xfc, 0x11, 0x09, 0x00, 0xfe, 0x11, 0x09, 0x00, 0xff, 0x11, - 0x09, 0x00, 0xf4, 0x14, 0x09, 0x00, 0xf5, 0x14, 0x09, 0x00, 0xf8, 0x14, - 0x09, 0x00, 0xfc, 0x14, 0x09, 0x00, 0xfe, 0x14, 0x09, 0x00, 0xff, 0x14, - 0x09, 0x00, 0xf4, 0x1f, 0x09, 0x00, 0xf5, 0x1f, 0x09, 0x00, 0xf8, 0x1f, - 0x09, 0x00, 0xfc, 0x1f, 0x09, 0x00, 0xfe, 0x1f, 0x09, 0x00, 0xff, 0x1f, - 0x09, 0x00, 0xcb, 0x25, 0x09, 0x00, 0xf8, 0x29, 0x09, 0x00, 0xfc, 0x29, - 0x09, 0x00, 0xfe, 0x29, 0x09, 0x00, 0xff, 0x29, 0x09, 0x00, 0x88, 0x33, - 0x09, 0x00, 0x8b, 0x33, 0x09, 0x00, 0xc7, 0x35, 0x09, 0x00, 0xf7, 0x35, - 0x09, 0x00, 0xf8, 0x35, 0x09, 0x00, 0xfc, 0x35, 0x09, 0x00, 0xfe, 0x35, - 0x09, 0x00, 0xff, 0x35, 0x09, 0x00, 0xcb, 0x39, 0x09, 0x00, 0xf0, 0x39, - 0x09, 0x00, 0xf1, 0x39, 0x09, 0x00, 0xf9, 0x39, 0x09, 0x00, 0xfd, 0x39, - 0x09, 0x00, 0xcb, 0x3d, 0x09, 0x00, 0xf0, 0x3d, 0x09, 0x00, 0xf1, 0x3d, - 0x09, 0x00, 0xf9, 0x3d, 0x09, 0x00, 0xfd, 0x3d, 0x09, 0x00, 0x88, 0x3f, - 0x09, 0x00, 0x8b, 0x3f, 0x09, 0x00, 0x30, 0x40, 0x09, 0x00, 0x30, 0x41, - 0x09, 0x00, 0xf0, 0x41, 0x09, 0x00, 0xf1, 0x41, 0x09, 0x00, 0xf9, 0x41, - 0x09, 0x00, 0xfd, 0x41, 0x09, 0x00, 0x30, 0x42, 0x09, 0x00, 0xf6, 0x43, - 0x09, 0x00, 0xf7, 0x43, 0x09, 0x00, 0xf8, 0x43, 0x09, 0x00, 0xfc, 0x43, - 0x09, 0x00, 0xfe, 0x43, 0x09, 0x00, 0xff, 0x43, 0x09, 0x00, 0xb0, 0x46, - 0x09, 0x00, 0x51, 0x49, 0x09, 0x00, 0x56, 0x49, 0x09, 0x00, 0x57, 0x49, - 0x09, 0x00, 0x58, 0x49, 0x09, 0x00, 0x5c, 0x49, 0x09, 0x00, 0x5e, 0x49, - 0x09, 0x00, 0x5f, 0x49, 0x09, 0x00, 0xf0, 0x49, 0x09, 0x00, 0xf1, 0x49, - 0x09, 0x00, 0xf9, 0x49, 0x09, 0x00, 0xfd, 0x49, 0x09, 0x00, 0xf0, 0x4f, - 0x09, 0x00, 0xf1, 0x4f, 0x09, 0x00, 0xf9, 0x4f, 0x09, 0x00, 0xfd, 0x4f, - 0x09, 0x00, 0x30, 0x53, 0x09, 0x00, 0xf0, 0x53, 0x09, 0x00, 0xf1, 0x53, - 0x09, 0x00, 0xf9, 0x53, 0x09, 0x00, 0xfd, 0x53, 0x09, 0x00, 0xf6, 0x59, - 0x09, 0x00, 0xf7, 0x59, 0x09, 0x00, 0xf8, 0x59, 0x09, 0x00, 0xfc, 0x59, - 0x09, 0x00, 0xfe, 0x59, 0x09, 0x00, 0xff, 0x59, 0x09, 0x00, 0xf6, 0x5d, - 0x09, 0x00, 0xf7, 0x5d, 0x09, 0x00, 0xf8, 0x5d, 0x09, 0x00, 0xfc, 0x5d, - 0x09, 0x00, 0xfe, 0x5d, 0x09, 0x00, 0xff, 0x5d, 0x09, 0x00, 0x30, 0x5f, - 0x09, 0x00, 0xf0, 0x5f, 0x09, 0x00, 0xf1, 0x5f, 0x09, 0x00, 0xf9, 0x5f, - 0x09, 0x00, 0xfd, 0x5f, 0x09, 0x00, 0xf4, 0x61, 0x09, 0x00, 0xf5, 0x61, - 0x09, 0x00, 0xf8, 0x61, 0x09, 0x00, 0xfc, 0x61, 0x09, 0x00, 0xfe, 0x61, - 0x09, 0x00, 0xff, 0x61, 0x09, 0x00, 0xf3, 0x69, 0x09, 0x00, 0xfb, 0x69, - 0x09, 0x00, 0xf8, 0x6a, 0x09, 0x00, 0xfc, 0x6a, 0x09, 0x00, 0xfe, 0x6a, - 0x09, 0x00, 0xff, 0x6a, 0x09, 0x00, 0xf4, 0x6f, 0x09, 0x00, 0xf5, 0x6f, - 0x09, 0x00, 0xf8, 0x6f, 0x09, 0x00, 0xfc, 0x6f, 0x09, 0x00, 0xfe, 0x6f, - 0x09, 0x00, 0xff, 0x6f, 0x09, 0x00, 0xcb, 0x72, 0x09, 0x00, 0xeb, 0x72, - 0x09, 0x00, 0xf8, 0x72, 0x09, 0x00, 0xfc, 0x72, 0x09, 0x00, 0xfe, 0x72, - 0x09, 0x00, 0xff, 0x72, 0x09, 0x00, 0xf3, 0x77, 0x09, 0x00, 0xfb, 0x77, - 0x09, 0x00, 0xe8, 0x7c, 0x09, 0x00, 0xeb, 0x7c, 0x09, 0x00, 0xf8, 0x7c, - 0x09, 0x00, 0xfc, 0x7c, 0x09, 0x00, 0xfe, 0x7c, 0x09, 0x00, 0xff, 0x7c, - 0x09, 0x00, 0xeb, 0x7e, 0x09, 0x00, 0xf8, 0x7e, 0x09, 0x00, 0xfc, 0x7e, - 0x09, 0x00, 0xfe, 0x7e, 0x09, 0x00, 0xff, 0x7e, 0x09, 0x00, 0xb7, 0x80, - 0x09, 0x00, 0xf7, 0x83, 0x09, 0x00, 0xb1, 0x84, 0x09, 0x00, 0xb9, 0x84, - 0x09, 0x00, 0x31, 0x85, 0x09, 0x00, 0x39, 0x85, 0x09, 0x00, 0x37, 0x86, - 0x09, 0x00, 0x38, 0x86, 0x09, 0x00, 0x3c, 0x86, 0x09, 0x00, 0x3e, 0x86, - 0x09, 0x00, 0x3f, 0x86, 0x09, 0x00, 0xb1, 0x86, 0x09, 0x00, 0xb9, 0x86, - 0x09, 0x00, 0x37, 0x87, 0x09, 0x00, 0x47, 0x87, 0x09, 0x00, 0x4b, 0x87, - 0x09, 0x00, 0xb1, 0x87, 0x09, 0x00, 0xb9, 0x87, 0x09, 0x00, 0xf1, 0x87, - 0x09, 0x00, 0xf9, 0x87, 0x09, 0x00, 0xb1, 0x88, 0x09, 0x00, 0xb7, 0x88, - 0x09, 0x00, 0xb9, 0x88, 0x09, 0x00, 0xb1, 0x8b, 0x09, 0x00, 0xb7, 0x8b, - 0x09, 0x00, 0xb9, 0x8b, 0x09, 0x00, 0xf1, 0x8b, 0x09, 0x00, 0xf7, 0x8b, - 0x09, 0x00, 0xf9, 0x8b, 0x09, 0x00, 0x38, 0x9e, 0x09, 0x00, 0x3c, 0x9e, - 0x09, 0x00, 0x3e, 0x9e, 0x09, 0x00, 0x3f, 0x9e, 0x09, 0x00, 0xb8, 0xa4, - 0x09, 0x00, 0xbc, 0xa4, 0x09, 0x00, 0xbe, 0xa4, 0x09, 0x00, 0xbf, 0xa4, - 0x09, 0x00, 0x4b, 0xa6, 0x09, 0x00, 0x38, 0xa7, 0x09, 0x00, 0x3c, 0xa7, - 0x09, 0x00, 0x3e, 0xa7, 0x09, 0x00, 0x3f, 0xa7, 0x09, 0x00, 0xb8, 0xa7, - 0x09, 0x00, 0xbc, 0xa7, 0x09, 0x00, 0xbe, 0xa7, 0x09, 0x00, 0xbf, 0xa7, - 0x09, 0x00, 0xeb, 0xa7, 0x09, 0x00, 0xf8, 0xab, 0x09, 0x00, 0xfc, 0xab, - 0x09, 0x00, 0xfe, 0xab, 0x09, 0x00, 0xff, 0xab, 0x09, 0x00, 0xcb, 0xaf, - 0x09, 0x00, 0xeb, 0xaf, 0x09, 0x00, 0xf8, 0xaf, 0x09, 0x00, 0xfc, 0xaf, - 0x09, 0x00, 0xfe, 0xaf, 0x09, 0x00, 0xff, 0xaf, 0x09, 0x00, 0xb8, 0xb0, - 0x09, 0x00, 0xbc, 0xb0, 0x09, 0x00, 0xbe, 0xb0, 0x09, 0x00, 0xbf, 0xb0, - 0x09, 0x00, 0x4b, 0xb2, 0x09, 0x00, 0x38, 0xb3, 0x09, 0x00, 0x3c, 0xb3, - 0x09, 0x00, 0x3e, 0xb3, 0x09, 0x00, 0x3f, 0xb3, 0x09, 0x00, 0xb8, 0xb3, - 0x09, 0x00, 0xbc, 0xb3, 0x09, 0x00, 0xbe, 0xb3, 0x09, 0x00, 0xbf, 0xb3, - 0x09, 0x00, 0xeb, 0xb3, 0x09, 0x00, 0xf0, 0xb3, 0x09, 0x00, 0xf1, 0xb3, - 0x09, 0x00, 0xf7, 0xb3, 0x09, 0x00, 0xf9, 0xb3, 0x09, 0x00, 0xfd, 0xb3, - 0x09, 0x00, 0xb0, 0xb4, 0x09, 0x00, 0xb1, 0xb4, 0x09, 0x00, 0xb7, 0xb4, - 0x09, 0x00, 0xb9, 0xb4, 0x09, 0x00, 0xbd, 0xb4, 0x09, 0x00, 0xeb, 0xb7, - 0x09, 0x00, 0xf0, 0xb7, 0x09, 0x00, 0xf1, 0xb7, 0x09, 0x00, 0xf7, 0xb7, - 0x09, 0x00, 0xf9, 0xb7, 0x09, 0x00, 0xfd, 0xb7, 0x09, 0x00, 0xb0, 0xb8, - 0x09, 0x00, 0xb1, 0xb8, 0x09, 0x00, 0xb7, 0xb8, 0x09, 0x00, 0xb9, 0xb8, - 0x09, 0x00, 0xbd, 0xb8, 0x09, 0x00, 0x38, 0xbb, 0x09, 0x00, 0x3c, 0xbb, - 0x09, 0x00, 0x3e, 0xbb, 0x09, 0x00, 0x3f, 0xbb, 0x09, 0x00, 0xb0, 0xbb, - 0x09, 0x00, 0xb1, 0xbb, 0x09, 0x00, 0xb7, 0xbb, 0x09, 0x00, 0xb9, 0xbb, - 0x09, 0x00, 0xbd, 0xbb, 0x09, 0x00, 0xeb, 0xbb, 0x09, 0x00, 0xf0, 0xbb, - 0x09, 0x00, 0xf1, 0xbb, 0x09, 0x00, 0xf7, 0xbb, 0x09, 0x00, 0xf9, 0xbb, - 0x09, 0x00, 0xfd, 0xbb, 0x09, 0x00, 0x4b, 0xbc, 0x09, 0x00, 0x30, 0xbf, - 0x09, 0x00, 0x31, 0xbf, 0x09, 0x00, 0x37, 0xbf, 0x09, 0x00, 0x39, 0xbf, - 0x09, 0x00, 0x3d, 0xbf, 0x09, 0x00, 0xf8, 0xbf, 0x09, 0x00, 0xfc, 0xbf, - 0x09, 0x00, 0xfe, 0xbf, 0x09, 0x00, 0xff, 0xbf, 0x09, 0x00, 0xf7, 0xc5, - 0x09, 0x00, 0xcb, 0xdd, 0x09, 0x00, 0xf1, 0xe9, 0x09, 0x00, 0xf9, 0xe9, - 0x09, 0x00, 0xf1, 0xed, 0x09, 0x00, 0xf9, 0xed, 0x09, 0x00, 0xf8, 0xfc, - 0x09, 0x00, 0xfc, 0xfc, 0x09, 0x00, 0xfe, 0xfc, 0x09, 0x00, 0xff, 0xfc, - 0x09, 0x00, 0x31, 0xff, 0x09, 0x00, 0x37, 0xff, 0x09, 0x00, 0x39, 0xff, - 0x09, 0x00, 0xb8, 0x01, 0x0a, 0x00, 0xbc, 0x01, 0x0a, 0x00, 0xbe, 0x01, - 0x0a, 0x00, 0xbf, 0x01, 0x0a, 0x00, 0xb8, 0x04, 0x0a, 0x00, 0xbc, 0x04, - 0x0a, 0x00, 0xbe, 0x04, 0x0a, 0x00, 0xbf, 0x04, 0x0a, 0x00, 0xf8, 0x05, - 0x0a, 0x00, 0xfc, 0x05, 0x0a, 0x00, 0xfe, 0x05, 0x0a, 0x00, 0xff, 0x05, - 0x0a, 0x00, 0x38, 0x07, 0x0a, 0x00, 0x3c, 0x07, 0x0a, 0x00, 0x3e, 0x07, - 0x0a, 0x00, 0x3f, 0x07, 0x0a, 0x00, 0xb8, 0x07, 0x0a, 0x00, 0xbc, 0x07, - 0x0a, 0x00, 0xbe, 0x07, 0x0a, 0x00, 0xbf, 0x07, 0x0a, 0x00, 0x38, 0x08, - 0x0a, 0x00, 0x3c, 0x08, 0x0a, 0x00, 0x3e, 0x08, 0x0a, 0x00, 0x3f, 0x08, - 0x0a, 0x00, 0xb8, 0x0a, 0x0a, 0x00, 0xbc, 0x0a, 0x0a, 0x00, 0xbe, 0x0a, - 0x0a, 0x00, 0xbf, 0x0a, 0x0a, 0x00, 0xe8, 0x0b, 0x0a, 0x00, 0xeb, 0x0b, - 0x0a, 0x00, 0xf8, 0x0b, 0x0a, 0x00, 0xfc, 0x0b, 0x0a, 0x00, 0xfe, 0x0b, - 0x0a, 0x00, 0xff, 0x0b, 0x0a, 0x00, 0xf8, 0x10, 0x0a, 0x00, 0xfc, 0x10, - 0x0a, 0x00, 0xfe, 0x10, 0x0a, 0x00, 0xff, 0x10, 0x0a, 0x00, 0xb8, 0x11, - 0x0a, 0x00, 0xbc, 0x11, 0x0a, 0x00, 0xbe, 0x11, 0x0a, 0x00, 0xbf, 0x11, - 0x0a, 0x00, 0xf8, 0x13, 0x0a, 0x00, 0xfc, 0x13, 0x0a, 0x00, 0xfe, 0x13, - 0x0a, 0x00, 0xff, 0x13, 0x0a, 0x00, 0xe8, 0x14, 0x0a, 0x00, 0xeb, 0x14, - 0x0a, 0x00, 0xf8, 0x14, 0x0a, 0x00, 0xfc, 0x14, 0x0a, 0x00, 0xfe, 0x14, - 0x0a, 0x00, 0xff, 0x14, 0x0a, 0x00, 0xeb, 0x16, 0x0a, 0x00, 0xf8, 0x16, - 0x0a, 0x00, 0xfc, 0x16, 0x0a, 0x00, 0xfe, 0x16, 0x0a, 0x00, 0xff, 0x16, - 0x0a, 0x00, 0x88, 0x17, 0x0a, 0x00, 0x8b, 0x17, 0x0a, 0x00, 0xc8, 0x17, - 0x0a, 0x00, 0xcb, 0x17, 0x0a, 0x00, 0xe8, 0x17, 0x0a, 0x00, 0xeb, 0x17, - 0x0a, 0x00, 0xf8, 0x17, 0x0a, 0x00, 0xfc, 0x17, 0x0a, 0x00, 0xfe, 0x17, - 0x0a, 0x00, 0xff, 0x17, 0x0a, 0x00, 0x38, 0x19, 0x0a, 0x00, 0x3c, 0x19, - 0x0a, 0x00, 0x3e, 0x19, 0x0a, 0x00, 0x3f, 0x19, 0x0a, 0x00, 0xe8, 0x1b, - 0x0a, 0x00, 0xeb, 0x1b, 0x0a, 0x00, 0x38, 0x22, 0x0a, 0x00, 0x3c, 0x22, - 0x0a, 0x00, 0x3e, 0x22, 0x0a, 0x00, 0x3f, 0x22, 0x0a, 0x00, 0xc8, 0x22, - 0x0a, 0x00, 0xcb, 0x22, 0x0a, 0x00, 0xe8, 0x22, 0x0a, 0x00, 0xeb, 0x22, - 0x0a, 0x00, 0xf8, 0x22, 0x0a, 0x00, 0xfc, 0x22, 0x0a, 0x00, 0xfe, 0x22, - 0x0a, 0x00, 0xff, 0x22, 0x0a, 0x00, 0xe8, 0x23, 0x0a, 0x00, 0xeb, 0x23, - 0x0a, 0x00, 0xf8, 0x23, 0x0a, 0x00, 0xfc, 0x23, 0x0a, 0x00, 0xfe, 0x23, - 0x0a, 0x00, 0xff, 0x23, 0x0a, 0x00, 0x58, 0x29, 0x0a, 0x00, 0x5c, 0x29, - 0x0a, 0x00, 0x5e, 0x29, 0x0a, 0x00, 0x5f, 0x29, 0x0a, 0x00, 0xf8, 0x29, - 0x0a, 0x00, 0xfc, 0x29, 0x0a, 0x00, 0xfe, 0x29, 0x0a, 0x00, 0xff, 0x29, - 0x0a, 0x00, 0x58, 0x2d, 0x0a, 0x00, 0x5c, 0x2d, 0x0a, 0x00, 0x5e, 0x2d, - 0x0a, 0x00, 0x5f, 0x2d, 0x0a, 0x00, 0xf8, 0x2d, 0x0a, 0x00, 0xfc, 0x2d, - 0x0a, 0x00, 0xfe, 0x2d, 0x0a, 0x00, 0xff, 0x2d, 0x0a, 0x00, 0x38, 0x2f, - 0x0a, 0x00, 0x3c, 0x2f, 0x0a, 0x00, 0x3e, 0x2f, 0x0a, 0x00, 0x3f, 0x2f, - 0x0a, 0x00, 0x30, 0x35, 0x0a, 0x00, 0x31, 0x35, 0x0a, 0x00, 0x39, 0x35, - 0x0a, 0x00, 0x3d, 0x35, 0x0a, 0x00, 0x50, 0x35, 0x0a, 0x00, 0x51, 0x35, - 0x0a, 0x00, 0x56, 0x35, 0x0a, 0x00, 0x57, 0x35, 0x0a, 0x00, 0x59, 0x35, - 0x0a, 0x00, 0x5d, 0x35, 0x0a, 0x00, 0xf7, 0x35, 0x0a, 0x00, 0xf8, 0x35, - 0x0a, 0x00, 0xfc, 0x35, 0x0a, 0x00, 0xfe, 0x35, 0x0a, 0x00, 0xff, 0x35, - 0x0a, 0x00, 0xb8, 0x3d, 0x0a, 0x00, 0xbc, 0x3d, 0x0a, 0x00, 0xbe, 0x3d, - 0x0a, 0x00, 0xbf, 0x3d, 0x0a, 0x00, 0x88, 0x3f, 0x0a, 0x00, 0x8b, 0x3f, - 0x0a, 0x00, 0xc6, 0x3f, 0x0a, 0x00, 0xc7, 0x3f, 0x0a, 0x00, 0xc8, 0x3f, - 0x0a, 0x00, 0xcb, 0x3f, 0x0a, 0x00, 0xe6, 0x3f, 0x0a, 0x00, 0xe7, 0x3f, - 0x0a, 0x00, 0xe8, 0x3f, 0x0a, 0x00, 0xeb, 0x3f, 0x0a, 0x00, 0xf6, 0x3f, - 0x0a, 0x00, 0xf7, 0x3f, 0x0a, 0x00, 0xf8, 0x3f, 0x0a, 0x00, 0xfc, 0x3f, - 0x0a, 0x00, 0xfe, 0x3f, 0x0a, 0x00, 0xff, 0x3f, 0x0a, 0x00, 0xb0, 0x40, - 0x0a, 0x00, 0xb1, 0x40, 0x0a, 0x00, 0xb9, 0x40, 0x0a, 0x00, 0xbd, 0x40, - 0x0a, 0x00, 0xf7, 0x41, 0x0a, 0x00, 0xf8, 0x41, 0x0a, 0x00, 0xfc, 0x41, - 0x0a, 0x00, 0xfe, 0x41, 0x0a, 0x00, 0xff, 0x41, 0x0a, 0x00, 0xb0, 0x44, - 0x0a, 0x00, 0xb1, 0x44, 0x0a, 0x00, 0xb9, 0x44, 0x0a, 0x00, 0xbd, 0x44, - 0x0a, 0x00, 0xf7, 0x45, 0x0a, 0x00, 0xf8, 0x45, 0x0a, 0x00, 0xfc, 0x45, - 0x0a, 0x00, 0xfe, 0x45, 0x0a, 0x00, 0xff, 0x45, 0x0a, 0x00, 0xb0, 0x46, - 0x0a, 0x00, 0xb1, 0x46, 0x0a, 0x00, 0xb9, 0x46, 0x0a, 0x00, 0xbd, 0x46, - 0x0a, 0x00, 0xf0, 0x47, 0x0a, 0x00, 0xf1, 0x47, 0x0a, 0x00, 0xf9, 0x47, - 0x0a, 0x00, 0xfd, 0x47, 0x0a, 0x00, 0xb8, 0x4c, 0x0a, 0x00, 0xbc, 0x4c, - 0x0a, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0xbf, 0x4c, 0x0a, 0x00, 0x8b, 0x4f, - 0x0a, 0x00, 0xcb, 0x4f, 0x0a, 0x00, 0xeb, 0x4f, 0x0a, 0x00, 0xf0, 0x4f, - 0x0a, 0x00, 0xf1, 0x4f, 0x0a, 0x00, 0xf7, 0x4f, 0x0a, 0x00, 0xf9, 0x4f, - 0x0a, 0x00, 0xfd, 0x4f, 0x0a, 0x00, 0x30, 0x53, 0x0a, 0x00, 0x31, 0x53, - 0x0a, 0x00, 0x39, 0x53, 0x0a, 0x00, 0x3d, 0x53, 0x0a, 0x00, 0xc7, 0x53, - 0x0a, 0x00, 0xcb, 0x53, 0x0a, 0x00, 0xf7, 0x53, 0x0a, 0x00, 0xf8, 0x53, - 0x0a, 0x00, 0xfc, 0x53, 0x0a, 0x00, 0xfe, 0x53, 0x0a, 0x00, 0xff, 0x53, - 0x0a, 0x00, 0x37, 0x59, 0x0a, 0x00, 0x38, 0x59, 0x0a, 0x00, 0x3c, 0x59, - 0x0a, 0x00, 0x3e, 0x59, 0x0a, 0x00, 0x3f, 0x59, 0x0a, 0x00, 0xb8, 0x59, - 0x0a, 0x00, 0xbc, 0x59, 0x0a, 0x00, 0xbe, 0x59, 0x0a, 0x00, 0xbf, 0x59, - 0x0a, 0x00, 0x30, 0x5d, 0x0a, 0x00, 0x31, 0x5d, 0x0a, 0x00, 0x39, 0x5d, - 0x0a, 0x00, 0x3d, 0x5d, 0x0a, 0x00, 0x37, 0x5f, 0x0a, 0x00, 0x38, 0x5f, - 0x0a, 0x00, 0x3c, 0x5f, 0x0a, 0x00, 0x3e, 0x5f, 0x0a, 0x00, 0x3f, 0x5f, - 0x0a, 0x00, 0xb8, 0x5f, 0x0a, 0x00, 0xbc, 0x5f, 0x0a, 0x00, 0xbe, 0x5f, - 0x0a, 0x00, 0xbf, 0x5f, 0x0a, 0x00, 0xeb, 0x64, 0x0a, 0x00, 0xeb, 0x66, - 0x0a, 0x00, 0xf8, 0x7c, 0x0a, 0x00, 0xfc, 0x7c, 0x0a, 0x00, 0xfe, 0x7c, - 0x0a, 0x00, 0xff, 0x7c, 0x0a, 0x00, 0x37, 0x80, 0x0a, 0x00, 0xf1, 0x80, - 0x0a, 0x00, 0xf9, 0x80, 0x0a, 0x00, 0xb1, 0x81, 0x0a, 0x00, 0xb9, 0x81, - 0x0a, 0x00, 0xf1, 0x81, 0x0a, 0x00, 0xf9, 0x81, 0x0a, 0x00, 0xf7, 0x82, - 0x0a, 0x00, 0xb1, 0x84, 0x0a, 0x00, 0xb9, 0x84, 0x0a, 0x00, 0x31, 0x85, - 0x0a, 0x00, 0x39, 0x85, 0x0a, 0x00, 0x37, 0x86, 0x0a, 0x00, 0x38, 0x86, - 0x0a, 0x00, 0x3c, 0x86, 0x0a, 0x00, 0x3e, 0x86, 0x0a, 0x00, 0x3f, 0x86, - 0x0a, 0x00, 0xb1, 0x86, 0x0a, 0x00, 0xb9, 0x86, 0x0a, 0x00, 0x37, 0x87, - 0x0a, 0x00, 0x47, 0x87, 0x0a, 0x00, 0x4b, 0x87, 0x0a, 0x00, 0xb1, 0x87, - 0x0a, 0x00, 0xb9, 0x87, 0x0a, 0x00, 0xf1, 0x87, 0x0a, 0x00, 0xf9, 0x87, - 0x0a, 0x00, 0xb1, 0x8b, 0x0a, 0x00, 0xb7, 0x8b, 0x0a, 0x00, 0xb9, 0x8b, - 0x0a, 0x00, 0xf1, 0x8b, 0x0a, 0x00, 0xf7, 0x8b, 0x0a, 0x00, 0xf9, 0x8b, - 0x0a, 0x00, 0xf1, 0x8c, 0x0a, 0x00, 0xf7, 0x8c, 0x0a, 0x00, 0xf9, 0x8c, - 0x0a, 0x00, 0x38, 0x9e, 0x0a, 0x00, 0x3c, 0x9e, 0x0a, 0x00, 0x3e, 0x9e, - 0x0a, 0x00, 0x3f, 0x9e, 0x0a, 0x00, 0x4b, 0xa6, 0x0a, 0x00, 0x4b, 0xa7, - 0x0a, 0x00, 0xb1, 0xb0, 0x0a, 0x00, 0xb7, 0xb0, 0x0a, 0x00, 0xb9, 0xb0, - 0x0a, 0x00, 0x4b, 0xb2, 0x0a, 0x00, 0x4b, 0xb3, 0x0a, 0x00, 0xf1, 0xb3, - 0x0a, 0x00, 0xf7, 0xb3, 0x0a, 0x00, 0xf9, 0xb3, 0x0a, 0x00, 0xb1, 0xb8, - 0x0a, 0x00, 0xb7, 0xb8, 0x0a, 0x00, 0xb9, 0xb8, 0x0a, 0x00, 0xb1, 0xbb, - 0x0a, 0x00, 0xb7, 0xbb, 0x0a, 0x00, 0xb9, 0xbb, 0x0a, 0x00, 0xf1, 0xbb, - 0x0a, 0x00, 0xf7, 0xbb, 0x0a, 0x00, 0xf9, 0xbb, 0x0a, 0x00, 0x31, 0xbf, - 0x0a, 0x00, 0x37, 0xbf, 0x0a, 0x00, 0x39, 0xbf, 0x0a, 0x00, 0x36, 0xc2, - 0x0a, 0x00, 0x37, 0xc2, 0x0a, 0x00, 0x38, 0xc2, 0x0a, 0x00, 0x3c, 0xc2, - 0x0a, 0x00, 0x3e, 0xc2, 0x0a, 0x00, 0x3f, 0xc2, 0x0a, 0x00, 0x48, 0xc2, - 0x0a, 0x00, 0x4b, 0xc2, 0x0a, 0x00, 0x30, 0xc3, 0x0a, 0x00, 0x31, 0xc3, - 0x0a, 0x00, 0x39, 0xc3, 0x0a, 0x00, 0x3d, 0xc3, 0x0a, 0x00, 0x48, 0xc3, - 0x0a, 0x00, 0x4b, 0xc3, 0x0a, 0x00, 0xe6, 0xc3, 0x0a, 0x00, 0xe7, 0xc3, - 0x0a, 0x00, 0xe8, 0xc3, 0x0a, 0x00, 0xeb, 0xc3, 0x0a, 0x00, 0xf6, 0xc3, - 0x0a, 0x00, 0xf7, 0xc3, 0x0a, 0x00, 0xf8, 0xc3, 0x0a, 0x00, 0xfc, 0xc3, - 0x0a, 0x00, 0xfe, 0xc3, 0x0a, 0x00, 0xff, 0xc3, 0x0a, 0x00, 0xc6, 0xc5, - 0x0a, 0x00, 0xc7, 0xc5, 0x0a, 0x00, 0xc8, 0xc5, 0x0a, 0x00, 0xcb, 0xc5, - 0x0a, 0x00, 0xf6, 0xc5, 0x0a, 0x00, 0xf7, 0xc5, 0x0a, 0x00, 0xf8, 0xc5, - 0x0a, 0x00, 0xfc, 0xc5, 0x0a, 0x00, 0xfe, 0xc5, 0x0a, 0x00, 0xff, 0xc5, - 0x0a, 0x00, 0x37, 0xc9, 0x0a, 0x00, 0x38, 0xc9, 0x0a, 0x00, 0x3c, 0xc9, - 0x0a, 0x00, 0x3e, 0xc9, 0x0a, 0x00, 0x3f, 0xc9, 0x0a, 0x00, 0x58, 0xc9, - 0x0a, 0x00, 0x5c, 0xc9, 0x0a, 0x00, 0x5e, 0xc9, 0x0a, 0x00, 0x5f, 0xc9, - 0x0a, 0x00, 0xb8, 0xc9, 0x0a, 0x00, 0xbc, 0xc9, 0x0a, 0x00, 0xbe, 0xc9, - 0x0a, 0x00, 0xbf, 0xc9, 0x0a, 0x00, 0x30, 0xcc, 0x0a, 0x00, 0xb8, 0xcc, - 0x0a, 0x00, 0xbc, 0xcc, 0x0a, 0x00, 0xbe, 0xcc, 0x0a, 0x00, 0xbf, 0xcc, - 0x0a, 0x00, 0x30, 0xcd, 0x0a, 0x00, 0x50, 0xcd, 0x0a, 0x00, 0x58, 0xcd, - 0x0a, 0x00, 0x5c, 0xcd, 0x0a, 0x00, 0x5e, 0xcd, 0x0a, 0x00, 0x5f, 0xcd, - 0x0a, 0x00, 0xb8, 0xce, 0x0a, 0x00, 0xbc, 0xce, 0x0a, 0x00, 0xbe, 0xce, - 0x0a, 0x00, 0xbf, 0xce, 0x0a, 0x00, 0xc9, 0xcf, 0x0a, 0x00, 0xca, 0xcf, - 0x0a, 0x00, 0xe9, 0xcf, 0x0a, 0x00, 0xea, 0xcf, 0x0a, 0x00, 0xf0, 0xcf, - 0x0a, 0x00, 0xf1, 0xcf, 0x0a, 0x00, 0xf9, 0xcf, 0x0a, 0x00, 0xfd, 0xcf, - 0x0a, 0x00, 0xc8, 0xdd, 0x0a, 0x00, 0xcb, 0xdd, 0x0a, 0x00, 0xf8, 0xdd, - 0x0a, 0x00, 0xfc, 0xdd, 0x0a, 0x00, 0xfe, 0xdd, 0x0a, 0x00, 0xff, 0xdd, - 0x0a, 0x00, 0x30, 0xe3, 0x0a, 0x00, 0x48, 0xe3, 0x0a, 0x00, 0x4b, 0xe3, - 0x0a, 0x00, 0xf0, 0xe3, 0x0a, 0x00, 0xf1, 0xe3, 0x0a, 0x00, 0xf9, 0xe3, - 0x0a, 0x00, 0xfd, 0xe3, 0x0a, 0x00, 0xf7, 0xe5, 0x0a, 0x00, 0xf8, 0xe5, - 0x0a, 0x00, 0xfc, 0xe5, 0x0a, 0x00, 0xfe, 0xe5, 0x0a, 0x00, 0xff, 0xe5, - 0x0a, 0x00, 0x30, 0xe9, 0x0a, 0x00, 0x31, 0xe9, 0x0a, 0x00, 0x39, 0xe9, - 0x0a, 0x00, 0x3d, 0xe9, 0x0a, 0x00, 0x58, 0xe9, 0x0a, 0x00, 0x5c, 0xe9, - 0x0a, 0x00, 0x5e, 0xe9, 0x0a, 0x00, 0x5f, 0xe9, 0x0a, 0x00, 0xb8, 0xec, - 0x0a, 0x00, 0xbc, 0xec, 0x0a, 0x00, 0xbe, 0xec, 0x0a, 0x00, 0xbf, 0xec, - 0x0a, 0x00, 0x50, 0xed, 0x0a, 0x00, 0x58, 0xed, 0x0a, 0x00, 0x5c, 0xed, - 0x0a, 0x00, 0x5e, 0xed, 0x0a, 0x00, 0x5f, 0xed, 0x0a, 0x00, 0xc9, 0xef, - 0x0a, 0x00, 0xca, 0xef, 0x0a, 0x00, 0xe9, 0xef, 0x0a, 0x00, 0xea, 0xef, - 0x0a, 0x00, 0xf0, 0xef, 0x0a, 0x00, 0xf1, 0xef, 0x0a, 0x00, 0xf9, 0xef, - 0x0a, 0x00, 0xfd, 0xef, 0x0a, 0x00, 0x30, 0xf5, 0x0a, 0x00, 0x50, 0xf5, - 0x0a, 0x00, 0x58, 0xf5, 0x0a, 0x00, 0x5c, 0xf5, 0x0a, 0x00, 0x5e, 0xf5, - 0x0a, 0x00, 0x5f, 0xf5, 0x0a, 0x00, 0xf7, 0xf9, 0x0a, 0x00, 0xf8, 0xf9, - 0x0a, 0x00, 0xfc, 0xf9, 0x0a, 0x00, 0xfe, 0xf9, 0x0a, 0x00, 0xff, 0xf9, - 0x0a, 0x00, 0xf7, 0xfd, 0x0a, 0x00, 0xf8, 0xfd, 0x0a, 0x00, 0xfc, 0xfd, - 0x0a, 0x00, 0xfe, 0xfd, 0x0a, 0x00, 0xff, 0xfd, 0x0a, 0x00, 0x30, 0xff, - 0x0a, 0x00, 0x31, 0xff, 0x0a, 0x00, 0x39, 0xff, 0x0a, 0x00, 0x3d, 0xff, - 0x0a, 0x00, 0xf8, 0x04, 0x0b, 0x00, 0xfc, 0x04, 0x0b, 0x00, 0xfe, 0x04, - 0x0b, 0x00, 0xff, 0x04, 0x0b, 0x00, 0xc8, 0x06, 0x0b, 0x00, 0xcb, 0x06, - 0x0b, 0x00, 0xf4, 0x07, 0x0b, 0x00, 0xf5, 0x07, 0x0b, 0x00, 0xf8, 0x07, - 0x0b, 0x00, 0xfc, 0x07, 0x0b, 0x00, 0xfe, 0x07, 0x0b, 0x00, 0xff, 0x07, - 0x0b, 0x00, 0x78, 0x0b, 0x0b, 0x00, 0x7c, 0x0b, 0x0b, 0x00, 0x7e, 0x0b, - 0x0b, 0x00, 0x7f, 0x0b, 0x0b, 0x00, 0xf4, 0x0c, 0x0b, 0x00, 0xf5, 0x0c, - 0x0b, 0x00, 0xf8, 0x0c, 0x0b, 0x00, 0xfc, 0x0c, 0x0b, 0x00, 0xfe, 0x0c, - 0x0b, 0x00, 0xff, 0x0c, 0x0b, 0x00, 0x23, 0x0f, 0x0b, 0x00, 0x28, 0x0f, - 0x0b, 0x00, 0x2b, 0x0f, 0x0b, 0x00, 0x2c, 0x0f, 0x0b, 0x00, 0x2e, 0x0f, - 0x0b, 0x00, 0x2f, 0x0f, 0x0b, 0x00, 0xf3, 0x0f, 0x0b, 0x00, 0xfb, 0x0f, - 0x0b, 0x00, 0x73, 0x16, 0x0b, 0x00, 0x7b, 0x16, 0x0b, 0x00, 0x74, 0x17, - 0x0b, 0x00, 0x75, 0x17, 0x0b, 0x00, 0x78, 0x17, 0x0b, 0x00, 0x7c, 0x17, - 0x0b, 0x00, 0x7e, 0x17, 0x0b, 0x00, 0x7f, 0x17, 0x0b, 0x00, 0x98, 0x17, - 0x0b, 0x00, 0xd8, 0x17, 0x0b, 0x00, 0xf8, 0x23, 0x0b, 0x00, 0xfc, 0x23, - 0x0b, 0x00, 0xfe, 0x23, 0x0b, 0x00, 0xff, 0x23, 0x0b, 0x00, 0x30, 0x33, - 0x0b, 0x00, 0xd0, 0x33, 0x0b, 0x00, 0xd8, 0x33, 0x0b, 0x00, 0xdc, 0x33, - 0x0b, 0x00, 0xde, 0x33, 0x0b, 0x00, 0xdf, 0x33, 0x0b, 0x00, 0xf0, 0x33, - 0x0b, 0x00, 0xf1, 0x33, 0x0b, 0x00, 0xf9, 0x33, 0x0b, 0x00, 0xfd, 0x33, - 0x0b, 0x00, 0x30, 0x39, 0x0b, 0x00, 0x30, 0x3b, 0x0b, 0x00, 0xf0, 0x3b, - 0x0b, 0x00, 0xf1, 0x3b, 0x0b, 0x00, 0xf9, 0x3b, 0x0b, 0x00, 0xfd, 0x3b, - 0x0b, 0x00, 0x30, 0x3d, 0x0b, 0x00, 0x30, 0x3f, 0x0b, 0x00, 0x90, 0x3f, - 0x0b, 0x00, 0x98, 0x3f, 0x0b, 0x00, 0x9c, 0x3f, 0x0b, 0x00, 0x9e, 0x3f, - 0x0b, 0x00, 0x9f, 0x3f, 0x0b, 0x00, 0xd0, 0x3f, 0x0b, 0x00, 0xd8, 0x3f, - 0x0b, 0x00, 0xdc, 0x3f, 0x0b, 0x00, 0xde, 0x3f, 0x0b, 0x00, 0xdf, 0x3f, - 0x0b, 0x00, 0x30, 0x40, 0x0b, 0x00, 0x30, 0x41, 0x0b, 0x00, 0x4b, 0x43, - 0x0b, 0x00, 0xb0, 0x44, 0x0b, 0x00, 0xb0, 0x46, 0x0b, 0x00, 0xf7, 0x47, - 0x0b, 0x00, 0xf8, 0x47, 0x0b, 0x00, 0xfc, 0x47, 0x0b, 0x00, 0xfe, 0x47, - 0x0b, 0x00, 0xff, 0x47, 0x0b, 0x00, 0x6b, 0x49, 0x0b, 0x00, 0x8b, 0x4b, - 0x0b, 0x00, 0xeb, 0x4c, 0x0b, 0x00, 0xf0, 0x4c, 0x0b, 0x00, 0xf1, 0x4c, - 0x0b, 0x00, 0xf7, 0x4c, 0x0b, 0x00, 0xf9, 0x4c, 0x0b, 0x00, 0xfd, 0x4c, - 0x0b, 0x00, 0x6b, 0x4d, 0x0b, 0x00, 0x0b, 0x4e, 0x0b, 0x00, 0xeb, 0x4e, - 0x0b, 0x00, 0x8b, 0x4f, 0x0b, 0x00, 0xcb, 0x4f, 0x0b, 0x00, 0xeb, 0x4f, - 0x0b, 0x00, 0xf0, 0x4f, 0x0b, 0x00, 0xf1, 0x4f, 0x0b, 0x00, 0xf7, 0x4f, - 0x0b, 0x00, 0xf9, 0x4f, 0x0b, 0x00, 0xfd, 0x4f, 0x0b, 0x00, 0x47, 0x50, - 0x0b, 0x00, 0xcb, 0x50, 0x0b, 0x00, 0xf0, 0x50, 0x0b, 0x00, 0xf1, 0x50, - 0x0b, 0x00, 0xf9, 0x50, 0x0b, 0x00, 0xfd, 0x50, 0x0b, 0x00, 0x47, 0x51, - 0x0b, 0x00, 0xf0, 0x51, 0x0b, 0x00, 0xf1, 0x51, 0x0b, 0x00, 0xf9, 0x51, - 0x0b, 0x00, 0xfd, 0x51, 0x0b, 0x00, 0x78, 0x52, 0x0b, 0x00, 0x7c, 0x52, - 0x0b, 0x00, 0x7e, 0x52, 0x0b, 0x00, 0x7f, 0x52, 0x0b, 0x00, 0xc7, 0x53, - 0x0b, 0x00, 0xf7, 0x53, 0x0b, 0x00, 0xf8, 0x53, 0x0b, 0x00, 0xfc, 0x53, - 0x0b, 0x00, 0xfe, 0x53, 0x0b, 0x00, 0xff, 0x53, 0x0b, 0x00, 0xb0, 0x54, - 0x0b, 0x00, 0xeb, 0x54, 0x0b, 0x00, 0xf8, 0x54, 0x0b, 0x00, 0xfc, 0x54, - 0x0b, 0x00, 0xfe, 0x54, 0x0b, 0x00, 0xff, 0x54, 0x0b, 0x00, 0x6b, 0x55, - 0x0b, 0x00, 0x78, 0x55, 0x0b, 0x00, 0x7c, 0x55, 0x0b, 0x00, 0x7e, 0x55, - 0x0b, 0x00, 0x7f, 0x55, 0x0b, 0x00, 0xeb, 0x56, 0x0b, 0x00, 0xcb, 0x57, - 0x0b, 0x00, 0xeb, 0x57, 0x0b, 0x00, 0xf8, 0x57, 0x0b, 0x00, 0xfc, 0x57, - 0x0b, 0x00, 0xfe, 0x57, 0x0b, 0x00, 0xff, 0x57, 0x0b, 0x00, 0xb0, 0x5b, - 0x0b, 0x00, 0xc7, 0x5b, 0x0b, 0x00, 0xf7, 0x5b, 0x0b, 0x00, 0xf8, 0x5b, - 0x0b, 0x00, 0xfc, 0x5b, 0x0b, 0x00, 0xfe, 0x5b, 0x0b, 0x00, 0xff, 0x5b, - 0x0b, 0x00, 0x78, 0x5c, 0x0b, 0x00, 0x7c, 0x5c, 0x0b, 0x00, 0x7e, 0x5c, - 0x0b, 0x00, 0x7f, 0x5c, 0x0b, 0x00, 0x78, 0x5e, 0x0b, 0x00, 0x7c, 0x5e, - 0x0b, 0x00, 0x7e, 0x5e, 0x0b, 0x00, 0x7f, 0x5e, 0x0b, 0x00, 0xeb, 0x64, - 0x0b, 0x00, 0x3b, 0x65, 0x0b, 0x00, 0x0b, 0x66, 0x0b, 0x00, 0xeb, 0x66, - 0x0b, 0x00, 0x4b, 0x6b, 0x0b, 0x00, 0x3b, 0x70, 0x0b, 0x00, 0x3b, 0x74, - 0x0b, 0x00, 0xfb, 0x75, 0x0b, 0x00, 0x3b, 0x76, 0x0b, 0x00, 0x4b, 0x78, - 0x0b, 0x00, 0xeb, 0x78, 0x0b, 0x00, 0x3b, 0x79, 0x0b, 0x00, 0x0b, 0x7a, - 0x0b, 0x00, 0x2b, 0x7a, 0x0b, 0x00, 0x4b, 0x7b, 0x0b, 0x00, 0x3b, 0x7d, - 0x0b, 0x00, 0x70, 0x80, 0x0b, 0x00, 0x71, 0x80, 0x0b, 0x00, 0x73, 0x80, - 0x0b, 0x00, 0x79, 0x80, 0x0b, 0x00, 0x7b, 0x80, 0x0b, 0x00, 0x7d, 0x80, - 0x0b, 0x00, 0x70, 0x81, 0x0b, 0x00, 0x71, 0x81, 0x0b, 0x00, 0x73, 0x81, - 0x0b, 0x00, 0x79, 0x81, 0x0b, 0x00, 0x7b, 0x81, 0x0b, 0x00, 0x7d, 0x81, - 0x0b, 0x00, 0xf2, 0x81, 0x0b, 0x00, 0xf4, 0x81, 0x0b, 0x00, 0xf5, 0x81, - 0x0b, 0x00, 0xf6, 0x81, 0x0b, 0x00, 0xf7, 0x81, 0x0b, 0x00, 0xf8, 0x81, - 0x0b, 0x00, 0xfa, 0x81, 0x0b, 0x00, 0xfc, 0x81, 0x0b, 0x00, 0xfe, 0x81, - 0x0b, 0x00, 0xff, 0x81, 0x0b, 0x00, 0x73, 0x82, 0x0b, 0x00, 0x7b, 0x82, - 0x0b, 0x00, 0xf0, 0x83, 0x0b, 0x00, 0xf1, 0x83, 0x0b, 0x00, 0xf3, 0x83, - 0x0b, 0x00, 0xf9, 0x83, 0x0b, 0x00, 0xfb, 0x83, 0x0b, 0x00, 0xfd, 0x83, - 0x0b, 0x00, 0xf0, 0x84, 0x0b, 0x00, 0xf1, 0x84, 0x0b, 0x00, 0xf9, 0x84, - 0x0b, 0x00, 0xfd, 0x84, 0x0b, 0x00, 0xf6, 0x86, 0x0b, 0x00, 0xf7, 0x86, - 0x0b, 0x00, 0xf8, 0x86, 0x0b, 0x00, 0xfc, 0x86, 0x0b, 0x00, 0xfe, 0x86, - 0x0b, 0x00, 0xff, 0x86, 0x0b, 0x00, 0xf0, 0x87, 0x0b, 0x00, 0xf1, 0x87, - 0x0b, 0x00, 0xf3, 0x87, 0x0b, 0x00, 0xf9, 0x87, 0x0b, 0x00, 0xfb, 0x87, - 0x0b, 0x00, 0xfd, 0x87, 0x0b, 0x00, 0x77, 0x88, 0x0b, 0x00, 0x2b, 0x8a, - 0x0b, 0x00, 0x11, 0x8b, 0x0b, 0x00, 0x16, 0x8b, 0x0b, 0x00, 0x17, 0x8b, - 0x0b, 0x00, 0x19, 0x8b, 0x0b, 0x00, 0x1d, 0x8b, 0x0b, 0x00, 0x76, 0x8b, - 0x0b, 0x00, 0x77, 0x8b, 0x0b, 0x00, 0x78, 0x8b, 0x0b, 0x00, 0x7c, 0x8b, - 0x0b, 0x00, 0x7e, 0x8b, 0x0b, 0x00, 0x7f, 0x8b, 0x0b, 0x00, 0x73, 0x8e, - 0x0b, 0x00, 0x7b, 0x8e, 0x0b, 0x00, 0x74, 0x8f, 0x0b, 0x00, 0x75, 0x8f, - 0x0b, 0x00, 0x78, 0x8f, 0x0b, 0x00, 0x7c, 0x8f, 0x0b, 0x00, 0x7e, 0x8f, - 0x0b, 0x00, 0x7f, 0x8f, 0x0b, 0x00, 0xf8, 0x9a, 0x0b, 0x00, 0xfc, 0x9a, - 0x0b, 0x00, 0xfe, 0x9a, 0x0b, 0x00, 0xff, 0x9a, 0x0b, 0x00, 0x78, 0xa0, - 0x0b, 0x00, 0x7c, 0xa0, 0x0b, 0x00, 0x7e, 0xa0, 0x0b, 0x00, 0x7f, 0xa0, - 0x0b, 0x00, 0xf8, 0xa1, 0x0b, 0x00, 0xfc, 0xa1, 0x0b, 0x00, 0xfe, 0xa1, - 0x0b, 0x00, 0xff, 0xa1, 0x0b, 0x00, 0xf8, 0xa3, 0x0b, 0x00, 0xfc, 0xa3, - 0x0b, 0x00, 0xfe, 0xa3, 0x0b, 0x00, 0xff, 0xa3, 0x0b, 0x00, 0xf8, 0xa7, - 0x0b, 0x00, 0xfc, 0xa7, 0x0b, 0x00, 0xfe, 0xa7, 0x0b, 0x00, 0xff, 0xa7, - 0x0b, 0x00, 0x70, 0xb0, 0x0b, 0x00, 0x71, 0xb0, 0x0b, 0x00, 0x79, 0xb0, - 0x0b, 0x00, 0x7d, 0xb0, 0x0b, 0x00, 0xb0, 0xb0, 0x0b, 0x00, 0x70, 0xb1, - 0x0b, 0x00, 0x71, 0xb1, 0x0b, 0x00, 0x79, 0xb1, 0x0b, 0x00, 0x7d, 0xb1, - 0x0b, 0x00, 0xf7, 0xb1, 0x0b, 0x00, 0xf8, 0xb1, 0x0b, 0x00, 0xfc, 0xb1, - 0x0b, 0x00, 0xfe, 0xb1, 0x0b, 0x00, 0xff, 0xb1, 0x0b, 0x00, 0x30, 0xb3, - 0x0b, 0x00, 0xd0, 0xb3, 0x0b, 0x00, 0xd8, 0xb3, 0x0b, 0x00, 0xdc, 0xb3, - 0x0b, 0x00, 0xde, 0xb3, 0x0b, 0x00, 0xdf, 0xb3, 0x0b, 0x00, 0xf0, 0xb3, - 0x0b, 0x00, 0xf1, 0xb3, 0x0b, 0x00, 0xf9, 0xb3, 0x0b, 0x00, 0xfd, 0xb3, - 0x0b, 0x00, 0xb0, 0xb4, 0x0b, 0x00, 0xb0, 0xb6, 0x0b, 0x00, 0x86, 0xb7, - 0x0b, 0x00, 0xc6, 0xb7, 0x0b, 0x00, 0xe6, 0xb7, 0x0b, 0x00, 0xf6, 0xb7, - 0x0b, 0x00, 0xf7, 0xb7, 0x0b, 0x00, 0xf8, 0xb7, 0x0b, 0x00, 0xfc, 0xb7, - 0x0b, 0x00, 0xfe, 0xb7, 0x0b, 0x00, 0xff, 0xb7, 0x0b, 0x00, 0x47, 0xb8, - 0x0b, 0x00, 0x77, 0xb8, 0x0b, 0x00, 0x78, 0xb8, 0x0b, 0x00, 0x7c, 0xb8, - 0x0b, 0x00, 0x7e, 0xb8, 0x0b, 0x00, 0x7f, 0xb8, 0x0b, 0x00, 0x30, 0xb9, - 0x0b, 0x00, 0x90, 0xbb, 0x0b, 0x00, 0x98, 0xbb, 0x0b, 0x00, 0x9c, 0xbb, - 0x0b, 0x00, 0x9e, 0xbb, 0x0b, 0x00, 0x9f, 0xbb, 0x0b, 0x00, 0x30, 0xbd, - 0x0b, 0x00, 0x30, 0xbf, 0x0b, 0x00, 0x90, 0xbf, 0x0b, 0x00, 0x98, 0xbf, - 0x0b, 0x00, 0x9c, 0xbf, 0x0b, 0x00, 0x9e, 0xbf, 0x0b, 0x00, 0x9f, 0xbf, - 0x0b, 0x00, 0xd0, 0xbf, 0x0b, 0x00, 0xd8, 0xbf, 0x0b, 0x00, 0xdc, 0xbf, - 0x0b, 0x00, 0xde, 0xbf, 0x0b, 0x00, 0xdf, 0xbf, 0x0b, 0x00, 0x73, 0xc2, - 0x0b, 0x00, 0x7b, 0xc2, 0x0b, 0x00, 0xf0, 0xc3, 0x0b, 0x00, 0xf1, 0xc3, - 0x0b, 0x00, 0xf3, 0xc3, 0x0b, 0x00, 0xf9, 0xc3, 0x0b, 0x00, 0xfb, 0xc3, - 0x0b, 0x00, 0xfd, 0xc3, 0x0b, 0x00, 0x30, 0xca, 0x0b, 0x00, 0xcb, 0xca, - 0x0b, 0x00, 0xeb, 0xca, 0x0b, 0x00, 0xf7, 0xca, 0x0b, 0x00, 0xf8, 0xca, - 0x0b, 0x00, 0xfc, 0xca, 0x0b, 0x00, 0xfe, 0xca, 0x0b, 0x00, 0xff, 0xca, - 0x0b, 0x00, 0x74, 0xce, 0x0b, 0x00, 0x75, 0xce, 0x0b, 0x00, 0x78, 0xce, - 0x0b, 0x00, 0x7c, 0xce, 0x0b, 0x00, 0x7e, 0xce, 0x0b, 0x00, 0x7f, 0xce, - 0x0b, 0x00, 0x18, 0xcf, 0x0b, 0x00, 0x73, 0xcf, 0x0b, 0x00, 0x7b, 0xcf, - 0x0b, 0x00, 0xf8, 0xd2, 0x0b, 0x00, 0xfc, 0xd2, 0x0b, 0x00, 0xfe, 0xd2, - 0x0b, 0x00, 0xff, 0xd2, 0x0b, 0x00, 0xf3, 0xd3, 0x0b, 0x00, 0xfb, 0xd3, - 0x0b, 0x00, 0xf4, 0xdb, 0x0b, 0x00, 0xf5, 0xdb, 0x0b, 0x00, 0xf8, 0xdb, - 0x0b, 0x00, 0xfc, 0xdb, 0x0b, 0x00, 0xfe, 0xdb, 0x0b, 0x00, 0xff, 0xdb, - 0x0b, 0x00, 0x30, 0xe4, 0x0b, 0x00, 0x0b, 0xe5, 0x0b, 0x00, 0x50, 0xe5, - 0x0b, 0x00, 0x30, 0xe6, 0x0b, 0x00, 0xf0, 0xea, 0x0b, 0x00, 0xf1, 0xea, - 0x0b, 0x00, 0xf9, 0xea, 0x0b, 0x00, 0xfd, 0xea, 0x0b, 0x00, 0x74, 0xee, - 0x0b, 0x00, 0x75, 0xee, 0x0b, 0x00, 0x78, 0xee, 0x0b, 0x00, 0x7c, 0xee, - 0x0b, 0x00, 0x7e, 0xee, 0x0b, 0x00, 0x7f, 0xee, 0x0b, 0x00, 0x73, 0xef, - 0x0b, 0x00, 0x7b, 0xef, 0x0b, 0x00, 0x30, 0xf2, 0x0b, 0x00, 0xcb, 0xf2, - 0x0b, 0x00, 0xeb, 0xf2, 0x0b, 0x00, 0xf7, 0xf2, 0x0b, 0x00, 0xf8, 0xf2, - 0x0b, 0x00, 0xfc, 0xf2, 0x0b, 0x00, 0xfe, 0xf2, 0x0b, 0x00, 0xff, 0xf2, - 0x0b, 0x00, 0x08, 0xf3, 0x0b, 0x00, 0x0b, 0xf3, 0x0b, 0x00, 0x30, 0xf8, - 0x0b, 0x00, 0x0b, 0xf9, 0x0b, 0x00, 0x50, 0xf9, 0x0b, 0x00, 0x59, 0xf9, - 0x0b, 0x00, 0x5d, 0xf9, 0x0b, 0x00, 0x30, 0xfa, 0x0b, 0x00, 0xcb, 0xfa, - 0x0b, 0x00, 0xeb, 0xfa, 0x0b, 0x00, 0xf7, 0xfa, 0x0b, 0x00, 0xf8, 0xfa, - 0x0b, 0x00, 0xfc, 0xfa, 0x0b, 0x00, 0xfe, 0xfa, 0x0b, 0x00, 0xff, 0xfa, - 0x0b, 0x00, 0x30, 0xfc, 0x0b, 0x00, 0x0b, 0xfd, 0x0b, 0x00, 0x50, 0xfd, - 0x0b, 0x00, 0x30, 0xfe, 0x0b, 0x00, 0x74, 0xfe, 0x0b, 0x00, 0x75, 0xfe, - 0x0b, 0x00, 0x78, 0xfe, 0x0b, 0x00, 0x7c, 0xfe, 0x0b, 0x00, 0x7e, 0xfe, - 0x0b, 0x00, 0x7f, 0xfe, 0x0b, 0x00, 0x08, 0xff, 0x0b, 0x00, 0x0b, 0xff, - 0x0b, 0x00, 0x78, 0xff, 0x0b, 0x00, 0x7c, 0xff, 0x0b, 0x00, 0x7e, 0xff, - 0x0b, 0x00, 0x7f, 0xff, 0x0b, 0x00, 0xcb, 0x05, 0x0c, 0x00, 0xeb, 0x05, - 0x0c, 0x00, 0xf8, 0x05, 0x0c, 0x00, 0xfc, 0x05, 0x0c, 0x00, 0xfe, 0x05, - 0x0c, 0x00, 0xff, 0x05, 0x0c, 0x00, 0x6b, 0x06, 0x0c, 0x00, 0x78, 0x06, - 0x0c, 0x00, 0x7c, 0x06, 0x0c, 0x00, 0x7e, 0x06, 0x0c, 0x00, 0x7f, 0x06, - 0x0c, 0x00, 0x8b, 0x07, 0x0c, 0x00, 0xcb, 0x07, 0x0c, 0x00, 0xeb, 0x07, - 0x0c, 0x00, 0xf8, 0x07, 0x0c, 0x00, 0xfc, 0x07, 0x0c, 0x00, 0xfe, 0x07, - 0x0c, 0x00, 0xff, 0x07, 0x0c, 0x00, 0x6b, 0x08, 0x0c, 0x00, 0x8b, 0x08, - 0x0c, 0x00, 0xb8, 0x08, 0x0c, 0x00, 0xbc, 0x08, 0x0c, 0x00, 0xbe, 0x08, - 0x0c, 0x00, 0xbf, 0x08, 0x0c, 0x00, 0xf8, 0x0b, 0x0c, 0x00, 0xfc, 0x0b, - 0x0c, 0x00, 0xfe, 0x0b, 0x0c, 0x00, 0xff, 0x0b, 0x0c, 0x00, 0xcb, 0x0f, - 0x0c, 0x00, 0xeb, 0x0f, 0x0c, 0x00, 0xeb, 0x13, 0x0c, 0x00, 0x78, 0x1a, - 0x0c, 0x00, 0x7c, 0x1a, 0x0c, 0x00, 0x7e, 0x1a, 0x0c, 0x00, 0x7f, 0x1a, - 0x0c, 0x00, 0xcb, 0x1d, 0x0c, 0x00, 0xeb, 0x1d, 0x0c, 0x00, 0x8b, 0x20, - 0x0c, 0x00, 0x8b, 0x27, 0x0c, 0x00, 0xcb, 0x27, 0x0c, 0x00, 0xeb, 0x27, - 0x0c, 0x00, 0x8b, 0x28, 0x0c, 0x00, 0xcb, 0x29, 0x0c, 0x00, 0xeb, 0x29, - 0x0c, 0x00, 0xf8, 0x29, 0x0c, 0x00, 0xfc, 0x29, 0x0c, 0x00, 0xfe, 0x29, - 0x0c, 0x00, 0xff, 0x29, 0x0c, 0x00, 0xf8, 0x2b, 0x0c, 0x00, 0xfc, 0x2b, - 0x0c, 0x00, 0xfe, 0x2b, 0x0c, 0x00, 0xff, 0x2b, 0x0c, 0x00, 0xf8, 0x2d, - 0x0c, 0x00, 0xfc, 0x2d, 0x0c, 0x00, 0xfe, 0x2d, 0x0c, 0x00, 0xff, 0x2d, - 0x0c, 0x00, 0x6b, 0x32, 0x0c, 0x00, 0xab, 0x32, 0x0c, 0x00, 0x8b, 0x33, - 0x0c, 0x00, 0x78, 0x35, 0x0c, 0x00, 0x7c, 0x35, 0x0c, 0x00, 0x7e, 0x35, - 0x0c, 0x00, 0x7f, 0x35, 0x0c, 0x00, 0xcb, 0x37, 0x0c, 0x00, 0xeb, 0x37, - 0x0c, 0x00, 0xf0, 0x37, 0x0c, 0x00, 0xf1, 0x37, 0x0c, 0x00, 0xf7, 0x37, - 0x0c, 0x00, 0xf9, 0x37, 0x0c, 0x00, 0xfd, 0x37, 0x0c, 0x00, 0x6b, 0x3c, - 0x0c, 0x00, 0x78, 0x3e, 0x0c, 0x00, 0x7c, 0x3e, 0x0c, 0x00, 0x7e, 0x3e, - 0x0c, 0x00, 0x7f, 0x3e, 0x0c, 0x00, 0xf8, 0x3f, 0x0c, 0x00, 0xfc, 0x3f, - 0x0c, 0x00, 0xfe, 0x3f, 0x0c, 0x00, 0xff, 0x3f, 0x0c, 0x00, 0xb0, 0x44, - 0x0c, 0x00, 0xb1, 0x44, 0x0c, 0x00, 0xb9, 0x44, 0x0c, 0x00, 0xbd, 0x44, - 0x0c, 0x00, 0xb0, 0x46, 0x0c, 0x00, 0xb1, 0x46, 0x0c, 0x00, 0xb9, 0x46, - 0x0c, 0x00, 0xbd, 0x46, 0x0c, 0x00, 0x70, 0x4a, 0x0c, 0x00, 0x71, 0x4a, - 0x0c, 0x00, 0x77, 0x4a, 0x0c, 0x00, 0x79, 0x4a, 0x0c, 0x00, 0x7d, 0x4a, - 0x0c, 0x00, 0x6b, 0x52, 0x0c, 0x00, 0x78, 0x52, 0x0c, 0x00, 0x7c, 0x52, - 0x0c, 0x00, 0x7e, 0x52, 0x0c, 0x00, 0x7f, 0x52, 0x0c, 0x00, 0xab, 0x52, - 0x0c, 0x00, 0x8b, 0x53, 0x0c, 0x00, 0x6b, 0x5c, 0x0c, 0x00, 0x78, 0x5c, - 0x0c, 0x00, 0x7c, 0x5c, 0x0c, 0x00, 0x7e, 0x5c, 0x0c, 0x00, 0x7f, 0x5c, - 0x0c, 0x00, 0xf0, 0x5f, 0x0c, 0x00, 0xf1, 0x5f, 0x0c, 0x00, 0xf9, 0x5f, - 0x0c, 0x00, 0xfd, 0x5f, 0x0c, 0x00, 0x6b, 0x67, 0x0c, 0x00, 0x8b, 0x6a, - 0x0c, 0x00, 0x78, 0x6b, 0x0c, 0x00, 0x7c, 0x6b, 0x0c, 0x00, 0x7e, 0x6b, - 0x0c, 0x00, 0x7f, 0x6b, 0x0c, 0x00, 0x71, 0x80, 0x0c, 0x00, 0x79, 0x80, - 0x0c, 0x00, 0x71, 0x84, 0x0c, 0x00, 0x79, 0x84, 0x0c, 0x00, 0x78, 0x85, - 0x0c, 0x00, 0x7c, 0x85, 0x0c, 0x00, 0x7e, 0x85, 0x0c, 0x00, 0x7f, 0x85, - 0x0c, 0x00, 0xf7, 0x85, 0x0c, 0x00, 0x71, 0x86, 0x0c, 0x00, 0x79, 0x86, - 0x0c, 0x00, 0x0b, 0x87, 0x0c, 0x00, 0x70, 0x87, 0x0c, 0x00, 0x71, 0x87, - 0x0c, 0x00, 0x79, 0x87, 0x0c, 0x00, 0x7d, 0x87, 0x0c, 0x00, 0xf7, 0x87, - 0x0c, 0x00, 0x8b, 0x8a, 0x0c, 0x00, 0x0b, 0x8b, 0x0c, 0x00, 0x6b, 0x8b, - 0x0c, 0x00, 0x78, 0x8b, 0x0c, 0x00, 0x7c, 0x8b, 0x0c, 0x00, 0x7e, 0x8b, - 0x0c, 0x00, 0x7f, 0x8b, 0x0c, 0x00, 0xf1, 0x8b, 0x0c, 0x00, 0xf7, 0x8b, - 0x0c, 0x00, 0xf9, 0x8b, 0x0c, 0x00, 0xfb, 0x95, 0x0c, 0x00, 0xbb, 0xb2, - 0x0c, 0x00, 0xf1, 0xb3, 0x0c, 0x00, 0xf7, 0xb3, 0x0c, 0x00, 0xf9, 0xb3, - 0x0c, 0x00, 0xbb, 0xbe, 0x0c, 0x00, 0xf1, 0xbf, 0x0c, 0x00, 0xf7, 0xbf, - 0x0c, 0x00, 0xf9, 0xbf, 0x0c, 0x00, 0xf0, 0xc1, 0x0c, 0x00, 0xf1, 0xc1, - 0x0c, 0x00, 0xf9, 0xc1, 0x0c, 0x00, 0xfd, 0xc1, 0x0c, 0x00, 0x91, 0xc3, - 0x0c, 0x00, 0x96, 0xc3, 0x0c, 0x00, 0x97, 0xc3, 0x0c, 0x00, 0x99, 0xc3, - 0x0c, 0x00, 0x9d, 0xc3, 0x0c, 0x00, 0xf6, 0xc5, 0x0c, 0x00, 0xf7, 0xc5, - 0x0c, 0x00, 0xf8, 0xc5, 0x0c, 0x00, 0xfc, 0xc5, 0x0c, 0x00, 0xfe, 0xc5, - 0x0c, 0x00, 0xff, 0xc5, 0x0c, 0x00, 0xf0, 0xc9, 0x0c, 0x00, 0xf1, 0xc9, - 0x0c, 0x00, 0xf9, 0xc9, 0x0c, 0x00, 0xfd, 0xc9, 0x0c, 0x00, 0x18, 0xcf, - 0x0c, 0x00, 0x1c, 0xcf, 0x0c, 0x00, 0x1e, 0xcf, 0x0c, 0x00, 0x1f, 0xcf, - 0x0c, 0x00, 0x91, 0xcf, 0x0c, 0x00, 0x96, 0xcf, 0x0c, 0x00, 0x97, 0xcf, - 0x0c, 0x00, 0x98, 0xcf, 0x0c, 0x00, 0x9c, 0xcf, 0x0c, 0x00, 0x9e, 0xcf, - 0x0c, 0x00, 0x9f, 0xcf, 0x0c, 0x00, 0xd1, 0xcf, 0x0c, 0x00, 0xd6, 0xcf, - 0x0c, 0x00, 0xd7, 0xcf, 0x0c, 0x00, 0xd8, 0xcf, 0x0c, 0x00, 0xdc, 0xcf, - 0x0c, 0x00, 0xde, 0xcf, 0x0c, 0x00, 0xdf, 0xcf, 0x0c, 0x00, 0xf8, 0xd1, - 0x0c, 0x00, 0xfc, 0xd1, 0x0c, 0x00, 0xfe, 0xd1, 0x0c, 0x00, 0xff, 0xd1, - 0x0c, 0x00, 0x98, 0xd3, 0x0c, 0x00, 0x9c, 0xd3, 0x0c, 0x00, 0x9e, 0xd3, - 0x0c, 0x00, 0x9f, 0xd3, 0x0c, 0x00, 0xf8, 0xd5, 0x0c, 0x00, 0xfc, 0xd5, - 0x0c, 0x00, 0xfe, 0xd5, 0x0c, 0x00, 0xff, 0xd5, 0x0c, 0x00, 0x88, 0xd7, - 0x0c, 0x00, 0x8b, 0xd7, 0x0c, 0x00, 0xf8, 0xd9, 0x0c, 0x00, 0xfc, 0xd9, - 0x0c, 0x00, 0xfe, 0xd9, 0x0c, 0x00, 0xff, 0xd9, 0x0c, 0x00, 0xf8, 0xdd, - 0x0c, 0x00, 0xfc, 0xdd, 0x0c, 0x00, 0xfe, 0xdd, 0x0c, 0x00, 0xff, 0xdd, - 0x0c, 0x00, 0x98, 0xdf, 0x0c, 0x00, 0x9c, 0xdf, 0x0c, 0x00, 0x9e, 0xdf, - 0x0c, 0x00, 0x9f, 0xdf, 0x0c, 0x00, 0xf6, 0xe1, 0x0c, 0x00, 0xf7, 0xe1, - 0x0c, 0x00, 0xf8, 0xe1, 0x0c, 0x00, 0xfc, 0xe1, 0x0c, 0x00, 0xfe, 0xe1, - 0x0c, 0x00, 0xff, 0xe1, 0x0c, 0x00, 0x8b, 0xe5, 0x0c, 0x00, 0xcb, 0xe5, - 0x0c, 0x00, 0xeb, 0xe5, 0x0c, 0x00, 0xf0, 0xe5, 0x0c, 0x00, 0xf6, 0xe9, - 0x0c, 0x00, 0xf7, 0xe9, 0x0c, 0x00, 0xf8, 0xe9, 0x0c, 0x00, 0xfc, 0xe9, - 0x0c, 0x00, 0xfe, 0xe9, 0x0c, 0x00, 0xff, 0xe9, 0x0c, 0x00, 0xb0, 0xea, - 0x0c, 0x00, 0xf0, 0xed, 0x0c, 0x00, 0x18, 0xef, 0x0c, 0x00, 0x1c, 0xef, - 0x0c, 0x00, 0x1e, 0xef, 0x0c, 0x00, 0x1f, 0xef, 0x0c, 0x00, 0x91, 0xef, - 0x0c, 0x00, 0x96, 0xef, 0x0c, 0x00, 0x97, 0xef, 0x0c, 0x00, 0x98, 0xef, - 0x0c, 0x00, 0x9c, 0xef, 0x0c, 0x00, 0x9e, 0xef, 0x0c, 0x00, 0x9f, 0xef, - 0x0c, 0x00, 0xd1, 0xef, 0x0c, 0x00, 0xd6, 0xef, 0x0c, 0x00, 0xd7, 0xef, - 0x0c, 0x00, 0xd8, 0xef, 0x0c, 0x00, 0xdc, 0xef, 0x0c, 0x00, 0xde, 0xef, - 0x0c, 0x00, 0xdf, 0xef, 0x0c, 0x00, 0x8b, 0xf1, 0x0c, 0x00, 0xf0, 0xf1, - 0x0c, 0x00, 0xf1, 0xf1, 0x0c, 0x00, 0xf9, 0xf1, 0x0c, 0x00, 0xfd, 0xf1, - 0x0c, 0x00, 0x88, 0xf3, 0x0c, 0x00, 0x8b, 0xf3, 0x0c, 0x00, 0x90, 0xf3, - 0x0c, 0x00, 0x8b, 0xf9, 0x0c, 0x00, 0xcb, 0xf9, 0x0c, 0x00, 0xeb, 0xf9, - 0x0c, 0x00, 0xf7, 0xf9, 0x0c, 0x00, 0xf8, 0xf9, 0x0c, 0x00, 0xfc, 0xf9, - 0x0c, 0x00, 0xfe, 0xf9, 0x0c, 0x00, 0xff, 0xf9, 0x0c, 0x00, 0x8b, 0xfd, - 0x0c, 0x00, 0xcb, 0xfd, 0x0c, 0x00, 0xeb, 0xfd, 0x0c, 0x00, 0xf0, 0xfd, - 0x0c, 0x00, 0x90, 0xff, 0x0c, 0x00, 0x99, 0xff, 0x0c, 0x00, 0x9d, 0xff, - 0x0c, 0x00, 0xd0, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x0c, 0x00, 0xdd, 0xff, - 0x0c, 0x00, 0xf4, 0x07, 0x0d, 0x00, 0xf5, 0x07, 0x0d, 0x00, 0xf8, 0x07, - 0x0d, 0x00, 0xfc, 0x07, 0x0d, 0x00, 0xfe, 0x07, 0x0d, 0x00, 0xff, 0x07, - 0x0d, 0x00, 0xf4, 0x0b, 0x0d, 0x00, 0xf5, 0x0b, 0x0d, 0x00, 0xf8, 0x0b, - 0x0d, 0x00, 0xfc, 0x0b, 0x0d, 0x00, 0xfe, 0x0b, 0x0d, 0x00, 0xff, 0x0b, - 0x0d, 0x00, 0xf4, 0x1f, 0x0d, 0x00, 0xf5, 0x1f, 0x0d, 0x00, 0xf8, 0x1f, - 0x0d, 0x00, 0xfc, 0x1f, 0x0d, 0x00, 0xfe, 0x1f, 0x0d, 0x00, 0xff, 0x1f, - 0x0d, 0x00, 0xcb, 0x25, 0x0d, 0x00, 0xeb, 0x25, 0x0d, 0x00, 0xf0, 0x33, - 0x0d, 0x00, 0xf1, 0x33, 0x0d, 0x00, 0xf9, 0x33, 0x0d, 0x00, 0xfd, 0x33, - 0x0d, 0x00, 0x8b, 0x39, 0x0d, 0x00, 0xcb, 0x39, 0x0d, 0x00, 0xeb, 0x39, - 0x0d, 0x00, 0xf0, 0x39, 0x0d, 0x00, 0xf1, 0x39, 0x0d, 0x00, 0xf9, 0x39, - 0x0d, 0x00, 0xfd, 0x39, 0x0d, 0x00, 0x8b, 0x3d, 0x0d, 0x00, 0xcb, 0x3d, - 0x0d, 0x00, 0xeb, 0x3d, 0x0d, 0x00, 0xf0, 0x3d, 0x0d, 0x00, 0xf1, 0x3d, - 0x0d, 0x00, 0xf9, 0x3d, 0x0d, 0x00, 0xfd, 0x3d, 0x0d, 0x00, 0xb0, 0x40, - 0x0d, 0x00, 0xf0, 0x41, 0x0d, 0x00, 0xf1, 0x41, 0x0d, 0x00, 0xf9, 0x41, - 0x0d, 0x00, 0xfd, 0x41, 0x0d, 0x00, 0xe6, 0x43, 0x0d, 0x00, 0xf6, 0x43, - 0x0d, 0x00, 0xf7, 0x43, 0x0d, 0x00, 0xf8, 0x43, 0x0d, 0x00, 0xfc, 0x43, - 0x0d, 0x00, 0xfe, 0x43, 0x0d, 0x00, 0xff, 0x43, 0x0d, 0x00, 0xf6, 0x45, - 0x0d, 0x00, 0xf7, 0x45, 0x0d, 0x00, 0xf8, 0x45, 0x0d, 0x00, 0xfc, 0x45, - 0x0d, 0x00, 0xfe, 0x45, 0x0d, 0x00, 0xff, 0x45, 0x0d, 0x00, 0xb0, 0x46, - 0x0d, 0x00, 0x86, 0x48, 0x0d, 0x00, 0xb0, 0x48, 0x0d, 0x00, 0xf0, 0x49, - 0x0d, 0x00, 0xf1, 0x49, 0x0d, 0x00, 0xf9, 0x49, 0x0d, 0x00, 0xfd, 0x49, - 0x0d, 0x00, 0xe6, 0x4b, 0x0d, 0x00, 0xf0, 0x4b, 0x0d, 0x00, 0x88, 0x53, - 0x0d, 0x00, 0x8b, 0x53, 0x0d, 0x00, 0x88, 0x5f, 0x0d, 0x00, 0x8b, 0x5f, - 0x0d, 0x00, 0xf0, 0x5f, 0x0d, 0x00, 0xf1, 0x5f, 0x0d, 0x00, 0xf9, 0x5f, - 0x0d, 0x00, 0xfd, 0x5f, 0x0d, 0x00, 0xf4, 0x61, 0x0d, 0x00, 0xf5, 0x61, - 0x0d, 0x00, 0xf8, 0x61, 0x0d, 0x00, 0xfc, 0x61, 0x0d, 0x00, 0xfe, 0x61, - 0x0d, 0x00, 0xff, 0x61, 0x0d, 0x00, 0xf3, 0x69, 0x0d, 0x00, 0xfb, 0x69, - 0x0d, 0x00, 0x8b, 0x84, 0x0d, 0x00, 0xb1, 0x84, 0x0d, 0x00, 0xb9, 0x84, - 0x0d, 0x00, 0xf7, 0x85, 0x0d, 0x00, 0x8b, 0x86, 0x0d, 0x00, 0xb1, 0x86, - 0x0d, 0x00, 0xb9, 0x86, 0x0d, 0x00, 0x8b, 0xa7, 0x0d, 0x00, 0xcb, 0xa7, - 0x0d, 0x00, 0xeb, 0xa7, 0x0d, 0x00, 0xf8, 0xab, 0x0d, 0x00, 0xfc, 0xab, - 0x0d, 0x00, 0xfe, 0xab, 0x0d, 0x00, 0xff, 0xab, 0x0d, 0x00, 0x8b, 0xb3, - 0x0d, 0x00, 0xf8, 0xbf, 0x0d, 0x00, 0xfc, 0xbf, 0x0d, 0x00, 0xfe, 0xbf, - 0x0d, 0x00, 0xff, 0xbf, 0x0d, 0x00, 0x8b, 0xe5, 0x0d, 0x00, 0x8b, 0xfd, - 0x0d, 0x00, 0x18, 0x01, 0x0e, 0x00, 0x1c, 0x01, 0x0e, 0x00, 0x1e, 0x01, - 0x0e, 0x00, 0x1f, 0x01, 0x0e, 0x00, 0x68, 0x01, 0x0e, 0x00, 0x6b, 0x01, - 0x0e, 0x00, 0x78, 0x01, 0x0e, 0x00, 0x7c, 0x01, 0x0e, 0x00, 0x7e, 0x01, - 0x0e, 0x00, 0x7f, 0x01, 0x0e, 0x00, 0xd8, 0x01, 0x0e, 0x00, 0xdc, 0x01, - 0x0e, 0x00, 0xde, 0x01, 0x0e, 0x00, 0xdf, 0x01, 0x0e, 0x00, 0xe8, 0x03, - 0x0e, 0x00, 0xeb, 0x03, 0x0e, 0x00, 0xf8, 0x03, 0x0e, 0x00, 0xfc, 0x03, - 0x0e, 0x00, 0xfe, 0x03, 0x0e, 0x00, 0xff, 0x03, 0x0e, 0x00, 0x98, 0x07, - 0x0e, 0x00, 0x9c, 0x07, 0x0e, 0x00, 0x9e, 0x07, 0x0e, 0x00, 0x9f, 0x07, - 0x0e, 0x00, 0x98, 0x08, 0x0e, 0x00, 0x9c, 0x08, 0x0e, 0x00, 0x9e, 0x08, - 0x0e, 0x00, 0x9f, 0x08, 0x0e, 0x00, 0xb8, 0x08, 0x0e, 0x00, 0xbc, 0x08, - 0x0e, 0x00, 0xbe, 0x08, 0x0e, 0x00, 0xbf, 0x08, 0x0e, 0x00, 0x68, 0x0a, - 0x0e, 0x00, 0x6b, 0x0a, 0x0e, 0x00, 0x78, 0x0a, 0x0e, 0x00, 0x7c, 0x0a, - 0x0e, 0x00, 0x7e, 0x0a, 0x0e, 0x00, 0x7f, 0x0a, 0x0e, 0x00, 0xb8, 0x0a, - 0x0e, 0x00, 0xbc, 0x0a, 0x0e, 0x00, 0xbe, 0x0a, 0x0e, 0x00, 0xbf, 0x0a, - 0x0e, 0x00, 0xe8, 0x0b, 0x0e, 0x00, 0xeb, 0x0b, 0x0e, 0x00, 0xf8, 0x0b, - 0x0e, 0x00, 0xfc, 0x0b, 0x0e, 0x00, 0xfe, 0x0b, 0x0e, 0x00, 0xff, 0x0b, - 0x0e, 0x00, 0xeb, 0x0d, 0x0e, 0x00, 0xf8, 0x0d, 0x0e, 0x00, 0xfc, 0x0d, - 0x0e, 0x00, 0xfe, 0x0d, 0x0e, 0x00, 0xff, 0x0d, 0x0e, 0x00, 0x98, 0x0f, - 0x0e, 0x00, 0x9c, 0x0f, 0x0e, 0x00, 0x9e, 0x0f, 0x0e, 0x00, 0x9f, 0x0f, - 0x0e, 0x00, 0x18, 0x11, 0x0e, 0x00, 0x1c, 0x11, 0x0e, 0x00, 0x1e, 0x11, - 0x0e, 0x00, 0x1f, 0x11, 0x0e, 0x00, 0x68, 0x11, 0x0e, 0x00, 0x6b, 0x11, - 0x0e, 0x00, 0x78, 0x11, 0x0e, 0x00, 0x7c, 0x11, 0x0e, 0x00, 0x7e, 0x11, - 0x0e, 0x00, 0x7f, 0x11, 0x0e, 0x00, 0xf8, 0x13, 0x0e, 0x00, 0xfc, 0x13, - 0x0e, 0x00, 0xfe, 0x13, 0x0e, 0x00, 0xff, 0x13, 0x0e, 0x00, 0x78, 0x14, - 0x0e, 0x00, 0x7c, 0x14, 0x0e, 0x00, 0x7e, 0x14, 0x0e, 0x00, 0x7f, 0x14, - 0x0e, 0x00, 0x88, 0x14, 0x0e, 0x00, 0x8b, 0x14, 0x0e, 0x00, 0xcb, 0x15, - 0x0e, 0x00, 0xeb, 0x15, 0x0e, 0x00, 0x68, 0x16, 0x0e, 0x00, 0x6b, 0x16, - 0x0e, 0x00, 0x78, 0x16, 0x0e, 0x00, 0x7c, 0x16, 0x0e, 0x00, 0x7e, 0x16, - 0x0e, 0x00, 0x7f, 0x16, 0x0e, 0x00, 0x8b, 0x16, 0x0e, 0x00, 0x68, 0x17, - 0x0e, 0x00, 0x6b, 0x17, 0x0e, 0x00, 0x78, 0x17, 0x0e, 0x00, 0x7c, 0x17, - 0x0e, 0x00, 0x7e, 0x17, 0x0e, 0x00, 0x7f, 0x17, 0x0e, 0x00, 0x88, 0x17, - 0x0e, 0x00, 0x8b, 0x17, 0x0e, 0x00, 0xc8, 0x17, 0x0e, 0x00, 0xcb, 0x17, - 0x0e, 0x00, 0xe8, 0x17, 0x0e, 0x00, 0xeb, 0x17, 0x0e, 0x00, 0xf8, 0x17, - 0x0e, 0x00, 0xfc, 0x17, 0x0e, 0x00, 0xfe, 0x17, 0x0e, 0x00, 0xff, 0x17, - 0x0e, 0x00, 0x98, 0x19, 0x0e, 0x00, 0x9c, 0x19, 0x0e, 0x00, 0x9e, 0x19, - 0x0e, 0x00, 0x9f, 0x19, 0x0e, 0x00, 0xd8, 0x19, 0x0e, 0x00, 0xdc, 0x19, - 0x0e, 0x00, 0xde, 0x19, 0x0e, 0x00, 0xdf, 0x19, 0x0e, 0x00, 0x88, 0x1b, - 0x0e, 0x00, 0x8b, 0x1b, 0x0e, 0x00, 0x98, 0x1b, 0x0e, 0x00, 0x9c, 0x1b, - 0x0e, 0x00, 0x9e, 0x1b, 0x0e, 0x00, 0x9f, 0x1b, 0x0e, 0x00, 0x98, 0x1d, - 0x0e, 0x00, 0x9c, 0x1d, 0x0e, 0x00, 0x9e, 0x1d, 0x0e, 0x00, 0x9f, 0x1d, - 0x0e, 0x00, 0xd8, 0x1d, 0x0e, 0x00, 0xdc, 0x1d, 0x0e, 0x00, 0xde, 0x1d, - 0x0e, 0x00, 0xdf, 0x1d, 0x0e, 0x00, 0xc8, 0x1f, 0x0e, 0x00, 0xcb, 0x1f, - 0x0e, 0x00, 0xe8, 0x1f, 0x0e, 0x00, 0xeb, 0x1f, 0x0e, 0x00, 0xf8, 0x1f, - 0x0e, 0x00, 0xfc, 0x1f, 0x0e, 0x00, 0xfe, 0x1f, 0x0e, 0x00, 0xff, 0x1f, - 0x0e, 0x00, 0xb8, 0x20, 0x0e, 0x00, 0xbc, 0x20, 0x0e, 0x00, 0xbe, 0x20, - 0x0e, 0x00, 0xbf, 0x20, 0x0e, 0x00, 0xe8, 0x23, 0x0e, 0x00, 0xeb, 0x23, - 0x0e, 0x00, 0xf8, 0x23, 0x0e, 0x00, 0xfc, 0x23, 0x0e, 0x00, 0xfe, 0x23, - 0x0e, 0x00, 0xff, 0x23, 0x0e, 0x00, 0xe8, 0x2b, 0x0e, 0x00, 0xeb, 0x2b, - 0x0e, 0x00, 0x98, 0x2c, 0x0e, 0x00, 0x9c, 0x2c, 0x0e, 0x00, 0x9e, 0x2c, - 0x0e, 0x00, 0x9f, 0x2c, 0x0e, 0x00, 0xf0, 0x31, 0x0e, 0x00, 0xf1, 0x31, - 0x0e, 0x00, 0xf9, 0x31, 0x0e, 0x00, 0xfd, 0x31, 0x0e, 0x00, 0x98, 0x33, - 0x0e, 0x00, 0x9c, 0x33, 0x0e, 0x00, 0x9e, 0x33, 0x0e, 0x00, 0x9f, 0x33, - 0x0e, 0x00, 0x68, 0x35, 0x0e, 0x00, 0x6b, 0x35, 0x0e, 0x00, 0x78, 0x35, - 0x0e, 0x00, 0x7c, 0x35, 0x0e, 0x00, 0x7e, 0x35, 0x0e, 0x00, 0x7f, 0x35, - 0x0e, 0x00, 0xeb, 0x35, 0x0e, 0x00, 0xf7, 0x35, 0x0e, 0x00, 0xf8, 0x35, - 0x0e, 0x00, 0xfc, 0x35, 0x0e, 0x00, 0xfe, 0x35, 0x0e, 0x00, 0xff, 0x35, - 0x0e, 0x00, 0x88, 0x37, 0x0e, 0x00, 0x8b, 0x37, 0x0e, 0x00, 0xeb, 0x39, - 0x0e, 0x00, 0xf7, 0x39, 0x0e, 0x00, 0xf8, 0x39, 0x0e, 0x00, 0xfc, 0x39, - 0x0e, 0x00, 0xfe, 0x39, 0x0e, 0x00, 0xff, 0x39, 0x0e, 0x00, 0x88, 0x3b, - 0x0e, 0x00, 0x8b, 0x3b, 0x0e, 0x00, 0xf0, 0x3d, 0x0e, 0x00, 0xf1, 0x3d, - 0x0e, 0x00, 0xf9, 0x3d, 0x0e, 0x00, 0xfd, 0x3d, 0x0e, 0x00, 0x88, 0x3f, - 0x0e, 0x00, 0x8b, 0x3f, 0x0e, 0x00, 0x90, 0x3f, 0x0e, 0x00, 0x91, 0x3f, - 0x0e, 0x00, 0x96, 0x3f, 0x0e, 0x00, 0x97, 0x3f, 0x0e, 0x00, 0x99, 0x3f, - 0x0e, 0x00, 0x9d, 0x3f, 0x0e, 0x00, 0x8b, 0x47, 0x0e, 0x00, 0x78, 0x52, - 0x0e, 0x00, 0x7c, 0x52, 0x0e, 0x00, 0x7e, 0x52, 0x0e, 0x00, 0x7f, 0x52, - 0x0e, 0x00, 0xb8, 0x52, 0x0e, 0x00, 0xbc, 0x52, 0x0e, 0x00, 0xbe, 0x52, - 0x0e, 0x00, 0xbf, 0x52, 0x0e, 0x00, 0xeb, 0x53, 0x0e, 0x00, 0xf7, 0x53, - 0x0e, 0x00, 0xf8, 0x53, 0x0e, 0x00, 0xfc, 0x53, 0x0e, 0x00, 0xfe, 0x53, - 0x0e, 0x00, 0xff, 0x53, 0x0e, 0x00, 0xb7, 0x58, 0x0e, 0x00, 0xb8, 0x58, - 0x0e, 0x00, 0xbc, 0x58, 0x0e, 0x00, 0xbe, 0x58, 0x0e, 0x00, 0xbf, 0x58, - 0x0e, 0x00, 0xb0, 0x5a, 0x0e, 0x00, 0xb1, 0x5a, 0x0e, 0x00, 0xb9, 0x5a, - 0x0e, 0x00, 0xbd, 0x5a, 0x0e, 0x00, 0xeb, 0x5b, 0x0e, 0x00, 0xf7, 0x5b, - 0x0e, 0x00, 0xf8, 0x5b, 0x0e, 0x00, 0xfc, 0x5b, 0x0e, 0x00, 0xfe, 0x5b, - 0x0e, 0x00, 0xff, 0x5b, 0x0e, 0x00, 0x78, 0x5c, 0x0e, 0x00, 0x7c, 0x5c, - 0x0e, 0x00, 0x7e, 0x5c, 0x0e, 0x00, 0x7f, 0x5c, 0x0e, 0x00, 0xb8, 0x5c, - 0x0e, 0x00, 0xbc, 0x5c, 0x0e, 0x00, 0xbe, 0x5c, 0x0e, 0x00, 0xbf, 0x5c, - 0x0e, 0x00, 0xb8, 0x5e, 0x0e, 0x00, 0xbc, 0x5e, 0x0e, 0x00, 0xbe, 0x5e, - 0x0e, 0x00, 0xbf, 0x5e, 0x0e, 0x00, 0xf0, 0x5f, 0x0e, 0x00, 0xf1, 0x5f, - 0x0e, 0x00, 0xf9, 0x5f, 0x0e, 0x00, 0xfd, 0x5f, 0x0e, 0x00, 0x0b, 0x67, - 0x0e, 0x00, 0x8b, 0x7a, 0x0e, 0x00, 0x77, 0x81, 0x0e, 0x00, 0xf7, 0x81, - 0x0e, 0x00, 0xf7, 0x83, 0x0e, 0x00, 0x8b, 0x8a, 0x0e, 0x00, 0x0b, 0x8b, - 0x0e, 0x00, 0x6b, 0x8b, 0x0e, 0x00, 0x78, 0x8b, 0x0e, 0x00, 0x7c, 0x8b, - 0x0e, 0x00, 0x7e, 0x8b, 0x0e, 0x00, 0x7f, 0x8b, 0x0e, 0x00, 0xf1, 0x8b, - 0x0e, 0x00, 0xf7, 0x8b, 0x0e, 0x00, 0xf9, 0x8b, 0x0e, 0x00, 0xfb, 0x95, - 0x0e, 0x00, 0x8b, 0x98, 0x0e, 0x00, 0x0b, 0xab, 0x0e, 0x00, 0x6b, 0xab, - 0x0e, 0x00, 0xbb, 0xb2, 0x0e, 0x00, 0xf1, 0xb3, 0x0e, 0x00, 0xf7, 0xb3, - 0x0e, 0x00, 0xf9, 0xb3, 0x0e, 0x00, 0xbb, 0xbe, 0x0e, 0x00, 0xf1, 0xbf, - 0x0e, 0x00, 0xf7, 0xbf, 0x0e, 0x00, 0xf9, 0xbf, 0x0e, 0x00, 0x86, 0xc0, - 0x0e, 0x00, 0xb0, 0xc0, 0x0e, 0x00, 0x78, 0xc2, 0x0e, 0x00, 0x7c, 0xc2, - 0x0e, 0x00, 0x7e, 0xc2, 0x0e, 0x00, 0x7f, 0xc2, 0x0e, 0x00, 0x88, 0xc2, - 0x0e, 0x00, 0x8b, 0xc2, 0x0e, 0x00, 0x90, 0xc2, 0x0e, 0x00, 0x98, 0xc2, - 0x0e, 0x00, 0x9c, 0xc2, 0x0e, 0x00, 0x9e, 0xc2, 0x0e, 0x00, 0x9f, 0xc2, - 0x0e, 0x00, 0x78, 0xc3, 0x0e, 0x00, 0x7c, 0xc3, 0x0e, 0x00, 0x7e, 0xc3, - 0x0e, 0x00, 0x7f, 0xc3, 0x0e, 0x00, 0xd1, 0xc3, 0x0e, 0x00, 0xd6, 0xc3, - 0x0e, 0x00, 0xd7, 0xc3, 0x0e, 0x00, 0xd9, 0xc3, 0x0e, 0x00, 0xdd, 0xc3, - 0x0e, 0x00, 0xe6, 0xc3, 0x0e, 0x00, 0xf6, 0xc3, 0x0e, 0x00, 0xf7, 0xc3, - 0x0e, 0x00, 0xf8, 0xc3, 0x0e, 0x00, 0xfc, 0xc3, 0x0e, 0x00, 0xfe, 0xc3, - 0x0e, 0x00, 0xff, 0xc3, 0x0e, 0x00, 0x91, 0xc5, 0x0e, 0x00, 0x96, 0xc5, - 0x0e, 0x00, 0x97, 0xc5, 0x0e, 0x00, 0x99, 0xc5, 0x0e, 0x00, 0x9d, 0xc5, - 0x0e, 0x00, 0xb0, 0xc6, 0x0e, 0x00, 0xf0, 0xc7, 0x0e, 0x00, 0xf1, 0xc7, - 0x0e, 0x00, 0xf9, 0xc7, 0x0e, 0x00, 0xfd, 0xc7, 0x0e, 0x00, 0xf0, 0xc9, - 0x0e, 0x00, 0xf1, 0xc9, 0x0e, 0x00, 0xf9, 0xc9, 0x0e, 0x00, 0xfd, 0xc9, - 0x0e, 0x00, 0x18, 0xcf, 0x0e, 0x00, 0x1c, 0xcf, 0x0e, 0x00, 0x1e, 0xcf, - 0x0e, 0x00, 0x1f, 0xcf, 0x0e, 0x00, 0x91, 0xcf, 0x0e, 0x00, 0x96, 0xcf, - 0x0e, 0x00, 0x97, 0xcf, 0x0e, 0x00, 0x98, 0xcf, 0x0e, 0x00, 0x9c, 0xcf, - 0x0e, 0x00, 0x9e, 0xcf, 0x0e, 0x00, 0x9f, 0xcf, 0x0e, 0x00, 0xd1, 0xcf, - 0x0e, 0x00, 0xd6, 0xcf, 0x0e, 0x00, 0xd7, 0xcf, 0x0e, 0x00, 0xd8, 0xcf, - 0x0e, 0x00, 0xdc, 0xcf, 0x0e, 0x00, 0xde, 0xcf, 0x0e, 0x00, 0xdf, 0xcf, - 0x0e, 0x00, 0x88, 0xd0, 0x0e, 0x00, 0x8b, 0xd0, 0x0e, 0x00, 0xd8, 0xd3, - 0x0e, 0x00, 0xdc, 0xd3, 0x0e, 0x00, 0xde, 0xd3, 0x0e, 0x00, 0xdf, 0xd3, - 0x0e, 0x00, 0xe8, 0xd3, 0x0e, 0x00, 0xeb, 0xd3, 0x0e, 0x00, 0xf8, 0xd5, - 0x0e, 0x00, 0xfc, 0xd5, 0x0e, 0x00, 0xfe, 0xd5, 0x0e, 0x00, 0xff, 0xd5, - 0x0e, 0x00, 0x88, 0xd7, 0x0e, 0x00, 0x8b, 0xd7, 0x0e, 0x00, 0xf8, 0xdb, - 0x0e, 0x00, 0xfc, 0xdb, 0x0e, 0x00, 0xfe, 0xdb, 0x0e, 0x00, 0xff, 0xdb, - 0x0e, 0x00, 0xd8, 0xdf, 0x0e, 0x00, 0xdc, 0xdf, 0x0e, 0x00, 0xde, 0xdf, - 0x0e, 0x00, 0xdf, 0xdf, 0x0e, 0x00, 0xe8, 0xdf, 0x0e, 0x00, 0xeb, 0xdf, - 0x0e, 0x00, 0x86, 0xe0, 0x0e, 0x00, 0xb0, 0xe0, 0x0e, 0x00, 0x90, 0xe2, - 0x0e, 0x00, 0x99, 0xe2, 0x0e, 0x00, 0x9d, 0xe2, 0x0e, 0x00, 0x8b, 0xe5, - 0x0e, 0x00, 0xcb, 0xe5, 0x0e, 0x00, 0xeb, 0xe5, 0x0e, 0x00, 0xf0, 0xe5, - 0x0e, 0x00, 0x86, 0xe8, 0x0e, 0x00, 0xb0, 0xe8, 0x0e, 0x00, 0x08, 0xe9, - 0x0e, 0x00, 0x0b, 0xe9, 0x0e, 0x00, 0x90, 0xe9, 0x0e, 0x00, 0x99, 0xe9, - 0x0e, 0x00, 0x9d, 0xe9, 0x0e, 0x00, 0xd0, 0xe9, 0x0e, 0x00, 0xd9, 0xe9, - 0x0e, 0x00, 0xdd, 0xe9, 0x0e, 0x00, 0xe6, 0xeb, 0x0e, 0x00, 0xf0, 0xeb, - 0x0e, 0x00, 0x68, 0xec, 0x0e, 0x00, 0x6b, 0xec, 0x0e, 0x00, 0x91, 0xec, - 0x0e, 0x00, 0x96, 0xec, 0x0e, 0x00, 0x97, 0xec, 0x0e, 0x00, 0x98, 0xec, - 0x0e, 0x00, 0x9c, 0xec, 0x0e, 0x00, 0x9e, 0xec, 0x0e, 0x00, 0x9f, 0xec, - 0x0e, 0x00, 0x08, 0xed, 0x0e, 0x00, 0x0b, 0xed, 0x0e, 0x00, 0x90, 0xed, - 0x0e, 0x00, 0xd0, 0xed, 0x0e, 0x00, 0x88, 0xee, 0x0e, 0x00, 0x8b, 0xee, - 0x0e, 0x00, 0x90, 0xee, 0x0e, 0x00, 0x99, 0xee, 0x0e, 0x00, 0x9d, 0xee, - 0x0e, 0x00, 0xf0, 0xef, 0x0e, 0x00, 0xf1, 0xef, 0x0e, 0x00, 0xf9, 0xef, - 0x0e, 0x00, 0xfd, 0xef, 0x0e, 0x00, 0x8b, 0xf1, 0x0e, 0x00, 0xf0, 0xf1, - 0x0e, 0x00, 0xf1, 0xf1, 0x0e, 0x00, 0xf9, 0xf1, 0x0e, 0x00, 0xfd, 0xf1, - 0x0e, 0x00, 0x88, 0xf3, 0x0e, 0x00, 0x8b, 0xf3, 0x0e, 0x00, 0x90, 0xf3, - 0x0e, 0x00, 0x8b, 0xf9, 0x0e, 0x00, 0xcb, 0xf9, 0x0e, 0x00, 0xeb, 0xf9, - 0x0e, 0x00, 0xf7, 0xf9, 0x0e, 0x00, 0xf8, 0xf9, 0x0e, 0x00, 0xfc, 0xf9, - 0x0e, 0x00, 0xfe, 0xf9, 0x0e, 0x00, 0xff, 0xf9, 0x0e, 0x00, 0x8b, 0xfd, - 0x0e, 0x00, 0xcb, 0xfd, 0x0e, 0x00, 0xeb, 0xfd, 0x0e, 0x00, 0xf0, 0xfd, - 0x0e, 0x00, 0x90, 0xff, 0x0e, 0x00, 0x99, 0xff, 0x0e, 0x00, 0x9d, 0xff, - 0x0e, 0x00, 0xd0, 0xff, 0x0e, 0x00, 0xd9, 0xff, 0x0e, 0x00, 0xdd, 0xff, - 0x0e, 0x00, 0x73, 0x00, 0x0f, 0x00, 0x7b, 0x00, 0x0f, 0x00, 0xb3, 0x00, - 0x0f, 0x00, 0xbb, 0x00, 0x0f, 0x00, 0x03, 0x01, 0x0f, 0x00, 0x04, 0x01, - 0x0f, 0x00, 0x05, 0x01, 0x0f, 0x00, 0x98, 0x03, 0x0f, 0x00, 0x9c, 0x03, - 0x0f, 0x00, 0x9e, 0x03, 0x0f, 0x00, 0x9f, 0x03, 0x0f, 0x00, 0x73, 0x04, - 0x0f, 0x00, 0x7b, 0x04, 0x0f, 0x00, 0xb4, 0x04, 0x0f, 0x00, 0xb5, 0x04, - 0x0f, 0x00, 0xb8, 0x04, 0x0f, 0x00, 0xbc, 0x04, 0x0f, 0x00, 0xbe, 0x04, - 0x0f, 0x00, 0xbf, 0x04, 0x0f, 0x00, 0xc3, 0x05, 0x0f, 0x00, 0xc4, 0x05, - 0x0f, 0x00, 0xc5, 0x05, 0x0f, 0x00, 0xc8, 0x05, 0x0f, 0x00, 0xcb, 0x05, - 0x0f, 0x00, 0xcc, 0x05, 0x0f, 0x00, 0xce, 0x05, 0x0f, 0x00, 0xcf, 0x05, - 0x0f, 0x00, 0xf4, 0x05, 0x0f, 0x00, 0xf5, 0x05, 0x0f, 0x00, 0xf8, 0x05, - 0x0f, 0x00, 0xfc, 0x05, 0x0f, 0x00, 0xfe, 0x05, 0x0f, 0x00, 0xff, 0x05, - 0x0f, 0x00, 0x73, 0x06, 0x0f, 0x00, 0x7b, 0x06, 0x0f, 0x00, 0xb3, 0x06, - 0x0f, 0x00, 0xbb, 0x06, 0x0f, 0x00, 0xd8, 0x07, 0x0f, 0x00, 0xdc, 0x07, - 0x0f, 0x00, 0xde, 0x07, 0x0f, 0x00, 0xdf, 0x07, 0x0f, 0x00, 0xe3, 0x07, - 0x0f, 0x00, 0xf3, 0x07, 0x0f, 0x00, 0xfb, 0x07, 0x0f, 0x00, 0x83, 0x08, - 0x0f, 0x00, 0x84, 0x08, 0x0f, 0x00, 0x85, 0x08, 0x0f, 0x00, 0x98, 0x08, - 0x0f, 0x00, 0x9c, 0x08, 0x0f, 0x00, 0x9e, 0x08, 0x0f, 0x00, 0x9f, 0x08, - 0x0f, 0x00, 0xb3, 0x08, 0x0f, 0x00, 0xbb, 0x08, 0x0f, 0x00, 0x64, 0x0a, - 0x0f, 0x00, 0x65, 0x0a, 0x0f, 0x00, 0x68, 0x0a, 0x0f, 0x00, 0x6b, 0x0a, - 0x0f, 0x00, 0x6c, 0x0a, 0x0f, 0x00, 0x6e, 0x0a, 0x0f, 0x00, 0x6f, 0x0a, - 0x0f, 0x00, 0x74, 0x0a, 0x0f, 0x00, 0x75, 0x0a, 0x0f, 0x00, 0x78, 0x0a, - 0x0f, 0x00, 0x7c, 0x0a, 0x0f, 0x00, 0x7e, 0x0a, 0x0f, 0x00, 0x7f, 0x0a, - 0x0f, 0x00, 0x08, 0x0b, 0x0f, 0x00, 0x0b, 0x0b, 0x0f, 0x00, 0x68, 0x0b, - 0x0f, 0x00, 0x6b, 0x0b, 0x0f, 0x00, 0x78, 0x0b, 0x0f, 0x00, 0x7c, 0x0b, - 0x0f, 0x00, 0x7e, 0x0b, 0x0f, 0x00, 0x7f, 0x0b, 0x0f, 0x00, 0xd3, 0x0b, - 0x0f, 0x00, 0xd4, 0x0b, 0x0f, 0x00, 0xd5, 0x0b, 0x0f, 0x00, 0xdb, 0x0b, - 0x0f, 0x00, 0xe4, 0x0b, 0x0f, 0x00, 0xe5, 0x0b, 0x0f, 0x00, 0xe8, 0x0b, - 0x0f, 0x00, 0xeb, 0x0b, 0x0f, 0x00, 0xec, 0x0b, 0x0f, 0x00, 0xee, 0x0b, - 0x0f, 0x00, 0xef, 0x0b, 0x0f, 0x00, 0xf4, 0x0b, 0x0f, 0x00, 0xf5, 0x0b, - 0x0f, 0x00, 0xf8, 0x0b, 0x0f, 0x00, 0xfc, 0x0b, 0x0f, 0x00, 0xfe, 0x0b, - 0x0f, 0x00, 0xff, 0x0b, 0x0f, 0x00, 0x93, 0x0f, 0x0f, 0x00, 0x94, 0x0f, - 0x0f, 0x00, 0x95, 0x0f, 0x0f, 0x00, 0x9b, 0x0f, 0x0f, 0x00, 0x74, 0x10, - 0x0f, 0x00, 0x75, 0x10, 0x0f, 0x00, 0x78, 0x10, 0x0f, 0x00, 0x7c, 0x10, - 0x0f, 0x00, 0x7e, 0x10, 0x0f, 0x00, 0x7f, 0x10, 0x0f, 0x00, 0x03, 0x11, - 0x0f, 0x00, 0x04, 0x11, 0x0f, 0x00, 0x05, 0x11, 0x0f, 0x00, 0x88, 0x14, - 0x0f, 0x00, 0x8b, 0x14, 0x0f, 0x00, 0x8c, 0x14, 0x0f, 0x00, 0x8e, 0x14, - 0x0f, 0x00, 0x8f, 0x14, 0x0f, 0x00, 0x93, 0x14, 0x0f, 0x00, 0x94, 0x14, - 0x0f, 0x00, 0x95, 0x14, 0x0f, 0x00, 0x9b, 0x14, 0x0f, 0x00, 0xb4, 0x14, - 0x0f, 0x00, 0xb5, 0x14, 0x0f, 0x00, 0xb8, 0x14, 0x0f, 0x00, 0xbc, 0x14, - 0x0f, 0x00, 0xbe, 0x14, 0x0f, 0x00, 0xbf, 0x14, 0x0f, 0x00, 0x63, 0x16, - 0x0f, 0x00, 0x73, 0x16, 0x0f, 0x00, 0x7b, 0x16, 0x0f, 0x00, 0x64, 0x17, - 0x0f, 0x00, 0x65, 0x17, 0x0f, 0x00, 0x68, 0x17, 0x0f, 0x00, 0x6b, 0x17, - 0x0f, 0x00, 0x6c, 0x17, 0x0f, 0x00, 0x6e, 0x17, 0x0f, 0x00, 0x6f, 0x17, - 0x0f, 0x00, 0x74, 0x17, 0x0f, 0x00, 0x75, 0x17, 0x0f, 0x00, 0x78, 0x17, - 0x0f, 0x00, 0x7c, 0x17, 0x0f, 0x00, 0x7e, 0x17, 0x0f, 0x00, 0x7f, 0x17, - 0x0f, 0x00, 0x83, 0x17, 0x0f, 0x00, 0x84, 0x17, 0x0f, 0x00, 0x85, 0x17, - 0x0f, 0x00, 0xe3, 0x17, 0x0f, 0x00, 0xf3, 0x17, 0x0f, 0x00, 0xfb, 0x17, - 0x0f, 0x00, 0x74, 0x18, 0x0f, 0x00, 0x75, 0x18, 0x0f, 0x00, 0x78, 0x18, - 0x0f, 0x00, 0x7c, 0x18, 0x0f, 0x00, 0x7e, 0x18, 0x0f, 0x00, 0x7f, 0x18, - 0x0f, 0x00, 0xf3, 0x19, 0x0f, 0x00, 0xfb, 0x19, 0x0f, 0x00, 0x73, 0x1a, - 0x0f, 0x00, 0x7b, 0x1a, 0x0f, 0x00, 0x08, 0x1b, 0x0f, 0x00, 0x0b, 0x1b, - 0x0f, 0x00, 0xd8, 0x1b, 0x0f, 0x00, 0xf3, 0x1b, 0x0f, 0x00, 0xfb, 0x1b, - 0x0f, 0x00, 0xf3, 0x1d, 0x0f, 0x00, 0xfb, 0x1d, 0x0f, 0x00, 0x93, 0x1f, - 0x0f, 0x00, 0x94, 0x1f, 0x0f, 0x00, 0x95, 0x1f, 0x0f, 0x00, 0x9b, 0x1f, - 0x0f, 0x00, 0xd3, 0x1f, 0x0f, 0x00, 0xd4, 0x1f, 0x0f, 0x00, 0xd5, 0x1f, - 0x0f, 0x00, 0xdb, 0x1f, 0x0f, 0x00, 0xb8, 0x24, 0x0f, 0x00, 0xbc, 0x24, - 0x0f, 0x00, 0xbe, 0x24, 0x0f, 0x00, 0xbf, 0x24, 0x0f, 0x00, 0xb8, 0x26, - 0x0f, 0x00, 0xbc, 0x26, 0x0f, 0x00, 0xbe, 0x26, 0x0f, 0x00, 0xbf, 0x26, - 0x0f, 0x00, 0xe8, 0x2b, 0x0f, 0x00, 0xeb, 0x2b, 0x0f, 0x00, 0xd8, 0x33, - 0x0f, 0x00, 0xdc, 0x33, 0x0f, 0x00, 0xde, 0x33, 0x0f, 0x00, 0xdf, 0x33, - 0x0f, 0x00, 0xe9, 0x33, 0x0f, 0x00, 0xea, 0x33, 0x0f, 0x00, 0xf0, 0x33, - 0x0f, 0x00, 0xf1, 0x33, 0x0f, 0x00, 0xf9, 0x33, 0x0f, 0x00, 0xfd, 0x33, - 0x0f, 0x00, 0xb0, 0x38, 0x0f, 0x00, 0xb1, 0x38, 0x0f, 0x00, 0xb9, 0x38, - 0x0f, 0x00, 0xbd, 0x38, 0x0f, 0x00, 0x8b, 0x39, 0x0f, 0x00, 0xb7, 0x3a, - 0x0f, 0x00, 0xb8, 0x3a, 0x0f, 0x00, 0xbc, 0x3a, 0x0f, 0x00, 0xbe, 0x3a, - 0x0f, 0x00, 0xbf, 0x3a, 0x0f, 0x00, 0xe9, 0x3b, 0x0f, 0x00, 0xea, 0x3b, - 0x0f, 0x00, 0xf0, 0x3b, 0x0f, 0x00, 0xf1, 0x3b, 0x0f, 0x00, 0xf9, 0x3b, - 0x0f, 0x00, 0xfd, 0x3b, 0x0f, 0x00, 0x68, 0x3e, 0x0f, 0x00, 0x6b, 0x3e, - 0x0f, 0x00, 0x78, 0x3e, 0x0f, 0x00, 0x7c, 0x3e, 0x0f, 0x00, 0x7e, 0x3e, - 0x0f, 0x00, 0x7f, 0x3e, 0x0f, 0x00, 0xd0, 0x3f, 0x0f, 0x00, 0xd1, 0x3f, - 0x0f, 0x00, 0xd6, 0x3f, 0x0f, 0x00, 0xd7, 0x3f, 0x0f, 0x00, 0xd9, 0x3f, - 0x0f, 0x00, 0xdd, 0x3f, 0x0f, 0x00, 0xe6, 0x3f, 0x0f, 0x00, 0xe7, 0x3f, - 0x0f, 0x00, 0xe8, 0x3f, 0x0f, 0x00, 0xeb, 0x3f, 0x0f, 0x00, 0xf6, 0x3f, - 0x0f, 0x00, 0xf7, 0x3f, 0x0f, 0x00, 0xf8, 0x3f, 0x0f, 0x00, 0xfc, 0x3f, - 0x0f, 0x00, 0xfe, 0x3f, 0x0f, 0x00, 0xff, 0x3f, 0x0f, 0x00, 0x77, 0x40, - 0x0f, 0x00, 0x78, 0x40, 0x0f, 0x00, 0x7c, 0x40, 0x0f, 0x00, 0x7e, 0x40, - 0x0f, 0x00, 0x7f, 0x40, 0x0f, 0x00, 0xb0, 0x40, 0x0f, 0x00, 0xb1, 0x40, - 0x0f, 0x00, 0xb9, 0x40, 0x0f, 0x00, 0xbd, 0x40, 0x0f, 0x00, 0x70, 0x44, - 0x0f, 0x00, 0x71, 0x44, 0x0f, 0x00, 0x79, 0x44, 0x0f, 0x00, 0x7d, 0x44, - 0x0f, 0x00, 0xb0, 0x44, 0x0f, 0x00, 0xb1, 0x44, 0x0f, 0x00, 0xb9, 0x44, - 0x0f, 0x00, 0xbd, 0x44, 0x0f, 0x00, 0xc7, 0x45, 0x0f, 0x00, 0xcb, 0x45, - 0x0f, 0x00, 0xf7, 0x45, 0x0f, 0x00, 0xf8, 0x45, 0x0f, 0x00, 0xfc, 0x45, - 0x0f, 0x00, 0xfe, 0x45, 0x0f, 0x00, 0xff, 0x45, 0x0f, 0x00, 0x77, 0x46, - 0x0f, 0x00, 0x78, 0x46, 0x0f, 0x00, 0x7c, 0x46, 0x0f, 0x00, 0x7e, 0x46, - 0x0f, 0x00, 0x7f, 0x46, 0x0f, 0x00, 0xb0, 0x46, 0x0f, 0x00, 0xb1, 0x46, - 0x0f, 0x00, 0xb9, 0x46, 0x0f, 0x00, 0xbd, 0x46, 0x0f, 0x00, 0xf0, 0x47, - 0x0f, 0x00, 0xf1, 0x47, 0x0f, 0x00, 0xf9, 0x47, 0x0f, 0x00, 0xfd, 0x47, - 0x0f, 0x00, 0x6b, 0x48, 0x0f, 0x00, 0x8b, 0x48, 0x0f, 0x00, 0x6b, 0x49, - 0x0f, 0x00, 0x8b, 0x49, 0x0f, 0x00, 0xcb, 0x49, 0x0f, 0x00, 0xeb, 0x49, - 0x0f, 0x00, 0x70, 0x4a, 0x0f, 0x00, 0x71, 0x4a, 0x0f, 0x00, 0x77, 0x4a, - 0x0f, 0x00, 0x79, 0x4a, 0x0f, 0x00, 0x7d, 0x4a, 0x0f, 0x00, 0xeb, 0x4b, - 0x0f, 0x00, 0xf8, 0x4b, 0x0f, 0x00, 0xfc, 0x4b, 0x0f, 0x00, 0xfe, 0x4b, - 0x0f, 0x00, 0xff, 0x4b, 0x0f, 0x00, 0x0b, 0x4f, 0x0f, 0x00, 0xc7, 0x51, - 0x0f, 0x00, 0xcb, 0x51, 0x0f, 0x00, 0xf7, 0x51, 0x0f, 0x00, 0xf8, 0x51, - 0x0f, 0x00, 0xfc, 0x51, 0x0f, 0x00, 0xfe, 0x51, 0x0f, 0x00, 0xff, 0x51, - 0x0f, 0x00, 0x8b, 0x53, 0x0f, 0x00, 0x78, 0x55, 0x0f, 0x00, 0x7c, 0x55, - 0x0f, 0x00, 0x7e, 0x55, 0x0f, 0x00, 0x7f, 0x55, 0x0f, 0x00, 0xf0, 0x59, - 0x0f, 0x00, 0xf1, 0x59, 0x0f, 0x00, 0xf9, 0x59, 0x0f, 0x00, 0xfd, 0x59, - 0x0f, 0x00, 0xc7, 0x5d, 0x0f, 0x00, 0xcb, 0x5d, 0x0f, 0x00, 0xf7, 0x5d, - 0x0f, 0x00, 0xf8, 0x5d, 0x0f, 0x00, 0xfc, 0x5d, 0x0f, 0x00, 0xfe, 0x5d, - 0x0f, 0x00, 0xff, 0x5d, 0x0f, 0x00, 0x8b, 0x64, 0x0f, 0x00, 0x8b, 0x66, - 0x0f, 0x00, 0x6b, 0x67, 0x0f, 0x00, 0x78, 0x6b, 0x0f, 0x00, 0x7c, 0x6b, - 0x0f, 0x00, 0x7e, 0x6b, 0x0f, 0x00, 0x7f, 0x6b, 0x0f, 0x00, 0x08, 0x85, - 0x0f, 0x00, 0x0b, 0x85, 0x0f, 0x00, 0x18, 0x87, 0x0f, 0x00, 0x1c, 0x87, - 0x0f, 0x00, 0x1e, 0x87, 0x0f, 0x00, 0x1f, 0x87, 0x0f, 0x00, 0x83, 0x87, - 0x0f, 0x00, 0x84, 0x87, 0x0f, 0x00, 0x85, 0x87, 0x0f, 0x00, 0x86, 0x87, - 0x0f, 0x00, 0x87, 0x87, 0x0f, 0x00, 0x89, 0x87, 0x0f, 0x00, 0x8a, 0x87, - 0x0f, 0x00, 0x8d, 0x87, 0x0f, 0x00, 0x90, 0x87, 0x0f, 0x00, 0x91, 0x87, - 0x0f, 0x00, 0x93, 0x87, 0x0f, 0x00, 0x94, 0x87, 0x0f, 0x00, 0x95, 0x87, - 0x0f, 0x00, 0x96, 0x87, 0x0f, 0x00, 0x97, 0x87, 0x0f, 0x00, 0x99, 0x87, - 0x0f, 0x00, 0x9b, 0x87, 0x0f, 0x00, 0x9d, 0x87, 0x0f, 0x00, 0x10, 0x8b, - 0x0f, 0x00, 0x11, 0x8b, 0x0f, 0x00, 0x16, 0x8b, 0x0f, 0x00, 0x17, 0x8b, - 0x0f, 0x00, 0x19, 0x8b, 0x0f, 0x00, 0x1d, 0x8b, 0x0f, 0x00, 0x80, 0x8b, - 0x0f, 0x00, 0x81, 0x8b, 0x0f, 0x00, 0x82, 0x8b, 0x0f, 0x00, 0x88, 0x8b, - 0x0f, 0x00, 0x8b, 0x8b, 0x0f, 0x00, 0x8c, 0x8b, 0x0f, 0x00, 0x8e, 0x8b, - 0x0f, 0x00, 0x8f, 0x8b, 0x0f, 0x00, 0x92, 0x8b, 0x0f, 0x00, 0x98, 0x8b, - 0x0f, 0x00, 0x9a, 0x8b, 0x0f, 0x00, 0x9c, 0x8b, 0x0f, 0x00, 0x9e, 0x8b, - 0x0f, 0x00, 0x9f, 0x8b, 0x0f, 0x00, 0xf4, 0x93, 0x0f, 0x00, 0xf5, 0x93, - 0x0f, 0x00, 0xf8, 0x93, 0x0f, 0x00, 0xfc, 0x93, 0x0f, 0x00, 0xfe, 0x93, - 0x0f, 0x00, 0xff, 0x93, 0x0f, 0x00, 0xf3, 0x9b, 0x0f, 0x00, 0xfb, 0x9b, - 0x0f, 0x00, 0xc3, 0x9f, 0x0f, 0x00, 0xc4, 0x9f, 0x0f, 0x00, 0xc5, 0x9f, - 0x0f, 0x00, 0xc8, 0x9f, 0x0f, 0x00, 0xcb, 0x9f, 0x0f, 0x00, 0xcc, 0x9f, - 0x0f, 0x00, 0xce, 0x9f, 0x0f, 0x00, 0xcf, 0x9f, 0x0f, 0x00, 0xe4, 0x9f, - 0x0f, 0x00, 0xe5, 0x9f, 0x0f, 0x00, 0xe8, 0x9f, 0x0f, 0x00, 0xeb, 0x9f, - 0x0f, 0x00, 0xec, 0x9f, 0x0f, 0x00, 0xee, 0x9f, 0x0f, 0x00, 0xef, 0x9f, - 0x0f, 0x00, 0xf4, 0x9f, 0x0f, 0x00, 0xf5, 0x9f, 0x0f, 0x00, 0xf8, 0x9f, - 0x0f, 0x00, 0xfc, 0x9f, 0x0f, 0x00, 0xfe, 0x9f, 0x0f, 0x00, 0xff, 0x9f, - 0x0f, 0x00, 0x98, 0xa7, 0x0f, 0x00, 0x9c, 0xa7, 0x0f, 0x00, 0x9e, 0xa7, - 0x0f, 0x00, 0x9f, 0xa7, 0x0f, 0x00, 0x88, 0xab, 0x0f, 0x00, 0x8b, 0xab, - 0x0f, 0x00, 0x98, 0xab, 0x0f, 0x00, 0x9c, 0xab, 0x0f, 0x00, 0x9e, 0xab, - 0x0f, 0x00, 0x9f, 0xab, 0x0f, 0x00, 0xd8, 0xb3, 0x0f, 0x00, 0xdc, 0xb3, - 0x0f, 0x00, 0xde, 0xb3, 0x0f, 0x00, 0xdf, 0xb3, 0x0f, 0x00, 0xe9, 0xb3, - 0x0f, 0x00, 0xea, 0xb3, 0x0f, 0x00, 0xf0, 0xb3, 0x0f, 0x00, 0xf1, 0xb3, - 0x0f, 0x00, 0xf9, 0xb3, 0x0f, 0x00, 0xfd, 0xb3, 0x0f, 0x00, 0x8b, 0xb9, - 0x0f, 0x00, 0x88, 0xbb, 0x0f, 0x00, 0x8b, 0xbb, 0x0f, 0x00, 0x98, 0xbb, - 0x0f, 0x00, 0x9c, 0xbb, 0x0f, 0x00, 0x9e, 0xbb, 0x0f, 0x00, 0x9f, 0xbb, - 0x0f, 0x00, 0x68, 0xbe, 0x0f, 0x00, 0x6b, 0xbe, 0x0f, 0x00, 0x78, 0xbe, - 0x0f, 0x00, 0x7c, 0xbe, 0x0f, 0x00, 0x7e, 0xbe, 0x0f, 0x00, 0x7f, 0xbe, - 0x0f, 0x00, 0xd0, 0xbf, 0x0f, 0x00, 0xd1, 0xbf, 0x0f, 0x00, 0xd6, 0xbf, - 0x0f, 0x00, 0xd7, 0xbf, 0x0f, 0x00, 0xd9, 0xbf, 0x0f, 0x00, 0xdd, 0xbf, - 0x0f, 0x00, 0xe6, 0xbf, 0x0f, 0x00, 0xe7, 0xbf, 0x0f, 0x00, 0xe8, 0xbf, - 0x0f, 0x00, 0xeb, 0xbf, 0x0f, 0x00, 0xf6, 0xbf, 0x0f, 0x00, 0xf7, 0xbf, - 0x0f, 0x00, 0xf8, 0xbf, 0x0f, 0x00, 0xfc, 0xbf, 0x0f, 0x00, 0xfe, 0xbf, - 0x0f, 0x00, 0xff, 0xbf, 0x0f, 0x00, 0xb2, 0xc4, 0x0f, 0x00, 0xb4, 0xc4, - 0x0f, 0x00, 0xb5, 0xc4, 0x0f, 0x00, 0xb6, 0xc4, 0x0f, 0x00, 0xb7, 0xc4, - 0x0f, 0x00, 0xb8, 0xc4, 0x0f, 0x00, 0xba, 0xc4, 0x0f, 0x00, 0xbc, 0xc4, - 0x0f, 0x00, 0xbe, 0xc4, 0x0f, 0x00, 0xbf, 0xc4, 0x0f, 0x00, 0x08, 0xc5, - 0x0f, 0x00, 0x0b, 0xc5, 0x0f, 0x00, 0xb0, 0xc6, 0x0f, 0x00, 0xb1, 0xc6, - 0x0f, 0x00, 0xb3, 0xc6, 0x0f, 0x00, 0xb9, 0xc6, 0x0f, 0x00, 0xbb, 0xc6, - 0x0f, 0x00, 0xbd, 0xc6, 0x0f, 0x00, 0xe0, 0xc7, 0x0f, 0x00, 0xe1, 0xc7, - 0x0f, 0x00, 0xe2, 0xc7, 0x0f, 0x00, 0xe4, 0xc7, 0x0f, 0x00, 0xe5, 0xc7, - 0x0f, 0x00, 0xe6, 0xc7, 0x0f, 0x00, 0xe7, 0xc7, 0x0f, 0x00, 0xe8, 0xc7, - 0x0f, 0x00, 0xeb, 0xc7, 0x0f, 0x00, 0xec, 0xc7, 0x0f, 0x00, 0xee, 0xc7, - 0x0f, 0x00, 0xef, 0xc7, 0x0f, 0x00, 0xf2, 0xc7, 0x0f, 0x00, 0xf4, 0xc7, - 0x0f, 0x00, 0xf5, 0xc7, 0x0f, 0x00, 0xf6, 0xc7, 0x0f, 0x00, 0xf7, 0xc7, - 0x0f, 0x00, 0xf8, 0xc7, 0x0f, 0x00, 0xfa, 0xc7, 0x0f, 0x00, 0xfc, 0xc7, - 0x0f, 0x00, 0xfe, 0xc7, 0x0f, 0x00, 0xff, 0xc7, 0x0f, 0x00, 0xf2, 0xcb, - 0x0f, 0x00, 0xf4, 0xcb, 0x0f, 0x00, 0xf5, 0xcb, 0x0f, 0x00, 0xf6, 0xcb, - 0x0f, 0x00, 0xf7, 0xcb, 0x0f, 0x00, 0xf8, 0xcb, 0x0f, 0x00, 0xfa, 0xcb, - 0x0f, 0x00, 0xfc, 0xcb, 0x0f, 0x00, 0xfe, 0xcb, 0x0f, 0x00, 0xff, 0xcb, - 0x0f, 0x00, 0xd8, 0xd3, 0x0f, 0x00, 0xdc, 0xd3, 0x0f, 0x00, 0xde, 0xd3, - 0x0f, 0x00, 0xdf, 0xd3, 0x0f, 0x00, 0xe3, 0xd3, 0x0f, 0x00, 0xf3, 0xd3, - 0x0f, 0x00, 0xfb, 0xd3, 0x0f, 0x00, 0xb3, 0xd8, 0x0f, 0x00, 0xbb, 0xd8, - 0x0f, 0x00, 0xb3, 0xda, 0x0f, 0x00, 0xbb, 0xda, 0x0f, 0x00, 0xe4, 0xdb, - 0x0f, 0x00, 0xe5, 0xdb, 0x0f, 0x00, 0xe8, 0xdb, 0x0f, 0x00, 0xeb, 0xdb, - 0x0f, 0x00, 0xec, 0xdb, 0x0f, 0x00, 0xee, 0xdb, 0x0f, 0x00, 0xef, 0xdb, - 0x0f, 0x00, 0xf4, 0xdb, 0x0f, 0x00, 0xf5, 0xdb, 0x0f, 0x00, 0xf8, 0xdb, - 0x0f, 0x00, 0xfc, 0xdb, 0x0f, 0x00, 0xfe, 0xdb, 0x0f, 0x00, 0xff, 0xdb, - 0x0f, 0x00, 0xd3, 0xdf, 0x0f, 0x00, 0xd4, 0xdf, 0x0f, 0x00, 0xd5, 0xdf, - 0x0f, 0x00, 0xdb, 0xdf, 0x0f, 0x00, 0xe4, 0xdf, 0x0f, 0x00, 0xe5, 0xdf, - 0x0f, 0x00, 0xe8, 0xdf, 0x0f, 0x00, 0xeb, 0xdf, 0x0f, 0x00, 0xec, 0xdf, - 0x0f, 0x00, 0xee, 0xdf, 0x0f, 0x00, 0xef, 0xdf, 0x0f, 0x00, 0xf4, 0xdf, - 0x0f, 0x00, 0xf5, 0xdf, 0x0f, 0x00, 0xf8, 0xdf, 0x0f, 0x00, 0xfc, 0xdf, - 0x0f, 0x00, 0xfe, 0xdf, 0x0f, 0x00, 0xff, 0xdf, 0x0f, 0x00, 0x86, 0xe4, - 0x0f, 0x00, 0x87, 0xe4, 0x0f, 0x00, 0x89, 0xe4, 0x0f, 0x00, 0x8a, 0xe4, - 0x0f, 0x00, 0xb2, 0xe4, 0x0f, 0x00, 0xb4, 0xe4, 0x0f, 0x00, 0xb5, 0xe4, - 0x0f, 0x00, 0xb6, 0xe4, 0x0f, 0x00, 0xb7, 0xe4, 0x0f, 0x00, 0xb8, 0xe4, - 0x0f, 0x00, 0xba, 0xe4, 0x0f, 0x00, 0xbc, 0xe4, 0x0f, 0x00, 0xbe, 0xe4, - 0x0f, 0x00, 0xbf, 0xe4, 0x0f, 0x00, 0xb7, 0xe6, 0x0f, 0x00, 0x83, 0xe7, - 0x0f, 0x00, 0x84, 0xe7, 0x0f, 0x00, 0x85, 0xe7, 0x0f, 0x00, 0x86, 0xe7, - 0x0f, 0x00, 0x87, 0xe7, 0x0f, 0x00, 0x89, 0xe7, 0x0f, 0x00, 0x8a, 0xe7, - 0x0f, 0x00, 0x8d, 0xe7, 0x0f, 0x00, 0xc3, 0xe7, 0x0f, 0x00, 0xc4, 0xe7, - 0x0f, 0x00, 0xc5, 0xe7, 0x0f, 0x00, 0xc6, 0xe7, 0x0f, 0x00, 0xc7, 0xe7, - 0x0f, 0x00, 0xc8, 0xe7, 0x0f, 0x00, 0xcb, 0xe7, 0x0f, 0x00, 0xcc, 0xe7, - 0x0f, 0x00, 0xce, 0xe7, 0x0f, 0x00, 0xcf, 0xe7, 0x0f, 0x00, 0xe0, 0xe7, - 0x0f, 0x00, 0xe1, 0xe7, 0x0f, 0x00, 0xe2, 0xe7, 0x0f, 0x00, 0xe4, 0xe7, - 0x0f, 0x00, 0xe5, 0xe7, 0x0f, 0x00, 0xe6, 0xe7, 0x0f, 0x00, 0xe7, 0xe7, - 0x0f, 0x00, 0xe8, 0xe7, 0x0f, 0x00, 0xeb, 0xe7, 0x0f, 0x00, 0xec, 0xe7, - 0x0f, 0x00, 0xee, 0xe7, 0x0f, 0x00, 0xef, 0xe7, 0x0f, 0x00, 0xf2, 0xe7, - 0x0f, 0x00, 0xf4, 0xe7, 0x0f, 0x00, 0xf5, 0xe7, 0x0f, 0x00, 0xf6, 0xe7, - 0x0f, 0x00, 0xf7, 0xe7, 0x0f, 0x00, 0xf8, 0xe7, 0x0f, 0x00, 0xfa, 0xe7, - 0x0f, 0x00, 0xfc, 0xe7, 0x0f, 0x00, 0xfe, 0xe7, 0x0f, 0x00, 0xff, 0xe7, - 0x0f, 0x00, 0xf2, 0xeb, 0x0f, 0x00, 0xf4, 0xeb, 0x0f, 0x00, 0xf5, 0xeb, - 0x0f, 0x00, 0xf6, 0xeb, 0x0f, 0x00, 0xf7, 0xeb, 0x0f, 0x00, 0xf8, 0xeb, - 0x0f, 0x00, 0xfa, 0xeb, 0x0f, 0x00, 0xfc, 0xeb, 0x0f, 0x00, 0xfe, 0xeb, - 0x0f, 0x00, 0xff, 0xeb, 0x0f, 0x00, 0x74, 0xf2, 0x0f, 0x00, 0x75, 0xf2, - 0x0f, 0x00, 0x78, 0xf2, 0x0f, 0x00, 0x7c, 0xf2, 0x0f, 0x00, 0x7e, 0xf2, - 0x0f, 0x00, 0x7f, 0xf2, 0x0f, 0x00, 0x78, 0xf3, 0x0f, 0x00, 0x7c, 0xf3, - 0x0f, 0x00, 0x7e, 0xf3, 0x0f, 0x00, 0x7f, 0xf3, 0x0f, 0x00, 0xf2, 0xf3, - 0x0f, 0x00, 0xf4, 0xf3, 0x0f, 0x00, 0xf5, 0xf3, 0x0f, 0x00, 0xf6, 0xf3, - 0x0f, 0x00, 0xf7, 0xf3, 0x0f, 0x00, 0xf8, 0xf3, 0x0f, 0x00, 0xfa, 0xf3, - 0x0f, 0x00, 0xfc, 0xf3, 0x0f, 0x00, 0xfe, 0xf3, 0x0f, 0x00, 0xff, 0xf3, - 0x0f, 0x00, 0x86, 0xf8, 0x0f, 0x00, 0x0b, 0xf9, 0x0f, 0x00, 0xf2, 0xfb, - 0x0f, 0x00, 0xf4, 0xfb, 0x0f, 0x00, 0xf5, 0xfb, 0x0f, 0x00, 0xf6, 0xfb, - 0x0f, 0x00, 0xf7, 0xfb, 0x0f, 0x00, 0xf8, 0xfb, 0x0f, 0x00, 0xfa, 0xfb, - 0x0f, 0x00, 0xfc, 0xfb, 0x0f, 0x00, 0xfe, 0xfb, 0x0f, 0x00, 0xff, 0xfb, - 0x0f, 0x00, 0x88, 0xfc, 0x0f, 0x00, 0x8b, 0xfc, 0x0f, 0x00, 0x90, 0xfc, - 0x0f, 0x00, 0x91, 0xfc, 0x0f, 0x00, 0x96, 0xfc, 0x0f, 0x00, 0x97, 0xfc, - 0x0f, 0x00, 0x99, 0xfc, 0x0f, 0x00, 0x9d, 0xfc, 0x0f, 0x00, 0xb3, 0xfc, - 0x0f, 0x00, 0xbb, 0xfc, 0x0f, 0x00, 0x64, 0xfe, 0x0f, 0x00, 0x65, 0xfe, - 0x0f, 0x00, 0x68, 0xfe, 0x0f, 0x00, 0x6b, 0xfe, 0x0f, 0x00, 0x6c, 0xfe, - 0x0f, 0x00, 0x6e, 0xfe, 0x0f, 0x00, 0x6f, 0xfe, 0x0f, 0x00, 0x74, 0xfe, - 0x0f, 0x00, 0x75, 0xfe, 0x0f, 0x00, 0x78, 0xfe, 0x0f, 0x00, 0x7c, 0xfe, - 0x0f, 0x00, 0x7e, 0xfe, 0x0f, 0x00, 0x7f, 0xfe, 0x0f, 0x00, 0x8b, 0xfe, - 0x0f, 0x00, 0x68, 0xff, 0x0f, 0x00, 0x6b, 0xff, 0x0f, 0x00, 0x78, 0xff, - 0x0f, 0x00, 0x7c, 0xff, 0x0f, 0x00, 0x7e, 0xff, 0x0f, 0x00, 0x7f, 0xff, - 0x0f, 0x00, 0x88, 0xff, 0x0f, 0x00, 0x8b, 0xff, 0x0f, 0x00, 0x8c, 0xff, - 0x0f, 0x00, 0x8e, 0xff, 0x0f, 0x00, 0x8f, 0xff, 0x0f, 0x00, 0xc3, 0xff, - 0x0f, 0x00, 0xc4, 0xff, 0x0f, 0x00, 0xc5, 0xff, 0x0f, 0x00, 0xc6, 0xff, - 0x0f, 0x00, 0xc7, 0xff, 0x0f, 0x00, 0xc8, 0xff, 0x0f, 0x00, 0xcb, 0xff, - 0x0f, 0x00, 0xcc, 0xff, 0x0f, 0x00, 0xce, 0xff, 0x0f, 0x00, 0xcf, 0xff, - 0x0f, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe2, 0xff, - 0x0f, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe6, 0xff, - 0x0f, 0x00, 0xe7, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xeb, 0xff, - 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, - 0x0f, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf5, 0xff, - 0x0f, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf8, 0xff, - 0x0f, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfe, 0xff, - 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0x00, 0x10, 0x00, 0xfc, 0x00, - 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x00, 0xf8, 0x05, - 0x10, 0x00, 0xfc, 0x05, 0x10, 0x00, 0xfe, 0x05, 0x10, 0x00, 0xff, 0x05, - 0x10, 0x00, 0xcb, 0x09, 0x10, 0x00, 0xeb, 0x09, 0x10, 0x00, 0x4b, 0x0a, - 0x10, 0x00, 0x8b, 0x0b, 0x10, 0x00, 0xcb, 0x0d, 0x10, 0x00, 0xeb, 0x0d, - 0x10, 0x00, 0xcb, 0x15, 0x10, 0x00, 0xeb, 0x15, 0x10, 0x00, 0xeb, 0x1b, - 0x10, 0x00, 0xcb, 0x22, 0x10, 0x00, 0xeb, 0x22, 0x10, 0x00, 0xeb, 0x23, - 0x10, 0x00, 0xcb, 0x29, 0x10, 0x00, 0xeb, 0x29, 0x10, 0x00, 0xf8, 0x29, - 0x10, 0x00, 0xfc, 0x29, 0x10, 0x00, 0xfe, 0x29, 0x10, 0x00, 0xff, 0x29, - 0x10, 0x00, 0xcb, 0x2d, 0x10, 0x00, 0xeb, 0x2d, 0x10, 0x00, 0x30, 0x33, - 0x10, 0x00, 0xf0, 0x33, 0x10, 0x00, 0xf1, 0x33, 0x10, 0x00, 0xf7, 0x33, - 0x10, 0x00, 0xf9, 0x33, 0x10, 0x00, 0xfd, 0x33, 0x10, 0x00, 0x30, 0x3f, - 0x10, 0x00, 0xcb, 0x41, 0x10, 0x00, 0xeb, 0x41, 0x10, 0x00, 0xf0, 0x41, - 0x10, 0x00, 0xf1, 0x41, 0x10, 0x00, 0xf9, 0x41, 0x10, 0x00, 0xfd, 0x41, - 0x10, 0x00, 0x8b, 0x42, 0x10, 0x00, 0xeb, 0x43, 0x10, 0x00, 0xf0, 0x43, - 0x10, 0x00, 0xf1, 0x43, 0x10, 0x00, 0xf9, 0x43, 0x10, 0x00, 0xfd, 0x43, - 0x10, 0x00, 0xb0, 0x44, 0x10, 0x00, 0xf7, 0x45, 0x10, 0x00, 0xf8, 0x45, - 0x10, 0x00, 0xfc, 0x45, 0x10, 0x00, 0xfe, 0x45, 0x10, 0x00, 0xff, 0x45, - 0x10, 0x00, 0xb0, 0x46, 0x10, 0x00, 0xb0, 0x47, 0x10, 0x00, 0x4b, 0x4a, - 0x10, 0x00, 0x8b, 0x4b, 0x10, 0x00, 0x8b, 0x4f, 0x10, 0x00, 0xcb, 0x4f, - 0x10, 0x00, 0xeb, 0x4f, 0x10, 0x00, 0xf0, 0x4f, 0x10, 0x00, 0xf1, 0x4f, - 0x10, 0x00, 0xf7, 0x4f, 0x10, 0x00, 0xf9, 0x4f, 0x10, 0x00, 0xfd, 0x4f, - 0x10, 0x00, 0x8b, 0x55, 0x10, 0x00, 0xcb, 0x55, 0x10, 0x00, 0xeb, 0x55, - 0x10, 0x00, 0xf7, 0x5f, 0x10, 0x00, 0xf8, 0x5f, 0x10, 0x00, 0xfc, 0x5f, - 0x10, 0x00, 0xfe, 0x5f, 0x10, 0x00, 0xff, 0x5f, 0x10, 0x00, 0x4b, 0x64, - 0x10, 0x00, 0xeb, 0x64, 0x10, 0x00, 0xeb, 0x66, 0x10, 0x00, 0x4b, 0x67, - 0x10, 0x00, 0x8b, 0x6a, 0x10, 0x00, 0xcb, 0x6a, 0x10, 0x00, 0xeb, 0x6a, - 0x10, 0x00, 0xf8, 0x6a, 0x10, 0x00, 0xfc, 0x6a, 0x10, 0x00, 0xfe, 0x6a, - 0x10, 0x00, 0xff, 0x6a, 0x10, 0x00, 0xeb, 0x78, 0x10, 0x00, 0x5b, 0x7c, - 0x10, 0x00, 0xf8, 0x7c, 0x10, 0x00, 0xfc, 0x7c, 0x10, 0x00, 0xfe, 0x7c, - 0x10, 0x00, 0xff, 0x7c, 0x10, 0x00, 0xf7, 0x81, 0x10, 0x00, 0xf1, 0x82, - 0x10, 0x00, 0xf9, 0x82, 0x10, 0x00, 0xf7, 0x83, 0x10, 0x00, 0xf7, 0x84, - 0x10, 0x00, 0xf8, 0x84, 0x10, 0x00, 0xfc, 0x84, 0x10, 0x00, 0xfe, 0x84, - 0x10, 0x00, 0xff, 0x84, 0x10, 0x00, 0xf7, 0x86, 0x10, 0x00, 0xf8, 0x86, - 0x10, 0x00, 0xfc, 0x86, 0x10, 0x00, 0xfe, 0x86, 0x10, 0x00, 0xff, 0x86, - 0x10, 0x00, 0xf7, 0x87, 0x10, 0x00, 0x8b, 0x8e, 0x10, 0x00, 0xbb, 0x8e, - 0x10, 0x00, 0xeb, 0xa4, 0x10, 0x00, 0xf8, 0xa4, 0x10, 0x00, 0xfc, 0xa4, - 0x10, 0x00, 0xfe, 0xa4, 0x10, 0x00, 0xff, 0xa4, 0x10, 0x00, 0xeb, 0xa6, - 0x10, 0x00, 0x4b, 0xa7, 0x10, 0x00, 0xf1, 0xb7, 0x10, 0x00, 0xf7, 0xb7, - 0x10, 0x00, 0xf9, 0xb7, 0x10, 0x00, 0xf0, 0xb8, 0x10, 0x00, 0xf1, 0xb8, - 0x10, 0x00, 0xf7, 0xb8, 0x10, 0x00, 0xf9, 0xb8, 0x10, 0x00, 0xfd, 0xb8, - 0x10, 0x00, 0xbb, 0xb9, 0x10, 0x00, 0xf0, 0xbc, 0x10, 0x00, 0xf1, 0xbc, - 0x10, 0x00, 0xf7, 0xbc, 0x10, 0x00, 0xf9, 0xbc, 0x10, 0x00, 0xfd, 0xbc, - 0x10, 0x00, 0xbb, 0xbd, 0x10, 0x00, 0xf1, 0xbf, 0x10, 0x00, 0xf7, 0xbf, - 0x10, 0x00, 0xf9, 0xbf, 0x10, 0x00, 0xf6, 0xc5, 0x10, 0x00, 0xf7, 0xc5, - 0x10, 0x00, 0xf8, 0xc5, 0x10, 0x00, 0xfc, 0xc5, 0x10, 0x00, 0xfe, 0xc5, - 0x10, 0x00, 0xff, 0xc5, 0x10, 0x00, 0xf0, 0xcc, 0x10, 0x00, 0xf1, 0xcc, - 0x10, 0x00, 0xf9, 0xcc, 0x10, 0x00, 0xfd, 0xcc, 0x10, 0x00, 0x51, 0xce, - 0x10, 0x00, 0x56, 0xce, 0x10, 0x00, 0x57, 0xce, 0x10, 0x00, 0x58, 0xce, - 0x10, 0x00, 0x5c, 0xce, 0x10, 0x00, 0x5e, 0xce, 0x10, 0x00, 0x5f, 0xce, - 0x10, 0x00, 0xf0, 0xce, 0x10, 0x00, 0xf1, 0xce, 0x10, 0x00, 0xf9, 0xce, - 0x10, 0x00, 0xfd, 0xce, 0x10, 0x00, 0x51, 0xcf, 0x10, 0x00, 0x56, 0xcf, - 0x10, 0x00, 0x57, 0xcf, 0x10, 0x00, 0x58, 0xcf, 0x10, 0x00, 0x5c, 0xcf, - 0x10, 0x00, 0x5e, 0xcf, 0x10, 0x00, 0x5f, 0xcf, 0x10, 0x00, 0xf0, 0xcf, - 0x10, 0x00, 0xf1, 0xcf, 0x10, 0x00, 0xf9, 0xcf, 0x10, 0x00, 0xfd, 0xcf, - 0x10, 0x00, 0xe8, 0xd3, 0x10, 0x00, 0xeb, 0xd3, 0x10, 0x00, 0xf8, 0xd9, - 0x10, 0x00, 0xfc, 0xd9, 0x10, 0x00, 0xfe, 0xd9, 0x10, 0x00, 0xff, 0xd9, - 0x10, 0x00, 0xf8, 0xdd, 0x10, 0x00, 0xfc, 0xdd, 0x10, 0x00, 0xfe, 0xdd, - 0x10, 0x00, 0xff, 0xdd, 0x10, 0x00, 0x30, 0xe5, 0x10, 0x00, 0x8b, 0xe5, - 0x10, 0x00, 0xcb, 0xe5, 0x10, 0x00, 0xeb, 0xe5, 0x10, 0x00, 0xf0, 0xe5, - 0x10, 0x00, 0x30, 0xec, 0x10, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xf1, 0xec, - 0x10, 0x00, 0xf9, 0xec, 0x10, 0x00, 0xfd, 0xec, 0x10, 0x00, 0xe6, 0xee, - 0x10, 0x00, 0xf6, 0xee, 0x10, 0x00, 0xf7, 0xee, 0x10, 0x00, 0xf8, 0xee, - 0x10, 0x00, 0xfc, 0xee, 0x10, 0x00, 0xfe, 0xee, 0x10, 0x00, 0xff, 0xee, - 0x10, 0x00, 0xf0, 0xef, 0x10, 0x00, 0xf1, 0xef, 0x10, 0x00, 0xf9, 0xef, - 0x10, 0x00, 0xfd, 0xef, 0x10, 0x00, 0x30, 0xf3, 0x10, 0x00, 0xe6, 0xf3, - 0x10, 0x00, 0xf0, 0xf3, 0x10, 0x00, 0x30, 0xf9, 0x10, 0x00, 0x8b, 0xf9, - 0x10, 0x00, 0xcb, 0xf9, 0x10, 0x00, 0xeb, 0xf9, 0x10, 0x00, 0xf7, 0xf9, - 0x10, 0x00, 0xf8, 0xf9, 0x10, 0x00, 0xfc, 0xf9, 0x10, 0x00, 0xfe, 0xf9, - 0x10, 0x00, 0xff, 0xf9, 0x10, 0x00, 0x30, 0xfd, 0x10, 0x00, 0x8b, 0xfd, - 0x10, 0x00, 0xcb, 0xfd, 0x10, 0x00, 0xeb, 0xfd, 0x10, 0x00, 0xf0, 0xfd, - 0x10, 0x00, 0x30, 0xff, 0x10, 0x00, 0x58, 0x00, 0x11, 0x00, 0xf3, 0x00, - 0x11, 0x00, 0xfb, 0x00, 0x11, 0x00, 0xf3, 0x01, 0x11, 0x00, 0xfb, 0x01, - 0x11, 0x00, 0x58, 0x02, 0x11, 0x00, 0xf3, 0x02, 0x11, 0x00, 0xfb, 0x02, - 0x11, 0x00, 0x58, 0x05, 0x11, 0x00, 0x5c, 0x05, 0x11, 0x00, 0x5e, 0x05, - 0x11, 0x00, 0x5f, 0x05, 0x11, 0x00, 0x88, 0x06, 0x11, 0x00, 0x8b, 0x06, - 0x11, 0x00, 0xf4, 0x07, 0x11, 0x00, 0xf5, 0x07, 0x11, 0x00, 0xf8, 0x07, - 0x11, 0x00, 0xfc, 0x07, 0x11, 0x00, 0xfe, 0x07, 0x11, 0x00, 0xff, 0x07, - 0x11, 0x00, 0xf8, 0x0a, 0x11, 0x00, 0xfc, 0x0a, 0x11, 0x00, 0xfe, 0x0a, - 0x11, 0x00, 0xff, 0x0a, 0x11, 0x00, 0xf3, 0x0f, 0x11, 0x00, 0xfb, 0x0f, - 0x11, 0x00, 0xf4, 0x11, 0x11, 0x00, 0xf5, 0x11, 0x11, 0x00, 0xf8, 0x11, - 0x11, 0x00, 0xfc, 0x11, 0x11, 0x00, 0xfe, 0x11, 0x11, 0x00, 0xff, 0x11, - 0x11, 0x00, 0x58, 0x16, 0x11, 0x00, 0xf3, 0x17, 0x11, 0x00, 0xfb, 0x17, - 0x11, 0x00, 0xf4, 0x1f, 0x11, 0x00, 0xf5, 0x1f, 0x11, 0x00, 0xf8, 0x1f, - 0x11, 0x00, 0xfc, 0x1f, 0x11, 0x00, 0xfe, 0x1f, 0x11, 0x00, 0xff, 0x1f, - 0x11, 0x00, 0xc8, 0x29, 0x11, 0x00, 0xcb, 0x29, 0x11, 0x00, 0xe8, 0x29, - 0x11, 0x00, 0xeb, 0x29, 0x11, 0x00, 0xf8, 0x29, 0x11, 0x00, 0xfc, 0x29, - 0x11, 0x00, 0xfe, 0x29, 0x11, 0x00, 0xff, 0x29, 0x11, 0x00, 0xc8, 0x2d, - 0x11, 0x00, 0xcb, 0x2d, 0x11, 0x00, 0xe8, 0x2d, 0x11, 0x00, 0xeb, 0x2d, - 0x11, 0x00, 0x30, 0x33, 0x11, 0x00, 0xf0, 0x33, 0x11, 0x00, 0xf1, 0x33, - 0x11, 0x00, 0xf9, 0x33, 0x11, 0x00, 0xfd, 0x33, 0x11, 0x00, 0x30, 0x39, - 0x11, 0x00, 0x8b, 0x39, 0x11, 0x00, 0x30, 0x3d, 0x11, 0x00, 0x8b, 0x3d, - 0x11, 0x00, 0x30, 0x3f, 0x11, 0x00, 0xf0, 0x3f, 0x11, 0x00, 0xf1, 0x3f, - 0x11, 0x00, 0xf9, 0x3f, 0x11, 0x00, 0xfd, 0x3f, 0x11, 0x00, 0xb0, 0x40, - 0x11, 0x00, 0x30, 0x41, 0x11, 0x00, 0x51, 0x41, 0x11, 0x00, 0x56, 0x41, - 0x11, 0x00, 0x57, 0x41, 0x11, 0x00, 0x59, 0x41, 0x11, 0x00, 0x5d, 0x41, - 0x11, 0x00, 0x30, 0x42, 0x11, 0x00, 0xe6, 0x43, 0x11, 0x00, 0xf6, 0x43, - 0x11, 0x00, 0xf7, 0x43, 0x11, 0x00, 0xf8, 0x43, 0x11, 0x00, 0xfc, 0x43, - 0x11, 0x00, 0xfe, 0x43, 0x11, 0x00, 0xff, 0x43, 0x11, 0x00, 0xf6, 0x45, - 0x11, 0x00, 0xf7, 0x45, 0x11, 0x00, 0xf8, 0x45, 0x11, 0x00, 0xfc, 0x45, - 0x11, 0x00, 0xfe, 0x45, 0x11, 0x00, 0xff, 0x45, 0x11, 0x00, 0x86, 0x48, - 0x11, 0x00, 0xb0, 0x48, 0x11, 0x00, 0x51, 0x49, 0x11, 0x00, 0x56, 0x49, - 0x11, 0x00, 0x57, 0x49, 0x11, 0x00, 0x58, 0x49, 0x11, 0x00, 0x5c, 0x49, - 0x11, 0x00, 0x5e, 0x49, 0x11, 0x00, 0x5f, 0x49, 0x11, 0x00, 0x51, 0x4e, - 0x11, 0x00, 0x56, 0x4e, 0x11, 0x00, 0x57, 0x4e, 0x11, 0x00, 0x58, 0x4e, - 0x11, 0x00, 0x5c, 0x4e, 0x11, 0x00, 0x5e, 0x4e, 0x11, 0x00, 0x5f, 0x4e, - 0x11, 0x00, 0x51, 0x4f, 0x11, 0x00, 0x56, 0x4f, 0x11, 0x00, 0x57, 0x4f, - 0x11, 0x00, 0x58, 0x4f, 0x11, 0x00, 0x5c, 0x4f, 0x11, 0x00, 0x5e, 0x4f, - 0x11, 0x00, 0x5f, 0x4f, 0x11, 0x00, 0xf0, 0x4f, 0x11, 0x00, 0xf1, 0x4f, - 0x11, 0x00, 0xf9, 0x4f, 0x11, 0x00, 0xfd, 0x4f, 0x11, 0x00, 0x48, 0x52, - 0x11, 0x00, 0x4b, 0x52, 0x11, 0x00, 0x30, 0x53, 0x11, 0x00, 0xf0, 0x53, - 0x11, 0x00, 0xf1, 0x53, 0x11, 0x00, 0xf9, 0x53, 0x11, 0x00, 0xfd, 0x53, - 0x11, 0x00, 0xf7, 0x55, 0x11, 0x00, 0xf8, 0x55, 0x11, 0x00, 0xfc, 0x55, - 0x11, 0x00, 0xfe, 0x55, 0x11, 0x00, 0xff, 0x55, 0x11, 0x00, 0x48, 0x5e, - 0x11, 0x00, 0x4b, 0x5e, 0x11, 0x00, 0x30, 0x5f, 0x11, 0x00, 0xf0, 0x5f, - 0x11, 0x00, 0xf1, 0x5f, 0x11, 0x00, 0xf9, 0x5f, 0x11, 0x00, 0xfd, 0x5f, - 0x11, 0x00, 0x58, 0x69, 0x11, 0x00, 0xc8, 0x6a, 0x11, 0x00, 0xcb, 0x6a, - 0x11, 0x00, 0xe8, 0x6a, 0x11, 0x00, 0xeb, 0x6a, 0x11, 0x00, 0xf8, 0x6a, - 0x11, 0x00, 0xfc, 0x6a, 0x11, 0x00, 0xfe, 0x6a, 0x11, 0x00, 0xff, 0x6a, - 0x11, 0x00, 0xf4, 0x6f, 0x11, 0x00, 0xf5, 0x6f, 0x11, 0x00, 0xf8, 0x6f, - 0x11, 0x00, 0xfc, 0x6f, 0x11, 0x00, 0xfe, 0x6f, 0x11, 0x00, 0xff, 0x6f, - 0x11, 0x00, 0xcb, 0x72, 0x11, 0x00, 0xeb, 0x72, 0x11, 0x00, 0xf8, 0x72, - 0x11, 0x00, 0xfc, 0x72, 0x11, 0x00, 0xfe, 0x72, 0x11, 0x00, 0xff, 0x72, - 0x11, 0x00, 0x58, 0x76, 0x11, 0x00, 0xf3, 0x77, 0x11, 0x00, 0xfb, 0x77, - 0x11, 0x00, 0xe8, 0x7c, 0x11, 0x00, 0xeb, 0x7c, 0x11, 0x00, 0xf8, 0x7c, - 0x11, 0x00, 0xfc, 0x7c, 0x11, 0x00, 0xfe, 0x7c, 0x11, 0x00, 0xff, 0x7c, - 0x11, 0x00, 0xeb, 0x7e, 0x11, 0x00, 0xf8, 0x7e, 0x11, 0x00, 0xfc, 0x7e, - 0x11, 0x00, 0xfe, 0x7e, 0x11, 0x00, 0xff, 0x7e, 0x11, 0x00, 0xb7, 0x80, - 0x11, 0x00, 0xf7, 0x83, 0x11, 0x00, 0x8b, 0x84, 0x11, 0x00, 0xb1, 0x84, - 0x11, 0x00, 0xb9, 0x84, 0x11, 0x00, 0x31, 0x85, 0x11, 0x00, 0x39, 0x85, - 0x11, 0x00, 0x37, 0x86, 0x11, 0x00, 0x38, 0x86, 0x11, 0x00, 0x3c, 0x86, - 0x11, 0x00, 0x3e, 0x86, 0x11, 0x00, 0x3f, 0x86, 0x11, 0x00, 0x8b, 0x86, - 0x11, 0x00, 0xb1, 0x86, 0x11, 0x00, 0xb9, 0x86, 0x11, 0x00, 0x37, 0x87, - 0x11, 0x00, 0xb1, 0x87, 0x11, 0x00, 0xb9, 0x87, 0x11, 0x00, 0xf1, 0x87, - 0x11, 0x00, 0xf9, 0x87, 0x11, 0x00, 0x38, 0x9e, 0x11, 0x00, 0x3c, 0x9e, - 0x11, 0x00, 0x3e, 0x9e, 0x11, 0x00, 0x3f, 0x9e, 0x11, 0x00, 0x8b, 0xa0, - 0x11, 0x00, 0xeb, 0xa5, 0x11, 0x00, 0x8b, 0xa7, 0x11, 0x00, 0x8b, 0xa8, - 0x11, 0x00, 0xf8, 0xab, 0x11, 0x00, 0xfc, 0xab, 0x11, 0x00, 0xfe, 0xab, - 0x11, 0x00, 0xff, 0xab, 0x11, 0x00, 0xcb, 0xaf, 0x11, 0x00, 0xeb, 0xaf, - 0x11, 0x00, 0xf8, 0xaf, 0x11, 0x00, 0xfc, 0xaf, 0x11, 0x00, 0xfe, 0xaf, - 0x11, 0x00, 0xff, 0xaf, 0x11, 0x00, 0xeb, 0xb1, 0x11, 0x00, 0x8b, 0xb3, - 0x11, 0x00, 0xeb, 0xbd, 0x11, 0x00, 0xf7, 0xc5, 0x11, 0x00, 0xf1, 0xe9, - 0x11, 0x00, 0xf9, 0xe9, 0x11, 0x00, 0xf1, 0xed, 0x11, 0x00, 0xf9, 0xed, - 0x11, 0x00, 0xb8, 0x08, 0x12, 0x00, 0xbc, 0x08, 0x12, 0x00, 0xbe, 0x08, - 0x12, 0x00, 0xbf, 0x08, 0x12, 0x00, 0xb8, 0x0a, 0x12, 0x00, 0xbc, 0x0a, - 0x12, 0x00, 0xbe, 0x0a, 0x12, 0x00, 0xbf, 0x0a, 0x12, 0x00, 0xe8, 0x0b, - 0x12, 0x00, 0xeb, 0x0b, 0x12, 0x00, 0xf8, 0x0b, 0x12, 0x00, 0xfc, 0x0b, - 0x12, 0x00, 0xfe, 0x0b, 0x12, 0x00, 0xff, 0x0b, 0x12, 0x00, 0xcb, 0x0d, - 0x12, 0x00, 0xeb, 0x0d, 0x12, 0x00, 0xf8, 0x0d, 0x12, 0x00, 0xfc, 0x0d, - 0x12, 0x00, 0xfe, 0x0d, 0x12, 0x00, 0xff, 0x0d, 0x12, 0x00, 0x88, 0x14, - 0x12, 0x00, 0x8b, 0x14, 0x12, 0x00, 0xcb, 0x15, 0x12, 0x00, 0xeb, 0x15, - 0x12, 0x00, 0x8b, 0x16, 0x12, 0x00, 0x88, 0x1b, 0x12, 0x00, 0x8b, 0x1b, - 0x12, 0x00, 0xc8, 0x1f, 0x12, 0x00, 0xcb, 0x1f, 0x12, 0x00, 0xe8, 0x1f, - 0x12, 0x00, 0xeb, 0x1f, 0x12, 0x00, 0xf8, 0x1f, 0x12, 0x00, 0xfc, 0x1f, - 0x12, 0x00, 0xfe, 0x1f, 0x12, 0x00, 0xff, 0x1f, 0x12, 0x00, 0xe8, 0x23, - 0x12, 0x00, 0xeb, 0x23, 0x12, 0x00, 0xf8, 0x23, 0x12, 0x00, 0xfc, 0x23, - 0x12, 0x00, 0xfe, 0x23, 0x12, 0x00, 0xff, 0x23, 0x12, 0x00, 0xc8, 0x29, - 0x12, 0x00, 0xcb, 0x29, 0x12, 0x00, 0xe8, 0x29, 0x12, 0x00, 0xeb, 0x29, - 0x12, 0x00, 0xf8, 0x29, 0x12, 0x00, 0xfc, 0x29, 0x12, 0x00, 0xfe, 0x29, - 0x12, 0x00, 0xff, 0x29, 0x12, 0x00, 0xf8, 0x2d, 0x12, 0x00, 0xfc, 0x2d, - 0x12, 0x00, 0xfe, 0x2d, 0x12, 0x00, 0xff, 0x2d, 0x12, 0x00, 0x88, 0x3f, - 0x12, 0x00, 0x8b, 0x3f, 0x12, 0x00, 0xc6, 0x3f, 0x12, 0x00, 0xc7, 0x3f, - 0x12, 0x00, 0xc8, 0x3f, 0x12, 0x00, 0xcb, 0x3f, 0x12, 0x00, 0xe6, 0x3f, - 0x12, 0x00, 0xe7, 0x3f, 0x12, 0x00, 0xe8, 0x3f, 0x12, 0x00, 0xeb, 0x3f, - 0x12, 0x00, 0xf6, 0x3f, 0x12, 0x00, 0xf7, 0x3f, 0x12, 0x00, 0xf8, 0x3f, - 0x12, 0x00, 0xfc, 0x3f, 0x12, 0x00, 0xfe, 0x3f, 0x12, 0x00, 0xff, 0x3f, - 0x12, 0x00, 0x8b, 0x47, 0x12, 0x00, 0xf0, 0x47, 0x12, 0x00, 0xf1, 0x47, - 0x12, 0x00, 0xf9, 0x47, 0x12, 0x00, 0xfd, 0x47, 0x12, 0x00, 0xb8, 0x52, - 0x12, 0x00, 0xbc, 0x52, 0x12, 0x00, 0xbe, 0x52, 0x12, 0x00, 0xbf, 0x52, - 0x12, 0x00, 0xeb, 0x53, 0x12, 0x00, 0xf7, 0x53, 0x12, 0x00, 0xf8, 0x53, - 0x12, 0x00, 0xfc, 0x53, 0x12, 0x00, 0xfe, 0x53, 0x12, 0x00, 0xff, 0x53, - 0x12, 0x00, 0xf0, 0x59, 0x12, 0x00, 0xf1, 0x59, 0x12, 0x00, 0xf9, 0x59, - 0x12, 0x00, 0xfd, 0x59, 0x12, 0x00, 0xb8, 0x5c, 0x12, 0x00, 0xbc, 0x5c, - 0x12, 0x00, 0xbe, 0x5c, 0x12, 0x00, 0xbf, 0x5c, 0x12, 0x00, 0xf7, 0x5d, - 0x12, 0x00, 0xf8, 0x5d, 0x12, 0x00, 0xfc, 0x5d, 0x12, 0x00, 0xfe, 0x5d, - 0x12, 0x00, 0xff, 0x5d, 0x12, 0x00, 0xb8, 0x5e, 0x12, 0x00, 0xbc, 0x5e, - 0x12, 0x00, 0xbe, 0x5e, 0x12, 0x00, 0xbf, 0x5e, 0x12, 0x00, 0xf1, 0x81, - 0x12, 0x00, 0xf9, 0x81, 0x12, 0x00, 0xf7, 0x85, 0x12, 0x00, 0xb1, 0x88, - 0x12, 0x00, 0xb7, 0x88, 0x12, 0x00, 0xb9, 0x88, 0x12, 0x00, 0x8b, 0x8a, - 0x12, 0x00, 0xf1, 0x8b, 0x12, 0x00, 0xf7, 0x8b, 0x12, 0x00, 0xf9, 0x8b, - 0x12, 0x00, 0x88, 0xc2, 0x12, 0x00, 0x8b, 0xc2, 0x12, 0x00, 0xe6, 0xc3, - 0x12, 0x00, 0xe7, 0xc3, 0x12, 0x00, 0xe8, 0xc3, 0x12, 0x00, 0xeb, 0xc3, - 0x12, 0x00, 0xf6, 0xc3, 0x12, 0x00, 0xf7, 0xc3, 0x12, 0x00, 0xf8, 0xc3, - 0x12, 0x00, 0xfc, 0xc3, 0x12, 0x00, 0xfe, 0xc3, 0x12, 0x00, 0xff, 0xc3, - 0x12, 0x00, 0x88, 0xc5, 0x12, 0x00, 0x8b, 0xc5, 0x12, 0x00, 0xf0, 0xc9, - 0x12, 0x00, 0xf1, 0xc9, 0x12, 0x00, 0xf9, 0xc9, 0x12, 0x00, 0xfd, 0xc9, - 0x12, 0x00, 0x8b, 0xcd, 0x12, 0x00, 0xcb, 0xcd, 0x12, 0x00, 0xeb, 0xcd, - 0x12, 0x00, 0xf0, 0xcd, 0x12, 0x00, 0xf1, 0xcd, 0x12, 0x00, 0xf9, 0xcd, - 0x12, 0x00, 0xfd, 0xcd, 0x12, 0x00, 0xeb, 0xd5, 0x12, 0x00, 0xf8, 0xd5, - 0x12, 0x00, 0xfc, 0xd5, 0x12, 0x00, 0xfe, 0xd5, 0x12, 0x00, 0xff, 0xd5, - 0x12, 0x00, 0xe8, 0xdf, 0x12, 0x00, 0xeb, 0xdf, 0x12, 0x00, 0xf8, 0xdf, - 0x12, 0x00, 0xfc, 0xdf, 0x12, 0x00, 0xfe, 0xdf, 0x12, 0x00, 0xff, 0xdf, - 0x12, 0x00, 0xf0, 0xe3, 0x12, 0x00, 0xf1, 0xe3, 0x12, 0x00, 0xf9, 0xe3, - 0x12, 0x00, 0xfd, 0xe3, 0x12, 0x00, 0xf7, 0xe5, 0x12, 0x00, 0xf8, 0xe5, - 0x12, 0x00, 0xfc, 0xe5, 0x12, 0x00, 0xfe, 0xe5, 0x12, 0x00, 0xff, 0xe5, - 0x12, 0x00, 0xb8, 0xec, 0x12, 0x00, 0xbc, 0xec, 0x12, 0x00, 0xbe, 0xec, - 0x12, 0x00, 0xbf, 0xec, 0x12, 0x00, 0x88, 0xee, 0x12, 0x00, 0x8b, 0xee, - 0x12, 0x00, 0xc9, 0xef, 0x12, 0x00, 0xca, 0xef, 0x12, 0x00, 0xe9, 0xef, - 0x12, 0x00, 0xea, 0xef, 0x12, 0x00, 0xf0, 0xef, 0x12, 0x00, 0xf1, 0xef, - 0x12, 0x00, 0xf9, 0xef, 0x12, 0x00, 0xfd, 0xef, 0x12, 0x00, 0x8b, 0xf5, - 0x12, 0x00, 0xcb, 0xf5, 0x12, 0x00, 0xeb, 0xf5, 0x12, 0x00, 0xf0, 0xf5, - 0x12, 0x00, 0xf1, 0xf5, 0x12, 0x00, 0xf9, 0xf5, 0x12, 0x00, 0xfd, 0xf5, - 0x12, 0x00, 0x8b, 0xf9, 0x12, 0x00, 0xcb, 0xf9, 0x12, 0x00, 0xeb, 0xf9, - 0x12, 0x00, 0xf7, 0xf9, 0x12, 0x00, 0xf8, 0xf9, 0x12, 0x00, 0xfc, 0xf9, - 0x12, 0x00, 0xfe, 0xf9, 0x12, 0x00, 0xff, 0xf9, 0x12, 0x00, 0xf7, 0xfd, - 0x12, 0x00, 0xf8, 0xfd, 0x12, 0x00, 0xfc, 0xfd, 0x12, 0x00, 0xfe, 0xfd, - 0x12, 0x00, 0xff, 0xfd, 0x12, 0x00, 0x73, 0x00, 0x13, 0x00, 0x7b, 0x00, - 0x13, 0x00, 0xf3, 0x01, 0x13, 0x00, 0xfb, 0x01, 0x13, 0x00, 0x98, 0x03, - 0x13, 0x00, 0x98, 0x08, 0x13, 0x00, 0x78, 0x0b, 0x13, 0x00, 0x7c, 0x0b, - 0x13, 0x00, 0x7e, 0x0b, 0x13, 0x00, 0x7f, 0x0b, 0x13, 0x00, 0xf4, 0x0b, - 0x13, 0x00, 0xf5, 0x0b, 0x13, 0x00, 0xf8, 0x0b, 0x13, 0x00, 0xfc, 0x0b, - 0x13, 0x00, 0xfe, 0x0b, 0x13, 0x00, 0xff, 0x0b, 0x13, 0x00, 0xf3, 0x0f, - 0x13, 0x00, 0xfb, 0x0f, 0x13, 0x00, 0xf4, 0x11, 0x13, 0x00, 0xf5, 0x11, - 0x13, 0x00, 0xf8, 0x11, 0x13, 0x00, 0xfc, 0x11, 0x13, 0x00, 0xfe, 0x11, - 0x13, 0x00, 0xff, 0x11, 0x13, 0x00, 0x98, 0x17, 0x13, 0x00, 0xd8, 0x17, - 0x13, 0x00, 0xf4, 0x1f, 0x13, 0x00, 0xf5, 0x1f, 0x13, 0x00, 0xf8, 0x1f, - 0x13, 0x00, 0xfc, 0x1f, 0x13, 0x00, 0xfe, 0x1f, 0x13, 0x00, 0xff, 0x1f, - 0x13, 0x00, 0xcb, 0x25, 0x13, 0x00, 0xeb, 0x25, 0x13, 0x00, 0xd0, 0x33, - 0x13, 0x00, 0xd8, 0x33, 0x13, 0x00, 0xdc, 0x33, 0x13, 0x00, 0xde, 0x33, - 0x13, 0x00, 0xdf, 0x33, 0x13, 0x00, 0xf0, 0x33, 0x13, 0x00, 0xf1, 0x33, - 0x13, 0x00, 0xf9, 0x33, 0x13, 0x00, 0xfd, 0x33, 0x13, 0x00, 0x8b, 0x39, - 0x13, 0x00, 0xcb, 0x39, 0x13, 0x00, 0xeb, 0x39, 0x13, 0x00, 0xf0, 0x39, - 0x13, 0x00, 0xf1, 0x39, 0x13, 0x00, 0xf9, 0x39, 0x13, 0x00, 0xfd, 0x39, - 0x13, 0x00, 0xf0, 0x3b, 0x13, 0x00, 0xf1, 0x3b, 0x13, 0x00, 0xf9, 0x3b, - 0x13, 0x00, 0xfd, 0x3b, 0x13, 0x00, 0x8b, 0x3d, 0x13, 0x00, 0xcb, 0x3d, - 0x13, 0x00, 0xeb, 0x3d, 0x13, 0x00, 0xf0, 0x3d, 0x13, 0x00, 0xf1, 0x3d, - 0x13, 0x00, 0xf9, 0x3d, 0x13, 0x00, 0xfd, 0x3d, 0x13, 0x00, 0x90, 0x3f, - 0x13, 0x00, 0x98, 0x3f, 0x13, 0x00, 0x9c, 0x3f, 0x13, 0x00, 0x9e, 0x3f, - 0x13, 0x00, 0x9f, 0x3f, 0x13, 0x00, 0xd0, 0x3f, 0x13, 0x00, 0xd8, 0x3f, - 0x13, 0x00, 0xdc, 0x3f, 0x13, 0x00, 0xde, 0x3f, 0x13, 0x00, 0xdf, 0x3f, - 0x13, 0x00, 0x77, 0x40, 0x13, 0x00, 0x78, 0x40, 0x13, 0x00, 0x7c, 0x40, - 0x13, 0x00, 0x7e, 0x40, 0x13, 0x00, 0x7f, 0x40, 0x13, 0x00, 0xf0, 0x41, - 0x13, 0x00, 0xf1, 0x41, 0x13, 0x00, 0xf9, 0x41, 0x13, 0x00, 0xfd, 0x41, - 0x13, 0x00, 0x8b, 0x43, 0x13, 0x00, 0xb0, 0x44, 0x13, 0x00, 0xb0, 0x46, - 0x13, 0x00, 0xb0, 0x48, 0x13, 0x00, 0x6b, 0x49, 0x13, 0x00, 0xf0, 0x4b, - 0x13, 0x00, 0x6b, 0x4c, 0x13, 0x00, 0x6b, 0x4d, 0x13, 0x00, 0x6b, 0x4e, - 0x13, 0x00, 0x6b, 0x4f, 0x13, 0x00, 0x8b, 0x4f, 0x13, 0x00, 0xcb, 0x4f, - 0x13, 0x00, 0xeb, 0x4f, 0x13, 0x00, 0xf0, 0x4f, 0x13, 0x00, 0xf1, 0x4f, - 0x13, 0x00, 0xf7, 0x4f, 0x13, 0x00, 0xf9, 0x4f, 0x13, 0x00, 0xfd, 0x4f, - 0x13, 0x00, 0x78, 0x52, 0x13, 0x00, 0x7c, 0x52, 0x13, 0x00, 0x7e, 0x52, - 0x13, 0x00, 0x7f, 0x52, 0x13, 0x00, 0x6b, 0x55, 0x13, 0x00, 0x78, 0x55, - 0x13, 0x00, 0x7c, 0x55, 0x13, 0x00, 0x7e, 0x55, 0x13, 0x00, 0x7f, 0x55, - 0x13, 0x00, 0xcb, 0x57, 0x13, 0x00, 0xeb, 0x57, 0x13, 0x00, 0xf8, 0x57, - 0x13, 0x00, 0xfc, 0x57, 0x13, 0x00, 0xfe, 0x57, 0x13, 0x00, 0xff, 0x57, - 0x13, 0x00, 0x8b, 0x5b, 0x13, 0x00, 0x78, 0x5c, 0x13, 0x00, 0x7c, 0x5c, - 0x13, 0x00, 0x7e, 0x5c, 0x13, 0x00, 0x7f, 0x5c, 0x13, 0x00, 0x78, 0x5e, - 0x13, 0x00, 0x7c, 0x5e, 0x13, 0x00, 0x7e, 0x5e, 0x13, 0x00, 0x7f, 0x5e, - 0x13, 0x00, 0xf7, 0x5f, 0x13, 0x00, 0xf8, 0x5f, 0x13, 0x00, 0xfc, 0x5f, - 0x13, 0x00, 0xfe, 0x5f, 0x13, 0x00, 0xff, 0x5f, 0x13, 0x00, 0x8b, 0x64, - 0x13, 0x00, 0x9b, 0x65, 0x13, 0x00, 0xdb, 0x65, 0x13, 0x00, 0x8b, 0x66, - 0x13, 0x00, 0x0b, 0x67, 0x13, 0x00, 0x0b, 0x6b, 0x13, 0x00, 0x6b, 0x70, - 0x13, 0x00, 0x8b, 0x71, 0x13, 0x00, 0x9b, 0x75, 0x13, 0x00, 0xdb, 0x75, - 0x13, 0x00, 0x6b, 0x78, 0x13, 0x00, 0x8b, 0x78, 0x13, 0x00, 0x8b, 0x7a, - 0x13, 0x00, 0x0b, 0x7b, 0x13, 0x00, 0x6b, 0x7b, 0x13, 0x00, 0x9b, 0x7d, - 0x13, 0x00, 0xdb, 0x7d, 0x13, 0x00, 0x70, 0x84, 0x13, 0x00, 0x71, 0x84, - 0x13, 0x00, 0x73, 0x84, 0x13, 0x00, 0x79, 0x84, 0x13, 0x00, 0x7b, 0x84, - 0x13, 0x00, 0x7d, 0x84, 0x13, 0x00, 0xf2, 0x85, 0x13, 0x00, 0xf4, 0x85, - 0x13, 0x00, 0xf5, 0x85, 0x13, 0x00, 0xf6, 0x85, 0x13, 0x00, 0xf7, 0x85, - 0x13, 0x00, 0xf8, 0x85, 0x13, 0x00, 0xfa, 0x85, 0x13, 0x00, 0xfc, 0x85, - 0x13, 0x00, 0xfe, 0x85, 0x13, 0x00, 0xff, 0x85, 0x13, 0x00, 0x72, 0x86, - 0x13, 0x00, 0x74, 0x86, 0x13, 0x00, 0x75, 0x86, 0x13, 0x00, 0x76, 0x86, - 0x13, 0x00, 0x77, 0x86, 0x13, 0x00, 0x78, 0x86, 0x13, 0x00, 0x7a, 0x86, - 0x13, 0x00, 0x7c, 0x86, 0x13, 0x00, 0x7e, 0x86, 0x13, 0x00, 0x7f, 0x86, - 0x13, 0x00, 0x76, 0x87, 0x13, 0x00, 0x77, 0x87, 0x13, 0x00, 0x78, 0x87, - 0x13, 0x00, 0x7c, 0x87, 0x13, 0x00, 0x7e, 0x87, 0x13, 0x00, 0x7f, 0x87, - 0x13, 0x00, 0xf0, 0x87, 0x13, 0x00, 0xf1, 0x87, 0x13, 0x00, 0xf3, 0x87, - 0x13, 0x00, 0xf9, 0x87, 0x13, 0x00, 0xfb, 0x87, 0x13, 0x00, 0xfd, 0x87, - 0x13, 0x00, 0x72, 0x8a, 0x13, 0x00, 0x74, 0x8a, 0x13, 0x00, 0x75, 0x8a, - 0x13, 0x00, 0x76, 0x8a, 0x13, 0x00, 0x77, 0x8a, 0x13, 0x00, 0x78, 0x8a, - 0x13, 0x00, 0x7a, 0x8a, 0x13, 0x00, 0x7c, 0x8a, 0x13, 0x00, 0x7e, 0x8a, - 0x13, 0x00, 0x7f, 0x8a, 0x13, 0x00, 0x11, 0x8b, 0x13, 0x00, 0x16, 0x8b, - 0x13, 0x00, 0x17, 0x8b, 0x13, 0x00, 0x19, 0x8b, 0x13, 0x00, 0x1d, 0x8b, - 0x13, 0x00, 0xf3, 0x99, 0x13, 0x00, 0xfb, 0x99, 0x13, 0x00, 0x78, 0xa4, - 0x13, 0x00, 0x7c, 0xa4, 0x13, 0x00, 0x7e, 0xa4, 0x13, 0x00, 0x7f, 0xa4, - 0x13, 0x00, 0xcb, 0xa5, 0x13, 0x00, 0xeb, 0xa5, 0x13, 0x00, 0x78, 0xa6, - 0x13, 0x00, 0x7c, 0xa6, 0x13, 0x00, 0x7e, 0xa6, 0x13, 0x00, 0x7f, 0xa6, - 0x13, 0x00, 0xf8, 0xa7, 0x13, 0x00, 0xfc, 0xa7, 0x13, 0x00, 0xfe, 0xa7, - 0x13, 0x00, 0xff, 0xa7, 0x13, 0x00, 0xd0, 0xb3, 0x13, 0x00, 0xd8, 0xb3, - 0x13, 0x00, 0xdc, 0xb3, 0x13, 0x00, 0xde, 0xb3, 0x13, 0x00, 0xdf, 0xb3, - 0x13, 0x00, 0xf0, 0xb3, 0x13, 0x00, 0xf1, 0xb3, 0x13, 0x00, 0xf9, 0xb3, - 0x13, 0x00, 0xfd, 0xb3, 0x13, 0x00, 0x8b, 0xb9, 0x13, 0x00, 0xcb, 0xb9, - 0x13, 0x00, 0xeb, 0xb9, 0x13, 0x00, 0xf0, 0xb9, 0x13, 0x00, 0xf1, 0xb9, - 0x13, 0x00, 0xf9, 0xb9, 0x13, 0x00, 0xfd, 0xb9, 0x13, 0x00, 0x66, 0xba, - 0x13, 0x00, 0x76, 0xba, 0x13, 0x00, 0x77, 0xba, 0x13, 0x00, 0x78, 0xba, - 0x13, 0x00, 0x7c, 0xba, 0x13, 0x00, 0x7e, 0xba, 0x13, 0x00, 0x7f, 0xba, - 0x13, 0x00, 0x90, 0xbb, 0x13, 0x00, 0x98, 0xbb, 0x13, 0x00, 0x9c, 0xbb, - 0x13, 0x00, 0x9e, 0xbb, 0x13, 0x00, 0x9f, 0xbb, 0x13, 0x00, 0x8b, 0xbd, - 0x13, 0x00, 0xcb, 0xbd, 0x13, 0x00, 0xeb, 0xbd, 0x13, 0x00, 0xf0, 0xbd, - 0x13, 0x00, 0xf1, 0xbd, 0x13, 0x00, 0xf9, 0xbd, 0x13, 0x00, 0xfd, 0xbd, - 0x13, 0x00, 0x90, 0xbf, 0x13, 0x00, 0x98, 0xbf, 0x13, 0x00, 0x9c, 0xbf, - 0x13, 0x00, 0x9e, 0xbf, 0x13, 0x00, 0x9f, 0xbf, 0x13, 0x00, 0xd0, 0xbf, - 0x13, 0x00, 0xd8, 0xbf, 0x13, 0x00, 0xdc, 0xbf, 0x13, 0x00, 0xde, 0xbf, - 0x13, 0x00, 0xdf, 0xbf, 0x13, 0x00, 0xf2, 0xc5, 0x13, 0x00, 0xf4, 0xc5, - 0x13, 0x00, 0xf5, 0xc5, 0x13, 0x00, 0xf6, 0xc5, 0x13, 0x00, 0xf7, 0xc5, - 0x13, 0x00, 0xf8, 0xc5, 0x13, 0x00, 0xfa, 0xc5, 0x13, 0x00, 0xfc, 0xc5, - 0x13, 0x00, 0xfe, 0xc5, 0x13, 0x00, 0xff, 0xc5, 0x13, 0x00, 0xd8, 0xd3, - 0x13, 0x00, 0xf3, 0xd3, 0x13, 0x00, 0xfb, 0xd3, 0x13, 0x00, 0xf4, 0xd9, - 0x13, 0x00, 0xf5, 0xd9, 0x13, 0x00, 0xf8, 0xd9, 0x13, 0x00, 0xfc, 0xd9, - 0x13, 0x00, 0xfe, 0xd9, 0x13, 0x00, 0xff, 0xd9, 0x13, 0x00, 0xf4, 0xdb, - 0x13, 0x00, 0xf5, 0xdb, 0x13, 0x00, 0xf8, 0xdb, 0x13, 0x00, 0xfc, 0xdb, - 0x13, 0x00, 0xfe, 0xdb, 0x13, 0x00, 0xff, 0xdb, 0x13, 0x00, 0xf4, 0xdd, - 0x13, 0x00, 0xf5, 0xdd, 0x13, 0x00, 0xf8, 0xdd, 0x13, 0x00, 0xfc, 0xdd, - 0x13, 0x00, 0xfe, 0xdd, 0x13, 0x00, 0xff, 0xdd, 0x13, 0x00, 0x98, 0xdf, - 0x13, 0x00, 0xd8, 0xdf, 0x13, 0x00, 0x0b, 0xe5, 0x13, 0x00, 0x8b, 0xf2, - 0x13, 0x00, 0x08, 0xf3, 0x13, 0x00, 0x0b, 0xf3, 0x13, 0x00, 0x68, 0xf3, - 0x13, 0x00, 0x6b, 0xf3, 0x13, 0x00, 0x0b, 0xf9, 0x13, 0x00, 0xf7, 0xf9, - 0x13, 0x00, 0x88, 0xfc, 0x13, 0x00, 0x8b, 0xfc, 0x13, 0x00, 0x90, 0xfc, - 0x13, 0x00, 0x99, 0xfc, 0x13, 0x00, 0x9d, 0xfc, 0x13, 0x00, 0x0b, 0xfd, - 0x13, 0x00, 0x8b, 0xfe, 0x13, 0x00, 0x08, 0xff, 0x13, 0x00, 0x0b, 0xff, - 0x13, 0x00, 0xcb, 0x05, 0x14, 0x00, 0xeb, 0x05, 0x14, 0x00, 0xf8, 0x05, - 0x14, 0x00, 0xfc, 0x05, 0x14, 0x00, 0xfe, 0x05, 0x14, 0x00, 0xff, 0x05, - 0x14, 0x00, 0x6b, 0x06, 0x14, 0x00, 0x78, 0x06, 0x14, 0x00, 0x7c, 0x06, - 0x14, 0x00, 0x7e, 0x06, 0x14, 0x00, 0x7f, 0x06, 0x14, 0x00, 0x8b, 0x07, - 0x14, 0x00, 0xcb, 0x07, 0x14, 0x00, 0xeb, 0x07, 0x14, 0x00, 0xf8, 0x07, - 0x14, 0x00, 0xfc, 0x07, 0x14, 0x00, 0xfe, 0x07, 0x14, 0x00, 0xff, 0x07, - 0x14, 0x00, 0x6b, 0x08, 0x14, 0x00, 0x8b, 0x08, 0x14, 0x00, 0xb8, 0x08, - 0x14, 0x00, 0xbc, 0x08, 0x14, 0x00, 0xbe, 0x08, 0x14, 0x00, 0xbf, 0x08, - 0x14, 0x00, 0xf8, 0x0b, 0x14, 0x00, 0xfc, 0x0b, 0x14, 0x00, 0xfe, 0x0b, - 0x14, 0x00, 0xff, 0x0b, 0x14, 0x00, 0xcb, 0x0f, 0x14, 0x00, 0xeb, 0x0f, - 0x14, 0x00, 0xeb, 0x13, 0x14, 0x00, 0x78, 0x1a, 0x14, 0x00, 0x7c, 0x1a, - 0x14, 0x00, 0x7e, 0x1a, 0x14, 0x00, 0x7f, 0x1a, 0x14, 0x00, 0xcb, 0x1d, - 0x14, 0x00, 0xeb, 0x1d, 0x14, 0x00, 0x8b, 0x20, 0x14, 0x00, 0x8b, 0x27, - 0x14, 0x00, 0xcb, 0x27, 0x14, 0x00, 0xeb, 0x27, 0x14, 0x00, 0x8b, 0x28, - 0x14, 0x00, 0xcb, 0x29, 0x14, 0x00, 0xeb, 0x29, 0x14, 0x00, 0xf8, 0x29, - 0x14, 0x00, 0xfc, 0x29, 0x14, 0x00, 0xfe, 0x29, 0x14, 0x00, 0xff, 0x29, - 0x14, 0x00, 0xf8, 0x2b, 0x14, 0x00, 0xfc, 0x2b, 0x14, 0x00, 0xfe, 0x2b, - 0x14, 0x00, 0xff, 0x2b, 0x14, 0x00, 0xf8, 0x2d, 0x14, 0x00, 0xfc, 0x2d, - 0x14, 0x00, 0xfe, 0x2d, 0x14, 0x00, 0xff, 0x2d, 0x14, 0x00, 0x6b, 0x32, - 0x14, 0x00, 0xab, 0x32, 0x14, 0x00, 0x8b, 0x33, 0x14, 0x00, 0x78, 0x35, - 0x14, 0x00, 0x7c, 0x35, 0x14, 0x00, 0x7e, 0x35, 0x14, 0x00, 0x7f, 0x35, - 0x14, 0x00, 0xcb, 0x37, 0x14, 0x00, 0xeb, 0x37, 0x14, 0x00, 0xf0, 0x37, - 0x14, 0x00, 0xf1, 0x37, 0x14, 0x00, 0xf7, 0x37, 0x14, 0x00, 0xf9, 0x37, - 0x14, 0x00, 0xfd, 0x37, 0x14, 0x00, 0x6b, 0x3c, 0x14, 0x00, 0x78, 0x3e, - 0x14, 0x00, 0x7c, 0x3e, 0x14, 0x00, 0x7e, 0x3e, 0x14, 0x00, 0x7f, 0x3e, - 0x14, 0x00, 0xf8, 0x3f, 0x14, 0x00, 0xfc, 0x3f, 0x14, 0x00, 0xfe, 0x3f, - 0x14, 0x00, 0xff, 0x3f, 0x14, 0x00, 0xb0, 0x44, 0x14, 0x00, 0xb1, 0x44, - 0x14, 0x00, 0xb9, 0x44, 0x14, 0x00, 0xbd, 0x44, 0x14, 0x00, 0xb0, 0x46, - 0x14, 0x00, 0xb1, 0x46, 0x14, 0x00, 0xb9, 0x46, 0x14, 0x00, 0xbd, 0x46, - 0x14, 0x00, 0x70, 0x4a, 0x14, 0x00, 0x71, 0x4a, 0x14, 0x00, 0x77, 0x4a, - 0x14, 0x00, 0x79, 0x4a, 0x14, 0x00, 0x7d, 0x4a, 0x14, 0x00, 0x6b, 0x52, - 0x14, 0x00, 0x78, 0x52, 0x14, 0x00, 0x7c, 0x52, 0x14, 0x00, 0x7e, 0x52, - 0x14, 0x00, 0x7f, 0x52, 0x14, 0x00, 0xab, 0x52, 0x14, 0x00, 0x8b, 0x53, - 0x14, 0x00, 0x6b, 0x5c, 0x14, 0x00, 0x78, 0x5c, 0x14, 0x00, 0x7c, 0x5c, - 0x14, 0x00, 0x7e, 0x5c, 0x14, 0x00, 0x7f, 0x5c, 0x14, 0x00, 0xf0, 0x5f, - 0x14, 0x00, 0xf1, 0x5f, 0x14, 0x00, 0xf9, 0x5f, 0x14, 0x00, 0xfd, 0x5f, - 0x14, 0x00, 0x6b, 0x67, 0x14, 0x00, 0x8b, 0x6a, 0x14, 0x00, 0x78, 0x6b, - 0x14, 0x00, 0x7c, 0x6b, 0x14, 0x00, 0x7e, 0x6b, 0x14, 0x00, 0x7f, 0x6b, - 0x14, 0x00, 0x71, 0x80, 0x14, 0x00, 0x79, 0x80, 0x14, 0x00, 0x71, 0x84, - 0x14, 0x00, 0x79, 0x84, 0x14, 0x00, 0x78, 0x85, 0x14, 0x00, 0x7c, 0x85, - 0x14, 0x00, 0x7e, 0x85, 0x14, 0x00, 0x7f, 0x85, 0x14, 0x00, 0xf7, 0x85, - 0x14, 0x00, 0x71, 0x86, 0x14, 0x00, 0x79, 0x86, 0x14, 0x00, 0x0b, 0x87, - 0x14, 0x00, 0x70, 0x87, 0x14, 0x00, 0x71, 0x87, 0x14, 0x00, 0x79, 0x87, - 0x14, 0x00, 0x7d, 0x87, 0x14, 0x00, 0xf7, 0x87, 0x14, 0x00, 0x8b, 0x8a, - 0x14, 0x00, 0x0b, 0x8b, 0x14, 0x00, 0x6b, 0x8b, 0x14, 0x00, 0x78, 0x8b, - 0x14, 0x00, 0x7c, 0x8b, 0x14, 0x00, 0x7e, 0x8b, 0x14, 0x00, 0x7f, 0x8b, - 0x14, 0x00, 0xf1, 0x8b, 0x14, 0x00, 0xf7, 0x8b, 0x14, 0x00, 0xf9, 0x8b, - 0x14, 0x00, 0xfb, 0x95, 0x14, 0x00, 0xbb, 0xb2, 0x14, 0x00, 0xf1, 0xb3, - 0x14, 0x00, 0xf7, 0xb3, 0x14, 0x00, 0xf9, 0xb3, 0x14, 0x00, 0xbb, 0xbe, - 0x14, 0x00, 0xf1, 0xbf, 0x14, 0x00, 0xf7, 0xbf, 0x14, 0x00, 0xf9, 0xbf, - 0x14, 0x00, 0xf0, 0xc1, 0x14, 0x00, 0xf1, 0xc1, 0x14, 0x00, 0xf9, 0xc1, - 0x14, 0x00, 0xfd, 0xc1, 0x14, 0x00, 0x91, 0xc3, 0x14, 0x00, 0x96, 0xc3, - 0x14, 0x00, 0x97, 0xc3, 0x14, 0x00, 0x99, 0xc3, 0x14, 0x00, 0x9d, 0xc3, - 0x14, 0x00, 0xf6, 0xc5, 0x14, 0x00, 0xf7, 0xc5, 0x14, 0x00, 0xf8, 0xc5, - 0x14, 0x00, 0xfc, 0xc5, 0x14, 0x00, 0xfe, 0xc5, 0x14, 0x00, 0xff, 0xc5, - 0x14, 0x00, 0xf0, 0xc9, 0x14, 0x00, 0xf1, 0xc9, 0x14, 0x00, 0xf9, 0xc9, - 0x14, 0x00, 0xfd, 0xc9, 0x14, 0x00, 0x18, 0xcf, 0x14, 0x00, 0x1c, 0xcf, - 0x14, 0x00, 0x1e, 0xcf, 0x14, 0x00, 0x1f, 0xcf, 0x14, 0x00, 0x91, 0xcf, - 0x14, 0x00, 0x96, 0xcf, 0x14, 0x00, 0x97, 0xcf, 0x14, 0x00, 0x98, 0xcf, - 0x14, 0x00, 0x9c, 0xcf, 0x14, 0x00, 0x9e, 0xcf, 0x14, 0x00, 0x9f, 0xcf, - 0x14, 0x00, 0xd1, 0xcf, 0x14, 0x00, 0xd6, 0xcf, 0x14, 0x00, 0xd7, 0xcf, - 0x14, 0x00, 0xd8, 0xcf, 0x14, 0x00, 0xdc, 0xcf, 0x14, 0x00, 0xde, 0xcf, - 0x14, 0x00, 0xdf, 0xcf, 0x14, 0x00, 0xf8, 0xd1, 0x14, 0x00, 0xfc, 0xd1, - 0x14, 0x00, 0xfe, 0xd1, 0x14, 0x00, 0xff, 0xd1, 0x14, 0x00, 0x98, 0xd3, - 0x14, 0x00, 0x9c, 0xd3, 0x14, 0x00, 0x9e, 0xd3, 0x14, 0x00, 0x9f, 0xd3, - 0x14, 0x00, 0xf8, 0xd5, 0x14, 0x00, 0xfc, 0xd5, 0x14, 0x00, 0xfe, 0xd5, - 0x14, 0x00, 0xff, 0xd5, 0x14, 0x00, 0x88, 0xd7, 0x14, 0x00, 0x8b, 0xd7, - 0x14, 0x00, 0xf8, 0xd9, 0x14, 0x00, 0xfc, 0xd9, 0x14, 0x00, 0xfe, 0xd9, - 0x14, 0x00, 0xff, 0xd9, 0x14, 0x00, 0xf8, 0xdd, 0x14, 0x00, 0xfc, 0xdd, - 0x14, 0x00, 0xfe, 0xdd, 0x14, 0x00, 0xff, 0xdd, 0x14, 0x00, 0x98, 0xdf, - 0x14, 0x00, 0x9c, 0xdf, 0x14, 0x00, 0x9e, 0xdf, 0x14, 0x00, 0x9f, 0xdf, - 0x14, 0x00, 0xf6, 0xe1, 0x14, 0x00, 0xf7, 0xe1, 0x14, 0x00, 0xf8, 0xe1, - 0x14, 0x00, 0xfc, 0xe1, 0x14, 0x00, 0xfe, 0xe1, 0x14, 0x00, 0xff, 0xe1, - 0x14, 0x00, 0x8b, 0xe5, 0x14, 0x00, 0xcb, 0xe5, 0x14, 0x00, 0xeb, 0xe5, - 0x14, 0x00, 0xf0, 0xe5, 0x14, 0x00, 0xf6, 0xe9, 0x14, 0x00, 0xf7, 0xe9, - 0x14, 0x00, 0xf8, 0xe9, 0x14, 0x00, 0xfc, 0xe9, 0x14, 0x00, 0xfe, 0xe9, - 0x14, 0x00, 0xff, 0xe9, 0x14, 0x00, 0xb0, 0xea, 0x14, 0x00, 0xf0, 0xed, - 0x14, 0x00, 0x18, 0xef, 0x14, 0x00, 0x1c, 0xef, 0x14, 0x00, 0x1e, 0xef, - 0x14, 0x00, 0x1f, 0xef, 0x14, 0x00, 0x91, 0xef, 0x14, 0x00, 0x96, 0xef, - 0x14, 0x00, 0x97, 0xef, 0x14, 0x00, 0x98, 0xef, 0x14, 0x00, 0x9c, 0xef, - 0x14, 0x00, 0x9e, 0xef, 0x14, 0x00, 0x9f, 0xef, 0x14, 0x00, 0xd1, 0xef, - 0x14, 0x00, 0xd6, 0xef, 0x14, 0x00, 0xd7, 0xef, 0x14, 0x00, 0xd8, 0xef, - 0x14, 0x00, 0xdc, 0xef, 0x14, 0x00, 0xde, 0xef, 0x14, 0x00, 0xdf, 0xef, - 0x14, 0x00, 0x8b, 0xf1, 0x14, 0x00, 0xf0, 0xf1, 0x14, 0x00, 0xf1, 0xf1, - 0x14, 0x00, 0xf9, 0xf1, 0x14, 0x00, 0xfd, 0xf1, 0x14, 0x00, 0x88, 0xf3, - 0x14, 0x00, 0x8b, 0xf3, 0x14, 0x00, 0x90, 0xf3, 0x14, 0x00, 0x8b, 0xf9, - 0x14, 0x00, 0xcb, 0xf9, 0x14, 0x00, 0xeb, 0xf9, 0x14, 0x00, 0xf7, 0xf9, - 0x14, 0x00, 0xf8, 0xf9, 0x14, 0x00, 0xfc, 0xf9, 0x14, 0x00, 0xfe, 0xf9, - 0x14, 0x00, 0xff, 0xf9, 0x14, 0x00, 0x8b, 0xfd, 0x14, 0x00, 0xcb, 0xfd, - 0x14, 0x00, 0xeb, 0xfd, 0x14, 0x00, 0xf0, 0xfd, 0x14, 0x00, 0x90, 0xff, - 0x14, 0x00, 0x99, 0xff, 0x14, 0x00, 0x9d, 0xff, 0x14, 0x00, 0xd0, 0xff, - 0x14, 0x00, 0xd9, 0xff, 0x14, 0x00, 0xdd, 0xff, 0x14, 0x00, 0x73, 0x01, - 0x15, 0x00, 0x7b, 0x01, 0x15, 0x00, 0x98, 0x01, 0x15, 0x00, 0xd8, 0x01, - 0x15, 0x00, 0xd8, 0x03, 0x15, 0x00, 0xf3, 0x03, 0x15, 0x00, 0xfb, 0x03, - 0x15, 0x00, 0x73, 0x04, 0x15, 0x00, 0x7b, 0x04, 0x15, 0x00, 0xf4, 0x05, - 0x15, 0x00, 0xf5, 0x05, 0x15, 0x00, 0xf8, 0x05, 0x15, 0x00, 0xfc, 0x05, - 0x15, 0x00, 0xfe, 0x05, 0x15, 0x00, 0xff, 0x05, 0x15, 0x00, 0x74, 0x06, - 0x15, 0x00, 0x75, 0x06, 0x15, 0x00, 0x78, 0x06, 0x15, 0x00, 0x7c, 0x06, - 0x15, 0x00, 0x7e, 0x06, 0x15, 0x00, 0x7f, 0x06, 0x15, 0x00, 0x78, 0x07, - 0x15, 0x00, 0x7c, 0x07, 0x15, 0x00, 0x7e, 0x07, 0x15, 0x00, 0x7f, 0x07, - 0x15, 0x00, 0xf4, 0x07, 0x15, 0x00, 0xf5, 0x07, 0x15, 0x00, 0xf8, 0x07, - 0x15, 0x00, 0xfc, 0x07, 0x15, 0x00, 0xfe, 0x07, 0x15, 0x00, 0xff, 0x07, - 0x15, 0x00, 0x98, 0x08, 0x15, 0x00, 0x78, 0x0b, 0x15, 0x00, 0x7c, 0x0b, - 0x15, 0x00, 0x7e, 0x0b, 0x15, 0x00, 0x7f, 0x0b, 0x15, 0x00, 0xf4, 0x0b, - 0x15, 0x00, 0xf5, 0x0b, 0x15, 0x00, 0xf8, 0x0b, 0x15, 0x00, 0xfc, 0x0b, - 0x15, 0x00, 0xfe, 0x0b, 0x15, 0x00, 0xff, 0x0b, 0x15, 0x00, 0xf3, 0x0f, - 0x15, 0x00, 0xfb, 0x0f, 0x15, 0x00, 0x18, 0x11, 0x15, 0x00, 0x74, 0x11, - 0x15, 0x00, 0x75, 0x11, 0x15, 0x00, 0x78, 0x11, 0x15, 0x00, 0x7c, 0x11, - 0x15, 0x00, 0x7e, 0x11, 0x15, 0x00, 0x7f, 0x11, 0x15, 0x00, 0x98, 0x17, - 0x15, 0x00, 0xd8, 0x17, 0x15, 0x00, 0xf3, 0x19, 0x15, 0x00, 0xfb, 0x19, - 0x15, 0x00, 0xa4, 0x1a, 0x15, 0x00, 0xa5, 0x1a, 0x15, 0x00, 0x98, 0x1e, - 0x15, 0x00, 0x9c, 0x1e, 0x15, 0x00, 0x9e, 0x1e, 0x15, 0x00, 0x9f, 0x1e, - 0x15, 0x00, 0xcb, 0x25, 0x15, 0x00, 0xeb, 0x25, 0x15, 0x00, 0xd0, 0x33, - 0x15, 0x00, 0xd8, 0x33, 0x15, 0x00, 0xdc, 0x33, 0x15, 0x00, 0xde, 0x33, - 0x15, 0x00, 0xdf, 0x33, 0x15, 0x00, 0xf0, 0x33, 0x15, 0x00, 0xf1, 0x33, - 0x15, 0x00, 0xf9, 0x33, 0x15, 0x00, 0xfd, 0x33, 0x15, 0x00, 0x8b, 0x39, - 0x15, 0x00, 0xcb, 0x39, 0x15, 0x00, 0xeb, 0x39, 0x15, 0x00, 0xf0, 0x39, - 0x15, 0x00, 0xf1, 0x39, 0x15, 0x00, 0xf9, 0x39, 0x15, 0x00, 0xfd, 0x39, - 0x15, 0x00, 0xf0, 0x3b, 0x15, 0x00, 0xf1, 0x3b, 0x15, 0x00, 0xf9, 0x3b, - 0x15, 0x00, 0xfd, 0x3b, 0x15, 0x00, 0x8b, 0x3d, 0x15, 0x00, 0xcb, 0x3d, - 0x15, 0x00, 0xeb, 0x3d, 0x15, 0x00, 0xf0, 0x3d, 0x15, 0x00, 0xf1, 0x3d, - 0x15, 0x00, 0xf9, 0x3d, 0x15, 0x00, 0xfd, 0x3d, 0x15, 0x00, 0x90, 0x3f, - 0x15, 0x00, 0x98, 0x3f, 0x15, 0x00, 0x9c, 0x3f, 0x15, 0x00, 0x9e, 0x3f, - 0x15, 0x00, 0x9f, 0x3f, 0x15, 0x00, 0xd0, 0x3f, 0x15, 0x00, 0xd8, 0x3f, - 0x15, 0x00, 0xdc, 0x3f, 0x15, 0x00, 0xde, 0x3f, 0x15, 0x00, 0xdf, 0x3f, - 0x15, 0x00, 0x76, 0x40, 0x15, 0x00, 0x77, 0x40, 0x15, 0x00, 0x78, 0x40, - 0x15, 0x00, 0x7c, 0x40, 0x15, 0x00, 0x7e, 0x40, 0x15, 0x00, 0x7f, 0x40, - 0x15, 0x00, 0xb0, 0x40, 0x15, 0x00, 0xf0, 0x41, 0x15, 0x00, 0xf1, 0x41, - 0x15, 0x00, 0xf9, 0x41, 0x15, 0x00, 0xfd, 0x41, 0x15, 0x00, 0x78, 0x42, - 0x15, 0x00, 0x7c, 0x42, 0x15, 0x00, 0x7e, 0x42, 0x15, 0x00, 0x7f, 0x42, - 0x15, 0x00, 0x91, 0x43, 0x15, 0x00, 0x96, 0x43, 0x15, 0x00, 0x97, 0x43, - 0x15, 0x00, 0x99, 0x43, 0x15, 0x00, 0x9d, 0x43, 0x15, 0x00, 0xb0, 0x46, - 0x15, 0x00, 0x90, 0x47, 0x15, 0x00, 0x98, 0x47, 0x15, 0x00, 0x9c, 0x47, - 0x15, 0x00, 0x9e, 0x47, 0x15, 0x00, 0x9f, 0x47, 0x15, 0x00, 0xd0, 0x47, - 0x15, 0x00, 0xd8, 0x47, 0x15, 0x00, 0xdc, 0x47, 0x15, 0x00, 0xde, 0x47, - 0x15, 0x00, 0xdf, 0x47, 0x15, 0x00, 0x6b, 0x48, 0x15, 0x00, 0x70, 0x48, - 0x15, 0x00, 0x86, 0x48, 0x15, 0x00, 0xb0, 0x48, 0x15, 0x00, 0xd0, 0x4b, - 0x15, 0x00, 0xe6, 0x4b, 0x15, 0x00, 0xf0, 0x4b, 0x15, 0x00, 0xf0, 0x4f, - 0x15, 0x00, 0xf1, 0x4f, 0x15, 0x00, 0xf9, 0x4f, 0x15, 0x00, 0xfd, 0x4f, - 0x15, 0x00, 0x88, 0x53, 0x15, 0x00, 0x8b, 0x53, 0x15, 0x00, 0x90, 0x53, - 0x15, 0x00, 0x98, 0x53, 0x15, 0x00, 0x9c, 0x53, 0x15, 0x00, 0x9e, 0x53, - 0x15, 0x00, 0x9f, 0x53, 0x15, 0x00, 0x78, 0x55, 0x15, 0x00, 0x7c, 0x55, - 0x15, 0x00, 0x7e, 0x55, 0x15, 0x00, 0x7f, 0x55, 0x15, 0x00, 0x86, 0x57, - 0x15, 0x00, 0xc6, 0x57, 0x15, 0x00, 0xe6, 0x57, 0x15, 0x00, 0xf6, 0x57, - 0x15, 0x00, 0xf7, 0x57, 0x15, 0x00, 0xf8, 0x57, 0x15, 0x00, 0xfc, 0x57, - 0x15, 0x00, 0xfe, 0x57, 0x15, 0x00, 0xff, 0x57, 0x15, 0x00, 0x78, 0x5c, - 0x15, 0x00, 0x7c, 0x5c, 0x15, 0x00, 0x7e, 0x5c, 0x15, 0x00, 0x7f, 0x5c, - 0x15, 0x00, 0x88, 0x5f, 0x15, 0x00, 0x8b, 0x5f, 0x15, 0x00, 0xf0, 0x5f, - 0x15, 0x00, 0xf1, 0x5f, 0x15, 0x00, 0xf9, 0x5f, 0x15, 0x00, 0xfd, 0x5f, - 0x15, 0x00, 0xf4, 0x61, 0x15, 0x00, 0xf5, 0x61, 0x15, 0x00, 0xf8, 0x61, - 0x15, 0x00, 0xfc, 0x61, 0x15, 0x00, 0xfe, 0x61, 0x15, 0x00, 0xff, 0x61, - 0x15, 0x00, 0x98, 0x64, 0x15, 0x00, 0x9c, 0x64, 0x15, 0x00, 0x9e, 0x64, - 0x15, 0x00, 0x9f, 0x64, 0x15, 0x00, 0x18, 0x67, 0x15, 0x00, 0x1c, 0x67, - 0x15, 0x00, 0x1e, 0x67, 0x15, 0x00, 0x1f, 0x67, 0x15, 0x00, 0x98, 0x67, - 0x15, 0x00, 0xd8, 0x67, 0x15, 0x00, 0xf4, 0x6f, 0x15, 0x00, 0xf5, 0x6f, - 0x15, 0x00, 0xf8, 0x6f, 0x15, 0x00, 0xfc, 0x6f, 0x15, 0x00, 0xfe, 0x6f, - 0x15, 0x00, 0xff, 0x6f, 0x15, 0x00, 0x98, 0x77, 0x15, 0x00, 0xd8, 0x77, - 0x15, 0x00, 0xf4, 0x7f, 0x15, 0x00, 0xf5, 0x7f, 0x15, 0x00, 0xf8, 0x7f, - 0x15, 0x00, 0xfc, 0x7f, 0x15, 0x00, 0xfe, 0x7f, 0x15, 0x00, 0xff, 0x7f, - 0x15, 0x00, 0x8b, 0x84, 0x15, 0x00, 0xb1, 0x84, 0x15, 0x00, 0xb9, 0x84, - 0x15, 0x00, 0x6b, 0x85, 0x15, 0x00, 0x78, 0x85, 0x15, 0x00, 0x7c, 0x85, - 0x15, 0x00, 0x7e, 0x85, 0x15, 0x00, 0x7f, 0x85, 0x15, 0x00, 0x8b, 0x86, - 0x15, 0x00, 0xb1, 0x86, 0x15, 0x00, 0xb9, 0x86, 0x15, 0x00, 0x0b, 0x87, - 0x15, 0x00, 0xcb, 0xa5, 0x15, 0x00, 0xeb, 0xa5, 0x15, 0x00, 0x6b, 0xa6, - 0x15, 0x00, 0x8b, 0xa7, 0x15, 0x00, 0xcb, 0xa7, 0x15, 0x00, 0xeb, 0xa7, - 0x15, 0x00, 0xf8, 0xab, 0x15, 0x00, 0xfc, 0xab, 0x15, 0x00, 0xfe, 0xab, - 0x15, 0x00, 0xff, 0xab, 0x15, 0x00, 0xeb, 0xb3, 0x15, 0x00, 0xf0, 0xb3, - 0x15, 0x00, 0xf1, 0xb3, 0x15, 0x00, 0xf7, 0xb3, 0x15, 0x00, 0xf9, 0xb3, - 0x15, 0x00, 0xfd, 0xb3, 0x15, 0x00, 0x78, 0xba, 0x15, 0x00, 0x7c, 0xba, - 0x15, 0x00, 0x7e, 0xba, 0x15, 0x00, 0x7f, 0xba, 0x15, 0x00, 0x8b, 0xbd, - 0x15, 0x00, 0xcb, 0xbd, 0x15, 0x00, 0xeb, 0xbd, 0x15, 0x00, 0x6b, 0xc5, - 0x15, 0x00, 0x78, 0xc5, 0x15, 0x00, 0x7c, 0xc5, 0x15, 0x00, 0x7e, 0xc5, - 0x15, 0x00, 0x7f, 0xc5, 0x15, 0x00, 0xf1, 0xc7, 0x15, 0x00, 0xf9, 0xc7, - 0x15, 0x00, 0x8b, 0xca, 0x15, 0x00, 0x8b, 0xe4, 0x15, 0x00, 0x0b, 0xe5, - 0x15, 0x00, 0x8b, 0xe5, 0x15, 0x00, 0x8b, 0xe6, 0x15, 0x00, 0x0b, 0xf3, - 0x15, 0x00, 0x6b, 0xf3, 0x15, 0x00, 0x78, 0xf3, 0x15, 0x00, 0x7c, 0xf3, - 0x15, 0x00, 0x7e, 0xf3, 0x15, 0x00, 0x7f, 0xf3, 0x15, 0x00, 0x8b, 0xfa, - 0x15, 0x00, 0x0b, 0xfd, 0x15, 0x00, 0x8b, 0xfd, 0x15, 0x00, 0xb8, 0x01, - 0x16, 0x00, 0xbc, 0x01, 0x16, 0x00, 0xbe, 0x01, 0x16, 0x00, 0xbf, 0x01, - 0x16, 0x00, 0xe8, 0x02, 0x16, 0x00, 0xeb, 0x02, 0x16, 0x00, 0xf8, 0x02, - 0x16, 0x00, 0xfc, 0x02, 0x16, 0x00, 0xfe, 0x02, 0x16, 0x00, 0xff, 0x02, - 0x16, 0x00, 0xb8, 0x04, 0x16, 0x00, 0xbc, 0x04, 0x16, 0x00, 0xbe, 0x04, - 0x16, 0x00, 0xbf, 0x04, 0x16, 0x00, 0x38, 0x07, 0x16, 0x00, 0x3c, 0x07, - 0x16, 0x00, 0x3e, 0x07, 0x16, 0x00, 0x3f, 0x07, 0x16, 0x00, 0xb8, 0x07, - 0x16, 0x00, 0xbc, 0x07, 0x16, 0x00, 0xbe, 0x07, 0x16, 0x00, 0xbf, 0x07, - 0x16, 0x00, 0xb8, 0x08, 0x16, 0x00, 0xbc, 0x08, 0x16, 0x00, 0xbe, 0x08, - 0x16, 0x00, 0xbf, 0x08, 0x16, 0x00, 0x38, 0x09, 0x16, 0x00, 0x3c, 0x09, - 0x16, 0x00, 0x3e, 0x09, 0x16, 0x00, 0x3f, 0x09, 0x16, 0x00, 0x58, 0x09, - 0x16, 0x00, 0x5c, 0x09, 0x16, 0x00, 0x5e, 0x09, 0x16, 0x00, 0x5f, 0x09, - 0x16, 0x00, 0x88, 0x0b, 0x16, 0x00, 0x8b, 0x0b, 0x16, 0x00, 0x38, 0x0e, - 0x16, 0x00, 0x3c, 0x0e, 0x16, 0x00, 0x3e, 0x0e, 0x16, 0x00, 0x3f, 0x0e, - 0x16, 0x00, 0x38, 0x0f, 0x16, 0x00, 0x3c, 0x0f, 0x16, 0x00, 0x3e, 0x0f, - 0x16, 0x00, 0x3f, 0x0f, 0x16, 0x00, 0x58, 0x10, 0x16, 0x00, 0x5c, 0x10, - 0x16, 0x00, 0x5e, 0x10, 0x16, 0x00, 0x5f, 0x10, 0x16, 0x00, 0xf8, 0x10, - 0x16, 0x00, 0xfc, 0x10, 0x16, 0x00, 0xfe, 0x10, 0x16, 0x00, 0xff, 0x10, - 0x16, 0x00, 0xf8, 0x13, 0x16, 0x00, 0xfc, 0x13, 0x16, 0x00, 0xfe, 0x13, - 0x16, 0x00, 0xff, 0x13, 0x16, 0x00, 0x88, 0x14, 0x16, 0x00, 0x8b, 0x14, - 0x16, 0x00, 0x58, 0x15, 0x16, 0x00, 0x5c, 0x15, 0x16, 0x00, 0x5e, 0x15, - 0x16, 0x00, 0x5f, 0x15, 0x16, 0x00, 0x48, 0x16, 0x16, 0x00, 0x4b, 0x16, - 0x16, 0x00, 0x8b, 0x16, 0x16, 0x00, 0x48, 0x17, 0x16, 0x00, 0x4b, 0x17, - 0x16, 0x00, 0x88, 0x17, 0x16, 0x00, 0x8b, 0x17, 0x16, 0x00, 0xc8, 0x17, - 0x16, 0x00, 0xcb, 0x17, 0x16, 0x00, 0xe8, 0x17, 0x16, 0x00, 0xeb, 0x17, - 0x16, 0x00, 0xf8, 0x17, 0x16, 0x00, 0xfc, 0x17, 0x16, 0x00, 0xfe, 0x17, - 0x16, 0x00, 0xff, 0x17, 0x16, 0x00, 0x38, 0x19, 0x16, 0x00, 0x3c, 0x19, - 0x16, 0x00, 0x3e, 0x19, 0x16, 0x00, 0x3f, 0x19, 0x16, 0x00, 0x48, 0x1a, - 0x16, 0x00, 0x4b, 0x1a, 0x16, 0x00, 0x58, 0x1a, 0x16, 0x00, 0x5c, 0x1a, - 0x16, 0x00, 0x5e, 0x1a, 0x16, 0x00, 0x5f, 0x1a, 0x16, 0x00, 0xe8, 0x1b, - 0x16, 0x00, 0xeb, 0x1b, 0x16, 0x00, 0x58, 0x1c, 0x16, 0x00, 0x5c, 0x1c, - 0x16, 0x00, 0x5e, 0x1c, 0x16, 0x00, 0x5f, 0x1c, 0x16, 0x00, 0xc8, 0x1f, - 0x16, 0x00, 0xcb, 0x1f, 0x16, 0x00, 0xe8, 0x1f, 0x16, 0x00, 0xeb, 0x1f, - 0x16, 0x00, 0xf8, 0x1f, 0x16, 0x00, 0xfc, 0x1f, 0x16, 0x00, 0xfe, 0x1f, - 0x16, 0x00, 0xff, 0x1f, 0x16, 0x00, 0x38, 0x22, 0x16, 0x00, 0x3c, 0x22, - 0x16, 0x00, 0x3e, 0x22, 0x16, 0x00, 0x3f, 0x22, 0x16, 0x00, 0xe8, 0x23, - 0x16, 0x00, 0xeb, 0x23, 0x16, 0x00, 0xf8, 0x23, 0x16, 0x00, 0xfc, 0x23, - 0x16, 0x00, 0xfe, 0x23, 0x16, 0x00, 0xff, 0x23, 0x16, 0x00, 0x38, 0x25, - 0x16, 0x00, 0x3c, 0x25, 0x16, 0x00, 0x3e, 0x25, 0x16, 0x00, 0x3f, 0x25, - 0x16, 0x00, 0x58, 0x29, 0x16, 0x00, 0x5c, 0x29, 0x16, 0x00, 0x5e, 0x29, - 0x16, 0x00, 0x5f, 0x29, 0x16, 0x00, 0x58, 0x2d, 0x16, 0x00, 0x5c, 0x2d, - 0x16, 0x00, 0x5e, 0x2d, 0x16, 0x00, 0x5f, 0x2d, 0x16, 0x00, 0x58, 0x2e, - 0x16, 0x00, 0x5c, 0x2e, 0x16, 0x00, 0x5e, 0x2e, 0x16, 0x00, 0x5f, 0x2e, - 0x16, 0x00, 0x58, 0x2f, 0x16, 0x00, 0x5c, 0x2f, 0x16, 0x00, 0x5e, 0x2f, - 0x16, 0x00, 0x5f, 0x2f, 0x16, 0x00, 0x36, 0x33, 0x16, 0x00, 0x37, 0x33, - 0x16, 0x00, 0x38, 0x33, 0x16, 0x00, 0x3c, 0x33, 0x16, 0x00, 0x3e, 0x33, - 0x16, 0x00, 0x3f, 0x33, 0x16, 0x00, 0xb8, 0x33, 0x16, 0x00, 0xbc, 0x33, - 0x16, 0x00, 0xbe, 0x33, 0x16, 0x00, 0xbf, 0x33, 0x16, 0x00, 0xe9, 0x33, - 0x16, 0x00, 0xea, 0x33, 0x16, 0x00, 0xf0, 0x33, 0x16, 0x00, 0xf1, 0x33, - 0x16, 0x00, 0xf9, 0x33, 0x16, 0x00, 0xfd, 0x33, 0x16, 0x00, 0xeb, 0x35, - 0x16, 0x00, 0xf7, 0x35, 0x16, 0x00, 0xf8, 0x35, 0x16, 0x00, 0xfc, 0x35, - 0x16, 0x00, 0xfe, 0x35, 0x16, 0x00, 0xff, 0x35, 0x16, 0x00, 0x30, 0x39, - 0x16, 0x00, 0x31, 0x39, 0x16, 0x00, 0x39, 0x39, 0x16, 0x00, 0x3d, 0x39, - 0x16, 0x00, 0x8b, 0x39, 0x16, 0x00, 0x37, 0x3d, 0x16, 0x00, 0x38, 0x3d, - 0x16, 0x00, 0x3c, 0x3d, 0x16, 0x00, 0x3e, 0x3d, 0x16, 0x00, 0x3f, 0x3d, - 0x16, 0x00, 0x30, 0x3f, 0x16, 0x00, 0x31, 0x3f, 0x16, 0x00, 0x39, 0x3f, - 0x16, 0x00, 0x3d, 0x3f, 0x16, 0x00, 0xe6, 0x3f, 0x16, 0x00, 0xe7, 0x3f, - 0x16, 0x00, 0xe8, 0x3f, 0x16, 0x00, 0xeb, 0x3f, 0x16, 0x00, 0xf6, 0x3f, - 0x16, 0x00, 0xf7, 0x3f, 0x16, 0x00, 0xf8, 0x3f, 0x16, 0x00, 0xfc, 0x3f, - 0x16, 0x00, 0xfe, 0x3f, 0x16, 0x00, 0xff, 0x3f, 0x16, 0x00, 0xc7, 0x41, - 0x16, 0x00, 0xcb, 0x41, 0x16, 0x00, 0xf7, 0x41, 0x16, 0x00, 0xf8, 0x41, - 0x16, 0x00, 0xfc, 0x41, 0x16, 0x00, 0xfe, 0x41, 0x16, 0x00, 0xff, 0x41, - 0x16, 0x00, 0xc7, 0x45, 0x16, 0x00, 0xcb, 0x45, 0x16, 0x00, 0xf7, 0x45, - 0x16, 0x00, 0xf8, 0x45, 0x16, 0x00, 0xfc, 0x45, 0x16, 0x00, 0xfe, 0x45, - 0x16, 0x00, 0xff, 0x45, 0x16, 0x00, 0x8b, 0x47, 0x16, 0x00, 0x8b, 0x49, - 0x16, 0x00, 0xcb, 0x49, 0x16, 0x00, 0xeb, 0x49, 0x16, 0x00, 0x4b, 0x52, - 0x16, 0x00, 0xb8, 0x52, 0x16, 0x00, 0xbc, 0x52, 0x16, 0x00, 0xbe, 0x52, - 0x16, 0x00, 0xbf, 0x52, 0x16, 0x00, 0x30, 0x53, 0x16, 0x00, 0x31, 0x53, - 0x16, 0x00, 0x39, 0x53, 0x16, 0x00, 0x3d, 0x53, 0x16, 0x00, 0xeb, 0x53, - 0x16, 0x00, 0xf7, 0x53, 0x16, 0x00, 0xf8, 0x53, 0x16, 0x00, 0xfc, 0x53, - 0x16, 0x00, 0xfe, 0x53, 0x16, 0x00, 0xff, 0x53, 0x16, 0x00, 0x37, 0x59, - 0x16, 0x00, 0x38, 0x59, 0x16, 0x00, 0x3c, 0x59, 0x16, 0x00, 0x3e, 0x59, - 0x16, 0x00, 0x3f, 0x59, 0x16, 0x00, 0x4b, 0x5c, 0x16, 0x00, 0xb8, 0x5c, - 0x16, 0x00, 0xbc, 0x5c, 0x16, 0x00, 0xbe, 0x5c, 0x16, 0x00, 0xbf, 0x5c, - 0x16, 0x00, 0x30, 0x5d, 0x16, 0x00, 0x31, 0x5d, 0x16, 0x00, 0x39, 0x5d, - 0x16, 0x00, 0x3d, 0x5d, 0x16, 0x00, 0xb8, 0x5e, 0x16, 0x00, 0xbc, 0x5e, - 0x16, 0x00, 0xbe, 0x5e, 0x16, 0x00, 0xbf, 0x5e, 0x16, 0x00, 0x37, 0x5f, - 0x16, 0x00, 0x38, 0x5f, 0x16, 0x00, 0x3c, 0x5f, 0x16, 0x00, 0x3e, 0x5f, - 0x16, 0x00, 0x3f, 0x5f, 0x16, 0x00, 0xb8, 0x5f, 0x16, 0x00, 0xbc, 0x5f, - 0x16, 0x00, 0xbe, 0x5f, 0x16, 0x00, 0xbf, 0x5f, 0x16, 0x00, 0xf0, 0x5f, - 0x16, 0x00, 0xf1, 0x5f, 0x16, 0x00, 0xf9, 0x5f, 0x16, 0x00, 0xfd, 0x5f, - 0x16, 0x00, 0xeb, 0x64, 0x16, 0x00, 0xeb, 0x66, 0x16, 0x00, 0xcb, 0x6a, - 0x16, 0x00, 0xeb, 0x6a, 0x16, 0x00, 0xf8, 0x6a, 0x16, 0x00, 0xfc, 0x6a, - 0x16, 0x00, 0xfe, 0x6a, 0x16, 0x00, 0xff, 0x6a, 0x16, 0x00, 0x8b, 0x7a, - 0x16, 0x00, 0xcb, 0x7a, 0x16, 0x00, 0xeb, 0x7a, 0x16, 0x00, 0xf8, 0x7c, - 0x16, 0x00, 0xfc, 0x7c, 0x16, 0x00, 0xfe, 0x7c, 0x16, 0x00, 0xff, 0x7c, - 0x16, 0x00, 0xf1, 0x80, 0x16, 0x00, 0xf9, 0x80, 0x16, 0x00, 0xf7, 0x81, - 0x16, 0x00, 0xf1, 0x82, 0x16, 0x00, 0xf9, 0x82, 0x16, 0x00, 0x8b, 0x84, - 0x16, 0x00, 0x8b, 0x86, 0x16, 0x00, 0xf7, 0x87, 0x16, 0x00, 0x8b, 0x8e, - 0x16, 0x00, 0xbb, 0x8e, 0x16, 0x00, 0xf1, 0x8f, 0x16, 0x00, 0xf7, 0x8f, - 0x16, 0x00, 0xf9, 0x8f, 0x16, 0x00, 0xfb, 0x95, 0x16, 0x00, 0xeb, 0xa4, - 0x16, 0x00, 0xf8, 0xa4, 0x16, 0x00, 0xfc, 0xa4, 0x16, 0x00, 0xfe, 0xa4, - 0x16, 0x00, 0xff, 0xa4, 0x16, 0x00, 0xeb, 0xa6, 0x16, 0x00, 0xf0, 0xb8, - 0x16, 0x00, 0xf1, 0xb8, 0x16, 0x00, 0xf7, 0xb8, 0x16, 0x00, 0xf9, 0xb8, - 0x16, 0x00, 0xfd, 0xb8, 0x16, 0x00, 0xbb, 0xb9, 0x16, 0x00, 0xf0, 0xbc, - 0x16, 0x00, 0xf1, 0xbc, 0x16, 0x00, 0xf7, 0xbc, 0x16, 0x00, 0xf9, 0xbc, - 0x16, 0x00, 0xfd, 0xbc, 0x16, 0x00, 0xbb, 0xbd, 0x16, 0x00, 0x30, 0xc2, - 0x16, 0x00, 0x88, 0xc2, 0x16, 0x00, 0x8b, 0xc2, 0x16, 0x00, 0xe6, 0xc3, - 0x16, 0x00, 0xf6, 0xc3, 0x16, 0x00, 0xf7, 0xc3, 0x16, 0x00, 0xf8, 0xc3, - 0x16, 0x00, 0xfc, 0xc3, 0x16, 0x00, 0xfe, 0xc3, 0x16, 0x00, 0xff, 0xc3, - 0x16, 0x00, 0xe6, 0xc5, 0x16, 0x00, 0xf6, 0xc5, 0x16, 0x00, 0xf7, 0xc5, - 0x16, 0x00, 0xf8, 0xc5, 0x16, 0x00, 0xfc, 0xc5, 0x16, 0x00, 0xfe, 0xc5, - 0x16, 0x00, 0xff, 0xc5, 0x16, 0x00, 0xf0, 0xc9, 0x16, 0x00, 0xf1, 0xc9, - 0x16, 0x00, 0xf9, 0xc9, 0x16, 0x00, 0xfd, 0xc9, 0x16, 0x00, 0xf0, 0xcc, - 0x16, 0x00, 0xf1, 0xcc, 0x16, 0x00, 0xf9, 0xcc, 0x16, 0x00, 0xfd, 0xcc, - 0x16, 0x00, 0xf0, 0xce, 0x16, 0x00, 0xf1, 0xce, 0x16, 0x00, 0xf9, 0xce, - 0x16, 0x00, 0xfd, 0xce, 0x16, 0x00, 0x58, 0xd2, 0x16, 0x00, 0x5c, 0xd2, - 0x16, 0x00, 0x5e, 0xd2, 0x16, 0x00, 0x5f, 0xd2, 0x16, 0x00, 0xf8, 0xd5, - 0x16, 0x00, 0xfc, 0xd5, 0x16, 0x00, 0xfe, 0xd5, 0x16, 0x00, 0xff, 0xd5, - 0x16, 0x00, 0xf8, 0xd9, 0x16, 0x00, 0xfc, 0xd9, 0x16, 0x00, 0xfe, 0xd9, - 0x16, 0x00, 0xff, 0xd9, 0x16, 0x00, 0xf8, 0xdd, 0x16, 0x00, 0xfc, 0xdd, - 0x16, 0x00, 0xfe, 0xdd, 0x16, 0x00, 0xff, 0xdd, 0x16, 0x00, 0x58, 0xde, - 0x16, 0x00, 0x5c, 0xde, 0x16, 0x00, 0x5e, 0xde, 0x16, 0x00, 0x5f, 0xde, - 0x16, 0x00, 0x30, 0xe5, 0x16, 0x00, 0x30, 0xe9, 0x16, 0x00, 0x51, 0xe9, - 0x16, 0x00, 0x56, 0xe9, 0x16, 0x00, 0x57, 0xe9, 0x16, 0x00, 0x58, 0xe9, - 0x16, 0x00, 0x5c, 0xe9, 0x16, 0x00, 0x5e, 0xe9, 0x16, 0x00, 0x5f, 0xe9, - 0x16, 0x00, 0x30, 0xec, 0x16, 0x00, 0x48, 0xec, 0x16, 0x00, 0x4b, 0xec, - 0x16, 0x00, 0x50, 0xec, 0x16, 0x00, 0x30, 0xed, 0x16, 0x00, 0x51, 0xee, - 0x16, 0x00, 0x56, 0xee, 0x16, 0x00, 0x57, 0xee, 0x16, 0x00, 0x58, 0xee, - 0x16, 0x00, 0x5c, 0xee, 0x16, 0x00, 0x5e, 0xee, 0x16, 0x00, 0x5f, 0xee, - 0x16, 0x00, 0x88, 0xee, 0x16, 0x00, 0x8b, 0xee, 0x16, 0x00, 0x51, 0xef, - 0x16, 0x00, 0x56, 0xef, 0x16, 0x00, 0x57, 0xef, 0x16, 0x00, 0x58, 0xef, - 0x16, 0x00, 0x5c, 0xef, 0x16, 0x00, 0x5e, 0xef, 0x16, 0x00, 0x5f, 0xef, - 0x16, 0x00, 0xf0, 0xef, 0x16, 0x00, 0xf1, 0xef, 0x16, 0x00, 0xf9, 0xef, - 0x16, 0x00, 0xfd, 0xef, 0x16, 0x00, 0x48, 0xf2, 0x16, 0x00, 0x4b, 0xf2, - 0x16, 0x00, 0x50, 0xf2, 0x16, 0x00, 0x30, 0xf3, 0x16, 0x00, 0xe6, 0xf3, - 0x16, 0x00, 0xf0, 0xf3, 0x16, 0x00, 0x30, 0xf9, 0x16, 0x00, 0x4b, 0xfc, - 0x16, 0x00, 0x30, 0xfd, 0x16, 0x00, 0x48, 0xfe, 0x16, 0x00, 0x4b, 0xfe, - 0x16, 0x00, 0x50, 0xfe, 0x16, 0x00, 0x59, 0xfe, 0x16, 0x00, 0x5d, 0xfe, - 0x16, 0x00, 0x88, 0xff, 0x16, 0x00, 0x8b, 0xff, 0x16, 0x00, 0xc6, 0xff, - 0x16, 0x00, 0xe6, 0xff, 0x16, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf7, 0xff, - 0x16, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfe, 0xff, - 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xb3, 0x00, 0x17, 0x00, 0xbb, 0x00, - 0x17, 0x00, 0x33, 0x01, 0x17, 0x00, 0x3b, 0x01, 0x17, 0x00, 0x53, 0x01, - 0x17, 0x00, 0x54, 0x01, 0x17, 0x00, 0x55, 0x01, 0x17, 0x00, 0x5b, 0x01, - 0x17, 0x00, 0x34, 0x02, 0x17, 0x00, 0x35, 0x02, 0x17, 0x00, 0x38, 0x02, - 0x17, 0x00, 0x3c, 0x02, 0x17, 0x00, 0x3e, 0x02, 0x17, 0x00, 0x3f, 0x02, - 0x17, 0x00, 0x34, 0x03, 0x17, 0x00, 0x35, 0x03, 0x17, 0x00, 0x38, 0x03, - 0x17, 0x00, 0x3c, 0x03, 0x17, 0x00, 0x3e, 0x03, 0x17, 0x00, 0x3f, 0x03, - 0x17, 0x00, 0xe3, 0x03, 0x17, 0x00, 0xf3, 0x03, 0x17, 0x00, 0xfb, 0x03, - 0x17, 0x00, 0x38, 0x04, 0x17, 0x00, 0x3c, 0x04, 0x17, 0x00, 0x3e, 0x04, - 0x17, 0x00, 0x3f, 0x04, 0x17, 0x00, 0xc3, 0x05, 0x17, 0x00, 0xc4, 0x05, - 0x17, 0x00, 0xc5, 0x05, 0x17, 0x00, 0xc8, 0x05, 0x17, 0x00, 0xcb, 0x05, - 0x17, 0x00, 0xcc, 0x05, 0x17, 0x00, 0xce, 0x05, 0x17, 0x00, 0xcf, 0x05, - 0x17, 0x00, 0xf4, 0x05, 0x17, 0x00, 0xf5, 0x05, 0x17, 0x00, 0xf8, 0x05, - 0x17, 0x00, 0xfc, 0x05, 0x17, 0x00, 0xfe, 0x05, 0x17, 0x00, 0xff, 0x05, - 0x17, 0x00, 0xe8, 0x06, 0x17, 0x00, 0xeb, 0x06, 0x17, 0x00, 0xf8, 0x06, - 0x17, 0x00, 0xfc, 0x06, 0x17, 0x00, 0xfe, 0x06, 0x17, 0x00, 0xff, 0x06, - 0x17, 0x00, 0x83, 0x07, 0x17, 0x00, 0x84, 0x07, 0x17, 0x00, 0x85, 0x07, - 0x17, 0x00, 0x83, 0x08, 0x17, 0x00, 0x84, 0x08, 0x17, 0x00, 0x85, 0x08, - 0x17, 0x00, 0xb3, 0x08, 0x17, 0x00, 0xbb, 0x08, 0x17, 0x00, 0x58, 0x09, - 0x17, 0x00, 0x5c, 0x09, 0x17, 0x00, 0x5e, 0x09, 0x17, 0x00, 0x5f, 0x09, - 0x17, 0x00, 0x53, 0x0a, 0x17, 0x00, 0x54, 0x0a, 0x17, 0x00, 0x55, 0x0a, - 0x17, 0x00, 0x5b, 0x0a, 0x17, 0x00, 0x88, 0x0b, 0x17, 0x00, 0x8b, 0x0b, - 0x17, 0x00, 0x8c, 0x0b, 0x17, 0x00, 0x8e, 0x0b, 0x17, 0x00, 0x8f, 0x0b, - 0x17, 0x00, 0x53, 0x0d, 0x17, 0x00, 0x54, 0x0d, 0x17, 0x00, 0x55, 0x0d, - 0x17, 0x00, 0x5b, 0x0d, 0x17, 0x00, 0x33, 0x0f, 0x17, 0x00, 0x3b, 0x0f, - 0x17, 0x00, 0xe4, 0x0f, 0x17, 0x00, 0xe5, 0x0f, 0x17, 0x00, 0xe8, 0x0f, - 0x17, 0x00, 0xeb, 0x0f, 0x17, 0x00, 0xec, 0x0f, 0x17, 0x00, 0xee, 0x0f, - 0x17, 0x00, 0xef, 0x0f, 0x17, 0x00, 0xf4, 0x0f, 0x17, 0x00, 0xf5, 0x0f, - 0x17, 0x00, 0xf8, 0x0f, 0x17, 0x00, 0xfc, 0x0f, 0x17, 0x00, 0xfe, 0x0f, - 0x17, 0x00, 0xff, 0x0f, 0x17, 0x00, 0x33, 0x11, 0x17, 0x00, 0x3b, 0x11, - 0x17, 0x00, 0x53, 0x11, 0x17, 0x00, 0x54, 0x11, 0x17, 0x00, 0x55, 0x11, - 0x17, 0x00, 0x5b, 0x11, 0x17, 0x00, 0xb3, 0x11, 0x17, 0x00, 0xbb, 0x11, - 0x17, 0x00, 0x88, 0x14, 0x17, 0x00, 0x8b, 0x14, 0x17, 0x00, 0x8c, 0x14, - 0x17, 0x00, 0x8e, 0x14, 0x17, 0x00, 0x8f, 0x14, 0x17, 0x00, 0xb4, 0x14, - 0x17, 0x00, 0xb5, 0x14, 0x17, 0x00, 0xb8, 0x14, 0x17, 0x00, 0xbc, 0x14, - 0x17, 0x00, 0xbe, 0x14, 0x17, 0x00, 0xbf, 0x14, 0x17, 0x00, 0x58, 0x15, - 0x17, 0x00, 0x58, 0x16, 0x17, 0x00, 0x5c, 0x16, 0x17, 0x00, 0x5e, 0x16, - 0x17, 0x00, 0x5f, 0x16, 0x17, 0x00, 0x43, 0x17, 0x17, 0x00, 0x44, 0x17, - 0x17, 0x00, 0x45, 0x17, 0x17, 0x00, 0x48, 0x17, 0x17, 0x00, 0x4b, 0x17, - 0x17, 0x00, 0x4c, 0x17, 0x17, 0x00, 0x4e, 0x17, 0x17, 0x00, 0x4f, 0x17, - 0x17, 0x00, 0x53, 0x17, 0x17, 0x00, 0x54, 0x17, 0x17, 0x00, 0x55, 0x17, - 0x17, 0x00, 0x5b, 0x17, 0x17, 0x00, 0x83, 0x17, 0x17, 0x00, 0x84, 0x17, - 0x17, 0x00, 0x85, 0x17, 0x17, 0x00, 0xe3, 0x17, 0x17, 0x00, 0xf3, 0x17, - 0x17, 0x00, 0xfb, 0x17, 0x17, 0x00, 0xe8, 0x18, 0x17, 0x00, 0xeb, 0x18, - 0x17, 0x00, 0xf3, 0x19, 0x17, 0x00, 0xfb, 0x19, 0x17, 0x00, 0xb3, 0x1a, - 0x17, 0x00, 0xbb, 0x1a, 0x17, 0x00, 0xc8, 0x1a, 0x17, 0x00, 0xcb, 0x1a, - 0x17, 0x00, 0xe8, 0x1a, 0x17, 0x00, 0xeb, 0x1a, 0x17, 0x00, 0xf8, 0x1a, - 0x17, 0x00, 0xfc, 0x1a, 0x17, 0x00, 0xfe, 0x1a, 0x17, 0x00, 0xff, 0x1a, - 0x17, 0x00, 0xe8, 0x1c, 0x17, 0x00, 0xeb, 0x1c, 0x17, 0x00, 0xf8, 0x1c, - 0x17, 0x00, 0xfc, 0x1c, 0x17, 0x00, 0xfe, 0x1c, 0x17, 0x00, 0xff, 0x1c, - 0x17, 0x00, 0xf3, 0x1d, 0x17, 0x00, 0xfb, 0x1d, 0x17, 0x00, 0x38, 0x1e, - 0x17, 0x00, 0x3c, 0x1e, 0x17, 0x00, 0x3e, 0x1e, 0x17, 0x00, 0x3f, 0x1e, - 0x17, 0x00, 0x33, 0x1f, 0x17, 0x00, 0x3b, 0x1f, 0x17, 0x00, 0xe8, 0x23, - 0x17, 0x00, 0xeb, 0x23, 0x17, 0x00, 0xf8, 0x23, 0x17, 0x00, 0xfc, 0x23, - 0x17, 0x00, 0xfe, 0x23, 0x17, 0x00, 0xff, 0x23, 0x17, 0x00, 0x38, 0x25, - 0x17, 0x00, 0x3c, 0x25, 0x17, 0x00, 0x3e, 0x25, 0x17, 0x00, 0x3f, 0x25, - 0x17, 0x00, 0x36, 0x33, 0x17, 0x00, 0x37, 0x33, 0x17, 0x00, 0x38, 0x33, - 0x17, 0x00, 0x3c, 0x33, 0x17, 0x00, 0x3e, 0x33, 0x17, 0x00, 0x3f, 0x33, - 0x17, 0x00, 0xb8, 0x33, 0x17, 0x00, 0xbc, 0x33, 0x17, 0x00, 0xbe, 0x33, - 0x17, 0x00, 0xbf, 0x33, 0x17, 0x00, 0xe9, 0x33, 0x17, 0x00, 0xea, 0x33, - 0x17, 0x00, 0xf0, 0x33, 0x17, 0x00, 0xf1, 0x33, 0x17, 0x00, 0xf9, 0x33, - 0x17, 0x00, 0xfd, 0x33, 0x17, 0x00, 0x8b, 0x35, 0x17, 0x00, 0x30, 0x39, - 0x17, 0x00, 0x31, 0x39, 0x17, 0x00, 0x39, 0x39, 0x17, 0x00, 0x3d, 0x39, - 0x17, 0x00, 0x8b, 0x39, 0x17, 0x00, 0x37, 0x3d, 0x17, 0x00, 0x38, 0x3d, - 0x17, 0x00, 0x3c, 0x3d, 0x17, 0x00, 0x3e, 0x3d, 0x17, 0x00, 0x3f, 0x3d, - 0x17, 0x00, 0x30, 0x3f, 0x17, 0x00, 0x31, 0x3f, 0x17, 0x00, 0x39, 0x3f, - 0x17, 0x00, 0x3d, 0x3f, 0x17, 0x00, 0xe6, 0x3f, 0x17, 0x00, 0xe7, 0x3f, - 0x17, 0x00, 0xe8, 0x3f, 0x17, 0x00, 0xeb, 0x3f, 0x17, 0x00, 0xf6, 0x3f, - 0x17, 0x00, 0xf7, 0x3f, 0x17, 0x00, 0xf8, 0x3f, 0x17, 0x00, 0xfc, 0x3f, - 0x17, 0x00, 0xfe, 0x3f, 0x17, 0x00, 0xff, 0x3f, 0x17, 0x00, 0x47, 0x40, - 0x17, 0x00, 0x4b, 0x40, 0x17, 0x00, 0xb0, 0x40, 0x17, 0x00, 0xb1, 0x40, - 0x17, 0x00, 0xb9, 0x40, 0x17, 0x00, 0xbd, 0x40, 0x17, 0x00, 0x30, 0x41, - 0x17, 0x00, 0x31, 0x41, 0x17, 0x00, 0x39, 0x41, 0x17, 0x00, 0x3d, 0x41, - 0x17, 0x00, 0x37, 0x42, 0x17, 0x00, 0x38, 0x42, 0x17, 0x00, 0x3c, 0x42, - 0x17, 0x00, 0x3e, 0x42, 0x17, 0x00, 0x3f, 0x42, 0x17, 0x00, 0x37, 0x43, - 0x17, 0x00, 0x38, 0x43, 0x17, 0x00, 0x3c, 0x43, 0x17, 0x00, 0x3e, 0x43, - 0x17, 0x00, 0x3f, 0x43, 0x17, 0x00, 0xb8, 0x43, 0x17, 0x00, 0xbc, 0x43, - 0x17, 0x00, 0xbe, 0x43, 0x17, 0x00, 0xbf, 0x43, 0x17, 0x00, 0xf0, 0x43, - 0x17, 0x00, 0xf1, 0x43, 0x17, 0x00, 0xf9, 0x43, 0x17, 0x00, 0xfd, 0x43, - 0x17, 0x00, 0xc7, 0x45, 0x17, 0x00, 0xcb, 0x45, 0x17, 0x00, 0xf7, 0x45, - 0x17, 0x00, 0xf8, 0x45, 0x17, 0x00, 0xfc, 0x45, 0x17, 0x00, 0xfe, 0x45, - 0x17, 0x00, 0xff, 0x45, 0x17, 0x00, 0x8b, 0x47, 0x17, 0x00, 0x8b, 0x48, - 0x17, 0x00, 0x8b, 0x4c, 0x17, 0x00, 0xb8, 0x4c, 0x17, 0x00, 0xbc, 0x4c, - 0x17, 0x00, 0xbe, 0x4c, 0x17, 0x00, 0xbf, 0x4c, 0x17, 0x00, 0x4b, 0x4e, - 0x17, 0x00, 0x8b, 0x4e, 0x17, 0x00, 0x4b, 0x4f, 0x17, 0x00, 0x8b, 0x4f, - 0x17, 0x00, 0xcb, 0x4f, 0x17, 0x00, 0xeb, 0x4f, 0x17, 0x00, 0xf0, 0x4f, - 0x17, 0x00, 0xf1, 0x4f, 0x17, 0x00, 0xf7, 0x4f, 0x17, 0x00, 0xf9, 0x4f, - 0x17, 0x00, 0xfd, 0x4f, 0x17, 0x00, 0x4b, 0x52, 0x17, 0x00, 0xb8, 0x52, - 0x17, 0x00, 0xbc, 0x52, 0x17, 0x00, 0xbe, 0x52, 0x17, 0x00, 0xbf, 0x52, - 0x17, 0x00, 0x30, 0x53, 0x17, 0x00, 0x31, 0x53, 0x17, 0x00, 0x39, 0x53, - 0x17, 0x00, 0x3d, 0x53, 0x17, 0x00, 0xeb, 0x53, 0x17, 0x00, 0xf7, 0x53, - 0x17, 0x00, 0xf8, 0x53, 0x17, 0x00, 0xfc, 0x53, 0x17, 0x00, 0xfe, 0x53, - 0x17, 0x00, 0xff, 0x53, 0x17, 0x00, 0x37, 0x59, 0x17, 0x00, 0x38, 0x59, - 0x17, 0x00, 0x3c, 0x59, 0x17, 0x00, 0x3e, 0x59, 0x17, 0x00, 0x3f, 0x59, - 0x17, 0x00, 0x4b, 0x5c, 0x17, 0x00, 0xb8, 0x5c, 0x17, 0x00, 0xbc, 0x5c, - 0x17, 0x00, 0xbe, 0x5c, 0x17, 0x00, 0xbf, 0x5c, 0x17, 0x00, 0x30, 0x5d, - 0x17, 0x00, 0x31, 0x5d, 0x17, 0x00, 0x39, 0x5d, 0x17, 0x00, 0x3d, 0x5d, - 0x17, 0x00, 0xb8, 0x5e, 0x17, 0x00, 0xbc, 0x5e, 0x17, 0x00, 0xbe, 0x5e, - 0x17, 0x00, 0xbf, 0x5e, 0x17, 0x00, 0x37, 0x5f, 0x17, 0x00, 0x38, 0x5f, - 0x17, 0x00, 0x3c, 0x5f, 0x17, 0x00, 0x3e, 0x5f, 0x17, 0x00, 0x3f, 0x5f, - 0x17, 0x00, 0xb8, 0x5f, 0x17, 0x00, 0xbc, 0x5f, 0x17, 0x00, 0xbe, 0x5f, - 0x17, 0x00, 0xbf, 0x5f, 0x17, 0x00, 0xf0, 0x5f, 0x17, 0x00, 0xf1, 0x5f, - 0x17, 0x00, 0xf9, 0x5f, 0x17, 0x00, 0xfd, 0x5f, 0x17, 0x00, 0xeb, 0x64, - 0x17, 0x00, 0xeb, 0x66, 0x17, 0x00, 0xcb, 0x6a, 0x17, 0x00, 0xeb, 0x6a, - 0x17, 0x00, 0xf8, 0x6a, 0x17, 0x00, 0xfc, 0x6a, 0x17, 0x00, 0xfe, 0x6a, - 0x17, 0x00, 0xff, 0x6a, 0x17, 0x00, 0x8b, 0x7a, 0x17, 0x00, 0xcb, 0x7a, - 0x17, 0x00, 0xeb, 0x7a, 0x17, 0x00, 0xf8, 0x7c, 0x17, 0x00, 0xfc, 0x7c, - 0x17, 0x00, 0xfe, 0x7c, 0x17, 0x00, 0xff, 0x7c, 0x17, 0x00, 0xc0, 0x81, - 0x17, 0x00, 0xc1, 0x81, 0x17, 0x00, 0xc2, 0x81, 0x17, 0x00, 0xc9, 0x81, - 0x17, 0x00, 0xca, 0x81, 0x17, 0x00, 0xcd, 0x81, 0x17, 0x00, 0xf0, 0x81, - 0x17, 0x00, 0xf1, 0x81, 0x17, 0x00, 0xf3, 0x81, 0x17, 0x00, 0xf9, 0x81, - 0x17, 0x00, 0xfb, 0x81, 0x17, 0x00, 0xfd, 0x81, 0x17, 0x00, 0x83, 0x83, - 0x17, 0x00, 0x84, 0x83, 0x17, 0x00, 0x85, 0x83, 0x17, 0x00, 0x30, 0x84, - 0x17, 0x00, 0x31, 0x84, 0x17, 0x00, 0x39, 0x84, 0x17, 0x00, 0x3d, 0x84, - 0x17, 0x00, 0xe6, 0x84, 0x17, 0x00, 0xe7, 0x84, 0x17, 0x00, 0xe8, 0x84, - 0x17, 0x00, 0xeb, 0x84, 0x17, 0x00, 0xf6, 0x84, 0x17, 0x00, 0xf7, 0x84, - 0x17, 0x00, 0xf8, 0x84, 0x17, 0x00, 0xfc, 0x84, 0x17, 0x00, 0xfe, 0x84, - 0x17, 0x00, 0xff, 0x84, 0x17, 0x00, 0xb3, 0x85, 0x17, 0x00, 0xbb, 0x85, - 0x17, 0x00, 0xc3, 0x85, 0x17, 0x00, 0xc4, 0x85, 0x17, 0x00, 0xc5, 0x85, - 0x17, 0x00, 0xc6, 0x85, 0x17, 0x00, 0xc7, 0x85, 0x17, 0x00, 0xc8, 0x85, - 0x17, 0x00, 0xcb, 0x85, 0x17, 0x00, 0xcc, 0x85, 0x17, 0x00, 0xce, 0x85, - 0x17, 0x00, 0xcf, 0x85, 0x17, 0x00, 0xf2, 0x85, 0x17, 0x00, 0xf4, 0x85, - 0x17, 0x00, 0xf5, 0x85, 0x17, 0x00, 0xf6, 0x85, 0x17, 0x00, 0xf7, 0x85, - 0x17, 0x00, 0xf8, 0x85, 0x17, 0x00, 0xfa, 0x85, 0x17, 0x00, 0xfc, 0x85, - 0x17, 0x00, 0xfe, 0x85, 0x17, 0x00, 0xff, 0x85, 0x17, 0x00, 0xe9, 0x86, - 0x17, 0x00, 0xea, 0x86, 0x17, 0x00, 0xf0, 0x86, 0x17, 0x00, 0xf1, 0x86, - 0x17, 0x00, 0xf9, 0x86, 0x17, 0x00, 0xfd, 0x86, 0x17, 0x00, 0x83, 0x87, - 0x17, 0x00, 0x84, 0x87, 0x17, 0x00, 0x85, 0x87, 0x17, 0x00, 0x86, 0x87, - 0x17, 0x00, 0x87, 0x87, 0x17, 0x00, 0x89, 0x87, 0x17, 0x00, 0x8a, 0x87, - 0x17, 0x00, 0x8d, 0x87, 0x17, 0x00, 0xf7, 0x89, 0x17, 0x00, 0x52, 0x8a, - 0x17, 0x00, 0x58, 0x8a, 0x17, 0x00, 0x5a, 0x8a, 0x17, 0x00, 0x5c, 0x8a, - 0x17, 0x00, 0x5e, 0x8a, 0x17, 0x00, 0x5f, 0x8a, 0x17, 0x00, 0xeb, 0x8a, - 0x17, 0x00, 0xf7, 0x8a, 0x17, 0x00, 0xf8, 0x8a, 0x17, 0x00, 0xfc, 0x8a, - 0x17, 0x00, 0xfe, 0x8a, 0x17, 0x00, 0xff, 0x8a, 0x17, 0x00, 0x58, 0x8b, - 0x17, 0x00, 0x5c, 0x8b, 0x17, 0x00, 0x5e, 0x8b, 0x17, 0x00, 0x5f, 0x8b, - 0x17, 0x00, 0x80, 0x8b, 0x17, 0x00, 0x81, 0x8b, 0x17, 0x00, 0x82, 0x8b, - 0x17, 0x00, 0x88, 0x8b, 0x17, 0x00, 0x8b, 0x8b, 0x17, 0x00, 0x8c, 0x8b, - 0x17, 0x00, 0x8e, 0x8b, 0x17, 0x00, 0x8f, 0x8b, 0x17, 0x00, 0xf1, 0x8d, - 0x17, 0x00, 0xf9, 0x8d, 0x17, 0x00, 0x88, 0x8f, 0x17, 0x00, 0x8b, 0x8f, - 0x17, 0x00, 0x8c, 0x8f, 0x17, 0x00, 0x8e, 0x8f, 0x17, 0x00, 0x8f, 0x8f, - 0x17, 0x00, 0xf4, 0x93, 0x17, 0x00, 0xf5, 0x93, 0x17, 0x00, 0xf8, 0x93, - 0x17, 0x00, 0xfc, 0x93, 0x17, 0x00, 0xfe, 0x93, 0x17, 0x00, 0xff, 0x93, - 0x17, 0x00, 0x34, 0x99, 0x17, 0x00, 0x35, 0x99, 0x17, 0x00, 0x38, 0x99, - 0x17, 0x00, 0x3c, 0x99, 0x17, 0x00, 0x3e, 0x99, 0x17, 0x00, 0x3f, 0x99, - 0x17, 0x00, 0xc3, 0x9f, 0x17, 0x00, 0xc4, 0x9f, 0x17, 0x00, 0xc5, 0x9f, - 0x17, 0x00, 0xc8, 0x9f, 0x17, 0x00, 0xcb, 0x9f, 0x17, 0x00, 0xcc, 0x9f, - 0x17, 0x00, 0xce, 0x9f, 0x17, 0x00, 0xcf, 0x9f, 0x17, 0x00, 0xe4, 0x9f, - 0x17, 0x00, 0xe5, 0x9f, 0x17, 0x00, 0xe8, 0x9f, 0x17, 0x00, 0xeb, 0x9f, - 0x17, 0x00, 0xec, 0x9f, 0x17, 0x00, 0xee, 0x9f, 0x17, 0x00, 0xef, 0x9f, - 0x17, 0x00, 0xf4, 0x9f, 0x17, 0x00, 0xf5, 0x9f, 0x17, 0x00, 0xf8, 0x9f, - 0x17, 0x00, 0xfc, 0x9f, 0x17, 0x00, 0xfe, 0x9f, 0x17, 0x00, 0xff, 0x9f, - 0x17, 0x00, 0x58, 0xa6, 0x17, 0x00, 0x5c, 0xa6, 0x17, 0x00, 0x5e, 0xa6, - 0x17, 0x00, 0x5f, 0xa6, 0x17, 0x00, 0xf8, 0xa9, 0x17, 0x00, 0xfc, 0xa9, - 0x17, 0x00, 0xfe, 0xa9, 0x17, 0x00, 0xff, 0xa9, 0x17, 0x00, 0x88, 0xab, - 0x17, 0x00, 0x8b, 0xab, 0x17, 0x00, 0xf8, 0xad, 0x17, 0x00, 0xfc, 0xad, - 0x17, 0x00, 0xfe, 0xad, 0x17, 0x00, 0xff, 0xad, 0x17, 0x00, 0xf0, 0xb1, - 0x17, 0x00, 0xf1, 0xb1, 0x17, 0x00, 0xf9, 0xb1, 0x17, 0x00, 0xfd, 0xb1, - 0x17, 0x00, 0x58, 0xb2, 0x17, 0x00, 0x5c, 0xb2, 0x17, 0x00, 0x5e, 0xb2, - 0x17, 0x00, 0x5f, 0xb2, 0x17, 0x00, 0xeb, 0xb5, 0x17, 0x00, 0xf7, 0xb5, - 0x17, 0x00, 0xf8, 0xb5, 0x17, 0x00, 0xfc, 0xb5, 0x17, 0x00, 0xfe, 0xb5, - 0x17, 0x00, 0xff, 0xb5, 0x17, 0x00, 0x88, 0xb7, 0x17, 0x00, 0x8b, 0xb7, - 0x17, 0x00, 0xeb, 0xb9, 0x17, 0x00, 0xf7, 0xb9, 0x17, 0x00, 0xf8, 0xb9, - 0x17, 0x00, 0xfc, 0xb9, 0x17, 0x00, 0xfe, 0xb9, 0x17, 0x00, 0xff, 0xb9, - 0x17, 0x00, 0x58, 0xba, 0x17, 0x00, 0x5c, 0xba, 0x17, 0x00, 0x5e, 0xba, - 0x17, 0x00, 0x5f, 0xba, 0x17, 0x00, 0x88, 0xbb, 0x17, 0x00, 0x8b, 0xbb, - 0x17, 0x00, 0xb8, 0xbd, 0x17, 0x00, 0xbc, 0xbd, 0x17, 0x00, 0xbe, 0xbd, - 0x17, 0x00, 0xbf, 0xbd, 0x17, 0x00, 0xf0, 0xbd, 0x17, 0x00, 0xf1, 0xbd, - 0x17, 0x00, 0xf9, 0xbd, 0x17, 0x00, 0xfd, 0xbd, 0x17, 0x00, 0x50, 0xbe, - 0x17, 0x00, 0x51, 0xbe, 0x17, 0x00, 0x56, 0xbe, 0x17, 0x00, 0x57, 0xbe, - 0x17, 0x00, 0x59, 0xbe, 0x17, 0x00, 0x5d, 0xbe, 0x17, 0x00, 0x88, 0xbf, - 0x17, 0x00, 0x8b, 0xbf, 0x17, 0x00, 0xb4, 0xc2, 0x17, 0x00, 0xb5, 0xc2, - 0x17, 0x00, 0xb8, 0xc2, 0x17, 0x00, 0xbc, 0xc2, 0x17, 0x00, 0xbe, 0xc2, - 0x17, 0x00, 0xbf, 0xc2, 0x17, 0x00, 0xe3, 0xc3, 0x17, 0x00, 0xe9, 0xc3, - 0x17, 0x00, 0xea, 0xc3, 0x17, 0x00, 0xed, 0xc3, 0x17, 0x00, 0xf0, 0xc3, - 0x17, 0x00, 0xf1, 0xc3, 0x17, 0x00, 0xf3, 0xc3, 0x17, 0x00, 0xf9, 0xc3, - 0x17, 0x00, 0xfb, 0xc3, 0x17, 0x00, 0xfd, 0xc3, 0x17, 0x00, 0x30, 0xc5, - 0x17, 0x00, 0x31, 0xc5, 0x17, 0x00, 0x33, 0xc5, 0x17, 0x00, 0x39, 0xc5, - 0x17, 0x00, 0x3b, 0xc5, 0x17, 0x00, 0x3d, 0xc5, 0x17, 0x00, 0x58, 0xc5, - 0x17, 0x00, 0x5c, 0xc5, 0x17, 0x00, 0x5e, 0xc5, 0x17, 0x00, 0x5f, 0xc5, - 0x17, 0x00, 0x83, 0xcc, 0x17, 0x00, 0x84, 0xcc, 0x17, 0x00, 0x85, 0xcc, - 0x17, 0x00, 0xb3, 0xcc, 0x17, 0x00, 0xbb, 0xcc, 0x17, 0x00, 0x88, 0xcf, - 0x17, 0x00, 0x8b, 0xcf, 0x17, 0x00, 0x8c, 0xcf, 0x17, 0x00, 0x8e, 0xcf, - 0x17, 0x00, 0x8f, 0xcf, 0x17, 0x00, 0xc3, 0xcf, 0x17, 0x00, 0xc4, 0xcf, - 0x17, 0x00, 0xc5, 0xcf, 0x17, 0x00, 0xc6, 0xcf, 0x17, 0x00, 0xc7, 0xcf, - 0x17, 0x00, 0xc8, 0xcf, 0x17, 0x00, 0xcb, 0xcf, 0x17, 0x00, 0xcc, 0xcf, - 0x17, 0x00, 0xce, 0xcf, 0x17, 0x00, 0xcf, 0xcf, 0x17, 0x00, 0xe0, 0xcf, - 0x17, 0x00, 0xe1, 0xcf, 0x17, 0x00, 0xe2, 0xcf, 0x17, 0x00, 0xe4, 0xcf, - 0x17, 0x00, 0xe5, 0xcf, 0x17, 0x00, 0xe6, 0xcf, 0x17, 0x00, 0xe7, 0xcf, - 0x17, 0x00, 0xe8, 0xcf, 0x17, 0x00, 0xeb, 0xcf, 0x17, 0x00, 0xec, 0xcf, - 0x17, 0x00, 0xee, 0xcf, 0x17, 0x00, 0xef, 0xcf, 0x17, 0x00, 0xf2, 0xcf, - 0x17, 0x00, 0xf4, 0xcf, 0x17, 0x00, 0xf5, 0xcf, 0x17, 0x00, 0xf6, 0xcf, - 0x17, 0x00, 0xf7, 0xcf, 0x17, 0x00, 0xf8, 0xcf, 0x17, 0x00, 0xfa, 0xcf, - 0x17, 0x00, 0xfc, 0xcf, 0x17, 0x00, 0xfe, 0xcf, 0x17, 0x00, 0xff, 0xcf, - 0x17, 0x00, 0x34, 0xd3, 0x17, 0x00, 0x35, 0xd3, 0x17, 0x00, 0x38, 0xd3, - 0x17, 0x00, 0x3c, 0xd3, 0x17, 0x00, 0x3e, 0xd3, 0x17, 0x00, 0x3f, 0xd3, - 0x17, 0x00, 0xe3, 0xd3, 0x17, 0x00, 0xf3, 0xd3, 0x17, 0x00, 0xfb, 0xd3, - 0x17, 0x00, 0x34, 0xd9, 0x17, 0x00, 0x35, 0xd9, 0x17, 0x00, 0x38, 0xd9, - 0x17, 0x00, 0x3c, 0xd9, 0x17, 0x00, 0x3e, 0xd9, 0x17, 0x00, 0x3f, 0xd9, - 0x17, 0x00, 0x33, 0xdd, 0x17, 0x00, 0x3b, 0xdd, 0x17, 0x00, 0x58, 0xdd, - 0x17, 0x00, 0x5c, 0xdd, 0x17, 0x00, 0x5e, 0xdd, 0x17, 0x00, 0x5f, 0xdd, - 0x17, 0x00, 0x38, 0xde, 0x17, 0x00, 0x3c, 0xde, 0x17, 0x00, 0x3e, 0xde, - 0x17, 0x00, 0x3f, 0xde, 0x17, 0x00, 0x33, 0xdf, 0x17, 0x00, 0x3b, 0xdf, - 0x17, 0x00, 0xe4, 0xdf, 0x17, 0x00, 0xe5, 0xdf, 0x17, 0x00, 0xe8, 0xdf, - 0x17, 0x00, 0xeb, 0xdf, 0x17, 0x00, 0xec, 0xdf, 0x17, 0x00, 0xee, 0xdf, - 0x17, 0x00, 0xef, 0xdf, 0x17, 0x00, 0xf4, 0xdf, 0x17, 0x00, 0xf5, 0xdf, - 0x17, 0x00, 0xf8, 0xdf, 0x17, 0x00, 0xfc, 0xdf, 0x17, 0x00, 0xfe, 0xdf, - 0x17, 0x00, 0xff, 0xdf, 0x17, 0x00, 0xf2, 0xe3, 0x17, 0x00, 0xf4, 0xe3, - 0x17, 0x00, 0xf5, 0xe3, 0x17, 0x00, 0xf6, 0xe3, 0x17, 0x00, 0xf7, 0xe3, - 0x17, 0x00, 0xf8, 0xe3, 0x17, 0x00, 0xfa, 0xe3, 0x17, 0x00, 0xfc, 0xe3, - 0x17, 0x00, 0xfe, 0xe3, 0x17, 0x00, 0xff, 0xe3, 0x17, 0x00, 0x51, 0xe5, - 0x17, 0x00, 0x56, 0xe5, 0x17, 0x00, 0x57, 0xe5, 0x17, 0x00, 0x59, 0xe5, - 0x17, 0x00, 0x5d, 0xe5, 0x17, 0x00, 0xb3, 0xec, 0x17, 0x00, 0xbb, 0xec, - 0x17, 0x00, 0xb4, 0xee, 0x17, 0x00, 0xb5, 0xee, 0x17, 0x00, 0xb8, 0xee, - 0x17, 0x00, 0xbc, 0xee, 0x17, 0x00, 0xbe, 0xee, 0x17, 0x00, 0xbf, 0xee, - 0x17, 0x00, 0x88, 0xef, 0x17, 0x00, 0x8b, 0xef, 0x17, 0x00, 0x8c, 0xef, - 0x17, 0x00, 0x8e, 0xef, 0x17, 0x00, 0x8f, 0xef, 0x17, 0x00, 0xc3, 0xef, - 0x17, 0x00, 0xc4, 0xef, 0x17, 0x00, 0xc5, 0xef, 0x17, 0x00, 0xc6, 0xef, - 0x17, 0x00, 0xc7, 0xef, 0x17, 0x00, 0xc8, 0xef, 0x17, 0x00, 0xcb, 0xef, - 0x17, 0x00, 0xcc, 0xef, 0x17, 0x00, 0xce, 0xef, 0x17, 0x00, 0xcf, 0xef, - 0x17, 0x00, 0xe0, 0xef, 0x17, 0x00, 0xe1, 0xef, 0x17, 0x00, 0xe2, 0xef, - 0x17, 0x00, 0xe4, 0xef, 0x17, 0x00, 0xe5, 0xef, 0x17, 0x00, 0xe6, 0xef, - 0x17, 0x00, 0xe7, 0xef, 0x17, 0x00, 0xe8, 0xef, 0x17, 0x00, 0xeb, 0xef, - 0x17, 0x00, 0xec, 0xef, 0x17, 0x00, 0xee, 0xef, 0x17, 0x00, 0xef, 0xef, - 0x17, 0x00, 0xf2, 0xef, 0x17, 0x00, 0xf4, 0xef, 0x17, 0x00, 0xf5, 0xef, - 0x17, 0x00, 0xf6, 0xef, 0x17, 0x00, 0xf7, 0xef, 0x17, 0x00, 0xf8, 0xef, - 0x17, 0x00, 0xfa, 0xef, 0x17, 0x00, 0xfc, 0xef, 0x17, 0x00, 0xfe, 0xef, - 0x17, 0x00, 0xff, 0xef, 0x17, 0x00, 0xf2, 0xf3, 0x17, 0x00, 0xf4, 0xf3, - 0x17, 0x00, 0xf5, 0xf3, 0x17, 0x00, 0xf6, 0xf3, 0x17, 0x00, 0xf7, 0xf3, - 0x17, 0x00, 0xf8, 0xf3, 0x17, 0x00, 0xfa, 0xf3, 0x17, 0x00, 0xfc, 0xf3, - 0x17, 0x00, 0xfe, 0xf3, 0x17, 0x00, 0xff, 0xf3, 0x17, 0x00, 0x31, 0xf9, - 0x17, 0x00, 0x39, 0xf9, 0x17, 0x00, 0x50, 0xf9, 0x17, 0x00, 0x51, 0xf9, - 0x17, 0x00, 0x56, 0xf9, 0x17, 0x00, 0x57, 0xf9, 0x17, 0x00, 0x59, 0xf9, - 0x17, 0x00, 0x5d, 0xf9, 0x17, 0x00, 0x88, 0xfc, 0x17, 0x00, 0x8b, 0xfc, - 0x17, 0x00, 0xb3, 0xfc, 0x17, 0x00, 0xbb, 0xfc, 0x17, 0x00, 0x51, 0xfd, - 0x17, 0x00, 0x56, 0xfd, 0x17, 0x00, 0x57, 0xfd, 0x17, 0x00, 0x59, 0xfd, - 0x17, 0x00, 0x5d, 0xfd, 0x17, 0x00, 0x43, 0xfe, 0x17, 0x00, 0x44, 0xfe, - 0x17, 0x00, 0x45, 0xfe, 0x17, 0x00, 0x48, 0xfe, 0x17, 0x00, 0x4b, 0xfe, - 0x17, 0x00, 0x4c, 0xfe, 0x17, 0x00, 0x4e, 0xfe, 0x17, 0x00, 0x4f, 0xfe, - 0x17, 0x00, 0x50, 0xfe, 0x17, 0x00, 0x51, 0xfe, 0x17, 0x00, 0x53, 0xfe, - 0x17, 0x00, 0x54, 0xfe, 0x17, 0x00, 0x55, 0xfe, 0x17, 0x00, 0x56, 0xfe, - 0x17, 0x00, 0x57, 0xfe, 0x17, 0x00, 0x59, 0xfe, 0x17, 0x00, 0x5b, 0xfe, - 0x17, 0x00, 0x5d, 0xfe, 0x17, 0x00, 0x8b, 0xfe, 0x17, 0x00, 0x48, 0xff, - 0x17, 0x00, 0x4b, 0xff, 0x17, 0x00, 0x50, 0xff, 0x17, 0x00, 0x51, 0xff, - 0x17, 0x00, 0x56, 0xff, 0x17, 0x00, 0x57, 0xff, 0x17, 0x00, 0x59, 0xff, - 0x17, 0x00, 0x5d, 0xff, 0x17, 0x00, 0x88, 0xff, 0x17, 0x00, 0x8b, 0xff, - 0x17, 0x00, 0x8c, 0xff, 0x17, 0x00, 0x8e, 0xff, 0x17, 0x00, 0x8f, 0xff, - 0x17, 0x00, 0xc3, 0xff, 0x17, 0x00, 0xc4, 0xff, 0x17, 0x00, 0xc5, 0xff, - 0x17, 0x00, 0xc6, 0xff, 0x17, 0x00, 0xc7, 0xff, 0x17, 0x00, 0xc8, 0xff, - 0x17, 0x00, 0xcb, 0xff, 0x17, 0x00, 0xcc, 0xff, 0x17, 0x00, 0xce, 0xff, - 0x17, 0x00, 0xcf, 0xff, 0x17, 0x00, 0xe0, 0xff, 0x17, 0x00, 0xe1, 0xff, - 0x17, 0x00, 0xe2, 0xff, 0x17, 0x00, 0xe4, 0xff, 0x17, 0x00, 0xe5, 0xff, - 0x17, 0x00, 0xe6, 0xff, 0x17, 0x00, 0xe7, 0xff, 0x17, 0x00, 0xe8, 0xff, - 0x17, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xec, 0xff, 0x17, 0x00, 0xee, 0xff, - 0x17, 0x00, 0xef, 0xff, 0x17, 0x00, 0xf2, 0xff, 0x17, 0x00, 0xf4, 0xff, - 0x17, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf7, 0xff, - 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xfc, 0xff, - 0x17, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xff, 0xff, 0x17, 0x00, 0xf8, 0x00, - 0x18, 0x00, 0xfc, 0x00, 0x18, 0x00, 0xfe, 0x00, 0x18, 0x00, 0xff, 0x00, - 0x18, 0x00, 0x78, 0x01, 0x18, 0x00, 0x7c, 0x01, 0x18, 0x00, 0x7e, 0x01, - 0x18, 0x00, 0x7f, 0x01, 0x18, 0x00, 0xcb, 0x02, 0x18, 0x00, 0xeb, 0x02, - 0x18, 0x00, 0x2b, 0x03, 0x18, 0x00, 0xcb, 0x03, 0x18, 0x00, 0xeb, 0x03, - 0x18, 0x00, 0x2b, 0x09, 0x18, 0x00, 0x2b, 0x0b, 0x18, 0x00, 0x8b, 0x0b, - 0x18, 0x00, 0xab, 0x0b, 0x18, 0x00, 0xcb, 0x0b, 0x18, 0x00, 0xeb, 0x0b, - 0x18, 0x00, 0xf8, 0x0b, 0x18, 0x00, 0xfc, 0x0b, 0x18, 0x00, 0xfe, 0x0b, - 0x18, 0x00, 0xff, 0x0b, 0x18, 0x00, 0x2b, 0x0d, 0x18, 0x00, 0x2b, 0x11, - 0x18, 0x00, 0x2b, 0x19, 0x18, 0x00, 0xf8, 0x21, 0x18, 0x00, 0xfc, 0x21, - 0x18, 0x00, 0xfe, 0x21, 0x18, 0x00, 0xff, 0x21, 0x18, 0x00, 0xcb, 0x22, - 0x18, 0x00, 0xeb, 0x22, 0x18, 0x00, 0x2b, 0x23, 0x18, 0x00, 0xcb, 0x23, - 0x18, 0x00, 0xeb, 0x23, 0x18, 0x00, 0x8b, 0x27, 0x18, 0x00, 0xcb, 0x27, - 0x18, 0x00, 0xeb, 0x27, 0x18, 0x00, 0xf8, 0x27, 0x18, 0x00, 0xfc, 0x27, - 0x18, 0x00, 0xfe, 0x27, 0x18, 0x00, 0xff, 0x27, 0x18, 0x00, 0x8b, 0x2b, - 0x18, 0x00, 0xcb, 0x2b, 0x18, 0x00, 0xeb, 0x2b, 0x18, 0x00, 0xcb, 0x2c, - 0x18, 0x00, 0xeb, 0x2c, 0x18, 0x00, 0xf8, 0x2c, 0x18, 0x00, 0xfc, 0x2c, - 0x18, 0x00, 0xfe, 0x2c, 0x18, 0x00, 0xff, 0x2c, 0x18, 0x00, 0xcb, 0x2e, - 0x18, 0x00, 0xeb, 0x2e, 0x18, 0x00, 0xf8, 0x2e, 0x18, 0x00, 0xfc, 0x2e, - 0x18, 0x00, 0xfe, 0x2e, 0x18, 0x00, 0xff, 0x2e, 0x18, 0x00, 0xcb, 0x2f, - 0x18, 0x00, 0xeb, 0x2f, 0x18, 0x00, 0xf8, 0x2f, 0x18, 0x00, 0xfc, 0x2f, - 0x18, 0x00, 0xfe, 0x2f, 0x18, 0x00, 0xff, 0x2f, 0x18, 0x00, 0x30, 0x33, - 0x18, 0x00, 0x2b, 0x35, 0x18, 0x00, 0xb0, 0x37, 0x18, 0x00, 0x30, 0x3b, - 0x18, 0x00, 0xf0, 0x3f, 0x18, 0x00, 0xf1, 0x3f, 0x18, 0x00, 0xf7, 0x3f, - 0x18, 0x00, 0xf9, 0x3f, 0x18, 0x00, 0xfd, 0x3f, 0x18, 0x00, 0x77, 0x40, - 0x18, 0x00, 0x78, 0x40, 0x18, 0x00, 0x7c, 0x40, 0x18, 0x00, 0x7e, 0x40, - 0x18, 0x00, 0x7f, 0x40, 0x18, 0x00, 0xf0, 0x41, 0x18, 0x00, 0xf1, 0x41, - 0x18, 0x00, 0xf9, 0x41, 0x18, 0x00, 0xfd, 0x41, 0x18, 0x00, 0x0b, 0x43, - 0x18, 0x00, 0xb0, 0x47, 0x18, 0x00, 0xb0, 0x48, 0x18, 0x00, 0x30, 0x4b, - 0x18, 0x00, 0x0b, 0x4f, 0x18, 0x00, 0x78, 0x52, 0x18, 0x00, 0x7c, 0x52, - 0x18, 0x00, 0x7e, 0x52, 0x18, 0x00, 0x7f, 0x52, 0x18, 0x00, 0xb0, 0x54, - 0x18, 0x00, 0x0b, 0x55, 0x18, 0x00, 0x6b, 0x55, 0x18, 0x00, 0x78, 0x55, - 0x18, 0x00, 0x7c, 0x55, 0x18, 0x00, 0x7e, 0x55, 0x18, 0x00, 0x7f, 0x55, - 0x18, 0x00, 0xcb, 0x57, 0x18, 0x00, 0xeb, 0x57, 0x18, 0x00, 0xf8, 0x57, - 0x18, 0x00, 0xfc, 0x57, 0x18, 0x00, 0xfe, 0x57, 0x18, 0x00, 0xff, 0x57, - 0x18, 0x00, 0xb0, 0x58, 0x18, 0x00, 0xb0, 0x5b, 0x18, 0x00, 0x78, 0x5c, - 0x18, 0x00, 0x7c, 0x5c, 0x18, 0x00, 0x7e, 0x5c, 0x18, 0x00, 0x7f, 0x5c, - 0x18, 0x00, 0x78, 0x5e, 0x18, 0x00, 0x7c, 0x5e, 0x18, 0x00, 0x7e, 0x5e, - 0x18, 0x00, 0x7f, 0x5e, 0x18, 0x00, 0xf7, 0x5f, 0x18, 0x00, 0xf8, 0x5f, - 0x18, 0x00, 0xfc, 0x5f, 0x18, 0x00, 0xfe, 0x5f, 0x18, 0x00, 0xff, 0x5f, - 0x18, 0x00, 0xcb, 0x64, 0x18, 0x00, 0xeb, 0x64, 0x18, 0x00, 0xfb, 0x65, - 0x18, 0x00, 0x0b, 0x66, 0x18, 0x00, 0xcb, 0x66, 0x18, 0x00, 0xeb, 0x66, - 0x18, 0x00, 0x0b, 0x6a, 0x18, 0x00, 0x2b, 0x6a, 0x18, 0x00, 0x0b, 0x6b, - 0x18, 0x00, 0xfb, 0x75, 0x18, 0x00, 0xcb, 0x78, 0x18, 0x00, 0xeb, 0x78, - 0x18, 0x00, 0x0b, 0x7a, 0x18, 0x00, 0x2b, 0x7a, 0x18, 0x00, 0x0b, 0x7b, - 0x18, 0x00, 0xfb, 0x7d, 0x18, 0x00, 0xf7, 0x84, 0x18, 0x00, 0xf8, 0x84, - 0x18, 0x00, 0xfc, 0x84, 0x18, 0x00, 0xfe, 0x84, 0x18, 0x00, 0xff, 0x84, - 0x18, 0x00, 0xf7, 0x86, 0x18, 0x00, 0xf8, 0x86, 0x18, 0x00, 0xfc, 0x86, - 0x18, 0x00, 0xfe, 0x86, 0x18, 0x00, 0xff, 0x86, 0x18, 0x00, 0xf7, 0x87, - 0x18, 0x00, 0x0b, 0x89, 0x18, 0x00, 0x0b, 0x8a, 0x18, 0x00, 0x0b, 0x8b, - 0x18, 0x00, 0x78, 0x8b, 0x18, 0x00, 0x7c, 0x8b, 0x18, 0x00, 0x7e, 0x8b, - 0x18, 0x00, 0x7f, 0x8b, 0x18, 0x00, 0x0b, 0x8d, 0x18, 0x00, 0x0b, 0x8e, - 0x18, 0x00, 0xf1, 0x8f, 0x18, 0x00, 0xf7, 0x8f, 0x18, 0x00, 0xf9, 0x8f, - 0x18, 0x00, 0x3b, 0x94, 0x18, 0x00, 0x3b, 0x96, 0x18, 0x00, 0xcb, 0xa4, - 0x18, 0x00, 0xeb, 0xa4, 0x18, 0x00, 0xf8, 0xa4, 0x18, 0x00, 0xfc, 0xa4, - 0x18, 0x00, 0xfe, 0xa4, 0x18, 0x00, 0xff, 0xa4, 0x18, 0x00, 0x0b, 0xa6, - 0x18, 0x00, 0x2b, 0xa6, 0x18, 0x00, 0xcb, 0xa6, 0x18, 0x00, 0xeb, 0xa6, - 0x18, 0x00, 0xf8, 0xaa, 0x18, 0x00, 0xfc, 0xaa, 0x18, 0x00, 0xfe, 0xaa, - 0x18, 0x00, 0xff, 0xaa, 0x18, 0x00, 0x71, 0xb1, 0x18, 0x00, 0x77, 0xb1, - 0x18, 0x00, 0x79, 0xb1, 0x18, 0x00, 0xf1, 0xb3, 0x18, 0x00, 0xf7, 0xb3, - 0x18, 0x00, 0xf9, 0xb3, 0x18, 0x00, 0xf1, 0xb7, 0x18, 0x00, 0xf7, 0xb7, - 0x18, 0x00, 0xf9, 0xb7, 0x18, 0x00, 0xf0, 0xb8, 0x18, 0x00, 0xf1, 0xb8, - 0x18, 0x00, 0xf7, 0xb8, 0x18, 0x00, 0xf9, 0xb8, 0x18, 0x00, 0xfd, 0xb8, - 0x18, 0x00, 0xbb, 0xb9, 0x18, 0x00, 0x0b, 0xba, 0x18, 0x00, 0x0b, 0xbb, - 0x18, 0x00, 0x78, 0xbb, 0x18, 0x00, 0x7c, 0xbb, 0x18, 0x00, 0x7e, 0xbb, - 0x18, 0x00, 0x7f, 0xbb, 0x18, 0x00, 0xbb, 0xbd, 0x18, 0x00, 0xbb, 0xbe, - 0x18, 0x00, 0x30, 0xc0, 0x18, 0x00, 0xf6, 0xc0, 0x18, 0x00, 0xf7, 0xc0, - 0x18, 0x00, 0xf8, 0xc0, 0x18, 0x00, 0xfc, 0xc0, 0x18, 0x00, 0xfe, 0xc0, - 0x18, 0x00, 0xff, 0xc0, 0x18, 0x00, 0x30, 0xc1, 0x18, 0x00, 0xf0, 0xc1, - 0x18, 0x00, 0xf1, 0xc1, 0x18, 0x00, 0xf9, 0xc1, 0x18, 0x00, 0xfd, 0xc1, - 0x18, 0x00, 0x78, 0xc3, 0x18, 0x00, 0x7c, 0xc3, 0x18, 0x00, 0x7e, 0xc3, - 0x18, 0x00, 0x7f, 0xc3, 0x18, 0x00, 0xb0, 0xc6, 0x18, 0x00, 0x30, 0xc7, - 0x18, 0x00, 0xb0, 0xc8, 0x18, 0x00, 0x2b, 0xc9, 0x18, 0x00, 0x30, 0xcb, - 0x18, 0x00, 0xd1, 0xcc, 0x18, 0x00, 0xd6, 0xcc, 0x18, 0x00, 0xd7, 0xcc, - 0x18, 0x00, 0xd8, 0xcc, 0x18, 0x00, 0xdc, 0xcc, 0x18, 0x00, 0xde, 0xcc, - 0x18, 0x00, 0xdf, 0xcc, 0x18, 0x00, 0x18, 0xcf, 0x18, 0x00, 0x1c, 0xcf, - 0x18, 0x00, 0x1e, 0xcf, 0x18, 0x00, 0x1f, 0xcf, 0x18, 0x00, 0x91, 0xcf, - 0x18, 0x00, 0x96, 0xcf, 0x18, 0x00, 0x97, 0xcf, 0x18, 0x00, 0x98, 0xcf, - 0x18, 0x00, 0x9c, 0xcf, 0x18, 0x00, 0x9e, 0xcf, 0x18, 0x00, 0x9f, 0xcf, - 0x18, 0x00, 0xd1, 0xcf, 0x18, 0x00, 0xd6, 0xcf, 0x18, 0x00, 0xd7, 0xcf, - 0x18, 0x00, 0xd8, 0xcf, 0x18, 0x00, 0xdc, 0xcf, 0x18, 0x00, 0xde, 0xcf, - 0x18, 0x00, 0xdf, 0xcf, 0x18, 0x00, 0xf8, 0xd1, 0x18, 0x00, 0xfc, 0xd1, - 0x18, 0x00, 0xfe, 0xd1, 0x18, 0x00, 0xff, 0xd1, 0x18, 0x00, 0xc8, 0xd4, - 0x18, 0x00, 0xcb, 0xd4, 0x18, 0x00, 0xe8, 0xd4, 0x18, 0x00, 0xeb, 0xd4, - 0x18, 0x00, 0xf8, 0xd5, 0x18, 0x00, 0xfc, 0xd5, 0x18, 0x00, 0xfe, 0xd5, - 0x18, 0x00, 0xff, 0xd5, 0x18, 0x00, 0xcb, 0xd6, 0x18, 0x00, 0xeb, 0xd6, - 0x18, 0x00, 0x88, 0xd7, 0x18, 0x00, 0x8b, 0xd7, 0x18, 0x00, 0xc8, 0xd7, - 0x18, 0x00, 0xcb, 0xd7, 0x18, 0x00, 0xe8, 0xd7, 0x18, 0x00, 0xeb, 0xd7, - 0x18, 0x00, 0xf8, 0xdb, 0x18, 0x00, 0xfc, 0xdb, 0x18, 0x00, 0xfe, 0xdb, - 0x18, 0x00, 0xff, 0xdb, 0x18, 0x00, 0xb0, 0xe0, 0x18, 0x00, 0x30, 0xe2, - 0x18, 0x00, 0xf6, 0xe2, 0x18, 0x00, 0xf7, 0xe2, 0x18, 0x00, 0xf8, 0xe2, - 0x18, 0x00, 0xfc, 0xe2, 0x18, 0x00, 0xfe, 0xe2, 0x18, 0x00, 0xff, 0xe2, - 0x18, 0x00, 0x30, 0xe5, 0x18, 0x00, 0xf0, 0xe5, 0x18, 0x00, 0xc6, 0xe7, - 0x18, 0x00, 0xe6, 0xe7, 0x18, 0x00, 0xf6, 0xe7, 0x18, 0x00, 0xf7, 0xe7, - 0x18, 0x00, 0xf8, 0xe7, 0x18, 0x00, 0xfc, 0xe7, 0x18, 0x00, 0xfe, 0xe7, - 0x18, 0x00, 0xff, 0xe7, 0x18, 0x00, 0xb0, 0xe8, 0x18, 0x00, 0xb0, 0xea, - 0x18, 0x00, 0x30, 0xeb, 0x18, 0x00, 0x30, 0xec, 0x18, 0x00, 0x30, 0xee, - 0x18, 0x00, 0xb0, 0xf0, 0x18, 0x00, 0xb0, 0xf1, 0x18, 0x00, 0x30, 0xf3, - 0x18, 0x00, 0x90, 0xf3, 0x18, 0x00, 0xd0, 0xf3, 0x18, 0x00, 0xb0, 0xf4, - 0x18, 0x00, 0xb0, 0xf6, 0x18, 0x00, 0xb0, 0xf7, 0x18, 0x00, 0x30, 0xf9, - 0x18, 0x00, 0xf7, 0xf9, 0x18, 0x00, 0xf8, 0xf9, 0x18, 0x00, 0xfc, 0xf9, - 0x18, 0x00, 0xfe, 0xf9, 0x18, 0x00, 0xff, 0xf9, 0x18, 0x00, 0x30, 0xfb, - 0x18, 0x00, 0x30, 0xfd, 0x18, 0x00, 0xf0, 0xfd, 0x18, 0x00, 0x26, 0xff, - 0x18, 0x00, 0x27, 0xff, 0x18, 0x00, 0x29, 0xff, 0x18, 0x00, 0x2a, 0xff, - 0x18, 0x00, 0x88, 0xff, 0x18, 0x00, 0x8b, 0xff, 0x18, 0x00, 0xc6, 0xff, - 0x18, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf7, 0xff, - 0x18, 0x00, 0xf8, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfe, 0xff, - 0x18, 0x00, 0xff, 0xff, 0x18, 0x00, 0x58, 0x01, 0x19, 0x00, 0xf3, 0x01, - 0x19, 0x00, 0xfb, 0x01, 0x19, 0x00, 0xf3, 0x02, 0x19, 0x00, 0xfb, 0x02, - 0x19, 0x00, 0xf3, 0x03, 0x19, 0x00, 0xfb, 0x03, 0x19, 0x00, 0xf8, 0x04, - 0x19, 0x00, 0xfc, 0x04, 0x19, 0x00, 0xfe, 0x04, 0x19, 0x00, 0xff, 0x04, - 0x19, 0x00, 0xe8, 0x06, 0x19, 0x00, 0xeb, 0x06, 0x19, 0x00, 0xf4, 0x07, - 0x19, 0x00, 0xf5, 0x07, 0x19, 0x00, 0xf8, 0x07, 0x19, 0x00, 0xfc, 0x07, - 0x19, 0x00, 0xfe, 0x07, 0x19, 0x00, 0xff, 0x07, 0x19, 0x00, 0xf4, 0x11, - 0x19, 0x00, 0xf5, 0x11, 0x19, 0x00, 0xf8, 0x11, 0x19, 0x00, 0xfc, 0x11, - 0x19, 0x00, 0xfe, 0x11, 0x19, 0x00, 0xff, 0x11, 0x19, 0x00, 0xc8, 0x1c, - 0x19, 0x00, 0xcb, 0x1c, 0x19, 0x00, 0xe8, 0x1c, 0x19, 0x00, 0xeb, 0x1c, - 0x19, 0x00, 0xf8, 0x1c, 0x19, 0x00, 0xfc, 0x1c, 0x19, 0x00, 0xfe, 0x1c, - 0x19, 0x00, 0xff, 0x1c, 0x19, 0x00, 0xf4, 0x1f, 0x19, 0x00, 0xf5, 0x1f, - 0x19, 0x00, 0xf8, 0x1f, 0x19, 0x00, 0xfc, 0x1f, 0x19, 0x00, 0xfe, 0x1f, - 0x19, 0x00, 0xff, 0x1f, 0x19, 0x00, 0xf8, 0x23, 0x19, 0x00, 0xfc, 0x23, - 0x19, 0x00, 0xfe, 0x23, 0x19, 0x00, 0xff, 0x23, 0x19, 0x00, 0xf8, 0x29, - 0x19, 0x00, 0xfc, 0x29, 0x19, 0x00, 0xfe, 0x29, 0x19, 0x00, 0xff, 0x29, - 0x19, 0x00, 0x30, 0x33, 0x19, 0x00, 0xf0, 0x33, 0x19, 0x00, 0xf1, 0x33, - 0x19, 0x00, 0xf9, 0x33, 0x19, 0x00, 0xfd, 0x33, 0x19, 0x00, 0xf7, 0x35, - 0x19, 0x00, 0xf8, 0x35, 0x19, 0x00, 0xfc, 0x35, 0x19, 0x00, 0xfe, 0x35, - 0x19, 0x00, 0xff, 0x35, 0x19, 0x00, 0x30, 0x39, 0x19, 0x00, 0xf0, 0x39, - 0x19, 0x00, 0xf1, 0x39, 0x19, 0x00, 0xf9, 0x39, 0x19, 0x00, 0xfd, 0x39, - 0x19, 0x00, 0x30, 0x3d, 0x19, 0x00, 0xf0, 0x3d, 0x19, 0x00, 0xf1, 0x3d, - 0x19, 0x00, 0xf9, 0x3d, 0x19, 0x00, 0xfd, 0x3d, 0x19, 0x00, 0x30, 0x3f, - 0x19, 0x00, 0xb0, 0x40, 0x19, 0x00, 0xf6, 0x40, 0x19, 0x00, 0xf7, 0x40, - 0x19, 0x00, 0xf8, 0x40, 0x19, 0x00, 0xfc, 0x40, 0x19, 0x00, 0xfe, 0x40, - 0x19, 0x00, 0xff, 0x40, 0x19, 0x00, 0xf0, 0x41, 0x19, 0x00, 0xf1, 0x41, - 0x19, 0x00, 0xf9, 0x41, 0x19, 0x00, 0xfd, 0x41, 0x19, 0x00, 0x30, 0x47, - 0x19, 0x00, 0x51, 0x49, 0x19, 0x00, 0x56, 0x49, 0x19, 0x00, 0x57, 0x49, - 0x19, 0x00, 0x58, 0x49, 0x19, 0x00, 0x5c, 0x49, 0x19, 0x00, 0x5e, 0x49, - 0x19, 0x00, 0x5f, 0x49, 0x19, 0x00, 0xf0, 0x49, 0x19, 0x00, 0xf1, 0x49, - 0x19, 0x00, 0xf9, 0x49, 0x19, 0x00, 0xfd, 0x49, 0x19, 0x00, 0xc6, 0x4b, - 0x19, 0x00, 0xe6, 0x4b, 0x19, 0x00, 0xf0, 0x4b, 0x19, 0x00, 0xf0, 0x4c, - 0x19, 0x00, 0xf1, 0x4c, 0x19, 0x00, 0xf9, 0x4c, 0x19, 0x00, 0xfd, 0x4c, - 0x19, 0x00, 0xf0, 0x4e, 0x19, 0x00, 0xf1, 0x4e, 0x19, 0x00, 0xf9, 0x4e, - 0x19, 0x00, 0xfd, 0x4e, 0x19, 0x00, 0xf0, 0x4f, 0x19, 0x00, 0xf1, 0x4f, - 0x19, 0x00, 0xf9, 0x4f, 0x19, 0x00, 0xfd, 0x4f, 0x19, 0x00, 0x51, 0x55, - 0x19, 0x00, 0x56, 0x55, 0x19, 0x00, 0x57, 0x55, 0x19, 0x00, 0x59, 0x55, - 0x19, 0x00, 0x5d, 0x55, 0x19, 0x00, 0xf6, 0x59, 0x19, 0x00, 0xf7, 0x59, - 0x19, 0x00, 0xf8, 0x59, 0x19, 0x00, 0xfc, 0x59, 0x19, 0x00, 0xfe, 0x59, - 0x19, 0x00, 0xff, 0x59, 0x19, 0x00, 0xf6, 0x5d, 0x19, 0x00, 0xf7, 0x5d, - 0x19, 0x00, 0xf8, 0x5d, 0x19, 0x00, 0xfc, 0x5d, 0x19, 0x00, 0xfe, 0x5d, - 0x19, 0x00, 0xff, 0x5d, 0x19, 0x00, 0xf0, 0x5f, 0x19, 0x00, 0xf1, 0x5f, - 0x19, 0x00, 0xf9, 0x5f, 0x19, 0x00, 0xfd, 0x5f, 0x19, 0x00, 0xf4, 0x61, - 0x19, 0x00, 0xf5, 0x61, 0x19, 0x00, 0xf8, 0x61, 0x19, 0x00, 0xfc, 0x61, - 0x19, 0x00, 0xfe, 0x61, 0x19, 0x00, 0xff, 0x61, 0x19, 0x00, 0xf3, 0x69, - 0x19, 0x00, 0xfb, 0x69, 0x19, 0x00, 0xf8, 0x6a, 0x19, 0x00, 0xfc, 0x6a, - 0x19, 0x00, 0xfe, 0x6a, 0x19, 0x00, 0xff, 0x6a, 0x19, 0x00, 0xf3, 0x6c, - 0x19, 0x00, 0xfb, 0x6c, 0x19, 0x00, 0xf4, 0x6e, 0x19, 0x00, 0xf5, 0x6e, - 0x19, 0x00, 0xf8, 0x6e, 0x19, 0x00, 0xfc, 0x6e, 0x19, 0x00, 0xfe, 0x6e, - 0x19, 0x00, 0xff, 0x6e, 0x19, 0x00, 0xf4, 0x6f, 0x19, 0x00, 0xf5, 0x6f, - 0x19, 0x00, 0xf8, 0x6f, 0x19, 0x00, 0xfc, 0x6f, 0x19, 0x00, 0xfe, 0x6f, - 0x19, 0x00, 0xff, 0x6f, 0x19, 0x00, 0xcb, 0x72, 0x19, 0x00, 0xeb, 0x72, - 0x19, 0x00, 0xf8, 0x72, 0x19, 0x00, 0xfc, 0x72, 0x19, 0x00, 0xfe, 0x72, - 0x19, 0x00, 0xff, 0x72, 0x19, 0x00, 0xf4, 0x74, 0x19, 0x00, 0xf5, 0x74, - 0x19, 0x00, 0xf8, 0x74, 0x19, 0x00, 0xfc, 0x74, 0x19, 0x00, 0xfe, 0x74, - 0x19, 0x00, 0xff, 0x74, 0x19, 0x00, 0xf3, 0x77, 0x19, 0x00, 0xfb, 0x77, - 0x19, 0x00, 0x30, 0x84, 0x19, 0x00, 0x31, 0x84, 0x19, 0x00, 0x39, 0x84, - 0x19, 0x00, 0x3d, 0x84, 0x19, 0x00, 0xf0, 0x84, 0x19, 0x00, 0xf1, 0x84, - 0x19, 0x00, 0xf9, 0x84, 0x19, 0x00, 0xfd, 0x84, 0x19, 0x00, 0xf0, 0x86, - 0x19, 0x00, 0xf1, 0x86, 0x19, 0x00, 0xf9, 0x86, 0x19, 0x00, 0xfd, 0x86, - 0x19, 0x00, 0xf1, 0x87, 0x19, 0x00, 0xf9, 0x87, 0x19, 0x00, 0x38, 0x9e, - 0x19, 0x00, 0x3c, 0x9e, 0x19, 0x00, 0x3e, 0x9e, 0x19, 0x00, 0x3f, 0x9e, - 0x19, 0x00, 0x8b, 0xa7, 0x19, 0x00, 0xcb, 0xa7, 0x19, 0x00, 0xeb, 0xa7, - 0x19, 0x00, 0xcb, 0xaf, 0x19, 0x00, 0xeb, 0xaf, 0x19, 0x00, 0xf8, 0xaf, - 0x19, 0x00, 0xfc, 0xaf, 0x19, 0x00, 0xfe, 0xaf, 0x19, 0x00, 0xff, 0xaf, - 0x19, 0x00, 0x8b, 0xb3, 0x19, 0x00, 0xcb, 0xb7, 0x19, 0x00, 0xeb, 0xb7, - 0x19, 0x00, 0xf0, 0xb7, 0x19, 0x00, 0xf1, 0xb7, 0x19, 0x00, 0xf7, 0xb7, - 0x19, 0x00, 0xf9, 0xb7, 0x19, 0x00, 0xfd, 0xb7, 0x19, 0x00, 0xf8, 0xbf, - 0x19, 0x00, 0xfc, 0xbf, 0x19, 0x00, 0xfe, 0xbf, 0x19, 0x00, 0xff, 0xbf, - 0x19, 0x00, 0xf7, 0xc3, 0x19, 0x00, 0x31, 0xc5, 0x19, 0x00, 0x39, 0xc5, - 0x19, 0x00, 0xf7, 0xc5, 0x19, 0x00, 0x38, 0xde, 0x19, 0x00, 0x3c, 0xde, - 0x19, 0x00, 0x3e, 0xde, 0x19, 0x00, 0x3f, 0xde, 0x19, 0x00, 0xf1, 0xe3, - 0x19, 0x00, 0xf9, 0xe3, 0x19, 0x00, 0xf1, 0xe9, 0x19, 0x00, 0xf9, 0xe9, - 0x19, 0x00, 0xf1, 0xed, 0x19, 0x00, 0xf9, 0xed, 0x19, 0x00, 0x31, 0xff, - 0x19, 0x00, 0x37, 0xff, 0x19, 0x00, 0x39, 0xff, 0x19, 0x00, 0xb8, 0x00, - 0x1a, 0x00, 0xbc, 0x00, 0x1a, 0x00, 0xbe, 0x00, 0x1a, 0x00, 0xbf, 0x00, - 0x1a, 0x00, 0xb8, 0x04, 0x1a, 0x00, 0xbc, 0x04, 0x1a, 0x00, 0xbe, 0x04, - 0x1a, 0x00, 0xbf, 0x04, 0x1a, 0x00, 0xb8, 0x08, 0x1a, 0x00, 0xbc, 0x08, - 0x1a, 0x00, 0xbe, 0x08, 0x1a, 0x00, 0xbf, 0x08, 0x1a, 0x00, 0xf8, 0x13, - 0x1a, 0x00, 0xfc, 0x13, 0x1a, 0x00, 0xfe, 0x13, 0x1a, 0x00, 0xff, 0x13, - 0x1a, 0x00, 0x88, 0x1b, 0x1a, 0x00, 0x8b, 0x1b, 0x1a, 0x00, 0xc8, 0x1b, - 0x1a, 0x00, 0xcb, 0x1b, 0x1a, 0x00, 0xe8, 0x1b, 0x1a, 0x00, 0xeb, 0x1b, - 0x1a, 0x00, 0xc8, 0x23, 0x1a, 0x00, 0xcb, 0x23, 0x1a, 0x00, 0xe8, 0x23, - 0x1a, 0x00, 0xeb, 0x23, 0x1a, 0x00, 0xf8, 0x23, 0x1a, 0x00, 0xfc, 0x23, - 0x1a, 0x00, 0xfe, 0x23, 0x1a, 0x00, 0xff, 0x23, 0x1a, 0x00, 0xc9, 0x33, - 0x1a, 0x00, 0xca, 0x33, 0x1a, 0x00, 0xe9, 0x33, 0x1a, 0x00, 0xea, 0x33, - 0x1a, 0x00, 0xf0, 0x33, 0x1a, 0x00, 0xf1, 0x33, 0x1a, 0x00, 0xf9, 0x33, - 0x1a, 0x00, 0xfd, 0x33, 0x1a, 0x00, 0xf7, 0x35, 0x1a, 0x00, 0xf8, 0x35, - 0x1a, 0x00, 0xfc, 0x35, 0x1a, 0x00, 0xfe, 0x35, 0x1a, 0x00, 0xff, 0x35, - 0x1a, 0x00, 0xf7, 0x39, 0x1a, 0x00, 0xf8, 0x39, 0x1a, 0x00, 0xfc, 0x39, - 0x1a, 0x00, 0xfe, 0x39, 0x1a, 0x00, 0xff, 0x39, 0x1a, 0x00, 0xf0, 0x3d, - 0x1a, 0x00, 0xf1, 0x3d, 0x1a, 0x00, 0xf9, 0x3d, 0x1a, 0x00, 0xfd, 0x3d, - 0x1a, 0x00, 0xf7, 0x45, 0x1a, 0x00, 0xf8, 0x45, 0x1a, 0x00, 0xfc, 0x45, - 0x1a, 0x00, 0xfe, 0x45, 0x1a, 0x00, 0xff, 0x45, 0x1a, 0x00, 0xf0, 0x47, - 0x1a, 0x00, 0xf1, 0x47, 0x1a, 0x00, 0xf9, 0x47, 0x1a, 0x00, 0xfd, 0x47, - 0x1a, 0x00, 0xcb, 0x4b, 0x1a, 0x00, 0xeb, 0x4b, 0x1a, 0x00, 0xf8, 0x4b, - 0x1a, 0x00, 0xfc, 0x4b, 0x1a, 0x00, 0xfe, 0x4b, 0x1a, 0x00, 0xff, 0x4b, - 0x1a, 0x00, 0xf7, 0x53, 0x1a, 0x00, 0xf8, 0x53, 0x1a, 0x00, 0xfc, 0x53, - 0x1a, 0x00, 0xfe, 0x53, 0x1a, 0x00, 0xff, 0x53, 0x1a, 0x00, 0xb8, 0x5c, - 0x1a, 0x00, 0xbc, 0x5c, 0x1a, 0x00, 0xbe, 0x5c, 0x1a, 0x00, 0xbf, 0x5c, - 0x1a, 0x00, 0xb8, 0x5e, 0x1a, 0x00, 0xbc, 0x5e, 0x1a, 0x00, 0xbe, 0x5e, - 0x1a, 0x00, 0xbf, 0x5e, 0x1a, 0x00, 0xb7, 0x80, 0x1a, 0x00, 0xf1, 0x81, - 0x1a, 0x00, 0xf9, 0x81, 0x1a, 0x00, 0xf7, 0x83, 0x1a, 0x00, 0xb1, 0x84, - 0x1a, 0x00, 0xb9, 0x84, 0x1a, 0x00, 0xf7, 0x85, 0x1a, 0x00, 0xb1, 0x86, - 0x1a, 0x00, 0xb9, 0x86, 0x1a, 0x00, 0xb1, 0x88, 0x1a, 0x00, 0xb7, 0x88, - 0x1a, 0x00, 0xb9, 0x88, 0x1a, 0x00, 0xf1, 0x8b, 0x1a, 0x00, 0xf7, 0x8b, - 0x1a, 0x00, 0xf9, 0x8b, 0x1a, 0x00, 0x88, 0xc3, 0x1a, 0x00, 0x8b, 0xc3, - 0x1a, 0x00, 0xb8, 0xcc, 0x1a, 0x00, 0xbc, 0xcc, 0x1a, 0x00, 0xbe, 0xcc, - 0x1a, 0x00, 0xbf, 0xcc, 0x1a, 0x00, 0xb8, 0xce, 0x1a, 0x00, 0xbc, 0xce, - 0x1a, 0x00, 0xbe, 0xce, 0x1a, 0x00, 0xbf, 0xce, 0x1a, 0x00, 0xc9, 0xcf, - 0x1a, 0x00, 0xca, 0xcf, 0x1a, 0x00, 0xe9, 0xcf, 0x1a, 0x00, 0xea, 0xcf, - 0x1a, 0x00, 0xf0, 0xcf, 0x1a, 0x00, 0xf1, 0xcf, 0x1a, 0x00, 0xf9, 0xcf, - 0x1a, 0x00, 0xfd, 0xcf, 0x1a, 0x00, 0xc8, 0xdf, 0x1a, 0x00, 0xcb, 0xdf, - 0x1a, 0x00, 0xe8, 0xdf, 0x1a, 0x00, 0xeb, 0xdf, 0x1a, 0x00, 0xf8, 0xdf, - 0x1a, 0x00, 0xfc, 0xdf, 0x1a, 0x00, 0xfe, 0xdf, 0x1a, 0x00, 0xff, 0xdf, - 0x1a, 0x00, 0xb8, 0xec, 0x1a, 0x00, 0xbc, 0xec, 0x1a, 0x00, 0xbe, 0xec, - 0x1a, 0x00, 0xbf, 0xec, 0x1a, 0x00, 0xc9, 0xef, 0x1a, 0x00, 0xca, 0xef, - 0x1a, 0x00, 0xe9, 0xef, 0x1a, 0x00, 0xea, 0xef, 0x1a, 0x00, 0xf0, 0xef, - 0x1a, 0x00, 0xf1, 0xef, 0x1a, 0x00, 0xf9, 0xef, 0x1a, 0x00, 0xfd, 0xef, - 0x1a, 0x00, 0x88, 0xff, 0x1a, 0x00, 0x8b, 0xff, 0x1a, 0x00, 0xc6, 0xff, - 0x1a, 0x00, 0xc7, 0xff, 0x1a, 0x00, 0xc8, 0xff, 0x1a, 0x00, 0xcb, 0xff, - 0x1a, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xe8, 0xff, - 0x1a, 0x00, 0xeb, 0xff, 0x1a, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf7, 0xff, - 0x1a, 0x00, 0xf8, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xfe, 0xff, - 0x1a, 0x00, 0xff, 0xff, 0x1a, 0x00, 0x73, 0x04, 0x1b, 0x00, 0x7b, 0x04, - 0x1b, 0x00, 0xf4, 0x05, 0x1b, 0x00, 0xf5, 0x05, 0x1b, 0x00, 0xf8, 0x05, - 0x1b, 0x00, 0xfc, 0x05, 0x1b, 0x00, 0xfe, 0x05, 0x1b, 0x00, 0xff, 0x05, - 0x1b, 0x00, 0x74, 0x06, 0x1b, 0x00, 0x75, 0x06, 0x1b, 0x00, 0x78, 0x06, - 0x1b, 0x00, 0x7c, 0x06, 0x1b, 0x00, 0x7e, 0x06, 0x1b, 0x00, 0x7f, 0x06, - 0x1b, 0x00, 0x78, 0x07, 0x1b, 0x00, 0x7c, 0x07, 0x1b, 0x00, 0x7e, 0x07, - 0x1b, 0x00, 0x7f, 0x07, 0x1b, 0x00, 0x74, 0x0a, 0x1b, 0x00, 0x75, 0x0a, - 0x1b, 0x00, 0x78, 0x0a, 0x1b, 0x00, 0x7c, 0x0a, 0x1b, 0x00, 0x7e, 0x0a, - 0x1b, 0x00, 0x7f, 0x0a, 0x1b, 0x00, 0xf4, 0x0b, 0x1b, 0x00, 0xf5, 0x0b, - 0x1b, 0x00, 0xf8, 0x0b, 0x1b, 0x00, 0xfc, 0x0b, 0x1b, 0x00, 0xfe, 0x0b, - 0x1b, 0x00, 0xff, 0x0b, 0x1b, 0x00, 0xf3, 0x0f, 0x1b, 0x00, 0xfb, 0x0f, - 0x1b, 0x00, 0x74, 0x11, 0x1b, 0x00, 0x75, 0x11, 0x1b, 0x00, 0x78, 0x11, - 0x1b, 0x00, 0x7c, 0x11, 0x1b, 0x00, 0x7e, 0x11, 0x1b, 0x00, 0x7f, 0x11, - 0x1b, 0x00, 0xf4, 0x11, 0x1b, 0x00, 0xf5, 0x11, 0x1b, 0x00, 0xf8, 0x11, - 0x1b, 0x00, 0xfc, 0x11, 0x1b, 0x00, 0xfe, 0x11, 0x1b, 0x00, 0xff, 0x11, - 0x1b, 0x00, 0xf3, 0x17, 0x1b, 0x00, 0xfb, 0x17, 0x1b, 0x00, 0x88, 0x33, - 0x1b, 0x00, 0x8b, 0x33, 0x1b, 0x00, 0xf0, 0x33, 0x1b, 0x00, 0xf1, 0x33, - 0x1b, 0x00, 0xf9, 0x33, 0x1b, 0x00, 0xfd, 0x33, 0x1b, 0x00, 0xf0, 0x3b, - 0x1b, 0x00, 0xf1, 0x3b, 0x1b, 0x00, 0xf9, 0x3b, 0x1b, 0x00, 0xfd, 0x3b, - 0x1b, 0x00, 0x90, 0x3f, 0x1b, 0x00, 0x98, 0x3f, 0x1b, 0x00, 0x9c, 0x3f, - 0x1b, 0x00, 0x9e, 0x3f, 0x1b, 0x00, 0x9f, 0x3f, 0x1b, 0x00, 0xd0, 0x3f, - 0x1b, 0x00, 0xd8, 0x3f, 0x1b, 0x00, 0xdc, 0x3f, 0x1b, 0x00, 0xde, 0x3f, - 0x1b, 0x00, 0xdf, 0x3f, 0x1b, 0x00, 0x70, 0x44, 0x1b, 0x00, 0x71, 0x44, - 0x1b, 0x00, 0x79, 0x44, 0x1b, 0x00, 0x7d, 0x44, 0x1b, 0x00, 0xb0, 0x44, - 0x1b, 0x00, 0xf7, 0x45, 0x1b, 0x00, 0xf8, 0x45, 0x1b, 0x00, 0xfc, 0x45, - 0x1b, 0x00, 0xfe, 0x45, 0x1b, 0x00, 0xff, 0x45, 0x1b, 0x00, 0x70, 0x46, - 0x1b, 0x00, 0x71, 0x46, 0x1b, 0x00, 0x79, 0x46, 0x1b, 0x00, 0x7d, 0x46, - 0x1b, 0x00, 0xb0, 0x46, 0x1b, 0x00, 0x0b, 0x4f, 0x1b, 0x00, 0xf0, 0x51, - 0x1b, 0x00, 0xf1, 0x51, 0x1b, 0x00, 0xf9, 0x51, 0x1b, 0x00, 0xfd, 0x51, - 0x1b, 0x00, 0x0b, 0x55, 0x1b, 0x00, 0x6b, 0x55, 0x1b, 0x00, 0x78, 0x55, - 0x1b, 0x00, 0x7c, 0x55, 0x1b, 0x00, 0x7e, 0x55, 0x1b, 0x00, 0x7f, 0x55, - 0x1b, 0x00, 0xcb, 0x57, 0x1b, 0x00, 0xeb, 0x57, 0x1b, 0x00, 0xf8, 0x57, - 0x1b, 0x00, 0xfc, 0x57, 0x1b, 0x00, 0xfe, 0x57, 0x1b, 0x00, 0xff, 0x57, - 0x1b, 0x00, 0xf7, 0x59, 0x1b, 0x00, 0xf8, 0x59, 0x1b, 0x00, 0xfc, 0x59, - 0x1b, 0x00, 0xfe, 0x59, 0x1b, 0x00, 0xff, 0x59, 0x1b, 0x00, 0xb0, 0x5a, - 0x1b, 0x00, 0xf7, 0x5d, 0x1b, 0x00, 0xf8, 0x5d, 0x1b, 0x00, 0xfc, 0x5d, - 0x1b, 0x00, 0xfe, 0x5d, 0x1b, 0x00, 0xff, 0x5d, 0x1b, 0x00, 0xf7, 0x5f, - 0x1b, 0x00, 0xf8, 0x5f, 0x1b, 0x00, 0xfc, 0x5f, 0x1b, 0x00, 0xfe, 0x5f, - 0x1b, 0x00, 0xff, 0x5f, 0x1b, 0x00, 0x0b, 0x7b, 0x1b, 0x00, 0xf0, 0x87, - 0x1b, 0x00, 0xf1, 0x87, 0x1b, 0x00, 0xf3, 0x87, 0x1b, 0x00, 0xf9, 0x87, - 0x1b, 0x00, 0xfb, 0x87, 0x1b, 0x00, 0xfd, 0x87, 0x1b, 0x00, 0x11, 0x8b, - 0x1b, 0x00, 0x16, 0x8b, 0x1b, 0x00, 0x17, 0x8b, 0x1b, 0x00, 0x19, 0x8b, - 0x1b, 0x00, 0x1d, 0x8b, 0x1b, 0x00, 0x76, 0x8b, 0x1b, 0x00, 0x77, 0x8b, - 0x1b, 0x00, 0x78, 0x8b, 0x1b, 0x00, 0x7c, 0x8b, 0x1b, 0x00, 0x7e, 0x8b, - 0x1b, 0x00, 0x7f, 0x8b, 0x1b, 0x00, 0xf3, 0x99, 0x1b, 0x00, 0xfb, 0x99, - 0x1b, 0x00, 0xf4, 0x9f, 0x1b, 0x00, 0xf5, 0x9f, 0x1b, 0x00, 0xf8, 0x9f, - 0x1b, 0x00, 0xfc, 0x9f, 0x1b, 0x00, 0xfe, 0x9f, 0x1b, 0x00, 0xff, 0x9f, - 0x1b, 0x00, 0xf8, 0xa7, 0x1b, 0x00, 0xfc, 0xa7, 0x1b, 0x00, 0xfe, 0xa7, - 0x1b, 0x00, 0xff, 0xa7, 0x1b, 0x00, 0x88, 0xb3, 0x1b, 0x00, 0x8b, 0xb3, - 0x1b, 0x00, 0xf0, 0xb3, 0x1b, 0x00, 0xf1, 0xb3, 0x1b, 0x00, 0xf9, 0xb3, - 0x1b, 0x00, 0xfd, 0xb3, 0x1b, 0x00, 0x77, 0xb8, 0x1b, 0x00, 0x78, 0xb8, - 0x1b, 0x00, 0x7c, 0xb8, 0x1b, 0x00, 0x7e, 0xb8, 0x1b, 0x00, 0x7f, 0xb8, - 0x1b, 0x00, 0x90, 0xbb, 0x1b, 0x00, 0x98, 0xbb, 0x1b, 0x00, 0x9c, 0xbb, - 0x1b, 0x00, 0x9e, 0xbb, 0x1b, 0x00, 0x9f, 0xbb, 0x1b, 0x00, 0xd0, 0xbb, - 0x1b, 0x00, 0xd8, 0xbb, 0x1b, 0x00, 0xdc, 0xbb, 0x1b, 0x00, 0xde, 0xbb, - 0x1b, 0x00, 0xdf, 0xbb, 0x1b, 0x00, 0x90, 0xbf, 0x1b, 0x00, 0x98, 0xbf, - 0x1b, 0x00, 0x9c, 0xbf, 0x1b, 0x00, 0x9e, 0xbf, 0x1b, 0x00, 0x9f, 0xbf, - 0x1b, 0x00, 0xd0, 0xbf, 0x1b, 0x00, 0xd8, 0xbf, 0x1b, 0x00, 0xdc, 0xbf, - 0x1b, 0x00, 0xde, 0xbf, 0x1b, 0x00, 0xdf, 0xbf, 0x1b, 0x00, 0xf3, 0xd3, - 0x1b, 0x00, 0xfb, 0xd3, 0x1b, 0x00, 0xf4, 0xdb, 0x1b, 0x00, 0xf5, 0xdb, - 0x1b, 0x00, 0xf8, 0xdb, 0x1b, 0x00, 0xfc, 0xdb, 0x1b, 0x00, 0xfe, 0xdb, - 0x1b, 0x00, 0xff, 0xdb, 0x1b, 0x00, 0x0b, 0xe5, 0x1b, 0x00, 0x68, 0xe5, - 0x1b, 0x00, 0x6b, 0xe5, 0x1b, 0x00, 0xf2, 0xe7, 0x1b, 0x00, 0xf4, 0xe7, - 0x1b, 0x00, 0xf5, 0xe7, 0x1b, 0x00, 0xf6, 0xe7, 0x1b, 0x00, 0xf7, 0xe7, - 0x1b, 0x00, 0xf8, 0xe7, 0x1b, 0x00, 0xfa, 0xe7, 0x1b, 0x00, 0xfc, 0xe7, - 0x1b, 0x00, 0xfe, 0xe7, 0x1b, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0x08, 0xf3, - 0x1b, 0x00, 0x0b, 0xf3, 0x1b, 0x00, 0x0b, 0xf9, 0x1b, 0x00, 0x68, 0xf9, - 0x1b, 0x00, 0x6b, 0xf9, 0x1b, 0x00, 0x78, 0xf9, 0x1b, 0x00, 0x7c, 0xf9, - 0x1b, 0x00, 0x7e, 0xf9, 0x1b, 0x00, 0x7f, 0xf9, 0x1b, 0x00, 0xf7, 0xf9, - 0x1b, 0x00, 0x0b, 0xfd, 0x1b, 0x00, 0x68, 0xfd, 0x1b, 0x00, 0x6b, 0xfd, - 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf5, 0xff, - 0x1b, 0x00, 0xf6, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf8, 0xff, - 0x1b, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfe, 0xff, - 0x1b, 0x00, 0xff, 0xff, 0x1b, 0x00, 0xcb, 0x00, 0x1c, 0x00, 0xeb, 0x00, - 0x1c, 0x00, 0xf8, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x1c, 0x00, 0xfe, 0x00, - 0x1c, 0x00, 0xff, 0x00, 0x1c, 0x00, 0x38, 0x01, 0x1c, 0x00, 0x3c, 0x01, - 0x1c, 0x00, 0x3e, 0x01, 0x1c, 0x00, 0x3f, 0x01, 0x1c, 0x00, 0xb8, 0x01, - 0x1c, 0x00, 0xbc, 0x01, 0x1c, 0x00, 0xbe, 0x01, 0x1c, 0x00, 0xbf, 0x01, - 0x1c, 0x00, 0x38, 0x02, 0x1c, 0x00, 0x3c, 0x02, 0x1c, 0x00, 0x3e, 0x02, - 0x1c, 0x00, 0x3f, 0x02, 0x1c, 0x00, 0xcb, 0x02, 0x1c, 0x00, 0xeb, 0x02, - 0x1c, 0x00, 0xf8, 0x02, 0x1c, 0x00, 0xfc, 0x02, 0x1c, 0x00, 0xfe, 0x02, - 0x1c, 0x00, 0xff, 0x02, 0x1c, 0x00, 0x2b, 0x03, 0x1c, 0x00, 0xb8, 0x08, - 0x1c, 0x00, 0xbc, 0x08, 0x1c, 0x00, 0xbe, 0x08, 0x1c, 0x00, 0xbf, 0x08, - 0x1c, 0x00, 0xcb, 0x08, 0x1c, 0x00, 0xeb, 0x08, 0x1c, 0x00, 0x2b, 0x0b, - 0x1c, 0x00, 0xab, 0x0b, 0x1c, 0x00, 0xf8, 0x0b, 0x1c, 0x00, 0xfc, 0x0b, - 0x1c, 0x00, 0xfe, 0x0b, 0x1c, 0x00, 0xff, 0x0b, 0x1c, 0x00, 0x2b, 0x0d, - 0x1c, 0x00, 0x38, 0x0f, 0x1c, 0x00, 0x3c, 0x0f, 0x1c, 0x00, 0x3e, 0x0f, - 0x1c, 0x00, 0x3f, 0x0f, 0x1c, 0x00, 0x2b, 0x11, 0x1c, 0x00, 0x2b, 0x13, - 0x1c, 0x00, 0xcb, 0x13, 0x1c, 0x00, 0xeb, 0x13, 0x1c, 0x00, 0x2b, 0x19, - 0x1c, 0x00, 0x78, 0x1a, 0x1c, 0x00, 0x7c, 0x1a, 0x1c, 0x00, 0x7e, 0x1a, - 0x1c, 0x00, 0x7f, 0x1a, 0x1c, 0x00, 0x2b, 0x1d, 0x1c, 0x00, 0x38, 0x1f, - 0x1c, 0x00, 0x3c, 0x1f, 0x1c, 0x00, 0x3e, 0x1f, 0x1c, 0x00, 0x3f, 0x1f, - 0x1c, 0x00, 0x38, 0x22, 0x1c, 0x00, 0x3c, 0x22, 0x1c, 0x00, 0x3e, 0x22, - 0x1c, 0x00, 0x3f, 0x22, 0x1c, 0x00, 0xcb, 0x22, 0x1c, 0x00, 0xeb, 0x22, - 0x1c, 0x00, 0xf8, 0x22, 0x1c, 0x00, 0xfc, 0x22, 0x1c, 0x00, 0xfe, 0x22, - 0x1c, 0x00, 0xff, 0x22, 0x1c, 0x00, 0x2b, 0x23, 0x1c, 0x00, 0xb8, 0x24, - 0x1c, 0x00, 0xbc, 0x24, 0x1c, 0x00, 0xbe, 0x24, 0x1c, 0x00, 0xbf, 0x24, - 0x1c, 0x00, 0x8b, 0x27, 0x1c, 0x00, 0xcb, 0x27, 0x1c, 0x00, 0xeb, 0x27, - 0x1c, 0x00, 0xcb, 0x28, 0x1c, 0x00, 0xeb, 0x28, 0x1c, 0x00, 0xf8, 0x2b, - 0x1c, 0x00, 0xfc, 0x2b, 0x1c, 0x00, 0xfe, 0x2b, 0x1c, 0x00, 0xff, 0x2b, - 0x1c, 0x00, 0xcb, 0x2c, 0x1c, 0x00, 0xeb, 0x2c, 0x1c, 0x00, 0xf8, 0x2c, - 0x1c, 0x00, 0xfc, 0x2c, 0x1c, 0x00, 0xfe, 0x2c, 0x1c, 0x00, 0xff, 0x2c, - 0x1c, 0x00, 0xcb, 0x2e, 0x1c, 0x00, 0xeb, 0x2e, 0x1c, 0x00, 0xf8, 0x2e, - 0x1c, 0x00, 0xfc, 0x2e, 0x1c, 0x00, 0xfe, 0x2e, 0x1c, 0x00, 0xff, 0x2e, - 0x1c, 0x00, 0xcb, 0x2f, 0x1c, 0x00, 0xeb, 0x2f, 0x1c, 0x00, 0xf8, 0x2f, - 0x1c, 0x00, 0xfc, 0x2f, 0x1c, 0x00, 0xfe, 0x2f, 0x1c, 0x00, 0xff, 0x2f, - 0x1c, 0x00, 0x38, 0x33, 0x1c, 0x00, 0x3c, 0x33, 0x1c, 0x00, 0x3e, 0x33, - 0x1c, 0x00, 0x3f, 0x33, 0x1c, 0x00, 0xb8, 0x33, 0x1c, 0x00, 0xbc, 0x33, - 0x1c, 0x00, 0xbe, 0x33, 0x1c, 0x00, 0xbf, 0x33, 0x1c, 0x00, 0x2b, 0x35, - 0x1c, 0x00, 0x38, 0x37, 0x1c, 0x00, 0x3c, 0x37, 0x1c, 0x00, 0x3e, 0x37, - 0x1c, 0x00, 0x3f, 0x37, 0x1c, 0x00, 0xb0, 0x37, 0x1c, 0x00, 0xb1, 0x37, - 0x1c, 0x00, 0xb7, 0x37, 0x1c, 0x00, 0xb9, 0x37, 0x1c, 0x00, 0xbd, 0x37, - 0x1c, 0x00, 0xb0, 0x38, 0x1c, 0x00, 0xb1, 0x38, 0x1c, 0x00, 0xb7, 0x38, - 0x1c, 0x00, 0xb9, 0x38, 0x1c, 0x00, 0xbd, 0x38, 0x1c, 0x00, 0x38, 0x3b, - 0x1c, 0x00, 0x3c, 0x3b, 0x1c, 0x00, 0x3e, 0x3b, 0x1c, 0x00, 0x3f, 0x3b, - 0x1c, 0x00, 0xb0, 0x3b, 0x1c, 0x00, 0xb1, 0x3b, 0x1c, 0x00, 0xb7, 0x3b, - 0x1c, 0x00, 0xb9, 0x3b, 0x1c, 0x00, 0xbd, 0x3b, 0x1c, 0x00, 0x78, 0x3e, - 0x1c, 0x00, 0x7c, 0x3e, 0x1c, 0x00, 0x7e, 0x3e, 0x1c, 0x00, 0x7f, 0x3e, - 0x1c, 0x00, 0x2b, 0x3f, 0x1c, 0x00, 0xab, 0x3f, 0x1c, 0x00, 0xf8, 0x3f, - 0x1c, 0x00, 0xfc, 0x3f, 0x1c, 0x00, 0xfe, 0x3f, 0x1c, 0x00, 0xff, 0x3f, - 0x1c, 0x00, 0x77, 0x40, 0x1c, 0x00, 0x78, 0x40, 0x1c, 0x00, 0x7c, 0x40, - 0x1c, 0x00, 0x7e, 0x40, 0x1c, 0x00, 0x7f, 0x40, 0x1c, 0x00, 0xf7, 0x41, - 0x1c, 0x00, 0xf8, 0x41, 0x1c, 0x00, 0xfc, 0x41, 0x1c, 0x00, 0xfe, 0x41, - 0x1c, 0x00, 0xff, 0x41, 0x1c, 0x00, 0x30, 0x45, 0x1c, 0x00, 0x31, 0x45, - 0x1c, 0x00, 0x39, 0x45, 0x1c, 0x00, 0x3d, 0x45, 0x1c, 0x00, 0x37, 0x47, - 0x1c, 0x00, 0x38, 0x47, 0x1c, 0x00, 0x3c, 0x47, 0x1c, 0x00, 0x3e, 0x47, - 0x1c, 0x00, 0x3f, 0x47, 0x1c, 0x00, 0xb0, 0x47, 0x1c, 0x00, 0xb1, 0x47, - 0x1c, 0x00, 0xb9, 0x47, 0x1c, 0x00, 0xbd, 0x47, 0x1c, 0x00, 0x70, 0x4a, - 0x1c, 0x00, 0x71, 0x4a, 0x1c, 0x00, 0x77, 0x4a, 0x1c, 0x00, 0x79, 0x4a, - 0x1c, 0x00, 0x7d, 0x4a, 0x1c, 0x00, 0xb0, 0x4b, 0x1c, 0x00, 0x0b, 0x4f, - 0x1c, 0x00, 0xb0, 0x50, 0x1c, 0x00, 0xb1, 0x50, 0x1c, 0x00, 0xb9, 0x50, - 0x1c, 0x00, 0xbd, 0x50, 0x1c, 0x00, 0x78, 0x52, 0x1c, 0x00, 0x7c, 0x52, - 0x1c, 0x00, 0x7e, 0x52, 0x1c, 0x00, 0x7f, 0x52, 0x1c, 0x00, 0x30, 0x53, - 0x1c, 0x00, 0x31, 0x53, 0x1c, 0x00, 0x39, 0x53, 0x1c, 0x00, 0x3d, 0x53, - 0x1c, 0x00, 0xb0, 0x54, 0x1c, 0x00, 0xb1, 0x54, 0x1c, 0x00, 0xb7, 0x54, - 0x1c, 0x00, 0xb9, 0x54, 0x1c, 0x00, 0xbd, 0x54, 0x1c, 0x00, 0x78, 0x55, - 0x1c, 0x00, 0x7c, 0x55, 0x1c, 0x00, 0x7e, 0x55, 0x1c, 0x00, 0x7f, 0x55, - 0x1c, 0x00, 0xcb, 0x57, 0x1c, 0x00, 0xeb, 0x57, 0x1c, 0x00, 0xf0, 0x57, - 0x1c, 0x00, 0xf1, 0x57, 0x1c, 0x00, 0xf7, 0x57, 0x1c, 0x00, 0xf9, 0x57, - 0x1c, 0x00, 0xfd, 0x57, 0x1c, 0x00, 0xb7, 0x58, 0x1c, 0x00, 0xb8, 0x58, - 0x1c, 0x00, 0xbc, 0x58, 0x1c, 0x00, 0xbe, 0x58, 0x1c, 0x00, 0xbf, 0x58, - 0x1c, 0x00, 0x37, 0x59, 0x1c, 0x00, 0x38, 0x59, 0x1c, 0x00, 0x3c, 0x59, - 0x1c, 0x00, 0x3e, 0x59, 0x1c, 0x00, 0x3f, 0x59, 0x1c, 0x00, 0xb8, 0x59, - 0x1c, 0x00, 0xbc, 0x59, 0x1c, 0x00, 0xbe, 0x59, 0x1c, 0x00, 0xbf, 0x59, - 0x1c, 0x00, 0x30, 0x5b, 0x1c, 0x00, 0x31, 0x5b, 0x1c, 0x00, 0x39, 0x5b, - 0x1c, 0x00, 0x3d, 0x5b, 0x1c, 0x00, 0xb7, 0x5b, 0x1c, 0x00, 0xb8, 0x5b, - 0x1c, 0x00, 0xbc, 0x5b, 0x1c, 0x00, 0xbe, 0x5b, 0x1c, 0x00, 0xbf, 0x5b, - 0x1c, 0x00, 0x78, 0x5c, 0x1c, 0x00, 0x7c, 0x5c, 0x1c, 0x00, 0x7e, 0x5c, - 0x1c, 0x00, 0x7f, 0x5c, 0x1c, 0x00, 0xb8, 0x5c, 0x1c, 0x00, 0xbc, 0x5c, - 0x1c, 0x00, 0xbe, 0x5c, 0x1c, 0x00, 0xbf, 0x5c, 0x1c, 0x00, 0x30, 0x5d, - 0x1c, 0x00, 0x31, 0x5d, 0x1c, 0x00, 0x39, 0x5d, 0x1c, 0x00, 0x3d, 0x5d, - 0x1c, 0x00, 0xb8, 0x5e, 0x1c, 0x00, 0xbc, 0x5e, 0x1c, 0x00, 0xbe, 0x5e, - 0x1c, 0x00, 0xbf, 0x5e, 0x1c, 0x00, 0x2b, 0x5f, 0x1c, 0x00, 0xab, 0x5f, - 0x1c, 0x00, 0xf0, 0x5f, 0x1c, 0x00, 0xf1, 0x5f, 0x1c, 0x00, 0xf9, 0x5f, - 0x1c, 0x00, 0xfd, 0x5f, 0x1c, 0x00, 0xcb, 0x64, 0x1c, 0x00, 0xeb, 0x64, - 0x1c, 0x00, 0x0b, 0x66, 0x1c, 0x00, 0xcb, 0x66, 0x1c, 0x00, 0xeb, 0x66, - 0x1c, 0x00, 0x71, 0x80, 0x1c, 0x00, 0x79, 0x80, 0x1c, 0x00, 0xf1, 0x80, - 0x1c, 0x00, 0xf9, 0x80, 0x1c, 0x00, 0x77, 0x81, 0x1c, 0x00, 0xf7, 0x81, - 0x1c, 0x00, 0xf1, 0x82, 0x1c, 0x00, 0xf9, 0x82, 0x1c, 0x00, 0xf7, 0x83, - 0x1c, 0x00, 0x71, 0x84, 0x1c, 0x00, 0x79, 0x84, 0x1c, 0x00, 0x78, 0x85, - 0x1c, 0x00, 0x7c, 0x85, 0x1c, 0x00, 0x7e, 0x85, 0x1c, 0x00, 0x7f, 0x85, - 0x1c, 0x00, 0xf7, 0x85, 0x1c, 0x00, 0x71, 0x86, 0x1c, 0x00, 0x79, 0x86, - 0x1c, 0x00, 0x70, 0x87, 0x1c, 0x00, 0x71, 0x87, 0x1c, 0x00, 0x79, 0x87, - 0x1c, 0x00, 0x7d, 0x87, 0x1c, 0x00, 0x0b, 0x89, 0x1c, 0x00, 0xbb, 0x89, - 0x1c, 0x00, 0x0b, 0x8b, 0x1c, 0x00, 0xf1, 0x8b, 0x1c, 0x00, 0xf7, 0x8b, - 0x1c, 0x00, 0xf9, 0x8b, 0x1c, 0x00, 0x0b, 0x8d, 0x1c, 0x00, 0xbb, 0x8d, - 0x1c, 0x00, 0x3b, 0x94, 0x1c, 0x00, 0x3b, 0x96, 0x1c, 0x00, 0x0b, 0xa7, - 0x1c, 0x00, 0x78, 0xa7, 0x1c, 0x00, 0x7c, 0xa7, 0x1c, 0x00, 0x7e, 0xa7, - 0x1c, 0x00, 0x7f, 0xa7, 0x1c, 0x00, 0xf8, 0xaa, 0x1c, 0x00, 0xfc, 0xaa, - 0x1c, 0x00, 0xfe, 0xaa, 0x1c, 0x00, 0xff, 0xaa, 0x1c, 0x00, 0xbb, 0xb2, - 0x1c, 0x00, 0x71, 0xb7, 0x1c, 0x00, 0x77, 0xb7, 0x1c, 0x00, 0x79, 0xb7, - 0x1c, 0x00, 0x0b, 0xbb, 0x1c, 0x00, 0xf1, 0xbb, 0x1c, 0x00, 0xf7, 0xbb, - 0x1c, 0x00, 0xf9, 0xbb, 0x1c, 0x00, 0xf0, 0xbc, 0x1c, 0x00, 0xf1, 0xbc, - 0x1c, 0x00, 0xf7, 0xbc, 0x1c, 0x00, 0xf9, 0xbc, 0x1c, 0x00, 0xfd, 0xbc, - 0x1c, 0x00, 0xbb, 0xbe, 0x1c, 0x00, 0xf1, 0xbf, 0x1c, 0x00, 0xf7, 0xbf, - 0x1c, 0x00, 0xf9, 0xbf, 0x1c, 0x00, 0x30, 0xc0, 0x1c, 0x00, 0x30, 0xc1, - 0x1c, 0x00, 0x30, 0xc2, 0x1c, 0x00, 0x78, 0xc2, 0x1c, 0x00, 0x7c, 0xc2, - 0x1c, 0x00, 0x7e, 0xc2, 0x1c, 0x00, 0x7f, 0xc2, 0x1c, 0x00, 0xf0, 0xc2, - 0x1c, 0x00, 0xf1, 0xc2, 0x1c, 0x00, 0xf9, 0xc2, 0x1c, 0x00, 0xfd, 0xc2, - 0x1c, 0x00, 0xf6, 0xc3, 0x1c, 0x00, 0xf7, 0xc3, 0x1c, 0x00, 0xf8, 0xc3, - 0x1c, 0x00, 0xfc, 0xc3, 0x1c, 0x00, 0xfe, 0xc3, 0x1c, 0x00, 0xff, 0xc3, - 0x1c, 0x00, 0xf6, 0xc5, 0x1c, 0x00, 0xf7, 0xc5, 0x1c, 0x00, 0xf8, 0xc5, - 0x1c, 0x00, 0xfc, 0xc5, 0x1c, 0x00, 0xfe, 0xc5, 0x1c, 0x00, 0xff, 0xc5, - 0x1c, 0x00, 0xb0, 0xc6, 0x1c, 0x00, 0xf0, 0xc7, 0x1c, 0x00, 0xf1, 0xc7, - 0x1c, 0x00, 0xf9, 0xc7, 0x1c, 0x00, 0xfd, 0xc7, 0x1c, 0x00, 0xb0, 0xc8, - 0x1c, 0x00, 0x2b, 0xc9, 0x1c, 0x00, 0x30, 0xcb, 0x1c, 0x00, 0xd1, 0xcc, - 0x1c, 0x00, 0xd6, 0xcc, 0x1c, 0x00, 0xd7, 0xcc, 0x1c, 0x00, 0xd8, 0xcc, - 0x1c, 0x00, 0xdc, 0xcc, 0x1c, 0x00, 0xde, 0xcc, 0x1c, 0x00, 0xdf, 0xcc, - 0x1c, 0x00, 0x18, 0xcf, 0x1c, 0x00, 0x1c, 0xcf, 0x1c, 0x00, 0x1e, 0xcf, - 0x1c, 0x00, 0x1f, 0xcf, 0x1c, 0x00, 0x91, 0xcf, 0x1c, 0x00, 0x96, 0xcf, - 0x1c, 0x00, 0x97, 0xcf, 0x1c, 0x00, 0x98, 0xcf, 0x1c, 0x00, 0x9c, 0xcf, - 0x1c, 0x00, 0x9e, 0xcf, 0x1c, 0x00, 0x9f, 0xcf, 0x1c, 0x00, 0xd1, 0xcf, - 0x1c, 0x00, 0xd6, 0xcf, 0x1c, 0x00, 0xd7, 0xcf, 0x1c, 0x00, 0xd8, 0xcf, - 0x1c, 0x00, 0xdc, 0xcf, 0x1c, 0x00, 0xde, 0xcf, 0x1c, 0x00, 0xdf, 0xcf, - 0x1c, 0x00, 0x48, 0xd8, 0x1c, 0x00, 0x4b, 0xd8, 0x1c, 0x00, 0xf8, 0xd9, - 0x1c, 0x00, 0xfc, 0xd9, 0x1c, 0x00, 0xfe, 0xd9, 0x1c, 0x00, 0xff, 0xd9, - 0x1c, 0x00, 0xf8, 0xdd, 0x1c, 0x00, 0xfc, 0xdd, 0x1c, 0x00, 0xfe, 0xdd, - 0x1c, 0x00, 0xff, 0xdd, 0x1c, 0x00, 0xb0, 0xe0, 0x1c, 0x00, 0x30, 0xe2, - 0x1c, 0x00, 0xf6, 0xe2, 0x1c, 0x00, 0xf7, 0xe2, 0x1c, 0x00, 0xf8, 0xe2, - 0x1c, 0x00, 0xfc, 0xe2, 0x1c, 0x00, 0xfe, 0xe2, 0x1c, 0x00, 0xff, 0xe2, - 0x1c, 0x00, 0x30, 0xe5, 0x1c, 0x00, 0xf0, 0xe5, 0x1c, 0x00, 0xc6, 0xe7, - 0x1c, 0x00, 0xe6, 0xe7, 0x1c, 0x00, 0xf6, 0xe7, 0x1c, 0x00, 0xf7, 0xe7, - 0x1c, 0x00, 0xf8, 0xe7, 0x1c, 0x00, 0xfc, 0xe7, 0x1c, 0x00, 0xfe, 0xe7, - 0x1c, 0x00, 0xff, 0xe7, 0x1c, 0x00, 0xb0, 0xe8, 0x1c, 0x00, 0xb0, 0xea, - 0x1c, 0x00, 0x30, 0xeb, 0x1c, 0x00, 0x30, 0xec, 0x1c, 0x00, 0x30, 0xee, - 0x1c, 0x00, 0xb0, 0xf0, 0x1c, 0x00, 0xb0, 0xf1, 0x1c, 0x00, 0x30, 0xf3, - 0x1c, 0x00, 0x90, 0xf3, 0x1c, 0x00, 0xd0, 0xf3, 0x1c, 0x00, 0xb0, 0xf4, - 0x1c, 0x00, 0xb0, 0xf6, 0x1c, 0x00, 0xb0, 0xf7, 0x1c, 0x00, 0x30, 0xf9, - 0x1c, 0x00, 0xf7, 0xf9, 0x1c, 0x00, 0xf8, 0xf9, 0x1c, 0x00, 0xfc, 0xf9, - 0x1c, 0x00, 0xfe, 0xf9, 0x1c, 0x00, 0xff, 0xf9, 0x1c, 0x00, 0x30, 0xfb, - 0x1c, 0x00, 0x30, 0xfd, 0x1c, 0x00, 0xf0, 0xfd, 0x1c, 0x00, 0x26, 0xff, - 0x1c, 0x00, 0x27, 0xff, 0x1c, 0x00, 0x29, 0xff, 0x1c, 0x00, 0x2a, 0xff, - 0x1c, 0x00, 0x88, 0xff, 0x1c, 0x00, 0x8b, 0xff, 0x1c, 0x00, 0xc6, 0xff, - 0x1c, 0x00, 0xe6, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, - 0x1c, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1c, 0x00, 0xfe, 0xff, - 0x1c, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xf3, 0x00, 0x1d, 0x00, 0xfb, 0x00, - 0x1d, 0x00, 0x58, 0x01, 0x1d, 0x00, 0xf4, 0x05, 0x1d, 0x00, 0xf5, 0x05, - 0x1d, 0x00, 0xf8, 0x05, 0x1d, 0x00, 0xfc, 0x05, 0x1d, 0x00, 0xfe, 0x05, - 0x1d, 0x00, 0xff, 0x05, 0x1d, 0x00, 0xf3, 0x08, 0x1d, 0x00, 0xfb, 0x08, - 0x1d, 0x00, 0xf8, 0x0a, 0x1d, 0x00, 0xfc, 0x0a, 0x1d, 0x00, 0xfe, 0x0a, - 0x1d, 0x00, 0xff, 0x0a, 0x1d, 0x00, 0xf4, 0x0b, 0x1d, 0x00, 0xf5, 0x0b, - 0x1d, 0x00, 0xf8, 0x0b, 0x1d, 0x00, 0xfc, 0x0b, 0x1d, 0x00, 0xfe, 0x0b, - 0x1d, 0x00, 0xff, 0x0b, 0x1d, 0x00, 0xf4, 0x0c, 0x1d, 0x00, 0xf5, 0x0c, - 0x1d, 0x00, 0xf8, 0x0c, 0x1d, 0x00, 0xfc, 0x0c, 0x1d, 0x00, 0xfe, 0x0c, - 0x1d, 0x00, 0xff, 0x0c, 0x1d, 0x00, 0xf3, 0x0f, 0x1d, 0x00, 0xfb, 0x0f, - 0x1d, 0x00, 0xf4, 0x11, 0x1d, 0x00, 0xf5, 0x11, 0x1d, 0x00, 0xf8, 0x11, - 0x1d, 0x00, 0xfc, 0x11, 0x1d, 0x00, 0xfe, 0x11, 0x1d, 0x00, 0xff, 0x11, - 0x1d, 0x00, 0xc8, 0x1c, 0x1d, 0x00, 0xcb, 0x1c, 0x1d, 0x00, 0xe8, 0x1c, - 0x1d, 0x00, 0xeb, 0x1c, 0x1d, 0x00, 0xf8, 0x1c, 0x1d, 0x00, 0xfc, 0x1c, - 0x1d, 0x00, 0xfe, 0x1c, 0x1d, 0x00, 0xff, 0x1c, 0x1d, 0x00, 0xf4, 0x1f, - 0x1d, 0x00, 0xf5, 0x1f, 0x1d, 0x00, 0xf8, 0x1f, 0x1d, 0x00, 0xfc, 0x1f, - 0x1d, 0x00, 0xfe, 0x1f, 0x1d, 0x00, 0xff, 0x1f, 0x1d, 0x00, 0xf8, 0x29, - 0x1d, 0x00, 0xfc, 0x29, 0x1d, 0x00, 0xfe, 0x29, 0x1d, 0x00, 0xff, 0x29, - 0x1d, 0x00, 0x30, 0x33, 0x1d, 0x00, 0x30, 0x39, 0x1d, 0x00, 0x30, 0x3d, - 0x1d, 0x00, 0x88, 0x3f, 0x1d, 0x00, 0x8b, 0x3f, 0x1d, 0x00, 0xf0, 0x3f, - 0x1d, 0x00, 0xf1, 0x3f, 0x1d, 0x00, 0xf9, 0x3f, 0x1d, 0x00, 0xfd, 0x3f, - 0x1d, 0x00, 0xb0, 0x40, 0x1d, 0x00, 0x30, 0x42, 0x1d, 0x00, 0xf0, 0x42, - 0x1d, 0x00, 0xf1, 0x42, 0x1d, 0x00, 0xf9, 0x42, 0x1d, 0x00, 0xfd, 0x42, - 0x1d, 0x00, 0xf6, 0x43, 0x1d, 0x00, 0xf7, 0x43, 0x1d, 0x00, 0xf8, 0x43, - 0x1d, 0x00, 0xfc, 0x43, 0x1d, 0x00, 0xfe, 0x43, 0x1d, 0x00, 0xff, 0x43, - 0x1d, 0x00, 0xf6, 0x45, 0x1d, 0x00, 0xf7, 0x45, 0x1d, 0x00, 0xf8, 0x45, - 0x1d, 0x00, 0xfc, 0x45, 0x1d, 0x00, 0xfe, 0x45, 0x1d, 0x00, 0xff, 0x45, - 0x1d, 0x00, 0xf0, 0x47, 0x1d, 0x00, 0xf1, 0x47, 0x1d, 0x00, 0xf9, 0x47, - 0x1d, 0x00, 0xfd, 0x47, 0x1d, 0x00, 0x51, 0x49, 0x1d, 0x00, 0x56, 0x49, - 0x1d, 0x00, 0x57, 0x49, 0x1d, 0x00, 0x58, 0x49, 0x1d, 0x00, 0x5c, 0x49, - 0x1d, 0x00, 0x5e, 0x49, 0x1d, 0x00, 0x5f, 0x49, 0x1d, 0x00, 0xf0, 0x49, - 0x1d, 0x00, 0xf1, 0x49, 0x1d, 0x00, 0xf9, 0x49, 0x1d, 0x00, 0xfd, 0x49, - 0x1d, 0x00, 0xc6, 0x4b, 0x1d, 0x00, 0xe6, 0x4b, 0x1d, 0x00, 0xf0, 0x4b, - 0x1d, 0x00, 0xf0, 0x4c, 0x1d, 0x00, 0xf1, 0x4c, 0x1d, 0x00, 0xf9, 0x4c, - 0x1d, 0x00, 0xfd, 0x4c, 0x1d, 0x00, 0xf0, 0x4e, 0x1d, 0x00, 0xf1, 0x4e, - 0x1d, 0x00, 0xf9, 0x4e, 0x1d, 0x00, 0xfd, 0x4e, 0x1d, 0x00, 0xf0, 0x4f, - 0x1d, 0x00, 0xf1, 0x4f, 0x1d, 0x00, 0xf9, 0x4f, 0x1d, 0x00, 0xfd, 0x4f, - 0x1d, 0x00, 0xf0, 0x53, 0x1d, 0x00, 0xf1, 0x53, 0x1d, 0x00, 0xf9, 0x53, - 0x1d, 0x00, 0xfd, 0x53, 0x1d, 0x00, 0x51, 0x55, 0x1d, 0x00, 0x56, 0x55, - 0x1d, 0x00, 0x57, 0x55, 0x1d, 0x00, 0x59, 0x55, 0x1d, 0x00, 0x5d, 0x55, - 0x1d, 0x00, 0xf7, 0x55, 0x1d, 0x00, 0xf8, 0x55, 0x1d, 0x00, 0xfc, 0x55, - 0x1d, 0x00, 0xfe, 0x55, 0x1d, 0x00, 0xff, 0x55, 0x1d, 0x00, 0x30, 0x5f, - 0x1d, 0x00, 0xf4, 0x61, 0x1d, 0x00, 0xf5, 0x61, 0x1d, 0x00, 0xf8, 0x61, - 0x1d, 0x00, 0xfc, 0x61, 0x1d, 0x00, 0xfe, 0x61, 0x1d, 0x00, 0xff, 0x61, - 0x1d, 0x00, 0xf3, 0x69, 0x1d, 0x00, 0xfb, 0x69, 0x1d, 0x00, 0xf8, 0x6a, - 0x1d, 0x00, 0xfc, 0x6a, 0x1d, 0x00, 0xfe, 0x6a, 0x1d, 0x00, 0xff, 0x6a, - 0x1d, 0x00, 0xf3, 0x6c, 0x1d, 0x00, 0xfb, 0x6c, 0x1d, 0x00, 0xf4, 0x6e, - 0x1d, 0x00, 0xf5, 0x6e, 0x1d, 0x00, 0xf8, 0x6e, 0x1d, 0x00, 0xfc, 0x6e, - 0x1d, 0x00, 0xfe, 0x6e, 0x1d, 0x00, 0xff, 0x6e, 0x1d, 0x00, 0xf4, 0x6f, - 0x1d, 0x00, 0xf5, 0x6f, 0x1d, 0x00, 0xf8, 0x6f, 0x1d, 0x00, 0xfc, 0x6f, - 0x1d, 0x00, 0xfe, 0x6f, 0x1d, 0x00, 0xff, 0x6f, 0x1d, 0x00, 0xcb, 0x72, - 0x1d, 0x00, 0xeb, 0x72, 0x1d, 0x00, 0xf8, 0x72, 0x1d, 0x00, 0xfc, 0x72, - 0x1d, 0x00, 0xfe, 0x72, 0x1d, 0x00, 0xff, 0x72, 0x1d, 0x00, 0xf4, 0x74, - 0x1d, 0x00, 0xf5, 0x74, 0x1d, 0x00, 0xf8, 0x74, 0x1d, 0x00, 0xfc, 0x74, - 0x1d, 0x00, 0xfe, 0x74, 0x1d, 0x00, 0xff, 0x74, 0x1d, 0x00, 0xf3, 0x77, - 0x1d, 0x00, 0xfb, 0x77, 0x1d, 0x00, 0xf1, 0x81, 0x1d, 0x00, 0xf9, 0x81, - 0x1d, 0x00, 0xf7, 0x83, 0x1d, 0x00, 0xf7, 0x85, 0x1d, 0x00, 0x37, 0x86, - 0x1d, 0x00, 0x38, 0x86, 0x1d, 0x00, 0x3c, 0x86, 0x1d, 0x00, 0x3e, 0x86, - 0x1d, 0x00, 0x3f, 0x86, 0x1d, 0x00, 0x37, 0x87, 0x1d, 0x00, 0xb1, 0x87, - 0x1d, 0x00, 0xb9, 0x87, 0x1d, 0x00, 0xf1, 0x8b, 0x1d, 0x00, 0xf7, 0x8b, - 0x1d, 0x00, 0xf9, 0x8b, 0x1d, 0x00, 0x38, 0x9e, 0x1d, 0x00, 0x3c, 0x9e, - 0x1d, 0x00, 0x3e, 0x9e, 0x1d, 0x00, 0x3f, 0x9e, 0x1d, 0x00, 0x38, 0xa7, - 0x1d, 0x00, 0x3c, 0xa7, 0x1d, 0x00, 0x3e, 0xa7, 0x1d, 0x00, 0x3f, 0xa7, - 0x1d, 0x00, 0xb8, 0xa7, 0x1d, 0x00, 0xbc, 0xa7, 0x1d, 0x00, 0xbe, 0xa7, - 0x1d, 0x00, 0xbf, 0xa7, 0x1d, 0x00, 0xcb, 0xaf, 0x1d, 0x00, 0xeb, 0xaf, - 0x1d, 0x00, 0xf8, 0xaf, 0x1d, 0x00, 0xfc, 0xaf, 0x1d, 0x00, 0xfe, 0xaf, - 0x1d, 0x00, 0xff, 0xaf, 0x1d, 0x00, 0x8b, 0xb3, 0x1d, 0x00, 0xcb, 0xb3, - 0x1d, 0x00, 0xeb, 0xb3, 0x1d, 0x00, 0xf0, 0xb3, 0x1d, 0x00, 0xf1, 0xb3, - 0x1d, 0x00, 0xf7, 0xb3, 0x1d, 0x00, 0xf9, 0xb3, 0x1d, 0x00, 0xfd, 0xb3, - 0x1d, 0x00, 0xcb, 0xbb, 0x1d, 0x00, 0xeb, 0xbb, 0x1d, 0x00, 0xf0, 0xbb, - 0x1d, 0x00, 0xf1, 0xbb, 0x1d, 0x00, 0xf7, 0xbb, 0x1d, 0x00, 0xf9, 0xbb, - 0x1d, 0x00, 0xfd, 0xbb, 0x1d, 0x00, 0x30, 0xbf, 0x1d, 0x00, 0x31, 0xbf, - 0x1d, 0x00, 0x37, 0xbf, 0x1d, 0x00, 0x39, 0xbf, 0x1d, 0x00, 0x3d, 0xbf, - 0x1d, 0x00, 0x31, 0xc5, 0x1d, 0x00, 0x39, 0xc5, 0x1d, 0x00, 0x4b, 0xc5, - 0x1d, 0x00, 0xf1, 0xe3, 0x1d, 0x00, 0xf9, 0xe3, 0x1d, 0x00, 0xf1, 0xe9, - 0x1d, 0x00, 0xf9, 0xe9, 0x1d, 0x00, 0xf1, 0xed, 0x1d, 0x00, 0xf9, 0xed, - 0x1d, 0x00, 0x31, 0xff, 0x1d, 0x00, 0x37, 0xff, 0x1d, 0x00, 0x39, 0xff, - 0x1d, 0x00, 0x48, 0x00, 0x1e, 0x00, 0x4b, 0x00, 0x1e, 0x00, 0x78, 0x00, - 0x1e, 0x00, 0x7c, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x7f, 0x00, - 0x1e, 0x00, 0xb8, 0x00, 0x1e, 0x00, 0xbc, 0x00, 0x1e, 0x00, 0xbe, 0x00, - 0x1e, 0x00, 0xbf, 0x00, 0x1e, 0x00, 0x38, 0x01, 0x1e, 0x00, 0x3c, 0x01, - 0x1e, 0x00, 0x3e, 0x01, 0x1e, 0x00, 0x3f, 0x01, 0x1e, 0x00, 0x28, 0x02, - 0x1e, 0x00, 0x2b, 0x02, 0x1e, 0x00, 0xf8, 0x05, 0x1e, 0x00, 0xfc, 0x05, - 0x1e, 0x00, 0xfe, 0x05, 0x1e, 0x00, 0xff, 0x05, 0x1e, 0x00, 0x28, 0x07, - 0x1e, 0x00, 0x2b, 0x07, 0x1e, 0x00, 0xa8, 0x07, 0x1e, 0x00, 0xab, 0x07, - 0x1e, 0x00, 0xb8, 0x08, 0x1e, 0x00, 0xbc, 0x08, 0x1e, 0x00, 0xbe, 0x08, - 0x1e, 0x00, 0xbf, 0x08, 0x1e, 0x00, 0x78, 0x0a, 0x1e, 0x00, 0x7c, 0x0a, - 0x1e, 0x00, 0x7e, 0x0a, 0x1e, 0x00, 0x7f, 0x0a, 0x1e, 0x00, 0x88, 0x0b, - 0x1e, 0x00, 0x8b, 0x0b, 0x1e, 0x00, 0xd8, 0x0c, 0x1e, 0x00, 0xdc, 0x0c, - 0x1e, 0x00, 0xde, 0x0c, 0x1e, 0x00, 0xdf, 0x0c, 0x1e, 0x00, 0x2b, 0x0e, - 0x1e, 0x00, 0x28, 0x0f, 0x1e, 0x00, 0x2b, 0x0f, 0x1e, 0x00, 0x28, 0x11, - 0x1e, 0x00, 0x2b, 0x11, 0x1e, 0x00, 0xf8, 0x13, 0x1e, 0x00, 0xfc, 0x13, - 0x1e, 0x00, 0xfe, 0x13, 0x1e, 0x00, 0xff, 0x13, 0x1e, 0x00, 0x58, 0x15, - 0x1e, 0x00, 0x5c, 0x15, 0x1e, 0x00, 0x5e, 0x15, 0x1e, 0x00, 0x5f, 0x15, - 0x1e, 0x00, 0x08, 0x17, 0x1e, 0x00, 0x0b, 0x17, 0x1e, 0x00, 0x28, 0x19, - 0x1e, 0x00, 0x2b, 0x19, 0x1e, 0x00, 0x98, 0x1b, 0x1e, 0x00, 0x9c, 0x1b, - 0x1e, 0x00, 0x9e, 0x1b, 0x1e, 0x00, 0x9f, 0x1b, 0x1e, 0x00, 0xd8, 0x1b, - 0x1e, 0x00, 0xdc, 0x1b, 0x1e, 0x00, 0xde, 0x1b, 0x1e, 0x00, 0xdf, 0x1b, - 0x1e, 0x00, 0x28, 0x1d, 0x1e, 0x00, 0x2b, 0x1d, 0x1e, 0x00, 0xb8, 0x21, - 0x1e, 0x00, 0xbc, 0x21, 0x1e, 0x00, 0xbe, 0x21, 0x1e, 0x00, 0xbf, 0x21, - 0x1e, 0x00, 0x28, 0x22, 0x1e, 0x00, 0x2b, 0x22, 0x1e, 0x00, 0xb8, 0x24, - 0x1e, 0x00, 0xbc, 0x24, 0x1e, 0x00, 0xbe, 0x24, 0x1e, 0x00, 0xbf, 0x24, - 0x1e, 0x00, 0x38, 0x25, 0x1e, 0x00, 0x3c, 0x25, 0x1e, 0x00, 0x3e, 0x25, - 0x1e, 0x00, 0x3f, 0x25, 0x1e, 0x00, 0xb8, 0x26, 0x1e, 0x00, 0xbc, 0x26, - 0x1e, 0x00, 0xbe, 0x26, 0x1e, 0x00, 0xbf, 0x26, 0x1e, 0x00, 0x38, 0x27, - 0x1e, 0x00, 0x3c, 0x27, 0x1e, 0x00, 0x3e, 0x27, 0x1e, 0x00, 0x3f, 0x27, - 0x1e, 0x00, 0xb8, 0x27, 0x1e, 0x00, 0xbc, 0x27, 0x1e, 0x00, 0xbe, 0x27, - 0x1e, 0x00, 0xbf, 0x27, 0x1e, 0x00, 0xf8, 0x28, 0x1e, 0x00, 0xfc, 0x28, - 0x1e, 0x00, 0xfe, 0x28, 0x1e, 0x00, 0xff, 0x28, 0x1e, 0x00, 0x58, 0x29, - 0x1e, 0x00, 0x5c, 0x29, 0x1e, 0x00, 0x5e, 0x29, 0x1e, 0x00, 0x5f, 0x29, - 0x1e, 0x00, 0x88, 0x2b, 0x1e, 0x00, 0x8b, 0x2b, 0x1e, 0x00, 0xc8, 0x2b, - 0x1e, 0x00, 0xcb, 0x2b, 0x1e, 0x00, 0xe8, 0x2b, 0x1e, 0x00, 0xeb, 0x2b, - 0x1e, 0x00, 0x58, 0x2d, 0x1e, 0x00, 0x5c, 0x2d, 0x1e, 0x00, 0x5e, 0x2d, - 0x1e, 0x00, 0x5f, 0x2d, 0x1e, 0x00, 0xc8, 0x2e, 0x1e, 0x00, 0xcb, 0x2e, - 0x1e, 0x00, 0xe8, 0x2e, 0x1e, 0x00, 0xeb, 0x2e, 0x1e, 0x00, 0xf8, 0x2e, - 0x1e, 0x00, 0xfc, 0x2e, 0x1e, 0x00, 0xfe, 0x2e, 0x1e, 0x00, 0xff, 0x2e, - 0x1e, 0x00, 0x28, 0x2f, 0x1e, 0x00, 0x2b, 0x2f, 0x1e, 0x00, 0x30, 0x30, - 0x1e, 0x00, 0x31, 0x30, 0x1e, 0x00, 0x39, 0x30, 0x1e, 0x00, 0x3d, 0x30, - 0x1e, 0x00, 0xe6, 0x30, 0x1e, 0x00, 0xe7, 0x30, 0x1e, 0x00, 0xe8, 0x30, - 0x1e, 0x00, 0xeb, 0x30, 0x1e, 0x00, 0xf6, 0x30, 0x1e, 0x00, 0xf7, 0x30, - 0x1e, 0x00, 0xf8, 0x30, 0x1e, 0x00, 0xfc, 0x30, 0x1e, 0x00, 0xfe, 0x30, - 0x1e, 0x00, 0xff, 0x30, 0x1e, 0x00, 0xb0, 0x31, 0x1e, 0x00, 0xb1, 0x31, - 0x1e, 0x00, 0xb9, 0x31, 0x1e, 0x00, 0xbd, 0x31, 0x1e, 0x00, 0x36, 0x33, - 0x1e, 0x00, 0x37, 0x33, 0x1e, 0x00, 0x38, 0x33, 0x1e, 0x00, 0x3c, 0x33, - 0x1e, 0x00, 0x3e, 0x33, 0x1e, 0x00, 0x3f, 0x33, 0x1e, 0x00, 0xb8, 0x33, - 0x1e, 0x00, 0xbc, 0x33, 0x1e, 0x00, 0xbe, 0x33, 0x1e, 0x00, 0xbf, 0x33, - 0x1e, 0x00, 0xd8, 0x33, 0x1e, 0x00, 0xdc, 0x33, 0x1e, 0x00, 0xde, 0x33, - 0x1e, 0x00, 0xdf, 0x33, 0x1e, 0x00, 0xe9, 0x33, 0x1e, 0x00, 0xea, 0x33, - 0x1e, 0x00, 0xf0, 0x33, 0x1e, 0x00, 0xf1, 0x33, 0x1e, 0x00, 0xf9, 0x33, - 0x1e, 0x00, 0xfd, 0x33, 0x1e, 0x00, 0x30, 0x34, 0x1e, 0x00, 0x31, 0x34, - 0x1e, 0x00, 0x39, 0x34, 0x1e, 0x00, 0x3d, 0x34, 0x1e, 0x00, 0xe9, 0x34, - 0x1e, 0x00, 0xea, 0x34, 0x1e, 0x00, 0xf0, 0x34, 0x1e, 0x00, 0xf1, 0x34, - 0x1e, 0x00, 0xf9, 0x34, 0x1e, 0x00, 0xfd, 0x34, 0x1e, 0x00, 0x68, 0x35, - 0x1e, 0x00, 0x6b, 0x35, 0x1e, 0x00, 0x78, 0x35, 0x1e, 0x00, 0x7c, 0x35, - 0x1e, 0x00, 0x7e, 0x35, 0x1e, 0x00, 0x7f, 0x35, 0x1e, 0x00, 0xf0, 0x36, - 0x1e, 0x00, 0xf1, 0x36, 0x1e, 0x00, 0xf9, 0x36, 0x1e, 0x00, 0xfd, 0x36, - 0x1e, 0x00, 0x88, 0x37, 0x1e, 0x00, 0x8b, 0x37, 0x1e, 0x00, 0xc9, 0x37, - 0x1e, 0x00, 0xca, 0x37, 0x1e, 0x00, 0xe9, 0x37, 0x1e, 0x00, 0xea, 0x37, - 0x1e, 0x00, 0xf0, 0x37, 0x1e, 0x00, 0xf1, 0x37, 0x1e, 0x00, 0xf9, 0x37, - 0x1e, 0x00, 0xfd, 0x37, 0x1e, 0x00, 0x47, 0x38, 0x1e, 0x00, 0x4b, 0x38, - 0x1e, 0x00, 0xb0, 0x38, 0x1e, 0x00, 0xb1, 0x38, 0x1e, 0x00, 0xb9, 0x38, - 0x1e, 0x00, 0xbd, 0x38, 0x1e, 0x00, 0x30, 0x39, 0x1e, 0x00, 0x31, 0x39, - 0x1e, 0x00, 0x39, 0x39, 0x1e, 0x00, 0x3d, 0x39, 0x1e, 0x00, 0xf7, 0x39, - 0x1e, 0x00, 0xf8, 0x39, 0x1e, 0x00, 0xfc, 0x39, 0x1e, 0x00, 0xfe, 0x39, - 0x1e, 0x00, 0xff, 0x39, 0x1e, 0x00, 0xb7, 0x3a, 0x1e, 0x00, 0xb8, 0x3a, - 0x1e, 0x00, 0xbc, 0x3a, 0x1e, 0x00, 0xbe, 0x3a, 0x1e, 0x00, 0xbf, 0x3a, - 0x1e, 0x00, 0x36, 0x3b, 0x1e, 0x00, 0x37, 0x3b, 0x1e, 0x00, 0x38, 0x3b, - 0x1e, 0x00, 0x3c, 0x3b, 0x1e, 0x00, 0x3e, 0x3b, 0x1e, 0x00, 0x3f, 0x3b, - 0x1e, 0x00, 0xb0, 0x3b, 0x1e, 0x00, 0xb1, 0x3b, 0x1e, 0x00, 0xb9, 0x3b, - 0x1e, 0x00, 0xbd, 0x3b, 0x1e, 0x00, 0xe9, 0x3b, 0x1e, 0x00, 0xea, 0x3b, - 0x1e, 0x00, 0xf0, 0x3b, 0x1e, 0x00, 0xf1, 0x3b, 0x1e, 0x00, 0xf9, 0x3b, - 0x1e, 0x00, 0xfd, 0x3b, 0x1e, 0x00, 0x37, 0x3d, 0x1e, 0x00, 0x38, 0x3d, - 0x1e, 0x00, 0x3c, 0x3d, 0x1e, 0x00, 0x3e, 0x3d, 0x1e, 0x00, 0x3f, 0x3d, - 0x1e, 0x00, 0xf0, 0x3d, 0x1e, 0x00, 0xf1, 0x3d, 0x1e, 0x00, 0xf9, 0x3d, - 0x1e, 0x00, 0xfd, 0x3d, 0x1e, 0x00, 0x30, 0x3f, 0x1e, 0x00, 0x31, 0x3f, - 0x1e, 0x00, 0x39, 0x3f, 0x1e, 0x00, 0x3d, 0x3f, 0x1e, 0x00, 0x90, 0x3f, - 0x1e, 0x00, 0x91, 0x3f, 0x1e, 0x00, 0x96, 0x3f, 0x1e, 0x00, 0x97, 0x3f, - 0x1e, 0x00, 0x99, 0x3f, 0x1e, 0x00, 0x9d, 0x3f, 0x1e, 0x00, 0xd0, 0x3f, - 0x1e, 0x00, 0xd1, 0x3f, 0x1e, 0x00, 0xd6, 0x3f, 0x1e, 0x00, 0xd7, 0x3f, - 0x1e, 0x00, 0xd9, 0x3f, 0x1e, 0x00, 0xdd, 0x3f, 0x1e, 0x00, 0x70, 0x44, - 0x1e, 0x00, 0x71, 0x44, 0x1e, 0x00, 0x79, 0x44, 0x1e, 0x00, 0x7d, 0x44, - 0x1e, 0x00, 0xf7, 0x45, 0x1e, 0x00, 0xf8, 0x45, 0x1e, 0x00, 0xfc, 0x45, - 0x1e, 0x00, 0xfe, 0x45, 0x1e, 0x00, 0xff, 0x45, 0x1e, 0x00, 0x77, 0x46, - 0x1e, 0x00, 0x78, 0x46, 0x1e, 0x00, 0x7c, 0x46, 0x1e, 0x00, 0x7e, 0x46, - 0x1e, 0x00, 0x7f, 0x46, 0x1e, 0x00, 0x37, 0x47, 0x1e, 0x00, 0x38, 0x47, - 0x1e, 0x00, 0x3c, 0x47, 0x1e, 0x00, 0x3e, 0x47, 0x1e, 0x00, 0x3f, 0x47, - 0x1e, 0x00, 0xb0, 0x47, 0x1e, 0x00, 0xb1, 0x47, 0x1e, 0x00, 0xb9, 0x47, - 0x1e, 0x00, 0xbd, 0x47, 0x1e, 0x00, 0x0b, 0x49, 0x1e, 0x00, 0x6b, 0x49, - 0x1e, 0x00, 0x70, 0x4a, 0x1e, 0x00, 0x71, 0x4a, 0x1e, 0x00, 0x77, 0x4a, - 0x1e, 0x00, 0x79, 0x4a, 0x1e, 0x00, 0x7d, 0x4a, 0x1e, 0x00, 0x2b, 0x4b, - 0x1e, 0x00, 0xcb, 0x4b, 0x1e, 0x00, 0xeb, 0x4b, 0x1e, 0x00, 0xf8, 0x4b, - 0x1e, 0x00, 0xfc, 0x4b, 0x1e, 0x00, 0xfe, 0x4b, 0x1e, 0x00, 0xff, 0x4b, - 0x1e, 0x00, 0x8b, 0x4f, 0x1e, 0x00, 0xcb, 0x4f, 0x1e, 0x00, 0xeb, 0x4f, - 0x1e, 0x00, 0xf0, 0x4f, 0x1e, 0x00, 0xf1, 0x4f, 0x1e, 0x00, 0xf7, 0x4f, - 0x1e, 0x00, 0xf9, 0x4f, 0x1e, 0x00, 0xfd, 0x4f, 0x1e, 0x00, 0xb0, 0x50, - 0x1e, 0x00, 0xb1, 0x50, 0x1e, 0x00, 0xb9, 0x50, 0x1e, 0x00, 0xbd, 0x50, - 0x1e, 0x00, 0xf7, 0x51, 0x1e, 0x00, 0xf8, 0x51, 0x1e, 0x00, 0xfc, 0x51, - 0x1e, 0x00, 0xfe, 0x51, 0x1e, 0x00, 0xff, 0x51, 0x1e, 0x00, 0xb8, 0x52, - 0x1e, 0x00, 0xbc, 0x52, 0x1e, 0x00, 0xbe, 0x52, 0x1e, 0x00, 0xbf, 0x52, - 0x1e, 0x00, 0xb0, 0x54, 0x1e, 0x00, 0xb1, 0x54, 0x1e, 0x00, 0xb7, 0x54, - 0x1e, 0x00, 0xb9, 0x54, 0x1e, 0x00, 0xbd, 0x54, 0x1e, 0x00, 0x78, 0x55, - 0x1e, 0x00, 0x7c, 0x55, 0x1e, 0x00, 0x7e, 0x55, 0x1e, 0x00, 0x7f, 0x55, - 0x1e, 0x00, 0xcb, 0x57, 0x1e, 0x00, 0xeb, 0x57, 0x1e, 0x00, 0xf0, 0x57, - 0x1e, 0x00, 0xf1, 0x57, 0x1e, 0x00, 0xf7, 0x57, 0x1e, 0x00, 0xf9, 0x57, - 0x1e, 0x00, 0xfd, 0x57, 0x1e, 0x00, 0xb7, 0x58, 0x1e, 0x00, 0xb8, 0x58, - 0x1e, 0x00, 0xbc, 0x58, 0x1e, 0x00, 0xbe, 0x58, 0x1e, 0x00, 0xbf, 0x58, - 0x1e, 0x00, 0xf0, 0x59, 0x1e, 0x00, 0xf1, 0x59, 0x1e, 0x00, 0xf9, 0x59, - 0x1e, 0x00, 0xfd, 0x59, 0x1e, 0x00, 0xb0, 0x5a, 0x1e, 0x00, 0xb1, 0x5a, - 0x1e, 0x00, 0xb9, 0x5a, 0x1e, 0x00, 0xbd, 0x5a, 0x1e, 0x00, 0xb8, 0x5c, - 0x1e, 0x00, 0xbc, 0x5c, 0x1e, 0x00, 0xbe, 0x5c, 0x1e, 0x00, 0xbf, 0x5c, - 0x1e, 0x00, 0xf7, 0x5d, 0x1e, 0x00, 0xf8, 0x5d, 0x1e, 0x00, 0xfc, 0x5d, - 0x1e, 0x00, 0xfe, 0x5d, 0x1e, 0x00, 0xff, 0x5d, 0x1e, 0x00, 0xb8, 0x5e, - 0x1e, 0x00, 0xbc, 0x5e, 0x1e, 0x00, 0xbe, 0x5e, 0x1e, 0x00, 0xbf, 0x5e, - 0x1e, 0x00, 0xf0, 0x5f, 0x1e, 0x00, 0xf1, 0x5f, 0x1e, 0x00, 0xf9, 0x5f, - 0x1e, 0x00, 0xfd, 0x5f, 0x1e, 0x00, 0x0b, 0x67, 0x1e, 0x00, 0xf8, 0x6a, - 0x1e, 0x00, 0xfc, 0x6a, 0x1e, 0x00, 0xfe, 0x6a, 0x1e, 0x00, 0xff, 0x6a, - 0x1e, 0x00, 0x2b, 0x72, 0x1e, 0x00, 0xcb, 0x7a, 0x1e, 0x00, 0xeb, 0x7a, - 0x1e, 0x00, 0xf8, 0x7c, 0x1e, 0x00, 0xfc, 0x7c, 0x1e, 0x00, 0xfe, 0x7c, - 0x1e, 0x00, 0xff, 0x7c, 0x1e, 0x00, 0x2b, 0x7e, 0x1e, 0x00, 0x71, 0x80, - 0x1e, 0x00, 0x79, 0x80, 0x1e, 0x00, 0xf7, 0x81, 0x1e, 0x00, 0x71, 0x84, - 0x1e, 0x00, 0x79, 0x84, 0x1e, 0x00, 0xf7, 0x84, 0x1e, 0x00, 0xf8, 0x84, - 0x1e, 0x00, 0xfc, 0x84, 0x1e, 0x00, 0xfe, 0x84, 0x1e, 0x00, 0xff, 0x84, - 0x1e, 0x00, 0xf7, 0x85, 0x1e, 0x00, 0x0b, 0x86, 0x1e, 0x00, 0x71, 0x86, - 0x1e, 0x00, 0x79, 0x86, 0x1e, 0x00, 0xf7, 0x86, 0x1e, 0x00, 0xf8, 0x86, - 0x1e, 0x00, 0xfc, 0x86, 0x1e, 0x00, 0xfe, 0x86, 0x1e, 0x00, 0xff, 0x86, - 0x1e, 0x00, 0x70, 0x87, 0x1e, 0x00, 0x71, 0x87, 0x1e, 0x00, 0x79, 0x87, - 0x1e, 0x00, 0x7d, 0x87, 0x1e, 0x00, 0xf7, 0x87, 0x1e, 0x00, 0xbb, 0x89, - 0x1e, 0x00, 0x0b, 0x8a, 0x1e, 0x00, 0xbb, 0x8d, 0x1e, 0x00, 0x0b, 0x8e, - 0x1e, 0x00, 0xf1, 0x8f, 0x1e, 0x00, 0xf7, 0x8f, 0x1e, 0x00, 0xf9, 0x8f, - 0x1e, 0x00, 0x3b, 0x94, 0x1e, 0x00, 0x3b, 0x95, 0x1e, 0x00, 0xcb, 0x9a, - 0x1e, 0x00, 0xeb, 0x9a, 0x1e, 0x00, 0xf8, 0x9a, 0x1e, 0x00, 0xfc, 0x9a, - 0x1e, 0x00, 0xfe, 0x9a, 0x1e, 0x00, 0xff, 0x9a, 0x1e, 0x00, 0xeb, 0xa4, - 0x1e, 0x00, 0xf8, 0xa4, 0x1e, 0x00, 0xfc, 0xa4, 0x1e, 0x00, 0xfe, 0xa4, - 0x1e, 0x00, 0xff, 0xa4, 0x1e, 0x00, 0x3b, 0xa5, 0x1e, 0x00, 0x0b, 0xa6, - 0x1e, 0x00, 0x2b, 0xa6, 0x1e, 0x00, 0xeb, 0xa6, 0x1e, 0x00, 0x78, 0xa7, - 0x1e, 0x00, 0x7c, 0xa7, 0x1e, 0x00, 0x7e, 0xa7, 0x1e, 0x00, 0x7f, 0xa7, - 0x1e, 0x00, 0x0b, 0xaa, 0x1e, 0x00, 0x2b, 0xaa, 0x1e, 0x00, 0x0b, 0xab, - 0x1e, 0x00, 0x71, 0xb1, 0x1e, 0x00, 0x77, 0xb1, 0x1e, 0x00, 0x79, 0xb1, - 0x1e, 0x00, 0xbb, 0xb2, 0x1e, 0x00, 0xf1, 0xb3, 0x1e, 0x00, 0xf7, 0xb3, - 0x1e, 0x00, 0xf9, 0xb3, 0x1e, 0x00, 0x0b, 0xb5, 0x1e, 0x00, 0x71, 0xb7, - 0x1e, 0x00, 0x77, 0xb7, 0x1e, 0x00, 0x79, 0xb7, 0x1e, 0x00, 0xf1, 0xb7, - 0x1e, 0x00, 0xf7, 0xb7, 0x1e, 0x00, 0xf9, 0xb7, 0x1e, 0x00, 0xf0, 0xb8, - 0x1e, 0x00, 0xf1, 0xb8, 0x1e, 0x00, 0xf7, 0xb8, 0x1e, 0x00, 0xf9, 0xb8, - 0x1e, 0x00, 0xfd, 0xb8, 0x1e, 0x00, 0x0b, 0xba, 0x1e, 0x00, 0xbb, 0xbe, - 0x1e, 0x00, 0x30, 0xc0, 0x1e, 0x00, 0xe6, 0xc0, 0x1e, 0x00, 0xf6, 0xc0, - 0x1e, 0x00, 0xf7, 0xc0, 0x1e, 0x00, 0xf8, 0xc0, 0x1e, 0x00, 0xfc, 0xc0, - 0x1e, 0x00, 0xfe, 0xc0, 0x1e, 0x00, 0xff, 0xc0, 0x1e, 0x00, 0x08, 0xc2, - 0x1e, 0x00, 0x0b, 0xc2, 0x1e, 0x00, 0x18, 0xc2, 0x1e, 0x00, 0x1c, 0xc2, - 0x1e, 0x00, 0x1e, 0xc2, 0x1e, 0x00, 0x1f, 0xc2, 0x1e, 0x00, 0x28, 0xc2, - 0x1e, 0x00, 0x2b, 0xc2, 0x1e, 0x00, 0x78, 0xc2, 0x1e, 0x00, 0x7c, 0xc2, - 0x1e, 0x00, 0x7e, 0xc2, 0x1e, 0x00, 0x7f, 0xc2, 0x1e, 0x00, 0xd0, 0xc2, - 0x1e, 0x00, 0xd8, 0xc2, 0x1e, 0x00, 0xdc, 0xc2, 0x1e, 0x00, 0xde, 0xc2, - 0x1e, 0x00, 0xdf, 0xc2, 0x1e, 0x00, 0x91, 0xc3, 0x1e, 0x00, 0x96, 0xc3, - 0x1e, 0x00, 0x97, 0xc3, 0x1e, 0x00, 0x99, 0xc3, 0x1e, 0x00, 0x9d, 0xc3, - 0x1e, 0x00, 0xf6, 0xc5, 0x1e, 0x00, 0xf7, 0xc5, 0x1e, 0x00, 0xf8, 0xc5, - 0x1e, 0x00, 0xfc, 0xc5, 0x1e, 0x00, 0xfe, 0xc5, 0x1e, 0x00, 0xff, 0xc5, - 0x1e, 0x00, 0xb0, 0xc6, 0x1e, 0x00, 0x30, 0xc7, 0x1e, 0x00, 0xb0, 0xc8, - 0x1e, 0x00, 0x51, 0xc9, 0x1e, 0x00, 0x56, 0xc9, 0x1e, 0x00, 0x57, 0xc9, - 0x1e, 0x00, 0x58, 0xc9, 0x1e, 0x00, 0x5c, 0xc9, 0x1e, 0x00, 0x5e, 0xc9, - 0x1e, 0x00, 0x5f, 0xc9, 0x1e, 0x00, 0xc6, 0xcb, 0x1e, 0x00, 0xe6, 0xcb, - 0x1e, 0x00, 0xf0, 0xcb, 0x1e, 0x00, 0xf0, 0xcc, 0x1e, 0x00, 0xf1, 0xcc, - 0x1e, 0x00, 0xf9, 0xcc, 0x1e, 0x00, 0xfd, 0xcc, 0x1e, 0x00, 0x2b, 0xce, - 0x1e, 0x00, 0xf0, 0xce, 0x1e, 0x00, 0xf1, 0xce, 0x1e, 0x00, 0xf9, 0xce, - 0x1e, 0x00, 0xfd, 0xce, 0x1e, 0x00, 0x28, 0xcf, 0x1e, 0x00, 0x2b, 0xcf, - 0x1e, 0x00, 0xa8, 0xcf, 0x1e, 0x00, 0xab, 0xcf, 0x1e, 0x00, 0xf0, 0xcf, - 0x1e, 0x00, 0xf1, 0xcf, 0x1e, 0x00, 0xf9, 0xcf, 0x1e, 0x00, 0xfd, 0xcf, - 0x1e, 0x00, 0xe8, 0xd0, 0x1e, 0x00, 0xeb, 0xd0, 0x1e, 0x00, 0xd8, 0xd3, - 0x1e, 0x00, 0xdc, 0xd3, 0x1e, 0x00, 0xde, 0xd3, 0x1e, 0x00, 0xdf, 0xd3, - 0x1e, 0x00, 0xe8, 0xd3, 0x1e, 0x00, 0xeb, 0xd3, 0x1e, 0x00, 0xe8, 0xd4, - 0x1e, 0x00, 0xeb, 0xd4, 0x1e, 0x00, 0xeb, 0xd6, 0x1e, 0x00, 0x88, 0xd7, - 0x1e, 0x00, 0x8b, 0xd7, 0x1e, 0x00, 0xc8, 0xd7, 0x1e, 0x00, 0xcb, 0xd7, - 0x1e, 0x00, 0xe8, 0xd7, 0x1e, 0x00, 0xeb, 0xd7, 0x1e, 0x00, 0x48, 0xd8, - 0x1e, 0x00, 0x4b, 0xd8, 0x1e, 0x00, 0xf8, 0xd9, 0x1e, 0x00, 0xfc, 0xd9, - 0x1e, 0x00, 0xfe, 0xd9, 0x1e, 0x00, 0xff, 0xd9, 0x1e, 0x00, 0xf8, 0xdb, - 0x1e, 0x00, 0xfc, 0xdb, 0x1e, 0x00, 0xfe, 0xdb, 0x1e, 0x00, 0xff, 0xdb, - 0x1e, 0x00, 0xf8, 0xdd, 0x1e, 0x00, 0xfc, 0xdd, 0x1e, 0x00, 0xfe, 0xdd, - 0x1e, 0x00, 0xff, 0xdd, 0x1e, 0x00, 0x98, 0xdf, 0x1e, 0x00, 0x9c, 0xdf, - 0x1e, 0x00, 0x9e, 0xdf, 0x1e, 0x00, 0x9f, 0xdf, 0x1e, 0x00, 0xd8, 0xdf, - 0x1e, 0x00, 0xdc, 0xdf, 0x1e, 0x00, 0xde, 0xdf, 0x1e, 0x00, 0xdf, 0xdf, - 0x1e, 0x00, 0xb0, 0xe0, 0x1e, 0x00, 0x30, 0xe1, 0x1e, 0x00, 0x46, 0xe1, - 0x1e, 0x00, 0x51, 0xe1, 0x1e, 0x00, 0x56, 0xe1, 0x1e, 0x00, 0x57, 0xe1, - 0x1e, 0x00, 0x58, 0xe1, 0x1e, 0x00, 0x5c, 0xe1, 0x1e, 0x00, 0x5e, 0xe1, - 0x1e, 0x00, 0x5f, 0xe1, 0x1e, 0x00, 0x08, 0xe2, 0x1e, 0x00, 0x0b, 0xe2, - 0x1e, 0x00, 0x26, 0xe2, 0x1e, 0x00, 0xd0, 0xe2, 0x1e, 0x00, 0xd9, 0xe2, - 0x1e, 0x00, 0xdd, 0xe2, 0x1e, 0x00, 0x2b, 0xe5, 0x1e, 0x00, 0xf0, 0xe5, - 0x1e, 0x00, 0x30, 0xe7, 0x1e, 0x00, 0xb0, 0xe8, 0x1e, 0x00, 0x08, 0xe9, - 0x1e, 0x00, 0x0b, 0xe9, 0x1e, 0x00, 0x30, 0xe9, 0x1e, 0x00, 0x51, 0xe9, - 0x1e, 0x00, 0x56, 0xe9, 0x1e, 0x00, 0x57, 0xe9, 0x1e, 0x00, 0x58, 0xe9, - 0x1e, 0x00, 0x5c, 0xe9, 0x1e, 0x00, 0x5e, 0xe9, 0x1e, 0x00, 0x5f, 0xe9, - 0x1e, 0x00, 0xb0, 0xea, 0x1e, 0x00, 0xc6, 0xeb, 0x1e, 0x00, 0xe6, 0xeb, - 0x1e, 0x00, 0xf0, 0xeb, 0x1e, 0x00, 0x30, 0xec, 0x1e, 0x00, 0xf0, 0xec, - 0x1e, 0x00, 0xf1, 0xec, 0x1e, 0x00, 0xf9, 0xec, 0x1e, 0x00, 0xfd, 0xec, - 0x1e, 0x00, 0x08, 0xed, 0x1e, 0x00, 0x0b, 0xed, 0x1e, 0x00, 0x30, 0xed, - 0x1e, 0x00, 0x08, 0xee, 0x1e, 0x00, 0x0b, 0xee, 0x1e, 0x00, 0x26, 0xee, - 0x1e, 0x00, 0x27, 0xee, 0x1e, 0x00, 0x29, 0xee, 0x1e, 0x00, 0x2a, 0xee, - 0x1e, 0x00, 0xc6, 0xee, 0x1e, 0x00, 0xe6, 0xee, 0x1e, 0x00, 0xf6, 0xee, - 0x1e, 0x00, 0xf7, 0xee, 0x1e, 0x00, 0xf8, 0xee, 0x1e, 0x00, 0xfc, 0xee, - 0x1e, 0x00, 0xfe, 0xee, 0x1e, 0x00, 0xff, 0xee, 0x1e, 0x00, 0x28, 0xef, - 0x1e, 0x00, 0x2b, 0xef, 0x1e, 0x00, 0xa8, 0xef, 0x1e, 0x00, 0xab, 0xef, - 0x1e, 0x00, 0xf0, 0xef, 0x1e, 0x00, 0xf1, 0xef, 0x1e, 0x00, 0xf9, 0xef, - 0x1e, 0x00, 0xfd, 0xef, 0x1e, 0x00, 0xb0, 0xf0, 0x1e, 0x00, 0x46, 0xf1, - 0x1e, 0x00, 0x51, 0xf1, 0x1e, 0x00, 0x56, 0xf1, 0x1e, 0x00, 0x57, 0xf1, - 0x1e, 0x00, 0x58, 0xf1, 0x1e, 0x00, 0x5c, 0xf1, 0x1e, 0x00, 0x5e, 0xf1, - 0x1e, 0x00, 0x5f, 0xf1, 0x1e, 0x00, 0xb0, 0xf1, 0x1e, 0x00, 0x26, 0xf3, - 0x1e, 0x00, 0x88, 0xf3, 0x1e, 0x00, 0x8b, 0xf3, 0x1e, 0x00, 0xa8, 0xf3, - 0x1e, 0x00, 0xab, 0xf3, 0x1e, 0x00, 0xc6, 0xf3, 0x1e, 0x00, 0xe6, 0xf3, - 0x1e, 0x00, 0xf0, 0xf3, 0x1e, 0x00, 0xb0, 0xf4, 0x1e, 0x00, 0xf0, 0xf4, - 0x1e, 0x00, 0xf1, 0xf4, 0x1e, 0x00, 0xf9, 0xf4, 0x1e, 0x00, 0xfd, 0xf4, - 0x1e, 0x00, 0xb0, 0xf6, 0x1e, 0x00, 0xf0, 0xf6, 0x1e, 0x00, 0xf1, 0xf6, - 0x1e, 0x00, 0xf9, 0xf6, 0x1e, 0x00, 0xfd, 0xf6, 0x1e, 0x00, 0x86, 0xf7, - 0x1e, 0x00, 0xf0, 0xf7, 0x1e, 0x00, 0xf1, 0xf7, 0x1e, 0x00, 0xf9, 0xf7, - 0x1e, 0x00, 0xfd, 0xf7, 0x1e, 0x00, 0xf7, 0xf9, 0x1e, 0x00, 0xf8, 0xf9, - 0x1e, 0x00, 0xfc, 0xf9, 0x1e, 0x00, 0xfe, 0xf9, 0x1e, 0x00, 0xff, 0xf9, - 0x1e, 0x00, 0xc6, 0xfb, 0x1e, 0x00, 0xe6, 0xfb, 0x1e, 0x00, 0xf0, 0xfb, - 0x1e, 0x00, 0x2b, 0xfd, 0x1e, 0x00, 0xf0, 0xfd, 0x1e, 0x00, 0x30, 0xff, - 0x1e, 0x00, 0x90, 0xff, 0x1e, 0x00, 0x99, 0xff, 0x1e, 0x00, 0x9d, 0xff, - 0x1e, 0x00, 0xd0, 0xff, 0x1e, 0x00, 0xd9, 0xff, 0x1e, 0x00, 0xdd, 0xff, - 0x1e, 0x00, 0x73, 0x00, 0x1f, 0x00, 0x7b, 0x00, 0x1f, 0x00, 0xb3, 0x00, - 0x1f, 0x00, 0xbb, 0x00, 0x1f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0xfb, 0x00, - 0x1f, 0x00, 0x43, 0x01, 0x1f, 0x00, 0x44, 0x01, 0x1f, 0x00, 0x45, 0x01, - 0x1f, 0x00, 0x48, 0x01, 0x1f, 0x00, 0x4b, 0x01, 0x1f, 0x00, 0x4c, 0x01, - 0x1f, 0x00, 0x4e, 0x01, 0x1f, 0x00, 0x4f, 0x01, 0x1f, 0x00, 0x74, 0x01, - 0x1f, 0x00, 0x75, 0x01, 0x1f, 0x00, 0x78, 0x01, 0x1f, 0x00, 0x7c, 0x01, - 0x1f, 0x00, 0x7e, 0x01, 0x1f, 0x00, 0x7f, 0x01, 0x1f, 0x00, 0xf4, 0x01, - 0x1f, 0x00, 0xf5, 0x01, 0x1f, 0x00, 0xf8, 0x01, 0x1f, 0x00, 0xfc, 0x01, - 0x1f, 0x00, 0xfe, 0x01, 0x1f, 0x00, 0xff, 0x01, 0x1f, 0x00, 0x34, 0x02, - 0x1f, 0x00, 0x35, 0x02, 0x1f, 0x00, 0x38, 0x02, 0x1f, 0x00, 0x3c, 0x02, - 0x1f, 0x00, 0x3e, 0x02, 0x1f, 0x00, 0x3f, 0x02, 0x1f, 0x00, 0xf4, 0x02, - 0x1f, 0x00, 0xf5, 0x02, 0x1f, 0x00, 0xf8, 0x02, 0x1f, 0x00, 0xfc, 0x02, - 0x1f, 0x00, 0xfe, 0x02, 0x1f, 0x00, 0xff, 0x02, 0x1f, 0x00, 0x34, 0x03, - 0x1f, 0x00, 0x35, 0x03, 0x1f, 0x00, 0x38, 0x03, 0x1f, 0x00, 0x3c, 0x03, - 0x1f, 0x00, 0x3e, 0x03, 0x1f, 0x00, 0x3f, 0x03, 0x1f, 0x00, 0xf3, 0x03, - 0x1f, 0x00, 0xfb, 0x03, 0x1f, 0x00, 0x38, 0x04, 0x1f, 0x00, 0x3c, 0x04, - 0x1f, 0x00, 0x3e, 0x04, 0x1f, 0x00, 0x3f, 0x04, 0x1f, 0x00, 0x73, 0x04, - 0x1f, 0x00, 0x7b, 0x04, 0x1f, 0x00, 0xf4, 0x05, 0x1f, 0x00, 0xf5, 0x05, - 0x1f, 0x00, 0xf8, 0x05, 0x1f, 0x00, 0xfc, 0x05, 0x1f, 0x00, 0xfe, 0x05, - 0x1f, 0x00, 0xff, 0x05, 0x1f, 0x00, 0x73, 0x06, 0x1f, 0x00, 0x7b, 0x06, - 0x1f, 0x00, 0x34, 0x07, 0x1f, 0x00, 0x35, 0x07, 0x1f, 0x00, 0x38, 0x07, - 0x1f, 0x00, 0x3c, 0x07, 0x1f, 0x00, 0x3e, 0x07, 0x1f, 0x00, 0x3f, 0x07, - 0x1f, 0x00, 0xb4, 0x07, 0x1f, 0x00, 0xb5, 0x07, 0x1f, 0x00, 0xb8, 0x07, - 0x1f, 0x00, 0xbc, 0x07, 0x1f, 0x00, 0xbe, 0x07, 0x1f, 0x00, 0xbf, 0x07, - 0x1f, 0x00, 0x4b, 0x08, 0x1f, 0x00, 0xb3, 0x08, 0x1f, 0x00, 0xbb, 0x08, - 0x1f, 0x00, 0xd8, 0x08, 0x1f, 0x00, 0xdc, 0x08, 0x1f, 0x00, 0xde, 0x08, - 0x1f, 0x00, 0xdf, 0x08, 0x1f, 0x00, 0xe3, 0x08, 0x1f, 0x00, 0xf3, 0x08, - 0x1f, 0x00, 0xfb, 0x08, 0x1f, 0x00, 0x58, 0x09, 0x1f, 0x00, 0x5c, 0x09, - 0x1f, 0x00, 0x5e, 0x09, 0x1f, 0x00, 0x5f, 0x09, 0x1f, 0x00, 0x74, 0x0a, - 0x1f, 0x00, 0x75, 0x0a, 0x1f, 0x00, 0x78, 0x0a, 0x1f, 0x00, 0x7c, 0x0a, - 0x1f, 0x00, 0x7e, 0x0a, 0x1f, 0x00, 0x7f, 0x0a, 0x1f, 0x00, 0x08, 0x0b, - 0x1f, 0x00, 0x0b, 0x0b, 0x1f, 0x00, 0x33, 0x0b, 0x1f, 0x00, 0x3b, 0x0b, - 0x1f, 0x00, 0xb3, 0x0b, 0x1f, 0x00, 0xbb, 0x0b, 0x1f, 0x00, 0xd3, 0x0b, - 0x1f, 0x00, 0xd4, 0x0b, 0x1f, 0x00, 0xd5, 0x0b, 0x1f, 0x00, 0xdb, 0x0b, - 0x1f, 0x00, 0xe4, 0x0b, 0x1f, 0x00, 0xe5, 0x0b, 0x1f, 0x00, 0xe8, 0x0b, - 0x1f, 0x00, 0xeb, 0x0b, 0x1f, 0x00, 0xec, 0x0b, 0x1f, 0x00, 0xee, 0x0b, - 0x1f, 0x00, 0xef, 0x0b, 0x1f, 0x00, 0xf4, 0x0b, 0x1f, 0x00, 0xf5, 0x0b, - 0x1f, 0x00, 0xf8, 0x0b, 0x1f, 0x00, 0xfc, 0x0b, 0x1f, 0x00, 0xfe, 0x0b, - 0x1f, 0x00, 0xff, 0x0b, 0x1f, 0x00, 0x53, 0x0d, 0x1f, 0x00, 0x54, 0x0d, - 0x1f, 0x00, 0x55, 0x0d, 0x1f, 0x00, 0x5b, 0x0d, 0x1f, 0x00, 0x33, 0x0f, - 0x1f, 0x00, 0x3b, 0x0f, 0x1f, 0x00, 0x93, 0x0f, 0x1f, 0x00, 0x94, 0x0f, - 0x1f, 0x00, 0x95, 0x0f, 0x1f, 0x00, 0x9b, 0x0f, 0x1f, 0x00, 0xd3, 0x0f, - 0x1f, 0x00, 0xd4, 0x0f, 0x1f, 0x00, 0xd5, 0x0f, 0x1f, 0x00, 0xdb, 0x0f, - 0x1f, 0x00, 0x74, 0x10, 0x1f, 0x00, 0x75, 0x10, 0x1f, 0x00, 0x78, 0x10, - 0x1f, 0x00, 0x7c, 0x10, 0x1f, 0x00, 0x7e, 0x10, 0x1f, 0x00, 0x7f, 0x10, - 0x1f, 0x00, 0xf4, 0x10, 0x1f, 0x00, 0xf5, 0x10, 0x1f, 0x00, 0xf8, 0x10, - 0x1f, 0x00, 0xfc, 0x10, 0x1f, 0x00, 0xfe, 0x10, 0x1f, 0x00, 0xff, 0x10, - 0x1f, 0x00, 0x33, 0x11, 0x1f, 0x00, 0x3b, 0x11, 0x1f, 0x00, 0x74, 0x11, - 0x1f, 0x00, 0x75, 0x11, 0x1f, 0x00, 0x10, 0x27, 0x00, 0x00, 0xbe, 0x00, - 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xfc, 0x03, - 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xb8, 0x04, - 0x00, 0x00, 0xb8, 0x06, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x07, - 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xb8, 0x08, - 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xbe, 0x10, 0x00, 0x00, 0xbf, 0x10, - 0x00, 0x00, 0xeb, 0x13, 0x00, 0x00, 0xfe, 0x13, 0x00, 0x00, 0xff, 0x13, - 0x00, 0x00, 0xb8, 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xcb, 0x17, - 0x00, 0x00, 0xeb, 0x17, 0x00, 0x00, 0xb8, 0x18, 0x00, 0x00, 0xb8, 0x1a, - 0x00, 0x00, 0xf8, 0x1b, 0x00, 0x00, 0xf8, 0x29, 0x00, 0x00, 0xfc, 0x29, - 0x00, 0x00, 0xfe, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xfe, 0x2d, - 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xcb, 0x2f, 0x00, 0x00, 0xeb, 0x2f, - 0x00, 0x00, 0xf8, 0x2f, 0x00, 0x00, 0xfc, 0x2f, 0x00, 0x00, 0xfe, 0x2f, - 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xf7, 0x39, 0x00, 0x00, 0xf7, 0x3d, - 0x00, 0x00, 0xc7, 0x3f, 0x00, 0x00, 0xe7, 0x3f, 0x00, 0x00, 0xf0, 0x3f, - 0x00, 0x00, 0xf1, 0x3f, 0x00, 0x00, 0xf7, 0x3f, 0x00, 0x00, 0xf9, 0x3f, - 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xb8, 0x52, 0x00, 0x00, 0xe7, 0x53, - 0x00, 0x00, 0xf7, 0x53, 0x00, 0x00, 0xf8, 0x53, 0x00, 0x00, 0xfc, 0x53, - 0x00, 0x00, 0xfe, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xb8, 0x5c, - 0x00, 0x00, 0xb8, 0x5e, 0x00, 0x00, 0x8e, 0x6b, 0x00, 0x00, 0x8f, 0x6b, - 0x00, 0x00, 0xf3, 0x79, 0x00, 0x00, 0xfb, 0x79, 0x00, 0x00, 0xf4, 0x7d, - 0x00, 0x00, 0xce, 0x7f, 0x00, 0x00, 0xcf, 0x7f, 0x00, 0x00, 0xee, 0x7f, - 0x00, 0x00, 0xef, 0x7f, 0x00, 0x00, 0xf3, 0x7f, 0x00, 0x00, 0xfb, 0x7f, - 0x00, 0x00, 0xb1, 0x80, 0x00, 0x00, 0xb8, 0x80, 0x00, 0x00, 0xb4, 0x82, - 0x00, 0x00, 0xbe, 0x82, 0x00, 0x00, 0xbf, 0x82, 0x00, 0x00, 0xb1, 0x84, - 0x00, 0x00, 0xb8, 0x84, 0x00, 0x00, 0xf1, 0x85, 0x00, 0x00, 0xf3, 0x85, - 0x00, 0x00, 0xf9, 0x85, 0x00, 0x00, 0xfb, 0x85, 0x00, 0x00, 0xfd, 0x85, - 0x00, 0x00, 0xb1, 0x86, 0x00, 0x00, 0xb8, 0x86, 0x00, 0x00, 0xb0, 0x88, - 0x00, 0x00, 0xbe, 0x88, 0x00, 0x00, 0xb3, 0x8a, 0x00, 0x00, 0xbb, 0x8a, - 0x00, 0x00, 0xbf, 0x8a, 0x00, 0x00, 0xb4, 0x8c, 0x00, 0x00, 0xb8, 0x8c, - 0x00, 0x00, 0xb4, 0x8e, 0x00, 0x00, 0x84, 0x8f, 0x00, 0x00, 0x8e, 0x8f, - 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0xcd, 0x8f, 0x00, 0x00, 0xce, 0x8f, - 0x00, 0x00, 0xcf, 0x8f, 0x00, 0x00, 0xe1, 0x8f, 0x00, 0x00, 0xe2, 0x8f, - 0x00, 0x00, 0xed, 0x8f, 0x00, 0x00, 0xee, 0x8f, 0x00, 0x00, 0xef, 0x8f, - 0x00, 0x00, 0xf2, 0x8f, 0x00, 0x00, 0xf8, 0x8f, 0x00, 0x00, 0xfa, 0x8f, - 0x00, 0x00, 0xfc, 0x8f, 0x00, 0x00, 0xfe, 0x8f, 0x00, 0x00, 0xff, 0x8f, - 0x00, 0x00, 0xce, 0x93, 0x00, 0x00, 0xcf, 0x93, 0x00, 0x00, 0xf8, 0x93, - 0x00, 0x00, 0xf3, 0x99, 0x00, 0x00, 0xfb, 0x99, 0x00, 0x00, 0xf8, 0x9d, - 0x00, 0x00, 0xf3, 0xa7, 0x00, 0x00, 0xfb, 0xa7, 0x00, 0x00, 0xce, 0xab, - 0x00, 0x00, 0xcf, 0xab, 0x00, 0x00, 0xf8, 0xab, 0x00, 0x00, 0xe1, 0xb3, - 0x00, 0x00, 0xe2, 0xb3, 0x00, 0x00, 0xed, 0xb3, 0x00, 0x00, 0xee, 0xb3, - 0x00, 0x00, 0xef, 0xb3, 0x00, 0x00, 0xf2, 0xb3, 0x00, 0x00, 0xf8, 0xb3, - 0x00, 0x00, 0xfa, 0xb3, 0x00, 0x00, 0xfc, 0xb3, 0x00, 0x00, 0xfe, 0xb3, - 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0xb9, 0x00, 0x00, 0xe1, 0xbb, - 0x00, 0x00, 0xe2, 0xbb, 0x00, 0x00, 0xed, 0xbb, 0x00, 0x00, 0xee, 0xbb, - 0x00, 0x00, 0xef, 0xbb, 0x00, 0x00, 0xf2, 0xbb, 0x00, 0x00, 0xf8, 0xbb, - 0x00, 0x00, 0xfa, 0xbb, 0x00, 0x00, 0xfc, 0xbb, 0x00, 0x00, 0xfe, 0xbb, - 0x00, 0x00, 0xff, 0xbb, 0x00, 0x00, 0xff, 0xbd, 0x00, 0x00, 0xc6, 0xc3, - 0x00, 0x00, 0xc7, 0xc3, 0x00, 0x00, 0xf6, 0xc3, 0x00, 0x00, 0xf7, 0xc3, - 0x00, 0x00, 0xf8, 0xc3, 0x00, 0x00, 0xfc, 0xc3, 0x00, 0x00, 0xfe, 0xc3, - 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xf0, 0xc9, 0x00, 0x00, 0xf1, 0xc9, - 0x00, 0x00, 0xf9, 0xc9, 0x00, 0x00, 0xfd, 0xc9, 0x00, 0x00, 0xf1, 0xcd, - 0x00, 0x00, 0xf8, 0xcd, 0x00, 0x00, 0xc8, 0xd3, 0x00, 0x00, 0xcb, 0xd3, - 0x00, 0x00, 0xf8, 0xd9, 0x00, 0x00, 0xfc, 0xd9, 0x00, 0x00, 0xfe, 0xd9, - 0x00, 0x00, 0xff, 0xd9, 0x00, 0x00, 0xf8, 0xdd, 0x00, 0x00, 0xfc, 0xdd, - 0x00, 0x00, 0xfe, 0xdd, 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0xf1, 0xe3, - 0x00, 0x00, 0xf8, 0xe3, 0x00, 0x00, 0xf6, 0xe9, 0x00, 0x00, 0xf7, 0xe9, - 0x00, 0x00, 0xf8, 0xe9, 0x00, 0x00, 0xfc, 0xe9, 0x00, 0x00, 0xfe, 0xe9, - 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xf0, 0xed, 0x00, 0x00, 0xf6, 0xed, - 0x00, 0x00, 0xf7, 0xed, 0x00, 0x00, 0xfd, 0xed, 0x00, 0x00, 0xfe, 0xed, - 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0xe6, 0xf3, 0x00, 0x00, 0xe7, 0xf3, - 0x00, 0x00, 0xe8, 0xf3, 0x00, 0x00, 0xe9, 0xf3, 0x00, 0x00, 0xeb, 0xf3, - 0x00, 0x00, 0xf0, 0xf3, 0x00, 0x00, 0xf6, 0xf3, 0x00, 0x00, 0xf7, 0xf3, - 0x00, 0x00, 0xfd, 0xf3, 0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0xff, 0xf3, - 0x00, 0x00, 0xf7, 0xf9, 0x00, 0x00, 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xf9, - 0x00, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xf0, 0xfd, - 0x00, 0x00, 0xf7, 0xfd, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xfe, 0xfd, - 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xbe, 0x00, 0x01, 0x00, 0xbf, 0x00, - 0x01, 0x00, 0xc4, 0x01, 0x01, 0x00, 0xc5, 0x01, 0x01, 0x00, 0xce, 0x01, - 0x01, 0x00, 0xcf, 0x01, 0x01, 0x00, 0xf4, 0x01, 0x01, 0x00, 0xf5, 0x01, - 0x01, 0x00, 0xf8, 0x01, 0x01, 0x00, 0xfc, 0x01, 0x01, 0x00, 0xfe, 0x01, - 0x01, 0x00, 0xff, 0x01, 0x01, 0x00, 0xe4, 0x03, 0x01, 0x00, 0xee, 0x03, - 0x01, 0x00, 0xef, 0x03, 0x01, 0x00, 0xf4, 0x03, 0x01, 0x00, 0xf5, 0x03, - 0x01, 0x00, 0xf8, 0x03, 0x01, 0x00, 0xfc, 0x03, 0x01, 0x00, 0xfe, 0x03, - 0x01, 0x00, 0xff, 0x03, 0x01, 0x00, 0xbe, 0x04, 0x01, 0x00, 0xbf, 0x04, - 0x01, 0x00, 0xb8, 0x06, 0x01, 0x00, 0xbe, 0x08, 0x01, 0x00, 0xbf, 0x08, - 0x01, 0x00, 0xcf, 0x09, 0x01, 0x00, 0xf8, 0x09, 0x01, 0x00, 0xfc, 0x09, - 0x01, 0x00, 0xfe, 0x09, 0x01, 0x00, 0xff, 0x09, 0x01, 0x00, 0xb4, 0x0a, - 0x01, 0x00, 0xbe, 0x0a, 0x01, 0x00, 0xbf, 0x0a, 0x01, 0x00, 0xe8, 0x0b, - 0x01, 0x00, 0xf3, 0x0b, 0x01, 0x00, 0xfb, 0x0b, 0x01, 0x00, 0xcf, 0x0d, - 0x01, 0x00, 0xf8, 0x0d, 0x01, 0x00, 0xfc, 0x0d, 0x01, 0x00, 0xfe, 0x0d, - 0x01, 0x00, 0xff, 0x0d, 0x01, 0x00, 0xe4, 0x0f, 0x01, 0x00, 0xee, 0x0f, - 0x01, 0x00, 0xef, 0x0f, 0x01, 0x00, 0xf4, 0x0f, 0x01, 0x00, 0xf5, 0x0f, - 0x01, 0x00, 0xf8, 0x0f, 0x01, 0x00, 0xfc, 0x0f, 0x01, 0x00, 0xfe, 0x0f, - 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, 0xbe, 0x10, 0x01, 0x00, 0xbf, 0x10, - 0x01, 0x00, 0xf3, 0x11, 0x01, 0x00, 0xfb, 0x11, 0x01, 0x00, 0xee, 0x13, - 0x01, 0x00, 0xef, 0x13, 0x01, 0x00, 0xf8, 0x13, 0x01, 0x00, 0xbe, 0x14, - 0x01, 0x00, 0xbf, 0x14, 0x01, 0x00, 0xb4, 0x16, 0x01, 0x00, 0xbe, 0x16, - 0x01, 0x00, 0xbf, 0x16, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0xbe, 0x18, - 0x01, 0x00, 0xbf, 0x18, 0x01, 0x00, 0xf4, 0x19, 0x01, 0x00, 0xf5, 0x19, - 0x01, 0x00, 0xf8, 0x19, 0x01, 0x00, 0xfc, 0x19, 0x01, 0x00, 0xfe, 0x19, - 0x01, 0x00, 0xff, 0x19, 0x01, 0x00, 0xe8, 0x1b, 0x01, 0x00, 0xfe, 0x1b, - 0x01, 0x00, 0xff, 0x1b, 0x01, 0x00, 0xfe, 0x1d, 0x01, 0x00, 0xff, 0x1d, - 0x01, 0x00, 0xce, 0x1f, 0x01, 0x00, 0xcf, 0x1f, 0x01, 0x00, 0xee, 0x1f, - 0x01, 0x00, 0xef, 0x1f, 0x01, 0x00, 0xf3, 0x1f, 0x01, 0x00, 0xfb, 0x1f, - 0x01, 0x00, 0xbe, 0x32, 0x01, 0x00, 0xbf, 0x32, 0x01, 0x00, 0xe8, 0x33, - 0x01, 0x00, 0xe9, 0x33, 0x01, 0x00, 0xeb, 0x33, 0x01, 0x00, 0xf0, 0x33, - 0x01, 0x00, 0xf1, 0x33, 0x01, 0x00, 0xf9, 0x33, 0x01, 0x00, 0xfd, 0x33, - 0x01, 0x00, 0xcb, 0x39, 0x01, 0x00, 0xf0, 0x39, 0x01, 0x00, 0xf1, 0x39, - 0x01, 0x00, 0xf9, 0x39, 0x01, 0x00, 0xfd, 0x39, 0x01, 0x00, 0xbe, 0x3c, - 0x01, 0x00, 0xbf, 0x3c, 0x01, 0x00, 0xcb, 0x3d, 0x01, 0x00, 0xf0, 0x3d, - 0x01, 0x00, 0xf1, 0x3d, 0x01, 0x00, 0xf9, 0x3d, 0x01, 0x00, 0xfd, 0x3d, - 0x01, 0x00, 0xbe, 0x3e, 0x01, 0x00, 0xbf, 0x3e, 0x01, 0x00, 0xe8, 0x3f, - 0x01, 0x00, 0xe9, 0x3f, 0x01, 0x00, 0xeb, 0x3f, 0x01, 0x00, 0xf0, 0x3f, - 0x01, 0x00, 0xf1, 0x3f, 0x01, 0x00, 0xf9, 0x3f, 0x01, 0x00, 0xfd, 0x3f, - 0x01, 0x00, 0xb1, 0x40, 0x01, 0x00, 0xb8, 0x40, 0x01, 0x00, 0xc6, 0x41, - 0x01, 0x00, 0xc7, 0x41, 0x01, 0x00, 0xf6, 0x41, 0x01, 0x00, 0xf7, 0x41, - 0x01, 0x00, 0xf8, 0x41, 0x01, 0x00, 0xfc, 0x41, 0x01, 0x00, 0xfe, 0x41, - 0x01, 0x00, 0xff, 0x41, 0x01, 0x00, 0xb8, 0x42, 0x01, 0x00, 0xb0, 0x44, - 0x01, 0x00, 0xb6, 0x44, 0x01, 0x00, 0xb7, 0x44, 0x01, 0x00, 0xbd, 0x44, - 0x01, 0x00, 0xbe, 0x44, 0x01, 0x00, 0xbf, 0x44, 0x01, 0x00, 0xb1, 0x46, - 0x01, 0x00, 0xb8, 0x46, 0x01, 0x00, 0xc6, 0x47, 0x01, 0x00, 0xc7, 0x47, - 0x01, 0x00, 0xf6, 0x47, 0x01, 0x00, 0xf7, 0x47, 0x01, 0x00, 0xf8, 0x47, - 0x01, 0x00, 0xfc, 0x47, 0x01, 0x00, 0xfe, 0x47, 0x01, 0x00, 0xff, 0x47, - 0x01, 0x00, 0xb1, 0x48, 0x01, 0x00, 0xb8, 0x48, 0x01, 0x00, 0xf7, 0x49, - 0x01, 0x00, 0xf8, 0x49, 0x01, 0x00, 0xfc, 0x49, 0x01, 0x00, 0xfe, 0x49, - 0x01, 0x00, 0xff, 0x49, 0x01, 0x00, 0x86, 0x4b, 0x01, 0x00, 0x87, 0x4b, - 0x01, 0x00, 0x88, 0x4b, 0x01, 0x00, 0x89, 0x4b, 0x01, 0x00, 0x8b, 0x4b, - 0x01, 0x00, 0xbe, 0x4c, 0x01, 0x00, 0xbf, 0x4c, 0x01, 0x00, 0xf0, 0x4d, - 0x01, 0x00, 0xf7, 0x4d, 0x01, 0x00, 0xfd, 0x4d, 0x01, 0x00, 0xfe, 0x4d, - 0x01, 0x00, 0xff, 0x4d, 0x01, 0x00, 0xbe, 0x4e, 0x01, 0x00, 0xbf, 0x4e, - 0x01, 0x00, 0xc8, 0x53, 0x01, 0x00, 0xc9, 0x53, 0x01, 0x00, 0xcb, 0x53, - 0x01, 0x00, 0xf0, 0x53, 0x01, 0x00, 0xf1, 0x53, 0x01, 0x00, 0xf9, 0x53, - 0x01, 0x00, 0xfd, 0x53, 0x01, 0x00, 0xf7, 0x55, 0x01, 0x00, 0xf8, 0x55, - 0x01, 0x00, 0xfc, 0x55, 0x01, 0x00, 0xfe, 0x55, 0x01, 0x00, 0xff, 0x55, - 0x01, 0x00, 0xc8, 0x5f, 0x01, 0x00, 0xc9, 0x5f, 0x01, 0x00, 0xcb, 0x5f, - 0x01, 0x00, 0xf0, 0x5f, 0x01, 0x00, 0xf1, 0x5f, 0x01, 0x00, 0xf9, 0x5f, - 0x01, 0x00, 0xfd, 0x5f, 0x01, 0x00, 0xbe, 0x60, 0x01, 0x00, 0xbf, 0x60, - 0x01, 0x00, 0xf3, 0x61, 0x01, 0x00, 0xfb, 0x61, 0x01, 0x00, 0xbe, 0x64, - 0x01, 0x00, 0xbf, 0x64, 0x01, 0x00, 0xb4, 0x66, 0x01, 0x00, 0xbe, 0x66, - 0x01, 0x00, 0xbf, 0x66, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0xc8, 0x67, - 0x01, 0x00, 0xe4, 0x67, 0x01, 0x00, 0xe8, 0x67, 0x01, 0x00, 0xf4, 0x67, - 0x01, 0x00, 0xf5, 0x67, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, 0xfc, 0x67, - 0x01, 0x00, 0xfe, 0x67, 0x01, 0x00, 0xff, 0x67, 0x01, 0x00, 0xbe, 0x68, - 0x01, 0x00, 0xbf, 0x68, 0x01, 0x00, 0xf4, 0x69, 0x01, 0x00, 0xf5, 0x69, - 0x01, 0x00, 0xf8, 0x69, 0x01, 0x00, 0xfc, 0x69, 0x01, 0x00, 0xfe, 0x69, - 0x01, 0x00, 0xff, 0x69, 0x01, 0x00, 0xfe, 0x6d, 0x01, 0x00, 0xff, 0x6d, - 0x01, 0x00, 0xbe, 0x70, 0x01, 0x00, 0xbf, 0x70, 0x01, 0x00, 0xf8, 0x71, - 0x01, 0x00, 0xfc, 0x71, 0x01, 0x00, 0xfe, 0x71, 0x01, 0x00, 0xff, 0x71, - 0x01, 0x00, 0xbe, 0x74, 0x01, 0x00, 0xbf, 0x74, 0x01, 0x00, 0xb4, 0x76, - 0x01, 0x00, 0xbe, 0x76, 0x01, 0x00, 0xbf, 0x76, 0x01, 0x00, 0xc4, 0x77, - 0x01, 0x00, 0xc8, 0x77, 0x01, 0x00, 0xe4, 0x77, 0x01, 0x00, 0xe8, 0x77, - 0x01, 0x00, 0xf4, 0x77, 0x01, 0x00, 0xf5, 0x77, 0x01, 0x00, 0xf8, 0x77, - 0x01, 0x00, 0xfc, 0x77, 0x01, 0x00, 0xfe, 0x77, 0x01, 0x00, 0xff, 0x77, - 0x01, 0x00, 0xbe, 0x78, 0x01, 0x00, 0xbf, 0x78, 0x01, 0x00, 0xf3, 0x79, - 0x01, 0x00, 0xfb, 0x79, 0x01, 0x00, 0x88, 0x7b, 0x01, 0x00, 0xf8, 0x7d, - 0x01, 0x00, 0xcd, 0x85, 0x01, 0x00, 0xf1, 0x85, 0x01, 0x00, 0xf3, 0x85, - 0x01, 0x00, 0xf9, 0x85, 0x01, 0x00, 0xfb, 0x85, 0x01, 0x00, 0xfd, 0x85, - 0x01, 0x00, 0x83, 0x87, 0x01, 0x00, 0x87, 0x87, 0x01, 0x00, 0x8d, 0x87, - 0x01, 0x00, 0xe1, 0x87, 0x01, 0x00, 0xe2, 0x87, 0x01, 0x00, 0xe7, 0x87, - 0x01, 0x00, 0xeb, 0x87, 0x01, 0x00, 0xee, 0x87, 0x01, 0x00, 0xef, 0x87, - 0x01, 0x00, 0xf2, 0x87, 0x01, 0x00, 0xf7, 0x87, 0x01, 0x00, 0xf8, 0x87, - 0x01, 0x00, 0xfa, 0x87, 0x01, 0x00, 0xfc, 0x87, 0x01, 0x00, 0xfe, 0x87, - 0x01, 0x00, 0xff, 0x87, 0x01, 0x00, 0x8b, 0x8b, 0x01, 0x00, 0x8d, 0x8b, - 0x01, 0x00, 0xf3, 0x93, 0x01, 0x00, 0xfb, 0x93, 0x01, 0x00, 0xf3, 0x99, - 0x01, 0x00, 0xfb, 0x99, 0x01, 0x00, 0xf3, 0x9d, 0x01, 0x00, 0xfb, 0x9d, - 0x01, 0x00, 0xe3, 0x9f, 0x01, 0x00, 0xf3, 0x9f, 0x01, 0x00, 0xfb, 0x9f, - 0x01, 0x00, 0xff, 0xa5, 0x01, 0x00, 0xf8, 0xa7, 0x01, 0x00, 0xfc, 0xa7, - 0x01, 0x00, 0xfe, 0xa7, 0x01, 0x00, 0xff, 0xa7, 0x01, 0x00, 0xb8, 0xaa, - 0x01, 0x00, 0xbc, 0xaa, 0x01, 0x00, 0xbe, 0xaa, 0x01, 0x00, 0xbf, 0xaa, - 0x01, 0x00, 0x8b, 0xab, 0x01, 0x00, 0x8b, 0xbb, 0x01, 0x00, 0x8b, 0xbf, - 0x01, 0x00, 0xeb, 0xd3, 0x01, 0x00, 0xee, 0xd3, 0x01, 0x00, 0xef, 0xd3, - 0x01, 0x00, 0xf8, 0xd3, 0x01, 0x00, 0xfc, 0xd3, 0x01, 0x00, 0xfe, 0xd3, - 0x01, 0x00, 0xff, 0xd3, 0x01, 0x00, 0xf3, 0xd9, 0x01, 0x00, 0xfb, 0xd9, - 0x01, 0x00, 0xc3, 0xdd, 0x01, 0x00, 0xcf, 0xdd, 0x01, 0x00, 0xf8, 0xdd, - 0x01, 0x00, 0xfc, 0xdd, 0x01, 0x00, 0xfe, 0xdd, 0x01, 0x00, 0xff, 0xdd, - 0x01, 0x00, 0xe3, 0xdf, 0x01, 0x00, 0xf3, 0xdf, 0x01, 0x00, 0xfb, 0xdf, - 0x01, 0x00, 0xe1, 0xf3, 0x01, 0x00, 0xe2, 0xf3, 0x01, 0x00, 0xed, 0xf3, - 0x01, 0x00, 0xee, 0xf3, 0x01, 0x00, 0xef, 0xf3, 0x01, 0x00, 0xf2, 0xf3, - 0x01, 0x00, 0xf8, 0xf3, 0x01, 0x00, 0xfa, 0xf3, 0x01, 0x00, 0xfc, 0xf3, - 0x01, 0x00, 0xfe, 0xf3, 0x01, 0x00, 0xff, 0xf3, 0x01, 0x00, 0xff, 0xf9, - 0x01, 0x00, 0xb3, 0xfc, 0x01, 0x00, 0xbb, 0xfc, 0x01, 0x00, 0xff, 0xfd, - 0x01, 0x00, 0xb3, 0xfe, 0x01, 0x00, 0xbb, 0xfe, 0x01, 0x00, 0x83, 0xff, - 0x01, 0x00, 0x8e, 0xff, 0x01, 0x00, 0x8f, 0xff, 0x01, 0x00, 0xce, 0xff, - 0x01, 0x00, 0xcf, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x01, 0x00, 0xe2, 0xff, - 0x01, 0x00, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x01, 0x00, 0xf2, 0xff, - 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfc, 0xff, - 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xb8, 0x06, - 0x02, 0x00, 0xbc, 0x06, 0x02, 0x00, 0xbe, 0x06, 0x02, 0x00, 0xbf, 0x06, - 0x02, 0x00, 0xc8, 0x07, 0x02, 0x00, 0xcb, 0x07, 0x02, 0x00, 0xe8, 0x07, - 0x02, 0x00, 0xeb, 0x07, 0x02, 0x00, 0xf8, 0x07, 0x02, 0x00, 0xfc, 0x07, - 0x02, 0x00, 0xfe, 0x07, 0x02, 0x00, 0xff, 0x07, 0x02, 0x00, 0xc8, 0x0f, - 0x02, 0x00, 0xcb, 0x0f, 0x02, 0x00, 0xe8, 0x0f, 0x02, 0x00, 0xeb, 0x0f, - 0x02, 0x00, 0xf8, 0x0f, 0x02, 0x00, 0xfc, 0x0f, 0x02, 0x00, 0xfe, 0x0f, - 0x02, 0x00, 0xff, 0x0f, 0x02, 0x00, 0xbe, 0x10, 0x02, 0x00, 0xbf, 0x10, - 0x02, 0x00, 0xb8, 0x14, 0x02, 0x00, 0xbc, 0x14, 0x02, 0x00, 0xbe, 0x14, - 0x02, 0x00, 0xbf, 0x14, 0x02, 0x00, 0xb8, 0x16, 0x02, 0x00, 0xbc, 0x16, - 0x02, 0x00, 0xbe, 0x16, 0x02, 0x00, 0xbf, 0x16, 0x02, 0x00, 0xb8, 0x18, - 0x02, 0x00, 0xb8, 0x1a, 0x02, 0x00, 0xbc, 0x1a, 0x02, 0x00, 0xbe, 0x1a, - 0x02, 0x00, 0xbf, 0x1a, 0x02, 0x00, 0xe8, 0x23, 0x02, 0x00, 0xeb, 0x23, - 0x02, 0x00, 0xf8, 0x23, 0x02, 0x00, 0xfc, 0x23, 0x02, 0x00, 0xfe, 0x23, - 0x02, 0x00, 0xff, 0x23, 0x02, 0x00, 0xf8, 0x29, 0x02, 0x00, 0xfc, 0x29, - 0x02, 0x00, 0xfe, 0x29, 0x02, 0x00, 0xff, 0x29, 0x02, 0x00, 0xf8, 0x2d, - 0x02, 0x00, 0xfc, 0x2d, 0x02, 0x00, 0xfe, 0x2d, 0x02, 0x00, 0xff, 0x2d, - 0x02, 0x00, 0xe9, 0x33, 0x02, 0x00, 0xea, 0x33, 0x02, 0x00, 0xf0, 0x33, - 0x02, 0x00, 0xf1, 0x33, 0x02, 0x00, 0xf9, 0x33, 0x02, 0x00, 0xfd, 0x33, - 0x02, 0x00, 0xf7, 0x35, 0x02, 0x00, 0xf8, 0x35, 0x02, 0x00, 0xfc, 0x35, - 0x02, 0x00, 0xfe, 0x35, 0x02, 0x00, 0xff, 0x35, 0x02, 0x00, 0xf7, 0x39, - 0x02, 0x00, 0xf8, 0x39, 0x02, 0x00, 0xfc, 0x39, 0x02, 0x00, 0xfe, 0x39, - 0x02, 0x00, 0xff, 0x39, 0x02, 0x00, 0xf0, 0x3d, 0x02, 0x00, 0xf1, 0x3d, - 0x02, 0x00, 0xf9, 0x3d, 0x02, 0x00, 0xfd, 0x3d, 0x02, 0x00, 0xf0, 0x45, - 0x02, 0x00, 0xf1, 0x45, 0x02, 0x00, 0xf9, 0x45, 0x02, 0x00, 0xfd, 0x45, - 0x02, 0x00, 0xf7, 0x47, 0x02, 0x00, 0xf8, 0x47, 0x02, 0x00, 0xfc, 0x47, - 0x02, 0x00, 0xfe, 0x47, 0x02, 0x00, 0xff, 0x47, 0x02, 0x00, 0xb8, 0x52, - 0x02, 0x00, 0xbc, 0x52, 0x02, 0x00, 0xbe, 0x52, 0x02, 0x00, 0xbf, 0x52, - 0x02, 0x00, 0xcb, 0x53, 0x02, 0x00, 0xf7, 0x53, 0x02, 0x00, 0xf8, 0x53, - 0x02, 0x00, 0xfc, 0x53, 0x02, 0x00, 0xfe, 0x53, 0x02, 0x00, 0xff, 0x53, - 0x02, 0x00, 0xf3, 0x65, 0x02, 0x00, 0xfb, 0x65, 0x02, 0x00, 0xce, 0x67, - 0x02, 0x00, 0xcf, 0x67, 0x02, 0x00, 0xee, 0x67, 0x02, 0x00, 0xef, 0x67, - 0x02, 0x00, 0xf8, 0x67, 0x02, 0x00, 0xfc, 0x67, 0x02, 0x00, 0xfe, 0x67, - 0x02, 0x00, 0xff, 0x67, 0x02, 0x00, 0xf3, 0x79, 0x02, 0x00, 0xfb, 0x79, - 0x02, 0x00, 0xf3, 0x7d, 0x02, 0x00, 0xfb, 0x7d, 0x02, 0x00, 0xc3, 0x7f, - 0x02, 0x00, 0xcb, 0x7f, 0x02, 0x00, 0xe3, 0x7f, 0x02, 0x00, 0xeb, 0x7f, - 0x02, 0x00, 0xf3, 0x7f, 0x02, 0x00, 0xfb, 0x7f, 0x02, 0x00, 0xb1, 0x80, - 0x02, 0x00, 0xb3, 0x80, 0x02, 0x00, 0xb9, 0x80, 0x02, 0x00, 0xbb, 0x80, - 0x02, 0x00, 0xbd, 0x80, 0x02, 0x00, 0xc3, 0x81, 0x02, 0x00, 0xf2, 0x81, - 0x02, 0x00, 0xf7, 0x81, 0x02, 0x00, 0xf8, 0x81, 0x02, 0x00, 0xfa, 0x81, - 0x02, 0x00, 0xfc, 0x81, 0x02, 0x00, 0xfe, 0x81, 0x02, 0x00, 0xff, 0x81, - 0x02, 0x00, 0xb3, 0x82, 0x02, 0x00, 0xbb, 0x82, 0x02, 0x00, 0xb2, 0x84, - 0x02, 0x00, 0xb7, 0x84, 0x02, 0x00, 0xb8, 0x84, 0x02, 0x00, 0xba, 0x84, - 0x02, 0x00, 0xbc, 0x84, 0x02, 0x00, 0xbe, 0x84, 0x02, 0x00, 0xbf, 0x84, - 0x02, 0x00, 0xcd, 0x85, 0x02, 0x00, 0xf1, 0x85, 0x02, 0x00, 0xf3, 0x85, - 0x02, 0x00, 0xf9, 0x85, 0x02, 0x00, 0xfb, 0x85, 0x02, 0x00, 0xfd, 0x85, - 0x02, 0x00, 0xb2, 0x86, 0x02, 0x00, 0xb7, 0x86, 0x02, 0x00, 0xb8, 0x86, - 0x02, 0x00, 0xba, 0x86, 0x02, 0x00, 0xbc, 0x86, 0x02, 0x00, 0xbe, 0x86, - 0x02, 0x00, 0xbf, 0x86, 0x02, 0x00, 0xb2, 0x88, 0x02, 0x00, 0xb8, 0x88, - 0x02, 0x00, 0xba, 0x88, 0x02, 0x00, 0xbc, 0x88, 0x02, 0x00, 0xbe, 0x88, - 0x02, 0x00, 0xbf, 0x88, 0x02, 0x00, 0xf3, 0x89, 0x02, 0x00, 0xf7, 0x89, - 0x02, 0x00, 0xfb, 0x89, 0x02, 0x00, 0xb3, 0x8a, 0x02, 0x00, 0xb7, 0x8a, - 0x02, 0x00, 0xbb, 0x8a, 0x02, 0x00, 0xb8, 0x8c, 0x02, 0x00, 0xbc, 0x8c, - 0x02, 0x00, 0xbe, 0x8c, 0x02, 0x00, 0xbf, 0x8c, 0x02, 0x00, 0xff, 0x8d, - 0x02, 0x00, 0xbf, 0x8e, 0x02, 0x00, 0xf3, 0x93, 0x02, 0x00, 0xfb, 0x93, - 0x02, 0x00, 0xe3, 0x9f, 0x02, 0x00, 0xf3, 0x9f, 0x02, 0x00, 0xfb, 0x9f, - 0x02, 0x00, 0x83, 0xa7, 0x02, 0x00, 0x8e, 0xa7, 0x02, 0x00, 0x8f, 0xa7, - 0x02, 0x00, 0xee, 0xa7, 0x02, 0x00, 0xef, 0xa7, 0x02, 0x00, 0xf8, 0xa7, - 0x02, 0x00, 0xfc, 0xa7, 0x02, 0x00, 0xfe, 0xa7, 0x02, 0x00, 0xff, 0xa7, - 0x02, 0x00, 0xb8, 0xaa, 0x02, 0x00, 0xbc, 0xaa, 0x02, 0x00, 0xbe, 0xaa, - 0x02, 0x00, 0xbf, 0xaa, 0x02, 0x00, 0x84, 0xab, 0x02, 0x00, 0xf3, 0xab, - 0x02, 0x00, 0xfb, 0xab, 0x02, 0x00, 0x83, 0xb3, 0x02, 0x00, 0x8e, 0xb3, - 0x02, 0x00, 0x8f, 0xb3, 0x02, 0x00, 0xe1, 0xb3, 0x02, 0x00, 0xe2, 0xb3, - 0x02, 0x00, 0xee, 0xb3, 0x02, 0x00, 0xef, 0xb3, 0x02, 0x00, 0xf2, 0xb3, - 0x02, 0x00, 0xf8, 0xb3, 0x02, 0x00, 0xfa, 0xb3, 0x02, 0x00, 0xfc, 0xb3, - 0x02, 0x00, 0xfe, 0xb3, 0x02, 0x00, 0xff, 0xb3, 0x02, 0x00, 0x8b, 0xbb, - 0x02, 0x00, 0x8d, 0xbb, 0x02, 0x00, 0xe1, 0xbb, 0x02, 0x00, 0xe2, 0xbb, - 0x02, 0x00, 0xee, 0xbb, 0x02, 0x00, 0xef, 0xbb, 0x02, 0x00, 0xf2, 0xbb, - 0x02, 0x00, 0xf8, 0xbb, 0x02, 0x00, 0xfa, 0xbb, 0x02, 0x00, 0xfc, 0xbb, - 0x02, 0x00, 0xfe, 0xbb, 0x02, 0x00, 0xff, 0xbb, 0x02, 0x00, 0x8b, 0xbf, - 0x02, 0x00, 0xe3, 0xbf, 0x02, 0x00, 0xe7, 0xbf, 0x02, 0x00, 0xeb, 0xbf, - 0x02, 0x00, 0xed, 0xbf, 0x02, 0x00, 0xf1, 0xbf, 0x02, 0x00, 0xf3, 0xbf, - 0x02, 0x00, 0xf7, 0xbf, 0x02, 0x00, 0xf9, 0xbf, 0x02, 0x00, 0xfb, 0xbf, - 0x02, 0x00, 0xfd, 0xbf, 0x02, 0x00, 0xe6, 0xc3, 0x02, 0x00, 0xe7, 0xc3, - 0x02, 0x00, 0xe8, 0xc3, 0x02, 0x00, 0xeb, 0xc3, 0x02, 0x00, 0xf6, 0xc3, - 0x02, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0xf8, 0xc3, 0x02, 0x00, 0xfc, 0xc3, - 0x02, 0x00, 0xfe, 0xc3, 0x02, 0x00, 0xff, 0xc3, 0x02, 0x00, 0xb8, 0xcc, - 0x02, 0x00, 0xbc, 0xcc, 0x02, 0x00, 0xbe, 0xcc, 0x02, 0x00, 0xbf, 0xcc, - 0x02, 0x00, 0xb8, 0xce, 0x02, 0x00, 0xbc, 0xce, 0x02, 0x00, 0xbe, 0xce, - 0x02, 0x00, 0xbf, 0xce, 0x02, 0x00, 0xc9, 0xcf, 0x02, 0x00, 0xca, 0xcf, - 0x02, 0x00, 0xe9, 0xcf, 0x02, 0x00, 0xea, 0xcf, 0x02, 0x00, 0xf0, 0xcf, - 0x02, 0x00, 0xf1, 0xcf, 0x02, 0x00, 0xf9, 0xcf, 0x02, 0x00, 0xfd, 0xcf, - 0x02, 0x00, 0xe8, 0xdf, 0x02, 0x00, 0xeb, 0xdf, 0x02, 0x00, 0xf8, 0xdf, - 0x02, 0x00, 0xfc, 0xdf, 0x02, 0x00, 0xfe, 0xdf, 0x02, 0x00, 0xff, 0xdf, - 0x02, 0x00, 0xe8, 0xe3, 0x02, 0x00, 0xe9, 0xe3, 0x02, 0x00, 0xeb, 0xe3, - 0x02, 0x00, 0xf0, 0xe3, 0x02, 0x00, 0xf1, 0xe3, 0x02, 0x00, 0xf9, 0xe3, - 0x02, 0x00, 0xfd, 0xe3, 0x02, 0x00, 0xb8, 0xec, 0x02, 0x00, 0xbc, 0xec, - 0x02, 0x00, 0xbe, 0xec, 0x02, 0x00, 0xbf, 0xec, 0x02, 0x00, 0xc9, 0xef, - 0x02, 0x00, 0xca, 0xef, 0x02, 0x00, 0xe9, 0xef, 0x02, 0x00, 0xea, 0xef, - 0x02, 0x00, 0xf0, 0xef, 0x02, 0x00, 0xf1, 0xef, 0x02, 0x00, 0xf9, 0xef, - 0x02, 0x00, 0xfd, 0xef, 0x02, 0x00, 0xe6, 0xf3, 0x02, 0x00, 0xe7, 0xf3, - 0x02, 0x00, 0xf6, 0xf3, 0x02, 0x00, 0xf7, 0xf3, 0x02, 0x00, 0xf8, 0xf3, - 0x02, 0x00, 0xfc, 0xf3, 0x02, 0x00, 0xfe, 0xf3, 0x02, 0x00, 0xff, 0xf3, - 0x02, 0x00, 0x88, 0xff, 0x02, 0x00, 0x8b, 0xff, 0x02, 0x00, 0xc6, 0xff, - 0x02, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xc8, 0xff, 0x02, 0x00, 0xcb, 0xff, - 0x02, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe8, 0xff, - 0x02, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, - 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfe, 0xff, - 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x73, 0x00, 0x03, 0x00, 0x7b, 0x00, - 0x03, 0x00, 0xbe, 0x00, 0x03, 0x00, 0xbf, 0x00, 0x03, 0x00, 0x73, 0x01, - 0x03, 0x00, 0x7b, 0x01, 0x03, 0x00, 0xbe, 0x04, 0x03, 0x00, 0xbf, 0x04, - 0x03, 0x00, 0xf4, 0x05, 0x03, 0x00, 0xf5, 0x05, 0x03, 0x00, 0xf8, 0x05, - 0x03, 0x00, 0xfc, 0x05, 0x03, 0x00, 0xfe, 0x05, 0x03, 0x00, 0xff, 0x05, - 0x03, 0x00, 0xb8, 0x06, 0x03, 0x00, 0x78, 0x08, 0x03, 0x00, 0x7c, 0x08, - 0x03, 0x00, 0x7e, 0x08, 0x03, 0x00, 0x7f, 0x08, 0x03, 0x00, 0xbe, 0x08, - 0x03, 0x00, 0xbf, 0x08, 0x03, 0x00, 0xf3, 0x09, 0x03, 0x00, 0xfb, 0x09, - 0x03, 0x00, 0xb4, 0x0a, 0x03, 0x00, 0xbe, 0x0a, 0x03, 0x00, 0xbf, 0x0a, - 0x03, 0x00, 0x78, 0x0b, 0x03, 0x00, 0x7c, 0x0b, 0x03, 0x00, 0x7e, 0x0b, - 0x03, 0x00, 0x7f, 0x0b, 0x03, 0x00, 0x88, 0x0b, 0x03, 0x00, 0xe8, 0x0b, - 0x03, 0x00, 0xf3, 0x0b, 0x03, 0x00, 0xfb, 0x0b, 0x03, 0x00, 0xf3, 0x0d, - 0x03, 0x00, 0xfb, 0x0d, 0x03, 0x00, 0xc8, 0x0f, 0x03, 0x00, 0xe8, 0x0f, - 0x03, 0x00, 0xf3, 0x0f, 0x03, 0x00, 0xfb, 0x0f, 0x03, 0x00, 0x7e, 0x10, - 0x03, 0x00, 0x7f, 0x10, 0x03, 0x00, 0xbe, 0x10, 0x03, 0x00, 0xbf, 0x10, - 0x03, 0x00, 0x74, 0x11, 0x03, 0x00, 0x75, 0x11, 0x03, 0x00, 0x78, 0x11, - 0x03, 0x00, 0x7c, 0x11, 0x03, 0x00, 0x7e, 0x11, 0x03, 0x00, 0x7f, 0x11, - 0x03, 0x00, 0xbe, 0x14, 0x03, 0x00, 0xbf, 0x14, 0x03, 0x00, 0xf4, 0x15, - 0x03, 0x00, 0xfe, 0x15, 0x03, 0x00, 0xff, 0x15, 0x03, 0x00, 0xb4, 0x16, - 0x03, 0x00, 0xbe, 0x16, 0x03, 0x00, 0xbf, 0x16, 0x03, 0x00, 0x88, 0x17, - 0x03, 0x00, 0x98, 0x17, 0x03, 0x00, 0x9c, 0x17, 0x03, 0x00, 0x9e, 0x17, - 0x03, 0x00, 0x9f, 0x17, 0x03, 0x00, 0xd8, 0x17, 0x03, 0x00, 0xdc, 0x17, - 0x03, 0x00, 0xde, 0x17, 0x03, 0x00, 0xdf, 0x17, 0x03, 0x00, 0x7e, 0x18, - 0x03, 0x00, 0x7f, 0x18, 0x03, 0x00, 0xbe, 0x18, 0x03, 0x00, 0xbf, 0x18, - 0x03, 0x00, 0xf3, 0x19, 0x03, 0x00, 0xfb, 0x19, 0x03, 0x00, 0xb8, 0x1a, - 0x03, 0x00, 0x78, 0x1b, 0x03, 0x00, 0xc8, 0x1b, 0x03, 0x00, 0xfe, 0x1b, - 0x03, 0x00, 0xff, 0x1b, 0x03, 0x00, 0xf8, 0x1d, 0x03, 0x00, 0xf4, 0x1f, - 0x03, 0x00, 0xf5, 0x1f, 0x03, 0x00, 0xf8, 0x1f, 0x03, 0x00, 0xfc, 0x1f, - 0x03, 0x00, 0xfe, 0x1f, 0x03, 0x00, 0xff, 0x1f, 0x03, 0x00, 0xb8, 0x26, - 0x03, 0x00, 0xbe, 0x2a, 0x03, 0x00, 0xbf, 0x2a, 0x03, 0x00, 0xf8, 0x2b, - 0x03, 0x00, 0xbe, 0x32, 0x03, 0x00, 0xbf, 0x32, 0x03, 0x00, 0xd1, 0x33, - 0x03, 0x00, 0xd6, 0x33, 0x03, 0x00, 0xd7, 0x33, 0x03, 0x00, 0xd9, 0x33, - 0x03, 0x00, 0xdd, 0x33, 0x03, 0x00, 0xe8, 0x33, 0x03, 0x00, 0xe9, 0x33, - 0x03, 0x00, 0xeb, 0x33, 0x03, 0x00, 0xf0, 0x33, 0x03, 0x00, 0xf1, 0x33, - 0x03, 0x00, 0xf9, 0x33, 0x03, 0x00, 0xfd, 0x33, 0x03, 0x00, 0xb1, 0x3a, - 0x03, 0x00, 0xb8, 0x3a, 0x03, 0x00, 0xe8, 0x3b, 0x03, 0x00, 0xe9, 0x3b, - 0x03, 0x00, 0xeb, 0x3b, 0x03, 0x00, 0xf0, 0x3b, 0x03, 0x00, 0xf1, 0x3b, - 0x03, 0x00, 0xf9, 0x3b, 0x03, 0x00, 0xfd, 0x3b, 0x03, 0x00, 0x78, 0x3c, - 0x03, 0x00, 0x7c, 0x3c, 0x03, 0x00, 0x7e, 0x3c, 0x03, 0x00, 0x7f, 0x3c, - 0x03, 0x00, 0x78, 0x3e, 0x03, 0x00, 0x7c, 0x3e, 0x03, 0x00, 0x7e, 0x3e, - 0x03, 0x00, 0x7f, 0x3e, 0x03, 0x00, 0x91, 0x3f, 0x03, 0x00, 0x96, 0x3f, - 0x03, 0x00, 0x97, 0x3f, 0x03, 0x00, 0x99, 0x3f, 0x03, 0x00, 0x9d, 0x3f, - 0x03, 0x00, 0xd1, 0x3f, 0x03, 0x00, 0xd6, 0x3f, 0x03, 0x00, 0xd7, 0x3f, - 0x03, 0x00, 0xd9, 0x3f, 0x03, 0x00, 0xdd, 0x3f, 0x03, 0x00, 0x77, 0x40, - 0x03, 0x00, 0x78, 0x40, 0x03, 0x00, 0x7c, 0x40, 0x03, 0x00, 0x7e, 0x40, - 0x03, 0x00, 0x7f, 0x40, 0x03, 0x00, 0xb0, 0x40, 0x03, 0x00, 0xb7, 0x40, - 0x03, 0x00, 0xbd, 0x40, 0x03, 0x00, 0xbe, 0x40, 0x03, 0x00, 0xbf, 0x40, - 0x03, 0x00, 0x77, 0x41, 0x03, 0x00, 0x78, 0x41, 0x03, 0x00, 0x7c, 0x41, - 0x03, 0x00, 0x7e, 0x41, 0x03, 0x00, 0x7f, 0x41, 0x03, 0x00, 0x78, 0x42, - 0x03, 0x00, 0x7c, 0x42, 0x03, 0x00, 0x7e, 0x42, 0x03, 0x00, 0x7f, 0x42, - 0x03, 0x00, 0xb1, 0x44, 0x03, 0x00, 0xb8, 0x44, 0x03, 0x00, 0xf7, 0x45, - 0x03, 0x00, 0xf8, 0x45, 0x03, 0x00, 0xfc, 0x45, 0x03, 0x00, 0xfe, 0x45, - 0x03, 0x00, 0xff, 0x45, 0x03, 0x00, 0xb1, 0x46, 0x03, 0x00, 0xb8, 0x46, - 0x03, 0x00, 0x7f, 0x48, 0x03, 0x00, 0xb1, 0x48, 0x03, 0x00, 0xb7, 0x48, - 0x03, 0x00, 0xb8, 0x48, 0x03, 0x00, 0xf7, 0x49, 0x03, 0x00, 0xbf, 0x4a, - 0x03, 0x00, 0xd0, 0x4b, 0x03, 0x00, 0xdf, 0x4b, 0x03, 0x00, 0xe7, 0x4b, - 0x03, 0x00, 0xeb, 0x4b, 0x03, 0x00, 0xf1, 0x4b, 0x03, 0x00, 0xf7, 0x4b, - 0x03, 0x00, 0xf8, 0x4b, 0x03, 0x00, 0x7f, 0x4c, 0x03, 0x00, 0xf7, 0x4d, - 0x03, 0x00, 0x78, 0x4e, 0x03, 0x00, 0x7c, 0x4e, 0x03, 0x00, 0x7e, 0x4e, - 0x03, 0x00, 0x7f, 0x4e, 0x03, 0x00, 0x1f, 0x4f, 0x03, 0x00, 0x78, 0x4f, - 0x03, 0x00, 0x7c, 0x4f, 0x03, 0x00, 0x7e, 0x4f, 0x03, 0x00, 0x7f, 0x4f, - 0x03, 0x00, 0xc7, 0x4f, 0x03, 0x00, 0xcb, 0x4f, 0x03, 0x00, 0xe7, 0x4f, - 0x03, 0x00, 0xeb, 0x4f, 0x03, 0x00, 0xf0, 0x4f, 0x03, 0x00, 0xf1, 0x4f, - 0x03, 0x00, 0xf7, 0x4f, 0x03, 0x00, 0xf9, 0x4f, 0x03, 0x00, 0xfd, 0x4f, - 0x03, 0x00, 0xf0, 0x51, 0x03, 0x00, 0xf1, 0x51, 0x03, 0x00, 0xf9, 0x51, - 0x03, 0x00, 0xfd, 0x51, 0x03, 0x00, 0xb0, 0x54, 0x03, 0x00, 0xbd, 0x54, - 0x03, 0x00, 0xbe, 0x54, 0x03, 0x00, 0xbf, 0x54, 0x03, 0x00, 0xff, 0x55, - 0x03, 0x00, 0xcb, 0x57, 0x03, 0x00, 0xeb, 0x57, 0x03, 0x00, 0xf8, 0x57, - 0x03, 0x00, 0xfc, 0x57, 0x03, 0x00, 0xfe, 0x57, 0x03, 0x00, 0xff, 0x57, - 0x03, 0x00, 0xb0, 0x58, 0x03, 0x00, 0xb7, 0x58, 0x03, 0x00, 0xbd, 0x58, - 0x03, 0x00, 0xbe, 0x58, 0x03, 0x00, 0xbf, 0x58, 0x03, 0x00, 0xf7, 0x59, - 0x03, 0x00, 0xf8, 0x59, 0x03, 0x00, 0xfc, 0x59, 0x03, 0x00, 0xfe, 0x59, - 0x03, 0x00, 0xff, 0x59, 0x03, 0x00, 0xb8, 0x5c, 0x03, 0x00, 0xf7, 0x5d, - 0x03, 0x00, 0xf8, 0x5d, 0x03, 0x00, 0xfc, 0x5d, 0x03, 0x00, 0xfe, 0x5d, - 0x03, 0x00, 0xff, 0x5d, 0x03, 0x00, 0xb8, 0x5e, 0x03, 0x00, 0xf7, 0x5f, - 0x03, 0x00, 0xf8, 0x5f, 0x03, 0x00, 0xfc, 0x5f, 0x03, 0x00, 0xfe, 0x5f, - 0x03, 0x00, 0xff, 0x5f, 0x03, 0x00, 0x74, 0x60, 0x03, 0x00, 0x7e, 0x60, - 0x03, 0x00, 0x7f, 0x60, 0x03, 0x00, 0xb8, 0x60, 0x03, 0x00, 0x73, 0x61, - 0x03, 0x00, 0x7b, 0x61, 0x03, 0x00, 0xbe, 0x64, 0x03, 0x00, 0xbf, 0x64, - 0x03, 0x00, 0xf3, 0x65, 0x03, 0x00, 0xfb, 0x65, 0x03, 0x00, 0xff, 0x65, - 0x03, 0x00, 0xb3, 0x66, 0x03, 0x00, 0xbb, 0x66, 0x03, 0x00, 0xbf, 0x66, - 0x03, 0x00, 0x74, 0x68, 0x03, 0x00, 0x7e, 0x68, 0x03, 0x00, 0x7f, 0x68, - 0x03, 0x00, 0xb8, 0x68, 0x03, 0x00, 0xf3, 0x69, 0x03, 0x00, 0xfb, 0x69, - 0x03, 0x00, 0xb8, 0x6a, 0x03, 0x00, 0x7e, 0x6b, 0x03, 0x00, 0x7f, 0x6b, - 0x03, 0x00, 0xce, 0x6b, 0x03, 0x00, 0xcf, 0x6b, 0x03, 0x00, 0xf8, 0x6b, - 0x03, 0x00, 0xf8, 0x6d, 0x03, 0x00, 0xf3, 0x6f, 0x03, 0x00, 0xfb, 0x6f, - 0x03, 0x00, 0x74, 0x70, 0x03, 0x00, 0xbe, 0x70, 0x03, 0x00, 0xbf, 0x70, - 0x03, 0x00, 0x13, 0x71, 0x03, 0x00, 0x1f, 0x71, 0x03, 0x00, 0x78, 0x71, - 0x03, 0x00, 0x7c, 0x71, 0x03, 0x00, 0x7e, 0x71, 0x03, 0x00, 0x7f, 0x71, - 0x03, 0x00, 0xbe, 0x74, 0x03, 0x00, 0xbf, 0x74, 0x03, 0x00, 0xf3, 0x75, - 0x03, 0x00, 0xfb, 0x75, 0x03, 0x00, 0xff, 0x75, 0x03, 0x00, 0xb3, 0x76, - 0x03, 0x00, 0xbb, 0x76, 0x03, 0x00, 0xbf, 0x76, 0x03, 0x00, 0x74, 0x78, - 0x03, 0x00, 0xbe, 0x78, 0x03, 0x00, 0xbf, 0x78, 0x03, 0x00, 0xff, 0x79, - 0x03, 0x00, 0xb3, 0x7a, 0x03, 0x00, 0xbb, 0x7a, 0x03, 0x00, 0xbf, 0x7a, - 0x03, 0x00, 0x78, 0x7b, 0x03, 0x00, 0xfe, 0x7b, 0x03, 0x00, 0xff, 0x7b, - 0x03, 0x00, 0xf3, 0x7d, 0x03, 0x00, 0xfb, 0x7d, 0x03, 0x00, 0xff, 0x7d, - 0x03, 0x00, 0xf8, 0x7f, 0x03, 0x00, 0xfc, 0x7f, 0x03, 0x00, 0xfe, 0x7f, - 0x03, 0x00, 0xff, 0x7f, 0x03, 0x00, 0x70, 0x84, 0x03, 0x00, 0x71, 0x84, - 0x03, 0x00, 0x73, 0x84, 0x03, 0x00, 0x79, 0x84, 0x03, 0x00, 0x7b, 0x84, - 0x03, 0x00, 0x7d, 0x84, 0x03, 0x00, 0x78, 0x85, 0x03, 0x00, 0x7c, 0x85, - 0x03, 0x00, 0x7e, 0x85, 0x03, 0x00, 0x7f, 0x85, 0x03, 0x00, 0x72, 0x86, - 0x03, 0x00, 0x74, 0x86, 0x03, 0x00, 0x75, 0x86, 0x03, 0x00, 0x76, 0x86, - 0x03, 0x00, 0x77, 0x86, 0x03, 0x00, 0x78, 0x86, 0x03, 0x00, 0x7a, 0x86, - 0x03, 0x00, 0x7c, 0x86, 0x03, 0x00, 0x7e, 0x86, 0x03, 0x00, 0x7f, 0x86, - 0x03, 0x00, 0x76, 0x87, 0x03, 0x00, 0x77, 0x87, 0x03, 0x00, 0x78, 0x87, - 0x03, 0x00, 0x7c, 0x87, 0x03, 0x00, 0x7e, 0x87, 0x03, 0x00, 0x7f, 0x87, - 0x03, 0x00, 0xf2, 0x87, 0x03, 0x00, 0xf4, 0x87, 0x03, 0x00, 0xf5, 0x87, - 0x03, 0x00, 0xf6, 0x87, 0x03, 0x00, 0xf7, 0x87, 0x03, 0x00, 0xf8, 0x87, - 0x03, 0x00, 0xfa, 0x87, 0x03, 0x00, 0xfc, 0x87, 0x03, 0x00, 0xfe, 0x87, - 0x03, 0x00, 0xff, 0x87, 0x03, 0x00, 0x72, 0x8a, 0x03, 0x00, 0x74, 0x8a, - 0x03, 0x00, 0x75, 0x8a, 0x03, 0x00, 0x76, 0x8a, 0x03, 0x00, 0x77, 0x8a, - 0x03, 0x00, 0x78, 0x8a, 0x03, 0x00, 0x7a, 0x8a, 0x03, 0x00, 0x7c, 0x8a, - 0x03, 0x00, 0x7e, 0x8a, 0x03, 0x00, 0x7f, 0x8a, 0x03, 0x00, 0x90, 0x8b, - 0x03, 0x00, 0x98, 0x8b, 0x03, 0x00, 0x9a, 0x8b, 0x03, 0x00, 0x9c, 0x8b, - 0x03, 0x00, 0x9e, 0x8b, 0x03, 0x00, 0x9f, 0x8b, 0x03, 0x00, 0xc8, 0x93, - 0x03, 0x00, 0xfe, 0x93, 0x03, 0x00, 0xff, 0x93, 0x03, 0x00, 0xbe, 0x9a, - 0x03, 0x00, 0xbf, 0x9a, 0x03, 0x00, 0xc5, 0x9b, 0x03, 0x00, 0xcf, 0x9b, - 0x03, 0x00, 0xf8, 0x9b, 0x03, 0x00, 0x78, 0xa4, 0x03, 0x00, 0x7c, 0xa4, - 0x03, 0x00, 0x7e, 0xa4, 0x03, 0x00, 0x7f, 0xa4, 0x03, 0x00, 0x78, 0xa6, - 0x03, 0x00, 0x7c, 0xa6, 0x03, 0x00, 0x7e, 0xa6, 0x03, 0x00, 0x7f, 0xa6, - 0x03, 0x00, 0xc8, 0xa7, 0x03, 0x00, 0xcb, 0xa7, 0x03, 0x00, 0xe8, 0xa7, - 0x03, 0x00, 0xeb, 0xa7, 0x03, 0x00, 0x78, 0xaa, 0x03, 0x00, 0xbe, 0xb2, - 0x03, 0x00, 0xbf, 0xb2, 0x03, 0x00, 0x88, 0xb3, 0x03, 0x00, 0x8b, 0xb3, - 0x03, 0x00, 0xd1, 0xb3, 0x03, 0x00, 0xd6, 0xb3, 0x03, 0x00, 0xd7, 0xb3, - 0x03, 0x00, 0xd9, 0xb3, 0x03, 0x00, 0xdd, 0xb3, 0x03, 0x00, 0xe8, 0xb3, - 0x03, 0x00, 0xe9, 0xb3, 0x03, 0x00, 0xeb, 0xb3, 0x03, 0x00, 0xf0, 0xb3, - 0x03, 0x00, 0xf1, 0xb3, 0x03, 0x00, 0xf9, 0xb3, 0x03, 0x00, 0xfd, 0xb3, - 0x03, 0x00, 0x76, 0xba, 0x03, 0x00, 0x77, 0xba, 0x03, 0x00, 0x78, 0xba, - 0x03, 0x00, 0x7c, 0xba, 0x03, 0x00, 0x7e, 0xba, 0x03, 0x00, 0x7f, 0xba, - 0x03, 0x00, 0x90, 0xbb, 0x03, 0x00, 0x98, 0xbb, 0x03, 0x00, 0x9c, 0xbb, - 0x03, 0x00, 0x9e, 0xbb, 0x03, 0x00, 0x9f, 0xbb, 0x03, 0x00, 0xbe, 0xbc, - 0x03, 0x00, 0xbf, 0xbc, 0x03, 0x00, 0xbe, 0xbe, 0x03, 0x00, 0xbf, 0xbe, - 0x03, 0x00, 0x88, 0xbf, 0x03, 0x00, 0x8b, 0xbf, 0x03, 0x00, 0x91, 0xbf, - 0x03, 0x00, 0x96, 0xbf, 0x03, 0x00, 0x97, 0xbf, 0x03, 0x00, 0x99, 0xbf, - 0x03, 0x00, 0x9d, 0xbf, 0x03, 0x00, 0xd1, 0xbf, 0x03, 0x00, 0xd6, 0xbf, - 0x03, 0x00, 0xd7, 0xbf, 0x03, 0x00, 0xd9, 0xbf, 0x03, 0x00, 0xdd, 0xbf, - 0x03, 0x00, 0xb0, 0xc6, 0x03, 0x00, 0xb6, 0xc6, 0x03, 0x00, 0xbe, 0xc6, - 0x03, 0x00, 0xb1, 0xca, 0x03, 0x00, 0xb8, 0xca, 0x03, 0x00, 0xe6, 0xcb, - 0x03, 0x00, 0xe8, 0xcb, 0x03, 0x00, 0xf0, 0xcb, 0x03, 0x00, 0xf6, 0xcb, - 0x03, 0x00, 0xfe, 0xcb, 0x03, 0x00, 0xc8, 0xd3, 0x03, 0x00, 0xf3, 0xd3, - 0x03, 0x00, 0xfb, 0xd3, 0x03, 0x00, 0xbe, 0xda, 0x03, 0x00, 0xbf, 0xda, - 0x03, 0x00, 0xc4, 0xdb, 0x03, 0x00, 0xc5, 0xdb, 0x03, 0x00, 0xce, 0xdb, - 0x03, 0x00, 0xcf, 0xdb, 0x03, 0x00, 0xf4, 0xdb, 0x03, 0x00, 0xf5, 0xdb, - 0x03, 0x00, 0xf8, 0xdb, 0x03, 0x00, 0xfc, 0xdb, 0x03, 0x00, 0xfe, 0xdb, - 0x03, 0x00, 0xff, 0xdb, 0x03, 0x00, 0xb1, 0xe6, 0x03, 0x00, 0xb8, 0xe6, - 0x03, 0x00, 0x8e, 0xe7, 0x03, 0x00, 0xb0, 0xea, 0x03, 0x00, 0xb6, 0xea, - 0x03, 0x00, 0xbe, 0xea, 0x03, 0x00, 0xf0, 0xeb, 0x03, 0x00, 0xf6, 0xeb, - 0x03, 0x00, 0xfe, 0xeb, 0x03, 0x00, 0xb4, 0xf2, 0x03, 0x00, 0xbe, 0xf2, - 0x03, 0x00, 0xbf, 0xf2, 0x03, 0x00, 0xd6, 0xf3, 0x03, 0x00, 0xde, 0xf3, - 0x03, 0x00, 0xe6, 0xf3, 0x03, 0x00, 0xe8, 0xf3, 0x03, 0x00, 0xf0, 0xf3, - 0x03, 0x00, 0xf6, 0xf3, 0x03, 0x00, 0xfe, 0xf3, 0x03, 0x00, 0x1f, 0xf9, - 0x03, 0x00, 0xb1, 0xfa, 0x03, 0x00, 0xb8, 0xfa, 0x03, 0x00, 0xe6, 0xfb, - 0x03, 0x00, 0xe8, 0xfb, 0x03, 0x00, 0xf0, 0xfb, 0x03, 0x00, 0xf6, 0xfb, - 0x03, 0x00, 0xfe, 0xfb, 0x03, 0x00, 0x78, 0xfc, 0x03, 0x00, 0x1f, 0xfd, - 0x03, 0x00, 0x78, 0xfd, 0x03, 0x00, 0x73, 0xfe, 0x03, 0x00, 0x7b, 0xfe, - 0x03, 0x00, 0x18, 0xff, 0x03, 0x00, 0x1c, 0xff, 0x03, 0x00, 0x1e, 0xff, - 0x03, 0x00, 0x1f, 0xff, 0x03, 0x00, 0x96, 0xff, 0x03, 0x00, 0x98, 0xff, - 0x03, 0x00, 0x9a, 0xff, 0x03, 0x00, 0x9c, 0xff, 0x03, 0x00, 0x9e, 0xff, - 0x03, 0x00, 0x9f, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd8, 0xff, - 0x03, 0x00, 0xda, 0xff, 0x03, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xde, 0xff, - 0x03, 0x00, 0xdf, 0xff, 0x03, 0x00, 0x78, 0x00, 0x04, 0x00, 0x7c, 0x00, - 0x04, 0x00, 0x7e, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x04, 0x00, 0xb8, 0x00, - 0x04, 0x00, 0xbc, 0x00, 0x04, 0x00, 0xbe, 0x00, 0x04, 0x00, 0xbf, 0x00, - 0x04, 0x00, 0xb8, 0x04, 0x04, 0x00, 0xbc, 0x04, 0x04, 0x00, 0xbe, 0x04, - 0x04, 0x00, 0xbf, 0x04, 0x04, 0x00, 0xb8, 0x06, 0x04, 0x00, 0xbc, 0x06, - 0x04, 0x00, 0xbe, 0x06, 0x04, 0x00, 0xbf, 0x06, 0x04, 0x00, 0xdf, 0x0b, - 0x04, 0x00, 0xeb, 0x0b, 0x04, 0x00, 0xff, 0x0d, 0x04, 0x00, 0xcb, 0x0f, - 0x04, 0x00, 0xeb, 0x0f, 0x04, 0x00, 0xb8, 0x10, 0x04, 0x00, 0xb8, 0x14, - 0x04, 0x00, 0xbc, 0x14, 0x04, 0x00, 0xbe, 0x14, 0x04, 0x00, 0xbf, 0x14, - 0x04, 0x00, 0xbf, 0x16, 0x04, 0x00, 0x1f, 0x17, 0x04, 0x00, 0xcb, 0x17, - 0x04, 0x00, 0xeb, 0x17, 0x04, 0x00, 0x78, 0x18, 0x04, 0x00, 0x7c, 0x18, - 0x04, 0x00, 0x7e, 0x18, 0x04, 0x00, 0x7f, 0x18, 0x04, 0x00, 0xbe, 0x18, - 0x04, 0x00, 0xbf, 0x18, 0x04, 0x00, 0xb8, 0x1a, 0x04, 0x00, 0xbc, 0x1a, - 0x04, 0x00, 0xbe, 0x1a, 0x04, 0x00, 0xbf, 0x1a, 0x04, 0x00, 0xeb, 0x1b, - 0x04, 0x00, 0x8b, 0x27, 0x04, 0x00, 0xf8, 0x29, 0x04, 0x00, 0xfc, 0x29, - 0x04, 0x00, 0xfe, 0x29, 0x04, 0x00, 0xff, 0x29, 0x04, 0x00, 0xf8, 0x2d, - 0x04, 0x00, 0xfc, 0x2d, 0x04, 0x00, 0xfe, 0x2d, 0x04, 0x00, 0xff, 0x2d, - 0x04, 0x00, 0xcb, 0x2f, 0x04, 0x00, 0xeb, 0x2f, 0x04, 0x00, 0xf8, 0x2f, - 0x04, 0x00, 0xfc, 0x2f, 0x04, 0x00, 0xfe, 0x2f, 0x04, 0x00, 0xff, 0x2f, - 0x04, 0x00, 0xf7, 0x31, 0x04, 0x00, 0x78, 0x32, 0x04, 0x00, 0x7c, 0x32, - 0x04, 0x00, 0x7e, 0x32, 0x04, 0x00, 0x7f, 0x32, 0x04, 0x00, 0x8b, 0x33, - 0x04, 0x00, 0x90, 0x33, 0x04, 0x00, 0x91, 0x33, 0x04, 0x00, 0x96, 0x33, - 0x04, 0x00, 0x97, 0x33, 0x04, 0x00, 0x9f, 0x33, 0x04, 0x00, 0x6b, 0x35, - 0x04, 0x00, 0x87, 0x37, 0x04, 0x00, 0xff, 0x39, 0x04, 0x00, 0x87, 0x3b, - 0x04, 0x00, 0x7f, 0x3c, 0x04, 0x00, 0xf7, 0x3d, 0x04, 0x00, 0xf8, 0x3f, - 0x04, 0x00, 0xfc, 0x3f, 0x04, 0x00, 0xfe, 0x3f, 0x04, 0x00, 0xff, 0x3f, - 0x04, 0x00, 0x70, 0x44, 0x04, 0x00, 0x71, 0x44, 0x04, 0x00, 0x79, 0x44, - 0x04, 0x00, 0x7d, 0x44, 0x04, 0x00, 0xf7, 0x45, 0x04, 0x00, 0xf8, 0x45, - 0x04, 0x00, 0xfc, 0x45, 0x04, 0x00, 0xfe, 0x45, 0x04, 0x00, 0xff, 0x45, - 0x04, 0x00, 0x77, 0x46, 0x04, 0x00, 0x78, 0x46, 0x04, 0x00, 0x7c, 0x46, - 0x04, 0x00, 0x7e, 0x46, 0x04, 0x00, 0x7f, 0x46, 0x04, 0x00, 0x87, 0x47, - 0x04, 0x00, 0x9f, 0x47, 0x04, 0x00, 0xdf, 0x47, 0x04, 0x00, 0x70, 0x4a, - 0x04, 0x00, 0x71, 0x4a, 0x04, 0x00, 0x77, 0x4a, 0x04, 0x00, 0x79, 0x4a, - 0x04, 0x00, 0x7d, 0x4a, 0x04, 0x00, 0x87, 0x4b, 0x04, 0x00, 0x8b, 0x4b, - 0x04, 0x00, 0x91, 0x4b, 0x04, 0x00, 0x96, 0x4b, 0x04, 0x00, 0x97, 0x4b, - 0x04, 0x00, 0x9f, 0x4b, 0x04, 0x00, 0xb8, 0x52, 0x04, 0x00, 0xbc, 0x52, - 0x04, 0x00, 0xbe, 0x52, 0x04, 0x00, 0xbf, 0x52, 0x04, 0x00, 0xdf, 0x53, - 0x04, 0x00, 0xe7, 0x53, 0x04, 0x00, 0xeb, 0x53, 0x04, 0x00, 0xf7, 0x53, - 0x04, 0x00, 0xf8, 0x53, 0x04, 0x00, 0xfc, 0x53, 0x04, 0x00, 0xfe, 0x53, - 0x04, 0x00, 0xff, 0x53, 0x04, 0x00, 0xb7, 0x58, 0x04, 0x00, 0xb8, 0x58, - 0x04, 0x00, 0xbc, 0x58, 0x04, 0x00, 0xbe, 0x58, 0x04, 0x00, 0xbf, 0x58, - 0x04, 0x00, 0xb0, 0x5a, 0x04, 0x00, 0xb1, 0x5a, 0x04, 0x00, 0xb9, 0x5a, - 0x04, 0x00, 0xbd, 0x5a, 0x04, 0x00, 0xe7, 0x5b, 0x04, 0x00, 0xeb, 0x5b, - 0x04, 0x00, 0xf7, 0x5b, 0x04, 0x00, 0xf8, 0x5b, 0x04, 0x00, 0xfc, 0x5b, - 0x04, 0x00, 0xfe, 0x5b, 0x04, 0x00, 0xff, 0x5b, 0x04, 0x00, 0xb8, 0x5c, - 0x04, 0x00, 0xbc, 0x5c, 0x04, 0x00, 0xbe, 0x5c, 0x04, 0x00, 0xbf, 0x5c, - 0x04, 0x00, 0xb8, 0x5e, 0x04, 0x00, 0xbc, 0x5e, 0x04, 0x00, 0xbe, 0x5e, - 0x04, 0x00, 0xbf, 0x5e, 0x04, 0x00, 0x90, 0x5f, 0x04, 0x00, 0x91, 0x5f, - 0x04, 0x00, 0x96, 0x5f, 0x04, 0x00, 0x97, 0x5f, 0x04, 0x00, 0xd0, 0x5f, - 0x04, 0x00, 0xd1, 0x5f, 0x04, 0x00, 0xd6, 0x5f, 0x04, 0x00, 0xd7, 0x5f, - 0x04, 0x00, 0x73, 0x64, 0x04, 0x00, 0x7b, 0x64, 0x04, 0x00, 0xff, 0x65, - 0x04, 0x00, 0x73, 0x66, 0x04, 0x00, 0x7b, 0x66, 0x04, 0x00, 0x83, 0x67, - 0x04, 0x00, 0x8e, 0x67, 0x04, 0x00, 0x8f, 0x67, 0x04, 0x00, 0x9b, 0x67, - 0x04, 0x00, 0xdb, 0x67, 0x04, 0x00, 0x78, 0x6a, 0x04, 0x00, 0x7c, 0x6a, - 0x04, 0x00, 0x7e, 0x6a, 0x04, 0x00, 0x7f, 0x6a, 0x04, 0x00, 0x84, 0x6b, - 0x04, 0x00, 0xd5, 0x73, 0x04, 0x00, 0xee, 0x73, 0x04, 0x00, 0xef, 0x73, - 0x04, 0x00, 0xf8, 0x73, 0x04, 0x00, 0xfc, 0x73, 0x04, 0x00, 0xfe, 0x73, - 0x04, 0x00, 0xff, 0x73, 0x04, 0x00, 0x73, 0x7a, 0x04, 0x00, 0x7b, 0x7a, - 0x04, 0x00, 0x84, 0x7b, 0x04, 0x00, 0x8e, 0x7b, 0x04, 0x00, 0x8f, 0x7b, - 0x04, 0x00, 0x95, 0x7b, 0x04, 0x00, 0x9b, 0x7f, 0x04, 0x00, 0xdb, 0x7f, - 0x04, 0x00, 0x71, 0x80, 0x04, 0x00, 0x73, 0x80, 0x04, 0x00, 0x79, 0x80, - 0x04, 0x00, 0x7b, 0x80, 0x04, 0x00, 0x7d, 0x80, 0x04, 0x00, 0xb1, 0x80, - 0x04, 0x00, 0xb8, 0x80, 0x04, 0x00, 0x72, 0x81, 0x04, 0x00, 0x77, 0x81, - 0x04, 0x00, 0x78, 0x81, 0x04, 0x00, 0x7a, 0x81, 0x04, 0x00, 0x7c, 0x81, - 0x04, 0x00, 0x7e, 0x81, 0x04, 0x00, 0x7f, 0x81, 0x04, 0x00, 0xf1, 0x81, - 0x04, 0x00, 0xf3, 0x81, 0x04, 0x00, 0xf9, 0x81, 0x04, 0x00, 0xfb, 0x81, - 0x04, 0x00, 0xfd, 0x81, 0x04, 0x00, 0xcd, 0x83, 0x04, 0x00, 0xf2, 0x83, - 0x04, 0x00, 0xf7, 0x83, 0x04, 0x00, 0xf8, 0x83, 0x04, 0x00, 0xfa, 0x83, - 0x04, 0x00, 0xfc, 0x83, 0x04, 0x00, 0xfe, 0x83, 0x04, 0x00, 0xff, 0x83, - 0x04, 0x00, 0x71, 0x84, 0x04, 0x00, 0x73, 0x84, 0x04, 0x00, 0x79, 0x84, - 0x04, 0x00, 0x7b, 0x84, 0x04, 0x00, 0x7d, 0x84, 0x04, 0x00, 0xb1, 0x84, - 0x04, 0x00, 0xb8, 0x84, 0x04, 0x00, 0xcd, 0x85, 0x04, 0x00, 0xf2, 0x85, - 0x04, 0x00, 0xf7, 0x85, 0x04, 0x00, 0xf8, 0x85, 0x04, 0x00, 0xfa, 0x85, - 0x04, 0x00, 0xfc, 0x85, 0x04, 0x00, 0xfe, 0x85, 0x04, 0x00, 0xff, 0x85, - 0x04, 0x00, 0x71, 0x86, 0x04, 0x00, 0x73, 0x86, 0x04, 0x00, 0x79, 0x86, - 0x04, 0x00, 0x7b, 0x86, 0x04, 0x00, 0x7d, 0x86, 0x04, 0x00, 0xb1, 0x86, - 0x04, 0x00, 0xb8, 0x86, 0x04, 0x00, 0x70, 0x87, 0x04, 0x00, 0x71, 0x87, - 0x04, 0x00, 0x79, 0x87, 0x04, 0x00, 0x7d, 0x87, 0x04, 0x00, 0xf1, 0x87, - 0x04, 0x00, 0xf3, 0x87, 0x04, 0x00, 0xf9, 0x87, 0x04, 0x00, 0xfb, 0x87, - 0x04, 0x00, 0xfd, 0x87, 0x04, 0x00, 0x7f, 0x88, 0x04, 0x00, 0xb0, 0x88, - 0x04, 0x00, 0xbe, 0x88, 0x04, 0x00, 0x03, 0x89, 0x04, 0x00, 0x72, 0x8a, - 0x04, 0x00, 0x78, 0x8a, 0x04, 0x00, 0x7a, 0x8a, 0x04, 0x00, 0x7c, 0x8a, - 0x04, 0x00, 0x7e, 0x8a, 0x04, 0x00, 0x7f, 0x8a, 0x04, 0x00, 0xb3, 0x8a, - 0x04, 0x00, 0xbb, 0x8a, 0x04, 0x00, 0xbf, 0x8a, 0x04, 0x00, 0x11, 0x8b, - 0x04, 0x00, 0x16, 0x8b, 0x04, 0x00, 0x17, 0x8b, 0x04, 0x00, 0x1f, 0x8b, - 0x04, 0x00, 0x78, 0x8b, 0x04, 0x00, 0x7c, 0x8b, 0x04, 0x00, 0x7e, 0x8b, - 0x04, 0x00, 0x7f, 0x8b, 0x04, 0x00, 0x90, 0x8b, 0x04, 0x00, 0x03, 0x8d, - 0x04, 0x00, 0xd6, 0x8f, 0x04, 0x00, 0xdf, 0x8f, 0x04, 0x00, 0xe7, 0x8f, - 0x04, 0x00, 0xf1, 0x8f, 0x04, 0x00, 0xf3, 0x8f, 0x04, 0x00, 0xf7, 0x8f, - 0x04, 0x00, 0xf9, 0x8f, 0x04, 0x00, 0xfb, 0x8f, 0x04, 0x00, 0xfd, 0x8f, - 0x04, 0x00, 0xce, 0x93, 0x04, 0x00, 0xcf, 0x93, 0x04, 0x00, 0xf8, 0x93, - 0x04, 0x00, 0xf3, 0x95, 0x04, 0x00, 0xfb, 0x95, 0x04, 0x00, 0xff, 0x95, - 0x04, 0x00, 0x84, 0x97, 0x04, 0x00, 0x8e, 0x97, 0x04, 0x00, 0x8f, 0x97, - 0x04, 0x00, 0xb4, 0x9a, 0x04, 0x00, 0xbe, 0x9a, 0x04, 0x00, 0xbf, 0x9a, - 0x04, 0x00, 0xc4, 0x9b, 0x04, 0x00, 0xf4, 0x9b, 0x04, 0x00, 0xfe, 0x9b, - 0x04, 0x00, 0xff, 0x9b, 0x04, 0x00, 0xf3, 0x9f, 0x04, 0x00, 0xfb, 0x9f, - 0x04, 0x00, 0x0b, 0xa7, 0x04, 0x00, 0x9f, 0xa7, 0x04, 0x00, 0xb8, 0xaa, - 0x04, 0x00, 0xce, 0xab, 0x04, 0x00, 0xcf, 0xab, 0x04, 0x00, 0xf8, 0xab, - 0x04, 0x00, 0x78, 0xb2, 0x04, 0x00, 0x7c, 0xb2, 0x04, 0x00, 0x7e, 0xb2, - 0x04, 0x00, 0x7f, 0xb2, 0x04, 0x00, 0xb3, 0xb2, 0x04, 0x00, 0xbb, 0xb2, - 0x04, 0x00, 0xbf, 0xb2, 0x04, 0x00, 0x1f, 0xb3, 0x04, 0x00, 0x78, 0xb3, - 0x04, 0x00, 0x7c, 0xb3, 0x04, 0x00, 0x7e, 0xb3, 0x04, 0x00, 0x7f, 0xb3, - 0x04, 0x00, 0x96, 0xb3, 0x04, 0x00, 0x9f, 0xb3, 0x04, 0x00, 0x1f, 0xb9, - 0x04, 0x00, 0x6b, 0xb9, 0x04, 0x00, 0x78, 0xb9, 0x04, 0x00, 0x7c, 0xb9, - 0x04, 0x00, 0x7e, 0xb9, 0x04, 0x00, 0x7f, 0xb9, 0x04, 0x00, 0xc3, 0xb9, - 0x04, 0x00, 0xf3, 0xb9, 0x04, 0x00, 0xf7, 0xb9, 0x04, 0x00, 0xfb, 0xb9, - 0x04, 0x00, 0x07, 0xbb, 0x04, 0x00, 0x0b, 0xbb, 0x04, 0x00, 0xd0, 0xbb, - 0x04, 0x00, 0xe1, 0xbb, 0x04, 0x00, 0xe2, 0xbb, 0x04, 0x00, 0xed, 0xbb, - 0x04, 0x00, 0xee, 0xbb, 0x04, 0x00, 0xef, 0xbb, 0x04, 0x00, 0xf2, 0xbb, - 0x04, 0x00, 0xf8, 0xbb, 0x04, 0x00, 0xfa, 0xbb, 0x04, 0x00, 0xfc, 0xbb, - 0x04, 0x00, 0xfe, 0xbb, 0x04, 0x00, 0xff, 0xbb, 0x04, 0x00, 0x7f, 0xbc, - 0x04, 0x00, 0xbe, 0xbc, 0x04, 0x00, 0xbf, 0xbc, 0x04, 0x00, 0x1f, 0xbd, - 0x04, 0x00, 0x6b, 0xbd, 0x04, 0x00, 0x78, 0xbd, 0x04, 0x00, 0x7c, 0xbd, - 0x04, 0x00, 0x7e, 0xbd, 0x04, 0x00, 0x7f, 0xbd, 0x04, 0x00, 0xc3, 0xbd, - 0x04, 0x00, 0xf3, 0xbd, 0x04, 0x00, 0xf7, 0xbd, 0x04, 0x00, 0xfb, 0xbd, - 0x04, 0x00, 0x78, 0xbe, 0x04, 0x00, 0x7c, 0xbe, 0x04, 0x00, 0x7e, 0xbe, - 0x04, 0x00, 0x7f, 0xbe, 0x04, 0x00, 0xb3, 0xbe, 0x04, 0x00, 0xbb, 0xbe, - 0x04, 0x00, 0xbf, 0xbe, 0x04, 0x00, 0x1f, 0xbf, 0x04, 0x00, 0x78, 0xbf, - 0x04, 0x00, 0x7c, 0xbf, 0x04, 0x00, 0x7e, 0xbf, 0x04, 0x00, 0x7f, 0xbf, - 0x04, 0x00, 0x96, 0xbf, 0x04, 0x00, 0x9f, 0xbf, 0x04, 0x00, 0xc6, 0xc3, - 0x04, 0x00, 0xc7, 0xc3, 0x04, 0x00, 0xf6, 0xc3, 0x04, 0x00, 0xf7, 0xc3, - 0x04, 0x00, 0xf8, 0xc3, 0x04, 0x00, 0xfc, 0xc3, 0x04, 0x00, 0xfe, 0xc3, - 0x04, 0x00, 0xff, 0xc3, 0x04, 0x00, 0xc6, 0xc5, 0x04, 0x00, 0xc7, 0xc5, - 0x04, 0x00, 0xf6, 0xc5, 0x04, 0x00, 0xf7, 0xc5, 0x04, 0x00, 0xf8, 0xc5, - 0x04, 0x00, 0xfc, 0xc5, 0x04, 0x00, 0xfe, 0xc5, 0x04, 0x00, 0xff, 0xc5, - 0x04, 0x00, 0x0b, 0xc9, 0x04, 0x00, 0xb1, 0xca, 0x04, 0x00, 0xb8, 0xca, - 0x04, 0x00, 0xe6, 0xcb, 0x04, 0x00, 0xe7, 0xcb, 0x04, 0x00, 0xe8, 0xcb, - 0x04, 0x00, 0xe9, 0xcb, 0x04, 0x00, 0xeb, 0xcb, 0x04, 0x00, 0xf0, 0xcb, - 0x04, 0x00, 0xf6, 0xcb, 0x04, 0x00, 0xf7, 0xcb, 0x04, 0x00, 0xfd, 0xcb, - 0x04, 0x00, 0xfe, 0xcb, 0x04, 0x00, 0xff, 0xcb, 0x04, 0x00, 0x0b, 0xcd, - 0x04, 0x00, 0xf0, 0xcf, 0x04, 0x00, 0xf1, 0xcf, 0x04, 0x00, 0xf9, 0xcf, - 0x04, 0x00, 0xfd, 0xcf, 0x04, 0x00, 0xc8, 0xd3, 0x04, 0x00, 0xcb, 0xd3, - 0x04, 0x00, 0xf8, 0xd5, 0x04, 0x00, 0xfc, 0xd5, 0x04, 0x00, 0xfe, 0xd5, - 0x04, 0x00, 0xff, 0xd5, 0x04, 0x00, 0xf8, 0xdb, 0x04, 0x00, 0xfc, 0xdb, - 0x04, 0x00, 0xfe, 0xdb, 0x04, 0x00, 0xff, 0xdb, 0x04, 0x00, 0xc8, 0xdf, - 0x04, 0x00, 0xcb, 0xdf, 0x04, 0x00, 0xbe, 0xe2, 0x04, 0x00, 0xbf, 0xe2, - 0x04, 0x00, 0xf1, 0xe3, 0x04, 0x00, 0xf8, 0xe3, 0x04, 0x00, 0xf0, 0xe5, - 0x04, 0x00, 0xf7, 0xe5, 0x04, 0x00, 0xfd, 0xe5, 0x04, 0x00, 0xfe, 0xe5, - 0x04, 0x00, 0xff, 0xe5, 0x04, 0x00, 0xb0, 0xea, 0x04, 0x00, 0xb6, 0xea, - 0x04, 0x00, 0xb7, 0xea, 0x04, 0x00, 0xbd, 0xea, 0x04, 0x00, 0xbe, 0xea, - 0x04, 0x00, 0xbf, 0xea, 0x04, 0x00, 0xc6, 0xeb, 0x04, 0x00, 0xc7, 0xeb, - 0x04, 0x00, 0xc8, 0xeb, 0x04, 0x00, 0xc9, 0xeb, 0x04, 0x00, 0xcb, 0xeb, - 0x04, 0x00, 0xf0, 0xeb, 0x04, 0x00, 0xf6, 0xeb, 0x04, 0x00, 0xf7, 0xeb, - 0x04, 0x00, 0xfd, 0xeb, 0x04, 0x00, 0xfe, 0xeb, 0x04, 0x00, 0xff, 0xeb, - 0x04, 0x00, 0xf0, 0xef, 0x04, 0x00, 0xf1, 0xef, 0x04, 0x00, 0xf9, 0xef, - 0x04, 0x00, 0xfd, 0xef, 0x04, 0x00, 0xbe, 0xf2, 0x04, 0x00, 0xbf, 0xf2, - 0x04, 0x00, 0xd1, 0xf3, 0x04, 0x00, 0xd6, 0xf3, 0x04, 0x00, 0xd7, 0xf3, - 0x04, 0x00, 0xdd, 0xf3, 0x04, 0x00, 0xde, 0xf3, 0x04, 0x00, 0xdf, 0xf3, - 0x04, 0x00, 0xe6, 0xf3, 0x04, 0x00, 0xe7, 0xf3, 0x04, 0x00, 0xe8, 0xf3, - 0x04, 0x00, 0xe9, 0xf3, 0x04, 0x00, 0xeb, 0xf3, 0x04, 0x00, 0xf0, 0xf3, - 0x04, 0x00, 0xf6, 0xf3, 0x04, 0x00, 0xf7, 0xf3, 0x04, 0x00, 0xfd, 0xf3, - 0x04, 0x00, 0xfe, 0xf3, 0x04, 0x00, 0xff, 0xf3, 0x04, 0x00, 0x0b, 0xf5, - 0x04, 0x00, 0xf1, 0xf5, 0x04, 0x00, 0xf8, 0xf5, 0x04, 0x00, 0x86, 0xf7, - 0x04, 0x00, 0x87, 0xf7, 0x04, 0x00, 0x88, 0xf7, 0x04, 0x00, 0x89, 0xf7, - 0x04, 0x00, 0x8b, 0xf7, 0x04, 0x00, 0xb1, 0xfa, 0x04, 0x00, 0xb8, 0xfa, - 0x04, 0x00, 0xe6, 0xfb, 0x04, 0x00, 0xe7, 0xfb, 0x04, 0x00, 0xe8, 0xfb, - 0x04, 0x00, 0xe9, 0xfb, 0x04, 0x00, 0xeb, 0xfb, 0x04, 0x00, 0xf0, 0xfb, - 0x04, 0x00, 0xf6, 0xfb, 0x04, 0x00, 0xf7, 0xfb, 0x04, 0x00, 0xfd, 0xfb, - 0x04, 0x00, 0xfe, 0xfb, 0x04, 0x00, 0xff, 0xfb, 0x04, 0x00, 0x88, 0xff, - 0x04, 0x00, 0x8b, 0xff, 0x04, 0x00, 0xc6, 0xff, 0x04, 0x00, 0xc7, 0xff, - 0x04, 0x00, 0xc8, 0xff, 0x04, 0x00, 0xc9, 0xff, 0x04, 0x00, 0xcb, 0xff, - 0x04, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xe8, 0xff, - 0x04, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xf6, 0xff, - 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfc, 0xff, - 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x73, 0x00, - 0x05, 0x00, 0x7b, 0x00, 0x05, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xbf, 0x00, - 0x05, 0x00, 0x0e, 0x01, 0x05, 0x00, 0x0f, 0x01, 0x05, 0x00, 0xe8, 0x03, - 0x05, 0x00, 0xf3, 0x03, 0x05, 0x00, 0xfb, 0x03, 0x05, 0x00, 0xbe, 0x04, - 0x05, 0x00, 0xbf, 0x04, 0x05, 0x00, 0xf4, 0x05, 0x05, 0x00, 0xf5, 0x05, - 0x05, 0x00, 0xf8, 0x05, 0x05, 0x00, 0xfc, 0x05, 0x05, 0x00, 0xfe, 0x05, - 0x05, 0x00, 0xff, 0x05, 0x05, 0x00, 0xb8, 0x06, 0x05, 0x00, 0xc8, 0x07, - 0x05, 0x00, 0xe8, 0x07, 0x05, 0x00, 0xf3, 0x07, 0x05, 0x00, 0xfb, 0x07, - 0x05, 0x00, 0x78, 0x08, 0x05, 0x00, 0x7c, 0x08, 0x05, 0x00, 0x7e, 0x08, - 0x05, 0x00, 0x7f, 0x08, 0x05, 0x00, 0xbe, 0x08, 0x05, 0x00, 0xbf, 0x08, - 0x05, 0x00, 0xf3, 0x09, 0x05, 0x00, 0xfb, 0x09, 0x05, 0x00, 0xb4, 0x0a, - 0x05, 0x00, 0xbe, 0x0a, 0x05, 0x00, 0xbf, 0x0a, 0x05, 0x00, 0x78, 0x0b, - 0x05, 0x00, 0x7c, 0x0b, 0x05, 0x00, 0x7e, 0x0b, 0x05, 0x00, 0x7f, 0x0b, - 0x05, 0x00, 0xf3, 0x0d, 0x05, 0x00, 0xfb, 0x0d, 0x05, 0x00, 0x7e, 0x10, - 0x05, 0x00, 0x7f, 0x10, 0x05, 0x00, 0xbe, 0x10, 0x05, 0x00, 0xbf, 0x10, - 0x05, 0x00, 0x0e, 0x11, 0x05, 0x00, 0x0f, 0x11, 0x05, 0x00, 0xde, 0x13, - 0x05, 0x00, 0xdf, 0x13, 0x05, 0x00, 0xe8, 0x13, 0x05, 0x00, 0xfe, 0x13, - 0x05, 0x00, 0xff, 0x13, 0x05, 0x00, 0xbe, 0x14, 0x05, 0x00, 0xbf, 0x14, - 0x05, 0x00, 0xf4, 0x15, 0x05, 0x00, 0xfe, 0x15, 0x05, 0x00, 0xff, 0x15, - 0x05, 0x00, 0xb4, 0x16, 0x05, 0x00, 0xbe, 0x16, 0x05, 0x00, 0xbf, 0x16, - 0x05, 0x00, 0x08, 0x17, 0x05, 0x00, 0x15, 0x17, 0x05, 0x00, 0xc4, 0x17, - 0x05, 0x00, 0xc8, 0x17, 0x05, 0x00, 0xe4, 0x17, 0x05, 0x00, 0xe8, 0x17, - 0x05, 0x00, 0xf4, 0x17, 0x05, 0x00, 0xf5, 0x17, 0x05, 0x00, 0xf8, 0x17, - 0x05, 0x00, 0xfc, 0x17, 0x05, 0x00, 0xfe, 0x17, 0x05, 0x00, 0xff, 0x17, - 0x05, 0x00, 0x7e, 0x18, 0x05, 0x00, 0x7f, 0x18, 0x05, 0x00, 0xbe, 0x18, - 0x05, 0x00, 0xbf, 0x18, 0x05, 0x00, 0xf3, 0x19, 0x05, 0x00, 0xfb, 0x19, - 0x05, 0x00, 0xb8, 0x1a, 0x05, 0x00, 0x78, 0x1b, 0x05, 0x00, 0x9e, 0x1b, - 0x05, 0x00, 0x9f, 0x1b, 0x05, 0x00, 0xf8, 0x1d, 0x05, 0x00, 0x98, 0x1f, - 0x05, 0x00, 0x9c, 0x1f, 0x05, 0x00, 0x9e, 0x1f, 0x05, 0x00, 0x9f, 0x1f, - 0x05, 0x00, 0xd8, 0x1f, 0x05, 0x00, 0xdc, 0x1f, 0x05, 0x00, 0xde, 0x1f, - 0x05, 0x00, 0xdf, 0x1f, 0x05, 0x00, 0xb8, 0x26, 0x05, 0x00, 0xf8, 0x27, - 0x05, 0x00, 0xfc, 0x27, 0x05, 0x00, 0xfe, 0x27, 0x05, 0x00, 0xff, 0x27, - 0x05, 0x00, 0xbe, 0x2a, 0x05, 0x00, 0xbf, 0x2a, 0x05, 0x00, 0xbe, 0x32, - 0x05, 0x00, 0xbf, 0x32, 0x05, 0x00, 0x88, 0x33, 0x05, 0x00, 0x8b, 0x33, - 0x05, 0x00, 0x91, 0x33, 0x05, 0x00, 0x96, 0x33, 0x05, 0x00, 0x97, 0x33, - 0x05, 0x00, 0x99, 0x33, 0x05, 0x00, 0x9d, 0x33, 0x05, 0x00, 0xb1, 0x3a, - 0x05, 0x00, 0xb8, 0x3a, 0x05, 0x00, 0x78, 0x3c, 0x05, 0x00, 0x7c, 0x3c, - 0x05, 0x00, 0x7e, 0x3c, 0x05, 0x00, 0x7f, 0x3c, 0x05, 0x00, 0x78, 0x3e, - 0x05, 0x00, 0x7c, 0x3e, 0x05, 0x00, 0x7e, 0x3e, 0x05, 0x00, 0x7f, 0x3e, - 0x05, 0x00, 0x88, 0x3f, 0x05, 0x00, 0x8b, 0x3f, 0x05, 0x00, 0xc8, 0x3f, - 0x05, 0x00, 0xc9, 0x3f, 0x05, 0x00, 0xcb, 0x3f, 0x05, 0x00, 0xe8, 0x3f, - 0x05, 0x00, 0xe9, 0x3f, 0x05, 0x00, 0xeb, 0x3f, 0x05, 0x00, 0xf0, 0x3f, - 0x05, 0x00, 0xf1, 0x3f, 0x05, 0x00, 0xf9, 0x3f, 0x05, 0x00, 0xfd, 0x3f, - 0x05, 0x00, 0x76, 0x40, 0x05, 0x00, 0x77, 0x40, 0x05, 0x00, 0x78, 0x40, - 0x05, 0x00, 0x7c, 0x40, 0x05, 0x00, 0x7e, 0x40, 0x05, 0x00, 0x7f, 0x40, - 0x05, 0x00, 0xb1, 0x40, 0x05, 0x00, 0xb8, 0x40, 0x05, 0x00, 0x70, 0x41, - 0x05, 0x00, 0x71, 0x41, 0x05, 0x00, 0x79, 0x41, 0x05, 0x00, 0x7d, 0x41, - 0x05, 0x00, 0xb0, 0x44, 0x05, 0x00, 0xb6, 0x44, 0x05, 0x00, 0xb7, 0x44, - 0x05, 0x00, 0xbd, 0x44, 0x05, 0x00, 0xbe, 0x44, 0x05, 0x00, 0xbf, 0x44, - 0x05, 0x00, 0xf6, 0x45, 0x05, 0x00, 0xf7, 0x45, 0x05, 0x00, 0xf8, 0x45, - 0x05, 0x00, 0xfc, 0x45, 0x05, 0x00, 0xfe, 0x45, 0x05, 0x00, 0xff, 0x45, - 0x05, 0x00, 0xb1, 0x46, 0x05, 0x00, 0xb8, 0x46, 0x05, 0x00, 0x70, 0x48, - 0x05, 0x00, 0x77, 0x48, 0x05, 0x00, 0x7d, 0x48, 0x05, 0x00, 0x7e, 0x48, - 0x05, 0x00, 0x7f, 0x48, 0x05, 0x00, 0xb1, 0x48, 0x05, 0x00, 0xb8, 0x48, - 0x05, 0x00, 0x0b, 0x49, 0x05, 0x00, 0xf0, 0x49, 0x05, 0x00, 0xf1, 0x49, - 0x05, 0x00, 0xf9, 0x49, 0x05, 0x00, 0xfd, 0x49, 0x05, 0x00, 0xb0, 0x4a, - 0x05, 0x00, 0xb7, 0x4a, 0x05, 0x00, 0xbd, 0x4a, 0x05, 0x00, 0xbe, 0x4a, - 0x05, 0x00, 0xbf, 0x4a, 0x05, 0x00, 0x86, 0x4b, 0x05, 0x00, 0x87, 0x4b, - 0x05, 0x00, 0x88, 0x4b, 0x05, 0x00, 0x89, 0x4b, 0x05, 0x00, 0x8b, 0x4b, - 0x05, 0x00, 0xd0, 0x4b, 0x05, 0x00, 0xd8, 0x4b, 0x05, 0x00, 0xf1, 0x4b, - 0x05, 0x00, 0xf8, 0x4b, 0x05, 0x00, 0x7e, 0x4c, 0x05, 0x00, 0x7f, 0x4c, - 0x05, 0x00, 0x0b, 0x4d, 0x05, 0x00, 0xf1, 0x4d, 0x05, 0x00, 0xf8, 0x4d, - 0x05, 0x00, 0x78, 0x4e, 0x05, 0x00, 0x7c, 0x4e, 0x05, 0x00, 0x7e, 0x4e, - 0x05, 0x00, 0x7f, 0x4e, 0x05, 0x00, 0x08, 0x4f, 0x05, 0x00, 0x0b, 0x4f, - 0x05, 0x00, 0x78, 0x4f, 0x05, 0x00, 0x7c, 0x4f, 0x05, 0x00, 0x7e, 0x4f, - 0x05, 0x00, 0x7f, 0x4f, 0x05, 0x00, 0xf0, 0x4f, 0x05, 0x00, 0xf1, 0x4f, - 0x05, 0x00, 0xf9, 0x4f, 0x05, 0x00, 0xfd, 0x4f, 0x05, 0x00, 0xf0, 0x51, - 0x05, 0x00, 0xf1, 0x51, 0x05, 0x00, 0xf9, 0x51, 0x05, 0x00, 0xfd, 0x51, - 0x05, 0x00, 0x78, 0x52, 0x05, 0x00, 0x7c, 0x52, 0x05, 0x00, 0x7e, 0x52, - 0x05, 0x00, 0x7f, 0x52, 0x05, 0x00, 0xb0, 0x54, 0x05, 0x00, 0xb6, 0x54, - 0x05, 0x00, 0xb7, 0x54, 0x05, 0x00, 0xbd, 0x54, 0x05, 0x00, 0xbe, 0x54, - 0x05, 0x00, 0xbf, 0x54, 0x05, 0x00, 0x1f, 0x55, 0x05, 0x00, 0x68, 0x55, - 0x05, 0x00, 0x6b, 0x55, 0x05, 0x00, 0xf7, 0x55, 0x05, 0x00, 0xf8, 0x55, - 0x05, 0x00, 0xfc, 0x55, 0x05, 0x00, 0xfe, 0x55, 0x05, 0x00, 0xff, 0x55, - 0x05, 0x00, 0xc6, 0x57, 0x05, 0x00, 0xc7, 0x57, 0x05, 0x00, 0xe6, 0x57, - 0x05, 0x00, 0xe7, 0x57, 0x05, 0x00, 0xf6, 0x57, 0x05, 0x00, 0xf7, 0x57, - 0x05, 0x00, 0xf8, 0x57, 0x05, 0x00, 0xfc, 0x57, 0x05, 0x00, 0xfe, 0x57, - 0x05, 0x00, 0xff, 0x57, 0x05, 0x00, 0xb1, 0x58, 0x05, 0x00, 0xb8, 0x58, - 0x05, 0x00, 0xf6, 0x59, 0x05, 0x00, 0xf7, 0x59, 0x05, 0x00, 0xf8, 0x59, - 0x05, 0x00, 0xfc, 0x59, 0x05, 0x00, 0xfe, 0x59, 0x05, 0x00, 0xff, 0x59, - 0x05, 0x00, 0xbe, 0x5c, 0x05, 0x00, 0xbf, 0x5c, 0x05, 0x00, 0xf6, 0x5d, - 0x05, 0x00, 0xf7, 0x5d, 0x05, 0x00, 0xf8, 0x5d, 0x05, 0x00, 0xfc, 0x5d, - 0x05, 0x00, 0xfe, 0x5d, 0x05, 0x00, 0xff, 0x5d, 0x05, 0x00, 0xb8, 0x5e, - 0x05, 0x00, 0xf0, 0x5f, 0x05, 0x00, 0xf1, 0x5f, 0x05, 0x00, 0xf9, 0x5f, - 0x05, 0x00, 0xfd, 0x5f, 0x05, 0x00, 0x7e, 0x60, 0x05, 0x00, 0x7f, 0x60, - 0x05, 0x00, 0xbe, 0x60, 0x05, 0x00, 0xbf, 0x60, 0x05, 0x00, 0x74, 0x61, - 0x05, 0x00, 0x75, 0x61, 0x05, 0x00, 0x78, 0x61, 0x05, 0x00, 0x7c, 0x61, - 0x05, 0x00, 0x7e, 0x61, 0x05, 0x00, 0x7f, 0x61, 0x05, 0x00, 0xbe, 0x64, - 0x05, 0x00, 0xbf, 0x64, 0x05, 0x00, 0xf4, 0x65, 0x05, 0x00, 0xfe, 0x65, - 0x05, 0x00, 0xff, 0x65, 0x05, 0x00, 0xb4, 0x66, 0x05, 0x00, 0xbe, 0x66, - 0x05, 0x00, 0xbf, 0x66, 0x05, 0x00, 0x88, 0x67, 0x05, 0x00, 0x98, 0x67, - 0x05, 0x00, 0x9c, 0x67, 0x05, 0x00, 0x9e, 0x67, 0x05, 0x00, 0x9f, 0x67, - 0x05, 0x00, 0xd8, 0x67, 0x05, 0x00, 0xdc, 0x67, 0x05, 0x00, 0xde, 0x67, - 0x05, 0x00, 0xdf, 0x67, 0x05, 0x00, 0x7e, 0x68, 0x05, 0x00, 0x7f, 0x68, - 0x05, 0x00, 0xbe, 0x68, 0x05, 0x00, 0xbf, 0x68, 0x05, 0x00, 0xf3, 0x69, - 0x05, 0x00, 0xfb, 0x69, 0x05, 0x00, 0xb8, 0x6a, 0x05, 0x00, 0x78, 0x6b, - 0x05, 0x00, 0xc8, 0x6b, 0x05, 0x00, 0xfe, 0x6b, 0x05, 0x00, 0xff, 0x6b, - 0x05, 0x00, 0xf8, 0x6d, 0x05, 0x00, 0xf4, 0x6f, 0x05, 0x00, 0xf5, 0x6f, - 0x05, 0x00, 0xf8, 0x6f, 0x05, 0x00, 0xfc, 0x6f, 0x05, 0x00, 0xfe, 0x6f, - 0x05, 0x00, 0xff, 0x6f, 0x05, 0x00, 0x78, 0x70, 0x05, 0x00, 0xbe, 0x70, - 0x05, 0x00, 0xbf, 0x70, 0x05, 0x00, 0x15, 0x71, 0x05, 0x00, 0x64, 0x71, - 0x05, 0x00, 0x68, 0x71, 0x05, 0x00, 0x74, 0x71, 0x05, 0x00, 0x75, 0x71, - 0x05, 0x00, 0x78, 0x71, 0x05, 0x00, 0x7c, 0x71, 0x05, 0x00, 0x7e, 0x71, - 0x05, 0x00, 0x7f, 0x71, 0x05, 0x00, 0x9e, 0x73, 0x05, 0x00, 0x9f, 0x73, - 0x05, 0x00, 0xbe, 0x74, 0x05, 0x00, 0xbf, 0x74, 0x05, 0x00, 0xf4, 0x75, - 0x05, 0x00, 0xfe, 0x75, 0x05, 0x00, 0xff, 0x75, 0x05, 0x00, 0xb4, 0x76, - 0x05, 0x00, 0xbe, 0x76, 0x05, 0x00, 0xbf, 0x76, 0x05, 0x00, 0x88, 0x77, - 0x05, 0x00, 0x98, 0x77, 0x05, 0x00, 0x9c, 0x77, 0x05, 0x00, 0x9e, 0x77, - 0x05, 0x00, 0x9f, 0x77, 0x05, 0x00, 0xd8, 0x77, 0x05, 0x00, 0xdc, 0x77, - 0x05, 0x00, 0xde, 0x77, 0x05, 0x00, 0xdf, 0x77, 0x05, 0x00, 0x78, 0x78, - 0x05, 0x00, 0xbe, 0x78, 0x05, 0x00, 0xbf, 0x78, 0x05, 0x00, 0xf8, 0x79, - 0x05, 0x00, 0xfc, 0x79, 0x05, 0x00, 0xfe, 0x79, 0x05, 0x00, 0xff, 0x79, - 0x05, 0x00, 0xb4, 0x7a, 0x05, 0x00, 0xbe, 0x7a, 0x05, 0x00, 0xbf, 0x7a, - 0x05, 0x00, 0x1e, 0x7b, 0x05, 0x00, 0x1f, 0x7b, 0x05, 0x00, 0x78, 0x7b, - 0x05, 0x00, 0x88, 0x7b, 0x05, 0x00, 0xde, 0x7b, 0x05, 0x00, 0xdf, 0x7b, - 0x05, 0x00, 0xe8, 0x7b, 0x05, 0x00, 0xfe, 0x7b, 0x05, 0x00, 0xff, 0x7b, - 0x05, 0x00, 0xf4, 0x7d, 0x05, 0x00, 0xfe, 0x7d, 0x05, 0x00, 0xff, 0x7d, - 0x05, 0x00, 0xc4, 0x7f, 0x05, 0x00, 0xc8, 0x7f, 0x05, 0x00, 0xe4, 0x7f, - 0x05, 0x00, 0xe8, 0x7f, 0x05, 0x00, 0xf4, 0x7f, 0x05, 0x00, 0xf5, 0x7f, - 0x05, 0x00, 0xf8, 0x7f, 0x05, 0x00, 0xfc, 0x7f, 0x05, 0x00, 0xfe, 0x7f, - 0x05, 0x00, 0xff, 0x7f, 0x05, 0x00, 0x71, 0x84, 0x05, 0x00, 0x73, 0x84, - 0x05, 0x00, 0x79, 0x84, 0x05, 0x00, 0x7b, 0x84, 0x05, 0x00, 0x7d, 0x84, - 0x05, 0x00, 0x72, 0x86, 0x05, 0x00, 0x77, 0x86, 0x05, 0x00, 0x78, 0x86, - 0x05, 0x00, 0x7a, 0x86, 0x05, 0x00, 0x7c, 0x86, 0x05, 0x00, 0x7e, 0x86, - 0x05, 0x00, 0x7f, 0x86, 0x05, 0x00, 0x77, 0x87, 0x05, 0x00, 0x78, 0x87, - 0x05, 0x00, 0x7c, 0x87, 0x05, 0x00, 0x7e, 0x87, 0x05, 0x00, 0x7f, 0x87, - 0x05, 0x00, 0x83, 0x87, 0x05, 0x00, 0x87, 0x87, 0x05, 0x00, 0x8d, 0x87, - 0x05, 0x00, 0x92, 0x87, 0x05, 0x00, 0x9f, 0x87, 0x05, 0x00, 0xd2, 0x87, - 0x05, 0x00, 0xdf, 0x87, 0x05, 0x00, 0x72, 0x8a, 0x05, 0x00, 0x78, 0x8a, - 0x05, 0x00, 0x7a, 0x8a, 0x05, 0x00, 0x7c, 0x8a, 0x05, 0x00, 0x7e, 0x8a, - 0x05, 0x00, 0x7f, 0x8a, 0x05, 0x00, 0x10, 0x8b, 0x05, 0x00, 0x11, 0x8b, - 0x05, 0x00, 0x16, 0x8b, 0x05, 0x00, 0x17, 0x8b, 0x05, 0x00, 0x1f, 0x8b, - 0x05, 0x00, 0x8b, 0x8b, 0x05, 0x00, 0x8d, 0x8b, 0x05, 0x00, 0xd2, 0x8b, - 0x05, 0x00, 0xdb, 0x8b, 0x05, 0x00, 0xe1, 0x8b, 0x05, 0x00, 0xe2, 0x8b, - 0x05, 0x00, 0xee, 0x8b, 0x05, 0x00, 0xef, 0x8b, 0x05, 0x00, 0xf2, 0x8b, - 0x05, 0x00, 0xf8, 0x8b, 0x05, 0x00, 0xfa, 0x8b, 0x05, 0x00, 0xfc, 0x8b, - 0x05, 0x00, 0xfe, 0x8b, 0x05, 0x00, 0xff, 0x8b, 0x05, 0x00, 0xb3, 0x9a, - 0x05, 0x00, 0xbb, 0x9a, 0x05, 0x00, 0x8e, 0x9b, 0x05, 0x00, 0x8f, 0x9b, - 0x05, 0x00, 0xe3, 0x9f, 0x05, 0x00, 0xf3, 0x9f, 0x05, 0x00, 0xfb, 0x9f, - 0x05, 0x00, 0x7f, 0xa4, 0x05, 0x00, 0x78, 0xaa, 0x05, 0x00, 0x7c, 0xaa, - 0x05, 0x00, 0x7e, 0xaa, 0x05, 0x00, 0x7f, 0xaa, 0x05, 0x00, 0x8b, 0xab, - 0x05, 0x00, 0xeb, 0xab, 0x05, 0x00, 0x90, 0xb3, 0x05, 0x00, 0x91, 0xb3, - 0x05, 0x00, 0x96, 0xb3, 0x05, 0x00, 0x97, 0xb3, 0x05, 0x00, 0x9f, 0xb3, - 0x05, 0x00, 0x78, 0xba, 0x05, 0x00, 0x7c, 0xba, 0x05, 0x00, 0x7e, 0xba, - 0x05, 0x00, 0x7f, 0xba, 0x05, 0x00, 0x8b, 0xbb, 0x05, 0x00, 0xf8, 0xbb, - 0x05, 0x00, 0xfc, 0xbb, 0x05, 0x00, 0xfe, 0xbb, 0x05, 0x00, 0xff, 0xbb, - 0x05, 0x00, 0xf8, 0xbf, 0x05, 0x00, 0xfc, 0xbf, 0x05, 0x00, 0xfe, 0xbf, - 0x05, 0x00, 0xff, 0xbf, 0x05, 0x00, 0x1f, 0xc5, 0x05, 0x00, 0xb1, 0xc6, - 0x05, 0x00, 0xb3, 0xc6, 0x05, 0x00, 0xb9, 0xc6, 0x05, 0x00, 0xbb, 0xc6, - 0x05, 0x00, 0xbd, 0xc6, 0x05, 0x00, 0xcd, 0xc7, 0x05, 0x00, 0xe3, 0xc7, - 0x05, 0x00, 0xed, 0xc7, 0x05, 0x00, 0xf1, 0xc7, 0x05, 0x00, 0xf3, 0xc7, - 0x05, 0x00, 0xf9, 0xc7, 0x05, 0x00, 0xfb, 0xc7, 0x05, 0x00, 0xfd, 0xc7, - 0x05, 0x00, 0xbf, 0xca, 0x05, 0x00, 0x9f, 0xd3, 0x05, 0x00, 0xb3, 0xda, - 0x05, 0x00, 0xbb, 0xda, 0x05, 0x00, 0x83, 0xdb, 0x05, 0x00, 0xe3, 0xdf, - 0x05, 0x00, 0xf3, 0xdf, 0x05, 0x00, 0xfb, 0xdf, 0x05, 0x00, 0xbf, 0xe6, - 0x05, 0x00, 0xce, 0xe7, 0x05, 0x00, 0xcf, 0xe7, 0x05, 0x00, 0xe1, 0xe7, - 0x05, 0x00, 0xe2, 0xe7, 0x05, 0x00, 0xee, 0xe7, 0x05, 0x00, 0xef, 0xe7, - 0x05, 0x00, 0xf2, 0xe7, 0x05, 0x00, 0xf8, 0xe7, 0x05, 0x00, 0xfa, 0xe7, - 0x05, 0x00, 0xfc, 0xe7, 0x05, 0x00, 0xfe, 0xe7, 0x05, 0x00, 0xff, 0xe7, - 0x05, 0x00, 0xb1, 0xea, 0x05, 0x00, 0xb3, 0xea, 0x05, 0x00, 0xb9, 0xea, - 0x05, 0x00, 0xbb, 0xea, 0x05, 0x00, 0xbd, 0xea, 0x05, 0x00, 0x8d, 0xeb, - 0x05, 0x00, 0x8e, 0xeb, 0x05, 0x00, 0x8f, 0xeb, 0x05, 0x00, 0xb3, 0xf2, - 0x05, 0x00, 0xbb, 0xf2, 0x05, 0x00, 0x84, 0xf3, 0x05, 0x00, 0x8e, 0xf3, - 0x05, 0x00, 0x8f, 0xf3, 0x05, 0x00, 0x90, 0xf3, 0x05, 0x00, 0x0b, 0xf9, - 0x05, 0x00, 0xbf, 0xfa, 0x05, 0x00, 0x73, 0xfc, 0x05, 0x00, 0x7b, 0xfc, - 0x05, 0x00, 0x73, 0xfe, 0x05, 0x00, 0x7b, 0xfe, 0x05, 0x00, 0x83, 0xff, - 0x05, 0x00, 0x8e, 0xff, 0x05, 0x00, 0x8f, 0xff, 0x05, 0x00, 0xce, 0xff, - 0x05, 0x00, 0xcf, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xe2, 0xff, - 0x05, 0x00, 0xee, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf2, 0xff, - 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfc, 0xff, - 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x38, 0x00, - 0x06, 0x00, 0x3c, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x06, 0x00, 0x3f, 0x00, - 0x06, 0x00, 0xe8, 0x00, 0x06, 0x00, 0xeb, 0x00, 0x06, 0x00, 0xf8, 0x00, - 0x06, 0x00, 0xfc, 0x00, 0x06, 0x00, 0xfe, 0x00, 0x06, 0x00, 0xff, 0x00, - 0x06, 0x00, 0xc8, 0x01, 0x06, 0x00, 0xcb, 0x01, 0x06, 0x00, 0xf8, 0x01, - 0x06, 0x00, 0xfc, 0x01, 0x06, 0x00, 0xfe, 0x01, 0x06, 0x00, 0xff, 0x01, - 0x06, 0x00, 0x38, 0x03, 0x06, 0x00, 0x3c, 0x03, 0x06, 0x00, 0x3e, 0x03, - 0x06, 0x00, 0x3f, 0x03, 0x06, 0x00, 0x88, 0x07, 0x06, 0x00, 0x8b, 0x07, - 0x06, 0x00, 0xe8, 0x07, 0x06, 0x00, 0xeb, 0x07, 0x06, 0x00, 0xf8, 0x07, - 0x06, 0x00, 0xfc, 0x07, 0x06, 0x00, 0xfe, 0x07, 0x06, 0x00, 0xff, 0x07, - 0x06, 0x00, 0x4b, 0x08, 0x06, 0x00, 0xcb, 0x09, 0x06, 0x00, 0xf8, 0x09, - 0x06, 0x00, 0xfc, 0x09, 0x06, 0x00, 0xfe, 0x09, 0x06, 0x00, 0xff, 0x09, - 0x06, 0x00, 0xe8, 0x0f, 0x06, 0x00, 0xeb, 0x0f, 0x06, 0x00, 0xf8, 0x0f, - 0x06, 0x00, 0xfc, 0x0f, 0x06, 0x00, 0xfe, 0x0f, 0x06, 0x00, 0xff, 0x0f, - 0x06, 0x00, 0x38, 0x10, 0x06, 0x00, 0xbe, 0x10, 0x06, 0x00, 0xbf, 0x10, - 0x06, 0x00, 0xe8, 0x10, 0x06, 0x00, 0xeb, 0x10, 0x06, 0x00, 0xf8, 0x11, - 0x06, 0x00, 0xfc, 0x11, 0x06, 0x00, 0xfe, 0x11, 0x06, 0x00, 0xff, 0x11, - 0x06, 0x00, 0x3e, 0x14, 0x06, 0x00, 0x3f, 0x14, 0x06, 0x00, 0xb8, 0x14, - 0x06, 0x00, 0xbc, 0x14, 0x06, 0x00, 0xbe, 0x14, 0x06, 0x00, 0xbf, 0x14, - 0x06, 0x00, 0x38, 0x15, 0x06, 0x00, 0x38, 0x16, 0x06, 0x00, 0x3c, 0x16, - 0x06, 0x00, 0x3e, 0x16, 0x06, 0x00, 0x3f, 0x16, 0x06, 0x00, 0xb8, 0x16, - 0x06, 0x00, 0xbc, 0x16, 0x06, 0x00, 0xbe, 0x16, 0x06, 0x00, 0xbf, 0x16, - 0x06, 0x00, 0x38, 0x17, 0x06, 0x00, 0x3c, 0x17, 0x06, 0x00, 0x3e, 0x17, - 0x06, 0x00, 0x3f, 0x17, 0x06, 0x00, 0xb8, 0x1a, 0x06, 0x00, 0xbc, 0x1a, - 0x06, 0x00, 0xbe, 0x1a, 0x06, 0x00, 0xbf, 0x1a, 0x06, 0x00, 0x38, 0x1d, - 0x06, 0x00, 0x38, 0x1f, 0x06, 0x00, 0x3c, 0x1f, 0x06, 0x00, 0x3e, 0x1f, - 0x06, 0x00, 0x3f, 0x1f, 0x06, 0x00, 0x38, 0x22, 0x06, 0x00, 0x3c, 0x22, - 0x06, 0x00, 0x3e, 0x22, 0x06, 0x00, 0x3f, 0x22, 0x06, 0x00, 0x38, 0x25, - 0x06, 0x00, 0x3c, 0x25, 0x06, 0x00, 0x3e, 0x25, 0x06, 0x00, 0x3f, 0x25, - 0x06, 0x00, 0x58, 0x29, 0x06, 0x00, 0x5c, 0x29, 0x06, 0x00, 0x5e, 0x29, - 0x06, 0x00, 0x5f, 0x29, 0x06, 0x00, 0x38, 0x2d, 0x06, 0x00, 0x58, 0x2d, - 0x06, 0x00, 0x5c, 0x2d, 0x06, 0x00, 0x5e, 0x2d, 0x06, 0x00, 0x5f, 0x2d, - 0x06, 0x00, 0xe8, 0x2e, 0x06, 0x00, 0xeb, 0x2e, 0x06, 0x00, 0xf8, 0x2e, - 0x06, 0x00, 0xfc, 0x2e, 0x06, 0x00, 0xfe, 0x2e, 0x06, 0x00, 0xff, 0x2e, - 0x06, 0x00, 0x38, 0x2f, 0x06, 0x00, 0x3c, 0x2f, 0x06, 0x00, 0x3e, 0x2f, - 0x06, 0x00, 0x3f, 0x2f, 0x06, 0x00, 0x36, 0x33, 0x06, 0x00, 0x37, 0x33, - 0x06, 0x00, 0x38, 0x33, 0x06, 0x00, 0x3c, 0x33, 0x06, 0x00, 0x3e, 0x33, - 0x06, 0x00, 0x3f, 0x33, 0x06, 0x00, 0xb8, 0x33, 0x06, 0x00, 0xbc, 0x33, - 0x06, 0x00, 0xbe, 0x33, 0x06, 0x00, 0xbf, 0x33, 0x06, 0x00, 0xe9, 0x33, - 0x06, 0x00, 0xea, 0x33, 0x06, 0x00, 0xf0, 0x33, 0x06, 0x00, 0xf1, 0x33, - 0x06, 0x00, 0xf9, 0x33, 0x06, 0x00, 0xfd, 0x33, 0x06, 0x00, 0xcb, 0x35, - 0x06, 0x00, 0xf7, 0x35, 0x06, 0x00, 0xf8, 0x35, 0x06, 0x00, 0xfc, 0x35, - 0x06, 0x00, 0xfe, 0x35, 0x06, 0x00, 0xff, 0x35, 0x06, 0x00, 0xcb, 0x39, - 0x06, 0x00, 0xf7, 0x39, 0x06, 0x00, 0xf8, 0x39, 0x06, 0x00, 0xfc, 0x39, - 0x06, 0x00, 0xfe, 0x39, 0x06, 0x00, 0xff, 0x39, 0x06, 0x00, 0xf0, 0x3d, - 0x06, 0x00, 0xf1, 0x3d, 0x06, 0x00, 0xf9, 0x3d, 0x06, 0x00, 0xfd, 0x3d, - 0x06, 0x00, 0x48, 0x3e, 0x06, 0x00, 0x4b, 0x3e, 0x06, 0x00, 0x30, 0x3f, - 0x06, 0x00, 0x31, 0x3f, 0x06, 0x00, 0x39, 0x3f, 0x06, 0x00, 0x3d, 0x3f, - 0x06, 0x00, 0xe6, 0x3f, 0x06, 0x00, 0xe7, 0x3f, 0x06, 0x00, 0xe8, 0x3f, - 0x06, 0x00, 0xeb, 0x3f, 0x06, 0x00, 0xf6, 0x3f, 0x06, 0x00, 0xf7, 0x3f, - 0x06, 0x00, 0xf8, 0x3f, 0x06, 0x00, 0xfc, 0x3f, 0x06, 0x00, 0xfe, 0x3f, - 0x06, 0x00, 0xff, 0x3f, 0x06, 0x00, 0xcb, 0x43, 0x06, 0x00, 0xf7, 0x43, - 0x06, 0x00, 0xf8, 0x43, 0x06, 0x00, 0xfc, 0x43, 0x06, 0x00, 0xfe, 0x43, - 0x06, 0x00, 0xff, 0x43, 0x06, 0x00, 0x37, 0x45, 0x06, 0x00, 0x38, 0x45, - 0x06, 0x00, 0x3c, 0x45, 0x06, 0x00, 0x3e, 0x45, 0x06, 0x00, 0x3f, 0x45, - 0x06, 0x00, 0xb8, 0x45, 0x06, 0x00, 0xbc, 0x45, 0x06, 0x00, 0xbe, 0x45, - 0x06, 0x00, 0xbf, 0x45, 0x06, 0x00, 0xf0, 0x45, 0x06, 0x00, 0xf1, 0x45, - 0x06, 0x00, 0xf9, 0x45, 0x06, 0x00, 0xfd, 0x45, 0x06, 0x00, 0xb7, 0x47, - 0x06, 0x00, 0xb8, 0x47, 0x06, 0x00, 0xbc, 0x47, 0x06, 0x00, 0xbe, 0x47, - 0x06, 0x00, 0xbf, 0x47, 0x06, 0x00, 0xb7, 0x4a, 0x06, 0x00, 0x30, 0x4b, - 0x06, 0x00, 0x3d, 0x4b, 0x06, 0x00, 0x3e, 0x4b, 0x06, 0x00, 0x3f, 0x4b, - 0x06, 0x00, 0xb1, 0x4b, 0x06, 0x00, 0xb7, 0x4b, 0x06, 0x00, 0xb8, 0x4b, - 0x06, 0x00, 0xe7, 0x4b, 0x06, 0x00, 0xf0, 0x4b, 0x06, 0x00, 0xf1, 0x4b, - 0x06, 0x00, 0xf7, 0x4b, 0x06, 0x00, 0xf9, 0x4b, 0x06, 0x00, 0xfd, 0x4b, - 0x06, 0x00, 0xf8, 0x4f, 0x06, 0x00, 0xfc, 0x4f, 0x06, 0x00, 0xfe, 0x4f, - 0x06, 0x00, 0xff, 0x4f, 0x06, 0x00, 0x4b, 0x52, 0x06, 0x00, 0xb8, 0x52, - 0x06, 0x00, 0xbc, 0x52, 0x06, 0x00, 0xbe, 0x52, 0x06, 0x00, 0xbf, 0x52, - 0x06, 0x00, 0x37, 0x59, 0x06, 0x00, 0x38, 0x59, 0x06, 0x00, 0x3c, 0x59, - 0x06, 0x00, 0x3e, 0x59, 0x06, 0x00, 0x3f, 0x59, 0x06, 0x00, 0xf0, 0x59, - 0x06, 0x00, 0xf1, 0x59, 0x06, 0x00, 0xf9, 0x59, 0x06, 0x00, 0xfd, 0x59, - 0x06, 0x00, 0x4b, 0x5c, 0x06, 0x00, 0xb8, 0x5c, 0x06, 0x00, 0xbc, 0x5c, - 0x06, 0x00, 0xbe, 0x5c, 0x06, 0x00, 0xbf, 0x5c, 0x06, 0x00, 0x30, 0x5d, - 0x06, 0x00, 0x31, 0x5d, 0x06, 0x00, 0x39, 0x5d, 0x06, 0x00, 0x3d, 0x5d, - 0x06, 0x00, 0xcb, 0x5d, 0x06, 0x00, 0xf7, 0x5d, 0x06, 0x00, 0xf8, 0x5d, - 0x06, 0x00, 0xfc, 0x5d, 0x06, 0x00, 0xfe, 0x5d, 0x06, 0x00, 0xff, 0x5d, - 0x06, 0x00, 0xb8, 0x5e, 0x06, 0x00, 0xbc, 0x5e, 0x06, 0x00, 0xbe, 0x5e, - 0x06, 0x00, 0xbf, 0x5e, 0x06, 0x00, 0xcf, 0x63, 0x06, 0x00, 0xf8, 0x63, - 0x06, 0x00, 0xfc, 0x63, 0x06, 0x00, 0xfe, 0x63, 0x06, 0x00, 0xff, 0x63, - 0x06, 0x00, 0x33, 0x65, 0x06, 0x00, 0x3b, 0x65, 0x06, 0x00, 0x3f, 0x65, - 0x06, 0x00, 0xf3, 0x65, 0x06, 0x00, 0xfb, 0x65, 0x06, 0x00, 0xff, 0x66, - 0x06, 0x00, 0x33, 0x67, 0x06, 0x00, 0x3b, 0x67, 0x06, 0x00, 0x83, 0x67, - 0x06, 0x00, 0x8e, 0x67, 0x06, 0x00, 0x8f, 0x67, 0x06, 0x00, 0x3e, 0x6a, - 0x06, 0x00, 0x3f, 0x6a, 0x06, 0x00, 0xb8, 0x6a, 0x06, 0x00, 0xbc, 0x6a, - 0x06, 0x00, 0xbe, 0x6a, 0x06, 0x00, 0xbf, 0x6a, 0x06, 0x00, 0x34, 0x6b, - 0x06, 0x00, 0x3e, 0x6b, 0x06, 0x00, 0x3f, 0x6b, 0x06, 0x00, 0xb4, 0x6b, - 0x06, 0x00, 0xbe, 0x6b, 0x06, 0x00, 0xbf, 0x6b, 0x06, 0x00, 0xf3, 0x6b, - 0x06, 0x00, 0xfb, 0x6b, 0x06, 0x00, 0xf8, 0x6f, 0x06, 0x00, 0xfc, 0x6f, - 0x06, 0x00, 0xfe, 0x6f, 0x06, 0x00, 0xff, 0x6f, 0x06, 0x00, 0x3f, 0x72, - 0x06, 0x00, 0xcb, 0x72, 0x06, 0x00, 0xeb, 0x72, 0x06, 0x00, 0x3e, 0x73, - 0x06, 0x00, 0x3f, 0x73, 0x06, 0x00, 0xf3, 0x73, 0x06, 0x00, 0xfb, 0x73, - 0x06, 0x00, 0xf3, 0x75, 0x06, 0x00, 0xfb, 0x75, 0x06, 0x00, 0x83, 0x77, - 0x06, 0x00, 0x8e, 0x77, 0x06, 0x00, 0x8f, 0x77, 0x06, 0x00, 0xb3, 0x7a, - 0x06, 0x00, 0xbb, 0x7a, 0x06, 0x00, 0xff, 0x7a, 0x06, 0x00, 0x34, 0x7b, - 0x06, 0x00, 0x38, 0x7b, 0x06, 0x00, 0xb4, 0x7b, 0x06, 0x00, 0xb8, 0x7b, - 0x06, 0x00, 0xee, 0x7b, 0x06, 0x00, 0xef, 0x7b, 0x06, 0x00, 0xf8, 0x7b, - 0x06, 0x00, 0xfc, 0x7b, 0x06, 0x00, 0xfe, 0x7b, 0x06, 0x00, 0xff, 0x7b, - 0x06, 0x00, 0xc3, 0x7f, 0x06, 0x00, 0xcb, 0x7f, 0x06, 0x00, 0xe3, 0x7f, - 0x06, 0x00, 0xeb, 0x7f, 0x06, 0x00, 0xf3, 0x7f, 0x06, 0x00, 0xfb, 0x7f, - 0x06, 0x00, 0x31, 0x80, 0x06, 0x00, 0x38, 0x80, 0x06, 0x00, 0x4d, 0x80, - 0x06, 0x00, 0xb1, 0x80, 0x06, 0x00, 0xb8, 0x80, 0x06, 0x00, 0xe1, 0x80, - 0x06, 0x00, 0xe2, 0x80, 0x06, 0x00, 0xe7, 0x80, 0x06, 0x00, 0xed, 0x80, - 0x06, 0x00, 0xee, 0x80, 0x06, 0x00, 0xef, 0x80, 0x06, 0x00, 0xf2, 0x80, - 0x06, 0x00, 0xf7, 0x80, 0x06, 0x00, 0xf8, 0x80, 0x06, 0x00, 0xfa, 0x80, - 0x06, 0x00, 0xfc, 0x80, 0x06, 0x00, 0xfe, 0x80, 0x06, 0x00, 0xff, 0x80, - 0x06, 0x00, 0xf1, 0x81, 0x06, 0x00, 0xf3, 0x81, 0x06, 0x00, 0xf9, 0x81, - 0x06, 0x00, 0xfb, 0x81, 0x06, 0x00, 0xfd, 0x81, 0x06, 0x00, 0xb4, 0x82, - 0x06, 0x00, 0xbe, 0x82, 0x06, 0x00, 0xbf, 0x82, 0x06, 0x00, 0xe1, 0x82, - 0x06, 0x00, 0xe2, 0x82, 0x06, 0x00, 0xe7, 0x82, 0x06, 0x00, 0xed, 0x82, - 0x06, 0x00, 0xee, 0x82, 0x06, 0x00, 0xef, 0x82, 0x06, 0x00, 0xf2, 0x82, - 0x06, 0x00, 0xf7, 0x82, 0x06, 0x00, 0xf8, 0x82, 0x06, 0x00, 0xfa, 0x82, - 0x06, 0x00, 0xfc, 0x82, 0x06, 0x00, 0xfe, 0x82, 0x06, 0x00, 0xff, 0x82, - 0x06, 0x00, 0x30, 0x83, 0x06, 0x00, 0x3e, 0x83, 0x06, 0x00, 0x4f, 0x83, - 0x06, 0x00, 0xb4, 0x83, 0x06, 0x00, 0xbe, 0x83, 0x06, 0x00, 0xbf, 0x83, - 0x06, 0x00, 0xf1, 0x83, 0x06, 0x00, 0xf3, 0x83, 0x06, 0x00, 0xf9, 0x83, - 0x06, 0x00, 0xfb, 0x83, 0x06, 0x00, 0xfd, 0x83, 0x06, 0x00, 0x30, 0x84, - 0x06, 0x00, 0x37, 0x84, 0x06, 0x00, 0x3d, 0x84, 0x06, 0x00, 0x3e, 0x84, - 0x06, 0x00, 0x3f, 0x84, 0x06, 0x00, 0xeb, 0x84, 0x06, 0x00, 0xf0, 0x84, - 0x06, 0x00, 0xf1, 0x84, 0x06, 0x00, 0xf9, 0x84, 0x06, 0x00, 0xfd, 0x84, - 0x06, 0x00, 0xb4, 0x85, 0x06, 0x00, 0xbe, 0x85, 0x06, 0x00, 0xbf, 0x85, - 0x06, 0x00, 0xf1, 0x85, 0x06, 0x00, 0xf3, 0x85, 0x06, 0x00, 0xf9, 0x85, - 0x06, 0x00, 0xfb, 0x85, 0x06, 0x00, 0xfd, 0x85, 0x06, 0x00, 0x30, 0x86, - 0x06, 0x00, 0x37, 0x86, 0x06, 0x00, 0x3d, 0x86, 0x06, 0x00, 0x3e, 0x86, - 0x06, 0x00, 0x3f, 0x86, 0x06, 0x00, 0x30, 0x87, 0x06, 0x00, 0x3e, 0x87, - 0x06, 0x00, 0x8d, 0x87, 0x06, 0x00, 0x8e, 0x87, 0x06, 0x00, 0x8f, 0x87, - 0x06, 0x00, 0xf1, 0x87, 0x06, 0x00, 0xf3, 0x87, 0x06, 0x00, 0xf9, 0x87, - 0x06, 0x00, 0xfb, 0x87, 0x06, 0x00, 0xfd, 0x87, 0x06, 0x00, 0x43, 0x88, - 0x06, 0x00, 0xb0, 0x88, 0x06, 0x00, 0xbe, 0x88, 0x06, 0x00, 0xff, 0x89, - 0x06, 0x00, 0x37, 0x8a, 0x06, 0x00, 0x4f, 0x8c, 0x06, 0x00, 0xb4, 0x8c, - 0x06, 0x00, 0xb8, 0x8c, 0x06, 0x00, 0xff, 0x8d, 0x06, 0x00, 0x33, 0x8e, - 0x06, 0x00, 0x3b, 0x8e, 0x06, 0x00, 0x3f, 0x8e, 0x06, 0x00, 0x4f, 0x8e, - 0x06, 0x00, 0xb4, 0x8e, 0x06, 0x00, 0x31, 0x8f, 0x06, 0x00, 0x38, 0x8f, - 0x06, 0x00, 0xb4, 0x8f, 0x06, 0x00, 0xb8, 0x8f, 0x06, 0x00, 0xe1, 0x8f, - 0x06, 0x00, 0xe2, 0x8f, 0x06, 0x00, 0xed, 0x8f, 0x06, 0x00, 0xee, 0x8f, - 0x06, 0x00, 0xef, 0x8f, 0x06, 0x00, 0xf2, 0x8f, 0x06, 0x00, 0xf8, 0x8f, - 0x06, 0x00, 0xfa, 0x8f, 0x06, 0x00, 0xfc, 0x8f, 0x06, 0x00, 0xfe, 0x8f, - 0x06, 0x00, 0xff, 0x8f, 0x06, 0x00, 0x38, 0x92, 0x06, 0x00, 0x38, 0x93, - 0x06, 0x00, 0xee, 0x93, 0x06, 0x00, 0xef, 0x93, 0x06, 0x00, 0xf8, 0x93, - 0x06, 0x00, 0xf3, 0x95, 0x06, 0x00, 0xfb, 0x95, 0x06, 0x00, 0xff, 0x95, - 0x06, 0x00, 0xf3, 0x99, 0x06, 0x00, 0xfb, 0x99, 0x06, 0x00, 0x38, 0x9c, - 0x06, 0x00, 0xf8, 0x9d, 0x06, 0x00, 0xce, 0x9f, 0x06, 0x00, 0xcf, 0x9f, - 0x06, 0x00, 0xee, 0x9f, 0x06, 0x00, 0xef, 0x9f, 0x06, 0x00, 0xf3, 0x9f, - 0x06, 0x00, 0xfb, 0x9f, 0x06, 0x00, 0x3f, 0xa4, 0x06, 0x00, 0xcf, 0xa5, - 0x06, 0x00, 0xff, 0xa5, 0x06, 0x00, 0x3f, 0xa6, 0x06, 0x00, 0x3e, 0xa7, - 0x06, 0x00, 0x3f, 0xa7, 0x06, 0x00, 0xf3, 0xa7, 0x06, 0x00, 0xfb, 0xa7, - 0x06, 0x00, 0xb8, 0xaa, 0x06, 0x00, 0x8e, 0xab, 0x06, 0x00, 0x8f, 0xab, - 0x06, 0x00, 0x37, 0xb2, 0x06, 0x00, 0x84, 0xb3, 0x06, 0x00, 0x8e, 0xb3, - 0x06, 0x00, 0x8f, 0xb3, 0x06, 0x00, 0xff, 0xb5, 0x06, 0x00, 0xe1, 0xb7, - 0x06, 0x00, 0xe2, 0xb7, 0x06, 0x00, 0xed, 0xb7, 0x06, 0x00, 0xee, 0xb7, - 0x06, 0x00, 0xef, 0xb7, 0x06, 0x00, 0xf2, 0xb7, 0x06, 0x00, 0xf8, 0xb7, - 0x06, 0x00, 0xfa, 0xb7, 0x06, 0x00, 0xfc, 0xb7, 0x06, 0x00, 0xfe, 0xb7, - 0x06, 0x00, 0xff, 0xb7, 0x06, 0x00, 0x37, 0xb8, 0x06, 0x00, 0xeb, 0xb8, - 0x06, 0x00, 0xf8, 0xb8, 0x06, 0x00, 0xfc, 0xb8, 0x06, 0x00, 0xfe, 0xb8, - 0x06, 0x00, 0xff, 0xb8, 0x06, 0x00, 0x37, 0xb9, 0x06, 0x00, 0x51, 0xb9, - 0x06, 0x00, 0x56, 0xb9, 0x06, 0x00, 0x57, 0xb9, 0x06, 0x00, 0x5f, 0xb9, - 0x06, 0x00, 0xb4, 0xb9, 0x06, 0x00, 0x37, 0xba, 0x06, 0x00, 0x37, 0xbc, - 0x06, 0x00, 0xeb, 0xbc, 0x06, 0x00, 0xf8, 0xbc, 0x06, 0x00, 0xfc, 0xbc, - 0x06, 0x00, 0xfe, 0xbc, 0x06, 0x00, 0xff, 0xbc, 0x06, 0x00, 0x37, 0xbd, - 0x06, 0x00, 0x51, 0xbd, 0x06, 0x00, 0x56, 0xbd, 0x06, 0x00, 0x57, 0xbd, - 0x06, 0x00, 0x5f, 0xbd, 0x06, 0x00, 0xb4, 0xbd, 0x06, 0x00, 0xeb, 0xbe, - 0x06, 0x00, 0xff, 0xbe, 0x06, 0x00, 0x84, 0xbf, 0x06, 0x00, 0x8e, 0xbf, - 0x06, 0x00, 0x8f, 0xbf, 0x06, 0x00, 0x30, 0xc2, 0x06, 0x00, 0x36, 0xc2, - 0x06, 0x00, 0x37, 0xc2, 0x06, 0x00, 0x3d, 0xc2, 0x06, 0x00, 0x3e, 0xc2, - 0x06, 0x00, 0x3f, 0xc2, 0x06, 0x00, 0x31, 0xc5, 0x06, 0x00, 0x38, 0xc5, - 0x06, 0x00, 0x31, 0xc9, 0x06, 0x00, 0x38, 0xc9, 0x06, 0x00, 0x51, 0xc9, - 0x06, 0x00, 0x56, 0xc9, 0x06, 0x00, 0x57, 0xc9, 0x06, 0x00, 0x58, 0xc9, - 0x06, 0x00, 0x5c, 0xc9, 0x06, 0x00, 0x5e, 0xc9, 0x06, 0x00, 0x5f, 0xc9, - 0x06, 0x00, 0xf0, 0xcc, 0x06, 0x00, 0xf1, 0xcc, 0x06, 0x00, 0xf9, 0xcc, - 0x06, 0x00, 0xfd, 0xcc, 0x06, 0x00, 0x31, 0xcd, 0x06, 0x00, 0x38, 0xcd, - 0x06, 0x00, 0x51, 0xcd, 0x06, 0x00, 0x56, 0xcd, 0x06, 0x00, 0x57, 0xcd, - 0x06, 0x00, 0x5d, 0xcd, 0x06, 0x00, 0x5e, 0xcd, 0x06, 0x00, 0x5f, 0xcd, - 0x06, 0x00, 0x31, 0xce, 0x06, 0x00, 0x38, 0xce, 0x06, 0x00, 0xf0, 0xce, - 0x06, 0x00, 0xf1, 0xce, 0x06, 0x00, 0xf9, 0xce, 0x06, 0x00, 0xfd, 0xce, - 0x06, 0x00, 0x31, 0xcf, 0x06, 0x00, 0x38, 0xcf, 0x06, 0x00, 0xb8, 0xcf, - 0x06, 0x00, 0x3e, 0xd3, 0x06, 0x00, 0x3f, 0xd3, 0x06, 0x00, 0xe8, 0xd3, - 0x06, 0x00, 0xeb, 0xd3, 0x06, 0x00, 0xf8, 0xd5, 0x06, 0x00, 0xfc, 0xd5, - 0x06, 0x00, 0xfe, 0xd5, 0x06, 0x00, 0xff, 0xd5, 0x06, 0x00, 0xf8, 0xd9, - 0x06, 0x00, 0xfc, 0xd9, 0x06, 0x00, 0xfe, 0xd9, 0x06, 0x00, 0xff, 0xd9, - 0x06, 0x00, 0xf8, 0xdd, 0x06, 0x00, 0xfc, 0xdd, 0x06, 0x00, 0xfe, 0xdd, - 0x06, 0x00, 0xff, 0xdd, 0x06, 0x00, 0x3e, 0xdf, 0x06, 0x00, 0x3f, 0xdf, - 0x06, 0x00, 0xe8, 0xdf, 0x06, 0x00, 0xeb, 0xdf, 0x06, 0x00, 0xbe, 0xe2, - 0x06, 0x00, 0xbf, 0xe2, 0x06, 0x00, 0x30, 0xe5, 0x06, 0x00, 0x37, 0xe5, - 0x06, 0x00, 0x3d, 0xe5, 0x06, 0x00, 0x3e, 0xe5, 0x06, 0x00, 0x3f, 0xe5, - 0x06, 0x00, 0xbe, 0xe5, 0x06, 0x00, 0xbf, 0xe5, 0x06, 0x00, 0x30, 0xe9, - 0x06, 0x00, 0x36, 0xe9, 0x06, 0x00, 0x37, 0xe9, 0x06, 0x00, 0x3d, 0xe9, - 0x06, 0x00, 0x3e, 0xe9, 0x06, 0x00, 0x3f, 0xe9, 0x06, 0x00, 0x51, 0xe9, - 0x06, 0x00, 0x56, 0xe9, 0x06, 0x00, 0x57, 0xe9, 0x06, 0x00, 0x58, 0xe9, - 0x06, 0x00, 0x5c, 0xe9, 0x06, 0x00, 0x5e, 0xe9, 0x06, 0x00, 0x5f, 0xe9, - 0x06, 0x00, 0xf0, 0xec, 0x06, 0x00, 0xf1, 0xec, 0x06, 0x00, 0xf9, 0xec, - 0x06, 0x00, 0xfd, 0xec, 0x06, 0x00, 0x30, 0xed, 0x06, 0x00, 0x36, 0xed, - 0x06, 0x00, 0x37, 0xed, 0x06, 0x00, 0x3d, 0xed, 0x06, 0x00, 0x3e, 0xed, - 0x06, 0x00, 0x3f, 0xed, 0x06, 0x00, 0x51, 0xed, 0x06, 0x00, 0x56, 0xed, - 0x06, 0x00, 0x57, 0xed, 0x06, 0x00, 0x5d, 0xed, 0x06, 0x00, 0x5e, 0xed, - 0x06, 0x00, 0x5f, 0xed, 0x06, 0x00, 0x30, 0xee, 0x06, 0x00, 0x36, 0xee, - 0x06, 0x00, 0x37, 0xee, 0x06, 0x00, 0x3d, 0xee, 0x06, 0x00, 0x3e, 0xee, - 0x06, 0x00, 0x3f, 0xee, 0x06, 0x00, 0xe6, 0xee, 0x06, 0x00, 0xe7, 0xee, - 0x06, 0x00, 0xe8, 0xee, 0x06, 0x00, 0xe9, 0xee, 0x06, 0x00, 0xeb, 0xee, - 0x06, 0x00, 0xf6, 0xee, 0x06, 0x00, 0xf7, 0xee, 0x06, 0x00, 0xf8, 0xee, - 0x06, 0x00, 0xfc, 0xee, 0x06, 0x00, 0xfe, 0xee, 0x06, 0x00, 0xff, 0xee, - 0x06, 0x00, 0x31, 0xef, 0x06, 0x00, 0x38, 0xef, 0x06, 0x00, 0xb8, 0xef, - 0x06, 0x00, 0x30, 0xf3, 0x06, 0x00, 0x36, 0xf3, 0x06, 0x00, 0x37, 0xf3, - 0x06, 0x00, 0x3d, 0xf3, 0x06, 0x00, 0x3e, 0xf3, 0x06, 0x00, 0x3f, 0xf3, - 0x06, 0x00, 0xbe, 0xf3, 0x06, 0x00, 0xbf, 0xf3, 0x06, 0x00, 0xe6, 0xf3, - 0x06, 0x00, 0xe7, 0xf3, 0x06, 0x00, 0xe8, 0xf3, 0x06, 0x00, 0xe9, 0xf3, - 0x06, 0x00, 0xeb, 0xf3, 0x06, 0x00, 0xf0, 0xf3, 0x06, 0x00, 0xf6, 0xf3, - 0x06, 0x00, 0xf7, 0xf3, 0x06, 0x00, 0xfd, 0xf3, 0x06, 0x00, 0xfe, 0xf3, - 0x06, 0x00, 0xff, 0xf3, 0x06, 0x00, 0xf1, 0xf5, 0x06, 0x00, 0xf8, 0xf5, - 0x06, 0x00, 0xbe, 0xf9, 0x06, 0x00, 0xbf, 0xf9, 0x06, 0x00, 0xf7, 0xf9, - 0x06, 0x00, 0xf8, 0xf9, 0x06, 0x00, 0xfc, 0xf9, 0x06, 0x00, 0xfe, 0xf9, - 0x06, 0x00, 0xff, 0xf9, 0x06, 0x00, 0xbe, 0xfc, 0x06, 0x00, 0xbf, 0xfc, - 0x06, 0x00, 0xbe, 0xfd, 0x06, 0x00, 0xbf, 0xfd, 0x06, 0x00, 0xf0, 0xfd, - 0x06, 0x00, 0xf7, 0xfd, 0x06, 0x00, 0xfd, 0xfd, 0x06, 0x00, 0xfe, 0xfd, - 0x06, 0x00, 0xff, 0xfd, 0x06, 0x00, 0xbe, 0xfe, 0x06, 0x00, 0xbf, 0xfe, - 0x06, 0x00, 0x88, 0xff, 0x06, 0x00, 0x8b, 0xff, 0x06, 0x00, 0xc6, 0xff, - 0x06, 0x00, 0xc7, 0xff, 0x06, 0x00, 0xc8, 0xff, 0x06, 0x00, 0xc9, 0xff, - 0x06, 0x00, 0xcb, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xe7, 0xff, - 0x06, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xeb, 0xff, - 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, - 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, - 0x06, 0x00, 0x34, 0x00, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x38, 0x00, - 0x07, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x3e, 0x00, 0x07, 0x00, 0x3f, 0x00, - 0x07, 0x00, 0x43, 0x00, 0x07, 0x00, 0x44, 0x00, 0x07, 0x00, 0x45, 0x00, - 0x07, 0x00, 0x48, 0x00, 0x07, 0x00, 0x4b, 0x00, 0x07, 0x00, 0x4c, 0x00, - 0x07, 0x00, 0x4e, 0x00, 0x07, 0x00, 0x4f, 0x00, 0x07, 0x00, 0xb4, 0x00, - 0x07, 0x00, 0xb5, 0x00, 0x07, 0x00, 0xb8, 0x00, 0x07, 0x00, 0xbc, 0x00, - 0x07, 0x00, 0xbe, 0x00, 0x07, 0x00, 0xbf, 0x00, 0x07, 0x00, 0x34, 0x01, - 0x07, 0x00, 0x35, 0x01, 0x07, 0x00, 0x38, 0x01, 0x07, 0x00, 0x3c, 0x01, - 0x07, 0x00, 0x3e, 0x01, 0x07, 0x00, 0x3f, 0x01, 0x07, 0x00, 0xf3, 0x01, - 0x07, 0x00, 0xfb, 0x01, 0x07, 0x00, 0x33, 0x02, 0x07, 0x00, 0x3b, 0x02, - 0x07, 0x00, 0x34, 0x05, 0x07, 0x00, 0x35, 0x05, 0x07, 0x00, 0x38, 0x05, - 0x07, 0x00, 0x3c, 0x05, 0x07, 0x00, 0x3e, 0x05, 0x07, 0x00, 0x3f, 0x05, - 0x07, 0x00, 0xf3, 0x05, 0x07, 0x00, 0xfb, 0x05, 0x07, 0x00, 0xb3, 0x07, - 0x07, 0x00, 0xbb, 0x07, 0x07, 0x00, 0xb4, 0x08, 0x07, 0x00, 0xb5, 0x08, - 0x07, 0x00, 0xb8, 0x08, 0x07, 0x00, 0xbc, 0x08, 0x07, 0x00, 0xbe, 0x08, - 0x07, 0x00, 0xbf, 0x08, 0x07, 0x00, 0xe4, 0x08, 0x07, 0x00, 0xe5, 0x08, - 0x07, 0x00, 0xe8, 0x08, 0x07, 0x00, 0xeb, 0x08, 0x07, 0x00, 0xec, 0x08, - 0x07, 0x00, 0xee, 0x08, 0x07, 0x00, 0xef, 0x08, 0x07, 0x00, 0xf4, 0x08, - 0x07, 0x00, 0xf5, 0x08, 0x07, 0x00, 0xf8, 0x08, 0x07, 0x00, 0xfc, 0x08, - 0x07, 0x00, 0xfe, 0x08, 0x07, 0x00, 0xff, 0x08, 0x07, 0x00, 0x38, 0x09, - 0x07, 0x00, 0x3c, 0x09, 0x07, 0x00, 0x3e, 0x09, 0x07, 0x00, 0x3f, 0x09, - 0x07, 0x00, 0x53, 0x09, 0x07, 0x00, 0x54, 0x09, 0x07, 0x00, 0x55, 0x09, - 0x07, 0x00, 0x5b, 0x09, 0x07, 0x00, 0xf3, 0x09, 0x07, 0x00, 0xfb, 0x09, - 0x07, 0x00, 0xeb, 0x0a, 0x07, 0x00, 0xf8, 0x0a, 0x07, 0x00, 0xfc, 0x0a, - 0x07, 0x00, 0xfe, 0x0a, 0x07, 0x00, 0xff, 0x0a, 0x07, 0x00, 0x34, 0x0b, - 0x07, 0x00, 0x35, 0x0b, 0x07, 0x00, 0x38, 0x0b, 0x07, 0x00, 0x3c, 0x0b, - 0x07, 0x00, 0x3e, 0x0b, 0x07, 0x00, 0x3f, 0x0b, 0x07, 0x00, 0xb4, 0x0b, - 0x07, 0x00, 0xb5, 0x0b, 0x07, 0x00, 0xb8, 0x0b, 0x07, 0x00, 0xbc, 0x0b, - 0x07, 0x00, 0xbe, 0x0b, 0x07, 0x00, 0xbf, 0x0b, 0x07, 0x00, 0xe3, 0x0b, - 0x07, 0x00, 0xf3, 0x0b, 0x07, 0x00, 0xfb, 0x0b, 0x07, 0x00, 0xe4, 0x0c, - 0x07, 0x00, 0xe5, 0x0c, 0x07, 0x00, 0xe8, 0x0c, 0x07, 0x00, 0xeb, 0x0c, - 0x07, 0x00, 0xec, 0x0c, 0x07, 0x00, 0xee, 0x0c, 0x07, 0x00, 0xef, 0x0c, - 0x07, 0x00, 0xf4, 0x0c, 0x07, 0x00, 0xf5, 0x0c, 0x07, 0x00, 0xf8, 0x0c, - 0x07, 0x00, 0xfc, 0x0c, 0x07, 0x00, 0xfe, 0x0c, 0x07, 0x00, 0xff, 0x0c, - 0x07, 0x00, 0x33, 0x0d, 0x07, 0x00, 0x3b, 0x0d, 0x07, 0x00, 0x58, 0x0d, - 0x07, 0x00, 0x5c, 0x0d, 0x07, 0x00, 0x5e, 0x0d, 0x07, 0x00, 0x5f, 0x0d, - 0x07, 0x00, 0xc3, 0x0d, 0x07, 0x00, 0xcf, 0x0d, 0x07, 0x00, 0xf8, 0x0d, - 0x07, 0x00, 0xfc, 0x0d, 0x07, 0x00, 0xfe, 0x0d, 0x07, 0x00, 0xff, 0x0d, - 0x07, 0x00, 0xeb, 0x0e, 0x07, 0x00, 0xee, 0x0e, 0x07, 0x00, 0xef, 0x0e, - 0x07, 0x00, 0xf8, 0x0e, 0x07, 0x00, 0xfc, 0x0e, 0x07, 0x00, 0xfe, 0x0e, - 0x07, 0x00, 0xff, 0x0e, 0x07, 0x00, 0x38, 0x10, 0x07, 0x00, 0x48, 0x10, - 0x07, 0x00, 0xb8, 0x10, 0x07, 0x00, 0x34, 0x11, 0x07, 0x00, 0x35, 0x11, - 0x07, 0x00, 0x38, 0x11, 0x07, 0x00, 0x3c, 0x11, 0x07, 0x00, 0x3e, 0x11, - 0x07, 0x00, 0x3f, 0x11, 0x07, 0x00, 0xb4, 0x11, 0x07, 0x00, 0xb5, 0x11, - 0x07, 0x00, 0xb8, 0x11, 0x07, 0x00, 0xbc, 0x11, 0x07, 0x00, 0xbe, 0x11, - 0x07, 0x00, 0xbf, 0x11, 0x07, 0x00, 0xf3, 0x11, 0x07, 0x00, 0xfb, 0x11, - 0x07, 0x00, 0x38, 0x12, 0x07, 0x00, 0xf8, 0x12, 0x07, 0x00, 0xfc, 0x12, - 0x07, 0x00, 0xfe, 0x12, 0x07, 0x00, 0xff, 0x12, 0x07, 0x00, 0x3e, 0x13, - 0x07, 0x00, 0x3f, 0x13, 0x07, 0x00, 0xc8, 0x13, 0x07, 0x00, 0xf3, 0x13, - 0x07, 0x00, 0xfb, 0x13, 0x07, 0x00, 0x34, 0x14, 0x07, 0x00, 0x3e, 0x14, - 0x07, 0x00, 0x3f, 0x14, 0x07, 0x00, 0xb3, 0x14, 0x07, 0x00, 0xbb, 0x14, - 0x07, 0x00, 0xe3, 0x14, 0x07, 0x00, 0xf3, 0x14, 0x07, 0x00, 0xfb, 0x14, - 0x07, 0x00, 0xb3, 0x16, 0x07, 0x00, 0xbb, 0x16, 0x07, 0x00, 0xb3, 0x17, - 0x07, 0x00, 0xbb, 0x17, 0x07, 0x00, 0xc3, 0x17, 0x07, 0x00, 0xc4, 0x17, - 0x07, 0x00, 0xc5, 0x17, 0x07, 0x00, 0xc8, 0x17, 0x07, 0x00, 0xcb, 0x17, - 0x07, 0x00, 0xcc, 0x17, 0x07, 0x00, 0xce, 0x17, 0x07, 0x00, 0xcf, 0x17, - 0x07, 0x00, 0xe4, 0x17, 0x07, 0x00, 0xe5, 0x17, 0x07, 0x00, 0xe8, 0x17, - 0x07, 0x00, 0xeb, 0x17, 0x07, 0x00, 0xec, 0x17, 0x07, 0x00, 0xee, 0x17, - 0x07, 0x00, 0xef, 0x17, 0x07, 0x00, 0xf4, 0x17, 0x07, 0x00, 0xf5, 0x17, - 0x07, 0x00, 0xf8, 0x17, 0x07, 0x00, 0xfc, 0x17, 0x07, 0x00, 0xfe, 0x17, - 0x07, 0x00, 0xff, 0x17, 0x07, 0x00, 0x3e, 0x18, 0x07, 0x00, 0x3f, 0x18, - 0x07, 0x00, 0x3e, 0x1a, 0x07, 0x00, 0x3f, 0x1a, 0x07, 0x00, 0xb4, 0x1a, - 0x07, 0x00, 0xb5, 0x1a, 0x07, 0x00, 0xb8, 0x1a, 0x07, 0x00, 0xbc, 0x1a, - 0x07, 0x00, 0xbe, 0x1a, 0x07, 0x00, 0xbf, 0x1a, 0x07, 0x00, 0x38, 0x1b, - 0x07, 0x00, 0xb8, 0x1b, 0x07, 0x00, 0xc4, 0x1b, 0x07, 0x00, 0xc5, 0x1b, - 0x07, 0x00, 0xce, 0x1b, 0x07, 0x00, 0xcf, 0x1b, 0x07, 0x00, 0xf4, 0x1b, - 0x07, 0x00, 0xf5, 0x1b, 0x07, 0x00, 0xf8, 0x1b, 0x07, 0x00, 0xfc, 0x1b, - 0x07, 0x00, 0xfe, 0x1b, 0x07, 0x00, 0xff, 0x1b, 0x07, 0x00, 0xf3, 0x1f, - 0x07, 0x00, 0xfb, 0x1f, 0x07, 0x00, 0xf8, 0x29, 0x07, 0x00, 0xfc, 0x29, - 0x07, 0x00, 0xfe, 0x29, 0x07, 0x00, 0xff, 0x29, 0x07, 0x00, 0xf8, 0x2d, - 0x07, 0x00, 0xfc, 0x2d, 0x07, 0x00, 0xfe, 0x2d, 0x07, 0x00, 0xff, 0x2d, - 0x07, 0x00, 0x30, 0x39, 0x07, 0x00, 0x31, 0x39, 0x07, 0x00, 0x39, 0x39, - 0x07, 0x00, 0x3d, 0x39, 0x07, 0x00, 0xcb, 0x39, 0x07, 0x00, 0xf7, 0x39, - 0x07, 0x00, 0xf8, 0x39, 0x07, 0x00, 0xfc, 0x39, 0x07, 0x00, 0xfe, 0x39, - 0x07, 0x00, 0xff, 0x39, 0x07, 0x00, 0x37, 0x3d, 0x07, 0x00, 0x38, 0x3d, - 0x07, 0x00, 0x3c, 0x3d, 0x07, 0x00, 0x3e, 0x3d, 0x07, 0x00, 0x3f, 0x3d, - 0x07, 0x00, 0xf0, 0x3d, 0x07, 0x00, 0xf1, 0x3d, 0x07, 0x00, 0xf9, 0x3d, - 0x07, 0x00, 0xfd, 0x3d, 0x07, 0x00, 0x48, 0x3e, 0x07, 0x00, 0x4b, 0x3e, - 0x07, 0x00, 0x88, 0x3f, 0x07, 0x00, 0x8b, 0x3f, 0x07, 0x00, 0x30, 0x40, - 0x07, 0x00, 0x31, 0x40, 0x07, 0x00, 0x39, 0x40, 0x07, 0x00, 0x3d, 0x40, - 0x07, 0x00, 0xb7, 0x40, 0x07, 0x00, 0xb8, 0x40, 0x07, 0x00, 0xbc, 0x40, - 0x07, 0x00, 0xbe, 0x40, 0x07, 0x00, 0xbf, 0x40, 0x07, 0x00, 0x37, 0x41, - 0x07, 0x00, 0x38, 0x41, 0x07, 0x00, 0x3c, 0x41, 0x07, 0x00, 0x3e, 0x41, - 0x07, 0x00, 0x3f, 0x41, 0x07, 0x00, 0x4b, 0x41, 0x07, 0x00, 0xf0, 0x41, - 0x07, 0x00, 0xf1, 0x41, 0x07, 0x00, 0xf9, 0x41, 0x07, 0x00, 0xfd, 0x41, - 0x07, 0x00, 0x30, 0x42, 0x07, 0x00, 0x31, 0x42, 0x07, 0x00, 0x39, 0x42, - 0x07, 0x00, 0x3d, 0x42, 0x07, 0x00, 0x4b, 0x42, 0x07, 0x00, 0xb8, 0x42, - 0x07, 0x00, 0xbc, 0x42, 0x07, 0x00, 0xbe, 0x42, 0x07, 0x00, 0xbf, 0x42, - 0x07, 0x00, 0x4b, 0x43, 0x07, 0x00, 0x37, 0x45, 0x07, 0x00, 0x38, 0x45, - 0x07, 0x00, 0x3c, 0x45, 0x07, 0x00, 0x3e, 0x45, 0x07, 0x00, 0x3f, 0x45, - 0x07, 0x00, 0xb8, 0x45, 0x07, 0x00, 0xbc, 0x45, 0x07, 0x00, 0xbe, 0x45, - 0x07, 0x00, 0xbf, 0x45, 0x07, 0x00, 0xf0, 0x45, 0x07, 0x00, 0xf1, 0x45, - 0x07, 0x00, 0xf9, 0x45, 0x07, 0x00, 0xfd, 0x45, 0x07, 0x00, 0xb7, 0x47, - 0x07, 0x00, 0xb8, 0x47, 0x07, 0x00, 0xbc, 0x47, 0x07, 0x00, 0xbe, 0x47, - 0x07, 0x00, 0xbf, 0x47, 0x07, 0x00, 0xb0, 0x48, 0x07, 0x00, 0xbd, 0x48, - 0x07, 0x00, 0xbe, 0x48, 0x07, 0x00, 0xbf, 0x48, 0x07, 0x00, 0xeb, 0x48, - 0x07, 0x00, 0xf8, 0x48, 0x07, 0x00, 0xfc, 0x48, 0x07, 0x00, 0xfe, 0x48, - 0x07, 0x00, 0xff, 0x48, 0x07, 0x00, 0x37, 0x49, 0x07, 0x00, 0x50, 0x49, - 0x07, 0x00, 0x51, 0x49, 0x07, 0x00, 0x56, 0x49, 0x07, 0x00, 0x57, 0x49, - 0x07, 0x00, 0x5f, 0x49, 0x07, 0x00, 0xff, 0x49, 0x07, 0x00, 0xb7, 0x4a, - 0x07, 0x00, 0x30, 0x4b, 0x07, 0x00, 0x3d, 0x4b, 0x07, 0x00, 0x3e, 0x4b, - 0x07, 0x00, 0x3f, 0x4b, 0x07, 0x00, 0xb1, 0x4b, 0x07, 0x00, 0xb7, 0x4b, - 0x07, 0x00, 0xb8, 0x4b, 0x07, 0x00, 0xe7, 0x4b, 0x07, 0x00, 0xf0, 0x4b, - 0x07, 0x00, 0xf1, 0x4b, 0x07, 0x00, 0xf7, 0x4b, 0x07, 0x00, 0xf9, 0x4b, - 0x07, 0x00, 0xfd, 0x4b, 0x07, 0x00, 0x37, 0x4c, 0x07, 0x00, 0xf8, 0x4c, - 0x07, 0x00, 0xfc, 0x4c, 0x07, 0x00, 0xfe, 0x4c, 0x07, 0x00, 0xff, 0x4c, - 0x07, 0x00, 0x37, 0x4d, 0x07, 0x00, 0x51, 0x4d, 0x07, 0x00, 0x56, 0x4d, - 0x07, 0x00, 0x57, 0x4d, 0x07, 0x00, 0x5f, 0x4d, 0x07, 0x00, 0xff, 0x4d, - 0x07, 0x00, 0x37, 0x4e, 0x07, 0x00, 0xff, 0x4e, 0x07, 0x00, 0x30, 0x4f, - 0x07, 0x00, 0x31, 0x4f, 0x07, 0x00, 0x37, 0x4f, 0x07, 0x00, 0x39, 0x4f, - 0x07, 0x00, 0x3d, 0x4f, 0x07, 0x00, 0x4b, 0x52, 0x07, 0x00, 0xb8, 0x52, - 0x07, 0x00, 0xbc, 0x52, 0x07, 0x00, 0xbe, 0x52, 0x07, 0x00, 0xbf, 0x52, - 0x07, 0x00, 0x37, 0x55, 0x07, 0x00, 0x50, 0x55, 0x07, 0x00, 0x51, 0x55, - 0x07, 0x00, 0x56, 0x55, 0x07, 0x00, 0x57, 0x55, 0x07, 0x00, 0x5f, 0x55, - 0x07, 0x00, 0xff, 0x55, 0x07, 0x00, 0x37, 0x59, 0x07, 0x00, 0x38, 0x59, - 0x07, 0x00, 0x3c, 0x59, 0x07, 0x00, 0x3e, 0x59, 0x07, 0x00, 0x3f, 0x59, - 0x07, 0x00, 0xf0, 0x59, 0x07, 0x00, 0xf1, 0x59, 0x07, 0x00, 0xf9, 0x59, - 0x07, 0x00, 0xfd, 0x59, 0x07, 0x00, 0x4b, 0x5c, 0x07, 0x00, 0xb8, 0x5c, - 0x07, 0x00, 0xbc, 0x5c, 0x07, 0x00, 0xbe, 0x5c, 0x07, 0x00, 0xbf, 0x5c, - 0x07, 0x00, 0x30, 0x5d, 0x07, 0x00, 0x31, 0x5d, 0x07, 0x00, 0x39, 0x5d, - 0x07, 0x00, 0x3d, 0x5d, 0x07, 0x00, 0xcb, 0x5d, 0x07, 0x00, 0xf7, 0x5d, - 0x07, 0x00, 0xf8, 0x5d, 0x07, 0x00, 0xfc, 0x5d, 0x07, 0x00, 0xfe, 0x5d, - 0x07, 0x00, 0xff, 0x5d, 0x07, 0x00, 0xb8, 0x5e, 0x07, 0x00, 0xbc, 0x5e, - 0x07, 0x00, 0xbe, 0x5e, 0x07, 0x00, 0xbf, 0x5e, 0x07, 0x00, 0x38, 0x60, - 0x07, 0x00, 0xb4, 0x60, 0x07, 0x00, 0xbe, 0x60, 0x07, 0x00, 0xbf, 0x60, - 0x07, 0x00, 0x38, 0x61, 0x07, 0x00, 0x3c, 0x61, 0x07, 0x00, 0x3e, 0x61, - 0x07, 0x00, 0x3f, 0x61, 0x07, 0x00, 0x43, 0x61, 0x07, 0x00, 0x4f, 0x61, - 0x07, 0x00, 0xb8, 0x61, 0x07, 0x00, 0xbc, 0x61, 0x07, 0x00, 0xbe, 0x61, - 0x07, 0x00, 0xbf, 0x61, 0x07, 0x00, 0xf3, 0x61, 0x07, 0x00, 0xfb, 0x61, - 0x07, 0x00, 0x33, 0x65, 0x07, 0x00, 0x3b, 0x65, 0x07, 0x00, 0x3f, 0x65, - 0x07, 0x00, 0xf3, 0x65, 0x07, 0x00, 0xfb, 0x65, 0x07, 0x00, 0xff, 0x66, - 0x07, 0x00, 0x33, 0x67, 0x07, 0x00, 0x3b, 0x67, 0x07, 0x00, 0x83, 0x67, - 0x07, 0x00, 0x8e, 0x67, 0x07, 0x00, 0x8f, 0x67, 0x07, 0x00, 0xb4, 0x68, - 0x07, 0x00, 0xbe, 0x68, 0x07, 0x00, 0xbf, 0x68, 0x07, 0x00, 0xcf, 0x68, - 0x07, 0x00, 0xf8, 0x68, 0x07, 0x00, 0xfc, 0x68, 0x07, 0x00, 0xfe, 0x68, - 0x07, 0x00, 0xff, 0x68, 0x07, 0x00, 0x33, 0x69, 0x07, 0x00, 0x3b, 0x69, - 0x07, 0x00, 0xf8, 0x69, 0x07, 0x00, 0xfc, 0x69, 0x07, 0x00, 0xfe, 0x69, - 0x07, 0x00, 0xff, 0x69, 0x07, 0x00, 0x3e, 0x6a, 0x07, 0x00, 0x3f, 0x6a, - 0x07, 0x00, 0xb8, 0x6a, 0x07, 0x00, 0xbc, 0x6a, 0x07, 0x00, 0xbe, 0x6a, - 0x07, 0x00, 0xbf, 0x6a, 0x07, 0x00, 0x34, 0x6b, 0x07, 0x00, 0x3e, 0x6b, - 0x07, 0x00, 0x3f, 0x6b, 0x07, 0x00, 0xb4, 0x6b, 0x07, 0x00, 0xbe, 0x6b, - 0x07, 0x00, 0xbf, 0x6b, 0x07, 0x00, 0xf3, 0x6b, 0x07, 0x00, 0xfb, 0x6b, - 0x07, 0x00, 0x34, 0x6c, 0x07, 0x00, 0x3e, 0x6c, 0x07, 0x00, 0x3f, 0x6c, - 0x07, 0x00, 0xf3, 0x6c, 0x07, 0x00, 0xfb, 0x6c, 0x07, 0x00, 0x38, 0x6d, - 0x07, 0x00, 0xf8, 0x6d, 0x07, 0x00, 0xfc, 0x6d, 0x07, 0x00, 0xfe, 0x6d, - 0x07, 0x00, 0xff, 0x6d, 0x07, 0x00, 0x38, 0x6e, 0x07, 0x00, 0x3c, 0x6e, - 0x07, 0x00, 0x3e, 0x6e, 0x07, 0x00, 0x3f, 0x6e, 0x07, 0x00, 0xf3, 0x6e, - 0x07, 0x00, 0xfb, 0x6e, 0x07, 0x00, 0x33, 0x6f, 0x07, 0x00, 0x3b, 0x6f, - 0x07, 0x00, 0x33, 0x70, 0x07, 0x00, 0x3b, 0x70, 0x07, 0x00, 0x3f, 0x70, - 0x07, 0x00, 0x4f, 0x70, 0x07, 0x00, 0xb4, 0x70, 0x07, 0x00, 0xb8, 0x70, - 0x07, 0x00, 0x33, 0x71, 0x07, 0x00, 0x3b, 0x71, 0x07, 0x00, 0x5b, 0x71, - 0x07, 0x00, 0xb3, 0x71, 0x07, 0x00, 0xbb, 0x71, 0x07, 0x00, 0xff, 0x71, - 0x07, 0x00, 0x3f, 0x72, 0x07, 0x00, 0xcb, 0x72, 0x07, 0x00, 0xeb, 0x72, - 0x07, 0x00, 0x3e, 0x73, 0x07, 0x00, 0x3f, 0x73, 0x07, 0x00, 0xf3, 0x73, - 0x07, 0x00, 0xfb, 0x73, 0x07, 0x00, 0x33, 0x74, 0x07, 0x00, 0x3b, 0x74, - 0x07, 0x00, 0x3f, 0x74, 0x07, 0x00, 0xb3, 0x74, 0x07, 0x00, 0xbb, 0x74, - 0x07, 0x00, 0xe3, 0x74, 0x07, 0x00, 0xeb, 0x74, 0x07, 0x00, 0xf3, 0x74, - 0x07, 0x00, 0xfb, 0x74, 0x07, 0x00, 0xb3, 0x76, 0x07, 0x00, 0xbb, 0x76, - 0x07, 0x00, 0xb3, 0x77, 0x07, 0x00, 0xbb, 0x77, 0x07, 0x00, 0xce, 0x77, - 0x07, 0x00, 0xcf, 0x77, 0x07, 0x00, 0xee, 0x77, 0x07, 0x00, 0xef, 0x77, - 0x07, 0x00, 0xf8, 0x77, 0x07, 0x00, 0xfc, 0x77, 0x07, 0x00, 0xfe, 0x77, - 0x07, 0x00, 0xff, 0x77, 0x07, 0x00, 0xb3, 0x7a, 0x07, 0x00, 0xbb, 0x7a, - 0x07, 0x00, 0xff, 0x7a, 0x07, 0x00, 0x34, 0x7b, 0x07, 0x00, 0x38, 0x7b, - 0x07, 0x00, 0xb4, 0x7b, 0x07, 0x00, 0xb8, 0x7b, 0x07, 0x00, 0xee, 0x7b, - 0x07, 0x00, 0xef, 0x7b, 0x07, 0x00, 0xf8, 0x7b, 0x07, 0x00, 0xfc, 0x7b, - 0x07, 0x00, 0xfe, 0x7b, 0x07, 0x00, 0xff, 0x7b, 0x07, 0x00, 0xc3, 0x7f, - 0x07, 0x00, 0xcb, 0x7f, 0x07, 0x00, 0xe3, 0x7f, 0x07, 0x00, 0xeb, 0x7f, - 0x07, 0x00, 0xf3, 0x7f, 0x07, 0x00, 0xfb, 0x7f, 0x07, 0x00, 0xc3, 0x83, - 0x07, 0x00, 0xc4, 0x83, 0x07, 0x00, 0xc5, 0x83, 0x07, 0x00, 0xc6, 0x83, - 0x07, 0x00, 0xc7, 0x83, 0x07, 0x00, 0xc8, 0x83, 0x07, 0x00, 0xcb, 0x83, - 0x07, 0x00, 0xcc, 0x83, 0x07, 0x00, 0xce, 0x83, 0x07, 0x00, 0xcf, 0x83, - 0x07, 0x00, 0xf2, 0x83, 0x07, 0x00, 0xf4, 0x83, 0x07, 0x00, 0xf5, 0x83, - 0x07, 0x00, 0xf6, 0x83, 0x07, 0x00, 0xf7, 0x83, 0x07, 0x00, 0xf8, 0x83, - 0x07, 0x00, 0xfa, 0x83, 0x07, 0x00, 0xfc, 0x83, 0x07, 0x00, 0xfe, 0x83, - 0x07, 0x00, 0xff, 0x83, 0x07, 0x00, 0x36, 0x84, 0x07, 0x00, 0x37, 0x84, - 0x07, 0x00, 0x38, 0x84, 0x07, 0x00, 0x3c, 0x84, 0x07, 0x00, 0x3e, 0x84, - 0x07, 0x00, 0x3f, 0x84, 0x07, 0x00, 0x32, 0x85, 0x07, 0x00, 0x34, 0x85, - 0x07, 0x00, 0x35, 0x85, 0x07, 0x00, 0x36, 0x85, 0x07, 0x00, 0x37, 0x85, - 0x07, 0x00, 0x38, 0x85, 0x07, 0x00, 0x3a, 0x85, 0x07, 0x00, 0x3c, 0x85, - 0x07, 0x00, 0x3e, 0x85, 0x07, 0x00, 0x3f, 0x85, 0x07, 0x00, 0xb4, 0x85, - 0x07, 0x00, 0xb5, 0x85, 0x07, 0x00, 0xb8, 0x85, 0x07, 0x00, 0xbc, 0x85, - 0x07, 0x00, 0xbe, 0x85, 0x07, 0x00, 0xbf, 0x85, 0x07, 0x00, 0xc0, 0x85, - 0x07, 0x00, 0xc1, 0x85, 0x07, 0x00, 0xc2, 0x85, 0x07, 0x00, 0xc9, 0x85, - 0x07, 0x00, 0xca, 0x85, 0x07, 0x00, 0xcd, 0x85, 0x07, 0x00, 0xf0, 0x85, - 0x07, 0x00, 0xf1, 0x85, 0x07, 0x00, 0xf3, 0x85, 0x07, 0x00, 0xf9, 0x85, - 0x07, 0x00, 0xfb, 0x85, 0x07, 0x00, 0xfd, 0x85, 0x07, 0x00, 0xc6, 0x86, - 0x07, 0x00, 0xc7, 0x86, 0x07, 0x00, 0xc8, 0x86, 0x07, 0x00, 0xcb, 0x86, - 0x07, 0x00, 0xf6, 0x86, 0x07, 0x00, 0xf7, 0x86, 0x07, 0x00, 0xf8, 0x86, - 0x07, 0x00, 0xfc, 0x86, 0x07, 0x00, 0xfe, 0x86, 0x07, 0x00, 0xff, 0x86, - 0x07, 0x00, 0xb0, 0x87, 0x07, 0x00, 0xb1, 0x87, 0x07, 0x00, 0xb3, 0x87, - 0x07, 0x00, 0xb9, 0x87, 0x07, 0x00, 0xbb, 0x87, 0x07, 0x00, 0xbd, 0x87, - 0x07, 0x00, 0xf0, 0x8a, 0x07, 0x00, 0xf1, 0x8a, 0x07, 0x00, 0xf9, 0x8a, - 0x07, 0x00, 0xfd, 0x8a, 0x07, 0x00, 0x30, 0x8b, 0x07, 0x00, 0x31, 0x8b, - 0x07, 0x00, 0x33, 0x8b, 0x07, 0x00, 0x39, 0x8b, 0x07, 0x00, 0x3b, 0x8b, - 0x07, 0x00, 0x3d, 0x8b, 0x07, 0x00, 0xb2, 0x8b, 0x07, 0x00, 0xb4, 0x8b, - 0x07, 0x00, 0xb5, 0x8b, 0x07, 0x00, 0xb6, 0x8b, 0x07, 0x00, 0xb7, 0x8b, - 0x07, 0x00, 0xb8, 0x8b, 0x07, 0x00, 0xba, 0x8b, 0x07, 0x00, 0xbc, 0x8b, - 0x07, 0x00, 0xbe, 0x8b, 0x07, 0x00, 0xbf, 0x8b, 0x07, 0x00, 0xe0, 0x8b, - 0x07, 0x00, 0xe1, 0x8b, 0x07, 0x00, 0xe2, 0x8b, 0x07, 0x00, 0xe4, 0x8b, - 0x07, 0x00, 0xe5, 0x8b, 0x07, 0x00, 0xe6, 0x8b, 0x07, 0x00, 0xe7, 0x8b, - 0x07, 0x00, 0xe8, 0x8b, 0x07, 0x00, 0xeb, 0x8b, 0x07, 0x00, 0xec, 0x8b, - 0x07, 0x00, 0xee, 0x8b, 0x07, 0x00, 0xef, 0x8b, 0x07, 0x00, 0xf2, 0x8b, - 0x07, 0x00, 0xf4, 0x8b, 0x07, 0x00, 0xf5, 0x8b, 0x07, 0x00, 0xf6, 0x8b, - 0x07, 0x00, 0xf7, 0x8b, 0x07, 0x00, 0xf8, 0x8b, 0x07, 0x00, 0xfa, 0x8b, - 0x07, 0x00, 0xfc, 0x8b, 0x07, 0x00, 0xfe, 0x8b, 0x07, 0x00, 0xff, 0x8b, - 0x07, 0x00, 0xe3, 0x8f, 0x07, 0x00, 0xe9, 0x8f, 0x07, 0x00, 0xea, 0x8f, - 0x07, 0x00, 0xed, 0x8f, 0x07, 0x00, 0xf0, 0x8f, 0x07, 0x00, 0xf1, 0x8f, - 0x07, 0x00, 0xf3, 0x8f, 0x07, 0x00, 0xf9, 0x8f, 0x07, 0x00, 0xfb, 0x8f, - 0x07, 0x00, 0xfd, 0x8f, 0x07, 0x00, 0x34, 0x99, 0x07, 0x00, 0x35, 0x99, - 0x07, 0x00, 0x38, 0x99, 0x07, 0x00, 0x3c, 0x99, 0x07, 0x00, 0x3e, 0x99, - 0x07, 0x00, 0x3f, 0x99, 0x07, 0x00, 0xf3, 0x99, 0x07, 0x00, 0xfb, 0x99, - 0x07, 0x00, 0x3e, 0x9c, 0x07, 0x00, 0x3f, 0x9c, 0x07, 0x00, 0xc8, 0x9c, - 0x07, 0x00, 0xcb, 0x9c, 0x07, 0x00, 0xf8, 0x9c, 0x07, 0x00, 0xfc, 0x9c, - 0x07, 0x00, 0xfe, 0x9c, 0x07, 0x00, 0xff, 0x9c, 0x07, 0x00, 0x3e, 0x9d, - 0x07, 0x00, 0x3f, 0x9d, 0x07, 0x00, 0xf3, 0x9d, 0x07, 0x00, 0xfb, 0x9d, - 0x07, 0x00, 0x38, 0x9e, 0x07, 0x00, 0x3c, 0x9e, 0x07, 0x00, 0x3e, 0x9e, - 0x07, 0x00, 0x3f, 0x9e, 0x07, 0x00, 0x33, 0x9f, 0x07, 0x00, 0x3b, 0x9f, - 0x07, 0x00, 0xcb, 0xa5, 0x07, 0x00, 0xf8, 0xa5, 0x07, 0x00, 0xfc, 0xa5, - 0x07, 0x00, 0xfe, 0xa5, 0x07, 0x00, 0xff, 0xa5, 0x07, 0x00, 0xb8, 0xaa, - 0x07, 0x00, 0xbc, 0xaa, 0x07, 0x00, 0xbe, 0xaa, 0x07, 0x00, 0xbf, 0xaa, - 0x07, 0x00, 0x38, 0xab, 0x07, 0x00, 0xb8, 0xab, 0x07, 0x00, 0xf8, 0xab, - 0x07, 0x00, 0xfc, 0xab, 0x07, 0x00, 0xfe, 0xab, 0x07, 0x00, 0xff, 0xab, - 0x07, 0x00, 0xf8, 0xaf, 0x07, 0x00, 0xfc, 0xaf, 0x07, 0x00, 0xfe, 0xaf, - 0x07, 0x00, 0xff, 0xaf, 0x07, 0x00, 0x30, 0xb3, 0x07, 0x00, 0x31, 0xb3, - 0x07, 0x00, 0x39, 0xb3, 0x07, 0x00, 0x3d, 0xb3, 0x07, 0x00, 0xe6, 0xb3, - 0x07, 0x00, 0xe7, 0xb3, 0x07, 0x00, 0xe8, 0xb3, 0x07, 0x00, 0xeb, 0xb3, - 0x07, 0x00, 0xf6, 0xb3, 0x07, 0x00, 0xf7, 0xb3, 0x07, 0x00, 0xf8, 0xb3, - 0x07, 0x00, 0xfc, 0xb3, 0x07, 0x00, 0xfe, 0xb3, 0x07, 0x00, 0xff, 0xb3, - 0x07, 0x00, 0xf0, 0xb5, 0x07, 0x00, 0xf1, 0xb5, 0x07, 0x00, 0xf9, 0xb5, - 0x07, 0x00, 0xfd, 0xb5, 0x07, 0x00, 0xb8, 0xb9, 0x07, 0x00, 0xbc, 0xb9, - 0x07, 0x00, 0xbe, 0xb9, 0x07, 0x00, 0xbf, 0xb9, 0x07, 0x00, 0x30, 0xbb, - 0x07, 0x00, 0x31, 0xbb, 0x07, 0x00, 0x39, 0xbb, 0x07, 0x00, 0x3d, 0xbb, - 0x07, 0x00, 0xb6, 0xbb, 0x07, 0x00, 0xb7, 0xbb, 0x07, 0x00, 0xb8, 0xbb, - 0x07, 0x00, 0xbc, 0xbb, 0x07, 0x00, 0xbe, 0xbb, 0x07, 0x00, 0xbf, 0xbb, - 0x07, 0x00, 0xe6, 0xbb, 0x07, 0x00, 0xe7, 0xbb, 0x07, 0x00, 0xe8, 0xbb, - 0x07, 0x00, 0xeb, 0xbb, 0x07, 0x00, 0xf6, 0xbb, 0x07, 0x00, 0xf7, 0xbb, - 0x07, 0x00, 0xf8, 0xbb, 0x07, 0x00, 0xfc, 0xbb, 0x07, 0x00, 0xfe, 0xbb, - 0x07, 0x00, 0xff, 0xbb, 0x07, 0x00, 0x36, 0xbf, 0x07, 0x00, 0x37, 0xbf, - 0x07, 0x00, 0x38, 0xbf, 0x07, 0x00, 0x3c, 0xbf, 0x07, 0x00, 0x3e, 0xbf, - 0x07, 0x00, 0x3f, 0xbf, 0x07, 0x00, 0xb8, 0xbf, 0x07, 0x00, 0xbc, 0xbf, - 0x07, 0x00, 0xbe, 0xbf, 0x07, 0x00, 0xbf, 0xbf, 0x07, 0x00, 0xe9, 0xbf, - 0x07, 0x00, 0xea, 0xbf, 0x07, 0x00, 0xf0, 0xbf, 0x07, 0x00, 0xf1, 0xbf, - 0x07, 0x00, 0xf9, 0xbf, 0x07, 0x00, 0xfd, 0xbf, 0x07, 0x00, 0xb4, 0xc2, - 0x07, 0x00, 0xb5, 0xc2, 0x07, 0x00, 0xb8, 0xc2, 0x07, 0x00, 0xbc, 0xc2, - 0x07, 0x00, 0xbe, 0xc2, 0x07, 0x00, 0xbf, 0xc2, 0x07, 0x00, 0xf2, 0xc9, - 0x07, 0x00, 0xf7, 0xc9, 0x07, 0x00, 0xf8, 0xc9, 0x07, 0x00, 0xfa, 0xc9, - 0x07, 0x00, 0xfc, 0xc9, 0x07, 0x00, 0xfe, 0xc9, 0x07, 0x00, 0xff, 0xc9, - 0x07, 0x00, 0xb3, 0xcc, 0x07, 0x00, 0xbb, 0xcc, 0x07, 0x00, 0xf2, 0xcd, - 0x07, 0x00, 0xf7, 0xcd, 0x07, 0x00, 0xf8, 0xcd, 0x07, 0x00, 0xfa, 0xcd, - 0x07, 0x00, 0xfc, 0xcd, 0x07, 0x00, 0xfe, 0xcd, 0x07, 0x00, 0xff, 0xcd, - 0x07, 0x00, 0xb3, 0xce, 0x07, 0x00, 0xbb, 0xce, 0x07, 0x00, 0x34, 0xd9, - 0x07, 0x00, 0x35, 0xd9, 0x07, 0x00, 0x38, 0xd9, 0x07, 0x00, 0x3c, 0xd9, - 0x07, 0x00, 0x3e, 0xd9, 0x07, 0x00, 0x3f, 0xd9, 0x07, 0x00, 0xf3, 0xd9, - 0x07, 0x00, 0xfb, 0xd9, 0x07, 0x00, 0xc8, 0xdc, 0x07, 0x00, 0xcb, 0xdc, - 0x07, 0x00, 0xf8, 0xdc, 0x07, 0x00, 0xfc, 0xdc, 0x07, 0x00, 0xfe, 0xdc, - 0x07, 0x00, 0xff, 0xdc, 0x07, 0x00, 0x33, 0xdd, 0x07, 0x00, 0x3b, 0xdd, - 0x07, 0x00, 0xc3, 0xdd, 0x07, 0x00, 0xc4, 0xdd, 0x07, 0x00, 0xc5, 0xdd, - 0x07, 0x00, 0xc8, 0xdd, 0x07, 0x00, 0xcb, 0xdd, 0x07, 0x00, 0xcc, 0xdd, - 0x07, 0x00, 0xce, 0xdd, 0x07, 0x00, 0xcf, 0xdd, 0x07, 0x00, 0xf4, 0xdd, - 0x07, 0x00, 0xf5, 0xdd, 0x07, 0x00, 0xf8, 0xdd, 0x07, 0x00, 0xfc, 0xdd, - 0x07, 0x00, 0xfe, 0xdd, 0x07, 0x00, 0xff, 0xdd, 0x07, 0x00, 0xb8, 0xe5, - 0x07, 0x00, 0xf0, 0xe9, 0x07, 0x00, 0xf1, 0xe9, 0x07, 0x00, 0xf3, 0xe9, - 0x07, 0x00, 0xf9, 0xe9, 0x07, 0x00, 0xfb, 0xe9, 0x07, 0x00, 0xfd, 0xe9, - 0x07, 0x00, 0xb3, 0xec, 0x07, 0x00, 0xbb, 0xec, 0x07, 0x00, 0xf0, 0xed, - 0x07, 0x00, 0xf1, 0xed, 0x07, 0x00, 0xf3, 0xed, 0x07, 0x00, 0xf9, 0xed, - 0x07, 0x00, 0xfb, 0xed, 0x07, 0x00, 0xfd, 0xed, 0x07, 0x00, 0xb4, 0xee, - 0x07, 0x00, 0xb5, 0xee, 0x07, 0x00, 0xb8, 0xee, 0x07, 0x00, 0xbc, 0xee, - 0x07, 0x00, 0xbe, 0xee, 0x07, 0x00, 0xbf, 0xee, 0x07, 0x00, 0x8e, 0xf3, - 0x07, 0x00, 0x8f, 0xf3, 0x07, 0x00, 0x31, 0xf9, 0x07, 0x00, 0x33, 0xf9, - 0x07, 0x00, 0x39, 0xf9, 0x07, 0x00, 0x3b, 0xf9, 0x07, 0x00, 0x3d, 0xf9, - 0x07, 0x00, 0x50, 0xf9, 0x07, 0x00, 0x51, 0xf9, 0x07, 0x00, 0x56, 0xf9, - 0x07, 0x00, 0x57, 0xf9, 0x07, 0x00, 0x59, 0xf9, 0x07, 0x00, 0x5d, 0xf9, - 0x07, 0x00, 0xb3, 0xf9, 0x07, 0x00, 0xbb, 0xf9, 0x07, 0x00, 0xf2, 0xf9, - 0x07, 0x00, 0xf7, 0xf9, 0x07, 0x00, 0xf8, 0xf9, 0x07, 0x00, 0xfa, 0xf9, - 0x07, 0x00, 0xfc, 0xf9, 0x07, 0x00, 0xfe, 0xf9, 0x07, 0x00, 0xff, 0xf9, - 0x07, 0x00, 0x31, 0xfc, 0x07, 0x00, 0x38, 0xfc, 0x07, 0x00, 0xb3, 0xfc, - 0x07, 0x00, 0xbb, 0xfc, 0x07, 0x00, 0xe6, 0xfc, 0x07, 0x00, 0xe7, 0xfc, - 0x07, 0x00, 0xe8, 0xfc, 0x07, 0x00, 0xeb, 0xfc, 0x07, 0x00, 0xf6, 0xfc, - 0x07, 0x00, 0xf7, 0xfc, 0x07, 0x00, 0xf8, 0xfc, 0x07, 0x00, 0xfc, 0xfc, - 0x07, 0x00, 0xfe, 0xfc, 0x07, 0x00, 0xff, 0xfc, 0x07, 0x00, 0x31, 0xfd, - 0x07, 0x00, 0x38, 0xfd, 0x07, 0x00, 0x51, 0xfd, 0x07, 0x00, 0x56, 0xfd, - 0x07, 0x00, 0x57, 0xfd, 0x07, 0x00, 0x59, 0xfd, 0x07, 0x00, 0x5d, 0xfd, - 0x07, 0x00, 0xb8, 0xfd, 0x07, 0x00, 0xf2, 0xfd, 0x07, 0x00, 0xf7, 0xfd, - 0x07, 0x00, 0xf8, 0xfd, 0x07, 0x00, 0xfa, 0xfd, 0x07, 0x00, 0xfc, 0xfd, - 0x07, 0x00, 0xfe, 0xfd, 0x07, 0x00, 0xff, 0xfd, 0x07, 0x00, 0x30, 0xfe, - 0x07, 0x00, 0x31, 0xfe, 0x07, 0x00, 0x39, 0xfe, 0x07, 0x00, 0x3d, 0xfe, - 0x07, 0x00, 0xb3, 0xfe, 0x07, 0x00, 0xbb, 0xfe, 0x07, 0x00, 0xe7, 0xfe, - 0x07, 0x00, 0xeb, 0xfe, 0x07, 0x00, 0xf7, 0xfe, 0x07, 0x00, 0xf8, 0xfe, - 0x07, 0x00, 0xfc, 0xfe, 0x07, 0x00, 0xfe, 0xfe, 0x07, 0x00, 0xff, 0xfe, - 0x07, 0x00, 0x30, 0xff, 0x07, 0x00, 0x31, 0xff, 0x07, 0x00, 0x33, 0xff, - 0x07, 0x00, 0x39, 0xff, 0x07, 0x00, 0x3b, 0xff, 0x07, 0x00, 0x3d, 0xff, - 0x07, 0x00, 0xb3, 0xff, 0x07, 0x00, 0xbb, 0xff, 0x07, 0x00, 0x3e, 0x00, - 0x08, 0x00, 0x3f, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x08, 0x00, 0x78, 0x00, - 0x08, 0x00, 0x7c, 0x00, 0x08, 0x00, 0x7e, 0x00, 0x08, 0x00, 0x7f, 0x00, - 0x08, 0x00, 0xbe, 0x00, 0x08, 0x00, 0xbf, 0x00, 0x08, 0x00, 0xeb, 0x00, - 0x08, 0x00, 0x3e, 0x02, 0x08, 0x00, 0x3f, 0x02, 0x08, 0x00, 0xcb, 0x02, - 0x08, 0x00, 0xeb, 0x02, 0x08, 0x00, 0x38, 0x05, 0x08, 0x00, 0xf8, 0x05, - 0x08, 0x00, 0xfc, 0x05, 0x08, 0x00, 0xfe, 0x05, 0x08, 0x00, 0xff, 0x05, - 0x08, 0x00, 0x38, 0x07, 0x08, 0x00, 0x9f, 0x07, 0x08, 0x00, 0xab, 0x07, - 0x08, 0x00, 0xdf, 0x07, 0x08, 0x00, 0x4b, 0x08, 0x08, 0x00, 0xb8, 0x08, - 0x08, 0x00, 0x5f, 0x09, 0x08, 0x00, 0xff, 0x09, 0x08, 0x00, 0x78, 0x0a, - 0x08, 0x00, 0x7c, 0x0a, 0x08, 0x00, 0x7e, 0x0a, 0x08, 0x00, 0x7f, 0x0a, - 0x08, 0x00, 0x9f, 0x0b, 0x08, 0x00, 0xeb, 0x0c, 0x08, 0x00, 0xf8, 0x0c, - 0x08, 0x00, 0xfc, 0x0c, 0x08, 0x00, 0xfe, 0x0c, 0x08, 0x00, 0xff, 0x0c, - 0x08, 0x00, 0x5f, 0x0d, 0x08, 0x00, 0xff, 0x0d, 0x08, 0x00, 0xeb, 0x0e, - 0x08, 0x00, 0xff, 0x0e, 0x08, 0x00, 0xcb, 0x0f, 0x08, 0x00, 0xeb, 0x0f, - 0x08, 0x00, 0xf8, 0x0f, 0x08, 0x00, 0xfc, 0x0f, 0x08, 0x00, 0xfe, 0x0f, - 0x08, 0x00, 0xff, 0x0f, 0x08, 0x00, 0x3e, 0x10, 0x08, 0x00, 0x3f, 0x10, - 0x08, 0x00, 0x4b, 0x10, 0x08, 0x00, 0x78, 0x10, 0x08, 0x00, 0xbe, 0x10, - 0x08, 0x00, 0xbf, 0x10, 0x08, 0x00, 0xdf, 0x10, 0x08, 0x00, 0xeb, 0x10, - 0x08, 0x00, 0xfe, 0x10, 0x08, 0x00, 0xff, 0x10, 0x08, 0x00, 0x38, 0x13, - 0x08, 0x00, 0xf8, 0x13, 0x08, 0x00, 0xb8, 0x14, 0x08, 0x00, 0x2b, 0x16, - 0x08, 0x00, 0xdf, 0x16, 0x08, 0x00, 0xeb, 0x16, 0x08, 0x00, 0x1f, 0x17, - 0x08, 0x00, 0x2b, 0x17, 0x08, 0x00, 0xb8, 0x17, 0x08, 0x00, 0xcb, 0x17, - 0x08, 0x00, 0xeb, 0x17, 0x08, 0x00, 0x7e, 0x1a, 0x08, 0x00, 0x7f, 0x1a, - 0x08, 0x00, 0x38, 0x1f, 0x08, 0x00, 0x38, 0x21, 0x08, 0x00, 0xb8, 0x21, - 0x08, 0x00, 0xf8, 0x21, 0x08, 0x00, 0xfc, 0x21, 0x08, 0x00, 0xfe, 0x21, - 0x08, 0x00, 0xff, 0x21, 0x08, 0x00, 0x3e, 0x22, 0x08, 0x00, 0x3f, 0x22, - 0x08, 0x00, 0xcb, 0x22, 0x08, 0x00, 0xeb, 0x22, 0x08, 0x00, 0xb8, 0x24, - 0x08, 0x00, 0x3f, 0x25, 0x08, 0x00, 0xb8, 0x27, 0x08, 0x00, 0xcb, 0x27, - 0x08, 0x00, 0xeb, 0x27, 0x08, 0x00, 0xf8, 0x27, 0x08, 0x00, 0xfc, 0x27, - 0x08, 0x00, 0xfe, 0x27, 0x08, 0x00, 0xff, 0x27, 0x08, 0x00, 0x38, 0x28, - 0x08, 0x00, 0xf8, 0x28, 0x08, 0x00, 0x3e, 0x29, 0x08, 0x00, 0x3f, 0x29, - 0x08, 0x00, 0xf8, 0x29, 0x08, 0x00, 0xfc, 0x29, 0x08, 0x00, 0xfe, 0x29, - 0x08, 0x00, 0xff, 0x29, 0x08, 0x00, 0xbe, 0x2a, 0x08, 0x00, 0xbf, 0x2a, - 0x08, 0x00, 0x3e, 0x2b, 0x08, 0x00, 0x3f, 0x2b, 0x08, 0x00, 0xbe, 0x2b, - 0x08, 0x00, 0xbf, 0x2b, 0x08, 0x00, 0xeb, 0x2b, 0x08, 0x00, 0xfe, 0x2b, - 0x08, 0x00, 0xff, 0x2b, 0x08, 0x00, 0x3e, 0x2c, 0x08, 0x00, 0x3f, 0x2c, - 0x08, 0x00, 0xdf, 0x2c, 0x08, 0x00, 0xeb, 0x2c, 0x08, 0x00, 0xf8, 0x2c, - 0x08, 0x00, 0xfc, 0x2c, 0x08, 0x00, 0xfe, 0x2c, 0x08, 0x00, 0xff, 0x2c, - 0x08, 0x00, 0x3e, 0x2d, 0x08, 0x00, 0x3f, 0x2d, 0x08, 0x00, 0xfe, 0x2d, - 0x08, 0x00, 0xff, 0x2d, 0x08, 0x00, 0x2b, 0x2e, 0x08, 0x00, 0xdf, 0x2e, - 0x08, 0x00, 0xeb, 0x2e, 0x08, 0x00, 0xf8, 0x2e, 0x08, 0x00, 0xfc, 0x2e, - 0x08, 0x00, 0xfe, 0x2e, 0x08, 0x00, 0xff, 0x2e, 0x08, 0x00, 0x2b, 0x2f, - 0x08, 0x00, 0xcb, 0x2f, 0x08, 0x00, 0xeb, 0x2f, 0x08, 0x00, 0xf8, 0x2f, - 0x08, 0x00, 0xfc, 0x2f, 0x08, 0x00, 0xfe, 0x2f, 0x08, 0x00, 0xff, 0x2f, - 0x08, 0x00, 0x37, 0x31, 0x08, 0x00, 0x51, 0x31, 0x08, 0x00, 0x56, 0x31, - 0x08, 0x00, 0x57, 0x31, 0x08, 0x00, 0x5f, 0x31, 0x08, 0x00, 0xbf, 0x31, - 0x08, 0x00, 0xff, 0x31, 0x08, 0x00, 0xbf, 0x32, 0x08, 0x00, 0x30, 0x33, - 0x08, 0x00, 0x3d, 0x33, 0x08, 0x00, 0x3e, 0x33, 0x08, 0x00, 0x3f, 0x33, - 0x08, 0x00, 0xbe, 0x33, 0x08, 0x00, 0xbf, 0x33, 0x08, 0x00, 0xd1, 0x33, - 0x08, 0x00, 0xd6, 0x33, 0x08, 0x00, 0xd7, 0x33, 0x08, 0x00, 0xdf, 0x33, - 0x08, 0x00, 0xe7, 0x33, 0x08, 0x00, 0xf0, 0x33, 0x08, 0x00, 0xf1, 0x33, - 0x08, 0x00, 0xf7, 0x33, 0x08, 0x00, 0xf9, 0x33, 0x08, 0x00, 0xfd, 0x33, - 0x08, 0x00, 0x37, 0x34, 0x08, 0x00, 0xeb, 0x34, 0x08, 0x00, 0xf8, 0x34, - 0x08, 0x00, 0xfc, 0x34, 0x08, 0x00, 0xfe, 0x34, 0x08, 0x00, 0xff, 0x34, - 0x08, 0x00, 0x37, 0x36, 0x08, 0x00, 0x31, 0x37, 0x08, 0x00, 0x37, 0x37, - 0x08, 0x00, 0x38, 0x37, 0x08, 0x00, 0x4b, 0x38, 0x08, 0x00, 0xb1, 0x38, - 0x08, 0x00, 0xb7, 0x38, 0x08, 0x00, 0xb8, 0x38, 0x08, 0x00, 0xb7, 0x3a, - 0x08, 0x00, 0x30, 0x3b, 0x08, 0x00, 0x3d, 0x3b, 0x08, 0x00, 0x3e, 0x3b, - 0x08, 0x00, 0x3f, 0x3b, 0x08, 0x00, 0xb1, 0x3b, 0x08, 0x00, 0xb7, 0x3b, - 0x08, 0x00, 0xb8, 0x3b, 0x08, 0x00, 0xe7, 0x3b, 0x08, 0x00, 0xf0, 0x3b, - 0x08, 0x00, 0xf1, 0x3b, 0x08, 0x00, 0xf7, 0x3b, 0x08, 0x00, 0xf9, 0x3b, - 0x08, 0x00, 0xfd, 0x3b, 0x08, 0x00, 0xbe, 0x3c, 0x08, 0x00, 0xbf, 0x3c, - 0x08, 0x00, 0xbf, 0x3e, 0x08, 0x00, 0x30, 0x3f, 0x08, 0x00, 0x3d, 0x3f, - 0x08, 0x00, 0x3e, 0x3f, 0x08, 0x00, 0x3f, 0x3f, 0x08, 0x00, 0x91, 0x3f, - 0x08, 0x00, 0x96, 0x3f, 0x08, 0x00, 0x97, 0x3f, 0x08, 0x00, 0x9f, 0x3f, - 0x08, 0x00, 0xbe, 0x3f, 0x08, 0x00, 0xbf, 0x3f, 0x08, 0x00, 0xd1, 0x3f, - 0x08, 0x00, 0xd6, 0x3f, 0x08, 0x00, 0xd7, 0x3f, 0x08, 0x00, 0xdf, 0x3f, - 0x08, 0x00, 0x11, 0x41, 0x08, 0x00, 0x16, 0x41, 0x08, 0x00, 0x17, 0x41, - 0x08, 0x00, 0x67, 0x41, 0x08, 0x00, 0x77, 0x41, 0x08, 0x00, 0x78, 0x41, - 0x08, 0x00, 0x7c, 0x41, 0x08, 0x00, 0x7e, 0x41, 0x08, 0x00, 0x7f, 0x41, - 0x08, 0x00, 0xf7, 0x41, 0x08, 0x00, 0xf8, 0x41, 0x08, 0x00, 0xfc, 0x41, - 0x08, 0x00, 0xfe, 0x41, 0x08, 0x00, 0xff, 0x41, 0x08, 0x00, 0xbe, 0x42, - 0x08, 0x00, 0xbf, 0x42, 0x08, 0x00, 0x78, 0x43, 0x08, 0x00, 0x7c, 0x43, - 0x08, 0x00, 0x7e, 0x43, 0x08, 0x00, 0x7f, 0x43, 0x08, 0x00, 0xd1, 0x43, - 0x08, 0x00, 0xd6, 0x43, 0x08, 0x00, 0xd7, 0x43, 0x08, 0x00, 0xeb, 0x43, - 0x08, 0x00, 0xf0, 0x43, 0x08, 0x00, 0xf1, 0x43, 0x08, 0x00, 0xf9, 0x43, - 0x08, 0x00, 0xfd, 0x43, 0x08, 0x00, 0x70, 0x44, 0x08, 0x00, 0x71, 0x44, - 0x08, 0x00, 0x79, 0x44, 0x08, 0x00, 0x7d, 0x44, 0x08, 0x00, 0x31, 0x45, - 0x08, 0x00, 0x38, 0x45, 0x08, 0x00, 0xf7, 0x45, 0x08, 0x00, 0xf8, 0x45, - 0x08, 0x00, 0xfc, 0x45, 0x08, 0x00, 0xfe, 0x45, 0x08, 0x00, 0xff, 0x45, - 0x08, 0x00, 0x70, 0x46, 0x08, 0x00, 0x71, 0x46, 0x08, 0x00, 0x79, 0x46, - 0x08, 0x00, 0x7d, 0x46, 0x08, 0x00, 0x30, 0x47, 0x08, 0x00, 0x37, 0x47, - 0x08, 0x00, 0x3d, 0x47, 0x08, 0x00, 0x3e, 0x47, 0x08, 0x00, 0x3f, 0x47, - 0x08, 0x00, 0x91, 0x47, 0x08, 0x00, 0x96, 0x47, 0x08, 0x00, 0x97, 0x47, - 0x08, 0x00, 0xab, 0x47, 0x08, 0x00, 0xd1, 0x47, 0x08, 0x00, 0xd6, 0x47, - 0x08, 0x00, 0xd7, 0x47, 0x08, 0x00, 0x71, 0x4a, 0x08, 0x00, 0x77, 0x4a, - 0x08, 0x00, 0x78, 0x4a, 0x08, 0x00, 0x90, 0x4b, 0x08, 0x00, 0x9f, 0x4b, - 0x08, 0x00, 0xb8, 0x4c, 0x08, 0x00, 0x1f, 0x4f, 0x08, 0x00, 0x90, 0x4f, - 0x08, 0x00, 0x9f, 0x4f, 0x08, 0x00, 0xd0, 0x4f, 0x08, 0x00, 0xdf, 0x4f, - 0x08, 0x00, 0xb1, 0x50, 0x08, 0x00, 0xb8, 0x50, 0x08, 0x00, 0xb8, 0x52, - 0x08, 0x00, 0x31, 0x53, 0x08, 0x00, 0x38, 0x53, 0x08, 0x00, 0xb8, 0x53, - 0x08, 0x00, 0xd0, 0x53, 0x08, 0x00, 0xdf, 0x53, 0x08, 0x00, 0xe7, 0x53, - 0x08, 0x00, 0xf7, 0x53, 0x08, 0x00, 0xf8, 0x53, 0x08, 0x00, 0xfc, 0x53, - 0x08, 0x00, 0xfe, 0x53, 0x08, 0x00, 0xff, 0x53, 0x08, 0x00, 0xb0, 0x54, - 0x08, 0x00, 0xbd, 0x54, 0x08, 0x00, 0xbe, 0x54, 0x08, 0x00, 0xbf, 0x54, - 0x08, 0x00, 0xff, 0x55, 0x08, 0x00, 0xbf, 0x56, 0x08, 0x00, 0xcb, 0x57, - 0x08, 0x00, 0xeb, 0x57, 0x08, 0x00, 0xf8, 0x57, 0x08, 0x00, 0xfc, 0x57, - 0x08, 0x00, 0xfe, 0x57, 0x08, 0x00, 0xff, 0x57, 0x08, 0x00, 0x4b, 0x58, - 0x08, 0x00, 0xb0, 0x58, 0x08, 0x00, 0xb7, 0x58, 0x08, 0x00, 0xbd, 0x58, - 0x08, 0x00, 0xbe, 0x58, 0x08, 0x00, 0xbf, 0x58, 0x08, 0x00, 0xb0, 0x5a, - 0x08, 0x00, 0xb7, 0x5a, 0x08, 0x00, 0xbd, 0x5a, 0x08, 0x00, 0xbe, 0x5a, - 0x08, 0x00, 0xbf, 0x5a, 0x08, 0x00, 0x31, 0x5b, 0x08, 0x00, 0x38, 0x5b, - 0x08, 0x00, 0xb0, 0x5b, 0x08, 0x00, 0xb7, 0x5b, 0x08, 0x00, 0xbd, 0x5b, - 0x08, 0x00, 0xbe, 0x5b, 0x08, 0x00, 0xbf, 0x5b, 0x08, 0x00, 0xe7, 0x5b, - 0x08, 0x00, 0xf7, 0x5b, 0x08, 0x00, 0xf8, 0x5b, 0x08, 0x00, 0xfc, 0x5b, - 0x08, 0x00, 0xfe, 0x5b, 0x08, 0x00, 0xff, 0x5b, 0x08, 0x00, 0xb8, 0x5c, - 0x08, 0x00, 0xb8, 0x5e, 0x08, 0x00, 0x31, 0x5f, 0x08, 0x00, 0x38, 0x5f, - 0x08, 0x00, 0x90, 0x5f, 0x08, 0x00, 0x9f, 0x5f, 0x08, 0x00, 0xb8, 0x5f, - 0x08, 0x00, 0xd0, 0x5f, 0x08, 0x00, 0xdf, 0x5f, 0x08, 0x00, 0x1f, 0x61, - 0x08, 0x00, 0x6e, 0x61, 0x08, 0x00, 0x6f, 0x61, 0x08, 0x00, 0x73, 0x61, - 0x08, 0x00, 0x7b, 0x61, 0x08, 0x00, 0xf3, 0x61, 0x08, 0x00, 0xfb, 0x61, - 0x08, 0x00, 0xd5, 0x63, 0x08, 0x00, 0xee, 0x63, 0x08, 0x00, 0xef, 0x63, - 0x08, 0x00, 0xf8, 0x63, 0x08, 0x00, 0x3f, 0x64, 0x08, 0x00, 0x74, 0x64, - 0x08, 0x00, 0xf8, 0x64, 0x08, 0x00, 0xfc, 0x64, 0x08, 0x00, 0xfe, 0x64, - 0x08, 0x00, 0xff, 0x64, 0x08, 0x00, 0x33, 0x65, 0x08, 0x00, 0x3b, 0x65, - 0x08, 0x00, 0x3f, 0x65, 0x08, 0x00, 0x5f, 0x65, 0x08, 0x00, 0xf3, 0x65, - 0x08, 0x00, 0xfb, 0x65, 0x08, 0x00, 0xff, 0x65, 0x08, 0x00, 0x0b, 0x66, - 0x08, 0x00, 0x3f, 0x66, 0x08, 0x00, 0x73, 0x66, 0x08, 0x00, 0x7b, 0x66, - 0x08, 0x00, 0x3e, 0x67, 0x08, 0x00, 0x3f, 0x67, 0x08, 0x00, 0xa3, 0x67, - 0x08, 0x00, 0xae, 0x67, 0x08, 0x00, 0xaf, 0x67, 0x08, 0x00, 0x0b, 0x6a, - 0x08, 0x00, 0x38, 0x6a, 0x08, 0x00, 0x74, 0x6a, 0x08, 0x00, 0x7e, 0x6a, - 0x08, 0x00, 0x7f, 0x6a, 0x08, 0x00, 0x8e, 0x6b, 0x08, 0x00, 0x8f, 0x6b, - 0x08, 0x00, 0x95, 0x6b, 0x08, 0x00, 0x95, 0x6f, 0x08, 0x00, 0xd5, 0x6f, - 0x08, 0x00, 0x13, 0x71, 0x08, 0x00, 0x1f, 0x71, 0x08, 0x00, 0x78, 0x71, - 0x08, 0x00, 0x7c, 0x71, 0x08, 0x00, 0x7e, 0x71, 0x08, 0x00, 0x7f, 0x71, - 0x08, 0x00, 0xff, 0x71, 0x08, 0x00, 0x2b, 0x72, 0x08, 0x00, 0x3e, 0x73, - 0x08, 0x00, 0x3f, 0x73, 0x08, 0x00, 0xfe, 0x73, 0x08, 0x00, 0xff, 0x73, - 0x08, 0x00, 0x74, 0x74, 0x08, 0x00, 0xf3, 0x75, 0x08, 0x00, 0xfb, 0x75, - 0x08, 0x00, 0xff, 0x75, 0x08, 0x00, 0x73, 0x76, 0x08, 0x00, 0x7b, 0x76, - 0x08, 0x00, 0x78, 0x77, 0x08, 0x00, 0x7c, 0x77, 0x08, 0x00, 0x7e, 0x77, - 0x08, 0x00, 0x7f, 0x77, 0x08, 0x00, 0x3f, 0x78, 0x08, 0x00, 0xfe, 0x78, - 0x08, 0x00, 0xff, 0x78, 0x08, 0x00, 0x0b, 0x7a, 0x08, 0x00, 0x3f, 0x7a, - 0x08, 0x00, 0x74, 0x7a, 0x08, 0x00, 0x78, 0x7a, 0x08, 0x00, 0xff, 0x7a, - 0x08, 0x00, 0x3f, 0x7e, 0x08, 0x00, 0x3e, 0x7f, 0x08, 0x00, 0x3f, 0x7f, - 0x08, 0x00, 0x31, 0x80, 0x08, 0x00, 0x38, 0x80, 0x08, 0x00, 0x4d, 0x80, - 0x08, 0x00, 0x71, 0x80, 0x08, 0x00, 0x73, 0x80, 0x08, 0x00, 0x79, 0x80, - 0x08, 0x00, 0x7b, 0x80, 0x08, 0x00, 0x7d, 0x80, 0x08, 0x00, 0xb1, 0x80, - 0x08, 0x00, 0xb8, 0x80, 0x08, 0x00, 0x30, 0x81, 0x08, 0x00, 0x3e, 0x81, - 0x08, 0x00, 0x72, 0x81, 0x08, 0x00, 0x77, 0x81, 0x08, 0x00, 0x78, 0x81, - 0x08, 0x00, 0x7a, 0x81, 0x08, 0x00, 0x7c, 0x81, 0x08, 0x00, 0x7e, 0x81, - 0x08, 0x00, 0x7f, 0x81, 0x08, 0x00, 0x73, 0x82, 0x08, 0x00, 0x7b, 0x82, - 0x08, 0x00, 0x31, 0x83, 0x08, 0x00, 0x38, 0x83, 0x08, 0x00, 0xb8, 0x83, - 0x08, 0x00, 0xcd, 0x83, 0x08, 0x00, 0xf2, 0x83, 0x08, 0x00, 0xf7, 0x83, - 0x08, 0x00, 0xf8, 0x83, 0x08, 0x00, 0xfa, 0x83, 0x08, 0x00, 0xfc, 0x83, - 0x08, 0x00, 0xfe, 0x83, 0x08, 0x00, 0xff, 0x83, 0x08, 0x00, 0x30, 0x84, - 0x08, 0x00, 0x37, 0x84, 0x08, 0x00, 0x3d, 0x84, 0x08, 0x00, 0x3e, 0x84, - 0x08, 0x00, 0x3f, 0x84, 0x08, 0x00, 0x71, 0x84, 0x08, 0x00, 0x73, 0x84, - 0x08, 0x00, 0x79, 0x84, 0x08, 0x00, 0x7b, 0x84, 0x08, 0x00, 0x7d, 0x84, - 0x08, 0x00, 0xf2, 0x85, 0x08, 0x00, 0xf7, 0x85, 0x08, 0x00, 0xf8, 0x85, - 0x08, 0x00, 0xfa, 0x85, 0x08, 0x00, 0xfc, 0x85, 0x08, 0x00, 0xfe, 0x85, - 0x08, 0x00, 0xff, 0x85, 0x08, 0x00, 0x71, 0x86, 0x08, 0x00, 0x73, 0x86, - 0x08, 0x00, 0x79, 0x86, 0x08, 0x00, 0x7b, 0x86, 0x08, 0x00, 0x7d, 0x86, - 0x08, 0x00, 0xcb, 0x86, 0x08, 0x00, 0xf0, 0x86, 0x08, 0x00, 0xf1, 0x86, - 0x08, 0x00, 0xf9, 0x86, 0x08, 0x00, 0xfd, 0x86, 0x08, 0x00, 0x70, 0x87, - 0x08, 0x00, 0x71, 0x87, 0x08, 0x00, 0x79, 0x87, 0x08, 0x00, 0x7d, 0x87, - 0x08, 0x00, 0xb1, 0x87, 0x08, 0x00, 0xb8, 0x87, 0x08, 0x00, 0xf1, 0x87, - 0x08, 0x00, 0xf3, 0x87, 0x08, 0x00, 0xf9, 0x87, 0x08, 0x00, 0xfb, 0x87, - 0x08, 0x00, 0xfd, 0x87, 0x08, 0x00, 0x43, 0x88, 0x08, 0x00, 0x7f, 0x88, - 0x08, 0x00, 0xb0, 0x88, 0x08, 0x00, 0xbe, 0x88, 0x08, 0x00, 0xd6, 0x88, - 0x08, 0x00, 0xdf, 0x88, 0x08, 0x00, 0xe7, 0x88, 0x08, 0x00, 0xf1, 0x88, - 0x08, 0x00, 0xf3, 0x88, 0x08, 0x00, 0xf7, 0x88, 0x08, 0x00, 0xf9, 0x88, - 0x08, 0x00, 0xfb, 0x88, 0x08, 0x00, 0xfd, 0x88, 0x08, 0x00, 0x03, 0x89, - 0x08, 0x00, 0xb3, 0x89, 0x08, 0x00, 0xbb, 0x89, 0x08, 0x00, 0xbf, 0x89, - 0x08, 0x00, 0xf3, 0x89, 0x08, 0x00, 0xf7, 0x89, 0x08, 0x00, 0xfb, 0x89, - 0x08, 0x00, 0x27, 0x8a, 0x08, 0x00, 0x72, 0x8a, 0x08, 0x00, 0x78, 0x8a, - 0x08, 0x00, 0x7a, 0x8a, 0x08, 0x00, 0x7c, 0x8a, 0x08, 0x00, 0x7e, 0x8a, - 0x08, 0x00, 0x7f, 0x8a, 0x08, 0x00, 0x07, 0x8b, 0x08, 0x00, 0x0b, 0x8b, - 0x08, 0x00, 0x31, 0x8b, 0x08, 0x00, 0x38, 0x8b, 0x08, 0x00, 0xb0, 0x8b, - 0x08, 0x00, 0xbe, 0x8b, 0x08, 0x00, 0xd0, 0x8b, 0x08, 0x00, 0xe1, 0x8b, - 0x08, 0x00, 0xe2, 0x8b, 0x08, 0x00, 0xed, 0x8b, 0x08, 0x00, 0xee, 0x8b, - 0x08, 0x00, 0xef, 0x8b, 0x08, 0x00, 0xf2, 0x8b, 0x08, 0x00, 0xf8, 0x8b, - 0x08, 0x00, 0xfa, 0x8b, 0x08, 0x00, 0xfc, 0x8b, 0x08, 0x00, 0xfe, 0x8b, - 0x08, 0x00, 0xff, 0x8b, 0x08, 0x00, 0x37, 0x8c, 0x08, 0x00, 0x7f, 0x8c, - 0x08, 0x00, 0x03, 0x8d, 0x08, 0x00, 0xb3, 0x8d, 0x08, 0x00, 0xbb, 0x8d, - 0x08, 0x00, 0xbf, 0x8d, 0x08, 0x00, 0xf3, 0x8d, 0x08, 0x00, 0xf7, 0x8d, - 0x08, 0x00, 0xfb, 0x8d, 0x08, 0x00, 0x37, 0x8e, 0x08, 0x00, 0x78, 0x8e, - 0x08, 0x00, 0x7c, 0x8e, 0x08, 0x00, 0x7e, 0x8e, 0x08, 0x00, 0x7f, 0x8e, - 0x08, 0x00, 0x15, 0x8f, 0x08, 0x00, 0x30, 0x8f, 0x08, 0x00, 0x3e, 0x8f, - 0x08, 0x00, 0x73, 0x8f, 0x08, 0x00, 0x7b, 0x8f, 0x08, 0x00, 0x96, 0x8f, - 0x08, 0x00, 0x9f, 0x8f, 0x08, 0x00, 0xbe, 0x8f, 0x08, 0x00, 0xbf, 0x8f, - 0x08, 0x00, 0xd6, 0x8f, 0x08, 0x00, 0xdf, 0x8f, 0x08, 0x00, 0xce, 0x90, - 0x08, 0x00, 0xcf, 0x90, 0x08, 0x00, 0xf8, 0x90, 0x08, 0x00, 0xb4, 0x91, - 0x08, 0x00, 0xbe, 0x91, 0x08, 0x00, 0xbf, 0x91, 0x08, 0x00, 0xf8, 0x91, - 0x08, 0x00, 0xfc, 0x91, 0x08, 0x00, 0xfe, 0x91, 0x08, 0x00, 0xff, 0x91, - 0x08, 0x00, 0x38, 0x92, 0x08, 0x00, 0x33, 0x94, 0x08, 0x00, 0x3b, 0x94, - 0x08, 0x00, 0x3f, 0x94, 0x08, 0x00, 0x33, 0x95, 0x08, 0x00, 0x3b, 0x95, - 0x08, 0x00, 0x3f, 0x95, 0x08, 0x00, 0xff, 0x96, 0x08, 0x00, 0xb4, 0x97, - 0x08, 0x00, 0xb8, 0x97, 0x08, 0x00, 0xce, 0x97, 0x08, 0x00, 0xcf, 0x97, - 0x08, 0x00, 0xee, 0x97, 0x08, 0x00, 0xef, 0x97, 0x08, 0x00, 0xf3, 0x97, - 0x08, 0x00, 0xfb, 0x97, 0x08, 0x00, 0x44, 0x98, 0x08, 0x00, 0xb4, 0x98, - 0x08, 0x00, 0xbe, 0x98, 0x08, 0x00, 0xbf, 0x98, 0x08, 0x00, 0xcb, 0x98, - 0x08, 0x00, 0xfe, 0x98, 0x08, 0x00, 0xff, 0x98, 0x08, 0x00, 0x38, 0x99, - 0x08, 0x00, 0x3e, 0x9a, 0x08, 0x00, 0x3f, 0x9a, 0x08, 0x00, 0xb4, 0x9a, - 0x08, 0x00, 0xbe, 0x9a, 0x08, 0x00, 0xbf, 0x9a, 0x08, 0x00, 0xf8, 0x9a, - 0x08, 0x00, 0xfc, 0x9a, 0x08, 0x00, 0xfe, 0x9a, 0x08, 0x00, 0xff, 0x9a, - 0x08, 0x00, 0x4b, 0x9b, 0x08, 0x00, 0x38, 0x9d, 0x08, 0x00, 0xf3, 0x9f, - 0x08, 0x00, 0xfb, 0x9f, 0x08, 0x00, 0xf8, 0xa1, 0x08, 0x00, 0xfc, 0xa1, - 0x08, 0x00, 0xfe, 0xa1, 0x08, 0x00, 0xff, 0xa1, 0x08, 0x00, 0x3f, 0xa4, - 0x08, 0x00, 0x7f, 0xa4, 0x08, 0x00, 0xf3, 0xa5, 0x08, 0x00, 0xfb, 0xa5, - 0x08, 0x00, 0x2b, 0xa6, 0x08, 0x00, 0x78, 0xa6, 0x08, 0x00, 0x7c, 0xa6, - 0x08, 0x00, 0x7e, 0xa6, 0x08, 0x00, 0x7f, 0xa6, 0x08, 0x00, 0xdf, 0xa6, - 0x08, 0x00, 0x0b, 0xa7, 0x08, 0x00, 0x1f, 0xa7, 0x08, 0x00, 0x2b, 0xa7, - 0x08, 0x00, 0x78, 0xa7, 0x08, 0x00, 0x7c, 0xa7, 0x08, 0x00, 0x7e, 0xa7, - 0x08, 0x00, 0x7f, 0xa7, 0x08, 0x00, 0xbe, 0xa7, 0x08, 0x00, 0xbf, 0xa7, - 0x08, 0x00, 0xf3, 0xa7, 0x08, 0x00, 0xfb, 0xa7, 0x08, 0x00, 0x74, 0xaa, - 0x08, 0x00, 0x7e, 0xaa, 0x08, 0x00, 0x7f, 0xaa, 0x08, 0x00, 0x38, 0xab, - 0x08, 0x00, 0xb8, 0xab, 0x08, 0x00, 0xce, 0xab, 0x08, 0x00, 0xcf, 0xab, - 0x08, 0x00, 0xf8, 0xab, 0x08, 0x00, 0xf3, 0xaf, 0x08, 0x00, 0xfb, 0xaf, - 0x08, 0x00, 0x03, 0xb1, 0x08, 0x00, 0xff, 0xb1, 0x08, 0x00, 0x0b, 0xb2, - 0x08, 0x00, 0x1f, 0xb2, 0x08, 0x00, 0x3f, 0xb2, 0x08, 0x00, 0xb3, 0xb2, - 0x08, 0x00, 0xbb, 0xb2, 0x08, 0x00, 0xbf, 0xb2, 0x08, 0x00, 0xc7, 0xb2, - 0x08, 0x00, 0xe7, 0xb2, 0x08, 0x00, 0xf7, 0xb2, 0x08, 0x00, 0x1f, 0xb3, - 0x08, 0x00, 0x78, 0xb3, 0x08, 0x00, 0x7c, 0xb3, 0x08, 0x00, 0x7e, 0xb3, - 0x08, 0x00, 0x7f, 0xb3, 0x08, 0x00, 0x96, 0xb3, 0x08, 0x00, 0x9f, 0xb3, - 0x08, 0x00, 0x7f, 0xb4, 0x08, 0x00, 0x13, 0xb5, 0x08, 0x00, 0x1b, 0xb5, - 0x08, 0x00, 0x73, 0xb5, 0x08, 0x00, 0x7b, 0xb5, 0x08, 0x00, 0xf3, 0xb5, - 0x08, 0x00, 0xf7, 0xb5, 0x08, 0x00, 0xfb, 0xb5, 0x08, 0x00, 0x72, 0xb6, - 0x08, 0x00, 0x78, 0xb6, 0x08, 0x00, 0x7a, 0xb6, 0x08, 0x00, 0x7c, 0xb6, - 0x08, 0x00, 0x7e, 0xb6, 0x08, 0x00, 0x7f, 0xb6, 0x08, 0x00, 0x10, 0xb7, - 0x08, 0x00, 0x71, 0xb7, 0x08, 0x00, 0x73, 0xb7, 0x08, 0x00, 0x77, 0xb7, - 0x08, 0x00, 0x79, 0xb7, 0x08, 0x00, 0x7b, 0xb7, 0x08, 0x00, 0x7d, 0xb7, - 0x08, 0x00, 0xcd, 0xb7, 0x08, 0x00, 0xce, 0xb7, 0x08, 0x00, 0xcf, 0xb7, - 0x08, 0x00, 0xe1, 0xb7, 0x08, 0x00, 0xe2, 0xb7, 0x08, 0x00, 0xed, 0xb7, - 0x08, 0x00, 0xee, 0xb7, 0x08, 0x00, 0xef, 0xb7, 0x08, 0x00, 0xf2, 0xb7, - 0x08, 0x00, 0xf8, 0xb7, 0x08, 0x00, 0xfa, 0xb7, 0x08, 0x00, 0xfc, 0xb7, - 0x08, 0x00, 0xfe, 0xb7, 0x08, 0x00, 0xff, 0xb7, 0x08, 0x00, 0x37, 0xb8, - 0x08, 0x00, 0x1f, 0xb9, 0x08, 0x00, 0x33, 0xb9, 0x08, 0x00, 0x3b, 0xb9, - 0x08, 0x00, 0x3f, 0xb9, 0x08, 0x00, 0x50, 0xb9, 0x08, 0x00, 0x6b, 0xb9, - 0x08, 0x00, 0x78, 0xb9, 0x08, 0x00, 0x7c, 0xb9, 0x08, 0x00, 0x7e, 0xb9, - 0x08, 0x00, 0x7f, 0xb9, 0x08, 0x00, 0x27, 0xba, 0x08, 0x00, 0x72, 0xba, - 0x08, 0x00, 0x78, 0xba, 0x08, 0x00, 0x7a, 0xba, 0x08, 0x00, 0x7c, 0xba, - 0x08, 0x00, 0x7e, 0xba, 0x08, 0x00, 0x7f, 0xba, 0x08, 0x00, 0x07, 0xbb, - 0x08, 0x00, 0x0b, 0xbb, 0x08, 0x00, 0x31, 0xbb, 0x08, 0x00, 0x38, 0xbb, - 0x08, 0x00, 0xb0, 0xbb, 0x08, 0x00, 0xbe, 0xbb, 0x08, 0x00, 0xd0, 0xbb, - 0x08, 0x00, 0xe1, 0xbb, 0x08, 0x00, 0xe2, 0xbb, 0x08, 0x00, 0xed, 0xbb, - 0x08, 0x00, 0xee, 0xbb, 0x08, 0x00, 0xef, 0xbb, 0x08, 0x00, 0xf2, 0xbb, - 0x08, 0x00, 0xf8, 0xbb, 0x08, 0x00, 0xfa, 0xbb, 0x08, 0x00, 0xfc, 0xbb, - 0x08, 0x00, 0xfe, 0xbb, 0x08, 0x00, 0xff, 0xbb, 0x08, 0x00, 0xbe, 0xbc, - 0x08, 0x00, 0xbf, 0xbc, 0x08, 0x00, 0xd1, 0xbc, 0x08, 0x00, 0xd6, 0xbc, - 0x08, 0x00, 0xd7, 0xbc, 0x08, 0x00, 0xdf, 0xbc, 0x08, 0x00, 0xe7, 0xbc, - 0x08, 0x00, 0xf0, 0xbc, 0x08, 0x00, 0xf1, 0xbc, 0x08, 0x00, 0xf7, 0xbc, - 0x08, 0x00, 0xf9, 0xbc, 0x08, 0x00, 0xfd, 0xbc, 0x08, 0x00, 0x1f, 0xbd, - 0x08, 0x00, 0x33, 0xbd, 0x08, 0x00, 0x3b, 0xbd, 0x08, 0x00, 0x3f, 0xbd, - 0x08, 0x00, 0x50, 0xbd, 0x08, 0x00, 0x6b, 0xbd, 0x08, 0x00, 0x78, 0xbd, - 0x08, 0x00, 0x7c, 0xbd, 0x08, 0x00, 0x7e, 0xbd, 0x08, 0x00, 0x7f, 0xbd, - 0x08, 0x00, 0x0b, 0xbe, 0x08, 0x00, 0x1f, 0xbe, 0x08, 0x00, 0x2b, 0xbe, - 0x08, 0x00, 0xb3, 0xbe, 0x08, 0x00, 0xbb, 0xbe, 0x08, 0x00, 0xbf, 0xbe, - 0x08, 0x00, 0xd7, 0xbe, 0x08, 0x00, 0xdf, 0xbe, 0x08, 0x00, 0xe7, 0xbe, - 0x08, 0x00, 0xf7, 0xbe, 0x08, 0x00, 0x21, 0xbf, 0x08, 0x00, 0x22, 0xbf, - 0x08, 0x00, 0x2b, 0xbf, 0x08, 0x00, 0x2d, 0xbf, 0x08, 0x00, 0xab, 0xbf, - 0x08, 0x00, 0xc7, 0xbf, 0x08, 0x00, 0xe7, 0xbf, 0x08, 0x00, 0xf1, 0xbf, - 0x08, 0x00, 0xf3, 0xbf, 0x08, 0x00, 0xf7, 0xbf, 0x08, 0x00, 0xf9, 0xbf, - 0x08, 0x00, 0xfb, 0xbf, 0x08, 0x00, 0xfd, 0xbf, 0x08, 0x00, 0xc6, 0xc0, - 0x08, 0x00, 0xc7, 0xc0, 0x08, 0x00, 0xf6, 0xc0, 0x08, 0x00, 0xf7, 0xc0, - 0x08, 0x00, 0xf8, 0xc0, 0x08, 0x00, 0xfc, 0xc0, 0x08, 0x00, 0xfe, 0xc0, - 0x08, 0x00, 0xff, 0xc0, 0x08, 0x00, 0xb1, 0xc1, 0x08, 0x00, 0xb8, 0xc1, - 0x08, 0x00, 0xf0, 0xc1, 0x08, 0x00, 0xf1, 0xc1, 0x08, 0x00, 0xf9, 0xc1, - 0x08, 0x00, 0xfd, 0xc1, 0x08, 0x00, 0x31, 0xc3, 0x08, 0x00, 0x38, 0xc3, - 0x08, 0x00, 0xb8, 0xc3, 0x08, 0x00, 0xc6, 0xc3, 0x08, 0x00, 0xc7, 0xc3, - 0x08, 0x00, 0xf6, 0xc3, 0x08, 0x00, 0xf7, 0xc3, 0x08, 0x00, 0xf8, 0xc3, - 0x08, 0x00, 0xfc, 0xc3, 0x08, 0x00, 0xfe, 0xc3, 0x08, 0x00, 0xff, 0xc3, - 0x08, 0x00, 0xb1, 0xc4, 0x08, 0x00, 0xb8, 0xc4, 0x08, 0x00, 0xf6, 0xc5, - 0x08, 0x00, 0xf7, 0xc5, 0x08, 0x00, 0xf8, 0xc5, 0x08, 0x00, 0xfc, 0xc5, - 0x08, 0x00, 0xfe, 0xc5, 0x08, 0x00, 0xff, 0xc5, 0x08, 0x00, 0xb0, 0xc6, - 0x08, 0x00, 0xb6, 0xc6, 0x08, 0x00, 0xb7, 0xc6, 0x08, 0x00, 0xbd, 0xc6, - 0x08, 0x00, 0xbe, 0xc6, 0x08, 0x00, 0xbf, 0xc6, 0x08, 0x00, 0x30, 0xc7, - 0x08, 0x00, 0x36, 0xc7, 0x08, 0x00, 0x37, 0xc7, 0x08, 0x00, 0x3d, 0xc7, - 0x08, 0x00, 0x3e, 0xc7, 0x08, 0x00, 0x3f, 0xc7, 0x08, 0x00, 0x31, 0xc8, - 0x08, 0x00, 0x38, 0xc8, 0x08, 0x00, 0x0b, 0xc9, 0x08, 0x00, 0xb8, 0xc9, - 0x08, 0x00, 0xf0, 0xc9, 0x08, 0x00, 0xf1, 0xc9, 0x08, 0x00, 0xf9, 0xc9, - 0x08, 0x00, 0xfd, 0xc9, 0x08, 0x00, 0xb1, 0xca, 0x08, 0x00, 0xb8, 0xca, - 0x08, 0x00, 0x31, 0xcc, 0x08, 0x00, 0x38, 0xcc, 0x08, 0x00, 0x7e, 0xcc, - 0x08, 0x00, 0x7f, 0xcc, 0x08, 0x00, 0x0b, 0xcd, 0x08, 0x00, 0xb8, 0xcd, - 0x08, 0x00, 0xf1, 0xcd, 0x08, 0x00, 0xf8, 0xcd, 0x08, 0x00, 0x31, 0xce, - 0x08, 0x00, 0x38, 0xce, 0x08, 0x00, 0x78, 0xce, 0x08, 0x00, 0x7c, 0xce, - 0x08, 0x00, 0x7e, 0xce, 0x08, 0x00, 0x7f, 0xce, 0x08, 0x00, 0x08, 0xcf, - 0x08, 0x00, 0x0b, 0xcf, 0x08, 0x00, 0x31, 0xcf, 0x08, 0x00, 0x38, 0xcf, - 0x08, 0x00, 0x78, 0xcf, 0x08, 0x00, 0x7c, 0xcf, 0x08, 0x00, 0x7e, 0xcf, - 0x08, 0x00, 0x7f, 0xcf, 0x08, 0x00, 0x90, 0xcf, 0x08, 0x00, 0x99, 0xcf, - 0x08, 0x00, 0x9d, 0xcf, 0x08, 0x00, 0xb8, 0xcf, 0x08, 0x00, 0xd0, 0xcf, - 0x08, 0x00, 0xd9, 0xcf, 0x08, 0x00, 0xdd, 0xcf, 0x08, 0x00, 0xc8, 0xd0, - 0x08, 0x00, 0xcb, 0xd0, 0x08, 0x00, 0xb8, 0xd1, 0x08, 0x00, 0xf8, 0xd1, - 0x08, 0x00, 0xfc, 0xd1, 0x08, 0x00, 0xfe, 0xd1, 0x08, 0x00, 0xff, 0xd1, - 0x08, 0x00, 0x3e, 0xd4, 0x08, 0x00, 0x3f, 0xd4, 0x08, 0x00, 0x38, 0xd5, - 0x08, 0x00, 0xeb, 0xd6, 0x08, 0x00, 0xbe, 0xd7, 0x08, 0x00, 0xbf, 0xd7, - 0x08, 0x00, 0xc8, 0xd7, 0x08, 0x00, 0xcb, 0xd7, 0x08, 0x00, 0xe8, 0xd7, - 0x08, 0x00, 0xeb, 0xd7, 0x08, 0x00, 0x48, 0xd8, 0x08, 0x00, 0x4b, 0xd8, - 0x08, 0x00, 0xb8, 0xd8, 0x08, 0x00, 0x38, 0xd9, 0x08, 0x00, 0xbe, 0xda, - 0x08, 0x00, 0xbf, 0xda, 0x08, 0x00, 0x38, 0xdd, 0x08, 0x00, 0xf1, 0xe0, - 0x08, 0x00, 0xf8, 0xe0, 0x08, 0x00, 0xb1, 0xe1, 0x08, 0x00, 0xb8, 0xe1, - 0x08, 0x00, 0xf6, 0xe1, 0x08, 0x00, 0xf7, 0xe1, 0x08, 0x00, 0xf8, 0xe1, - 0x08, 0x00, 0xfc, 0xe1, 0x08, 0x00, 0xfe, 0xe1, 0x08, 0x00, 0xff, 0xe1, - 0x08, 0x00, 0x7e, 0xe2, 0x08, 0x00, 0x7f, 0xe2, 0x08, 0x00, 0x31, 0xe3, - 0x08, 0x00, 0x38, 0xe3, 0x08, 0x00, 0xb8, 0xe3, 0x08, 0x00, 0xf1, 0xe3, - 0x08, 0x00, 0xf8, 0xe3, 0x08, 0x00, 0xb1, 0xe4, 0x08, 0x00, 0xb8, 0xe4, - 0x08, 0x00, 0xf0, 0xe5, 0x08, 0x00, 0xf7, 0xe5, 0x08, 0x00, 0xfd, 0xe5, - 0x08, 0x00, 0xfe, 0xe5, 0x08, 0x00, 0xff, 0xe5, 0x08, 0x00, 0xb1, 0xe6, - 0x08, 0x00, 0xb8, 0xe6, 0x08, 0x00, 0x30, 0xe7, 0x08, 0x00, 0x36, 0xe7, - 0x08, 0x00, 0x37, 0xe7, 0x08, 0x00, 0x3d, 0xe7, 0x08, 0x00, 0x3e, 0xe7, - 0x08, 0x00, 0x3f, 0xe7, 0x08, 0x00, 0x30, 0xe8, 0x08, 0x00, 0x36, 0xe8, - 0x08, 0x00, 0x37, 0xe8, 0x08, 0x00, 0x3d, 0xe8, 0x08, 0x00, 0x3e, 0xe8, - 0x08, 0x00, 0x3f, 0xe8, 0x08, 0x00, 0xbe, 0xe9, 0x08, 0x00, 0xbf, 0xe9, - 0x08, 0x00, 0xf6, 0xe9, 0x08, 0x00, 0xf7, 0xe9, 0x08, 0x00, 0xf8, 0xe9, - 0x08, 0x00, 0xfc, 0xe9, 0x08, 0x00, 0xfe, 0xe9, 0x08, 0x00, 0xff, 0xe9, - 0x08, 0x00, 0xb0, 0xea, 0x08, 0x00, 0xb6, 0xea, 0x08, 0x00, 0xb7, 0xea, - 0x08, 0x00, 0xbd, 0xea, 0x08, 0x00, 0xbe, 0xea, 0x08, 0x00, 0xbf, 0xea, - 0x08, 0x00, 0x30, 0xec, 0x08, 0x00, 0x36, 0xec, 0x08, 0x00, 0x37, 0xec, - 0x08, 0x00, 0x3d, 0xec, 0x08, 0x00, 0x3e, 0xec, 0x08, 0x00, 0x3f, 0xec, - 0x08, 0x00, 0x78, 0xec, 0x08, 0x00, 0xbe, 0xed, 0x08, 0x00, 0xbf, 0xed, - 0x08, 0x00, 0xf0, 0xed, 0x08, 0x00, 0xf6, 0xed, 0x08, 0x00, 0xf7, 0xed, - 0x08, 0x00, 0xfd, 0xed, 0x08, 0x00, 0xfe, 0xed, 0x08, 0x00, 0xff, 0xed, - 0x08, 0x00, 0x30, 0xee, 0x08, 0x00, 0x36, 0xee, 0x08, 0x00, 0x37, 0xee, - 0x08, 0x00, 0x3d, 0xee, 0x08, 0x00, 0x3e, 0xee, 0x08, 0x00, 0x3f, 0xee, - 0x08, 0x00, 0x78, 0xee, 0x08, 0x00, 0x7c, 0xee, 0x08, 0x00, 0x7e, 0xee, - 0x08, 0x00, 0x7f, 0xee, 0x08, 0x00, 0x31, 0xef, 0x08, 0x00, 0x38, 0xef, - 0x08, 0x00, 0x78, 0xef, 0x08, 0x00, 0x7c, 0xef, 0x08, 0x00, 0x7e, 0xef, - 0x08, 0x00, 0x7f, 0xef, 0x08, 0x00, 0xb8, 0xef, 0x08, 0x00, 0xf1, 0xf0, - 0x08, 0x00, 0xf8, 0xf0, 0x08, 0x00, 0xb0, 0xf1, 0x08, 0x00, 0xb7, 0xf1, - 0x08, 0x00, 0xbd, 0xf1, 0x08, 0x00, 0xbe, 0xf1, 0x08, 0x00, 0xbf, 0xf1, - 0x08, 0x00, 0xf0, 0xf1, 0x08, 0x00, 0xf1, 0xf1, 0x08, 0x00, 0xf9, 0xf1, - 0x08, 0x00, 0xfd, 0xf1, 0x08, 0x00, 0xbe, 0xf2, 0x08, 0x00, 0xbf, 0xf2, - 0x08, 0x00, 0x88, 0xf3, 0x08, 0x00, 0x8b, 0xf3, 0x08, 0x00, 0x91, 0xf3, - 0x08, 0x00, 0x96, 0xf3, 0x08, 0x00, 0x97, 0xf3, 0x08, 0x00, 0x9d, 0xf3, - 0x08, 0x00, 0x9e, 0xf3, 0x08, 0x00, 0x9f, 0xf3, 0x08, 0x00, 0x31, 0xf4, - 0x08, 0x00, 0x38, 0xf4, 0x08, 0x00, 0x0b, 0xf5, 0x08, 0x00, 0x31, 0xf5, - 0x08, 0x00, 0x38, 0xf5, 0x08, 0x00, 0x51, 0xf5, 0x08, 0x00, 0x56, 0xf5, - 0x08, 0x00, 0x57, 0xf5, 0x08, 0x00, 0x5d, 0xf5, 0x08, 0x00, 0x5e, 0xf5, - 0x08, 0x00, 0x5f, 0xf5, 0x08, 0x00, 0xb8, 0xf5, 0x08, 0x00, 0xf0, 0xf6, - 0x08, 0x00, 0xf1, 0xf6, 0x08, 0x00, 0xf9, 0xf6, 0x08, 0x00, 0xfd, 0xf6, - 0x08, 0x00, 0xb0, 0xf7, 0x08, 0x00, 0xb6, 0xf7, 0x08, 0x00, 0xb7, 0xf7, - 0x08, 0x00, 0xbd, 0xf7, 0x08, 0x00, 0xbe, 0xf7, 0x08, 0x00, 0xbf, 0xf7, - 0x08, 0x00, 0xf0, 0xf7, 0x08, 0x00, 0xf1, 0xf7, 0x08, 0x00, 0xf9, 0xf7, - 0x08, 0x00, 0xfd, 0xf7, 0x08, 0x00, 0xb1, 0xf8, 0x08, 0x00, 0xb8, 0xf8, - 0x08, 0x00, 0x30, 0xf9, 0x08, 0x00, 0x37, 0xf9, 0x08, 0x00, 0x3d, 0xf9, - 0x08, 0x00, 0x3e, 0xf9, 0x08, 0x00, 0x3f, 0xf9, 0x08, 0x00, 0xb1, 0xfa, - 0x08, 0x00, 0xb8, 0xfa, 0x08, 0x00, 0xbe, 0xfc, 0x08, 0x00, 0xbf, 0xfc, - 0x08, 0x00, 0x30, 0xfd, 0x08, 0x00, 0x37, 0xfd, 0x08, 0x00, 0x3d, 0xfd, - 0x08, 0x00, 0x3e, 0xfd, 0x08, 0x00, 0x3f, 0xfd, 0x08, 0x00, 0xbe, 0xfe, - 0x08, 0x00, 0xbf, 0xfe, 0x08, 0x00, 0x28, 0xff, 0x08, 0x00, 0x2b, 0xff, - 0x08, 0x00, 0x88, 0xff, 0x08, 0x00, 0x8b, 0xff, 0x08, 0x00, 0xa8, 0xff, - 0x08, 0x00, 0xab, 0xff, 0x08, 0x00, 0xc6, 0xff, 0x08, 0x00, 0xc7, 0xff, - 0x08, 0x00, 0xc8, 0xff, 0x08, 0x00, 0xc9, 0xff, 0x08, 0x00, 0xcb, 0xff, - 0x08, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe8, 0xff, - 0x08, 0x00, 0xe9, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xf6, 0xff, - 0x08, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xfc, 0xff, - 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0x3e, 0x00, - 0x09, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x44, 0x00, 0x09, 0x00, 0x45, 0x00, - 0x09, 0x00, 0x4e, 0x00, 0x09, 0x00, 0x4f, 0x00, 0x09, 0x00, 0xbe, 0x00, - 0x09, 0x00, 0xbf, 0x00, 0x09, 0x00, 0xe4, 0x00, 0x09, 0x00, 0xee, 0x00, - 0x09, 0x00, 0xef, 0x00, 0x09, 0x00, 0xf4, 0x00, 0x09, 0x00, 0xf5, 0x00, - 0x09, 0x00, 0xf8, 0x00, 0x09, 0x00, 0xfc, 0x00, 0x09, 0x00, 0xfe, 0x00, - 0x09, 0x00, 0xff, 0x00, 0x09, 0x00, 0xc4, 0x01, 0x09, 0x00, 0xc5, 0x01, - 0x09, 0x00, 0xce, 0x01, 0x09, 0x00, 0xcf, 0x01, 0x09, 0x00, 0xf4, 0x01, - 0x09, 0x00, 0xf5, 0x01, 0x09, 0x00, 0xf8, 0x01, 0x09, 0x00, 0xfc, 0x01, - 0x09, 0x00, 0xfe, 0x01, 0x09, 0x00, 0xff, 0x01, 0x09, 0x00, 0xe4, 0x02, - 0x09, 0x00, 0xee, 0x02, 0x09, 0x00, 0xef, 0x02, 0x09, 0x00, 0xf4, 0x02, - 0x09, 0x00, 0xf5, 0x02, 0x09, 0x00, 0xf8, 0x02, 0x09, 0x00, 0xfc, 0x02, - 0x09, 0x00, 0xfe, 0x02, 0x09, 0x00, 0xff, 0x02, 0x09, 0x00, 0x3e, 0x05, - 0x09, 0x00, 0x3f, 0x05, 0x09, 0x00, 0x38, 0x06, 0x09, 0x00, 0x3e, 0x07, - 0x09, 0x00, 0x3f, 0x07, 0x09, 0x00, 0x88, 0x07, 0x09, 0x00, 0xe8, 0x07, - 0x09, 0x00, 0xf3, 0x07, 0x09, 0x00, 0xfb, 0x07, 0x09, 0x00, 0x38, 0x08, - 0x09, 0x00, 0xbe, 0x08, 0x09, 0x00, 0xbf, 0x08, 0x09, 0x00, 0xe4, 0x08, - 0x09, 0x00, 0xee, 0x08, 0x09, 0x00, 0xef, 0x08, 0x09, 0x00, 0xf4, 0x08, - 0x09, 0x00, 0xf5, 0x08, 0x09, 0x00, 0xf8, 0x08, 0x09, 0x00, 0xfc, 0x08, - 0x09, 0x00, 0xfe, 0x08, 0x09, 0x00, 0xff, 0x08, 0x09, 0x00, 0xcf, 0x09, - 0x09, 0x00, 0xf8, 0x09, 0x09, 0x00, 0xfc, 0x09, 0x09, 0x00, 0xfe, 0x09, - 0x09, 0x00, 0xff, 0x09, 0x09, 0x00, 0x3e, 0x0a, 0x09, 0x00, 0x3f, 0x0a, - 0x09, 0x00, 0x3e, 0x0b, 0x09, 0x00, 0x3f, 0x0b, 0x09, 0x00, 0x88, 0x0b, - 0x09, 0x00, 0xe8, 0x0b, 0x09, 0x00, 0xf3, 0x0b, 0x09, 0x00, 0xfb, 0x0b, - 0x09, 0x00, 0x34, 0x0c, 0x09, 0x00, 0x3e, 0x0c, 0x09, 0x00, 0x3f, 0x0c, - 0x09, 0x00, 0xe8, 0x0c, 0x09, 0x00, 0xf3, 0x0c, 0x09, 0x00, 0xfb, 0x0c, - 0x09, 0x00, 0xcf, 0x0d, 0x09, 0x00, 0xf8, 0x0d, 0x09, 0x00, 0xfc, 0x0d, - 0x09, 0x00, 0xfe, 0x0d, 0x09, 0x00, 0xff, 0x0d, 0x09, 0x00, 0xf3, 0x0e, - 0x09, 0x00, 0xfb, 0x0e, 0x09, 0x00, 0x3e, 0x10, 0x09, 0x00, 0x3f, 0x10, - 0x09, 0x00, 0x45, 0x10, 0x09, 0x00, 0x4f, 0x10, 0x09, 0x00, 0xbe, 0x10, - 0x09, 0x00, 0xbf, 0x10, 0x09, 0x00, 0xee, 0x10, 0x09, 0x00, 0xef, 0x10, - 0x09, 0x00, 0xf8, 0x10, 0x09, 0x00, 0xb8, 0x11, 0x09, 0x00, 0xf3, 0x11, - 0x09, 0x00, 0xfb, 0x11, 0x09, 0x00, 0x38, 0x13, 0x09, 0x00, 0xee, 0x13, - 0x09, 0x00, 0xef, 0x13, 0x09, 0x00, 0xf8, 0x13, 0x09, 0x00, 0xbe, 0x14, - 0x09, 0x00, 0xbf, 0x14, 0x09, 0x00, 0xee, 0x14, 0x09, 0x00, 0xef, 0x14, - 0x09, 0x00, 0xf3, 0x14, 0x09, 0x00, 0xfb, 0x14, 0x09, 0x00, 0xf8, 0x15, - 0x09, 0x00, 0x38, 0x16, 0x09, 0x00, 0xb4, 0x16, 0x09, 0x00, 0xbe, 0x16, - 0x09, 0x00, 0xbf, 0x16, 0x09, 0x00, 0xee, 0x16, 0x09, 0x00, 0xef, 0x16, - 0x09, 0x00, 0xf3, 0x16, 0x09, 0x00, 0xfb, 0x16, 0x09, 0x00, 0x3e, 0x17, - 0x09, 0x00, 0x3f, 0x17, 0x09, 0x00, 0x88, 0x17, 0x09, 0x00, 0x3e, 0x19, - 0x09, 0x00, 0x3f, 0x19, 0x09, 0x00, 0x58, 0x19, 0x09, 0x00, 0x5c, 0x19, - 0x09, 0x00, 0x5e, 0x19, 0x09, 0x00, 0x5f, 0x19, 0x09, 0x00, 0xb8, 0x1a, - 0x09, 0x00, 0x3e, 0x1b, 0x09, 0x00, 0x3f, 0x1b, 0x09, 0x00, 0x88, 0x1b, - 0x09, 0x00, 0xe8, 0x1b, 0x09, 0x00, 0xfe, 0x1b, 0x09, 0x00, 0xff, 0x1b, - 0x09, 0x00, 0x3e, 0x1c, 0x09, 0x00, 0x3f, 0x1c, 0x09, 0x00, 0x3e, 0x1d, - 0x09, 0x00, 0x3f, 0x1d, 0x09, 0x00, 0x5e, 0x1d, 0x09, 0x00, 0x5f, 0x1d, - 0x09, 0x00, 0xce, 0x1f, 0x09, 0x00, 0xcf, 0x1f, 0x09, 0x00, 0xee, 0x1f, - 0x09, 0x00, 0xef, 0x1f, 0x09, 0x00, 0xf3, 0x1f, 0x09, 0x00, 0xfb, 0x1f, - 0x09, 0x00, 0xcb, 0x25, 0x09, 0x00, 0xf8, 0x29, 0x09, 0x00, 0xfc, 0x29, - 0x09, 0x00, 0xfe, 0x29, 0x09, 0x00, 0xff, 0x29, 0x09, 0x00, 0xfe, 0x2d, - 0x09, 0x00, 0xff, 0x2d, 0x09, 0x00, 0x48, 0x32, 0x09, 0x00, 0x4b, 0x32, - 0x09, 0x00, 0xbe, 0x32, 0x09, 0x00, 0xbf, 0x32, 0x09, 0x00, 0x88, 0x33, - 0x09, 0x00, 0x8b, 0x33, 0x09, 0x00, 0xf7, 0x35, 0x09, 0x00, 0xf8, 0x35, - 0x09, 0x00, 0xfc, 0x35, 0x09, 0x00, 0xfe, 0x35, 0x09, 0x00, 0xff, 0x35, - 0x09, 0x00, 0xcb, 0x39, 0x09, 0x00, 0xf0, 0x39, 0x09, 0x00, 0xf1, 0x39, - 0x09, 0x00, 0xf9, 0x39, 0x09, 0x00, 0xfd, 0x39, 0x09, 0x00, 0xcb, 0x3d, - 0x09, 0x00, 0xf0, 0x3d, 0x09, 0x00, 0xf1, 0x3d, 0x09, 0x00, 0xf9, 0x3d, - 0x09, 0x00, 0xfd, 0x3d, 0x09, 0x00, 0x88, 0x3f, 0x09, 0x00, 0x8b, 0x3f, - 0x09, 0x00, 0x31, 0x40, 0x09, 0x00, 0x38, 0x40, 0x09, 0x00, 0x48, 0x40, - 0x09, 0x00, 0x49, 0x40, 0x09, 0x00, 0x4b, 0x40, 0x09, 0x00, 0xb1, 0x40, - 0x09, 0x00, 0xb8, 0x40, 0x09, 0x00, 0x31, 0x41, 0x09, 0x00, 0x38, 0x41, - 0x09, 0x00, 0x46, 0x41, 0x09, 0x00, 0x47, 0x41, 0x09, 0x00, 0xc6, 0x41, - 0x09, 0x00, 0xc7, 0x41, 0x09, 0x00, 0xf6, 0x41, 0x09, 0x00, 0xf7, 0x41, - 0x09, 0x00, 0xf8, 0x41, 0x09, 0x00, 0xfc, 0x41, 0x09, 0x00, 0xfe, 0x41, - 0x09, 0x00, 0xff, 0x41, 0x09, 0x00, 0x31, 0x42, 0x09, 0x00, 0x38, 0x42, - 0x09, 0x00, 0x48, 0x42, 0x09, 0x00, 0x4b, 0x42, 0x09, 0x00, 0xb8, 0x42, - 0x09, 0x00, 0x30, 0x43, 0x09, 0x00, 0x36, 0x43, 0x09, 0x00, 0x37, 0x43, - 0x09, 0x00, 0x3d, 0x43, 0x09, 0x00, 0x3e, 0x43, 0x09, 0x00, 0x3f, 0x43, - 0x09, 0x00, 0x48, 0x43, 0x09, 0x00, 0x4b, 0x43, 0x09, 0x00, 0xc8, 0x43, - 0x09, 0x00, 0xc9, 0x43, 0x09, 0x00, 0xcb, 0x43, 0x09, 0x00, 0xf0, 0x43, - 0x09, 0x00, 0xf1, 0x43, 0x09, 0x00, 0xf9, 0x43, 0x09, 0x00, 0xfd, 0x43, - 0x09, 0x00, 0xbe, 0x45, 0x09, 0x00, 0xbf, 0x45, 0x09, 0x00, 0xb0, 0x47, - 0x09, 0x00, 0xb6, 0x47, 0x09, 0x00, 0xb7, 0x47, 0x09, 0x00, 0xbd, 0x47, - 0x09, 0x00, 0xbe, 0x47, 0x09, 0x00, 0xbf, 0x47, 0x09, 0x00, 0x30, 0x48, - 0x09, 0x00, 0x37, 0x48, 0x09, 0x00, 0x3d, 0x48, 0x09, 0x00, 0x3e, 0x48, - 0x09, 0x00, 0x3f, 0x48, 0x09, 0x00, 0xb1, 0x48, 0x09, 0x00, 0xb8, 0x48, - 0x09, 0x00, 0x30, 0x49, 0x09, 0x00, 0x37, 0x49, 0x09, 0x00, 0x3d, 0x49, - 0x09, 0x00, 0x3e, 0x49, 0x09, 0x00, 0x3f, 0x49, 0x09, 0x00, 0x50, 0x49, - 0x09, 0x00, 0x59, 0x49, 0x09, 0x00, 0x5d, 0x49, 0x09, 0x00, 0xbe, 0x49, - 0x09, 0x00, 0xbf, 0x49, 0x09, 0x00, 0xf7, 0x49, 0x09, 0x00, 0xf8, 0x49, - 0x09, 0x00, 0xfc, 0x49, 0x09, 0x00, 0xfe, 0x49, 0x09, 0x00, 0xff, 0x49, - 0x09, 0x00, 0xb0, 0x4a, 0x09, 0x00, 0xb7, 0x4a, 0x09, 0x00, 0xbd, 0x4a, - 0x09, 0x00, 0xbe, 0x4a, 0x09, 0x00, 0xbf, 0x4a, 0x09, 0x00, 0xb0, 0x4b, - 0x09, 0x00, 0xb6, 0x4b, 0x09, 0x00, 0xb7, 0x4b, 0x09, 0x00, 0xbd, 0x4b, - 0x09, 0x00, 0xbe, 0x4b, 0x09, 0x00, 0xbf, 0x4b, 0x09, 0x00, 0xbe, 0x4c, - 0x09, 0x00, 0xbf, 0x4c, 0x09, 0x00, 0x30, 0x4d, 0x09, 0x00, 0x37, 0x4d, - 0x09, 0x00, 0x3d, 0x4d, 0x09, 0x00, 0x3e, 0x4d, 0x09, 0x00, 0x3f, 0x4d, - 0x09, 0x00, 0x50, 0x4d, 0x09, 0x00, 0x58, 0x4d, 0x09, 0x00, 0xbe, 0x4d, - 0x09, 0x00, 0xbf, 0x4d, 0x09, 0x00, 0xf0, 0x4d, 0x09, 0x00, 0xf7, 0x4d, - 0x09, 0x00, 0xfd, 0x4d, 0x09, 0x00, 0xfe, 0x4d, 0x09, 0x00, 0xff, 0x4d, - 0x09, 0x00, 0xbe, 0x4e, 0x09, 0x00, 0xbf, 0x4e, 0x09, 0x00, 0xbe, 0x4f, - 0x09, 0x00, 0xbf, 0x4f, 0x09, 0x00, 0xc6, 0x4f, 0x09, 0x00, 0xc7, 0x4f, - 0x09, 0x00, 0xc8, 0x4f, 0x09, 0x00, 0xc9, 0x4f, 0x09, 0x00, 0xcb, 0x4f, - 0x09, 0x00, 0xe6, 0x4f, 0x09, 0x00, 0xe7, 0x4f, 0x09, 0x00, 0xe8, 0x4f, - 0x09, 0x00, 0xe9, 0x4f, 0x09, 0x00, 0xeb, 0x4f, 0x09, 0x00, 0xf6, 0x4f, - 0x09, 0x00, 0xf7, 0x4f, 0x09, 0x00, 0xf8, 0x4f, 0x09, 0x00, 0xfc, 0x4f, - 0x09, 0x00, 0xfe, 0x4f, 0x09, 0x00, 0xff, 0x4f, 0x09, 0x00, 0x48, 0x52, - 0x09, 0x00, 0x4b, 0x52, 0x09, 0x00, 0xb8, 0x52, 0x09, 0x00, 0x30, 0x53, - 0x09, 0x00, 0x36, 0x53, 0x09, 0x00, 0x37, 0x53, 0x09, 0x00, 0x3d, 0x53, - 0x09, 0x00, 0x3e, 0x53, 0x09, 0x00, 0x3f, 0x53, 0x09, 0x00, 0xbe, 0x53, - 0x09, 0x00, 0xbf, 0x53, 0x09, 0x00, 0xc8, 0x53, 0x09, 0x00, 0xc9, 0x53, - 0x09, 0x00, 0xcb, 0x53, 0x09, 0x00, 0xf0, 0x53, 0x09, 0x00, 0xf1, 0x53, - 0x09, 0x00, 0xf9, 0x53, 0x09, 0x00, 0xfd, 0x53, 0x09, 0x00, 0x31, 0x59, - 0x09, 0x00, 0x38, 0x59, 0x09, 0x00, 0xc6, 0x59, 0x09, 0x00, 0xc7, 0x59, - 0x09, 0x00, 0xf6, 0x59, 0x09, 0x00, 0xf7, 0x59, 0x09, 0x00, 0xf8, 0x59, - 0x09, 0x00, 0xfc, 0x59, 0x09, 0x00, 0xfe, 0x59, 0x09, 0x00, 0xff, 0x59, - 0x09, 0x00, 0x31, 0x5d, 0x09, 0x00, 0x38, 0x5d, 0x09, 0x00, 0xc6, 0x5d, - 0x09, 0x00, 0xc7, 0x5d, 0x09, 0x00, 0xf6, 0x5d, 0x09, 0x00, 0xf7, 0x5d, - 0x09, 0x00, 0xf8, 0x5d, 0x09, 0x00, 0xfc, 0x5d, 0x09, 0x00, 0xfe, 0x5d, - 0x09, 0x00, 0xff, 0x5d, 0x09, 0x00, 0x30, 0x5f, 0x09, 0x00, 0x36, 0x5f, - 0x09, 0x00, 0x37, 0x5f, 0x09, 0x00, 0x3d, 0x5f, 0x09, 0x00, 0x3e, 0x5f, - 0x09, 0x00, 0x3f, 0x5f, 0x09, 0x00, 0xbe, 0x5f, 0x09, 0x00, 0xbf, 0x5f, - 0x09, 0x00, 0xc8, 0x5f, 0x09, 0x00, 0xc9, 0x5f, 0x09, 0x00, 0xcb, 0x5f, - 0x09, 0x00, 0xf0, 0x5f, 0x09, 0x00, 0xf1, 0x5f, 0x09, 0x00, 0xf9, 0x5f, - 0x09, 0x00, 0xfd, 0x5f, 0x09, 0x00, 0x3e, 0x60, 0x09, 0x00, 0x3f, 0x60, - 0x09, 0x00, 0x45, 0x60, 0x09, 0x00, 0x4f, 0x60, 0x09, 0x00, 0xbe, 0x60, - 0x09, 0x00, 0xbf, 0x60, 0x09, 0x00, 0x38, 0x61, 0x09, 0x00, 0x4e, 0x61, - 0x09, 0x00, 0x4f, 0x61, 0x09, 0x00, 0xb8, 0x61, 0x09, 0x00, 0xf3, 0x61, - 0x09, 0x00, 0xfb, 0x61, 0x09, 0x00, 0x38, 0x63, 0x09, 0x00, 0xc5, 0x63, - 0x09, 0x00, 0xcf, 0x63, 0x09, 0x00, 0xf8, 0x63, 0x09, 0x00, 0x3e, 0x64, - 0x09, 0x00, 0x3f, 0x64, 0x09, 0x00, 0xe8, 0x64, 0x09, 0x00, 0xeb, 0x64, - 0x09, 0x00, 0xf8, 0x64, 0x09, 0x00, 0xfc, 0x64, 0x09, 0x00, 0xfe, 0x64, - 0x09, 0x00, 0xff, 0x64, 0x09, 0x00, 0x3e, 0x66, 0x09, 0x00, 0x3f, 0x66, - 0x09, 0x00, 0xeb, 0x66, 0x09, 0x00, 0xf8, 0x66, 0x09, 0x00, 0xfc, 0x66, - 0x09, 0x00, 0xfe, 0x66, 0x09, 0x00, 0xff, 0x66, 0x09, 0x00, 0x3e, 0x67, - 0x09, 0x00, 0x3f, 0x67, 0x09, 0x00, 0x88, 0x67, 0x09, 0x00, 0x3e, 0x68, - 0x09, 0x00, 0x3f, 0x68, 0x09, 0x00, 0x45, 0x68, 0x09, 0x00, 0x4f, 0x68, - 0x09, 0x00, 0xbe, 0x68, 0x09, 0x00, 0xbf, 0x68, 0x09, 0x00, 0x3e, 0x69, - 0x09, 0x00, 0x3f, 0x69, 0x09, 0x00, 0xf4, 0x69, 0x09, 0x00, 0xf5, 0x69, - 0x09, 0x00, 0xf8, 0x69, 0x09, 0x00, 0xfc, 0x69, 0x09, 0x00, 0xfe, 0x69, - 0x09, 0x00, 0xff, 0x69, 0x09, 0x00, 0x38, 0x6a, 0x09, 0x00, 0xb8, 0x6a, - 0x09, 0x00, 0xbe, 0x6b, 0x09, 0x00, 0xbf, 0x6b, 0x09, 0x00, 0x3e, 0x6d, - 0x09, 0x00, 0x3f, 0x6d, 0x09, 0x00, 0xfe, 0x6d, 0x09, 0x00, 0xff, 0x6d, - 0x09, 0x00, 0xf3, 0x6f, 0x09, 0x00, 0xfb, 0x6f, 0x09, 0x00, 0x38, 0x70, - 0x09, 0x00, 0x44, 0x70, 0x09, 0x00, 0xbe, 0x70, 0x09, 0x00, 0xbf, 0x70, - 0x09, 0x00, 0x34, 0x71, 0x09, 0x00, 0x3e, 0x71, 0x09, 0x00, 0x3f, 0x71, - 0x09, 0x00, 0x58, 0x71, 0x09, 0x00, 0x5c, 0x71, 0x09, 0x00, 0x5e, 0x71, - 0x09, 0x00, 0x5f, 0x71, 0x09, 0x00, 0xb4, 0x71, 0x09, 0x00, 0xbe, 0x71, - 0x09, 0x00, 0xbf, 0x71, 0x09, 0x00, 0xf8, 0x71, 0x09, 0x00, 0xfc, 0x71, - 0x09, 0x00, 0xfe, 0x71, 0x09, 0x00, 0xff, 0x71, 0x09, 0x00, 0x38, 0x72, - 0x09, 0x00, 0xbe, 0x74, 0x09, 0x00, 0xbf, 0x74, 0x09, 0x00, 0x38, 0x75, - 0x09, 0x00, 0x58, 0x75, 0x09, 0x00, 0xf8, 0x75, 0x09, 0x00, 0xb4, 0x76, - 0x09, 0x00, 0xbe, 0x76, 0x09, 0x00, 0xbf, 0x76, 0x09, 0x00, 0xbe, 0x77, - 0x09, 0x00, 0xbf, 0x77, 0x09, 0x00, 0xc4, 0x77, 0x09, 0x00, 0xc8, 0x77, - 0x09, 0x00, 0xe4, 0x77, 0x09, 0x00, 0xe8, 0x77, 0x09, 0x00, 0xf4, 0x77, - 0x09, 0x00, 0xf5, 0x77, 0x09, 0x00, 0xf8, 0x77, 0x09, 0x00, 0xfc, 0x77, - 0x09, 0x00, 0xfe, 0x77, 0x09, 0x00, 0xff, 0x77, 0x09, 0x00, 0xe8, 0x78, - 0x09, 0x00, 0xeb, 0x78, 0x09, 0x00, 0xfe, 0x78, 0x09, 0x00, 0xff, 0x78, - 0x09, 0x00, 0x3e, 0x7a, 0x09, 0x00, 0x3f, 0x7a, 0x09, 0x00, 0xb4, 0x7a, - 0x09, 0x00, 0xbe, 0x7a, 0x09, 0x00, 0xbf, 0x7a, 0x09, 0x00, 0xcb, 0x7a, - 0x09, 0x00, 0xeb, 0x7a, 0x09, 0x00, 0xf8, 0x7a, 0x09, 0x00, 0xfc, 0x7a, - 0x09, 0x00, 0xfe, 0x7a, 0x09, 0x00, 0xff, 0x7a, 0x09, 0x00, 0xbe, 0x7b, - 0x09, 0x00, 0xbf, 0x7b, 0x09, 0x00, 0x38, 0x7c, 0x09, 0x00, 0x38, 0x7e, - 0x09, 0x00, 0x38, 0x7f, 0x09, 0x00, 0x83, 0x83, 0x09, 0x00, 0xe3, 0x83, - 0x09, 0x00, 0xed, 0x83, 0x09, 0x00, 0xf1, 0x83, 0x09, 0x00, 0xf3, 0x83, - 0x09, 0x00, 0xf9, 0x83, 0x09, 0x00, 0xfb, 0x83, 0x09, 0x00, 0xfd, 0x83, - 0x09, 0x00, 0x32, 0x85, 0x09, 0x00, 0x37, 0x85, 0x09, 0x00, 0x38, 0x85, - 0x09, 0x00, 0x3a, 0x85, 0x09, 0x00, 0x3c, 0x85, 0x09, 0x00, 0x3e, 0x85, - 0x09, 0x00, 0x3f, 0x85, 0x09, 0x00, 0x5f, 0x85, 0x09, 0x00, 0xb8, 0x85, - 0x09, 0x00, 0xbc, 0x85, 0x09, 0x00, 0xbe, 0x85, 0x09, 0x00, 0xbf, 0x85, - 0x09, 0x00, 0x30, 0x86, 0x09, 0x00, 0x31, 0x86, 0x09, 0x00, 0x39, 0x86, - 0x09, 0x00, 0x3d, 0x86, 0x09, 0x00, 0x31, 0x87, 0x09, 0x00, 0x33, 0x87, - 0x09, 0x00, 0x39, 0x87, 0x09, 0x00, 0x3b, 0x87, 0x09, 0x00, 0x3d, 0x87, - 0x09, 0x00, 0x83, 0x87, 0x09, 0x00, 0x87, 0x87, 0x09, 0x00, 0x8d, 0x87, - 0x09, 0x00, 0xe1, 0x87, 0x09, 0x00, 0xe2, 0x87, 0x09, 0x00, 0xe7, 0x87, - 0x09, 0x00, 0xeb, 0x87, 0x09, 0x00, 0xee, 0x87, 0x09, 0x00, 0xef, 0x87, - 0x09, 0x00, 0xf2, 0x87, 0x09, 0x00, 0xf7, 0x87, 0x09, 0x00, 0xf8, 0x87, - 0x09, 0x00, 0xfa, 0x87, 0x09, 0x00, 0xfc, 0x87, 0x09, 0x00, 0xfe, 0x87, - 0x09, 0x00, 0xff, 0x87, 0x09, 0x00, 0x37, 0x8a, 0x09, 0x00, 0x31, 0x8b, - 0x09, 0x00, 0x33, 0x8b, 0x09, 0x00, 0x37, 0x8b, 0x09, 0x00, 0x39, 0x8b, - 0x09, 0x00, 0x3b, 0x8b, 0x09, 0x00, 0x3d, 0x8b, 0x09, 0x00, 0x8b, 0x8b, - 0x09, 0x00, 0x8d, 0x8b, 0x09, 0x00, 0xe1, 0x8b, 0x09, 0x00, 0xe2, 0x8b, - 0x09, 0x00, 0xee, 0x8b, 0x09, 0x00, 0xef, 0x8b, 0x09, 0x00, 0xf2, 0x8b, - 0x09, 0x00, 0xf8, 0x8b, 0x09, 0x00, 0xfa, 0x8b, 0x09, 0x00, 0xfc, 0x8b, - 0x09, 0x00, 0xfe, 0x8b, 0x09, 0x00, 0xff, 0x8b, 0x09, 0x00, 0x8b, 0x8f, - 0x09, 0x00, 0xe3, 0x8f, 0x09, 0x00, 0xe7, 0x8f, 0x09, 0x00, 0xeb, 0x8f, - 0x09, 0x00, 0xed, 0x8f, 0x09, 0x00, 0xf1, 0x8f, 0x09, 0x00, 0xf3, 0x8f, - 0x09, 0x00, 0xf7, 0x8f, 0x09, 0x00, 0xf9, 0x8f, 0x09, 0x00, 0xfb, 0x8f, - 0x09, 0x00, 0xfd, 0x8f, 0x09, 0x00, 0x3e, 0x92, 0x09, 0x00, 0x3f, 0x92, - 0x09, 0x00, 0xff, 0x95, 0x09, 0x00, 0xf3, 0x99, 0x09, 0x00, 0xfb, 0x99, - 0x09, 0x00, 0xf3, 0x9d, 0x09, 0x00, 0xfb, 0x9d, 0x09, 0x00, 0x38, 0x9e, - 0x09, 0x00, 0x3c, 0x9e, 0x09, 0x00, 0x3e, 0x9e, 0x09, 0x00, 0x3f, 0x9e, - 0x09, 0x00, 0x38, 0x9f, 0x09, 0x00, 0x3c, 0x9f, 0x09, 0x00, 0x3e, 0x9f, - 0x09, 0x00, 0x3f, 0x9f, 0x09, 0x00, 0xeb, 0xa3, 0x09, 0x00, 0xf8, 0xa3, - 0x09, 0x00, 0xfc, 0xa3, 0x09, 0x00, 0xfe, 0xa3, 0x09, 0x00, 0xff, 0xa3, - 0x09, 0x00, 0xf8, 0xa7, 0x09, 0x00, 0xfc, 0xa7, 0x09, 0x00, 0xfe, 0xa7, - 0x09, 0x00, 0xff, 0xa7, 0x09, 0x00, 0xb8, 0xaa, 0x09, 0x00, 0xbc, 0xaa, - 0x09, 0x00, 0xbe, 0xaa, 0x09, 0x00, 0xbf, 0xaa, 0x09, 0x00, 0x3e, 0xab, - 0x09, 0x00, 0x3f, 0xab, 0x09, 0x00, 0x8b, 0xab, 0x09, 0x00, 0xeb, 0xab, - 0x09, 0x00, 0x30, 0xb3, 0x09, 0x00, 0x31, 0xb3, 0x09, 0x00, 0x37, 0xb3, - 0x09, 0x00, 0x39, 0xb3, 0x09, 0x00, 0x3d, 0xb3, 0x09, 0x00, 0xf8, 0xb3, - 0x09, 0x00, 0xfc, 0xb3, 0x09, 0x00, 0xfe, 0xb3, 0x09, 0x00, 0xff, 0xb3, - 0x09, 0x00, 0x8b, 0xb7, 0x09, 0x00, 0xf8, 0xb7, 0x09, 0x00, 0xfc, 0xb7, - 0x09, 0x00, 0xfe, 0xb7, 0x09, 0x00, 0xff, 0xb7, 0x09, 0x00, 0x3f, 0xb9, - 0x09, 0x00, 0xbf, 0xb9, 0x09, 0x00, 0x30, 0xbb, 0x09, 0x00, 0x31, 0xbb, - 0x09, 0x00, 0x37, 0xbb, 0x09, 0x00, 0x39, 0xbb, 0x09, 0x00, 0x3d, 0xbb, - 0x09, 0x00, 0x8b, 0xbb, 0x09, 0x00, 0xf8, 0xbb, 0x09, 0x00, 0xfc, 0xbb, - 0x09, 0x00, 0xfe, 0xbb, 0x09, 0x00, 0xff, 0xbb, 0x09, 0x00, 0x37, 0xbd, - 0x09, 0x00, 0x38, 0xbf, 0x09, 0x00, 0x3c, 0xbf, 0x09, 0x00, 0x3e, 0xbf, - 0x09, 0x00, 0x3f, 0xbf, 0x09, 0x00, 0x8b, 0xbf, 0x09, 0x00, 0xe7, 0xbf, - 0x09, 0x00, 0xeb, 0xbf, 0x09, 0x00, 0xf0, 0xbf, 0x09, 0x00, 0xf1, 0xbf, - 0x09, 0x00, 0xf7, 0xbf, 0x09, 0x00, 0xf9, 0xbf, 0x09, 0x00, 0xfd, 0xbf, - 0x09, 0x00, 0xb8, 0xc2, 0x09, 0x00, 0xbc, 0xc2, 0x09, 0x00, 0xbe, 0xc2, - 0x09, 0x00, 0xbf, 0xc2, 0x09, 0x00, 0x8b, 0xc3, 0x09, 0x00, 0x8e, 0xc3, - 0x09, 0x00, 0x8f, 0xc3, 0x09, 0x00, 0xb3, 0xc5, 0x09, 0x00, 0xbb, 0xc5, - 0x09, 0x00, 0xc3, 0xc5, 0x09, 0x00, 0xf2, 0xc5, 0x09, 0x00, 0xf7, 0xc5, - 0x09, 0x00, 0xf8, 0xc5, 0x09, 0x00, 0xfa, 0xc5, 0x09, 0x00, 0xfc, 0xc5, - 0x09, 0x00, 0xfe, 0xc5, 0x09, 0x00, 0xff, 0xc5, 0x09, 0x00, 0xff, 0xc9, - 0x09, 0x00, 0xff, 0xcd, 0x09, 0x00, 0xf3, 0xd5, 0x09, 0x00, 0xfb, 0xd5, - 0x09, 0x00, 0xf3, 0xd9, 0x09, 0x00, 0xfb, 0xd9, 0x09, 0x00, 0xc3, 0xdd, - 0x09, 0x00, 0xcf, 0xdd, 0x09, 0x00, 0xf8, 0xdd, 0x09, 0x00, 0xfc, 0xdd, - 0x09, 0x00, 0xfe, 0xdd, 0x09, 0x00, 0xff, 0xdd, 0x09, 0x00, 0x84, 0xe3, - 0x09, 0x00, 0xff, 0xe5, 0x09, 0x00, 0xf1, 0xe9, 0x09, 0x00, 0xf3, 0xe9, - 0x09, 0x00, 0xf9, 0xe9, 0x09, 0x00, 0xfb, 0xe9, 0x09, 0x00, 0xfd, 0xe9, - 0x09, 0x00, 0xf1, 0xed, 0x09, 0x00, 0xf3, 0xed, 0x09, 0x00, 0xf9, 0xed, - 0x09, 0x00, 0xfb, 0xed, 0x09, 0x00, 0xfd, 0xed, 0x09, 0x00, 0x37, 0xf2, - 0x09, 0x00, 0xff, 0xf2, 0x09, 0x00, 0x84, 0xf3, 0x09, 0x00, 0x8e, 0xf3, - 0x09, 0x00, 0x8f, 0xf3, 0x09, 0x00, 0xff, 0xf5, 0x09, 0x00, 0xb3, 0xf9, - 0x09, 0x00, 0xbb, 0xf9, 0x09, 0x00, 0xff, 0xf9, 0x09, 0x00, 0xf8, 0xfc, - 0x09, 0x00, 0xfc, 0xfc, 0x09, 0x00, 0xfe, 0xfc, 0x09, 0x00, 0xff, 0xfc, - 0x09, 0x00, 0xb4, 0xfd, 0x09, 0x00, 0xff, 0xfd, 0x09, 0x00, 0x37, 0xfe, - 0x09, 0x00, 0xff, 0xfe, 0x09, 0x00, 0x31, 0xff, 0x09, 0x00, 0x33, 0xff, - 0x09, 0x00, 0x37, 0xff, 0x09, 0x00, 0x39, 0xff, 0x09, 0x00, 0x3b, 0xff, - 0x09, 0x00, 0x3d, 0xff, 0x09, 0x00, 0xb3, 0xff, 0x09, 0x00, 0xbb, 0xff, - 0x09, 0x00, 0x38, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3e, 0x00, - 0x0a, 0x00, 0x3f, 0x00, 0x0a, 0x00, 0xe8, 0x00, 0x0a, 0x00, 0xeb, 0x00, - 0x0a, 0x00, 0xf8, 0x00, 0x0a, 0x00, 0xfc, 0x00, 0x0a, 0x00, 0xfe, 0x00, - 0x0a, 0x00, 0xff, 0x00, 0x0a, 0x00, 0x38, 0x03, 0x0a, 0x00, 0x3c, 0x03, - 0x0a, 0x00, 0x3e, 0x03, 0x0a, 0x00, 0x3f, 0x03, 0x0a, 0x00, 0x88, 0x07, - 0x0a, 0x00, 0x8b, 0x07, 0x0a, 0x00, 0x4b, 0x08, 0x0a, 0x00, 0x38, 0x10, - 0x0a, 0x00, 0xbe, 0x10, 0x0a, 0x00, 0xbf, 0x10, 0x0a, 0x00, 0xe8, 0x10, - 0x0a, 0x00, 0xeb, 0x10, 0x0a, 0x00, 0xb8, 0x14, 0x0a, 0x00, 0xbc, 0x14, - 0x0a, 0x00, 0xbe, 0x14, 0x0a, 0x00, 0xbf, 0x14, 0x0a, 0x00, 0x38, 0x15, - 0x0a, 0x00, 0xf8, 0x15, 0x0a, 0x00, 0xfc, 0x15, 0x0a, 0x00, 0xfe, 0x15, - 0x0a, 0x00, 0xff, 0x15, 0x0a, 0x00, 0xb8, 0x16, 0x0a, 0x00, 0xbc, 0x16, - 0x0a, 0x00, 0xbe, 0x16, 0x0a, 0x00, 0xbf, 0x16, 0x0a, 0x00, 0xb8, 0x17, - 0x0a, 0x00, 0xbc, 0x17, 0x0a, 0x00, 0xbe, 0x17, 0x0a, 0x00, 0xbf, 0x17, - 0x0a, 0x00, 0xf8, 0x19, 0x0a, 0x00, 0xfc, 0x19, 0x0a, 0x00, 0xfe, 0x19, - 0x0a, 0x00, 0xff, 0x19, 0x0a, 0x00, 0x38, 0x1d, 0x0a, 0x00, 0xf8, 0x1d, - 0x0a, 0x00, 0xfc, 0x1d, 0x0a, 0x00, 0xfe, 0x1d, 0x0a, 0x00, 0xff, 0x1d, - 0x0a, 0x00, 0x38, 0x22, 0x0a, 0x00, 0x3c, 0x22, 0x0a, 0x00, 0x3e, 0x22, - 0x0a, 0x00, 0x3f, 0x22, 0x0a, 0x00, 0xc8, 0x22, 0x0a, 0x00, 0xcb, 0x22, - 0x0a, 0x00, 0xe8, 0x22, 0x0a, 0x00, 0xeb, 0x22, 0x0a, 0x00, 0xf8, 0x22, - 0x0a, 0x00, 0xfc, 0x22, 0x0a, 0x00, 0xfe, 0x22, 0x0a, 0x00, 0xff, 0x22, - 0x0a, 0x00, 0x38, 0x25, 0x0a, 0x00, 0x3c, 0x25, 0x0a, 0x00, 0x3e, 0x25, - 0x0a, 0x00, 0x3f, 0x25, 0x0a, 0x00, 0x58, 0x29, 0x0a, 0x00, 0x5c, 0x29, - 0x0a, 0x00, 0x5e, 0x29, 0x0a, 0x00, 0x5f, 0x29, 0x0a, 0x00, 0xf8, 0x29, - 0x0a, 0x00, 0xfc, 0x29, 0x0a, 0x00, 0xfe, 0x29, 0x0a, 0x00, 0xff, 0x29, - 0x0a, 0x00, 0x38, 0x2c, 0x0a, 0x00, 0x38, 0x2d, 0x0a, 0x00, 0x58, 0x2d, - 0x0a, 0x00, 0x5c, 0x2d, 0x0a, 0x00, 0x5e, 0x2d, 0x0a, 0x00, 0x5f, 0x2d, - 0x0a, 0x00, 0xf8, 0x2d, 0x0a, 0x00, 0xfc, 0x2d, 0x0a, 0x00, 0xfe, 0x2d, - 0x0a, 0x00, 0xff, 0x2d, 0x0a, 0x00, 0xe8, 0x2e, 0x0a, 0x00, 0xeb, 0x2e, - 0x0a, 0x00, 0xf8, 0x2e, 0x0a, 0x00, 0xfc, 0x2e, 0x0a, 0x00, 0xfe, 0x2e, - 0x0a, 0x00, 0xff, 0x2e, 0x0a, 0x00, 0x36, 0x33, 0x0a, 0x00, 0x37, 0x33, - 0x0a, 0x00, 0x38, 0x33, 0x0a, 0x00, 0x3c, 0x33, 0x0a, 0x00, 0x3e, 0x33, - 0x0a, 0x00, 0x3f, 0x33, 0x0a, 0x00, 0xb8, 0x33, 0x0a, 0x00, 0xbc, 0x33, - 0x0a, 0x00, 0xbe, 0x33, 0x0a, 0x00, 0xbf, 0x33, 0x0a, 0x00, 0xe9, 0x33, - 0x0a, 0x00, 0xea, 0x33, 0x0a, 0x00, 0xf0, 0x33, 0x0a, 0x00, 0xf1, 0x33, - 0x0a, 0x00, 0xf9, 0x33, 0x0a, 0x00, 0xfd, 0x33, 0x0a, 0x00, 0x30, 0x3f, - 0x0a, 0x00, 0x31, 0x3f, 0x0a, 0x00, 0x39, 0x3f, 0x0a, 0x00, 0x3d, 0x3f, - 0x0a, 0x00, 0xf0, 0x41, 0x0a, 0x00, 0xf1, 0x41, 0x0a, 0x00, 0xf9, 0x41, - 0x0a, 0x00, 0xfd, 0x41, 0x0a, 0x00, 0xcb, 0x43, 0x0a, 0x00, 0xf7, 0x43, - 0x0a, 0x00, 0xf8, 0x43, 0x0a, 0x00, 0xfc, 0x43, 0x0a, 0x00, 0xfe, 0x43, - 0x0a, 0x00, 0xff, 0x43, 0x0a, 0x00, 0x37, 0x45, 0x0a, 0x00, 0x38, 0x45, - 0x0a, 0x00, 0x3c, 0x45, 0x0a, 0x00, 0x3e, 0x45, 0x0a, 0x00, 0x3f, 0x45, - 0x0a, 0x00, 0xb8, 0x45, 0x0a, 0x00, 0xbc, 0x45, 0x0a, 0x00, 0xbe, 0x45, - 0x0a, 0x00, 0xbf, 0x45, 0x0a, 0x00, 0xb7, 0x47, 0x0a, 0x00, 0xb8, 0x47, - 0x0a, 0x00, 0xbc, 0x47, 0x0a, 0x00, 0xbe, 0x47, 0x0a, 0x00, 0xbf, 0x47, - 0x0a, 0x00, 0xf7, 0x47, 0x0a, 0x00, 0xf8, 0x47, 0x0a, 0x00, 0xfc, 0x47, - 0x0a, 0x00, 0xfe, 0x47, 0x0a, 0x00, 0xff, 0x47, 0x0a, 0x00, 0xff, 0x49, - 0x0a, 0x00, 0x30, 0x4b, 0x0a, 0x00, 0x3d, 0x4b, 0x0a, 0x00, 0x3e, 0x4b, - 0x0a, 0x00, 0x3f, 0x4b, 0x0a, 0x00, 0xb1, 0x4b, 0x0a, 0x00, 0xb7, 0x4b, - 0x0a, 0x00, 0xb8, 0x4b, 0x0a, 0x00, 0xe7, 0x4b, 0x0a, 0x00, 0xf0, 0x4b, - 0x0a, 0x00, 0xf1, 0x4b, 0x0a, 0x00, 0xf7, 0x4b, 0x0a, 0x00, 0xf9, 0x4b, - 0x0a, 0x00, 0xfd, 0x4b, 0x0a, 0x00, 0xff, 0x4d, 0x0a, 0x00, 0xb8, 0x52, - 0x0a, 0x00, 0xbc, 0x52, 0x0a, 0x00, 0xbe, 0x52, 0x0a, 0x00, 0xbf, 0x52, - 0x0a, 0x00, 0xff, 0x55, 0x0a, 0x00, 0x37, 0x59, 0x0a, 0x00, 0x38, 0x59, - 0x0a, 0x00, 0x3c, 0x59, 0x0a, 0x00, 0x3e, 0x59, 0x0a, 0x00, 0x3f, 0x59, - 0x0a, 0x00, 0xb8, 0x5c, 0x0a, 0x00, 0xbc, 0x5c, 0x0a, 0x00, 0xbe, 0x5c, - 0x0a, 0x00, 0xbf, 0x5c, 0x0a, 0x00, 0x30, 0x5d, 0x0a, 0x00, 0x31, 0x5d, - 0x0a, 0x00, 0x39, 0x5d, 0x0a, 0x00, 0x3d, 0x5d, 0x0a, 0x00, 0xb8, 0x5e, - 0x0a, 0x00, 0xbc, 0x5e, 0x0a, 0x00, 0xbe, 0x5e, 0x0a, 0x00, 0xbf, 0x5e, - 0x0a, 0x00, 0xf0, 0x5f, 0x0a, 0x00, 0xf1, 0x5f, 0x0a, 0x00, 0xf9, 0x5f, - 0x0a, 0x00, 0xfd, 0x5f, 0x0a, 0x00, 0xf3, 0x61, 0x0a, 0x00, 0xfb, 0x61, - 0x0a, 0x00, 0xcf, 0x63, 0x0a, 0x00, 0xf8, 0x63, 0x0a, 0x00, 0xfc, 0x63, - 0x0a, 0x00, 0xfe, 0x63, 0x0a, 0x00, 0xff, 0x63, 0x0a, 0x00, 0x33, 0x65, - 0x0a, 0x00, 0x3b, 0x65, 0x0a, 0x00, 0x3f, 0x65, 0x0a, 0x00, 0xff, 0x66, - 0x0a, 0x00, 0xb3, 0x67, 0x0a, 0x00, 0xbb, 0x67, 0x0a, 0x00, 0xce, 0x67, - 0x0a, 0x00, 0xcf, 0x67, 0x0a, 0x00, 0xee, 0x67, 0x0a, 0x00, 0xef, 0x67, - 0x0a, 0x00, 0xf8, 0x67, 0x0a, 0x00, 0xfc, 0x67, 0x0a, 0x00, 0xfe, 0x67, - 0x0a, 0x00, 0xff, 0x67, 0x0a, 0x00, 0xf8, 0x69, 0x0a, 0x00, 0xfc, 0x69, - 0x0a, 0x00, 0xfe, 0x69, 0x0a, 0x00, 0xff, 0x69, 0x0a, 0x00, 0x34, 0x6b, - 0x0a, 0x00, 0x3e, 0x6b, 0x0a, 0x00, 0x3f, 0x6b, 0x0a, 0x00, 0xb4, 0x6b, - 0x0a, 0x00, 0xbe, 0x6b, 0x0a, 0x00, 0xbf, 0x6b, 0x0a, 0x00, 0xf3, 0x6b, - 0x0a, 0x00, 0xfb, 0x6b, 0x0a, 0x00, 0xf8, 0x6d, 0x0a, 0x00, 0xfc, 0x6d, - 0x0a, 0x00, 0xfe, 0x6d, 0x0a, 0x00, 0xff, 0x6d, 0x0a, 0x00, 0xff, 0x71, - 0x0a, 0x00, 0x3e, 0x73, 0x0a, 0x00, 0x3f, 0x73, 0x0a, 0x00, 0xf3, 0x73, - 0x0a, 0x00, 0xfb, 0x73, 0x0a, 0x00, 0xce, 0x77, 0x0a, 0x00, 0xcf, 0x77, - 0x0a, 0x00, 0xee, 0x77, 0x0a, 0x00, 0xef, 0x77, 0x0a, 0x00, 0xf8, 0x77, - 0x0a, 0x00, 0xfc, 0x77, 0x0a, 0x00, 0xfe, 0x77, 0x0a, 0x00, 0xff, 0x77, - 0x0a, 0x00, 0xf3, 0x79, 0x0a, 0x00, 0xfb, 0x79, 0x0a, 0x00, 0x34, 0x7b, - 0x0a, 0x00, 0x38, 0x7b, 0x0a, 0x00, 0xb4, 0x7b, 0x0a, 0x00, 0xb8, 0x7b, - 0x0a, 0x00, 0xee, 0x7b, 0x0a, 0x00, 0xef, 0x7b, 0x0a, 0x00, 0xf8, 0x7b, - 0x0a, 0x00, 0xfc, 0x7b, 0x0a, 0x00, 0xfe, 0x7b, 0x0a, 0x00, 0xff, 0x7b, - 0x0a, 0x00, 0x3f, 0x7c, 0x0a, 0x00, 0xf3, 0x7d, 0x0a, 0x00, 0xfb, 0x7d, - 0x0a, 0x00, 0x3f, 0x7e, 0x0a, 0x00, 0x38, 0x7f, 0x0a, 0x00, 0x3c, 0x7f, - 0x0a, 0x00, 0x3e, 0x7f, 0x0a, 0x00, 0x3f, 0x7f, 0x0a, 0x00, 0x31, 0x80, - 0x0a, 0x00, 0x33, 0x80, 0x0a, 0x00, 0x39, 0x80, 0x0a, 0x00, 0x3b, 0x80, - 0x0a, 0x00, 0x3d, 0x80, 0x0a, 0x00, 0x43, 0x80, 0x0a, 0x00, 0xb1, 0x80, - 0x0a, 0x00, 0xb3, 0x80, 0x0a, 0x00, 0xb9, 0x80, 0x0a, 0x00, 0xbb, 0x80, - 0x0a, 0x00, 0xbd, 0x80, 0x0a, 0x00, 0xe1, 0x80, 0x0a, 0x00, 0xe2, 0x80, - 0x0a, 0x00, 0xe7, 0x80, 0x0a, 0x00, 0xeb, 0x80, 0x0a, 0x00, 0xee, 0x80, - 0x0a, 0x00, 0xef, 0x80, 0x0a, 0x00, 0xf2, 0x80, 0x0a, 0x00, 0xf7, 0x80, - 0x0a, 0x00, 0xf8, 0x80, 0x0a, 0x00, 0xfa, 0x80, 0x0a, 0x00, 0xfc, 0x80, - 0x0a, 0x00, 0xfe, 0x80, 0x0a, 0x00, 0xff, 0x80, 0x0a, 0x00, 0xc3, 0x81, - 0x0a, 0x00, 0xf2, 0x81, 0x0a, 0x00, 0xf7, 0x81, 0x0a, 0x00, 0xf8, 0x81, - 0x0a, 0x00, 0xfa, 0x81, 0x0a, 0x00, 0xfc, 0x81, 0x0a, 0x00, 0xfe, 0x81, - 0x0a, 0x00, 0xff, 0x81, 0x0a, 0x00, 0xb3, 0x82, 0x0a, 0x00, 0xbb, 0x82, - 0x0a, 0x00, 0xe3, 0x82, 0x0a, 0x00, 0xed, 0x82, 0x0a, 0x00, 0xf1, 0x82, - 0x0a, 0x00, 0xf3, 0x82, 0x0a, 0x00, 0xf9, 0x82, 0x0a, 0x00, 0xfb, 0x82, - 0x0a, 0x00, 0xfd, 0x82, 0x0a, 0x00, 0x32, 0x83, 0x0a, 0x00, 0x37, 0x83, - 0x0a, 0x00, 0x38, 0x83, 0x0a, 0x00, 0x3a, 0x83, 0x0a, 0x00, 0x3c, 0x83, - 0x0a, 0x00, 0x3e, 0x83, 0x0a, 0x00, 0x3f, 0x83, 0x0a, 0x00, 0x43, 0x83, - 0x0a, 0x00, 0x4f, 0x83, 0x0a, 0x00, 0xb8, 0x83, 0x0a, 0x00, 0xbc, 0x83, - 0x0a, 0x00, 0xbe, 0x83, 0x0a, 0x00, 0xbf, 0x83, 0x0a, 0x00, 0xe3, 0x83, - 0x0a, 0x00, 0xed, 0x83, 0x0a, 0x00, 0xf1, 0x83, 0x0a, 0x00, 0xf3, 0x83, - 0x0a, 0x00, 0xf9, 0x83, 0x0a, 0x00, 0xfb, 0x83, 0x0a, 0x00, 0xfd, 0x83, - 0x0a, 0x00, 0x37, 0x84, 0x0a, 0x00, 0x38, 0x84, 0x0a, 0x00, 0x3c, 0x84, - 0x0a, 0x00, 0x3e, 0x84, 0x0a, 0x00, 0x3f, 0x84, 0x0a, 0x00, 0xe7, 0x84, - 0x0a, 0x00, 0xeb, 0x84, 0x0a, 0x00, 0xf7, 0x84, 0x0a, 0x00, 0xf8, 0x84, - 0x0a, 0x00, 0xfc, 0x84, 0x0a, 0x00, 0xfe, 0x84, 0x0a, 0x00, 0xff, 0x84, - 0x0a, 0x00, 0xb8, 0x85, 0x0a, 0x00, 0xbc, 0x85, 0x0a, 0x00, 0xbe, 0x85, - 0x0a, 0x00, 0xbf, 0x85, 0x0a, 0x00, 0xcd, 0x85, 0x0a, 0x00, 0xf1, 0x85, - 0x0a, 0x00, 0xf3, 0x85, 0x0a, 0x00, 0xf9, 0x85, 0x0a, 0x00, 0xfb, 0x85, - 0x0a, 0x00, 0xfd, 0x85, 0x0a, 0x00, 0x30, 0x86, 0x0a, 0x00, 0x31, 0x86, - 0x0a, 0x00, 0x39, 0x86, 0x0a, 0x00, 0x3d, 0x86, 0x0a, 0x00, 0x31, 0x87, - 0x0a, 0x00, 0x33, 0x87, 0x0a, 0x00, 0x39, 0x87, 0x0a, 0x00, 0x3b, 0x87, - 0x0a, 0x00, 0x3d, 0x87, 0x0a, 0x00, 0x83, 0x87, 0x0a, 0x00, 0x87, 0x87, - 0x0a, 0x00, 0x8d, 0x87, 0x0a, 0x00, 0xe1, 0x87, 0x0a, 0x00, 0xe2, 0x87, - 0x0a, 0x00, 0xe7, 0x87, 0x0a, 0x00, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x87, - 0x0a, 0x00, 0xef, 0x87, 0x0a, 0x00, 0xf2, 0x87, 0x0a, 0x00, 0xf7, 0x87, - 0x0a, 0x00, 0xf8, 0x87, 0x0a, 0x00, 0xfa, 0x87, 0x0a, 0x00, 0xfc, 0x87, - 0x0a, 0x00, 0xfe, 0x87, 0x0a, 0x00, 0xff, 0x87, 0x0a, 0x00, 0xb2, 0x88, - 0x0a, 0x00, 0xb8, 0x88, 0x0a, 0x00, 0xba, 0x88, 0x0a, 0x00, 0xbc, 0x88, - 0x0a, 0x00, 0xbe, 0x88, 0x0a, 0x00, 0xbf, 0x88, 0x0a, 0x00, 0xf3, 0x89, - 0x0a, 0x00, 0xf7, 0x89, 0x0a, 0x00, 0xfb, 0x89, 0x0a, 0x00, 0x37, 0x8a, - 0x0a, 0x00, 0x8b, 0x8b, 0x0a, 0x00, 0x8d, 0x8b, 0x0a, 0x00, 0x4f, 0x8c, - 0x0a, 0x00, 0xb8, 0x8c, 0x0a, 0x00, 0xbc, 0x8c, 0x0a, 0x00, 0xbe, 0x8c, - 0x0a, 0x00, 0xbf, 0x8c, 0x0a, 0x00, 0xff, 0x8d, 0x0a, 0x00, 0x33, 0x8e, - 0x0a, 0x00, 0x37, 0x8e, 0x0a, 0x00, 0x3b, 0x8e, 0x0a, 0x00, 0x43, 0x8e, - 0x0a, 0x00, 0xbf, 0x8e, 0x0a, 0x00, 0x32, 0x8f, 0x0a, 0x00, 0x38, 0x8f, - 0x0a, 0x00, 0x3a, 0x8f, 0x0a, 0x00, 0x3c, 0x8f, 0x0a, 0x00, 0x3e, 0x8f, - 0x0a, 0x00, 0x3f, 0x8f, 0x0a, 0x00, 0x4f, 0x8f, 0x0a, 0x00, 0xb8, 0x8f, - 0x0a, 0x00, 0xbc, 0x8f, 0x0a, 0x00, 0xbe, 0x8f, 0x0a, 0x00, 0xbf, 0x8f, - 0x0a, 0x00, 0xe3, 0x8f, 0x0a, 0x00, 0xe7, 0x8f, 0x0a, 0x00, 0xeb, 0x8f, - 0x0a, 0x00, 0xed, 0x8f, 0x0a, 0x00, 0xf1, 0x8f, 0x0a, 0x00, 0xf3, 0x8f, - 0x0a, 0x00, 0xf7, 0x8f, 0x0a, 0x00, 0xf9, 0x8f, 0x0a, 0x00, 0xfb, 0x8f, - 0x0a, 0x00, 0xfd, 0x8f, 0x0a, 0x00, 0x3e, 0x92, 0x0a, 0x00, 0x3f, 0x92, - 0x0a, 0x00, 0x34, 0x93, 0x0a, 0x00, 0x3e, 0x93, 0x0a, 0x00, 0x3f, 0x93, - 0x0a, 0x00, 0xf3, 0x93, 0x0a, 0x00, 0xfb, 0x93, 0x0a, 0x00, 0xff, 0x95, - 0x0a, 0x00, 0xf3, 0x99, 0x0a, 0x00, 0xfb, 0x99, 0x0a, 0x00, 0x3e, 0x9c, - 0x0a, 0x00, 0x3f, 0x9c, 0x0a, 0x00, 0xf3, 0x9d, 0x0a, 0x00, 0xfb, 0x9d, - 0x0a, 0x00, 0xe3, 0x9f, 0x0a, 0x00, 0xf3, 0x9f, 0x0a, 0x00, 0xfb, 0x9f, - 0x0a, 0x00, 0x3f, 0xa4, 0x0a, 0x00, 0xf8, 0xa4, 0x0a, 0x00, 0xfc, 0xa4, - 0x0a, 0x00, 0xfe, 0xa4, 0x0a, 0x00, 0xff, 0xa4, 0x0a, 0x00, 0xcf, 0xa5, - 0x0a, 0x00, 0xff, 0xa5, 0x0a, 0x00, 0x33, 0xa7, 0x0a, 0x00, 0x3b, 0xa7, - 0x0a, 0x00, 0x83, 0xa7, 0x0a, 0x00, 0x8e, 0xa7, 0x0a, 0x00, 0x8f, 0xa7, - 0x0a, 0x00, 0xee, 0xa7, 0x0a, 0x00, 0xef, 0xa7, 0x0a, 0x00, 0xf8, 0xa7, - 0x0a, 0x00, 0xfc, 0xa7, 0x0a, 0x00, 0xfe, 0xa7, 0x0a, 0x00, 0xff, 0xa7, - 0x0a, 0x00, 0xb8, 0xaa, 0x0a, 0x00, 0xbc, 0xaa, 0x0a, 0x00, 0xbe, 0xaa, - 0x0a, 0x00, 0xbf, 0xaa, 0x0a, 0x00, 0x84, 0xab, 0x0a, 0x00, 0x37, 0xb2, - 0x0a, 0x00, 0x83, 0xb3, 0x0a, 0x00, 0x8e, 0xb3, 0x0a, 0x00, 0x8f, 0xb3, - 0x0a, 0x00, 0xff, 0xb5, 0x0a, 0x00, 0x83, 0xb7, 0x0a, 0x00, 0x87, 0xb7, - 0x0a, 0x00, 0x8e, 0xb7, 0x0a, 0x00, 0x8f, 0xb7, 0x0a, 0x00, 0xe3, 0xb7, - 0x0a, 0x00, 0xe7, 0xb7, 0x0a, 0x00, 0xeb, 0xb7, 0x0a, 0x00, 0xed, 0xb7, - 0x0a, 0x00, 0xf1, 0xb7, 0x0a, 0x00, 0xf3, 0xb7, 0x0a, 0x00, 0xf7, 0xb7, - 0x0a, 0x00, 0xf9, 0xb7, 0x0a, 0x00, 0xfb, 0xb7, 0x0a, 0x00, 0xfd, 0xb7, - 0x0a, 0x00, 0x37, 0xb8, 0x0a, 0x00, 0xf8, 0xb8, 0x0a, 0x00, 0xfc, 0xb8, - 0x0a, 0x00, 0xfe, 0xb8, 0x0a, 0x00, 0xff, 0xb8, 0x0a, 0x00, 0x3f, 0xb9, - 0x0a, 0x00, 0xbf, 0xb9, 0x0a, 0x00, 0x37, 0xba, 0x0a, 0x00, 0x8b, 0xbb, - 0x0a, 0x00, 0x8d, 0xbb, 0x0a, 0x00, 0x37, 0xbc, 0x0a, 0x00, 0xe7, 0xbc, - 0x0a, 0x00, 0xeb, 0xbc, 0x0a, 0x00, 0xf0, 0xbc, 0x0a, 0x00, 0xf1, 0xbc, - 0x0a, 0x00, 0xf7, 0xbc, 0x0a, 0x00, 0xf9, 0xbc, 0x0a, 0x00, 0xfd, 0xbc, - 0x0a, 0x00, 0x33, 0xbd, 0x0a, 0x00, 0x37, 0xbd, 0x0a, 0x00, 0x3b, 0xbd, - 0x0a, 0x00, 0x50, 0xbd, 0x0a, 0x00, 0x51, 0xbd, 0x0a, 0x00, 0x56, 0xbd, - 0x0a, 0x00, 0x57, 0xbd, 0x0a, 0x00, 0x5f, 0xbd, 0x0a, 0x00, 0xb3, 0xbd, - 0x0a, 0x00, 0xbb, 0xbd, 0x0a, 0x00, 0xe7, 0xbe, 0x0a, 0x00, 0xeb, 0xbe, - 0x0a, 0x00, 0xf7, 0xbe, 0x0a, 0x00, 0x8b, 0xbf, 0x0a, 0x00, 0x36, 0xc2, - 0x0a, 0x00, 0x37, 0xc2, 0x0a, 0x00, 0x38, 0xc2, 0x0a, 0x00, 0x3c, 0xc2, - 0x0a, 0x00, 0x3e, 0xc2, 0x0a, 0x00, 0x3f, 0xc2, 0x0a, 0x00, 0x88, 0xc3, - 0x0a, 0x00, 0x8b, 0xc3, 0x0a, 0x00, 0x30, 0xc5, 0x0a, 0x00, 0x31, 0xc5, - 0x0a, 0x00, 0x39, 0xc5, 0x0a, 0x00, 0x3d, 0xc5, 0x0a, 0x00, 0x37, 0xc9, - 0x0a, 0x00, 0x38, 0xc9, 0x0a, 0x00, 0x3c, 0xc9, 0x0a, 0x00, 0x3e, 0xc9, - 0x0a, 0x00, 0x3f, 0xc9, 0x0a, 0x00, 0x58, 0xc9, 0x0a, 0x00, 0x5c, 0xc9, - 0x0a, 0x00, 0x5e, 0xc9, 0x0a, 0x00, 0x5f, 0xc9, 0x0a, 0x00, 0xe9, 0xcc, - 0x0a, 0x00, 0xea, 0xcc, 0x0a, 0x00, 0xf0, 0xcc, 0x0a, 0x00, 0xf1, 0xcc, - 0x0a, 0x00, 0xf9, 0xcc, 0x0a, 0x00, 0xfd, 0xcc, 0x0a, 0x00, 0x30, 0xcd, - 0x0a, 0x00, 0x37, 0xcd, 0x0a, 0x00, 0x3d, 0xcd, 0x0a, 0x00, 0x3e, 0xcd, - 0x0a, 0x00, 0x3f, 0xcd, 0x0a, 0x00, 0x50, 0xcd, 0x0a, 0x00, 0x58, 0xcd, - 0x0a, 0x00, 0x5c, 0xcd, 0x0a, 0x00, 0x5e, 0xcd, 0x0a, 0x00, 0x5f, 0xcd, - 0x0a, 0x00, 0x37, 0xce, 0x0a, 0x00, 0x38, 0xce, 0x0a, 0x00, 0x3c, 0xce, - 0x0a, 0x00, 0x3e, 0xce, 0x0a, 0x00, 0x3f, 0xce, 0x0a, 0x00, 0xf0, 0xce, - 0x0a, 0x00, 0xf1, 0xce, 0x0a, 0x00, 0xf9, 0xce, 0x0a, 0x00, 0xfd, 0xce, - 0x0a, 0x00, 0x36, 0xcf, 0x0a, 0x00, 0x37, 0xcf, 0x0a, 0x00, 0x38, 0xcf, - 0x0a, 0x00, 0x3c, 0xcf, 0x0a, 0x00, 0x3e, 0xcf, 0x0a, 0x00, 0x3f, 0xcf, - 0x0a, 0x00, 0xb8, 0xcf, 0x0a, 0x00, 0xbc, 0xcf, 0x0a, 0x00, 0xbe, 0xcf, - 0x0a, 0x00, 0xbf, 0xcf, 0x0a, 0x00, 0x38, 0xd3, 0x0a, 0x00, 0x3c, 0xd3, - 0x0a, 0x00, 0x3e, 0xd3, 0x0a, 0x00, 0x3f, 0xd3, 0x0a, 0x00, 0xcb, 0xd5, - 0x0a, 0x00, 0xf8, 0xd5, 0x0a, 0x00, 0xfc, 0xd5, 0x0a, 0x00, 0xfe, 0xd5, - 0x0a, 0x00, 0xff, 0xd5, 0x0a, 0x00, 0xc8, 0xdd, 0x0a, 0x00, 0xcb, 0xdd, - 0x0a, 0x00, 0xf8, 0xdd, 0x0a, 0x00, 0xfc, 0xdd, 0x0a, 0x00, 0xfe, 0xdd, - 0x0a, 0x00, 0xff, 0xdd, 0x0a, 0x00, 0xe8, 0xdf, 0x0a, 0x00, 0xeb, 0xdf, - 0x0a, 0x00, 0xf8, 0xdf, 0x0a, 0x00, 0xfc, 0xdf, 0x0a, 0x00, 0xfe, 0xdf, - 0x0a, 0x00, 0xff, 0xdf, 0x0a, 0x00, 0x88, 0xe3, 0x0a, 0x00, 0x8b, 0xe3, - 0x0a, 0x00, 0x31, 0xe5, 0x0a, 0x00, 0x38, 0xe5, 0x0a, 0x00, 0xb8, 0xe5, - 0x0a, 0x00, 0x30, 0xe9, 0x0a, 0x00, 0x31, 0xe9, 0x0a, 0x00, 0x39, 0xe9, - 0x0a, 0x00, 0x3d, 0xe9, 0x0a, 0x00, 0x58, 0xe9, 0x0a, 0x00, 0x5c, 0xe9, - 0x0a, 0x00, 0x5e, 0xe9, 0x0a, 0x00, 0x5f, 0xe9, 0x0a, 0x00, 0xe9, 0xec, - 0x0a, 0x00, 0xea, 0xec, 0x0a, 0x00, 0xf0, 0xec, 0x0a, 0x00, 0xf1, 0xec, - 0x0a, 0x00, 0xf9, 0xec, 0x0a, 0x00, 0xfd, 0xec, 0x0a, 0x00, 0x31, 0xed, - 0x0a, 0x00, 0x38, 0xed, 0x0a, 0x00, 0x50, 0xed, 0x0a, 0x00, 0x58, 0xed, - 0x0a, 0x00, 0x5c, 0xed, 0x0a, 0x00, 0x5e, 0xed, 0x0a, 0x00, 0x5f, 0xed, - 0x0a, 0x00, 0x30, 0xee, 0x0a, 0x00, 0x31, 0xee, 0x0a, 0x00, 0x39, 0xee, - 0x0a, 0x00, 0x3d, 0xee, 0x0a, 0x00, 0xe6, 0xee, 0x0a, 0x00, 0xe7, 0xee, - 0x0a, 0x00, 0xe8, 0xee, 0x0a, 0x00, 0xeb, 0xee, 0x0a, 0x00, 0xf6, 0xee, - 0x0a, 0x00, 0xf7, 0xee, 0x0a, 0x00, 0xf8, 0xee, 0x0a, 0x00, 0xfc, 0xee, - 0x0a, 0x00, 0xfe, 0xee, 0x0a, 0x00, 0xff, 0xee, 0x0a, 0x00, 0x36, 0xef, - 0x0a, 0x00, 0x37, 0xef, 0x0a, 0x00, 0x38, 0xef, 0x0a, 0x00, 0x3c, 0xef, - 0x0a, 0x00, 0x3e, 0xef, 0x0a, 0x00, 0x3f, 0xef, 0x0a, 0x00, 0xb8, 0xef, - 0x0a, 0x00, 0xbc, 0xef, 0x0a, 0x00, 0xbe, 0xef, 0x0a, 0x00, 0xbf, 0xef, - 0x0a, 0x00, 0x31, 0xf3, 0x0a, 0x00, 0x38, 0xf3, 0x0a, 0x00, 0xb8, 0xf3, - 0x0a, 0x00, 0xe6, 0xf3, 0x0a, 0x00, 0xe7, 0xf3, 0x0a, 0x00, 0xf6, 0xf3, - 0x0a, 0x00, 0xf7, 0xf3, 0x0a, 0x00, 0xf8, 0xf3, 0x0a, 0x00, 0xfc, 0xf3, - 0x0a, 0x00, 0xfe, 0xf3, 0x0a, 0x00, 0xff, 0xf3, 0x0a, 0x00, 0xf0, 0xf5, - 0x0a, 0x00, 0xf1, 0xf5, 0x0a, 0x00, 0xf9, 0xf5, 0x0a, 0x00, 0xfd, 0xf5, - 0x0a, 0x00, 0xf7, 0xf9, 0x0a, 0x00, 0xf8, 0xf9, 0x0a, 0x00, 0xfc, 0xf9, - 0x0a, 0x00, 0xfe, 0xf9, 0x0a, 0x00, 0xff, 0xf9, 0x0a, 0x00, 0xb8, 0xfd, - 0x0a, 0x00, 0xf7, 0xfd, 0x0a, 0x00, 0xf8, 0xfd, 0x0a, 0x00, 0xfc, 0xfd, - 0x0a, 0x00, 0xfe, 0xfd, 0x0a, 0x00, 0xff, 0xfd, 0x0a, 0x00, 0x88, 0xff, - 0x0a, 0x00, 0x8b, 0xff, 0x0a, 0x00, 0xc6, 0xff, 0x0a, 0x00, 0xc7, 0xff, - 0x0a, 0x00, 0xc8, 0xff, 0x0a, 0x00, 0xcb, 0xff, 0x0a, 0x00, 0xe6, 0xff, - 0x0a, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xeb, 0xff, - 0x0a, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf8, 0xff, - 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, - 0x0a, 0x00, 0x3e, 0x00, 0x0b, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x44, 0x00, - 0x0b, 0x00, 0x45, 0x00, 0x0b, 0x00, 0x4e, 0x00, 0x0b, 0x00, 0x4f, 0x00, - 0x0b, 0x00, 0x73, 0x00, 0x0b, 0x00, 0x7b, 0x00, 0x0b, 0x00, 0xbe, 0x00, - 0x0b, 0x00, 0xbf, 0x00, 0x0b, 0x00, 0x38, 0x01, 0x0b, 0x00, 0x44, 0x01, - 0x0b, 0x00, 0x45, 0x01, 0x0b, 0x00, 0x4e, 0x01, 0x0b, 0x00, 0x4f, 0x01, - 0x0b, 0x00, 0x73, 0x01, 0x0b, 0x00, 0x7b, 0x01, 0x0b, 0x00, 0x3e, 0x03, - 0x0b, 0x00, 0x3f, 0x03, 0x0b, 0x00, 0xc8, 0x03, 0x0b, 0x00, 0xf3, 0x03, - 0x0b, 0x00, 0xfb, 0x03, 0x0b, 0x00, 0x38, 0x04, 0x0b, 0x00, 0x73, 0x04, - 0x0b, 0x00, 0x7b, 0x04, 0x0b, 0x00, 0xf4, 0x05, 0x0b, 0x00, 0xf5, 0x05, - 0x0b, 0x00, 0xf8, 0x05, 0x0b, 0x00, 0xfc, 0x05, 0x0b, 0x00, 0xfe, 0x05, - 0x0b, 0x00, 0xff, 0x05, 0x0b, 0x00, 0x74, 0x06, 0x0b, 0x00, 0x75, 0x06, - 0x0b, 0x00, 0x78, 0x06, 0x0b, 0x00, 0x7c, 0x06, 0x0b, 0x00, 0x7e, 0x06, - 0x0b, 0x00, 0x7f, 0x06, 0x0b, 0x00, 0xf8, 0x06, 0x0b, 0x00, 0xfc, 0x06, - 0x0b, 0x00, 0xfe, 0x06, 0x0b, 0x00, 0xff, 0x06, 0x0b, 0x00, 0x78, 0x07, - 0x0b, 0x00, 0x7c, 0x07, 0x0b, 0x00, 0x7e, 0x07, 0x0b, 0x00, 0x7f, 0x07, - 0x0b, 0x00, 0xbe, 0x07, 0x0b, 0x00, 0xbf, 0x07, 0x0b, 0x00, 0xf3, 0x07, - 0x0b, 0x00, 0xfb, 0x07, 0x0b, 0x00, 0x78, 0x08, 0x0b, 0x00, 0x7c, 0x08, - 0x0b, 0x00, 0x7e, 0x08, 0x0b, 0x00, 0x7f, 0x08, 0x0b, 0x00, 0xbe, 0x08, - 0x0b, 0x00, 0xbf, 0x08, 0x0b, 0x00, 0xd5, 0x08, 0x0b, 0x00, 0xd8, 0x08, - 0x0b, 0x00, 0xdc, 0x08, 0x0b, 0x00, 0xde, 0x08, 0x0b, 0x00, 0xdf, 0x08, - 0x0b, 0x00, 0xe4, 0x08, 0x0b, 0x00, 0xee, 0x08, 0x0b, 0x00, 0xef, 0x08, - 0x0b, 0x00, 0xf4, 0x08, 0x0b, 0x00, 0xf5, 0x08, 0x0b, 0x00, 0xf8, 0x08, - 0x0b, 0x00, 0xfc, 0x08, 0x0b, 0x00, 0xfe, 0x08, 0x0b, 0x00, 0xff, 0x08, - 0x0b, 0x00, 0xf3, 0x09, 0x0b, 0x00, 0xfb, 0x09, 0x0b, 0x00, 0x74, 0x0a, - 0x0b, 0x00, 0x75, 0x0a, 0x0b, 0x00, 0x78, 0x0a, 0x0b, 0x00, 0x7c, 0x0a, - 0x0b, 0x00, 0x7e, 0x0a, 0x0b, 0x00, 0x7f, 0x0a, 0x0b, 0x00, 0x3e, 0x0b, - 0x0b, 0x00, 0x3f, 0x0b, 0x0b, 0x00, 0xbe, 0x0b, 0x0b, 0x00, 0xbf, 0x0b, - 0x0b, 0x00, 0xe8, 0x0b, 0x0b, 0x00, 0xf3, 0x0b, 0x0b, 0x00, 0xfb, 0x0b, - 0x0b, 0x00, 0x38, 0x0c, 0x0b, 0x00, 0xf3, 0x0d, 0x0b, 0x00, 0xfb, 0x0d, - 0x0b, 0x00, 0x38, 0x0e, 0x0b, 0x00, 0x3e, 0x0f, 0x0b, 0x00, 0x3f, 0x0f, - 0x0b, 0x00, 0x3e, 0x10, 0x0b, 0x00, 0x3f, 0x10, 0x0b, 0x00, 0x45, 0x10, - 0x0b, 0x00, 0x4f, 0x10, 0x0b, 0x00, 0x7e, 0x10, 0x0b, 0x00, 0x7f, 0x10, - 0x0b, 0x00, 0xbe, 0x10, 0x0b, 0x00, 0xbf, 0x10, 0x0b, 0x00, 0x38, 0x11, - 0x0b, 0x00, 0x4e, 0x11, 0x0b, 0x00, 0x4f, 0x11, 0x0b, 0x00, 0x74, 0x11, - 0x0b, 0x00, 0x75, 0x11, 0x0b, 0x00, 0x78, 0x11, 0x0b, 0x00, 0x7c, 0x11, - 0x0b, 0x00, 0x7e, 0x11, 0x0b, 0x00, 0x7f, 0x11, 0x0b, 0x00, 0x38, 0x12, - 0x0b, 0x00, 0xbe, 0x14, 0x0b, 0x00, 0xbf, 0x14, 0x0b, 0x00, 0xd5, 0x14, - 0x0b, 0x00, 0xee, 0x14, 0x0b, 0x00, 0xef, 0x14, 0x0b, 0x00, 0xf3, 0x14, - 0x0b, 0x00, 0xfb, 0x14, 0x0b, 0x00, 0x34, 0x15, 0x0b, 0x00, 0x3e, 0x15, - 0x0b, 0x00, 0x3f, 0x15, 0x0b, 0x00, 0x5e, 0x15, 0x0b, 0x00, 0x5f, 0x15, - 0x0b, 0x00, 0x04, 0x16, 0x0b, 0x00, 0x15, 0x16, 0x0b, 0x00, 0x38, 0x16, - 0x0b, 0x00, 0xb4, 0x16, 0x0b, 0x00, 0xbe, 0x16, 0x0b, 0x00, 0xbf, 0x16, - 0x0b, 0x00, 0x3e, 0x17, 0x0b, 0x00, 0x3f, 0x17, 0x0b, 0x00, 0x88, 0x17, - 0x0b, 0x00, 0x98, 0x17, 0x0b, 0x00, 0x9c, 0x17, 0x0b, 0x00, 0x9e, 0x17, - 0x0b, 0x00, 0x9f, 0x17, 0x0b, 0x00, 0xa3, 0x17, 0x0b, 0x00, 0xa8, 0x17, - 0x0b, 0x00, 0xab, 0x17, 0x0b, 0x00, 0xac, 0x17, 0x0b, 0x00, 0xae, 0x17, - 0x0b, 0x00, 0xaf, 0x17, 0x0b, 0x00, 0xd8, 0x17, 0x0b, 0x00, 0xdc, 0x17, - 0x0b, 0x00, 0xde, 0x17, 0x0b, 0x00, 0xdf, 0x17, 0x0b, 0x00, 0x38, 0x18, - 0x0b, 0x00, 0x38, 0x19, 0x0b, 0x00, 0x78, 0x1a, 0x0b, 0x00, 0x3e, 0x1b, - 0x0b, 0x00, 0x3f, 0x1b, 0x0b, 0x00, 0xbe, 0x1b, 0x0b, 0x00, 0xbf, 0x1b, - 0x0b, 0x00, 0xc8, 0x1b, 0x0b, 0x00, 0xfe, 0x1b, 0x0b, 0x00, 0xff, 0x1b, - 0x0b, 0x00, 0xc8, 0x1c, 0x0b, 0x00, 0xcb, 0x1c, 0x0b, 0x00, 0xf8, 0x1c, - 0x0b, 0x00, 0xfc, 0x1c, 0x0b, 0x00, 0xfe, 0x1c, 0x0b, 0x00, 0xff, 0x1c, - 0x0b, 0x00, 0x38, 0x1d, 0x0b, 0x00, 0xf4, 0x1f, 0x0b, 0x00, 0xf5, 0x1f, - 0x0b, 0x00, 0xf8, 0x1f, 0x0b, 0x00, 0xfc, 0x1f, 0x0b, 0x00, 0xfe, 0x1f, - 0x0b, 0x00, 0xff, 0x1f, 0x0b, 0x00, 0xbe, 0x20, 0x0b, 0x00, 0xbf, 0x20, - 0x0b, 0x00, 0xb8, 0x24, 0x0b, 0x00, 0xb8, 0x26, 0x0b, 0x00, 0x38, 0x27, - 0x0b, 0x00, 0xbe, 0x28, 0x0b, 0x00, 0xbf, 0x28, 0x0b, 0x00, 0xbe, 0x2a, - 0x0b, 0x00, 0xbf, 0x2a, 0x0b, 0x00, 0xb0, 0x30, 0x0b, 0x00, 0xb6, 0x30, - 0x0b, 0x00, 0xb7, 0x30, 0x0b, 0x00, 0xbd, 0x30, 0x0b, 0x00, 0xbe, 0x30, - 0x0b, 0x00, 0xbf, 0x30, 0x0b, 0x00, 0xbe, 0x32, 0x0b, 0x00, 0xbf, 0x32, - 0x0b, 0x00, 0x88, 0x33, 0x0b, 0x00, 0x8b, 0x33, 0x0b, 0x00, 0x91, 0x33, - 0x0b, 0x00, 0x96, 0x33, 0x0b, 0x00, 0x97, 0x33, 0x0b, 0x00, 0x99, 0x33, - 0x0b, 0x00, 0x9d, 0x33, 0x0b, 0x00, 0xb0, 0x34, 0x0b, 0x00, 0xb6, 0x34, - 0x0b, 0x00, 0xb7, 0x34, 0x0b, 0x00, 0xbd, 0x34, 0x0b, 0x00, 0xbe, 0x34, - 0x0b, 0x00, 0xbf, 0x34, 0x0b, 0x00, 0x1f, 0x35, 0x0b, 0x00, 0x68, 0x35, - 0x0b, 0x00, 0x6b, 0x35, 0x0b, 0x00, 0xf7, 0x35, 0x0b, 0x00, 0xf8, 0x35, - 0x0b, 0x00, 0xfc, 0x35, 0x0b, 0x00, 0xfe, 0x35, 0x0b, 0x00, 0xff, 0x35, - 0x0b, 0x00, 0xb0, 0x36, 0x0b, 0x00, 0xb7, 0x36, 0x0b, 0x00, 0xbd, 0x36, - 0x0b, 0x00, 0xbe, 0x36, 0x0b, 0x00, 0xbf, 0x36, 0x0b, 0x00, 0x86, 0x37, - 0x0b, 0x00, 0x87, 0x37, 0x0b, 0x00, 0x88, 0x37, 0x0b, 0x00, 0x89, 0x37, - 0x0b, 0x00, 0x8b, 0x37, 0x0b, 0x00, 0xb1, 0x38, 0x0b, 0x00, 0xb8, 0x38, - 0x0b, 0x00, 0x30, 0x39, 0x0b, 0x00, 0x37, 0x39, 0x0b, 0x00, 0x3d, 0x39, - 0x0b, 0x00, 0x3e, 0x39, 0x0b, 0x00, 0x3f, 0x39, 0x0b, 0x00, 0xb1, 0x3a, - 0x0b, 0x00, 0xb8, 0x3a, 0x0b, 0x00, 0xbe, 0x3c, 0x0b, 0x00, 0xbf, 0x3c, - 0x0b, 0x00, 0x30, 0x3d, 0x0b, 0x00, 0x37, 0x3d, 0x0b, 0x00, 0x3d, 0x3d, - 0x0b, 0x00, 0x3e, 0x3d, 0x0b, 0x00, 0x3f, 0x3d, 0x0b, 0x00, 0xbe, 0x3e, - 0x0b, 0x00, 0xbf, 0x3e, 0x0b, 0x00, 0x26, 0x3f, 0x0b, 0x00, 0x27, 0x3f, - 0x0b, 0x00, 0x29, 0x3f, 0x0b, 0x00, 0x2a, 0x3f, 0x0b, 0x00, 0x88, 0x3f, - 0x0b, 0x00, 0x8b, 0x3f, 0x0b, 0x00, 0xc8, 0x3f, 0x0b, 0x00, 0xc9, 0x3f, - 0x0b, 0x00, 0xcb, 0x3f, 0x0b, 0x00, 0xe8, 0x3f, 0x0b, 0x00, 0xe9, 0x3f, - 0x0b, 0x00, 0xeb, 0x3f, 0x0b, 0x00, 0xf0, 0x3f, 0x0b, 0x00, 0xf1, 0x3f, - 0x0b, 0x00, 0xf9, 0x3f, 0x0b, 0x00, 0xfd, 0x3f, 0x0b, 0x00, 0x31, 0x40, - 0x0b, 0x00, 0x38, 0x40, 0x0b, 0x00, 0x4b, 0x40, 0x0b, 0x00, 0x77, 0x40, - 0x0b, 0x00, 0x78, 0x40, 0x0b, 0x00, 0x7c, 0x40, 0x0b, 0x00, 0x7e, 0x40, - 0x0b, 0x00, 0x7f, 0x40, 0x0b, 0x00, 0xb0, 0x40, 0x0b, 0x00, 0xb7, 0x40, - 0x0b, 0x00, 0xbd, 0x40, 0x0b, 0x00, 0xbe, 0x40, 0x0b, 0x00, 0xbf, 0x40, - 0x0b, 0x00, 0x31, 0x41, 0x0b, 0x00, 0x38, 0x41, 0x0b, 0x00, 0x4b, 0x41, - 0x0b, 0x00, 0x77, 0x41, 0x0b, 0x00, 0x78, 0x41, 0x0b, 0x00, 0x7c, 0x41, - 0x0b, 0x00, 0x7e, 0x41, 0x0b, 0x00, 0x7f, 0x41, 0x0b, 0x00, 0x78, 0x42, - 0x0b, 0x00, 0x7c, 0x42, 0x0b, 0x00, 0x7e, 0x42, 0x0b, 0x00, 0x7f, 0x42, - 0x0b, 0x00, 0x30, 0x43, 0x0b, 0x00, 0x37, 0x43, 0x0b, 0x00, 0x3d, 0x43, - 0x0b, 0x00, 0x3e, 0x43, 0x0b, 0x00, 0x3f, 0x43, 0x0b, 0x00, 0xbe, 0x43, - 0x0b, 0x00, 0xbf, 0x43, 0x0b, 0x00, 0xcb, 0x43, 0x0b, 0x00, 0xf0, 0x43, - 0x0b, 0x00, 0xf1, 0x43, 0x0b, 0x00, 0xf9, 0x43, 0x0b, 0x00, 0xfd, 0x43, - 0x0b, 0x00, 0x70, 0x44, 0x0b, 0x00, 0x71, 0x44, 0x0b, 0x00, 0x79, 0x44, - 0x0b, 0x00, 0x7d, 0x44, 0x0b, 0x00, 0xf7, 0x45, 0x0b, 0x00, 0xf8, 0x45, - 0x0b, 0x00, 0xfc, 0x45, 0x0b, 0x00, 0xfe, 0x45, 0x0b, 0x00, 0xff, 0x45, - 0x0b, 0x00, 0x70, 0x46, 0x0b, 0x00, 0x71, 0x46, 0x0b, 0x00, 0x79, 0x46, - 0x0b, 0x00, 0x7d, 0x46, 0x0b, 0x00, 0xb1, 0x47, 0x0b, 0x00, 0xb8, 0x47, - 0x0b, 0x00, 0xf0, 0x47, 0x0b, 0x00, 0xf1, 0x47, 0x0b, 0x00, 0xf9, 0x47, - 0x0b, 0x00, 0xfd, 0x47, 0x0b, 0x00, 0x4b, 0x48, 0x0b, 0x00, 0x7f, 0x48, - 0x0b, 0x00, 0xb1, 0x48, 0x0b, 0x00, 0xb7, 0x48, 0x0b, 0x00, 0xb8, 0x48, - 0x0b, 0x00, 0xd1, 0x48, 0x0b, 0x00, 0xd6, 0x48, 0x0b, 0x00, 0xd7, 0x48, - 0x0b, 0x00, 0xf0, 0x48, 0x0b, 0x00, 0xfd, 0x48, 0x0b, 0x00, 0xfe, 0x48, - 0x0b, 0x00, 0xff, 0x48, 0x0b, 0x00, 0xf7, 0x49, 0x0b, 0x00, 0x71, 0x4a, - 0x0b, 0x00, 0x77, 0x4a, 0x0b, 0x00, 0x78, 0x4a, 0x0b, 0x00, 0x31, 0x4b, - 0x0b, 0x00, 0x37, 0x4b, 0x0b, 0x00, 0x38, 0x4b, 0x0b, 0x00, 0xb0, 0x4b, - 0x0b, 0x00, 0xbd, 0x4b, 0x0b, 0x00, 0xbe, 0x4b, 0x0b, 0x00, 0xbf, 0x4b, - 0x0b, 0x00, 0xd0, 0x4b, 0x0b, 0x00, 0xdf, 0x4b, 0x0b, 0x00, 0xe7, 0x4b, - 0x0b, 0x00, 0xeb, 0x4b, 0x0b, 0x00, 0xf1, 0x4b, 0x0b, 0x00, 0xf7, 0x4b, - 0x0b, 0x00, 0xf8, 0x4b, 0x0b, 0x00, 0x37, 0x4c, 0x0b, 0x00, 0x7f, 0x4c, - 0x0b, 0x00, 0xf7, 0x4d, 0x0b, 0x00, 0x37, 0x4e, 0x0b, 0x00, 0x78, 0x4e, - 0x0b, 0x00, 0x7c, 0x4e, 0x0b, 0x00, 0x7e, 0x4e, 0x0b, 0x00, 0x7f, 0x4e, - 0x0b, 0x00, 0x1f, 0x4f, 0x0b, 0x00, 0x31, 0x4f, 0x0b, 0x00, 0x37, 0x4f, - 0x0b, 0x00, 0x38, 0x4f, 0x0b, 0x00, 0x78, 0x4f, 0x0b, 0x00, 0x7c, 0x4f, - 0x0b, 0x00, 0x7e, 0x4f, 0x0b, 0x00, 0x7f, 0x4f, 0x0b, 0x00, 0x90, 0x4f, - 0x0b, 0x00, 0x9f, 0x4f, 0x0b, 0x00, 0xb8, 0x4f, 0x0b, 0x00, 0xd0, 0x4f, - 0x0b, 0x00, 0xdf, 0x4f, 0x0b, 0x00, 0xcb, 0x50, 0x0b, 0x00, 0xf0, 0x50, - 0x0b, 0x00, 0xf1, 0x50, 0x0b, 0x00, 0xf9, 0x50, 0x0b, 0x00, 0xfd, 0x50, - 0x0b, 0x00, 0xb1, 0x51, 0x0b, 0x00, 0xb8, 0x51, 0x0b, 0x00, 0xf0, 0x51, - 0x0b, 0x00, 0xf1, 0x51, 0x0b, 0x00, 0xf9, 0x51, 0x0b, 0x00, 0xfd, 0x51, - 0x0b, 0x00, 0xb8, 0x52, 0x0b, 0x00, 0x37, 0x54, 0x0b, 0x00, 0x37, 0x55, - 0x0b, 0x00, 0x51, 0x55, 0x0b, 0x00, 0x56, 0x55, 0x0b, 0x00, 0x57, 0x55, - 0x0b, 0x00, 0x5f, 0x55, 0x0b, 0x00, 0xeb, 0x56, 0x0b, 0x00, 0xff, 0x56, - 0x0b, 0x00, 0xb0, 0x57, 0x0b, 0x00, 0xbd, 0x57, 0x0b, 0x00, 0xbe, 0x57, - 0x0b, 0x00, 0xbf, 0x57, 0x0b, 0x00, 0xcb, 0x57, 0x0b, 0x00, 0xeb, 0x57, - 0x0b, 0x00, 0xf8, 0x57, 0x0b, 0x00, 0xfc, 0x57, 0x0b, 0x00, 0xfe, 0x57, - 0x0b, 0x00, 0xff, 0x57, 0x0b, 0x00, 0x4b, 0x58, 0x0b, 0x00, 0xb0, 0x58, - 0x0b, 0x00, 0xb7, 0x58, 0x0b, 0x00, 0xbd, 0x58, 0x0b, 0x00, 0xbe, 0x58, - 0x0b, 0x00, 0xbf, 0x58, 0x0b, 0x00, 0x31, 0x59, 0x0b, 0x00, 0x38, 0x59, - 0x0b, 0x00, 0xb0, 0x5a, 0x0b, 0x00, 0xb7, 0x5a, 0x0b, 0x00, 0xbd, 0x5a, - 0x0b, 0x00, 0xbe, 0x5a, 0x0b, 0x00, 0xbf, 0x5a, 0x0b, 0x00, 0xb8, 0x5c, - 0x0b, 0x00, 0x31, 0x5d, 0x0b, 0x00, 0x38, 0x5d, 0x0b, 0x00, 0xb8, 0x5e, - 0x0b, 0x00, 0xf7, 0x5f, 0x0b, 0x00, 0xf8, 0x5f, 0x0b, 0x00, 0xfc, 0x5f, - 0x0b, 0x00, 0xfe, 0x5f, 0x0b, 0x00, 0xff, 0x5f, 0x0b, 0x00, 0x34, 0x60, - 0x0b, 0x00, 0x3e, 0x60, 0x0b, 0x00, 0x3f, 0x60, 0x0b, 0x00, 0x4e, 0x60, - 0x0b, 0x00, 0x4f, 0x60, 0x0b, 0x00, 0x74, 0x60, 0x0b, 0x00, 0x7e, 0x60, - 0x0b, 0x00, 0x7f, 0x60, 0x0b, 0x00, 0xb8, 0x60, 0x0b, 0x00, 0x38, 0x61, - 0x0b, 0x00, 0x73, 0x61, 0x0b, 0x00, 0x7b, 0x61, 0x0b, 0x00, 0x38, 0x63, - 0x0b, 0x00, 0xce, 0x63, 0x0b, 0x00, 0xcf, 0x63, 0x0b, 0x00, 0xf8, 0x63, - 0x0b, 0x00, 0x3f, 0x64, 0x0b, 0x00, 0x74, 0x64, 0x0b, 0x00, 0xf3, 0x65, - 0x0b, 0x00, 0xfb, 0x65, 0x0b, 0x00, 0xff, 0x65, 0x0b, 0x00, 0x73, 0x66, - 0x0b, 0x00, 0x7b, 0x66, 0x0b, 0x00, 0xff, 0x66, 0x0b, 0x00, 0x0b, 0x67, - 0x0b, 0x00, 0x23, 0x67, 0x0b, 0x00, 0x2e, 0x67, 0x0b, 0x00, 0x2f, 0x67, - 0x0b, 0x00, 0xbe, 0x67, 0x0b, 0x00, 0xbf, 0x67, 0x0b, 0x00, 0xf8, 0x67, - 0x0b, 0x00, 0xfc, 0x67, 0x0b, 0x00, 0xfe, 0x67, 0x0b, 0x00, 0xff, 0x67, - 0x0b, 0x00, 0x4e, 0x68, 0x0b, 0x00, 0x4f, 0x68, 0x0b, 0x00, 0x74, 0x68, - 0x0b, 0x00, 0x7e, 0x68, 0x0b, 0x00, 0x7f, 0x68, 0x0b, 0x00, 0xb8, 0x68, - 0x0b, 0x00, 0xc4, 0x68, 0x0b, 0x00, 0xf4, 0x68, 0x0b, 0x00, 0xfe, 0x68, - 0x0b, 0x00, 0xff, 0x68, 0x0b, 0x00, 0xf3, 0x69, 0x0b, 0x00, 0xfb, 0x69, - 0x0b, 0x00, 0x74, 0x6a, 0x0b, 0x00, 0x7e, 0x6a, 0x0b, 0x00, 0x7f, 0x6a, - 0x0b, 0x00, 0x38, 0x6b, 0x0b, 0x00, 0xb8, 0x6b, 0x0b, 0x00, 0xce, 0x6b, - 0x0b, 0x00, 0xcf, 0x6b, 0x0b, 0x00, 0xf8, 0x6b, 0x0b, 0x00, 0x34, 0x6c, - 0x0b, 0x00, 0x3e, 0x6c, 0x0b, 0x00, 0x3f, 0x6c, 0x0b, 0x00, 0xf8, 0x6d, - 0x0b, 0x00, 0x34, 0x6e, 0x0b, 0x00, 0x3e, 0x6e, 0x0b, 0x00, 0x3f, 0x6e, - 0x0b, 0x00, 0x38, 0x6f, 0x0b, 0x00, 0x34, 0x70, 0x0b, 0x00, 0x43, 0x70, - 0x0b, 0x00, 0x74, 0x70, 0x0b, 0x00, 0xbe, 0x70, 0x0b, 0x00, 0xbf, 0x70, - 0x0b, 0x00, 0x13, 0x71, 0x0b, 0x00, 0x1f, 0x71, 0x0b, 0x00, 0x33, 0x71, - 0x0b, 0x00, 0x3b, 0x71, 0x0b, 0x00, 0x3f, 0x71, 0x0b, 0x00, 0x78, 0x71, - 0x0b, 0x00, 0x7c, 0x71, 0x0b, 0x00, 0x7e, 0x71, 0x0b, 0x00, 0x7f, 0x71, - 0x0b, 0x00, 0x3f, 0x72, 0x0b, 0x00, 0xff, 0x72, 0x0b, 0x00, 0xbe, 0x74, - 0x0b, 0x00, 0xbf, 0x74, 0x0b, 0x00, 0xd5, 0x74, 0x0b, 0x00, 0xdf, 0x74, - 0x0b, 0x00, 0xee, 0x74, 0x0b, 0x00, 0xef, 0x74, 0x0b, 0x00, 0xf3, 0x74, - 0x0b, 0x00, 0xfb, 0x74, 0x0b, 0x00, 0x33, 0x75, 0x0b, 0x00, 0x3b, 0x75, - 0x0b, 0x00, 0x3f, 0x75, 0x0b, 0x00, 0x03, 0x76, 0x0b, 0x00, 0x13, 0x76, - 0x0b, 0x00, 0x1f, 0x76, 0x0b, 0x00, 0x34, 0x76, 0x0b, 0x00, 0xb3, 0x76, - 0x0b, 0x00, 0xbb, 0x76, 0x0b, 0x00, 0xbf, 0x76, 0x0b, 0x00, 0x3e, 0x77, - 0x0b, 0x00, 0x3f, 0x77, 0x0b, 0x00, 0xa3, 0x77, 0x0b, 0x00, 0xae, 0x77, - 0x0b, 0x00, 0xaf, 0x77, 0x0b, 0x00, 0x3f, 0x78, 0x0b, 0x00, 0x33, 0x79, - 0x0b, 0x00, 0x3b, 0x79, 0x0b, 0x00, 0x3f, 0x79, 0x0b, 0x00, 0x5f, 0x79, - 0x0b, 0x00, 0x2b, 0x7a, 0x0b, 0x00, 0x74, 0x7a, 0x0b, 0x00, 0x78, 0x7a, - 0x0b, 0x00, 0x0b, 0x7b, 0x0b, 0x00, 0x3e, 0x7b, 0x0b, 0x00, 0x3f, 0x7b, - 0x0b, 0x00, 0xbe, 0x7b, 0x0b, 0x00, 0xbf, 0x7b, 0x0b, 0x00, 0xfe, 0x7b, - 0x0b, 0x00, 0xff, 0x7b, 0x0b, 0x00, 0xf8, 0x7c, 0x0b, 0x00, 0xfc, 0x7c, - 0x0b, 0x00, 0xfe, 0x7c, 0x0b, 0x00, 0xff, 0x7c, 0x0b, 0x00, 0x33, 0x7d, - 0x0b, 0x00, 0x3b, 0x7d, 0x0b, 0x00, 0x3f, 0x7d, 0x0b, 0x00, 0x5f, 0x7d, - 0x0b, 0x00, 0xff, 0x7e, 0x0b, 0x00, 0x23, 0x7f, 0x0b, 0x00, 0x2e, 0x7f, - 0x0b, 0x00, 0x2f, 0x7f, 0x0b, 0x00, 0xf8, 0x7f, 0x0b, 0x00, 0xfc, 0x7f, - 0x0b, 0x00, 0xfe, 0x7f, 0x0b, 0x00, 0xff, 0x7f, 0x0b, 0x00, 0xf0, 0x81, - 0x0b, 0x00, 0xf1, 0x81, 0x0b, 0x00, 0xf3, 0x81, 0x0b, 0x00, 0xf9, 0x81, - 0x0b, 0x00, 0xfb, 0x81, 0x0b, 0x00, 0xfd, 0x81, 0x0b, 0x00, 0xb8, 0x82, - 0x0b, 0x00, 0x73, 0x83, 0x0b, 0x00, 0x7b, 0x83, 0x0b, 0x00, 0x30, 0x84, - 0x0b, 0x00, 0x36, 0x84, 0x0b, 0x00, 0x37, 0x84, 0x0b, 0x00, 0x3d, 0x84, - 0x0b, 0x00, 0x3e, 0x84, 0x0b, 0x00, 0x3f, 0x84, 0x0b, 0x00, 0x70, 0x84, - 0x0b, 0x00, 0x71, 0x84, 0x0b, 0x00, 0x73, 0x84, 0x0b, 0x00, 0x79, 0x84, - 0x0b, 0x00, 0x7b, 0x84, 0x0b, 0x00, 0x7d, 0x84, 0x0b, 0x00, 0x48, 0x85, - 0x0b, 0x00, 0x4b, 0x85, 0x0b, 0x00, 0x78, 0x85, 0x0b, 0x00, 0x7c, 0x85, - 0x0b, 0x00, 0x7e, 0x85, 0x0b, 0x00, 0x7f, 0x85, 0x0b, 0x00, 0xf2, 0x85, - 0x0b, 0x00, 0xf4, 0x85, 0x0b, 0x00, 0xf5, 0x85, 0x0b, 0x00, 0xf6, 0x85, - 0x0b, 0x00, 0xf7, 0x85, 0x0b, 0x00, 0xf8, 0x85, 0x0b, 0x00, 0xfa, 0x85, - 0x0b, 0x00, 0xfc, 0x85, 0x0b, 0x00, 0xfe, 0x85, 0x0b, 0x00, 0xff, 0x85, - 0x0b, 0x00, 0x72, 0x86, 0x0b, 0x00, 0x74, 0x86, 0x0b, 0x00, 0x75, 0x86, - 0x0b, 0x00, 0x76, 0x86, 0x0b, 0x00, 0x77, 0x86, 0x0b, 0x00, 0x78, 0x86, - 0x0b, 0x00, 0x7a, 0x86, 0x0b, 0x00, 0x7c, 0x86, 0x0b, 0x00, 0x7e, 0x86, - 0x0b, 0x00, 0x7f, 0x86, 0x0b, 0x00, 0xc8, 0x86, 0x0b, 0x00, 0xc9, 0x86, - 0x0b, 0x00, 0xcb, 0x86, 0x0b, 0x00, 0xf0, 0x86, 0x0b, 0x00, 0xf1, 0x86, - 0x0b, 0x00, 0xf9, 0x86, 0x0b, 0x00, 0xfd, 0x86, 0x0b, 0x00, 0x76, 0x87, - 0x0b, 0x00, 0x77, 0x87, 0x0b, 0x00, 0x78, 0x87, 0x0b, 0x00, 0x7c, 0x87, - 0x0b, 0x00, 0x7e, 0x87, 0x0b, 0x00, 0x7f, 0x87, 0x0b, 0x00, 0xb0, 0x87, - 0x0b, 0x00, 0xb6, 0x87, 0x0b, 0x00, 0xbe, 0x87, 0x0b, 0x00, 0xf2, 0x87, - 0x0b, 0x00, 0xf4, 0x87, 0x0b, 0x00, 0xf5, 0x87, 0x0b, 0x00, 0xf6, 0x87, - 0x0b, 0x00, 0xf7, 0x87, 0x0b, 0x00, 0xf8, 0x87, 0x0b, 0x00, 0xfa, 0x87, - 0x0b, 0x00, 0xfc, 0x87, 0x0b, 0x00, 0xfe, 0x87, 0x0b, 0x00, 0xff, 0x87, - 0x0b, 0x00, 0x15, 0x89, 0x0b, 0x00, 0x1f, 0x89, 0x0b, 0x00, 0x68, 0x89, - 0x0b, 0x00, 0x73, 0x89, 0x0b, 0x00, 0x7b, 0x89, 0x0b, 0x00, 0x2b, 0x8a, - 0x0b, 0x00, 0x72, 0x8a, 0x0b, 0x00, 0x74, 0x8a, 0x0b, 0x00, 0x75, 0x8a, - 0x0b, 0x00, 0x76, 0x8a, 0x0b, 0x00, 0x77, 0x8a, 0x0b, 0x00, 0x78, 0x8a, - 0x0b, 0x00, 0x7a, 0x8a, 0x0b, 0x00, 0x7c, 0x8a, 0x0b, 0x00, 0x7e, 0x8a, - 0x0b, 0x00, 0x7f, 0x8a, 0x0b, 0x00, 0xd0, 0x8a, 0x0b, 0x00, 0xdf, 0x8a, - 0x0b, 0x00, 0x38, 0x8b, 0x0b, 0x00, 0xb0, 0x8b, 0x0b, 0x00, 0xb6, 0x8b, - 0x0b, 0x00, 0xbe, 0x8b, 0x0b, 0x00, 0xd0, 0x8b, 0x0b, 0x00, 0xd8, 0x8b, - 0x0b, 0x00, 0xda, 0x8b, 0x0b, 0x00, 0xdc, 0x8b, 0x0b, 0x00, 0xde, 0x8b, - 0x0b, 0x00, 0xdf, 0x8b, 0x0b, 0x00, 0xe0, 0x8b, 0x0b, 0x00, 0xe1, 0x8b, - 0x0b, 0x00, 0xe2, 0x8b, 0x0b, 0x00, 0xe4, 0x8b, 0x0b, 0x00, 0xe6, 0x8b, - 0x0b, 0x00, 0xe7, 0x8b, 0x0b, 0x00, 0xee, 0x8b, 0x0b, 0x00, 0xf2, 0x8b, - 0x0b, 0x00, 0xf4, 0x8b, 0x0b, 0x00, 0xf5, 0x8b, 0x0b, 0x00, 0xf6, 0x8b, - 0x0b, 0x00, 0xf7, 0x8b, 0x0b, 0x00, 0xf8, 0x8b, 0x0b, 0x00, 0xfa, 0x8b, - 0x0b, 0x00, 0xfc, 0x8b, 0x0b, 0x00, 0xfe, 0x8b, 0x0b, 0x00, 0xff, 0x8b, - 0x0b, 0x00, 0xbe, 0x8c, 0x0b, 0x00, 0xbf, 0x8c, 0x0b, 0x00, 0x15, 0x8d, - 0x0b, 0x00, 0x1f, 0x8d, 0x0b, 0x00, 0x68, 0x8d, 0x0b, 0x00, 0x73, 0x8d, - 0x0b, 0x00, 0x7b, 0x8d, 0x0b, 0x00, 0xb4, 0x8e, 0x0b, 0x00, 0xbe, 0x8e, - 0x0b, 0x00, 0xbf, 0x8e, 0x0b, 0x00, 0x88, 0x8f, 0x0b, 0x00, 0xc0, 0x8f, - 0x0b, 0x00, 0xc1, 0x8f, 0x0b, 0x00, 0xc2, 0x8f, 0x0b, 0x00, 0xc8, 0x8f, - 0x0b, 0x00, 0xe8, 0x8f, 0x0b, 0x00, 0xf0, 0x8f, 0x0b, 0x00, 0xf1, 0x8f, - 0x0b, 0x00, 0xf3, 0x8f, 0x0b, 0x00, 0xf9, 0x8f, 0x0b, 0x00, 0xfb, 0x8f, - 0x0b, 0x00, 0xfd, 0x8f, 0x0b, 0x00, 0xb8, 0x90, 0x0b, 0x00, 0x38, 0x92, - 0x0b, 0x00, 0xb8, 0x94, 0x0b, 0x00, 0xf4, 0x95, 0x0b, 0x00, 0xfe, 0x95, - 0x0b, 0x00, 0xff, 0x95, 0x0b, 0x00, 0xb8, 0x96, 0x0b, 0x00, 0x8e, 0x97, - 0x0b, 0x00, 0x8f, 0x97, 0x0b, 0x00, 0x48, 0x98, 0x0b, 0x00, 0xb8, 0x98, - 0x0b, 0x00, 0xf8, 0x98, 0x0b, 0x00, 0x38, 0x99, 0x0b, 0x00, 0x3e, 0x9a, - 0x0b, 0x00, 0x3f, 0x9a, 0x0b, 0x00, 0xbe, 0x9a, 0x0b, 0x00, 0xbf, 0x9a, - 0x0b, 0x00, 0xf8, 0x9a, 0x0b, 0x00, 0xfc, 0x9a, 0x0b, 0x00, 0xfe, 0x9a, - 0x0b, 0x00, 0xff, 0x9a, 0x0b, 0x00, 0xc8, 0x9c, 0x0b, 0x00, 0xcb, 0x9c, - 0x0b, 0x00, 0xf8, 0x9c, 0x0b, 0x00, 0xfc, 0x9c, 0x0b, 0x00, 0xfe, 0x9c, - 0x0b, 0x00, 0xff, 0x9c, 0x0b, 0x00, 0x38, 0x9d, 0x0b, 0x00, 0xf4, 0x9f, - 0x0b, 0x00, 0xf5, 0x9f, 0x0b, 0x00, 0xf8, 0x9f, 0x0b, 0x00, 0xfc, 0x9f, - 0x0b, 0x00, 0xfe, 0x9f, 0x0b, 0x00, 0xff, 0x9f, 0x0b, 0x00, 0x78, 0xa4, - 0x0b, 0x00, 0x7c, 0xa4, 0x0b, 0x00, 0x7e, 0xa4, 0x0b, 0x00, 0x7f, 0xa4, - 0x0b, 0x00, 0x78, 0xa6, 0x0b, 0x00, 0x7c, 0xa6, 0x0b, 0x00, 0x7e, 0xa6, - 0x0b, 0x00, 0x7f, 0xa6, 0x0b, 0x00, 0xbe, 0xa7, 0x0b, 0x00, 0xbf, 0xa7, - 0x0b, 0x00, 0xc8, 0xa7, 0x0b, 0x00, 0xcb, 0xa7, 0x0b, 0x00, 0xe8, 0xa7, - 0x0b, 0x00, 0xeb, 0xa7, 0x0b, 0x00, 0x78, 0xaa, 0x0b, 0x00, 0x3e, 0xab, - 0x0b, 0x00, 0x3f, 0xab, 0x0b, 0x00, 0xbe, 0xab, 0x0b, 0x00, 0xbf, 0xab, - 0x0b, 0x00, 0xc8, 0xab, 0x0b, 0x00, 0xcb, 0xab, 0x0b, 0x00, 0xfe, 0xab, - 0x0b, 0x00, 0xff, 0xab, 0x0b, 0x00, 0x07, 0xb1, 0x0b, 0x00, 0x0b, 0xb1, - 0x0b, 0x00, 0xf0, 0xb1, 0x0b, 0x00, 0xf1, 0xb1, 0x0b, 0x00, 0xf9, 0xb1, - 0x0b, 0x00, 0xfd, 0xb1, 0x0b, 0x00, 0xbe, 0xb2, 0x0b, 0x00, 0xbf, 0xb2, - 0x0b, 0x00, 0x88, 0xb3, 0x0b, 0x00, 0x8b, 0xb3, 0x0b, 0x00, 0x91, 0xb3, - 0x0b, 0x00, 0x96, 0xb3, 0x0b, 0x00, 0x97, 0xb3, 0x0b, 0x00, 0x99, 0xb3, - 0x0b, 0x00, 0x9d, 0xb3, 0x0b, 0x00, 0x70, 0xb4, 0x0b, 0x00, 0x71, 0xb4, - 0x0b, 0x00, 0x79, 0xb4, 0x0b, 0x00, 0x7d, 0xb4, 0x0b, 0x00, 0x1f, 0xb5, - 0x0b, 0x00, 0x68, 0xb5, 0x0b, 0x00, 0x6b, 0xb5, 0x0b, 0x00, 0xf7, 0xb5, - 0x0b, 0x00, 0xf8, 0xb5, 0x0b, 0x00, 0xfc, 0xb5, 0x0b, 0x00, 0xfe, 0xb5, - 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0x70, 0xb6, 0x0b, 0x00, 0x71, 0xb6, - 0x0b, 0x00, 0x79, 0xb6, 0x0b, 0x00, 0x7d, 0xb6, 0x0b, 0x00, 0x06, 0xb7, - 0x0b, 0x00, 0x07, 0xb7, 0x0b, 0x00, 0x08, 0xb7, 0x0b, 0x00, 0x09, 0xb7, - 0x0b, 0x00, 0x0b, 0xb7, 0x0b, 0x00, 0x10, 0xb7, 0x0b, 0x00, 0x18, 0xb7, - 0x0b, 0x00, 0x1c, 0xb7, 0x0b, 0x00, 0x1e, 0xb7, 0x0b, 0x00, 0x1f, 0xb7, - 0x0b, 0x00, 0x70, 0xb7, 0x0b, 0x00, 0x71, 0xb7, 0x0b, 0x00, 0x79, 0xb7, - 0x0b, 0x00, 0x7d, 0xb7, 0x0b, 0x00, 0xc8, 0xb7, 0x0b, 0x00, 0xc9, 0xb7, - 0x0b, 0x00, 0xcb, 0xb7, 0x0b, 0x00, 0xe8, 0xb7, 0x0b, 0x00, 0xe9, 0xb7, - 0x0b, 0x00, 0xeb, 0xb7, 0x0b, 0x00, 0xf0, 0xb7, 0x0b, 0x00, 0xf1, 0xb7, - 0x0b, 0x00, 0xf9, 0xb7, 0x0b, 0x00, 0xfd, 0xb7, 0x0b, 0x00, 0x30, 0xb9, - 0x0b, 0x00, 0x37, 0xb9, 0x0b, 0x00, 0x3d, 0xb9, 0x0b, 0x00, 0x3e, 0xb9, - 0x0b, 0x00, 0x3f, 0xb9, 0x0b, 0x00, 0x76, 0xba, 0x0b, 0x00, 0x77, 0xba, - 0x0b, 0x00, 0x78, 0xba, 0x0b, 0x00, 0x7c, 0xba, 0x0b, 0x00, 0x7e, 0xba, - 0x0b, 0x00, 0x7f, 0xba, 0x0b, 0x00, 0x31, 0xbb, 0x0b, 0x00, 0x38, 0xbb, - 0x0b, 0x00, 0xb0, 0xbb, 0x0b, 0x00, 0xb6, 0xbb, 0x0b, 0x00, 0xb7, 0xbb, - 0x0b, 0x00, 0xbd, 0xbb, 0x0b, 0x00, 0xbe, 0xbb, 0x0b, 0x00, 0xbf, 0xbb, - 0x0b, 0x00, 0xd0, 0xbb, 0x0b, 0x00, 0xd8, 0xbb, 0x0b, 0x00, 0xdc, 0xbb, - 0x0b, 0x00, 0xde, 0xbb, 0x0b, 0x00, 0xdf, 0xbb, 0x0b, 0x00, 0xe6, 0xbb, - 0x0b, 0x00, 0xe7, 0xbb, 0x0b, 0x00, 0xf6, 0xbb, 0x0b, 0x00, 0xf7, 0xbb, - 0x0b, 0x00, 0xf8, 0xbb, 0x0b, 0x00, 0xfc, 0xbb, 0x0b, 0x00, 0xfe, 0xbb, - 0x0b, 0x00, 0xff, 0xbb, 0x0b, 0x00, 0xbe, 0xbc, 0x0b, 0x00, 0xbf, 0xbc, - 0x0b, 0x00, 0x30, 0xbd, 0x0b, 0x00, 0x37, 0xbd, 0x0b, 0x00, 0x3d, 0xbd, - 0x0b, 0x00, 0x3e, 0xbd, 0x0b, 0x00, 0x3f, 0xbd, 0x0b, 0x00, 0xbe, 0xbe, - 0x0b, 0x00, 0xbf, 0xbe, 0x0b, 0x00, 0x26, 0xbf, 0x0b, 0x00, 0x27, 0xbf, - 0x0b, 0x00, 0x29, 0xbf, 0x0b, 0x00, 0x2a, 0xbf, 0x0b, 0x00, 0x88, 0xbf, - 0x0b, 0x00, 0x8b, 0xbf, 0x0b, 0x00, 0xc8, 0xbf, 0x0b, 0x00, 0xc9, 0xbf, - 0x0b, 0x00, 0xcb, 0xbf, 0x0b, 0x00, 0xe8, 0xbf, 0x0b, 0x00, 0xe9, 0xbf, - 0x0b, 0x00, 0xeb, 0xbf, 0x0b, 0x00, 0xf0, 0xbf, 0x0b, 0x00, 0xf1, 0xbf, - 0x0b, 0x00, 0xf9, 0xbf, 0x0b, 0x00, 0xfd, 0xbf, 0x0b, 0x00, 0xb8, 0xc0, - 0x0b, 0x00, 0xb8, 0xc2, 0x0b, 0x00, 0x73, 0xc3, 0x0b, 0x00, 0x7b, 0xc3, - 0x0b, 0x00, 0xb8, 0xc4, 0x0b, 0x00, 0xc8, 0xc4, 0x0b, 0x00, 0xc9, 0xc4, - 0x0b, 0x00, 0xcb, 0xc4, 0x0b, 0x00, 0xf0, 0xc4, 0x0b, 0x00, 0xf1, 0xc4, - 0x0b, 0x00, 0xf9, 0xc4, 0x0b, 0x00, 0xfd, 0xc4, 0x0b, 0x00, 0x48, 0xc5, - 0x0b, 0x00, 0x4b, 0xc5, 0x0b, 0x00, 0x78, 0xc5, 0x0b, 0x00, 0x7c, 0xc5, - 0x0b, 0x00, 0x7e, 0xc5, 0x0b, 0x00, 0x7f, 0xc5, 0x0b, 0x00, 0xf2, 0xc5, - 0x0b, 0x00, 0xf4, 0xc5, 0x0b, 0x00, 0xf5, 0xc5, 0x0b, 0x00, 0xf6, 0xc5, - 0x0b, 0x00, 0xf7, 0xc5, 0x0b, 0x00, 0xf8, 0xc5, 0x0b, 0x00, 0xfa, 0xc5, - 0x0b, 0x00, 0xfc, 0xc5, 0x0b, 0x00, 0xfe, 0xc5, 0x0b, 0x00, 0xff, 0xc5, - 0x0b, 0x00, 0x31, 0xc6, 0x0b, 0x00, 0x38, 0xc6, 0x0b, 0x00, 0xb0, 0xc6, - 0x0b, 0x00, 0xb6, 0xc6, 0x0b, 0x00, 0xbe, 0xc6, 0x0b, 0x00, 0x30, 0xc7, - 0x0b, 0x00, 0x36, 0xc7, 0x0b, 0x00, 0x3e, 0xc7, 0x0b, 0x00, 0xb8, 0xc8, - 0x0b, 0x00, 0x15, 0xc9, 0x0b, 0x00, 0x64, 0xc9, 0x0b, 0x00, 0x68, 0xc9, - 0x0b, 0x00, 0x74, 0xc9, 0x0b, 0x00, 0x75, 0xc9, 0x0b, 0x00, 0x78, 0xc9, - 0x0b, 0x00, 0x7c, 0xc9, 0x0b, 0x00, 0x7e, 0xc9, 0x0b, 0x00, 0x7f, 0xc9, - 0x0b, 0x00, 0x30, 0xca, 0x0b, 0x00, 0x37, 0xca, 0x0b, 0x00, 0x3d, 0xca, - 0x0b, 0x00, 0x3e, 0xca, 0x0b, 0x00, 0x3f, 0xca, 0x0b, 0x00, 0xb1, 0xca, - 0x0b, 0x00, 0xb8, 0xca, 0x0b, 0x00, 0xc7, 0xca, 0x0b, 0x00, 0xcb, 0xca, - 0x0b, 0x00, 0xe7, 0xca, 0x0b, 0x00, 0xeb, 0xca, 0x0b, 0x00, 0xf7, 0xca, - 0x0b, 0x00, 0xf8, 0xca, 0x0b, 0x00, 0xfc, 0xca, 0x0b, 0x00, 0xfe, 0xca, - 0x0b, 0x00, 0xff, 0xca, 0x0b, 0x00, 0x8e, 0xcb, 0x0b, 0x00, 0xbe, 0xcc, - 0x0b, 0x00, 0xbf, 0xcc, 0x0b, 0x00, 0x15, 0xcd, 0x0b, 0x00, 0x68, 0xcd, - 0x0b, 0x00, 0x7e, 0xcd, 0x0b, 0x00, 0x7f, 0xcd, 0x0b, 0x00, 0xb4, 0xce, - 0x0b, 0x00, 0xbe, 0xce, 0x0b, 0x00, 0xbf, 0xce, 0x0b, 0x00, 0x88, 0xcf, - 0x0b, 0x00, 0xc4, 0xcf, 0x0b, 0x00, 0xc6, 0xcf, 0x0b, 0x00, 0xc7, 0xcf, - 0x0b, 0x00, 0xc8, 0xcf, 0x0b, 0x00, 0xe0, 0xcf, 0x0b, 0x00, 0xe1, 0xcf, - 0x0b, 0x00, 0xe2, 0xcf, 0x0b, 0x00, 0xe4, 0xcf, 0x0b, 0x00, 0xe6, 0xcf, - 0x0b, 0x00, 0xe7, 0xcf, 0x0b, 0x00, 0xe8, 0xcf, 0x0b, 0x00, 0xf2, 0xcf, - 0x0b, 0x00, 0xf4, 0xcf, 0x0b, 0x00, 0xf5, 0xcf, 0x0b, 0x00, 0xf6, 0xcf, - 0x0b, 0x00, 0xf7, 0xcf, 0x0b, 0x00, 0xf8, 0xcf, 0x0b, 0x00, 0xfa, 0xcf, - 0x0b, 0x00, 0xfc, 0xcf, 0x0b, 0x00, 0xfe, 0xcf, 0x0b, 0x00, 0xff, 0xcf, - 0x0b, 0x00, 0xb8, 0xd0, 0x0b, 0x00, 0x38, 0xd2, 0x0b, 0x00, 0xf8, 0xd2, - 0x0b, 0x00, 0xfc, 0xd2, 0x0b, 0x00, 0xfe, 0xd2, 0x0b, 0x00, 0xff, 0xd2, - 0x0b, 0x00, 0xb8, 0xd4, 0x0b, 0x00, 0xf3, 0xd5, 0x0b, 0x00, 0xfb, 0xd5, - 0x0b, 0x00, 0xb8, 0xd6, 0x0b, 0x00, 0x8e, 0xd7, 0x0b, 0x00, 0x8f, 0xd7, - 0x0b, 0x00, 0x48, 0xd8, 0x0b, 0x00, 0xb8, 0xd8, 0x0b, 0x00, 0xf8, 0xd8, - 0x0b, 0x00, 0xfc, 0xd8, 0x0b, 0x00, 0xfe, 0xd8, 0x0b, 0x00, 0xff, 0xd8, - 0x0b, 0x00, 0x38, 0xd9, 0x0b, 0x00, 0x3e, 0xda, 0x0b, 0x00, 0x3f, 0xda, - 0x0b, 0x00, 0xbe, 0xda, 0x0b, 0x00, 0xbf, 0xda, 0x0b, 0x00, 0xc8, 0xdc, - 0x0b, 0x00, 0xcb, 0xdc, 0x0b, 0x00, 0x38, 0xdd, 0x0b, 0x00, 0xf8, 0xde, - 0x0b, 0x00, 0xfc, 0xde, 0x0b, 0x00, 0xfe, 0xde, 0x0b, 0x00, 0xff, 0xde, - 0x0b, 0x00, 0xf3, 0xdf, 0x0b, 0x00, 0xfb, 0xdf, 0x0b, 0x00, 0xb8, 0xe0, - 0x0b, 0x00, 0xb8, 0xe2, 0x0b, 0x00, 0x7e, 0xe3, 0x0b, 0x00, 0x7f, 0xe3, - 0x0b, 0x00, 0xb8, 0xe4, 0x0b, 0x00, 0xe6, 0xe4, 0x0b, 0x00, 0xe7, 0xe4, - 0x0b, 0x00, 0xe8, 0xe4, 0x0b, 0x00, 0xe9, 0xe4, 0x0b, 0x00, 0xeb, 0xe4, - 0x0b, 0x00, 0xf6, 0xe4, 0x0b, 0x00, 0xf7, 0xe4, 0x0b, 0x00, 0xf8, 0xe4, - 0x0b, 0x00, 0xfc, 0xe4, 0x0b, 0x00, 0xfe, 0xe4, 0x0b, 0x00, 0xff, 0xe4, - 0x0b, 0x00, 0x1f, 0xe5, 0x0b, 0x00, 0x78, 0xe5, 0x0b, 0x00, 0xf0, 0xe5, - 0x0b, 0x00, 0xfe, 0xe5, 0x0b, 0x00, 0x30, 0xe6, 0x0b, 0x00, 0x37, 0xe6, - 0x0b, 0x00, 0x3d, 0xe6, 0x0b, 0x00, 0x3e, 0xe6, 0x0b, 0x00, 0x3f, 0xe6, - 0x0b, 0x00, 0xb1, 0xe6, 0x0b, 0x00, 0xb8, 0xe6, 0x0b, 0x00, 0x30, 0xe7, - 0x0b, 0x00, 0x36, 0xe7, 0x0b, 0x00, 0x3e, 0xe7, 0x0b, 0x00, 0x8e, 0xe7, - 0x0b, 0x00, 0xb8, 0xe8, 0x0b, 0x00, 0x74, 0xe9, 0x0b, 0x00, 0x75, 0xe9, - 0x0b, 0x00, 0x78, 0xe9, 0x0b, 0x00, 0x7c, 0xe9, 0x0b, 0x00, 0x7e, 0xe9, - 0x0b, 0x00, 0x7f, 0xe9, 0x0b, 0x00, 0x31, 0xea, 0x0b, 0x00, 0x38, 0xea, - 0x0b, 0x00, 0xb0, 0xea, 0x0b, 0x00, 0xb6, 0xea, 0x0b, 0x00, 0xbe, 0xea, - 0x0b, 0x00, 0xf0, 0xea, 0x0b, 0x00, 0xf1, 0xea, 0x0b, 0x00, 0xf9, 0xea, - 0x0b, 0x00, 0xfd, 0xea, 0x0b, 0x00, 0xbe, 0xec, 0x0b, 0x00, 0xbf, 0xec, - 0x0b, 0x00, 0x7e, 0xed, 0x0b, 0x00, 0x7f, 0xed, 0x0b, 0x00, 0xb8, 0xee, - 0x0b, 0x00, 0xf2, 0xef, 0x0b, 0x00, 0xf4, 0xef, 0x0b, 0x00, 0xf5, 0xef, - 0x0b, 0x00, 0xf6, 0xef, 0x0b, 0x00, 0xf7, 0xef, 0x0b, 0x00, 0xf8, 0xef, - 0x0b, 0x00, 0xfa, 0xef, 0x0b, 0x00, 0xfc, 0xef, 0x0b, 0x00, 0xfe, 0xef, - 0x0b, 0x00, 0xff, 0xef, 0x0b, 0x00, 0xb8, 0xf0, 0x0b, 0x00, 0x1f, 0xf2, - 0x0b, 0x00, 0x30, 0xf2, 0x0b, 0x00, 0x37, 0xf2, 0x0b, 0x00, 0x3d, 0xf2, - 0x0b, 0x00, 0x3e, 0xf2, 0x0b, 0x00, 0x3f, 0xf2, 0x0b, 0x00, 0xb4, 0xf2, - 0x0b, 0x00, 0xbe, 0xf2, 0x0b, 0x00, 0xbf, 0xf2, 0x0b, 0x00, 0xc7, 0xf2, - 0x0b, 0x00, 0xcb, 0xf2, 0x0b, 0x00, 0xe7, 0xf2, 0x0b, 0x00, 0xeb, 0xf2, - 0x0b, 0x00, 0xf7, 0xf2, 0x0b, 0x00, 0xf8, 0xf2, 0x0b, 0x00, 0xfc, 0xf2, - 0x0b, 0x00, 0xfe, 0xf2, 0x0b, 0x00, 0xff, 0xf2, 0x0b, 0x00, 0x1e, 0xf3, - 0x0b, 0x00, 0x1f, 0xf3, 0x0b, 0x00, 0x48, 0xf3, 0x0b, 0x00, 0x4b, 0xf3, - 0x0b, 0x00, 0x78, 0xf3, 0x0b, 0x00, 0x88, 0xf3, 0x0b, 0x00, 0x96, 0xf3, - 0x0b, 0x00, 0x9e, 0xf3, 0x0b, 0x00, 0xb8, 0xf4, 0x0b, 0x00, 0x15, 0xf5, - 0x0b, 0x00, 0x68, 0xf5, 0x0b, 0x00, 0x7e, 0xf5, 0x0b, 0x00, 0x7f, 0xf5, - 0x0b, 0x00, 0xf0, 0xf5, 0x0b, 0x00, 0xfe, 0xf5, 0x0b, 0x00, 0xb1, 0xf6, - 0x0b, 0x00, 0xb8, 0xf6, 0x0b, 0x00, 0x8e, 0xf7, 0x0b, 0x00, 0x4d, 0xf8, - 0x0b, 0x00, 0xb8, 0xf8, 0x0b, 0x00, 0xe6, 0xf8, 0x0b, 0x00, 0xe7, 0xf8, - 0x0b, 0x00, 0xe8, 0xf8, 0x0b, 0x00, 0xe9, 0xf8, 0x0b, 0x00, 0xeb, 0xf8, - 0x0b, 0x00, 0xf0, 0xf8, 0x0b, 0x00, 0xf6, 0xf8, 0x0b, 0x00, 0xf7, 0xf8, - 0x0b, 0x00, 0xfd, 0xf8, 0x0b, 0x00, 0xfe, 0xf8, 0x0b, 0x00, 0xff, 0xf8, - 0x0b, 0x00, 0x1f, 0xf9, 0x0b, 0x00, 0x30, 0xf9, 0x0b, 0x00, 0x3e, 0xf9, - 0x0b, 0x00, 0x50, 0xf9, 0x0b, 0x00, 0x59, 0xf9, 0x0b, 0x00, 0x5d, 0xf9, - 0x0b, 0x00, 0x30, 0xfa, 0x0b, 0x00, 0x37, 0xfa, 0x0b, 0x00, 0x3d, 0xfa, - 0x0b, 0x00, 0x3e, 0xfa, 0x0b, 0x00, 0x3f, 0xfa, 0x0b, 0x00, 0xb1, 0xfa, - 0x0b, 0x00, 0xb8, 0xfa, 0x0b, 0x00, 0xc7, 0xfa, 0x0b, 0x00, 0xcb, 0xfa, - 0x0b, 0x00, 0xe7, 0xfa, 0x0b, 0x00, 0xeb, 0xfa, 0x0b, 0x00, 0xf7, 0xfa, - 0x0b, 0x00, 0xf8, 0xfa, 0x0b, 0x00, 0xfc, 0xfa, 0x0b, 0x00, 0xfe, 0xfa, - 0x0b, 0x00, 0xff, 0xfa, 0x0b, 0x00, 0x8e, 0xfb, 0x0b, 0x00, 0xbe, 0xfc, - 0x0b, 0x00, 0xbf, 0xfc, 0x0b, 0x00, 0xd1, 0xfc, 0x0b, 0x00, 0xd6, 0xfc, - 0x0b, 0x00, 0xd7, 0xfc, 0x0b, 0x00, 0xd8, 0xfc, 0x0b, 0x00, 0xdc, 0xfc, - 0x0b, 0x00, 0xde, 0xfc, 0x0b, 0x00, 0xdf, 0xfc, 0x0b, 0x00, 0xe6, 0xfc, - 0x0b, 0x00, 0xe7, 0xfc, 0x0b, 0x00, 0xe8, 0xfc, 0x0b, 0x00, 0xe9, 0xfc, - 0x0b, 0x00, 0xeb, 0xfc, 0x0b, 0x00, 0xf6, 0xfc, 0x0b, 0x00, 0xf7, 0xfc, - 0x0b, 0x00, 0xf8, 0xfc, 0x0b, 0x00, 0xfc, 0xfc, 0x0b, 0x00, 0xfe, 0xfc, - 0x0b, 0x00, 0xff, 0xfc, 0x0b, 0x00, 0x1f, 0xfd, 0x0b, 0x00, 0x30, 0xfd, - 0x0b, 0x00, 0x3e, 0xfd, 0x0b, 0x00, 0x50, 0xfd, 0x0b, 0x00, 0x58, 0xfd, - 0x0b, 0x00, 0x78, 0xfd, 0x0b, 0x00, 0x1f, 0xfe, 0x0b, 0x00, 0x2b, 0xfe, - 0x0b, 0x00, 0xb4, 0xfe, 0x0b, 0x00, 0xbe, 0xfe, 0x0b, 0x00, 0xbf, 0xfe, - 0x0b, 0x00, 0xd1, 0xfe, 0x0b, 0x00, 0xd6, 0xfe, 0x0b, 0x00, 0xd7, 0xfe, - 0x0b, 0x00, 0xdf, 0xfe, 0x0b, 0x00, 0xe7, 0xfe, 0x0b, 0x00, 0xeb, 0xfe, - 0x0b, 0x00, 0xf7, 0xfe, 0x0b, 0x00, 0xf8, 0xfe, 0x0b, 0x00, 0xfc, 0xfe, - 0x0b, 0x00, 0xfe, 0xfe, 0x0b, 0x00, 0xff, 0xfe, 0x0b, 0x00, 0x23, 0xff, - 0x0b, 0x00, 0x28, 0xff, 0x0b, 0x00, 0x2b, 0xff, 0x0b, 0x00, 0x2c, 0xff, - 0x0b, 0x00, 0x2e, 0xff, 0x0b, 0x00, 0x2f, 0xff, 0x0b, 0x00, 0x88, 0xff, - 0x0b, 0x00, 0xa3, 0xff, 0x0b, 0x00, 0xa8, 0xff, 0x0b, 0x00, 0xab, 0xff, - 0x0b, 0x00, 0xac, 0xff, 0x0b, 0x00, 0xae, 0xff, 0x0b, 0x00, 0xaf, 0xff, - 0x0b, 0x00, 0xc4, 0xff, 0x0b, 0x00, 0xc6, 0xff, 0x0b, 0x00, 0xc7, 0xff, - 0x0b, 0x00, 0xc8, 0xff, 0x0b, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, - 0x0b, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe6, 0xff, - 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xf2, 0xff, - 0x0b, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf6, 0xff, - 0x0b, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xfa, 0xff, - 0x0b, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, - 0x0b, 0x00, 0x6b, 0x00, 0x0c, 0x00, 0x78, 0x00, 0x0c, 0x00, 0x7c, 0x00, - 0x0c, 0x00, 0x7e, 0x00, 0x0c, 0x00, 0x7f, 0x00, 0x0c, 0x00, 0xb8, 0x00, - 0x0c, 0x00, 0xbc, 0x00, 0x0c, 0x00, 0xbe, 0x00, 0x0c, 0x00, 0xbf, 0x00, - 0x0c, 0x00, 0x8b, 0x01, 0x0c, 0x00, 0x9f, 0x01, 0x0c, 0x00, 0xdf, 0x01, - 0x0c, 0x00, 0xb8, 0x04, 0x0c, 0x00, 0xbc, 0x04, 0x0c, 0x00, 0xbe, 0x04, - 0x0c, 0x00, 0xbf, 0x04, 0x0c, 0x00, 0xcb, 0x05, 0x0c, 0x00, 0xeb, 0x05, - 0x0c, 0x00, 0xf8, 0x05, 0x0c, 0x00, 0xfc, 0x05, 0x0c, 0x00, 0xfe, 0x05, - 0x0c, 0x00, 0xff, 0x05, 0x0c, 0x00, 0xb8, 0x06, 0x0c, 0x00, 0xbc, 0x06, - 0x0c, 0x00, 0xbe, 0x06, 0x0c, 0x00, 0xbf, 0x06, 0x0c, 0x00, 0x9f, 0x09, - 0x0c, 0x00, 0xdf, 0x09, 0x0c, 0x00, 0x78, 0x0a, 0x0c, 0x00, 0x7c, 0x0a, - 0x0c, 0x00, 0x7e, 0x0a, 0x0c, 0x00, 0x7f, 0x0a, 0x0c, 0x00, 0x8b, 0x0b, - 0x0c, 0x00, 0xdf, 0x0b, 0x0c, 0x00, 0xeb, 0x0b, 0x0c, 0x00, 0xcb, 0x0f, - 0x0c, 0x00, 0xeb, 0x0f, 0x0c, 0x00, 0x6b, 0x10, 0x0c, 0x00, 0xb8, 0x10, - 0x0c, 0x00, 0x8b, 0x11, 0x0c, 0x00, 0x9f, 0x11, 0x0c, 0x00, 0xdf, 0x11, - 0x0c, 0x00, 0xeb, 0x13, 0x0c, 0x00, 0x6b, 0x14, 0x0c, 0x00, 0x7f, 0x14, - 0x0c, 0x00, 0x9f, 0x14, 0x0c, 0x00, 0x9f, 0x15, 0x0c, 0x00, 0xdf, 0x15, - 0x0c, 0x00, 0x78, 0x16, 0x0c, 0x00, 0x7c, 0x16, 0x0c, 0x00, 0x7e, 0x16, - 0x0c, 0x00, 0x7f, 0x16, 0x0c, 0x00, 0x9f, 0x16, 0x0c, 0x00, 0x78, 0x17, - 0x0c, 0x00, 0x7c, 0x17, 0x0c, 0x00, 0x7e, 0x17, 0x0c, 0x00, 0x7f, 0x17, - 0x0c, 0x00, 0x8b, 0x17, 0x0c, 0x00, 0x9f, 0x17, 0x0c, 0x00, 0xdf, 0x17, - 0x0c, 0x00, 0x78, 0x18, 0x0c, 0x00, 0x7c, 0x18, 0x0c, 0x00, 0x7e, 0x18, - 0x0c, 0x00, 0x7f, 0x18, 0x0c, 0x00, 0xbe, 0x18, 0x0c, 0x00, 0xbf, 0x18, - 0x0c, 0x00, 0xb8, 0x1a, 0x0c, 0x00, 0xbc, 0x1a, 0x0c, 0x00, 0xbe, 0x1a, - 0x0c, 0x00, 0xbf, 0x1a, 0x0c, 0x00, 0xcb, 0x1d, 0x0c, 0x00, 0xeb, 0x1d, - 0x0c, 0x00, 0x9f, 0x25, 0x0c, 0x00, 0xdf, 0x25, 0x0c, 0x00, 0xbf, 0x26, - 0x0c, 0x00, 0xcb, 0x27, 0x0c, 0x00, 0xeb, 0x27, 0x0c, 0x00, 0x8b, 0x28, - 0x0c, 0x00, 0xbe, 0x28, 0x0c, 0x00, 0xbf, 0x28, 0x0c, 0x00, 0xcb, 0x29, - 0x0c, 0x00, 0xeb, 0x29, 0x0c, 0x00, 0xf8, 0x29, 0x0c, 0x00, 0xfc, 0x29, - 0x0c, 0x00, 0xfe, 0x29, 0x0c, 0x00, 0xff, 0x29, 0x0c, 0x00, 0xf8, 0x2b, - 0x0c, 0x00, 0xfc, 0x2b, 0x0c, 0x00, 0xfe, 0x2b, 0x0c, 0x00, 0xff, 0x2b, - 0x0c, 0x00, 0x9f, 0x2c, 0x0c, 0x00, 0xf8, 0x2d, 0x0c, 0x00, 0xfc, 0x2d, - 0x0c, 0x00, 0xfe, 0x2d, 0x0c, 0x00, 0xff, 0x2d, 0x0c, 0x00, 0x9f, 0x2e, - 0x0c, 0x00, 0x9f, 0x2f, 0x0c, 0x00, 0xdf, 0x2f, 0x0c, 0x00, 0x8b, 0x30, - 0x0c, 0x00, 0xb8, 0x30, 0x0c, 0x00, 0xbc, 0x30, 0x0c, 0x00, 0xbe, 0x30, - 0x0c, 0x00, 0xbf, 0x30, 0x0c, 0x00, 0x87, 0x31, 0x0c, 0x00, 0x8b, 0x33, - 0x0c, 0x00, 0x90, 0x33, 0x0c, 0x00, 0x91, 0x33, 0x0c, 0x00, 0x96, 0x33, - 0x0c, 0x00, 0x97, 0x33, 0x0c, 0x00, 0x9f, 0x33, 0x0c, 0x00, 0x6b, 0x35, - 0x0c, 0x00, 0x87, 0x36, 0x0c, 0x00, 0xb7, 0x36, 0x0c, 0x00, 0xc7, 0x37, - 0x0c, 0x00, 0xcb, 0x37, 0x0c, 0x00, 0xe7, 0x37, 0x0c, 0x00, 0xeb, 0x37, - 0x0c, 0x00, 0xf0, 0x37, 0x0c, 0x00, 0xf1, 0x37, 0x0c, 0x00, 0xf7, 0x37, - 0x0c, 0x00, 0xf9, 0x37, 0x0c, 0x00, 0xfd, 0x37, 0x0c, 0x00, 0xbf, 0x3a, - 0x0c, 0x00, 0x87, 0x3b, 0x0c, 0x00, 0x7f, 0x3c, 0x0c, 0x00, 0x8b, 0x3d, - 0x0c, 0x00, 0x97, 0x3d, 0x0c, 0x00, 0x9f, 0x3d, 0x0c, 0x00, 0xd7, 0x3d, - 0x0c, 0x00, 0xdf, 0x3d, 0x0c, 0x00, 0x6b, 0x3e, 0x0c, 0x00, 0xf8, 0x3f, - 0x0c, 0x00, 0xfc, 0x3f, 0x0c, 0x00, 0xfe, 0x3f, 0x0c, 0x00, 0xff, 0x3f, - 0x0c, 0x00, 0x70, 0x44, 0x0c, 0x00, 0x71, 0x44, 0x0c, 0x00, 0x79, 0x44, - 0x0c, 0x00, 0x7d, 0x44, 0x0c, 0x00, 0x8b, 0x45, 0x0c, 0x00, 0x9f, 0x45, - 0x0c, 0x00, 0xdf, 0x45, 0x0c, 0x00, 0x67, 0x46, 0x0c, 0x00, 0x6b, 0x46, - 0x0c, 0x00, 0x77, 0x46, 0x0c, 0x00, 0x78, 0x46, 0x0c, 0x00, 0x7c, 0x46, - 0x0c, 0x00, 0x7e, 0x46, 0x0c, 0x00, 0x7f, 0x46, 0x0c, 0x00, 0x87, 0x47, - 0x0c, 0x00, 0x9f, 0x47, 0x0c, 0x00, 0xdf, 0x47, 0x0c, 0x00, 0xb7, 0x4a, - 0x0c, 0x00, 0x91, 0x4b, 0x0c, 0x00, 0x96, 0x4b, 0x0c, 0x00, 0x97, 0x4b, - 0x0c, 0x00, 0x9f, 0x4b, 0x0c, 0x00, 0xb8, 0x52, 0x0c, 0x00, 0xbc, 0x52, - 0x0c, 0x00, 0xbe, 0x52, 0x0c, 0x00, 0xbf, 0x52, 0x0c, 0x00, 0x8b, 0x53, - 0x0c, 0x00, 0x9f, 0x53, 0x0c, 0x00, 0x90, 0x59, 0x0c, 0x00, 0x91, 0x59, - 0x0c, 0x00, 0x96, 0x59, 0x0c, 0x00, 0x97, 0x59, 0x0c, 0x00, 0xd0, 0x59, - 0x0c, 0x00, 0xd1, 0x59, 0x0c, 0x00, 0xd6, 0x59, 0x0c, 0x00, 0xd7, 0x59, - 0x0c, 0x00, 0xb0, 0x5a, 0x0c, 0x00, 0xb1, 0x5a, 0x0c, 0x00, 0xb9, 0x5a, - 0x0c, 0x00, 0xbd, 0x5a, 0x0c, 0x00, 0x87, 0x5b, 0x0c, 0x00, 0x8b, 0x5d, - 0x0c, 0x00, 0x9f, 0x5d, 0x0c, 0x00, 0xdf, 0x5d, 0x0c, 0x00, 0x6b, 0x5e, - 0x0c, 0x00, 0x78, 0x5e, 0x0c, 0x00, 0x7c, 0x5e, 0x0c, 0x00, 0x7e, 0x5e, - 0x0c, 0x00, 0x7f, 0x5e, 0x0c, 0x00, 0xf0, 0x5f, 0x0c, 0x00, 0xf1, 0x5f, - 0x0c, 0x00, 0xf9, 0x5f, 0x0c, 0x00, 0xfd, 0x5f, 0x0c, 0x00, 0xb3, 0x64, - 0x0c, 0x00, 0xbb, 0x64, 0x0c, 0x00, 0xcb, 0x65, 0x0c, 0x00, 0xcf, 0x65, - 0x0c, 0x00, 0xeb, 0x65, 0x0c, 0x00, 0xef, 0x65, 0x0c, 0x00, 0xff, 0x65, - 0x0c, 0x00, 0xb3, 0x66, 0x0c, 0x00, 0xbb, 0x66, 0x0c, 0x00, 0x0b, 0x67, - 0x0c, 0x00, 0xce, 0x67, 0x0c, 0x00, 0xcf, 0x67, 0x0c, 0x00, 0xee, 0x67, - 0x0c, 0x00, 0xef, 0x67, 0x0c, 0x00, 0xf8, 0x67, 0x0c, 0x00, 0xfc, 0x67, - 0x0c, 0x00, 0xfe, 0x67, 0x0c, 0x00, 0xff, 0x67, 0x0c, 0x00, 0x6e, 0x6a, - 0x0c, 0x00, 0x6f, 0x6a, 0x0c, 0x00, 0x78, 0x6a, 0x0c, 0x00, 0x7c, 0x6a, - 0x0c, 0x00, 0x7e, 0x6a, 0x0c, 0x00, 0x7f, 0x6a, 0x0c, 0x00, 0x84, 0x6b, - 0x0c, 0x00, 0xf3, 0x6b, 0x0c, 0x00, 0xfb, 0x6b, 0x0c, 0x00, 0xd5, 0x73, - 0x0c, 0x00, 0xee, 0x73, 0x0c, 0x00, 0xef, 0x73, 0x0c, 0x00, 0xf8, 0x73, - 0x0c, 0x00, 0xfc, 0x73, 0x0c, 0x00, 0xfe, 0x73, 0x0c, 0x00, 0xff, 0x73, - 0x0c, 0x00, 0x63, 0x78, 0x0c, 0x00, 0x73, 0x78, 0x0c, 0x00, 0x7b, 0x78, - 0x0c, 0x00, 0x8b, 0x78, 0x0c, 0x00, 0xb4, 0x78, 0x0c, 0x00, 0xb8, 0x78, - 0x0c, 0x00, 0xcf, 0x79, 0x0c, 0x00, 0xef, 0x79, 0x0c, 0x00, 0xff, 0x79, - 0x0c, 0x00, 0xb3, 0x7a, 0x0c, 0x00, 0xbb, 0x7a, 0x0c, 0x00, 0x95, 0x7b, - 0x0c, 0x00, 0xcb, 0x7d, 0x0c, 0x00, 0xcf, 0x7d, 0x0c, 0x00, 0xeb, 0x7d, - 0x0c, 0x00, 0xef, 0x7d, 0x0c, 0x00, 0xff, 0x7d, 0x0c, 0x00, 0x9b, 0x7f, - 0x0c, 0x00, 0xdb, 0x7f, 0x0c, 0x00, 0x16, 0x81, 0x0c, 0x00, 0x61, 0x81, - 0x0c, 0x00, 0x62, 0x81, 0x0c, 0x00, 0x67, 0x81, 0x0c, 0x00, 0x6d, 0x81, - 0x0c, 0x00, 0x6e, 0x81, 0x0c, 0x00, 0x6f, 0x81, 0x0c, 0x00, 0x72, 0x81, - 0x0c, 0x00, 0x77, 0x81, 0x0c, 0x00, 0x78, 0x81, 0x0c, 0x00, 0x7a, 0x81, - 0x0c, 0x00, 0x7c, 0x81, 0x0c, 0x00, 0x7e, 0x81, 0x0c, 0x00, 0x7f, 0x81, - 0x0c, 0x00, 0x73, 0x82, 0x0c, 0x00, 0x7b, 0x82, 0x0c, 0x00, 0xb8, 0x82, - 0x0c, 0x00, 0x0e, 0x83, 0x0c, 0x00, 0x0f, 0x83, 0x0c, 0x00, 0x78, 0x83, - 0x0c, 0x00, 0x7c, 0x83, 0x0c, 0x00, 0x7e, 0x83, 0x0c, 0x00, 0x7f, 0x83, - 0x0c, 0x00, 0x90, 0x83, 0x0c, 0x00, 0x9f, 0x83, 0x0c, 0x00, 0x0b, 0x85, - 0x0c, 0x00, 0xcd, 0x85, 0x0c, 0x00, 0xf2, 0x85, 0x0c, 0x00, 0xf7, 0x85, - 0x0c, 0x00, 0xf8, 0x85, 0x0c, 0x00, 0xfa, 0x85, 0x0c, 0x00, 0xfc, 0x85, - 0x0c, 0x00, 0xfe, 0x85, 0x0c, 0x00, 0xff, 0x85, 0x0c, 0x00, 0x10, 0x87, - 0x0c, 0x00, 0x1f, 0x87, 0x0c, 0x00, 0x8d, 0x87, 0x0c, 0x00, 0x8e, 0x87, - 0x0c, 0x00, 0x8f, 0x87, 0x0c, 0x00, 0xd6, 0x87, 0x0c, 0x00, 0xf1, 0x87, - 0x0c, 0x00, 0xf3, 0x87, 0x0c, 0x00, 0xf9, 0x87, 0x0c, 0x00, 0xfb, 0x87, - 0x0c, 0x00, 0xfd, 0x87, 0x0c, 0x00, 0x96, 0x88, 0x0c, 0x00, 0x9f, 0x88, - 0x0c, 0x00, 0x03, 0x89, 0x0c, 0x00, 0x83, 0x89, 0x0c, 0x00, 0xd7, 0x89, - 0x0c, 0x00, 0xdf, 0x89, 0x0c, 0x00, 0xe3, 0x89, 0x0c, 0x00, 0xe7, 0x89, - 0x0c, 0x00, 0xf3, 0x89, 0x0c, 0x00, 0xf7, 0x89, 0x0c, 0x00, 0xfb, 0x89, - 0x0c, 0x00, 0x11, 0x8b, 0x0c, 0x00, 0x16, 0x8b, 0x0c, 0x00, 0x17, 0x8b, - 0x0c, 0x00, 0x1f, 0x8b, 0x0c, 0x00, 0xd0, 0x8b, 0x0c, 0x00, 0xe1, 0x8b, - 0x0c, 0x00, 0xe2, 0x8b, 0x0c, 0x00, 0xed, 0x8b, 0x0c, 0x00, 0xee, 0x8b, - 0x0c, 0x00, 0xef, 0x8b, 0x0c, 0x00, 0xf2, 0x8b, 0x0c, 0x00, 0xf8, 0x8b, - 0x0c, 0x00, 0xfa, 0x8b, 0x0c, 0x00, 0xfc, 0x8b, 0x0c, 0x00, 0xfe, 0x8b, - 0x0c, 0x00, 0xff, 0x8b, 0x0c, 0x00, 0x6b, 0x8c, 0x0c, 0x00, 0x6f, 0x8c, - 0x0c, 0x00, 0x7f, 0x8c, 0x0c, 0x00, 0x84, 0x8c, 0x0c, 0x00, 0x8e, 0x8c, - 0x0c, 0x00, 0x8f, 0x8c, 0x0c, 0x00, 0xbe, 0x8c, 0x0c, 0x00, 0xbf, 0x8c, - 0x0c, 0x00, 0x03, 0x8d, 0x0c, 0x00, 0x83, 0x8d, 0x0c, 0x00, 0xd7, 0x8d, - 0x0c, 0x00, 0xdf, 0x8d, 0x0c, 0x00, 0xe3, 0x8d, 0x0c, 0x00, 0xe7, 0x8d, - 0x0c, 0x00, 0xf3, 0x8d, 0x0c, 0x00, 0xf7, 0x8d, 0x0c, 0x00, 0xfb, 0x8d, - 0x0c, 0x00, 0x6e, 0x8e, 0x0c, 0x00, 0x6f, 0x8e, 0x0c, 0x00, 0x78, 0x8e, - 0x0c, 0x00, 0x7c, 0x8e, 0x0c, 0x00, 0x7e, 0x8e, 0x0c, 0x00, 0x7f, 0x8e, - 0x0c, 0x00, 0x84, 0x8e, 0x0c, 0x00, 0x8b, 0x8e, 0x0c, 0x00, 0x8f, 0x8e, - 0x0c, 0x00, 0xb3, 0x8e, 0x0c, 0x00, 0xbb, 0x8e, 0x0c, 0x00, 0xbf, 0x8e, - 0x0c, 0x00, 0x73, 0x8f, 0x0c, 0x00, 0x7b, 0x8f, 0x0c, 0x00, 0x96, 0x8f, - 0x0c, 0x00, 0x9f, 0x8f, 0x0c, 0x00, 0xb4, 0x90, 0x0c, 0x00, 0xbe, 0x90, - 0x0c, 0x00, 0xbf, 0x90, 0x0c, 0x00, 0xf8, 0x91, 0x0c, 0x00, 0xfc, 0x91, - 0x0c, 0x00, 0xfe, 0x91, 0x0c, 0x00, 0xff, 0x91, 0x0c, 0x00, 0x95, 0x93, - 0x0c, 0x00, 0xc3, 0x95, 0x0c, 0x00, 0xe3, 0x95, 0x0c, 0x00, 0xf3, 0x95, - 0x0c, 0x00, 0xfb, 0x95, 0x0c, 0x00, 0xff, 0x95, 0x0c, 0x00, 0x83, 0x96, - 0x0c, 0x00, 0xb4, 0x96, 0x0c, 0x00, 0x84, 0x97, 0x0c, 0x00, 0x8e, 0x97, - 0x0c, 0x00, 0x8f, 0x97, 0x0c, 0x00, 0xf3, 0x99, 0x0c, 0x00, 0xfb, 0x99, - 0x0c, 0x00, 0x84, 0x9b, 0x0c, 0x00, 0xf8, 0x9d, 0x0c, 0x00, 0x95, 0x9f, - 0x0c, 0x00, 0xd5, 0x9f, 0x0c, 0x00, 0x6b, 0xa4, 0x0c, 0x00, 0x6f, 0xa4, - 0x0c, 0x00, 0x7f, 0xa4, 0x0c, 0x00, 0xbe, 0xa4, 0x0c, 0x00, 0xbf, 0xa4, - 0x0c, 0x00, 0x94, 0xa5, 0x0c, 0x00, 0x9f, 0xa5, 0x0c, 0x00, 0x6e, 0xa6, - 0x0c, 0x00, 0x6f, 0xa6, 0x0c, 0x00, 0x78, 0xa6, 0x0c, 0x00, 0x7c, 0xa6, - 0x0c, 0x00, 0x7e, 0xa6, 0x0c, 0x00, 0x7f, 0xa6, 0x0c, 0x00, 0xb3, 0xa6, - 0x0c, 0x00, 0xbb, 0xa6, 0x0c, 0x00, 0xbf, 0xa6, 0x0c, 0x00, 0x0b, 0xa7, - 0x0c, 0x00, 0x6b, 0xa7, 0x0c, 0x00, 0x78, 0xa7, 0x0c, 0x00, 0x7c, 0xa7, - 0x0c, 0x00, 0x7e, 0xa7, 0x0c, 0x00, 0x7f, 0xa7, 0x0c, 0x00, 0x9f, 0xa7, - 0x0c, 0x00, 0x74, 0xaa, 0x0c, 0x00, 0x7e, 0xaa, 0x0c, 0x00, 0x7f, 0xaa, - 0x0c, 0x00, 0x0b, 0xab, 0x0c, 0x00, 0x7e, 0xab, 0x0c, 0x00, 0x7f, 0xab, - 0x0c, 0x00, 0x95, 0xab, 0x0c, 0x00, 0x97, 0xb2, 0x0c, 0x00, 0x9f, 0xb2, - 0x0c, 0x00, 0x1f, 0xb3, 0x0c, 0x00, 0xd6, 0xb3, 0x0c, 0x00, 0xdf, 0xb3, - 0x0c, 0x00, 0xe7, 0xb3, 0x0c, 0x00, 0xf1, 0xb3, 0x0c, 0x00, 0xf3, 0xb3, - 0x0c, 0x00, 0xf7, 0xb3, 0x0c, 0x00, 0xf9, 0xb3, 0x0c, 0x00, 0xfb, 0xb3, - 0x0c, 0x00, 0xfd, 0xb3, 0x0c, 0x00, 0x6b, 0xb8, 0x0c, 0x00, 0x6f, 0xb8, - 0x0c, 0x00, 0x7f, 0xb8, 0x0c, 0x00, 0xb0, 0xb8, 0x0c, 0x00, 0xbe, 0xb8, - 0x0c, 0x00, 0x1f, 0xb9, 0x0c, 0x00, 0x6b, 0xb9, 0x0c, 0x00, 0x78, 0xb9, - 0x0c, 0x00, 0x7c, 0xb9, 0x0c, 0x00, 0x7e, 0xb9, 0x0c, 0x00, 0x7f, 0xb9, - 0x0c, 0x00, 0x97, 0xb9, 0x0c, 0x00, 0x9f, 0xb9, 0x0c, 0x00, 0x61, 0xba, - 0x0c, 0x00, 0x62, 0xba, 0x0c, 0x00, 0x6d, 0xba, 0x0c, 0x00, 0x6e, 0xba, - 0x0c, 0x00, 0x6f, 0xba, 0x0c, 0x00, 0x72, 0xba, 0x0c, 0x00, 0x78, 0xba, - 0x0c, 0x00, 0x7a, 0xba, 0x0c, 0x00, 0x7c, 0xba, 0x0c, 0x00, 0x7e, 0xba, - 0x0c, 0x00, 0x7f, 0xba, 0x0c, 0x00, 0xb3, 0xba, 0x0c, 0x00, 0xbb, 0xba, - 0x0c, 0x00, 0xbf, 0xba, 0x0c, 0x00, 0x07, 0xbb, 0x0c, 0x00, 0x0b, 0xbb, - 0x0c, 0x00, 0x6b, 0xbb, 0x0c, 0x00, 0x78, 0xbb, 0x0c, 0x00, 0x7c, 0xbb, - 0x0c, 0x00, 0x7e, 0xbb, 0x0c, 0x00, 0x7f, 0xbb, 0x0c, 0x00, 0x90, 0xbb, - 0x0c, 0x00, 0x91, 0xbc, 0x0c, 0x00, 0x96, 0xbc, 0x0c, 0x00, 0x97, 0xbc, - 0x0c, 0x00, 0x9f, 0xbc, 0x0c, 0x00, 0x1f, 0xbd, 0x0c, 0x00, 0x6b, 0xbd, - 0x0c, 0x00, 0x78, 0xbd, 0x0c, 0x00, 0x7c, 0xbd, 0x0c, 0x00, 0x7e, 0xbd, - 0x0c, 0x00, 0x7f, 0xbd, 0x0c, 0x00, 0x97, 0xbd, 0x0c, 0x00, 0x9f, 0xbd, - 0x0c, 0x00, 0x97, 0xbe, 0x0c, 0x00, 0x9f, 0xbe, 0x0c, 0x00, 0x1f, 0xbf, - 0x0c, 0x00, 0xd6, 0xbf, 0x0c, 0x00, 0xdf, 0xbf, 0x0c, 0x00, 0xe7, 0xbf, - 0x0c, 0x00, 0xf1, 0xbf, 0x0c, 0x00, 0xf3, 0xbf, 0x0c, 0x00, 0xf7, 0xbf, - 0x0c, 0x00, 0xf9, 0xbf, 0x0c, 0x00, 0xfb, 0xbf, 0x0c, 0x00, 0xfd, 0xbf, - 0x0c, 0x00, 0xb0, 0xc0, 0x0c, 0x00, 0xb6, 0xc0, 0x0c, 0x00, 0xb7, 0xc0, - 0x0c, 0x00, 0xbd, 0xc0, 0x0c, 0x00, 0xbe, 0xc0, 0x0c, 0x00, 0xbf, 0xc0, - 0x0c, 0x00, 0xc8, 0xc1, 0x0c, 0x00, 0xc9, 0xc1, 0x0c, 0x00, 0xcb, 0xc1, - 0x0c, 0x00, 0xf0, 0xc1, 0x0c, 0x00, 0xf1, 0xc1, 0x0c, 0x00, 0xf9, 0xc1, - 0x0c, 0x00, 0xfd, 0xc1, 0x0c, 0x00, 0xbe, 0xc2, 0x0c, 0x00, 0xbf, 0xc2, - 0x0c, 0x00, 0x18, 0xc3, 0x0c, 0x00, 0x1c, 0xc3, 0x0c, 0x00, 0x1e, 0xc3, - 0x0c, 0x00, 0x1f, 0xc3, 0x0c, 0x00, 0x90, 0xc3, 0x0c, 0x00, 0x98, 0xc3, - 0x0c, 0x00, 0x9c, 0xc3, 0x0c, 0x00, 0x9e, 0xc3, 0x0c, 0x00, 0x9f, 0xc3, - 0x0c, 0x00, 0xc6, 0xc5, 0x0c, 0x00, 0xc7, 0xc5, 0x0c, 0x00, 0xf6, 0xc5, - 0x0c, 0x00, 0xf7, 0xc5, 0x0c, 0x00, 0xf8, 0xc5, 0x0c, 0x00, 0xfc, 0xc5, - 0x0c, 0x00, 0xfe, 0xc5, 0x0c, 0x00, 0xff, 0xc5, 0x0c, 0x00, 0xb0, 0xc6, - 0x0c, 0x00, 0xb6, 0xc6, 0x0c, 0x00, 0xb7, 0xc6, 0x0c, 0x00, 0xbd, 0xc6, - 0x0c, 0x00, 0xbe, 0xc6, 0x0c, 0x00, 0xbf, 0xc6, 0x0c, 0x00, 0x0b, 0xc9, - 0x0c, 0x00, 0xf0, 0xc9, 0x0c, 0x00, 0xf1, 0xc9, 0x0c, 0x00, 0xf9, 0xc9, - 0x0c, 0x00, 0xfd, 0xc9, 0x0c, 0x00, 0x0b, 0xcd, 0x0c, 0x00, 0xf1, 0xcd, - 0x0c, 0x00, 0xf8, 0xcd, 0x0c, 0x00, 0x08, 0xcf, 0x0c, 0x00, 0x0b, 0xcf, - 0x0c, 0x00, 0x90, 0xcf, 0x0c, 0x00, 0x99, 0xcf, 0x0c, 0x00, 0x9d, 0xcf, - 0x0c, 0x00, 0xd0, 0xcf, 0x0c, 0x00, 0xd9, 0xcf, 0x0c, 0x00, 0xdd, 0xcf, - 0x0c, 0x00, 0xbe, 0xd0, 0x0c, 0x00, 0xbf, 0xd0, 0x0c, 0x00, 0xf8, 0xd1, - 0x0c, 0x00, 0xfc, 0xd1, 0x0c, 0x00, 0xfe, 0xd1, 0x0c, 0x00, 0xff, 0xd1, - 0x0c, 0x00, 0xdf, 0xd5, 0x0c, 0x00, 0xf8, 0xd5, 0x0c, 0x00, 0xfc, 0xd5, - 0x0c, 0x00, 0xfe, 0xd5, 0x0c, 0x00, 0xff, 0xd5, 0x0c, 0x00, 0x8b, 0xd6, - 0x0c, 0x00, 0xbe, 0xd6, 0x0c, 0x00, 0xbf, 0xd6, 0x0c, 0x00, 0xf8, 0xd9, - 0x0c, 0x00, 0xfc, 0xd9, 0x0c, 0x00, 0xfe, 0xd9, 0x0c, 0x00, 0xff, 0xd9, - 0x0c, 0x00, 0xbe, 0xda, 0x0c, 0x00, 0xbf, 0xda, 0x0c, 0x00, 0xf8, 0xdd, - 0x0c, 0x00, 0xfc, 0xdd, 0x0c, 0x00, 0xfe, 0xdd, 0x0c, 0x00, 0xff, 0xdd, - 0x0c, 0x00, 0xb0, 0xe0, 0x0c, 0x00, 0xb6, 0xe0, 0x0c, 0x00, 0xb7, 0xe0, - 0x0c, 0x00, 0xbd, 0xe0, 0x0c, 0x00, 0xbe, 0xe0, 0x0c, 0x00, 0xbf, 0xe0, - 0x0c, 0x00, 0xf6, 0xe1, 0x0c, 0x00, 0xf7, 0xe1, 0x0c, 0x00, 0xf8, 0xe1, - 0x0c, 0x00, 0xfc, 0xe1, 0x0c, 0x00, 0xfe, 0xe1, 0x0c, 0x00, 0xff, 0xe1, - 0x0c, 0x00, 0x7e, 0xe2, 0x0c, 0x00, 0x7f, 0xe2, 0x0c, 0x00, 0x18, 0xe3, - 0x0c, 0x00, 0x90, 0xe3, 0x0c, 0x00, 0x98, 0xe3, 0x0c, 0x00, 0x8b, 0xe5, - 0x0c, 0x00, 0xc7, 0xe5, 0x0c, 0x00, 0xcb, 0xe5, 0x0c, 0x00, 0xe7, 0xe5, - 0x0c, 0x00, 0xeb, 0xe5, 0x0c, 0x00, 0xf0, 0xe5, 0x0c, 0x00, 0xf7, 0xe5, - 0x0c, 0x00, 0xfd, 0xe5, 0x0c, 0x00, 0xfe, 0xe5, 0x0c, 0x00, 0xff, 0xe5, - 0x0c, 0x00, 0xb1, 0xe6, 0x0c, 0x00, 0xb8, 0xe6, 0x0c, 0x00, 0xf6, 0xe9, - 0x0c, 0x00, 0xf7, 0xe9, 0x0c, 0x00, 0xf8, 0xe9, 0x0c, 0x00, 0xfc, 0xe9, - 0x0c, 0x00, 0xfe, 0xe9, 0x0c, 0x00, 0xff, 0xe9, 0x0c, 0x00, 0xf0, 0xed, - 0x0c, 0x00, 0xf6, 0xed, 0x0c, 0x00, 0xf7, 0xed, 0x0c, 0x00, 0xfd, 0xed, - 0x0c, 0x00, 0xfe, 0xed, 0x0c, 0x00, 0xff, 0xed, 0x0c, 0x00, 0x08, 0xef, - 0x0c, 0x00, 0x0b, 0xef, 0x0c, 0x00, 0x90, 0xef, 0x0c, 0x00, 0x99, 0xef, - 0x0c, 0x00, 0x9d, 0xef, 0x0c, 0x00, 0xd0, 0xef, 0x0c, 0x00, 0xd9, 0xef, - 0x0c, 0x00, 0xdd, 0xef, 0x0c, 0x00, 0x86, 0xf0, 0x0c, 0x00, 0x87, 0xf0, - 0x0c, 0x00, 0x88, 0xf0, 0x0c, 0x00, 0x89, 0xf0, 0x0c, 0x00, 0x8b, 0xf0, - 0x0c, 0x00, 0xb0, 0xf0, 0x0c, 0x00, 0xb6, 0xf0, 0x0c, 0x00, 0xb7, 0xf0, - 0x0c, 0x00, 0xbd, 0xf0, 0x0c, 0x00, 0xbe, 0xf0, 0x0c, 0x00, 0xbf, 0xf0, - 0x0c, 0x00, 0xf0, 0xf1, 0x0c, 0x00, 0xf1, 0xf1, 0x0c, 0x00, 0xf9, 0xf1, - 0x0c, 0x00, 0xfd, 0xf1, 0x0c, 0x00, 0x78, 0xf2, 0x0c, 0x00, 0xab, 0xf2, - 0x0c, 0x00, 0x88, 0xf3, 0x0c, 0x00, 0x8b, 0xf3, 0x0c, 0x00, 0x91, 0xf3, - 0x0c, 0x00, 0x96, 0xf3, 0x0c, 0x00, 0x97, 0xf3, 0x0c, 0x00, 0x9d, 0xf3, - 0x0c, 0x00, 0x9e, 0xf3, 0x0c, 0x00, 0x9f, 0xf3, 0x0c, 0x00, 0x68, 0xf5, - 0x0c, 0x00, 0x6b, 0xf5, 0x0c, 0x00, 0x7e, 0xf5, 0x0c, 0x00, 0x7f, 0xf5, - 0x0c, 0x00, 0xf1, 0xf5, 0x0c, 0x00, 0xf8, 0xf5, 0x0c, 0x00, 0x87, 0xf6, - 0x0c, 0x00, 0x8b, 0xf6, 0x0c, 0x00, 0xb0, 0xf6, 0x0c, 0x00, 0xb7, 0xf6, - 0x0c, 0x00, 0xbd, 0xf6, 0x0c, 0x00, 0xbe, 0xf6, 0x0c, 0x00, 0xbf, 0xf6, - 0x0c, 0x00, 0x86, 0xf7, 0x0c, 0x00, 0x87, 0xf7, 0x0c, 0x00, 0x88, 0xf7, - 0x0c, 0x00, 0x89, 0xf7, 0x0c, 0x00, 0x8b, 0xf7, 0x0c, 0x00, 0xc7, 0xf9, - 0x0c, 0x00, 0xcb, 0xf9, 0x0c, 0x00, 0xe7, 0xf9, 0x0c, 0x00, 0xeb, 0xf9, - 0x0c, 0x00, 0xf7, 0xf9, 0x0c, 0x00, 0xf8, 0xf9, 0x0c, 0x00, 0xfc, 0xf9, - 0x0c, 0x00, 0xfe, 0xf9, 0x0c, 0x00, 0xff, 0xf9, 0x0c, 0x00, 0xc7, 0xfd, - 0x0c, 0x00, 0xcb, 0xfd, 0x0c, 0x00, 0xe7, 0xfd, 0x0c, 0x00, 0xeb, 0xfd, - 0x0c, 0x00, 0xf0, 0xfd, 0x0c, 0x00, 0xf7, 0xfd, 0x0c, 0x00, 0xfd, 0xfd, - 0x0c, 0x00, 0xfe, 0xfd, 0x0c, 0x00, 0xff, 0xfd, 0x0c, 0x00, 0x91, 0xff, - 0x0c, 0x00, 0x96, 0xff, 0x0c, 0x00, 0x97, 0xff, 0x0c, 0x00, 0x98, 0xff, - 0x0c, 0x00, 0x9c, 0xff, 0x0c, 0x00, 0x9e, 0xff, 0x0c, 0x00, 0x9f, 0xff, - 0x0c, 0x00, 0xd1, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0c, 0x00, 0xd7, 0xff, - 0x0c, 0x00, 0xd8, 0xff, 0x0c, 0x00, 0xdc, 0xff, 0x0c, 0x00, 0xde, 0xff, - 0x0c, 0x00, 0xdf, 0xff, 0x0c, 0x00, 0x8e, 0x00, 0x0d, 0x00, 0x8f, 0x00, - 0x0d, 0x00, 0xbe, 0x00, 0x0d, 0x00, 0xbf, 0x00, 0x0d, 0x00, 0x8e, 0x01, - 0x0d, 0x00, 0x8f, 0x01, 0x0d, 0x00, 0x88, 0x04, 0x0d, 0x00, 0x8b, 0x04, - 0x0d, 0x00, 0xbe, 0x04, 0x0d, 0x00, 0xbf, 0x04, 0x0d, 0x00, 0xb8, 0x06, - 0x0d, 0x00, 0xc8, 0x07, 0x0d, 0x00, 0xe8, 0x07, 0x0d, 0x00, 0xf3, 0x07, - 0x0d, 0x00, 0xfb, 0x07, 0x0d, 0x00, 0xce, 0x09, 0x0d, 0x00, 0xcf, 0x09, - 0x0d, 0x00, 0xee, 0x09, 0x0d, 0x00, 0xef, 0x09, 0x0d, 0x00, 0xf8, 0x09, - 0x0d, 0x00, 0xfc, 0x09, 0x0d, 0x00, 0xfe, 0x09, 0x0d, 0x00, 0xff, 0x09, - 0x0d, 0x00, 0x88, 0x0b, 0x0d, 0x00, 0xe8, 0x0b, 0x0d, 0x00, 0xf3, 0x0b, - 0x0d, 0x00, 0xfb, 0x0b, 0x0d, 0x00, 0xce, 0x0d, 0x0d, 0x00, 0xcf, 0x0d, - 0x0d, 0x00, 0xee, 0x0d, 0x0d, 0x00, 0xef, 0x0d, 0x0d, 0x00, 0xf8, 0x0d, - 0x0d, 0x00, 0xfc, 0x0d, 0x0d, 0x00, 0xfe, 0x0d, 0x0d, 0x00, 0xff, 0x0d, - 0x0d, 0x00, 0x8e, 0x10, 0x0d, 0x00, 0x8f, 0x10, 0x0d, 0x00, 0xbe, 0x10, - 0x0d, 0x00, 0xbf, 0x10, 0x0d, 0x00, 0x8e, 0x11, 0x0d, 0x00, 0x8f, 0x11, - 0x0d, 0x00, 0xce, 0x15, 0x0d, 0x00, 0xcf, 0x15, 0x0d, 0x00, 0xee, 0x15, - 0x0d, 0x00, 0xef, 0x15, 0x0d, 0x00, 0xf8, 0x15, 0x0d, 0x00, 0x88, 0x17, - 0x0d, 0x00, 0x88, 0x18, 0x0d, 0x00, 0x8b, 0x18, 0x0d, 0x00, 0xbe, 0x18, - 0x0d, 0x00, 0xbf, 0x18, 0x0d, 0x00, 0xb8, 0x1a, 0x0d, 0x00, 0xce, 0x1f, - 0x0d, 0x00, 0xcf, 0x1f, 0x0d, 0x00, 0xee, 0x1f, 0x0d, 0x00, 0xef, 0x1f, - 0x0d, 0x00, 0xf3, 0x1f, 0x0d, 0x00, 0xfb, 0x1f, 0x0d, 0x00, 0xcb, 0x25, - 0x0d, 0x00, 0xeb, 0x25, 0x0d, 0x00, 0xe8, 0x33, 0x0d, 0x00, 0xe9, 0x33, - 0x0d, 0x00, 0xeb, 0x33, 0x0d, 0x00, 0xf0, 0x33, 0x0d, 0x00, 0xf1, 0x33, - 0x0d, 0x00, 0xf9, 0x33, 0x0d, 0x00, 0xfd, 0x33, 0x0d, 0x00, 0xcb, 0x39, - 0x0d, 0x00, 0xeb, 0x39, 0x0d, 0x00, 0xf0, 0x39, 0x0d, 0x00, 0xf1, 0x39, - 0x0d, 0x00, 0xf9, 0x39, 0x0d, 0x00, 0xfd, 0x39, 0x0d, 0x00, 0xbe, 0x3c, - 0x0d, 0x00, 0xbf, 0x3c, 0x0d, 0x00, 0xcb, 0x3d, 0x0d, 0x00, 0xeb, 0x3d, - 0x0d, 0x00, 0xf0, 0x3d, 0x0d, 0x00, 0xf1, 0x3d, 0x0d, 0x00, 0xf9, 0x3d, - 0x0d, 0x00, 0xfd, 0x3d, 0x0d, 0x00, 0xbe, 0x3e, 0x0d, 0x00, 0xbf, 0x3e, - 0x0d, 0x00, 0xf6, 0x41, 0x0d, 0x00, 0xf7, 0x41, 0x0d, 0x00, 0xf8, 0x41, - 0x0d, 0x00, 0xfc, 0x41, 0x0d, 0x00, 0xfe, 0x41, 0x0d, 0x00, 0xff, 0x41, - 0x0d, 0x00, 0x88, 0x43, 0x0d, 0x00, 0x8b, 0x43, 0x0d, 0x00, 0xe8, 0x43, - 0x0d, 0x00, 0xe9, 0x43, 0x0d, 0x00, 0xeb, 0x43, 0x0d, 0x00, 0xf0, 0x43, - 0x0d, 0x00, 0xf1, 0x43, 0x0d, 0x00, 0xf9, 0x43, 0x0d, 0x00, 0xfd, 0x43, - 0x0d, 0x00, 0xf0, 0x45, 0x0d, 0x00, 0xf1, 0x45, 0x0d, 0x00, 0xf9, 0x45, - 0x0d, 0x00, 0xfd, 0x45, 0x0d, 0x00, 0x86, 0x47, 0x0d, 0x00, 0x87, 0x47, - 0x0d, 0x00, 0x88, 0x47, 0x0d, 0x00, 0x89, 0x47, 0x0d, 0x00, 0x8b, 0x47, - 0x0d, 0x00, 0xc7, 0x49, 0x0d, 0x00, 0xcb, 0x49, 0x0d, 0x00, 0xe7, 0x49, - 0x0d, 0x00, 0xeb, 0x49, 0x0d, 0x00, 0xf7, 0x49, 0x0d, 0x00, 0xf8, 0x49, - 0x0d, 0x00, 0xfc, 0x49, 0x0d, 0x00, 0xfe, 0x49, 0x0d, 0x00, 0xff, 0x49, - 0x0d, 0x00, 0x86, 0x4b, 0x0d, 0x00, 0x87, 0x4b, 0x0d, 0x00, 0x88, 0x4b, - 0x0d, 0x00, 0x89, 0x4b, 0x0d, 0x00, 0x8b, 0x4b, 0x0d, 0x00, 0xf1, 0x4b, - 0x0d, 0x00, 0xf8, 0x4b, 0x0d, 0x00, 0xc7, 0x4d, 0x0d, 0x00, 0xcb, 0x4d, - 0x0d, 0x00, 0xe7, 0x4d, 0x0d, 0x00, 0xeb, 0x4d, 0x0d, 0x00, 0xf0, 0x4d, - 0x0d, 0x00, 0xf7, 0x4d, 0x0d, 0x00, 0xfd, 0x4d, 0x0d, 0x00, 0xfe, 0x4d, - 0x0d, 0x00, 0xff, 0x4d, 0x0d, 0x00, 0x88, 0x4f, 0x0d, 0x00, 0x8b, 0x4f, - 0x0d, 0x00, 0xb8, 0x52, 0x0d, 0x00, 0x88, 0x53, 0x0d, 0x00, 0x8b, 0x53, - 0x0d, 0x00, 0x88, 0x5f, 0x0d, 0x00, 0x8b, 0x5f, 0x0d, 0x00, 0xc8, 0x5f, - 0x0d, 0x00, 0xc9, 0x5f, 0x0d, 0x00, 0xcb, 0x5f, 0x0d, 0x00, 0xe8, 0x5f, - 0x0d, 0x00, 0xe9, 0x5f, 0x0d, 0x00, 0xeb, 0x5f, 0x0d, 0x00, 0xf0, 0x5f, - 0x0d, 0x00, 0xf1, 0x5f, 0x0d, 0x00, 0xf9, 0x5f, 0x0d, 0x00, 0xfd, 0x5f, - 0x0d, 0x00, 0xf3, 0x61, 0x0d, 0x00, 0xfb, 0x61, 0x0d, 0x00, 0xee, 0x63, - 0x0d, 0x00, 0xef, 0x63, 0x0d, 0x00, 0xf8, 0x63, 0x0d, 0x00, 0xce, 0x65, - 0x0d, 0x00, 0xcf, 0x65, 0x0d, 0x00, 0xee, 0x65, 0x0d, 0x00, 0xef, 0x65, - 0x0d, 0x00, 0xf8, 0x65, 0x0d, 0x00, 0x88, 0x67, 0x0d, 0x00, 0xf4, 0x69, - 0x0d, 0x00, 0xf5, 0x69, 0x0d, 0x00, 0xf8, 0x69, 0x0d, 0x00, 0xfc, 0x69, - 0x0d, 0x00, 0xfe, 0x69, 0x0d, 0x00, 0xff, 0x69, 0x0d, 0x00, 0x88, 0x6b, - 0x0d, 0x00, 0xe8, 0x6b, 0x0d, 0x00, 0xfe, 0x6b, 0x0d, 0x00, 0xff, 0x6b, - 0x0d, 0x00, 0xfe, 0x6d, 0x0d, 0x00, 0xff, 0x6d, 0x0d, 0x00, 0xf8, 0x71, - 0x0d, 0x00, 0xfc, 0x71, 0x0d, 0x00, 0xfe, 0x71, 0x0d, 0x00, 0xff, 0x71, - 0x0d, 0x00, 0xee, 0x73, 0x0d, 0x00, 0xef, 0x73, 0x0d, 0x00, 0xf8, 0x73, - 0x0d, 0x00, 0xce, 0x75, 0x0d, 0x00, 0xcf, 0x75, 0x0d, 0x00, 0xee, 0x75, - 0x0d, 0x00, 0xef, 0x75, 0x0d, 0x00, 0xf8, 0x75, 0x0d, 0x00, 0x88, 0x77, - 0x0d, 0x00, 0xce, 0x79, 0x0d, 0x00, 0xcf, 0x79, 0x0d, 0x00, 0xee, 0x79, - 0x0d, 0x00, 0xef, 0x79, 0x0d, 0x00, 0xf3, 0x79, 0x0d, 0x00, 0xfb, 0x79, - 0x0d, 0x00, 0x88, 0x7b, 0x0d, 0x00, 0xe8, 0x7b, 0x0d, 0x00, 0xfe, 0x7b, - 0x0d, 0x00, 0xff, 0x7b, 0x0d, 0x00, 0xce, 0x7d, 0x0d, 0x00, 0xcf, 0x7d, - 0x0d, 0x00, 0xee, 0x7d, 0x0d, 0x00, 0xef, 0x7d, 0x0d, 0x00, 0xf8, 0x7d, - 0x0d, 0x00, 0xcd, 0x85, 0x0d, 0x00, 0xe3, 0x85, 0x0d, 0x00, 0xed, 0x85, - 0x0d, 0x00, 0xf1, 0x85, 0x0d, 0x00, 0xf3, 0x85, 0x0d, 0x00, 0xf9, 0x85, - 0x0d, 0x00, 0xfb, 0x85, 0x0d, 0x00, 0xfd, 0x85, 0x0d, 0x00, 0x83, 0x87, - 0x0d, 0x00, 0x87, 0x87, 0x0d, 0x00, 0x8d, 0x87, 0x0d, 0x00, 0x87, 0x8a, - 0x0d, 0x00, 0xb3, 0x8a, 0x0d, 0x00, 0xb7, 0x8a, 0x0d, 0x00, 0xbb, 0x8a, - 0x0d, 0x00, 0xe3, 0x9f, 0x0d, 0x00, 0xf3, 0x9f, 0x0d, 0x00, 0xfb, 0x9f, - 0x0d, 0x00, 0xf8, 0xa7, 0x0d, 0x00, 0xfc, 0xa7, 0x0d, 0x00, 0xfe, 0xa7, - 0x0d, 0x00, 0xff, 0xa7, 0x0d, 0x00, 0x8b, 0xab, 0x0d, 0x00, 0xeb, 0xab, - 0x0d, 0x00, 0xbf, 0xb2, 0x0d, 0x00, 0xb8, 0xb8, 0x0d, 0x00, 0xbc, 0xb8, - 0x0d, 0x00, 0xbe, 0xb8, 0x0d, 0x00, 0xbf, 0xb8, 0x0d, 0x00, 0x8b, 0xb9, - 0x0d, 0x00, 0xb7, 0xba, 0x0d, 0x00, 0xb8, 0xbc, 0x0d, 0x00, 0xbc, 0xbc, - 0x0d, 0x00, 0xbe, 0xbc, 0x0d, 0x00, 0xbf, 0xbc, 0x0d, 0x00, 0xbf, 0xbe, - 0x0d, 0x00, 0xc7, 0xbf, 0x0d, 0x00, 0xcb, 0xbf, 0x0d, 0x00, 0xe7, 0xbf, - 0x0d, 0x00, 0xeb, 0xbf, 0x0d, 0x00, 0xf0, 0xbf, 0x0d, 0x00, 0xf1, 0xbf, - 0x0d, 0x00, 0xf7, 0xbf, 0x0d, 0x00, 0xf9, 0xbf, 0x0d, 0x00, 0xfd, 0xbf, - 0x0d, 0x00, 0xe3, 0xdf, 0x0d, 0x00, 0xf3, 0xdf, 0x0d, 0x00, 0xfb, 0xdf, - 0x0d, 0x00, 0x84, 0xe5, 0x0d, 0x00, 0x8b, 0xe5, 0x0d, 0x00, 0x8f, 0xe5, - 0x0d, 0x00, 0xcb, 0xe5, 0x0d, 0x00, 0xcf, 0xe5, 0x0d, 0x00, 0xeb, 0xe5, - 0x0d, 0x00, 0xef, 0xe5, 0x0d, 0x00, 0xff, 0xe5, 0x0d, 0x00, 0xe1, 0xf3, - 0x0d, 0x00, 0xe2, 0xf3, 0x0d, 0x00, 0xed, 0xf3, 0x0d, 0x00, 0xee, 0xf3, - 0x0d, 0x00, 0xef, 0xf3, 0x0d, 0x00, 0xf2, 0xf3, 0x0d, 0x00, 0xf8, 0xf3, - 0x0d, 0x00, 0xfa, 0xf3, 0x0d, 0x00, 0xfc, 0xf3, 0x0d, 0x00, 0xfe, 0xf3, - 0x0d, 0x00, 0xff, 0xf3, 0x0d, 0x00, 0xcf, 0xf9, 0x0d, 0x00, 0xef, 0xf9, - 0x0d, 0x00, 0xff, 0xf9, 0x0d, 0x00, 0xb3, 0xfc, 0x0d, 0x00, 0xbb, 0xfc, - 0x0d, 0x00, 0xcb, 0xfd, 0x0d, 0x00, 0xcf, 0xfd, 0x0d, 0x00, 0xeb, 0xfd, - 0x0d, 0x00, 0xef, 0xfd, 0x0d, 0x00, 0xff, 0xfd, 0x0d, 0x00, 0xb3, 0xfe, - 0x0d, 0x00, 0xbb, 0xfe, 0x0d, 0x00, 0x68, 0x00, 0x0e, 0x00, 0x6b, 0x00, - 0x0e, 0x00, 0x78, 0x00, 0x0e, 0x00, 0x7c, 0x00, 0x0e, 0x00, 0x7e, 0x00, - 0x0e, 0x00, 0x7f, 0x00, 0x0e, 0x00, 0x88, 0x00, 0x0e, 0x00, 0x8b, 0x00, - 0x0e, 0x00, 0x88, 0x01, 0x0e, 0x00, 0x8b, 0x01, 0x0e, 0x00, 0xd8, 0x01, - 0x0e, 0x00, 0xdc, 0x01, 0x0e, 0x00, 0xde, 0x01, 0x0e, 0x00, 0xdf, 0x01, - 0x0e, 0x00, 0xe8, 0x01, 0x0e, 0x00, 0xeb, 0x01, 0x0e, 0x00, 0xf8, 0x01, - 0x0e, 0x00, 0xfc, 0x01, 0x0e, 0x00, 0xfe, 0x01, 0x0e, 0x00, 0xff, 0x01, - 0x0e, 0x00, 0x98, 0x02, 0x0e, 0x00, 0x9c, 0x02, 0x0e, 0x00, 0x9e, 0x02, - 0x0e, 0x00, 0x9f, 0x02, 0x0e, 0x00, 0xd8, 0x03, 0x0e, 0x00, 0xdc, 0x03, - 0x0e, 0x00, 0xde, 0x03, 0x0e, 0x00, 0xdf, 0x03, 0x0e, 0x00, 0xe8, 0x03, - 0x0e, 0x00, 0xeb, 0x03, 0x0e, 0x00, 0xf8, 0x03, 0x0e, 0x00, 0xfc, 0x03, - 0x0e, 0x00, 0xfe, 0x03, 0x0e, 0x00, 0xff, 0x03, 0x0e, 0x00, 0x98, 0x05, - 0x0e, 0x00, 0x9c, 0x05, 0x0e, 0x00, 0x9e, 0x05, 0x0e, 0x00, 0x9f, 0x05, - 0x0e, 0x00, 0xb8, 0x06, 0x0e, 0x00, 0xbc, 0x06, 0x0e, 0x00, 0xbe, 0x06, - 0x0e, 0x00, 0xbf, 0x06, 0x0e, 0x00, 0x98, 0x07, 0x0e, 0x00, 0x9c, 0x07, - 0x0e, 0x00, 0x9e, 0x07, 0x0e, 0x00, 0x9f, 0x07, 0x0e, 0x00, 0x98, 0x08, - 0x0e, 0x00, 0x9c, 0x08, 0x0e, 0x00, 0x9e, 0x08, 0x0e, 0x00, 0x9f, 0x08, - 0x0e, 0x00, 0xdf, 0x0d, 0x0e, 0x00, 0xeb, 0x0d, 0x0e, 0x00, 0xf8, 0x0d, - 0x0e, 0x00, 0xfc, 0x0d, 0x0e, 0x00, 0xfe, 0x0d, 0x0e, 0x00, 0xff, 0x0d, - 0x0e, 0x00, 0x68, 0x10, 0x0e, 0x00, 0x6b, 0x10, 0x0e, 0x00, 0x88, 0x10, - 0x0e, 0x00, 0x8b, 0x10, 0x0e, 0x00, 0xbe, 0x10, 0x0e, 0x00, 0xbf, 0x10, - 0x0e, 0x00, 0xc8, 0x11, 0x0e, 0x00, 0xcb, 0x11, 0x0e, 0x00, 0xe8, 0x11, - 0x0e, 0x00, 0xeb, 0x11, 0x0e, 0x00, 0xf8, 0x11, 0x0e, 0x00, 0xfc, 0x11, - 0x0e, 0x00, 0xfe, 0x11, 0x0e, 0x00, 0xff, 0x11, 0x0e, 0x00, 0xd8, 0x13, - 0x0e, 0x00, 0xdc, 0x13, 0x0e, 0x00, 0xde, 0x13, 0x0e, 0x00, 0xdf, 0x13, - 0x0e, 0x00, 0xf8, 0x13, 0x0e, 0x00, 0xfc, 0x13, 0x0e, 0x00, 0xfe, 0x13, - 0x0e, 0x00, 0xff, 0x13, 0x0e, 0x00, 0xcb, 0x15, 0x0e, 0x00, 0xeb, 0x15, - 0x0e, 0x00, 0x08, 0x17, 0x0e, 0x00, 0x0b, 0x17, 0x0e, 0x00, 0x78, 0x18, - 0x0e, 0x00, 0x7c, 0x18, 0x0e, 0x00, 0x7e, 0x18, 0x0e, 0x00, 0x7f, 0x18, - 0x0e, 0x00, 0xb8, 0x18, 0x0e, 0x00, 0x68, 0x1a, 0x0e, 0x00, 0x6b, 0x1a, - 0x0e, 0x00, 0x98, 0x1b, 0x0e, 0x00, 0x9c, 0x1b, 0x0e, 0x00, 0x9e, 0x1b, - 0x0e, 0x00, 0x9f, 0x1b, 0x0e, 0x00, 0xc8, 0x1f, 0x0e, 0x00, 0xcb, 0x1f, - 0x0e, 0x00, 0xe8, 0x1f, 0x0e, 0x00, 0xeb, 0x1f, 0x0e, 0x00, 0xf8, 0x1f, - 0x0e, 0x00, 0xfc, 0x1f, 0x0e, 0x00, 0xfe, 0x1f, 0x0e, 0x00, 0xff, 0x1f, - 0x0e, 0x00, 0x98, 0x22, 0x0e, 0x00, 0x9c, 0x22, 0x0e, 0x00, 0x9e, 0x22, - 0x0e, 0x00, 0x9f, 0x22, 0x0e, 0x00, 0xd8, 0x23, 0x0e, 0x00, 0xdc, 0x23, - 0x0e, 0x00, 0xde, 0x23, 0x0e, 0x00, 0xdf, 0x23, 0x0e, 0x00, 0xe8, 0x23, - 0x0e, 0x00, 0xeb, 0x23, 0x0e, 0x00, 0xf8, 0x23, 0x0e, 0x00, 0xfc, 0x23, - 0x0e, 0x00, 0xfe, 0x23, 0x0e, 0x00, 0xff, 0x23, 0x0e, 0x00, 0xb8, 0x26, - 0x0e, 0x00, 0xbc, 0x26, 0x0e, 0x00, 0xbe, 0x26, 0x0e, 0x00, 0xbf, 0x26, - 0x0e, 0x00, 0xb8, 0x28, 0x0e, 0x00, 0x98, 0x29, 0x0e, 0x00, 0x9c, 0x29, - 0x0e, 0x00, 0x9e, 0x29, 0x0e, 0x00, 0x9f, 0x29, 0x0e, 0x00, 0xd8, 0x29, - 0x0e, 0x00, 0xdc, 0x29, 0x0e, 0x00, 0xde, 0x29, 0x0e, 0x00, 0xdf, 0x29, - 0x0e, 0x00, 0xe8, 0x2b, 0x0e, 0x00, 0xeb, 0x2b, 0x0e, 0x00, 0x98, 0x2d, - 0x0e, 0x00, 0x9c, 0x2d, 0x0e, 0x00, 0x9e, 0x2d, 0x0e, 0x00, 0x9f, 0x2d, - 0x0e, 0x00, 0xd8, 0x2d, 0x0e, 0x00, 0xdc, 0x2d, 0x0e, 0x00, 0xde, 0x2d, - 0x0e, 0x00, 0xdf, 0x2d, 0x0e, 0x00, 0x98, 0x2e, 0x0e, 0x00, 0x9c, 0x2e, - 0x0e, 0x00, 0x9e, 0x2e, 0x0e, 0x00, 0x9f, 0x2e, 0x0e, 0x00, 0x86, 0x30, - 0x0e, 0x00, 0x87, 0x30, 0x0e, 0x00, 0x89, 0x30, 0x0e, 0x00, 0x8a, 0x30, - 0x0e, 0x00, 0xb6, 0x30, 0x0e, 0x00, 0xb7, 0x30, 0x0e, 0x00, 0xb8, 0x30, - 0x0e, 0x00, 0xbc, 0x30, 0x0e, 0x00, 0xbe, 0x30, 0x0e, 0x00, 0xbf, 0x30, - 0x0e, 0x00, 0x8b, 0x31, 0x0e, 0x00, 0xf0, 0x31, 0x0e, 0x00, 0xf1, 0x31, - 0x0e, 0x00, 0xf9, 0x31, 0x0e, 0x00, 0xfd, 0x31, 0x0e, 0x00, 0x68, 0x32, - 0x0e, 0x00, 0x6b, 0x32, 0x0e, 0x00, 0x78, 0x32, 0x0e, 0x00, 0x7c, 0x32, - 0x0e, 0x00, 0x7e, 0x32, 0x0e, 0x00, 0x7f, 0x32, 0x0e, 0x00, 0x90, 0x33, - 0x0e, 0x00, 0x91, 0x33, 0x0e, 0x00, 0x96, 0x33, 0x0e, 0x00, 0x97, 0x33, - 0x0e, 0x00, 0x99, 0x33, 0x0e, 0x00, 0x9d, 0x33, 0x0e, 0x00, 0x1f, 0x35, - 0x0e, 0x00, 0xdf, 0x35, 0x0e, 0x00, 0xe7, 0x35, 0x0e, 0x00, 0xeb, 0x35, - 0x0e, 0x00, 0xf7, 0x35, 0x0e, 0x00, 0xf8, 0x35, 0x0e, 0x00, 0xfc, 0x35, - 0x0e, 0x00, 0xfe, 0x35, 0x0e, 0x00, 0xff, 0x35, 0x0e, 0x00, 0x8b, 0x36, - 0x0e, 0x00, 0xb0, 0x36, 0x0e, 0x00, 0xb1, 0x36, 0x0e, 0x00, 0xb9, 0x36, - 0x0e, 0x00, 0xbd, 0x36, 0x0e, 0x00, 0x8b, 0x39, 0x0e, 0x00, 0xdf, 0x39, - 0x0e, 0x00, 0xe7, 0x39, 0x0e, 0x00, 0xeb, 0x39, 0x0e, 0x00, 0xf7, 0x39, - 0x0e, 0x00, 0xf8, 0x39, 0x0e, 0x00, 0xfc, 0x39, 0x0e, 0x00, 0xfe, 0x39, - 0x0e, 0x00, 0xff, 0x39, 0x0e, 0x00, 0xb7, 0x3a, 0x0e, 0x00, 0xb8, 0x3a, - 0x0e, 0x00, 0xbc, 0x3a, 0x0e, 0x00, 0xbe, 0x3a, 0x0e, 0x00, 0xbf, 0x3a, - 0x0e, 0x00, 0x88, 0x3b, 0x0e, 0x00, 0x8b, 0x3b, 0x0e, 0x00, 0xd0, 0x3d, - 0x0e, 0x00, 0xd1, 0x3d, 0x0e, 0x00, 0xd6, 0x3d, 0x0e, 0x00, 0xd7, 0x3d, - 0x0e, 0x00, 0xf0, 0x3d, 0x0e, 0x00, 0xf1, 0x3d, 0x0e, 0x00, 0xf9, 0x3d, - 0x0e, 0x00, 0xfd, 0x3d, 0x0e, 0x00, 0x88, 0x3f, 0x0e, 0x00, 0x8b, 0x3f, - 0x0e, 0x00, 0x98, 0x3f, 0x0e, 0x00, 0x9c, 0x3f, 0x0e, 0x00, 0x9e, 0x3f, - 0x0e, 0x00, 0x9f, 0x3f, 0x0e, 0x00, 0x70, 0x44, 0x0e, 0x00, 0x71, 0x44, - 0x0e, 0x00, 0x79, 0x44, 0x0e, 0x00, 0x7d, 0x44, 0x0e, 0x00, 0xb7, 0x44, - 0x0e, 0x00, 0xb8, 0x44, 0x0e, 0x00, 0xbc, 0x44, 0x0e, 0x00, 0xbe, 0x44, - 0x0e, 0x00, 0xbf, 0x44, 0x0e, 0x00, 0x77, 0x46, 0x0e, 0x00, 0x78, 0x46, - 0x0e, 0x00, 0x7c, 0x46, 0x0e, 0x00, 0x7e, 0x46, 0x0e, 0x00, 0x7f, 0x46, - 0x0e, 0x00, 0xb7, 0x46, 0x0e, 0x00, 0xb8, 0x46, 0x0e, 0x00, 0xbc, 0x46, - 0x0e, 0x00, 0xbe, 0x46, 0x0e, 0x00, 0xbf, 0x46, 0x0e, 0x00, 0x9f, 0x47, - 0x0e, 0x00, 0x67, 0x4a, 0x0e, 0x00, 0x70, 0x4a, 0x0e, 0x00, 0x71, 0x4a, - 0x0e, 0x00, 0x77, 0x4a, 0x0e, 0x00, 0x79, 0x4a, 0x0e, 0x00, 0x7d, 0x4a, - 0x0e, 0x00, 0xa7, 0x4a, 0x0e, 0x00, 0x91, 0x4b, 0x0e, 0x00, 0x96, 0x4b, - 0x0e, 0x00, 0x97, 0x4b, 0x0e, 0x00, 0x9f, 0x4b, 0x0e, 0x00, 0xdf, 0x53, - 0x0e, 0x00, 0xe7, 0x53, 0x0e, 0x00, 0xeb, 0x53, 0x0e, 0x00, 0xf7, 0x53, - 0x0e, 0x00, 0xf8, 0x53, 0x0e, 0x00, 0xfc, 0x53, 0x0e, 0x00, 0xfe, 0x53, - 0x0e, 0x00, 0xff, 0x53, 0x0e, 0x00, 0xb7, 0x58, 0x0e, 0x00, 0xb8, 0x58, - 0x0e, 0x00, 0xbc, 0x58, 0x0e, 0x00, 0xbe, 0x58, 0x0e, 0x00, 0xbf, 0x58, - 0x0e, 0x00, 0xe7, 0x5b, 0x0e, 0x00, 0xeb, 0x5b, 0x0e, 0x00, 0xf7, 0x5b, - 0x0e, 0x00, 0xf8, 0x5b, 0x0e, 0x00, 0xfc, 0x5b, 0x0e, 0x00, 0xfe, 0x5b, - 0x0e, 0x00, 0xff, 0x5b, 0x0e, 0x00, 0xb8, 0x5c, 0x0e, 0x00, 0xbc, 0x5c, - 0x0e, 0x00, 0xbe, 0x5c, 0x0e, 0x00, 0xbf, 0x5c, 0x0e, 0x00, 0x78, 0x5e, - 0x0e, 0x00, 0x7c, 0x5e, 0x0e, 0x00, 0x7e, 0x5e, 0x0e, 0x00, 0x7f, 0x5e, - 0x0e, 0x00, 0xb8, 0x5e, 0x0e, 0x00, 0xbc, 0x5e, 0x0e, 0x00, 0xbe, 0x5e, - 0x0e, 0x00, 0xbf, 0x5e, 0x0e, 0x00, 0xd0, 0x5f, 0x0e, 0x00, 0xd1, 0x5f, - 0x0e, 0x00, 0xd6, 0x5f, 0x0e, 0x00, 0xd7, 0x5f, 0x0e, 0x00, 0xf0, 0x5f, - 0x0e, 0x00, 0xf1, 0x5f, 0x0e, 0x00, 0xf9, 0x5f, 0x0e, 0x00, 0xfd, 0x5f, - 0x0e, 0x00, 0x63, 0x64, 0x0e, 0x00, 0x73, 0x64, 0x0e, 0x00, 0x7b, 0x64, - 0x0e, 0x00, 0xb3, 0x64, 0x0e, 0x00, 0xbb, 0x64, 0x0e, 0x00, 0x93, 0x65, - 0x0e, 0x00, 0x9b, 0x65, 0x0e, 0x00, 0xd3, 0x65, 0x0e, 0x00, 0xdb, 0x65, - 0x0e, 0x00, 0x63, 0x66, 0x0e, 0x00, 0x6b, 0x66, 0x0e, 0x00, 0x73, 0x66, - 0x0e, 0x00, 0x7b, 0x66, 0x0e, 0x00, 0xb3, 0x66, 0x0e, 0x00, 0xbb, 0x66, - 0x0e, 0x00, 0x6b, 0x67, 0x0e, 0x00, 0x83, 0x67, 0x0e, 0x00, 0x8e, 0x67, - 0x0e, 0x00, 0x8f, 0x67, 0x0e, 0x00, 0x9b, 0x67, 0x0e, 0x00, 0xdb, 0x67, - 0x0e, 0x00, 0x78, 0x6a, 0x0e, 0x00, 0x7c, 0x6a, 0x0e, 0x00, 0x7e, 0x6a, - 0x0e, 0x00, 0x7f, 0x6a, 0x0e, 0x00, 0x78, 0x6b, 0x0e, 0x00, 0x7c, 0x6b, - 0x0e, 0x00, 0x7e, 0x6b, 0x0e, 0x00, 0x7f, 0x6b, 0x0e, 0x00, 0xd5, 0x73, - 0x0e, 0x00, 0xee, 0x73, 0x0e, 0x00, 0xef, 0x73, 0x0e, 0x00, 0xf8, 0x73, - 0x0e, 0x00, 0xfc, 0x73, 0x0e, 0x00, 0xfe, 0x73, 0x0e, 0x00, 0xff, 0x73, - 0x0e, 0x00, 0x63, 0x78, 0x0e, 0x00, 0x73, 0x78, 0x0e, 0x00, 0x7b, 0x78, - 0x0e, 0x00, 0x8b, 0x78, 0x0e, 0x00, 0xb4, 0x78, 0x0e, 0x00, 0xb8, 0x78, - 0x0e, 0x00, 0x9b, 0x79, 0x0e, 0x00, 0xdb, 0x79, 0x0e, 0x00, 0x73, 0x7a, - 0x0e, 0x00, 0x7b, 0x7a, 0x0e, 0x00, 0xa3, 0x7a, 0x0e, 0x00, 0xaf, 0x7a, - 0x0e, 0x00, 0x95, 0x7b, 0x0e, 0x00, 0x93, 0x7d, 0x0e, 0x00, 0x9b, 0x7d, - 0x0e, 0x00, 0xd3, 0x7d, 0x0e, 0x00, 0xdb, 0x7d, 0x0e, 0x00, 0xce, 0x7f, - 0x0e, 0x00, 0xcf, 0x7f, 0x0e, 0x00, 0xee, 0x7f, 0x0e, 0x00, 0xef, 0x7f, - 0x0e, 0x00, 0xf8, 0x7f, 0x0e, 0x00, 0xfc, 0x7f, 0x0e, 0x00, 0xfe, 0x7f, - 0x0e, 0x00, 0xff, 0x7f, 0x0e, 0x00, 0x71, 0x80, 0x0e, 0x00, 0x73, 0x80, - 0x0e, 0x00, 0x79, 0x80, 0x0e, 0x00, 0x7b, 0x80, 0x0e, 0x00, 0x7d, 0x80, - 0x0e, 0x00, 0x87, 0x80, 0x0e, 0x00, 0xb1, 0x80, 0x0e, 0x00, 0xb8, 0x80, - 0x0e, 0x00, 0x0d, 0x81, 0x0e, 0x00, 0x0e, 0x81, 0x0e, 0x00, 0x0f, 0x81, - 0x0e, 0x00, 0x8d, 0x81, 0x0e, 0x00, 0x8e, 0x81, 0x0e, 0x00, 0x8f, 0x81, - 0x0e, 0x00, 0xd6, 0x81, 0x0e, 0x00, 0xf1, 0x81, 0x0e, 0x00, 0xf3, 0x81, - 0x0e, 0x00, 0xf9, 0x81, 0x0e, 0x00, 0xfb, 0x81, 0x0e, 0x00, 0xfd, 0x81, - 0x0e, 0x00, 0x96, 0x82, 0x0e, 0x00, 0x8e, 0x83, 0x0e, 0x00, 0x8f, 0x83, - 0x0e, 0x00, 0xd0, 0x83, 0x0e, 0x00, 0xdf, 0x83, 0x0e, 0x00, 0xe1, 0x83, - 0x0e, 0x00, 0xe2, 0x83, 0x0e, 0x00, 0xe7, 0x83, 0x0e, 0x00, 0xed, 0x83, - 0x0e, 0x00, 0xee, 0x83, 0x0e, 0x00, 0xef, 0x83, 0x0e, 0x00, 0xf2, 0x83, - 0x0e, 0x00, 0xf7, 0x83, 0x0e, 0x00, 0xf8, 0x83, 0x0e, 0x00, 0xfa, 0x83, - 0x0e, 0x00, 0xfc, 0x83, 0x0e, 0x00, 0xfe, 0x83, 0x0e, 0x00, 0xff, 0x83, - 0x0e, 0x00, 0x71, 0x84, 0x0e, 0x00, 0x73, 0x84, 0x0e, 0x00, 0x79, 0x84, - 0x0e, 0x00, 0x7b, 0x84, 0x0e, 0x00, 0x7d, 0x84, 0x0e, 0x00, 0xb1, 0x84, - 0x0e, 0x00, 0xb8, 0x84, 0x0e, 0x00, 0x1f, 0x85, 0x0e, 0x00, 0x6b, 0x85, - 0x0e, 0x00, 0x90, 0x85, 0x0e, 0x00, 0x9f, 0x85, 0x0e, 0x00, 0x71, 0x86, - 0x0e, 0x00, 0x73, 0x86, 0x0e, 0x00, 0x79, 0x86, 0x0e, 0x00, 0x7b, 0x86, - 0x0e, 0x00, 0x7d, 0x86, 0x0e, 0x00, 0xb1, 0x86, 0x0e, 0x00, 0xb8, 0x86, - 0x0e, 0x00, 0x07, 0x87, 0x0e, 0x00, 0x0b, 0x87, 0x0e, 0x00, 0x6b, 0x87, - 0x0e, 0x00, 0x70, 0x87, 0x0e, 0x00, 0x71, 0x87, 0x0e, 0x00, 0x79, 0x87, - 0x0e, 0x00, 0x7d, 0x87, 0x0e, 0x00, 0x96, 0x87, 0x0e, 0x00, 0x96, 0x88, - 0x0e, 0x00, 0x9f, 0x88, 0x0e, 0x00, 0x03, 0x89, 0x0e, 0x00, 0x83, 0x89, - 0x0e, 0x00, 0xd7, 0x89, 0x0e, 0x00, 0xdf, 0x89, 0x0e, 0x00, 0xe3, 0x89, - 0x0e, 0x00, 0xe7, 0x89, 0x0e, 0x00, 0xf3, 0x89, 0x0e, 0x00, 0xf7, 0x89, - 0x0e, 0x00, 0xfb, 0x89, 0x0e, 0x00, 0x11, 0x8b, 0x0e, 0x00, 0x16, 0x8b, - 0x0e, 0x00, 0x17, 0x8b, 0x0e, 0x00, 0x1f, 0x8b, 0x0e, 0x00, 0xd0, 0x8b, - 0x0e, 0x00, 0xe1, 0x8b, 0x0e, 0x00, 0xe2, 0x8b, 0x0e, 0x00, 0xed, 0x8b, - 0x0e, 0x00, 0xee, 0x8b, 0x0e, 0x00, 0xef, 0x8b, 0x0e, 0x00, 0xf2, 0x8b, - 0x0e, 0x00, 0xf8, 0x8b, 0x0e, 0x00, 0xfa, 0x8b, 0x0e, 0x00, 0xfc, 0x8b, - 0x0e, 0x00, 0xfe, 0x8b, 0x0e, 0x00, 0xff, 0x8b, 0x0e, 0x00, 0x6b, 0x8c, - 0x0e, 0x00, 0x6f, 0x8c, 0x0e, 0x00, 0x7f, 0x8c, 0x0e, 0x00, 0x84, 0x8c, - 0x0e, 0x00, 0x8e, 0x8c, 0x0e, 0x00, 0x8f, 0x8c, 0x0e, 0x00, 0xbe, 0x8c, - 0x0e, 0x00, 0xbf, 0x8c, 0x0e, 0x00, 0x03, 0x8d, 0x0e, 0x00, 0x83, 0x8d, - 0x0e, 0x00, 0xd7, 0x8d, 0x0e, 0x00, 0xdf, 0x8d, 0x0e, 0x00, 0xe3, 0x8d, - 0x0e, 0x00, 0xe7, 0x8d, 0x0e, 0x00, 0xf3, 0x8d, 0x0e, 0x00, 0xf7, 0x8d, - 0x0e, 0x00, 0xfb, 0x8d, 0x0e, 0x00, 0x6e, 0x8e, 0x0e, 0x00, 0x6f, 0x8e, - 0x0e, 0x00, 0x78, 0x8e, 0x0e, 0x00, 0x7c, 0x8e, 0x0e, 0x00, 0x7e, 0x8e, - 0x0e, 0x00, 0x7f, 0x8e, 0x0e, 0x00, 0x84, 0x8e, 0x0e, 0x00, 0x8b, 0x8e, - 0x0e, 0x00, 0x8f, 0x8e, 0x0e, 0x00, 0xb3, 0x8e, 0x0e, 0x00, 0xbb, 0x8e, - 0x0e, 0x00, 0xbf, 0x8e, 0x0e, 0x00, 0x73, 0x8f, 0x0e, 0x00, 0x7b, 0x8f, - 0x0e, 0x00, 0x96, 0x8f, 0x0e, 0x00, 0x9f, 0x8f, 0x0e, 0x00, 0x84, 0x91, - 0x0e, 0x00, 0xd5, 0x93, 0x0e, 0x00, 0xee, 0x93, 0x0e, 0x00, 0xef, 0x93, - 0x0e, 0x00, 0xf8, 0x93, 0x0e, 0x00, 0xc3, 0x95, 0x0e, 0x00, 0xe3, 0x95, - 0x0e, 0x00, 0xf3, 0x95, 0x0e, 0x00, 0xfb, 0x95, 0x0e, 0x00, 0xff, 0x95, - 0x0e, 0x00, 0x83, 0x96, 0x0e, 0x00, 0xb4, 0x96, 0x0e, 0x00, 0x84, 0x97, - 0x0e, 0x00, 0x8e, 0x97, 0x0e, 0x00, 0x8f, 0x97, 0x0e, 0x00, 0x8b, 0x98, - 0x0e, 0x00, 0xb4, 0x98, 0x0e, 0x00, 0xbe, 0x98, 0x0e, 0x00, 0xbf, 0x98, - 0x0e, 0x00, 0x95, 0x99, 0x0e, 0x00, 0xd5, 0x99, 0x0e, 0x00, 0x8b, 0x9a, - 0x0e, 0x00, 0xb4, 0x9a, 0x0e, 0x00, 0xbe, 0x9a, 0x0e, 0x00, 0xbf, 0x9a, - 0x0e, 0x00, 0xe4, 0x9b, 0x0e, 0x00, 0xf4, 0x9b, 0x0e, 0x00, 0xfe, 0x9b, - 0x0e, 0x00, 0xff, 0x9b, 0x0e, 0x00, 0x95, 0x9d, 0x0e, 0x00, 0xd5, 0x9d, - 0x0e, 0x00, 0xce, 0x9f, 0x0e, 0x00, 0xcf, 0x9f, 0x0e, 0x00, 0xee, 0x9f, - 0x0e, 0x00, 0xef, 0x9f, 0x0e, 0x00, 0xf3, 0x9f, 0x0e, 0x00, 0xfb, 0x9f, - 0x0e, 0x00, 0x6b, 0xa4, 0x0e, 0x00, 0x6f, 0xa4, 0x0e, 0x00, 0x7f, 0xa4, - 0x0e, 0x00, 0xbe, 0xa4, 0x0e, 0x00, 0xbf, 0xa4, 0x0e, 0x00, 0x94, 0xa5, - 0x0e, 0x00, 0x9f, 0xa5, 0x0e, 0x00, 0x6e, 0xa6, 0x0e, 0x00, 0x6f, 0xa6, - 0x0e, 0x00, 0x78, 0xa6, 0x0e, 0x00, 0x7c, 0xa6, 0x0e, 0x00, 0x7e, 0xa6, - 0x0e, 0x00, 0x7f, 0xa6, 0x0e, 0x00, 0xb3, 0xa6, 0x0e, 0x00, 0xbb, 0xa6, - 0x0e, 0x00, 0xbf, 0xa6, 0x0e, 0x00, 0x0b, 0xa7, 0x0e, 0x00, 0x6b, 0xa7, - 0x0e, 0x00, 0x78, 0xa7, 0x0e, 0x00, 0x7c, 0xa7, 0x0e, 0x00, 0x7e, 0xa7, - 0x0e, 0x00, 0x7f, 0xa7, 0x0e, 0x00, 0x9f, 0xa7, 0x0e, 0x00, 0xb8, 0xaa, - 0x0e, 0x00, 0x8e, 0xab, 0x0e, 0x00, 0x8f, 0xab, 0x0e, 0x00, 0xd5, 0xab, - 0x0e, 0x00, 0xee, 0xab, 0x0e, 0x00, 0xef, 0xab, 0x0e, 0x00, 0xf8, 0xab, - 0x0e, 0x00, 0x97, 0xb2, 0x0e, 0x00, 0x9f, 0xb2, 0x0e, 0x00, 0x1f, 0xb3, - 0x0e, 0x00, 0xd6, 0xb3, 0x0e, 0x00, 0xdf, 0xb3, 0x0e, 0x00, 0xe7, 0xb3, - 0x0e, 0x00, 0xf1, 0xb3, 0x0e, 0x00, 0xf3, 0xb3, 0x0e, 0x00, 0xf7, 0xb3, - 0x0e, 0x00, 0xf9, 0xb3, 0x0e, 0x00, 0xfb, 0xb3, 0x0e, 0x00, 0xfd, 0xb3, - 0x0e, 0x00, 0x6b, 0xb8, 0x0e, 0x00, 0x6f, 0xb8, 0x0e, 0x00, 0x7f, 0xb8, - 0x0e, 0x00, 0xb0, 0xb8, 0x0e, 0x00, 0xbe, 0xb8, 0x0e, 0x00, 0x1f, 0xb9, - 0x0e, 0x00, 0x6b, 0xb9, 0x0e, 0x00, 0x78, 0xb9, 0x0e, 0x00, 0x7c, 0xb9, - 0x0e, 0x00, 0x7e, 0xb9, 0x0e, 0x00, 0x7f, 0xb9, 0x0e, 0x00, 0x97, 0xb9, - 0x0e, 0x00, 0x9f, 0xb9, 0x0e, 0x00, 0x61, 0xba, 0x0e, 0x00, 0x62, 0xba, - 0x0e, 0x00, 0x6d, 0xba, 0x0e, 0x00, 0x6e, 0xba, 0x0e, 0x00, 0x6f, 0xba, - 0x0e, 0x00, 0x72, 0xba, 0x0e, 0x00, 0x78, 0xba, 0x0e, 0x00, 0x7a, 0xba, - 0x0e, 0x00, 0x7c, 0xba, 0x0e, 0x00, 0x7e, 0xba, 0x0e, 0x00, 0x7f, 0xba, - 0x0e, 0x00, 0xb3, 0xba, 0x0e, 0x00, 0xbb, 0xba, 0x0e, 0x00, 0xbf, 0xba, - 0x0e, 0x00, 0x07, 0xbb, 0x0e, 0x00, 0x0b, 0xbb, 0x0e, 0x00, 0x6b, 0xbb, - 0x0e, 0x00, 0x78, 0xbb, 0x0e, 0x00, 0x7c, 0xbb, 0x0e, 0x00, 0x7e, 0xbb, - 0x0e, 0x00, 0x7f, 0xbb, 0x0e, 0x00, 0x90, 0xbb, 0x0e, 0x00, 0x91, 0xbc, - 0x0e, 0x00, 0x96, 0xbc, 0x0e, 0x00, 0x97, 0xbc, 0x0e, 0x00, 0x9f, 0xbc, - 0x0e, 0x00, 0x1f, 0xbd, 0x0e, 0x00, 0x6b, 0xbd, 0x0e, 0x00, 0x78, 0xbd, - 0x0e, 0x00, 0x7c, 0xbd, 0x0e, 0x00, 0x7e, 0xbd, 0x0e, 0x00, 0x7f, 0xbd, - 0x0e, 0x00, 0x97, 0xbd, 0x0e, 0x00, 0x9f, 0xbd, 0x0e, 0x00, 0x97, 0xbe, - 0x0e, 0x00, 0x9f, 0xbe, 0x0e, 0x00, 0x1f, 0xbf, 0x0e, 0x00, 0xd6, 0xbf, - 0x0e, 0x00, 0xdf, 0xbf, 0x0e, 0x00, 0xe7, 0xbf, 0x0e, 0x00, 0xf1, 0xbf, - 0x0e, 0x00, 0xf3, 0xbf, 0x0e, 0x00, 0xf7, 0xbf, 0x0e, 0x00, 0xf9, 0xbf, - 0x0e, 0x00, 0xfb, 0xbf, 0x0e, 0x00, 0xfd, 0xbf, 0x0e, 0x00, 0x91, 0xc2, - 0x0e, 0x00, 0x96, 0xc2, 0x0e, 0x00, 0x97, 0xc2, 0x0e, 0x00, 0x99, 0xc2, - 0x0e, 0x00, 0x9d, 0xc2, 0x0e, 0x00, 0x08, 0xc3, 0x0e, 0x00, 0x0b, 0xc3, - 0x0e, 0x00, 0x68, 0xc3, 0x0e, 0x00, 0x6b, 0xc3, 0x0e, 0x00, 0xd0, 0xc3, - 0x0e, 0x00, 0xd8, 0xc3, 0x0e, 0x00, 0xdc, 0xc3, 0x0e, 0x00, 0xde, 0xc3, - 0x0e, 0x00, 0xdf, 0xc3, 0x0e, 0x00, 0xe6, 0xc3, 0x0e, 0x00, 0xe7, 0xc3, - 0x0e, 0x00, 0xf6, 0xc3, 0x0e, 0x00, 0xf7, 0xc3, 0x0e, 0x00, 0xf8, 0xc3, - 0x0e, 0x00, 0xfc, 0xc3, 0x0e, 0x00, 0xfe, 0xc3, 0x0e, 0x00, 0xff, 0xc3, - 0x0e, 0x00, 0xb1, 0xc4, 0x0e, 0x00, 0xb8, 0xc4, 0x0e, 0x00, 0x90, 0xc5, - 0x0e, 0x00, 0x98, 0xc5, 0x0e, 0x00, 0x9c, 0xc5, 0x0e, 0x00, 0x9e, 0xc5, - 0x0e, 0x00, 0x9f, 0xc5, 0x0e, 0x00, 0xe8, 0xc7, 0x0e, 0x00, 0xe9, 0xc7, - 0x0e, 0x00, 0xeb, 0xc7, 0x0e, 0x00, 0xf0, 0xc7, 0x0e, 0x00, 0xf1, 0xc7, - 0x0e, 0x00, 0xf9, 0xc7, 0x0e, 0x00, 0xfd, 0xc7, 0x0e, 0x00, 0x0b, 0xc9, - 0x0e, 0x00, 0xf0, 0xc9, 0x0e, 0x00, 0xf1, 0xc9, 0x0e, 0x00, 0xf9, 0xc9, - 0x0e, 0x00, 0xfd, 0xc9, 0x0e, 0x00, 0x0b, 0xcd, 0x0e, 0x00, 0xf1, 0xcd, - 0x0e, 0x00, 0xf8, 0xcd, 0x0e, 0x00, 0x08, 0xcf, 0x0e, 0x00, 0x0b, 0xcf, - 0x0e, 0x00, 0x90, 0xcf, 0x0e, 0x00, 0x99, 0xcf, 0x0e, 0x00, 0x9d, 0xcf, - 0x0e, 0x00, 0xd0, 0xcf, 0x0e, 0x00, 0xd9, 0xcf, 0x0e, 0x00, 0xdd, 0xcf, - 0x0e, 0x00, 0xe8, 0xd3, 0x0e, 0x00, 0xeb, 0xd3, 0x0e, 0x00, 0xdf, 0xd5, - 0x0e, 0x00, 0xf8, 0xd5, 0x0e, 0x00, 0xfc, 0xd5, 0x0e, 0x00, 0xfe, 0xd5, - 0x0e, 0x00, 0xff, 0xd5, 0x0e, 0x00, 0x8b, 0xd6, 0x0e, 0x00, 0xbe, 0xd6, - 0x0e, 0x00, 0xbf, 0xd6, 0x0e, 0x00, 0xb8, 0xd8, 0x0e, 0x00, 0x98, 0xd9, - 0x0e, 0x00, 0x9c, 0xd9, 0x0e, 0x00, 0x9e, 0xd9, 0x0e, 0x00, 0x9f, 0xd9, - 0x0e, 0x00, 0xf8, 0xdb, 0x0e, 0x00, 0xfc, 0xdb, 0x0e, 0x00, 0xfe, 0xdb, - 0x0e, 0x00, 0xff, 0xdb, 0x0e, 0x00, 0x98, 0xdd, 0x0e, 0x00, 0x9c, 0xdd, - 0x0e, 0x00, 0x9e, 0xdd, 0x0e, 0x00, 0x9f, 0xdd, 0x0e, 0x00, 0xe8, 0xdf, - 0x0e, 0x00, 0xeb, 0xdf, 0x0e, 0x00, 0x88, 0xe2, 0x0e, 0x00, 0x8b, 0xe2, - 0x0e, 0x00, 0x91, 0xe2, 0x0e, 0x00, 0x96, 0xe2, 0x0e, 0x00, 0x97, 0xe2, - 0x0e, 0x00, 0x98, 0xe2, 0x0e, 0x00, 0x9c, 0xe2, 0x0e, 0x00, 0x9e, 0xe2, - 0x0e, 0x00, 0x9f, 0xe2, 0x0e, 0x00, 0xbe, 0xe2, 0x0e, 0x00, 0xbf, 0xe2, - 0x0e, 0x00, 0x08, 0xe3, 0x0e, 0x00, 0x0b, 0xe3, 0x0e, 0x00, 0x68, 0xe3, - 0x0e, 0x00, 0x6b, 0xe3, 0x0e, 0x00, 0x7e, 0xe3, 0x0e, 0x00, 0x7f, 0xe3, - 0x0e, 0x00, 0xd0, 0xe3, 0x0e, 0x00, 0xd8, 0xe3, 0x0e, 0x00, 0xf1, 0xe3, - 0x0e, 0x00, 0xf8, 0xe3, 0x0e, 0x00, 0x8b, 0xe5, 0x0e, 0x00, 0xc7, 0xe5, - 0x0e, 0x00, 0xcb, 0xe5, 0x0e, 0x00, 0xe7, 0xe5, 0x0e, 0x00, 0xeb, 0xe5, - 0x0e, 0x00, 0xf0, 0xe5, 0x0e, 0x00, 0xf7, 0xe5, 0x0e, 0x00, 0xfd, 0xe5, - 0x0e, 0x00, 0xfe, 0xe5, 0x0e, 0x00, 0xff, 0xe5, 0x0e, 0x00, 0xb1, 0xe6, - 0x0e, 0x00, 0xb8, 0xe6, 0x0e, 0x00, 0x86, 0xe8, 0x0e, 0x00, 0x87, 0xe8, - 0x0e, 0x00, 0x88, 0xe8, 0x0e, 0x00, 0x89, 0xe8, 0x0e, 0x00, 0x8b, 0xe8, - 0x0e, 0x00, 0xb0, 0xe8, 0x0e, 0x00, 0xb6, 0xe8, 0x0e, 0x00, 0xb7, 0xe8, - 0x0e, 0x00, 0xbd, 0xe8, 0x0e, 0x00, 0xbe, 0xe8, 0x0e, 0x00, 0xbf, 0xe8, - 0x0e, 0x00, 0x18, 0xe9, 0x0e, 0x00, 0x1c, 0xe9, 0x0e, 0x00, 0x1e, 0xe9, - 0x0e, 0x00, 0x1f, 0xe9, 0x0e, 0x00, 0x68, 0xe9, 0x0e, 0x00, 0x6b, 0xe9, - 0x0e, 0x00, 0x78, 0xe9, 0x0e, 0x00, 0x7c, 0xe9, 0x0e, 0x00, 0x7e, 0xe9, - 0x0e, 0x00, 0x7f, 0xe9, 0x0e, 0x00, 0x88, 0xe9, 0x0e, 0x00, 0x8b, 0xe9, - 0x0e, 0x00, 0x91, 0xe9, 0x0e, 0x00, 0x96, 0xe9, 0x0e, 0x00, 0x97, 0xe9, - 0x0e, 0x00, 0x98, 0xe9, 0x0e, 0x00, 0x9c, 0xe9, 0x0e, 0x00, 0x9e, 0xe9, - 0x0e, 0x00, 0x9f, 0xe9, 0x0e, 0x00, 0xd1, 0xe9, 0x0e, 0x00, 0xd6, 0xe9, - 0x0e, 0x00, 0xd7, 0xe9, 0x0e, 0x00, 0xd8, 0xe9, 0x0e, 0x00, 0xdc, 0xe9, - 0x0e, 0x00, 0xde, 0xe9, 0x0e, 0x00, 0xdf, 0xe9, 0x0e, 0x00, 0xb0, 0xea, - 0x0e, 0x00, 0xb6, 0xea, 0x0e, 0x00, 0xb7, 0xea, 0x0e, 0x00, 0xbd, 0xea, - 0x0e, 0x00, 0xbe, 0xea, 0x0e, 0x00, 0xbf, 0xea, 0x0e, 0x00, 0xe6, 0xeb, - 0x0e, 0x00, 0xe7, 0xeb, 0x0e, 0x00, 0xe8, 0xeb, 0x0e, 0x00, 0xe9, 0xeb, - 0x0e, 0x00, 0xeb, 0xeb, 0x0e, 0x00, 0xf0, 0xeb, 0x0e, 0x00, 0xf6, 0xeb, - 0x0e, 0x00, 0xf7, 0xeb, 0x0e, 0x00, 0xfd, 0xeb, 0x0e, 0x00, 0xfe, 0xeb, - 0x0e, 0x00, 0xff, 0xeb, 0x0e, 0x00, 0x78, 0xec, 0x0e, 0x00, 0x90, 0xec, - 0x0e, 0x00, 0x99, 0xec, 0x0e, 0x00, 0x9d, 0xec, 0x0e, 0x00, 0xb8, 0xec, - 0x0e, 0x00, 0x1e, 0xed, 0x0e, 0x00, 0x1f, 0xed, 0x0e, 0x00, 0x68, 0xed, - 0x0e, 0x00, 0x6b, 0xed, 0x0e, 0x00, 0x7e, 0xed, 0x0e, 0x00, 0x7f, 0xed, - 0x0e, 0x00, 0x88, 0xed, 0x0e, 0x00, 0x8b, 0xed, 0x0e, 0x00, 0x91, 0xed, - 0x0e, 0x00, 0x96, 0xed, 0x0e, 0x00, 0x97, 0xed, 0x0e, 0x00, 0x9d, 0xed, - 0x0e, 0x00, 0x9e, 0xed, 0x0e, 0x00, 0x9f, 0xed, 0x0e, 0x00, 0xd1, 0xed, - 0x0e, 0x00, 0xd6, 0xed, 0x0e, 0x00, 0xd7, 0xed, 0x0e, 0x00, 0xdd, 0xed, - 0x0e, 0x00, 0xde, 0xed, 0x0e, 0x00, 0xdf, 0xed, 0x0e, 0x00, 0x68, 0xee, - 0x0e, 0x00, 0x6b, 0xee, 0x0e, 0x00, 0x78, 0xee, 0x0e, 0x00, 0x7c, 0xee, - 0x0e, 0x00, 0x7e, 0xee, 0x0e, 0x00, 0x7f, 0xee, 0x0e, 0x00, 0x88, 0xee, - 0x0e, 0x00, 0x8b, 0xee, 0x0e, 0x00, 0x91, 0xee, 0x0e, 0x00, 0x96, 0xee, - 0x0e, 0x00, 0x97, 0xee, 0x0e, 0x00, 0x98, 0xee, 0x0e, 0x00, 0x9c, 0xee, - 0x0e, 0x00, 0x9e, 0xee, 0x0e, 0x00, 0x9f, 0xee, 0x0e, 0x00, 0xbe, 0xee, - 0x0e, 0x00, 0xbf, 0xee, 0x0e, 0x00, 0x68, 0xef, 0x0e, 0x00, 0x6b, 0xef, - 0x0e, 0x00, 0x78, 0xef, 0x0e, 0x00, 0x7c, 0xef, 0x0e, 0x00, 0x7e, 0xef, - 0x0e, 0x00, 0x7f, 0xef, 0x0e, 0x00, 0xf0, 0xef, 0x0e, 0x00, 0xf1, 0xef, - 0x0e, 0x00, 0xf9, 0xef, 0x0e, 0x00, 0xfd, 0xef, 0x0e, 0x00, 0x86, 0xf0, - 0x0e, 0x00, 0x87, 0xf0, 0x0e, 0x00, 0x88, 0xf0, 0x0e, 0x00, 0x89, 0xf0, - 0x0e, 0x00, 0x8b, 0xf0, 0x0e, 0x00, 0xb0, 0xf0, 0x0e, 0x00, 0xb6, 0xf0, - 0x0e, 0x00, 0xb7, 0xf0, 0x0e, 0x00, 0xbd, 0xf0, 0x0e, 0x00, 0xbe, 0xf0, - 0x0e, 0x00, 0xbf, 0xf0, 0x0e, 0x00, 0xf0, 0xf1, 0x0e, 0x00, 0xf1, 0xf1, - 0x0e, 0x00, 0xf9, 0xf1, 0x0e, 0x00, 0xfd, 0xf1, 0x0e, 0x00, 0x78, 0xf2, - 0x0e, 0x00, 0xab, 0xf2, 0x0e, 0x00, 0x88, 0xf3, 0x0e, 0x00, 0x8b, 0xf3, - 0x0e, 0x00, 0x91, 0xf3, 0x0e, 0x00, 0x96, 0xf3, 0x0e, 0x00, 0x97, 0xf3, - 0x0e, 0x00, 0x9d, 0xf3, 0x0e, 0x00, 0x9e, 0xf3, 0x0e, 0x00, 0x9f, 0xf3, - 0x0e, 0x00, 0x68, 0xf5, 0x0e, 0x00, 0x6b, 0xf5, 0x0e, 0x00, 0x7e, 0xf5, - 0x0e, 0x00, 0x7f, 0xf5, 0x0e, 0x00, 0xf1, 0xf5, 0x0e, 0x00, 0xf8, 0xf5, - 0x0e, 0x00, 0x87, 0xf6, 0x0e, 0x00, 0x8b, 0xf6, 0x0e, 0x00, 0xb0, 0xf6, - 0x0e, 0x00, 0xb7, 0xf6, 0x0e, 0x00, 0xbd, 0xf6, 0x0e, 0x00, 0xbe, 0xf6, - 0x0e, 0x00, 0xbf, 0xf6, 0x0e, 0x00, 0x86, 0xf7, 0x0e, 0x00, 0x87, 0xf7, - 0x0e, 0x00, 0x88, 0xf7, 0x0e, 0x00, 0x89, 0xf7, 0x0e, 0x00, 0x8b, 0xf7, - 0x0e, 0x00, 0xc7, 0xf9, 0x0e, 0x00, 0xcb, 0xf9, 0x0e, 0x00, 0xe7, 0xf9, - 0x0e, 0x00, 0xeb, 0xf9, 0x0e, 0x00, 0xf7, 0xf9, 0x0e, 0x00, 0xf8, 0xf9, - 0x0e, 0x00, 0xfc, 0xf9, 0x0e, 0x00, 0xfe, 0xf9, 0x0e, 0x00, 0xff, 0xf9, - 0x0e, 0x00, 0xc7, 0xfd, 0x0e, 0x00, 0xcb, 0xfd, 0x0e, 0x00, 0xe7, 0xfd, - 0x0e, 0x00, 0xeb, 0xfd, 0x0e, 0x00, 0xf0, 0xfd, 0x0e, 0x00, 0xf7, 0xfd, - 0x0e, 0x00, 0xfd, 0xfd, 0x0e, 0x00, 0xfe, 0xfd, 0x0e, 0x00, 0xff, 0xfd, - 0x0e, 0x00, 0x91, 0xff, 0x0e, 0x00, 0x96, 0xff, 0x0e, 0x00, 0x97, 0xff, - 0x0e, 0x00, 0x98, 0xff, 0x0e, 0x00, 0x9c, 0xff, 0x0e, 0x00, 0x9e, 0xff, - 0x0e, 0x00, 0x9f, 0xff, 0x0e, 0x00, 0xd1, 0xff, 0x0e, 0x00, 0xd6, 0xff, - 0x0e, 0x00, 0xd7, 0xff, 0x0e, 0x00, 0xd8, 0xff, 0x0e, 0x00, 0xdc, 0xff, - 0x0e, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0x18, 0x01, - 0x0f, 0x00, 0x1c, 0x01, 0x0f, 0x00, 0x1e, 0x01, 0x0f, 0x00, 0x1f, 0x01, - 0x0f, 0x00, 0x64, 0x01, 0x0f, 0x00, 0x65, 0x01, 0x0f, 0x00, 0x68, 0x01, - 0x0f, 0x00, 0x6b, 0x01, 0x0f, 0x00, 0x6c, 0x01, 0x0f, 0x00, 0x6e, 0x01, - 0x0f, 0x00, 0x6f, 0x01, 0x0f, 0x00, 0x74, 0x01, 0x0f, 0x00, 0x75, 0x01, - 0x0f, 0x00, 0x78, 0x01, 0x0f, 0x00, 0x7c, 0x01, 0x0f, 0x00, 0x7e, 0x01, - 0x0f, 0x00, 0x7f, 0x01, 0x0f, 0x00, 0x93, 0x03, 0x0f, 0x00, 0x94, 0x03, - 0x0f, 0x00, 0x95, 0x03, 0x0f, 0x00, 0x9b, 0x03, 0x0f, 0x00, 0xc3, 0x05, - 0x0f, 0x00, 0xc4, 0x05, 0x0f, 0x00, 0xc5, 0x05, 0x0f, 0x00, 0xc8, 0x05, - 0x0f, 0x00, 0xcb, 0x05, 0x0f, 0x00, 0xcc, 0x05, 0x0f, 0x00, 0xce, 0x05, - 0x0f, 0x00, 0xcf, 0x05, 0x0f, 0x00, 0xf4, 0x05, 0x0f, 0x00, 0xf5, 0x05, - 0x0f, 0x00, 0xf8, 0x05, 0x0f, 0x00, 0xfc, 0x05, 0x0f, 0x00, 0xfe, 0x05, - 0x0f, 0x00, 0xff, 0x05, 0x0f, 0x00, 0x18, 0x07, 0x0f, 0x00, 0x1c, 0x07, - 0x0f, 0x00, 0x1e, 0x07, 0x0f, 0x00, 0x1f, 0x07, 0x0f, 0x00, 0x88, 0x07, - 0x0f, 0x00, 0x8b, 0x07, 0x0f, 0x00, 0x8c, 0x07, 0x0f, 0x00, 0x8e, 0x07, - 0x0f, 0x00, 0x8f, 0x07, 0x0f, 0x00, 0xd8, 0x07, 0x0f, 0x00, 0xdc, 0x07, - 0x0f, 0x00, 0xde, 0x07, 0x0f, 0x00, 0xdf, 0x07, 0x0f, 0x00, 0xe4, 0x07, - 0x0f, 0x00, 0xe5, 0x07, 0x0f, 0x00, 0xe8, 0x07, 0x0f, 0x00, 0xeb, 0x07, - 0x0f, 0x00, 0xec, 0x07, 0x0f, 0x00, 0xee, 0x07, 0x0f, 0x00, 0xef, 0x07, - 0x0f, 0x00, 0xf4, 0x07, 0x0f, 0x00, 0xf5, 0x07, 0x0f, 0x00, 0xf8, 0x07, - 0x0f, 0x00, 0xfc, 0x07, 0x0f, 0x00, 0xfe, 0x07, 0x0f, 0x00, 0xff, 0x07, - 0x0f, 0x00, 0x98, 0x08, 0x0f, 0x00, 0x9c, 0x08, 0x0f, 0x00, 0x9e, 0x08, - 0x0f, 0x00, 0x9f, 0x08, 0x0f, 0x00, 0xdf, 0x09, 0x0f, 0x00, 0xeb, 0x09, - 0x0f, 0x00, 0xee, 0x09, 0x0f, 0x00, 0xef, 0x09, 0x0f, 0x00, 0xf8, 0x09, - 0x0f, 0x00, 0xfc, 0x09, 0x0f, 0x00, 0xfe, 0x09, 0x0f, 0x00, 0xff, 0x09, - 0x0f, 0x00, 0x9f, 0x0a, 0x0f, 0x00, 0x83, 0x0b, 0x0f, 0x00, 0x84, 0x0b, - 0x0f, 0x00, 0x85, 0x0b, 0x0f, 0x00, 0xd3, 0x0b, 0x0f, 0x00, 0xd4, 0x0b, - 0x0f, 0x00, 0xd5, 0x0b, 0x0f, 0x00, 0xdb, 0x0b, 0x0f, 0x00, 0xe3, 0x0b, - 0x0f, 0x00, 0xf3, 0x0b, 0x0f, 0x00, 0xfb, 0x0b, 0x0f, 0x00, 0xd3, 0x0d, - 0x0f, 0x00, 0xd4, 0x0d, 0x0f, 0x00, 0xd5, 0x0d, 0x0f, 0x00, 0xdb, 0x0d, - 0x0f, 0x00, 0xe3, 0x0d, 0x0f, 0x00, 0xf3, 0x0d, 0x0f, 0x00, 0xfb, 0x0d, - 0x0f, 0x00, 0x98, 0x0f, 0x0f, 0x00, 0x9c, 0x0f, 0x0f, 0x00, 0x9e, 0x0f, - 0x0f, 0x00, 0x9f, 0x0f, 0x0f, 0x00, 0x18, 0x11, 0x0f, 0x00, 0x1c, 0x11, - 0x0f, 0x00, 0x1e, 0x11, 0x0f, 0x00, 0x1f, 0x11, 0x0f, 0x00, 0x64, 0x11, - 0x0f, 0x00, 0x65, 0x11, 0x0f, 0x00, 0x68, 0x11, 0x0f, 0x00, 0x6b, 0x11, - 0x0f, 0x00, 0x6c, 0x11, 0x0f, 0x00, 0x6e, 0x11, 0x0f, 0x00, 0x6f, 0x11, - 0x0f, 0x00, 0x74, 0x11, 0x0f, 0x00, 0x75, 0x11, 0x0f, 0x00, 0x78, 0x11, - 0x0f, 0x00, 0x7c, 0x11, 0x0f, 0x00, 0x7e, 0x11, 0x0f, 0x00, 0x7f, 0x11, - 0x0f, 0x00, 0x95, 0x13, 0x0f, 0x00, 0x98, 0x13, 0x0f, 0x00, 0x9c, 0x13, - 0x0f, 0x00, 0x9e, 0x13, 0x0f, 0x00, 0x9f, 0x13, 0x0f, 0x00, 0x93, 0x14, - 0x0f, 0x00, 0x94, 0x14, 0x0f, 0x00, 0x95, 0x14, 0x0f, 0x00, 0x9b, 0x14, - 0x0f, 0x00, 0xce, 0x15, 0x0f, 0x00, 0xcf, 0x15, 0x0f, 0x00, 0xee, 0x15, - 0x0f, 0x00, 0xef, 0x15, 0x0f, 0x00, 0xf8, 0x15, 0x0f, 0x00, 0xfc, 0x15, - 0x0f, 0x00, 0xfe, 0x15, 0x0f, 0x00, 0xff, 0x15, 0x0f, 0x00, 0x93, 0x16, - 0x0f, 0x00, 0x94, 0x16, 0x0f, 0x00, 0x95, 0x16, 0x0f, 0x00, 0x9b, 0x16, - 0x0f, 0x00, 0x08, 0x17, 0x0f, 0x00, 0x0b, 0x17, 0x0f, 0x00, 0x0c, 0x17, - 0x0f, 0x00, 0x0e, 0x17, 0x0f, 0x00, 0x0f, 0x17, 0x0f, 0x00, 0x13, 0x17, - 0x0f, 0x00, 0x14, 0x17, 0x0f, 0x00, 0x15, 0x17, 0x0f, 0x00, 0x1b, 0x17, - 0x0f, 0x00, 0xc3, 0x17, 0x0f, 0x00, 0xc4, 0x17, 0x0f, 0x00, 0xc5, 0x17, - 0x0f, 0x00, 0xc8, 0x17, 0x0f, 0x00, 0xcb, 0x17, 0x0f, 0x00, 0xcc, 0x17, - 0x0f, 0x00, 0xce, 0x17, 0x0f, 0x00, 0xcf, 0x17, 0x0f, 0x00, 0xe4, 0x17, - 0x0f, 0x00, 0xe5, 0x17, 0x0f, 0x00, 0xe8, 0x17, 0x0f, 0x00, 0xeb, 0x17, - 0x0f, 0x00, 0xec, 0x17, 0x0f, 0x00, 0xee, 0x17, 0x0f, 0x00, 0xef, 0x17, - 0x0f, 0x00, 0xf4, 0x17, 0x0f, 0x00, 0xf5, 0x17, 0x0f, 0x00, 0xf8, 0x17, - 0x0f, 0x00, 0xfc, 0x17, 0x0f, 0x00, 0xfe, 0x17, 0x0f, 0x00, 0xff, 0x17, - 0x0f, 0x00, 0xf3, 0x19, 0x0f, 0x00, 0xfb, 0x19, 0x0f, 0x00, 0xb4, 0x1a, - 0x0f, 0x00, 0xb5, 0x1a, 0x0f, 0x00, 0xb8, 0x1a, 0x0f, 0x00, 0xbc, 0x1a, - 0x0f, 0x00, 0xbe, 0x1a, 0x0f, 0x00, 0xbf, 0x1a, 0x0f, 0x00, 0x18, 0x1b, - 0x0f, 0x00, 0x1c, 0x1b, 0x0f, 0x00, 0x1e, 0x1b, 0x0f, 0x00, 0x1f, 0x1b, - 0x0f, 0x00, 0x8e, 0x1b, 0x0f, 0x00, 0x8f, 0x1b, 0x0f, 0x00, 0xd5, 0x1b, - 0x0f, 0x00, 0xd8, 0x1b, 0x0f, 0x00, 0xdc, 0x1b, 0x0f, 0x00, 0xde, 0x1b, - 0x0f, 0x00, 0xdf, 0x1b, 0x0f, 0x00, 0xe4, 0x1b, 0x0f, 0x00, 0xee, 0x1b, - 0x0f, 0x00, 0xef, 0x1b, 0x0f, 0x00, 0xf4, 0x1b, 0x0f, 0x00, 0xf5, 0x1b, - 0x0f, 0x00, 0xf8, 0x1b, 0x0f, 0x00, 0xfc, 0x1b, 0x0f, 0x00, 0xfe, 0x1b, - 0x0f, 0x00, 0xff, 0x1b, 0x0f, 0x00, 0xf3, 0x1d, 0x0f, 0x00, 0xfb, 0x1d, - 0x0f, 0x00, 0x98, 0x1f, 0x0f, 0x00, 0x9c, 0x1f, 0x0f, 0x00, 0x9e, 0x1f, - 0x0f, 0x00, 0x9f, 0x1f, 0x0f, 0x00, 0xd8, 0x1f, 0x0f, 0x00, 0xdc, 0x1f, - 0x0f, 0x00, 0xde, 0x1f, 0x0f, 0x00, 0xdf, 0x1f, 0x0f, 0x00, 0xb8, 0x24, - 0x0f, 0x00, 0xbc, 0x24, 0x0f, 0x00, 0xbe, 0x24, 0x0f, 0x00, 0xbf, 0x24, - 0x0f, 0x00, 0xe8, 0x2b, 0x0f, 0x00, 0xeb, 0x2b, 0x0f, 0x00, 0xd0, 0x33, - 0x0f, 0x00, 0xd1, 0x33, 0x0f, 0x00, 0xd6, 0x33, 0x0f, 0x00, 0xd7, 0x33, - 0x0f, 0x00, 0xd9, 0x33, 0x0f, 0x00, 0xdd, 0x33, 0x0f, 0x00, 0xe9, 0x33, - 0x0f, 0x00, 0xea, 0x33, 0x0f, 0x00, 0xf0, 0x33, 0x0f, 0x00, 0xf1, 0x33, - 0x0f, 0x00, 0xf9, 0x33, 0x0f, 0x00, 0xfd, 0x33, 0x0f, 0x00, 0xb0, 0x38, - 0x0f, 0x00, 0xb1, 0x38, 0x0f, 0x00, 0xb9, 0x38, 0x0f, 0x00, 0xbd, 0x38, - 0x0f, 0x00, 0x9f, 0x39, 0x0f, 0x00, 0xe9, 0x3b, 0x0f, 0x00, 0xea, 0x3b, - 0x0f, 0x00, 0xf0, 0x3b, 0x0f, 0x00, 0xf1, 0x3b, 0x0f, 0x00, 0xf9, 0x3b, - 0x0f, 0x00, 0xfd, 0x3b, 0x0f, 0x00, 0x6b, 0x3c, 0x0f, 0x00, 0x78, 0x3c, - 0x0f, 0x00, 0x7c, 0x3c, 0x0f, 0x00, 0x7e, 0x3c, 0x0f, 0x00, 0x7f, 0x3c, - 0x0f, 0x00, 0x90, 0x3d, 0x0f, 0x00, 0x91, 0x3d, 0x0f, 0x00, 0x96, 0x3d, - 0x0f, 0x00, 0x97, 0x3d, 0x0f, 0x00, 0xd8, 0x3f, 0x0f, 0x00, 0xdc, 0x3f, - 0x0f, 0x00, 0xde, 0x3f, 0x0f, 0x00, 0xdf, 0x3f, 0x0f, 0x00, 0xe6, 0x3f, - 0x0f, 0x00, 0xe7, 0x3f, 0x0f, 0x00, 0xe8, 0x3f, 0x0f, 0x00, 0xeb, 0x3f, - 0x0f, 0x00, 0xf6, 0x3f, 0x0f, 0x00, 0xf7, 0x3f, 0x0f, 0x00, 0xf8, 0x3f, - 0x0f, 0x00, 0xfc, 0x3f, 0x0f, 0x00, 0xfe, 0x3f, 0x0f, 0x00, 0xff, 0x3f, - 0x0f, 0x00, 0x1f, 0x41, 0x0f, 0x00, 0x70, 0x41, 0x0f, 0x00, 0x71, 0x41, - 0x0f, 0x00, 0x79, 0x41, 0x0f, 0x00, 0x7d, 0x41, 0x0f, 0x00, 0x78, 0x42, - 0x0f, 0x00, 0x7c, 0x42, 0x0f, 0x00, 0x7e, 0x42, 0x0f, 0x00, 0x7f, 0x42, - 0x0f, 0x00, 0x0b, 0x43, 0x0f, 0x00, 0x78, 0x43, 0x0f, 0x00, 0x7c, 0x43, - 0x0f, 0x00, 0x7e, 0x43, 0x0f, 0x00, 0x7f, 0x43, 0x0f, 0x00, 0x90, 0x43, - 0x0f, 0x00, 0x91, 0x43, 0x0f, 0x00, 0x96, 0x43, 0x0f, 0x00, 0x97, 0x43, - 0x0f, 0x00, 0xcb, 0x45, 0x0f, 0x00, 0xf7, 0x45, 0x0f, 0x00, 0xf8, 0x45, - 0x0f, 0x00, 0xfc, 0x45, 0x0f, 0x00, 0xfe, 0x45, 0x0f, 0x00, 0xff, 0x45, - 0x0f, 0x00, 0x87, 0x47, 0x0f, 0x00, 0xdf, 0x47, 0x0f, 0x00, 0xe7, 0x47, - 0x0f, 0x00, 0xeb, 0x47, 0x0f, 0x00, 0xf7, 0x47, 0x0f, 0x00, 0xf8, 0x47, - 0x0f, 0x00, 0xfc, 0x47, 0x0f, 0x00, 0xfe, 0x47, 0x0f, 0x00, 0xff, 0x47, - 0x0f, 0x00, 0x90, 0x48, 0x0f, 0x00, 0xc7, 0x49, 0x0f, 0x00, 0xcb, 0x49, - 0x0f, 0x00, 0xe7, 0x49, 0x0f, 0x00, 0xeb, 0x49, 0x0f, 0x00, 0xf7, 0x49, - 0x0f, 0x00, 0xb7, 0x4a, 0x0f, 0x00, 0x87, 0x4b, 0x0f, 0x00, 0x8b, 0x4b, - 0x0f, 0x00, 0xd1, 0x4b, 0x0f, 0x00, 0xd6, 0x4b, 0x0f, 0x00, 0xd7, 0x4b, - 0x0f, 0x00, 0xdf, 0x4b, 0x0f, 0x00, 0xe7, 0x4b, 0x0f, 0x00, 0xf0, 0x4b, - 0x0f, 0x00, 0xf1, 0x4b, 0x0f, 0x00, 0xf7, 0x4b, 0x0f, 0x00, 0xf9, 0x4b, - 0x0f, 0x00, 0xfd, 0x4b, 0x0f, 0x00, 0x6b, 0x4c, 0x0f, 0x00, 0x7f, 0x4c, - 0x0f, 0x00, 0x8b, 0x4c, 0x0f, 0x00, 0xb8, 0x4c, 0x0f, 0x00, 0xbc, 0x4c, - 0x0f, 0x00, 0xbe, 0x4c, 0x0f, 0x00, 0xbf, 0x4c, 0x0f, 0x00, 0x0b, 0x4d, - 0x0f, 0x00, 0xc7, 0x4d, 0x0f, 0x00, 0xe7, 0x4d, 0x0f, 0x00, 0xf7, 0x4d, - 0x0f, 0x00, 0x78, 0x4e, 0x0f, 0x00, 0x7c, 0x4e, 0x0f, 0x00, 0x7e, 0x4e, - 0x0f, 0x00, 0x7f, 0x4e, 0x0f, 0x00, 0x8b, 0x4e, 0x0f, 0x00, 0xbf, 0x4e, - 0x0f, 0x00, 0x78, 0x4f, 0x0f, 0x00, 0x7c, 0x4f, 0x0f, 0x00, 0x7e, 0x4f, - 0x0f, 0x00, 0x7f, 0x4f, 0x0f, 0x00, 0x8b, 0x4f, 0x0f, 0x00, 0x90, 0x4f, - 0x0f, 0x00, 0x91, 0x4f, 0x0f, 0x00, 0x96, 0x4f, 0x0f, 0x00, 0x97, 0x4f, - 0x0f, 0x00, 0x9f, 0x4f, 0x0f, 0x00, 0xd0, 0x4f, 0x0f, 0x00, 0xd1, 0x4f, - 0x0f, 0x00, 0xd6, 0x4f, 0x0f, 0x00, 0xd7, 0x4f, 0x0f, 0x00, 0xdf, 0x4f, - 0x0f, 0x00, 0xb0, 0x50, 0x0f, 0x00, 0xb1, 0x50, 0x0f, 0x00, 0xb9, 0x50, - 0x0f, 0x00, 0xbd, 0x50, 0x0f, 0x00, 0xcb, 0x51, 0x0f, 0x00, 0xf7, 0x51, - 0x0f, 0x00, 0xf8, 0x51, 0x0f, 0x00, 0xfc, 0x51, 0x0f, 0x00, 0xfe, 0x51, - 0x0f, 0x00, 0xff, 0x51, 0x0f, 0x00, 0xb8, 0x52, 0x0f, 0x00, 0xbc, 0x52, - 0x0f, 0x00, 0xbe, 0x52, 0x0f, 0x00, 0xbf, 0x52, 0x0f, 0x00, 0x8b, 0x53, - 0x0f, 0x00, 0x9f, 0x53, 0x0f, 0x00, 0x6b, 0x55, 0x0f, 0x00, 0xff, 0x55, - 0x0f, 0x00, 0x87, 0x56, 0x0f, 0x00, 0xb7, 0x56, 0x0f, 0x00, 0xf0, 0x59, - 0x0f, 0x00, 0xf1, 0x59, 0x0f, 0x00, 0xf9, 0x59, 0x0f, 0x00, 0xfd, 0x59, - 0x0f, 0x00, 0xb0, 0x5a, 0x0f, 0x00, 0xb1, 0x5a, 0x0f, 0x00, 0xb9, 0x5a, - 0x0f, 0x00, 0xbd, 0x5a, 0x0f, 0x00, 0x87, 0x5b, 0x0f, 0x00, 0xcb, 0x5d, - 0x0f, 0x00, 0xf7, 0x5d, 0x0f, 0x00, 0xf8, 0x5d, 0x0f, 0x00, 0xfc, 0x5d, - 0x0f, 0x00, 0xfe, 0x5d, 0x0f, 0x00, 0xff, 0x5d, 0x0f, 0x00, 0x90, 0x5f, - 0x0f, 0x00, 0x91, 0x5f, 0x0f, 0x00, 0x96, 0x5f, 0x0f, 0x00, 0x97, 0x5f, - 0x0f, 0x00, 0x1f, 0x61, 0x0f, 0x00, 0x63, 0x61, 0x0f, 0x00, 0x73, 0x61, - 0x0f, 0x00, 0x7b, 0x61, 0x0f, 0x00, 0xcb, 0x65, 0x0f, 0x00, 0xcf, 0x65, - 0x0f, 0x00, 0xeb, 0x65, 0x0f, 0x00, 0xef, 0x65, 0x0f, 0x00, 0xff, 0x65, - 0x0f, 0x00, 0x0b, 0x67, 0x0f, 0x00, 0xce, 0x67, 0x0f, 0x00, 0xcf, 0x67, - 0x0f, 0x00, 0xee, 0x67, 0x0f, 0x00, 0xef, 0x67, 0x0f, 0x00, 0xf8, 0x67, - 0x0f, 0x00, 0xfc, 0x67, 0x0f, 0x00, 0xfe, 0x67, 0x0f, 0x00, 0xff, 0x67, - 0x0f, 0x00, 0xf3, 0x69, 0x0f, 0x00, 0xfb, 0x69, 0x0f, 0x00, 0xb8, 0x6a, - 0x0f, 0x00, 0xbc, 0x6a, 0x0f, 0x00, 0xbe, 0x6a, 0x0f, 0x00, 0xbf, 0x6a, - 0x0f, 0x00, 0x84, 0x6b, 0x0f, 0x00, 0xf3, 0x6b, 0x0f, 0x00, 0xfb, 0x6b, - 0x0f, 0x00, 0xf3, 0x6d, 0x0f, 0x00, 0xfb, 0x6d, 0x0f, 0x00, 0x93, 0x6f, - 0x0f, 0x00, 0x94, 0x6f, 0x0f, 0x00, 0x95, 0x6f, 0x0f, 0x00, 0x9b, 0x6f, - 0x0f, 0x00, 0xd3, 0x6f, 0x0f, 0x00, 0xd4, 0x6f, 0x0f, 0x00, 0xd5, 0x6f, - 0x0f, 0x00, 0xdb, 0x6f, 0x0f, 0x00, 0x9f, 0x70, 0x0f, 0x00, 0x13, 0x71, - 0x0f, 0x00, 0x1f, 0x71, 0x0f, 0x00, 0x6e, 0x71, 0x0f, 0x00, 0x6f, 0x71, - 0x0f, 0x00, 0x78, 0x71, 0x0f, 0x00, 0x7c, 0x71, 0x0f, 0x00, 0x7e, 0x71, - 0x0f, 0x00, 0x7f, 0x71, 0x0f, 0x00, 0x83, 0x71, 0x0f, 0x00, 0x8f, 0x71, - 0x0f, 0x00, 0x9b, 0x71, 0x0f, 0x00, 0xdb, 0x71, 0x0f, 0x00, 0x95, 0x73, - 0x0f, 0x00, 0x93, 0x74, 0x0f, 0x00, 0x94, 0x74, 0x0f, 0x00, 0x95, 0x74, - 0x0f, 0x00, 0x9f, 0x74, 0x0f, 0x00, 0xcb, 0x75, 0x0f, 0x00, 0xcf, 0x75, - 0x0f, 0x00, 0xeb, 0x75, 0x0f, 0x00, 0xef, 0x75, 0x0f, 0x00, 0xff, 0x75, - 0x0f, 0x00, 0x93, 0x76, 0x0f, 0x00, 0x9f, 0x76, 0x0f, 0x00, 0x03, 0x77, - 0x0f, 0x00, 0x0e, 0x77, 0x0f, 0x00, 0x0f, 0x77, 0x0f, 0x00, 0x13, 0x77, - 0x0f, 0x00, 0x14, 0x77, 0x0f, 0x00, 0x15, 0x77, 0x0f, 0x00, 0x1f, 0x77, - 0x0f, 0x00, 0xce, 0x77, 0x0f, 0x00, 0xcf, 0x77, 0x0f, 0x00, 0xee, 0x77, - 0x0f, 0x00, 0xef, 0x77, 0x0f, 0x00, 0xf8, 0x77, 0x0f, 0x00, 0xfc, 0x77, - 0x0f, 0x00, 0xfe, 0x77, 0x0f, 0x00, 0xff, 0x77, 0x0f, 0x00, 0xcf, 0x79, - 0x0f, 0x00, 0xef, 0x79, 0x0f, 0x00, 0xff, 0x79, 0x0f, 0x00, 0xb3, 0x7a, - 0x0f, 0x00, 0xbb, 0x7a, 0x0f, 0x00, 0x84, 0x7b, 0x0f, 0x00, 0x8e, 0x7b, - 0x0f, 0x00, 0x8f, 0x7b, 0x0f, 0x00, 0xd5, 0x7b, 0x0f, 0x00, 0xee, 0x7b, - 0x0f, 0x00, 0xef, 0x7b, 0x0f, 0x00, 0xf8, 0x7b, 0x0f, 0x00, 0xfc, 0x7b, - 0x0f, 0x00, 0xfe, 0x7b, 0x0f, 0x00, 0xff, 0x7b, 0x0f, 0x00, 0xcb, 0x7d, - 0x0f, 0x00, 0xcf, 0x7d, 0x0f, 0x00, 0xeb, 0x7d, 0x0f, 0x00, 0xef, 0x7d, - 0x0f, 0x00, 0xff, 0x7d, 0x0f, 0x00, 0x9b, 0x7f, 0x0f, 0x00, 0xdb, 0x7f, - 0x0f, 0x00, 0x70, 0x84, 0x0f, 0x00, 0x71, 0x84, 0x0f, 0x00, 0x73, 0x84, - 0x0f, 0x00, 0x79, 0x84, 0x0f, 0x00, 0x7b, 0x84, 0x0f, 0x00, 0x7d, 0x84, - 0x0f, 0x00, 0xb0, 0x84, 0x0f, 0x00, 0xb1, 0x84, 0x0f, 0x00, 0xb3, 0x84, - 0x0f, 0x00, 0xb9, 0x84, 0x0f, 0x00, 0xbb, 0x84, 0x0f, 0x00, 0xbd, 0x84, - 0x0f, 0x00, 0x18, 0x85, 0x0f, 0x00, 0x1c, 0x85, 0x0f, 0x00, 0x1e, 0x85, - 0x0f, 0x00, 0x1f, 0x85, 0x0f, 0x00, 0x68, 0x85, 0x0f, 0x00, 0x6b, 0x85, - 0x0f, 0x00, 0x78, 0x85, 0x0f, 0x00, 0x7c, 0x85, 0x0f, 0x00, 0x7e, 0x85, - 0x0f, 0x00, 0x7f, 0x85, 0x0f, 0x00, 0x70, 0x86, 0x0f, 0x00, 0x71, 0x86, - 0x0f, 0x00, 0x73, 0x86, 0x0f, 0x00, 0x79, 0x86, 0x0f, 0x00, 0x7b, 0x86, - 0x0f, 0x00, 0x7d, 0x86, 0x0f, 0x00, 0xb2, 0x86, 0x0f, 0x00, 0xb4, 0x86, - 0x0f, 0x00, 0xb5, 0x86, 0x0f, 0x00, 0xb6, 0x86, 0x0f, 0x00, 0xb7, 0x86, - 0x0f, 0x00, 0xb8, 0x86, 0x0f, 0x00, 0xba, 0x86, 0x0f, 0x00, 0xbc, 0x86, - 0x0f, 0x00, 0xbe, 0x86, 0x0f, 0x00, 0xbf, 0x86, 0x0f, 0x00, 0x06, 0x87, - 0x0f, 0x00, 0x07, 0x87, 0x0f, 0x00, 0x09, 0x87, 0x0f, 0x00, 0x0a, 0x87, - 0x0f, 0x00, 0x70, 0x87, 0x0f, 0x00, 0x71, 0x87, 0x0f, 0x00, 0x79, 0x87, - 0x0f, 0x00, 0x7d, 0x87, 0x0f, 0x00, 0x90, 0x87, 0x0f, 0x00, 0x91, 0x87, - 0x0f, 0x00, 0x93, 0x87, 0x0f, 0x00, 0x94, 0x87, 0x0f, 0x00, 0x95, 0x87, - 0x0f, 0x00, 0x96, 0x87, 0x0f, 0x00, 0x97, 0x87, 0x0f, 0x00, 0x99, 0x87, - 0x0f, 0x00, 0x9b, 0x87, 0x0f, 0x00, 0x9d, 0x87, 0x0f, 0x00, 0x60, 0x8a, - 0x0f, 0x00, 0x61, 0x8a, 0x0f, 0x00, 0x62, 0x8a, 0x0f, 0x00, 0x64, 0x8a, - 0x0f, 0x00, 0x65, 0x8a, 0x0f, 0x00, 0x66, 0x8a, 0x0f, 0x00, 0x67, 0x8a, - 0x0f, 0x00, 0x68, 0x8a, 0x0f, 0x00, 0x6b, 0x8a, 0x0f, 0x00, 0x6c, 0x8a, - 0x0f, 0x00, 0x6e, 0x8a, 0x0f, 0x00, 0x6f, 0x8a, 0x0f, 0x00, 0x72, 0x8a, - 0x0f, 0x00, 0x74, 0x8a, 0x0f, 0x00, 0x75, 0x8a, 0x0f, 0x00, 0x76, 0x8a, - 0x0f, 0x00, 0x77, 0x8a, 0x0f, 0x00, 0x78, 0x8a, 0x0f, 0x00, 0x7a, 0x8a, - 0x0f, 0x00, 0x7c, 0x8a, 0x0f, 0x00, 0x7e, 0x8a, 0x0f, 0x00, 0x7f, 0x8a, - 0x0f, 0x00, 0x8b, 0x8a, 0x0f, 0x00, 0xb1, 0x8a, 0x0f, 0x00, 0xb3, 0x8a, - 0x0f, 0x00, 0xb9, 0x8a, 0x0f, 0x00, 0xbb, 0x8a, 0x0f, 0x00, 0xbd, 0x8a, - 0x0f, 0x00, 0x08, 0x8b, 0x0f, 0x00, 0x0b, 0x8b, 0x0f, 0x00, 0x66, 0x8b, - 0x0f, 0x00, 0x67, 0x8b, 0x0f, 0x00, 0x68, 0x8b, 0x0f, 0x00, 0x6b, 0x8b, - 0x0f, 0x00, 0x76, 0x8b, 0x0f, 0x00, 0x77, 0x8b, 0x0f, 0x00, 0x78, 0x8b, - 0x0f, 0x00, 0x7c, 0x8b, 0x0f, 0x00, 0x7e, 0x8b, 0x0f, 0x00, 0x7f, 0x8b, - 0x0f, 0x00, 0x92, 0x8b, 0x0f, 0x00, 0x98, 0x8b, 0x0f, 0x00, 0x9a, 0x8b, - 0x0f, 0x00, 0x9c, 0x8b, 0x0f, 0x00, 0x9e, 0x8b, 0x0f, 0x00, 0x9f, 0x8b, - 0x0f, 0x00, 0xd5, 0x93, 0x0f, 0x00, 0xd8, 0x93, 0x0f, 0x00, 0xdc, 0x93, - 0x0f, 0x00, 0xde, 0x93, 0x0f, 0x00, 0xdf, 0x93, 0x0f, 0x00, 0xe4, 0x93, - 0x0f, 0x00, 0xee, 0x93, 0x0f, 0x00, 0xef, 0x93, 0x0f, 0x00, 0xf4, 0x93, - 0x0f, 0x00, 0xf5, 0x93, 0x0f, 0x00, 0xf8, 0x93, 0x0f, 0x00, 0xfc, 0x93, - 0x0f, 0x00, 0xfe, 0x93, 0x0f, 0x00, 0xff, 0x93, 0x0f, 0x00, 0xbe, 0x98, - 0x0f, 0x00, 0xbf, 0x98, 0x0f, 0x00, 0xb3, 0x9a, 0x0f, 0x00, 0xbb, 0x9a, - 0x0f, 0x00, 0xe8, 0x9b, 0x0f, 0x00, 0xf3, 0x9b, 0x0f, 0x00, 0xfb, 0x9b, - 0x0f, 0x00, 0xc3, 0x9f, 0x0f, 0x00, 0xc4, 0x9f, 0x0f, 0x00, 0xc5, 0x9f, - 0x0f, 0x00, 0xc8, 0x9f, 0x0f, 0x00, 0xcb, 0x9f, 0x0f, 0x00, 0xcc, 0x9f, - 0x0f, 0x00, 0xce, 0x9f, 0x0f, 0x00, 0xcf, 0x9f, 0x0f, 0x00, 0xe4, 0x9f, - 0x0f, 0x00, 0xe5, 0x9f, 0x0f, 0x00, 0xe8, 0x9f, 0x0f, 0x00, 0xeb, 0x9f, - 0x0f, 0x00, 0xec, 0x9f, 0x0f, 0x00, 0xee, 0x9f, 0x0f, 0x00, 0xef, 0x9f, - 0x0f, 0x00, 0xf4, 0x9f, 0x0f, 0x00, 0xf5, 0x9f, 0x0f, 0x00, 0xf8, 0x9f, - 0x0f, 0x00, 0xfc, 0x9f, 0x0f, 0x00, 0xfe, 0x9f, 0x0f, 0x00, 0xff, 0x9f, - 0x0f, 0x00, 0x6b, 0xa4, 0x0f, 0x00, 0x78, 0xa4, 0x0f, 0x00, 0x7c, 0xa4, - 0x0f, 0x00, 0x7e, 0xa4, 0x0f, 0x00, 0x7f, 0xa4, 0x0f, 0x00, 0x98, 0xa7, - 0x0f, 0x00, 0x9c, 0xa7, 0x0f, 0x00, 0x9e, 0xa7, 0x0f, 0x00, 0x9f, 0xa7, - 0x0f, 0x00, 0x98, 0xab, 0x0f, 0x00, 0x9c, 0xab, 0x0f, 0x00, 0x9e, 0xab, - 0x0f, 0x00, 0x9f, 0xab, 0x0f, 0x00, 0xd0, 0xb3, 0x0f, 0x00, 0xd1, 0xb3, - 0x0f, 0x00, 0xd6, 0xb3, 0x0f, 0x00, 0xd7, 0xb3, 0x0f, 0x00, 0xd9, 0xb3, - 0x0f, 0x00, 0xdd, 0xb3, 0x0f, 0x00, 0xe9, 0xb3, 0x0f, 0x00, 0xea, 0xb3, - 0x0f, 0x00, 0xf0, 0xb3, 0x0f, 0x00, 0xf1, 0xb3, 0x0f, 0x00, 0xf9, 0xb3, - 0x0f, 0x00, 0xfd, 0xb3, 0x0f, 0x00, 0x67, 0xb8, 0x0f, 0x00, 0x6b, 0xb8, - 0x0f, 0x00, 0x77, 0xb8, 0x0f, 0x00, 0x78, 0xb8, 0x0f, 0x00, 0x7c, 0xb8, - 0x0f, 0x00, 0x7e, 0xb8, 0x0f, 0x00, 0x7f, 0xb8, 0x0f, 0x00, 0xb6, 0xb8, - 0x0f, 0x00, 0xb7, 0xb8, 0x0f, 0x00, 0xb8, 0xb8, 0x0f, 0x00, 0xbc, 0xb8, - 0x0f, 0x00, 0xbe, 0xb8, 0x0f, 0x00, 0xbf, 0xb8, 0x0f, 0x00, 0x9f, 0xb9, - 0x0f, 0x00, 0x66, 0xba, 0x0f, 0x00, 0x67, 0xba, 0x0f, 0x00, 0x68, 0xba, - 0x0f, 0x00, 0x6b, 0xba, 0x0f, 0x00, 0x76, 0xba, 0x0f, 0x00, 0x77, 0xba, - 0x0f, 0x00, 0x78, 0xba, 0x0f, 0x00, 0x7c, 0xba, 0x0f, 0x00, 0x7e, 0xba, - 0x0f, 0x00, 0x7f, 0xba, 0x0f, 0x00, 0xb0, 0xba, 0x0f, 0x00, 0xb1, 0xba, - 0x0f, 0x00, 0xb9, 0xba, 0x0f, 0x00, 0xbd, 0xba, 0x0f, 0x00, 0x98, 0xbb, - 0x0f, 0x00, 0x9c, 0xbb, 0x0f, 0x00, 0x9e, 0xbb, 0x0f, 0x00, 0x9f, 0xbb, - 0x0f, 0x00, 0x90, 0xbd, 0x0f, 0x00, 0x91, 0xbd, 0x0f, 0x00, 0x96, 0xbd, - 0x0f, 0x00, 0x97, 0xbd, 0x0f, 0x00, 0x88, 0xbf, 0x0f, 0x00, 0x8b, 0xbf, - 0x0f, 0x00, 0xd8, 0xbf, 0x0f, 0x00, 0xdc, 0xbf, 0x0f, 0x00, 0xde, 0xbf, - 0x0f, 0x00, 0xdf, 0xbf, 0x0f, 0x00, 0xe6, 0xbf, 0x0f, 0x00, 0xe7, 0xbf, - 0x0f, 0x00, 0xe8, 0xbf, 0x0f, 0x00, 0xeb, 0xbf, 0x0f, 0x00, 0xf6, 0xbf, - 0x0f, 0x00, 0xf7, 0xbf, 0x0f, 0x00, 0xf8, 0xbf, 0x0f, 0x00, 0xfc, 0xbf, - 0x0f, 0x00, 0xfe, 0xbf, 0x0f, 0x00, 0xff, 0xbf, 0x0f, 0x00, 0xb2, 0xc4, - 0x0f, 0x00, 0xb4, 0xc4, 0x0f, 0x00, 0xb5, 0xc4, 0x0f, 0x00, 0xb6, 0xc4, - 0x0f, 0x00, 0xb7, 0xc4, 0x0f, 0x00, 0xb8, 0xc4, 0x0f, 0x00, 0xba, 0xc4, - 0x0f, 0x00, 0xbc, 0xc4, 0x0f, 0x00, 0xbe, 0xc4, 0x0f, 0x00, 0xbf, 0xc4, - 0x0f, 0x00, 0x83, 0xc7, 0x0f, 0x00, 0x84, 0xc7, 0x0f, 0x00, 0x85, 0xc7, - 0x0f, 0x00, 0x86, 0xc7, 0x0f, 0x00, 0x87, 0xc7, 0x0f, 0x00, 0x89, 0xc7, - 0x0f, 0x00, 0x8a, 0xc7, 0x0f, 0x00, 0x8d, 0xc7, 0x0f, 0x00, 0xe0, 0xc7, - 0x0f, 0x00, 0xe1, 0xc7, 0x0f, 0x00, 0xe2, 0xc7, 0x0f, 0x00, 0xe4, 0xc7, - 0x0f, 0x00, 0xe5, 0xc7, 0x0f, 0x00, 0xe6, 0xc7, 0x0f, 0x00, 0xe7, 0xc7, - 0x0f, 0x00, 0xe8, 0xc7, 0x0f, 0x00, 0xeb, 0xc7, 0x0f, 0x00, 0xec, 0xc7, - 0x0f, 0x00, 0xee, 0xc7, 0x0f, 0x00, 0xef, 0xc7, 0x0f, 0x00, 0xf2, 0xc7, - 0x0f, 0x00, 0xf4, 0xc7, 0x0f, 0x00, 0xf5, 0xc7, 0x0f, 0x00, 0xf6, 0xc7, - 0x0f, 0x00, 0xf7, 0xc7, 0x0f, 0x00, 0xf8, 0xc7, 0x0f, 0x00, 0xfa, 0xc7, - 0x0f, 0x00, 0xfc, 0xc7, 0x0f, 0x00, 0xfe, 0xc7, 0x0f, 0x00, 0xff, 0xc7, - 0x0f, 0x00, 0x87, 0xca, 0x0f, 0x00, 0xb2, 0xca, 0x0f, 0x00, 0xb7, 0xca, - 0x0f, 0x00, 0xb8, 0xca, 0x0f, 0x00, 0xba, 0xca, 0x0f, 0x00, 0xbc, 0xca, - 0x0f, 0x00, 0xbe, 0xca, 0x0f, 0x00, 0xbf, 0xca, 0x0f, 0x00, 0xe0, 0xcb, - 0x0f, 0x00, 0xe1, 0xcb, 0x0f, 0x00, 0xe2, 0xcb, 0x0f, 0x00, 0xe4, 0xcb, - 0x0f, 0x00, 0xe6, 0xcb, 0x0f, 0x00, 0xe7, 0xcb, 0x0f, 0x00, 0xee, 0xcb, - 0x0f, 0x00, 0xf2, 0xcb, 0x0f, 0x00, 0xf4, 0xcb, 0x0f, 0x00, 0xf5, 0xcb, - 0x0f, 0x00, 0xf6, 0xcb, 0x0f, 0x00, 0xf7, 0xcb, 0x0f, 0x00, 0xf8, 0xcb, - 0x0f, 0x00, 0xfa, 0xcb, 0x0f, 0x00, 0xfc, 0xcb, 0x0f, 0x00, 0xfe, 0xcb, - 0x0f, 0x00, 0xff, 0xcb, 0x0f, 0x00, 0xd3, 0xd3, 0x0f, 0x00, 0xd4, 0xd3, - 0x0f, 0x00 + 0x12, 0x00, 0x00, 0x00, 0xb0, 0x94, 0xc9, 0x02, 0x04, 0x33, 0xd5, 0x49, + 0x02, 0x02, 0x11, 0x97, 0xc1, 0x02, 0x01, 0x90, 0xe0, 0x35, 0x02, 0x06, + 0xe4, 0x37, 0xbb, 0x02, 0x07, 0xc4, 0x87, 0xa7, 0x02, 0x03, 0x79, 0x66, + 0xa2, 0x02, 0x02, 0x2c, 0xe7, 0x98, 0x02, 0x02, 0xcb, 0x4f, 0x8b, 0x02, + 0x06, 0x48, 0x72, 0x83, 0x02, 0x02, 0x24, 0x0b, 0x68, 0x02, 0x01, 0xef, + 0xe1, 0x60, 0x02, 0x04, 0x33, 0xd5, 0x49, 0x02, 0x02, 0x89, 0x40, 0x46, + 0x02, 0x03, 0xe0, 0x67, 0x38, 0x02, 0x00, 0x90, 0xe0, 0x35, 0x02, 0x06, + 0xcd, 0x0e, 0x2f, 0x02, 0x02, 0xb4, 0xc0, 0x2e, 0x02, 0x04, 0x10, 0x27, + 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xeb, 0x07, + 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, 0xcb, 0x0f, 0x00, 0x00, 0xeb, 0x0f, + 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfe, 0x0f, + 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0x17, 0x00, 0x00, 0xfc, 0x17, + 0x00, 0x00, 0xfe, 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0x8b, 0x1b, + 0x00, 0x00, 0xeb, 0x23, 0x00, 0x00, 0xf8, 0x29, 0x00, 0x00, 0xfc, 0x29, + 0x00, 0x00, 0xfe, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xf0, 0x33, + 0x00, 0x00, 0xf1, 0x33, 0x00, 0x00, 0xf7, 0x33, 0x00, 0x00, 0xf9, 0x33, + 0x00, 0x00, 0xfd, 0x33, 0x00, 0x00, 0xb0, 0x44, 0x00, 0x00, 0xf7, 0x45, + 0x00, 0x00, 0xf8, 0x45, 0x00, 0x00, 0xfc, 0x45, 0x00, 0x00, 0xfe, 0x45, + 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xb0, 0x46, 0x00, 0x00, 0xf0, 0x4b, + 0x00, 0x00, 0xf7, 0x5f, 0x00, 0x00, 0xf8, 0x5f, 0x00, 0x00, 0xfc, 0x5f, + 0x00, 0x00, 0xfe, 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xfb, 0x65, + 0x00, 0x00, 0xfb, 0x7d, 0x00, 0x00, 0xf7, 0x83, 0x00, 0x00, 0xf1, 0x8b, + 0x00, 0x00, 0xf7, 0x8b, 0x00, 0x00, 0xf9, 0x8b, 0x00, 0x00, 0xfb, 0x95, + 0x00, 0x00, 0xbb, 0xb2, 0x00, 0x00, 0xbb, 0xbe, 0x00, 0x00, 0xf1, 0xbf, + 0x00, 0x00, 0xf7, 0xbf, 0x00, 0x00, 0xf9, 0xbf, 0x00, 0x00, 0xf6, 0xc5, + 0x00, 0x00, 0xf7, 0xc5, 0x00, 0x00, 0xf8, 0xc5, 0x00, 0x00, 0xfc, 0xc5, + 0x00, 0x00, 0xfe, 0xc5, 0x00, 0x00, 0xff, 0xc5, 0x00, 0x00, 0xf0, 0xc9, + 0x00, 0x00, 0xf1, 0xc9, 0x00, 0x00, 0xf9, 0xc9, 0x00, 0x00, 0xfd, 0xc9, + 0x00, 0x00, 0xf0, 0xcf, 0x00, 0x00, 0xf1, 0xcf, 0x00, 0x00, 0xf9, 0xcf, + 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xf8, 0xd5, 0x00, 0x00, 0xfc, 0xd5, + 0x00, 0x00, 0xfe, 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xf8, 0xd9, + 0x00, 0x00, 0xfc, 0xd9, 0x00, 0x00, 0xfe, 0xd9, 0x00, 0x00, 0xff, 0xd9, + 0x00, 0x00, 0xf8, 0xdd, 0x00, 0x00, 0xfc, 0xdd, 0x00, 0x00, 0xfe, 0xdd, + 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0xf0, 0xe5, 0x00, 0x00, 0xf6, 0xe9, + 0x00, 0x00, 0xf7, 0xe9, 0x00, 0x00, 0xf8, 0xe9, 0x00, 0x00, 0xfc, 0xe9, + 0x00, 0x00, 0xfe, 0xe9, 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xf0, 0xed, + 0x00, 0x00, 0xf0, 0xef, 0x00, 0x00, 0xf1, 0xef, 0x00, 0x00, 0xf9, 0xef, + 0x00, 0x00, 0xfd, 0xef, 0x00, 0x00, 0x88, 0xf3, 0x00, 0x00, 0x8b, 0xf3, + 0x00, 0x00, 0xf7, 0xf9, 0x00, 0x00, 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xf9, + 0x00, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xf0, 0xfd, + 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x8b, 0xff, 0x00, 0x00, 0xc6, 0xff, + 0x00, 0x00, 0xe6, 0xff, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0xf7, 0xff, + 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xfe, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xf3, 0x01, 0x01, 0x00, 0xfb, 0x01, + 0x01, 0x00, 0xf4, 0x05, 0x01, 0x00, 0xf5, 0x05, 0x01, 0x00, 0xf8, 0x05, + 0x01, 0x00, 0xfc, 0x05, 0x01, 0x00, 0xfe, 0x05, 0x01, 0x00, 0xff, 0x05, + 0x01, 0x00, 0xf4, 0x11, 0x01, 0x00, 0xf5, 0x11, 0x01, 0x00, 0xf8, 0x11, + 0x01, 0x00, 0xfc, 0x11, 0x01, 0x00, 0xfe, 0x11, 0x01, 0x00, 0xff, 0x11, + 0x01, 0x00, 0xf3, 0x19, 0x01, 0x00, 0xfb, 0x19, 0x01, 0x00, 0xcb, 0x25, + 0x01, 0x00, 0x88, 0x33, 0x01, 0x00, 0x8b, 0x33, 0x01, 0x00, 0xcb, 0x39, + 0x01, 0x00, 0xf0, 0x39, 0x01, 0x00, 0xf1, 0x39, 0x01, 0x00, 0xf9, 0x39, + 0x01, 0x00, 0xfd, 0x39, 0x01, 0x00, 0xcb, 0x3d, 0x01, 0x00, 0xf0, 0x3d, + 0x01, 0x00, 0xf1, 0x3d, 0x01, 0x00, 0xf9, 0x3d, 0x01, 0x00, 0xfd, 0x3d, + 0x01, 0x00, 0x88, 0x3f, 0x01, 0x00, 0x8b, 0x3f, 0x01, 0x00, 0xf0, 0x41, + 0x01, 0x00, 0xf1, 0x41, 0x01, 0x00, 0xf9, 0x41, 0x01, 0x00, 0xfd, 0x41, + 0x01, 0x00, 0xf6, 0x43, 0x01, 0x00, 0xf7, 0x43, 0x01, 0x00, 0xf8, 0x43, + 0x01, 0x00, 0xfc, 0x43, 0x01, 0x00, 0xfe, 0x43, 0x01, 0x00, 0xff, 0x43, + 0x01, 0x00, 0xf6, 0x45, 0x01, 0x00, 0xf7, 0x45, 0x01, 0x00, 0xf8, 0x45, + 0x01, 0x00, 0xfc, 0x45, 0x01, 0x00, 0xfe, 0x45, 0x01, 0x00, 0xff, 0x45, + 0x01, 0x00, 0xf0, 0x47, 0x01, 0x00, 0xf1, 0x47, 0x01, 0x00, 0xf9, 0x47, + 0x01, 0x00, 0xfd, 0x47, 0x01, 0x00, 0xf0, 0x49, 0x01, 0x00, 0xf1, 0x49, + 0x01, 0x00, 0xf9, 0x49, 0x01, 0x00, 0xfd, 0x49, 0x01, 0x00, 0xe6, 0x4b, + 0x01, 0x00, 0xf0, 0x4b, 0x01, 0x00, 0xf0, 0x4f, 0x01, 0x00, 0xf1, 0x4f, + 0x01, 0x00, 0xf9, 0x4f, 0x01, 0x00, 0xfd, 0x4f, 0x01, 0x00, 0xf4, 0x61, + 0x01, 0x00, 0xf5, 0x61, 0x01, 0x00, 0xf8, 0x61, 0x01, 0x00, 0xfc, 0x61, + 0x01, 0x00, 0xfe, 0x61, 0x01, 0x00, 0xff, 0x61, 0x01, 0x00, 0xf3, 0x67, + 0x01, 0x00, 0xfb, 0x67, 0x01, 0x00, 0xf3, 0x69, 0x01, 0x00, 0xfb, 0x69, + 0x01, 0x00, 0xf4, 0x6f, 0x01, 0x00, 0xf5, 0x6f, 0x01, 0x00, 0xf8, 0x6f, + 0x01, 0x00, 0xfc, 0x6f, 0x01, 0x00, 0xfe, 0x6f, 0x01, 0x00, 0xff, 0x6f, + 0x01, 0x00, 0xf3, 0x77, 0x01, 0x00, 0xfb, 0x77, 0x01, 0x00, 0xf4, 0x7f, + 0x01, 0x00, 0xf5, 0x7f, 0x01, 0x00, 0xf8, 0x7f, 0x01, 0x00, 0xfc, 0x7f, + 0x01, 0x00, 0xfe, 0x7f, 0x01, 0x00, 0xff, 0x7f, 0x01, 0x00, 0xb1, 0x84, + 0x01, 0x00, 0xb9, 0x84, 0x01, 0x00, 0xb1, 0x86, 0x01, 0x00, 0xb9, 0x86, + 0x01, 0x00, 0xf1, 0x87, 0x01, 0x00, 0xf9, 0x87, 0x01, 0x00, 0xf1, 0x8b, + 0x01, 0x00, 0xf7, 0x8b, 0x01, 0x00, 0xf9, 0x8b, 0x01, 0x00, 0xb8, 0xa4, + 0x01, 0x00, 0xbc, 0xa4, 0x01, 0x00, 0xbe, 0xa4, 0x01, 0x00, 0xbf, 0xa4, + 0x01, 0x00, 0xeb, 0xa7, 0x01, 0x00, 0xf8, 0xab, 0x01, 0x00, 0xfc, 0xab, + 0x01, 0x00, 0xfe, 0xab, 0x01, 0x00, 0xff, 0xab, 0x01, 0x00, 0xeb, 0xb3, + 0x01, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0xf1, 0xb3, 0x01, 0x00, 0xf7, 0xb3, + 0x01, 0x00, 0xf9, 0xb3, 0x01, 0x00, 0xfd, 0xb3, 0x01, 0x00, 0xb0, 0xb8, + 0x01, 0x00, 0xb1, 0xb8, 0x01, 0x00, 0xb7, 0xb8, 0x01, 0x00, 0xb9, 0xb8, + 0x01, 0x00, 0xbd, 0xb8, 0x01, 0x00, 0xeb, 0xbb, 0x01, 0x00, 0xf0, 0xbb, + 0x01, 0x00, 0xf1, 0xbb, 0x01, 0x00, 0xf7, 0xbb, 0x01, 0x00, 0xf9, 0xbb, + 0x01, 0x00, 0xfd, 0xbb, 0x01, 0x00, 0xf8, 0xbf, 0x01, 0x00, 0xfc, 0xbf, + 0x01, 0x00, 0xfe, 0xbf, 0x01, 0x00, 0xff, 0xbf, 0x01, 0x00, 0xf7, 0xc5, + 0x01, 0x00, 0xcb, 0xdd, 0x01, 0x00, 0x88, 0x0b, 0x02, 0x00, 0x8b, 0x0b, + 0x02, 0x00, 0x88, 0x17, 0x02, 0x00, 0x8b, 0x17, 0x02, 0x00, 0xc8, 0x17, + 0x02, 0x00, 0xcb, 0x17, 0x02, 0x00, 0xe8, 0x17, 0x02, 0x00, 0xeb, 0x17, + 0x02, 0x00, 0xf8, 0x17, 0x02, 0x00, 0xfc, 0x17, 0x02, 0x00, 0xfe, 0x17, + 0x02, 0x00, 0xff, 0x17, 0x02, 0x00, 0x88, 0x1b, 0x02, 0x00, 0x8b, 0x1b, + 0x02, 0x00, 0xc8, 0x1f, 0x02, 0x00, 0xcb, 0x1f, 0x02, 0x00, 0xe8, 0x1f, + 0x02, 0x00, 0xeb, 0x1f, 0x02, 0x00, 0xf8, 0x1f, 0x02, 0x00, 0xfc, 0x1f, + 0x02, 0x00, 0xfe, 0x1f, 0x02, 0x00, 0xff, 0x1f, 0x02, 0x00, 0xe8, 0x23, + 0x02, 0x00, 0xeb, 0x23, 0x02, 0x00, 0xf8, 0x23, 0x02, 0x00, 0xfc, 0x23, + 0x02, 0x00, 0xfe, 0x23, 0x02, 0x00, 0xff, 0x23, 0x02, 0x00, 0xf8, 0x29, + 0x02, 0x00, 0xfc, 0x29, 0x02, 0x00, 0xfe, 0x29, 0x02, 0x00, 0xff, 0x29, + 0x02, 0x00, 0xf8, 0x2d, 0x02, 0x00, 0xfc, 0x2d, 0x02, 0x00, 0xfe, 0x2d, + 0x02, 0x00, 0xff, 0x2d, 0x02, 0x00, 0xe9, 0x33, 0x02, 0x00, 0xea, 0x33, + 0x02, 0x00, 0xf0, 0x33, 0x02, 0x00, 0xf1, 0x33, 0x02, 0x00, 0xf9, 0x33, + 0x02, 0x00, 0xfd, 0x33, 0x02, 0x00, 0xf7, 0x35, 0x02, 0x00, 0xf8, 0x35, + 0x02, 0x00, 0xfc, 0x35, 0x02, 0x00, 0xfe, 0x35, 0x02, 0x00, 0xff, 0x35, + 0x02, 0x00, 0xf7, 0x39, 0x02, 0x00, 0xf8, 0x39, 0x02, 0x00, 0xfc, 0x39, + 0x02, 0x00, 0xfe, 0x39, 0x02, 0x00, 0xff, 0x39, 0x02, 0x00, 0xf0, 0x3d, + 0x02, 0x00, 0xf1, 0x3d, 0x02, 0x00, 0xf9, 0x3d, 0x02, 0x00, 0xfd, 0x3d, + 0x02, 0x00, 0xb0, 0x44, 0x02, 0x00, 0xb1, 0x44, 0x02, 0x00, 0xb9, 0x44, + 0x02, 0x00, 0xbd, 0x44, 0x02, 0x00, 0xf7, 0x45, 0x02, 0x00, 0xf8, 0x45, + 0x02, 0x00, 0xfc, 0x45, 0x02, 0x00, 0xfe, 0x45, 0x02, 0x00, 0xff, 0x45, + 0x02, 0x00, 0xb0, 0x46, 0x02, 0x00, 0xb1, 0x46, 0x02, 0x00, 0xb9, 0x46, + 0x02, 0x00, 0xbd, 0x46, 0x02, 0x00, 0xf0, 0x47, 0x02, 0x00, 0xf1, 0x47, + 0x02, 0x00, 0xf9, 0x47, 0x02, 0x00, 0xfd, 0x47, 0x02, 0x00, 0xc7, 0x53, + 0x02, 0x00, 0xcb, 0x53, 0x02, 0x00, 0xf7, 0x53, 0x02, 0x00, 0xf8, 0x53, + 0x02, 0x00, 0xfc, 0x53, 0x02, 0x00, 0xfe, 0x53, 0x02, 0x00, 0xff, 0x53, + 0x02, 0x00, 0xf1, 0x81, 0x02, 0x00, 0xf9, 0x81, 0x02, 0x00, 0xf7, 0x85, + 0x02, 0x00, 0xf1, 0xb3, 0x02, 0x00, 0xf7, 0xb3, 0x02, 0x00, 0xf9, 0xb3, + 0x02, 0x00, 0xb1, 0xb8, 0x02, 0x00, 0xb7, 0xb8, 0x02, 0x00, 0xb9, 0xb8, + 0x02, 0x00, 0xf1, 0xbb, 0x02, 0x00, 0xf7, 0xbb, 0x02, 0x00, 0xf9, 0xbb, + 0x02, 0x00, 0xe6, 0xc3, 0x02, 0x00, 0xe7, 0xc3, 0x02, 0x00, 0xe8, 0xc3, + 0x02, 0x00, 0xeb, 0xc3, 0x02, 0x00, 0xf6, 0xc3, 0x02, 0x00, 0xf7, 0xc3, + 0x02, 0x00, 0xf8, 0xc3, 0x02, 0x00, 0xfc, 0xc3, 0x02, 0x00, 0xfe, 0xc3, + 0x02, 0x00, 0xff, 0xc3, 0x02, 0x00, 0xb8, 0xcc, 0x02, 0x00, 0xbc, 0xcc, + 0x02, 0x00, 0xbe, 0xcc, 0x02, 0x00, 0xbf, 0xcc, 0x02, 0x00, 0xb8, 0xce, + 0x02, 0x00, 0xbc, 0xce, 0x02, 0x00, 0xbe, 0xce, 0x02, 0x00, 0xbf, 0xce, + 0x02, 0x00, 0xc9, 0xcf, 0x02, 0x00, 0xca, 0xcf, 0x02, 0x00, 0xe9, 0xcf, + 0x02, 0x00, 0xea, 0xcf, 0x02, 0x00, 0xf0, 0xcf, 0x02, 0x00, 0xf1, 0xcf, + 0x02, 0x00, 0xf9, 0xcf, 0x02, 0x00, 0xfd, 0xcf, 0x02, 0x00, 0xe8, 0xdf, + 0x02, 0x00, 0xeb, 0xdf, 0x02, 0x00, 0xf8, 0xdf, 0x02, 0x00, 0xfc, 0xdf, + 0x02, 0x00, 0xfe, 0xdf, 0x02, 0x00, 0xff, 0xdf, 0x02, 0x00, 0xf0, 0xe3, + 0x02, 0x00, 0xf1, 0xe3, 0x02, 0x00, 0xf9, 0xe3, 0x02, 0x00, 0xfd, 0xe3, + 0x02, 0x00, 0xb8, 0xec, 0x02, 0x00, 0xbc, 0xec, 0x02, 0x00, 0xbe, 0xec, + 0x02, 0x00, 0xbf, 0xec, 0x02, 0x00, 0xc9, 0xef, 0x02, 0x00, 0xca, 0xef, + 0x02, 0x00, 0xe9, 0xef, 0x02, 0x00, 0xea, 0xef, 0x02, 0x00, 0xf0, 0xef, + 0x02, 0x00, 0xf1, 0xef, 0x02, 0x00, 0xf9, 0xef, 0x02, 0x00, 0xfd, 0xef, + 0x02, 0x00, 0xe6, 0xf3, 0x02, 0x00, 0xf6, 0xf3, 0x02, 0x00, 0xf7, 0xf3, + 0x02, 0x00, 0xf8, 0xf3, 0x02, 0x00, 0xfc, 0xf3, 0x02, 0x00, 0xfe, 0xf3, + 0x02, 0x00, 0xff, 0xf3, 0x02, 0x00, 0x88, 0xff, 0x02, 0x00, 0x8b, 0xff, + 0x02, 0x00, 0xc6, 0xff, 0x02, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xc8, 0xff, + 0x02, 0x00, 0xcb, 0xff, 0x02, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe7, 0xff, + 0x02, 0x00, 0xe8, 0xff, 0x02, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xf6, 0xff, + 0x02, 0x00, 0xf7, 0xff, 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfc, 0xff, + 0x02, 0x00, 0xfe, 0xff, 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x73, 0x04, + 0x03, 0x00, 0x7b, 0x04, 0x03, 0x00, 0xf4, 0x05, 0x03, 0x00, 0xf5, 0x05, + 0x03, 0x00, 0xf8, 0x05, 0x03, 0x00, 0xfc, 0x05, 0x03, 0x00, 0xfe, 0x05, + 0x03, 0x00, 0xff, 0x05, 0x03, 0x00, 0x74, 0x06, 0x03, 0x00, 0x75, 0x06, + 0x03, 0x00, 0x78, 0x06, 0x03, 0x00, 0x7c, 0x06, 0x03, 0x00, 0x7e, 0x06, + 0x03, 0x00, 0x7f, 0x06, 0x03, 0x00, 0x78, 0x07, 0x03, 0x00, 0x7c, 0x07, + 0x03, 0x00, 0x7e, 0x07, 0x03, 0x00, 0x7f, 0x07, 0x03, 0x00, 0x74, 0x0a, + 0x03, 0x00, 0x75, 0x0a, 0x03, 0x00, 0x78, 0x0a, 0x03, 0x00, 0x7c, 0x0a, + 0x03, 0x00, 0x7e, 0x0a, 0x03, 0x00, 0x7f, 0x0a, 0x03, 0x00, 0xf4, 0x0b, + 0x03, 0x00, 0xf5, 0x0b, 0x03, 0x00, 0xf8, 0x0b, 0x03, 0x00, 0xfc, 0x0b, + 0x03, 0x00, 0xfe, 0x0b, 0x03, 0x00, 0xff, 0x0b, 0x03, 0x00, 0xf3, 0x0f, + 0x03, 0x00, 0xfb, 0x0f, 0x03, 0x00, 0x73, 0x16, 0x03, 0x00, 0x7b, 0x16, + 0x03, 0x00, 0x74, 0x17, 0x03, 0x00, 0x75, 0x17, 0x03, 0x00, 0x78, 0x17, + 0x03, 0x00, 0x7c, 0x17, 0x03, 0x00, 0x7e, 0x17, 0x03, 0x00, 0x7f, 0x17, + 0x03, 0x00, 0x98, 0x17, 0x03, 0x00, 0xd8, 0x17, 0x03, 0x00, 0xf3, 0x19, + 0x03, 0x00, 0xfb, 0x19, 0x03, 0x00, 0xf4, 0x1f, 0x03, 0x00, 0xf5, 0x1f, + 0x03, 0x00, 0xf8, 0x1f, 0x03, 0x00, 0xfc, 0x1f, 0x03, 0x00, 0xfe, 0x1f, + 0x03, 0x00, 0xff, 0x1f, 0x03, 0x00, 0xd0, 0x33, 0x03, 0x00, 0xd8, 0x33, + 0x03, 0x00, 0xdc, 0x33, 0x03, 0x00, 0xde, 0x33, 0x03, 0x00, 0xdf, 0x33, + 0x03, 0x00, 0xf0, 0x33, 0x03, 0x00, 0xf1, 0x33, 0x03, 0x00, 0xf9, 0x33, + 0x03, 0x00, 0xfd, 0x33, 0x03, 0x00, 0xf0, 0x3b, 0x03, 0x00, 0xf1, 0x3b, + 0x03, 0x00, 0xf9, 0x3b, 0x03, 0x00, 0xfd, 0x3b, 0x03, 0x00, 0x90, 0x3f, + 0x03, 0x00, 0x98, 0x3f, 0x03, 0x00, 0x9c, 0x3f, 0x03, 0x00, 0x9e, 0x3f, + 0x03, 0x00, 0x9f, 0x3f, 0x03, 0x00, 0xd0, 0x3f, 0x03, 0x00, 0xd8, 0x3f, + 0x03, 0x00, 0xdc, 0x3f, 0x03, 0x00, 0xde, 0x3f, 0x03, 0x00, 0xdf, 0x3f, + 0x03, 0x00, 0x70, 0x44, 0x03, 0x00, 0x71, 0x44, 0x03, 0x00, 0x79, 0x44, + 0x03, 0x00, 0x7d, 0x44, 0x03, 0x00, 0xf7, 0x45, 0x03, 0x00, 0xf8, 0x45, + 0x03, 0x00, 0xfc, 0x45, 0x03, 0x00, 0xfe, 0x45, 0x03, 0x00, 0xff, 0x45, + 0x03, 0x00, 0x70, 0x46, 0x03, 0x00, 0x71, 0x46, 0x03, 0x00, 0x79, 0x46, + 0x03, 0x00, 0x7d, 0x46, 0x03, 0x00, 0x6b, 0x49, 0x03, 0x00, 0xf0, 0x4b, + 0x03, 0x00, 0x6b, 0x4d, 0x03, 0x00, 0x8b, 0x4f, 0x03, 0x00, 0xcb, 0x4f, + 0x03, 0x00, 0xeb, 0x4f, 0x03, 0x00, 0xf0, 0x4f, 0x03, 0x00, 0xf1, 0x4f, + 0x03, 0x00, 0xf7, 0x4f, 0x03, 0x00, 0xf9, 0x4f, 0x03, 0x00, 0xfd, 0x4f, + 0x03, 0x00, 0xf0, 0x51, 0x03, 0x00, 0xf1, 0x51, 0x03, 0x00, 0xf9, 0x51, + 0x03, 0x00, 0xfd, 0x51, 0x03, 0x00, 0xb0, 0x54, 0x03, 0x00, 0x6b, 0x55, + 0x03, 0x00, 0x78, 0x55, 0x03, 0x00, 0x7c, 0x55, 0x03, 0x00, 0x7e, 0x55, + 0x03, 0x00, 0x7f, 0x55, 0x03, 0x00, 0xcb, 0x57, 0x03, 0x00, 0xeb, 0x57, + 0x03, 0x00, 0xf8, 0x57, 0x03, 0x00, 0xfc, 0x57, 0x03, 0x00, 0xfe, 0x57, + 0x03, 0x00, 0xff, 0x57, 0x03, 0x00, 0xb0, 0x58, 0x03, 0x00, 0xf7, 0x59, + 0x03, 0x00, 0xf8, 0x59, 0x03, 0x00, 0xfc, 0x59, 0x03, 0x00, 0xfe, 0x59, + 0x03, 0x00, 0xff, 0x59, 0x03, 0x00, 0xb0, 0x5a, 0x03, 0x00, 0xf7, 0x5d, + 0x03, 0x00, 0xf8, 0x5d, 0x03, 0x00, 0xfc, 0x5d, 0x03, 0x00, 0xfe, 0x5d, + 0x03, 0x00, 0xff, 0x5d, 0x03, 0x00, 0xf7, 0x5f, 0x03, 0x00, 0xf8, 0x5f, + 0x03, 0x00, 0xfc, 0x5f, 0x03, 0x00, 0xfe, 0x5f, 0x03, 0x00, 0xff, 0x5f, + 0x03, 0x00, 0xfb, 0x65, 0x03, 0x00, 0x0b, 0x67, 0x03, 0x00, 0xfb, 0x75, + 0x03, 0x00, 0x0b, 0x7b, 0x03, 0x00, 0xfb, 0x7d, 0x03, 0x00, 0xf0, 0x87, + 0x03, 0x00, 0xf1, 0x87, 0x03, 0x00, 0xf3, 0x87, 0x03, 0x00, 0xf9, 0x87, + 0x03, 0x00, 0xfb, 0x87, 0x03, 0x00, 0xfd, 0x87, 0x03, 0x00, 0x11, 0x8b, + 0x03, 0x00, 0x16, 0x8b, 0x03, 0x00, 0x17, 0x8b, 0x03, 0x00, 0x19, 0x8b, + 0x03, 0x00, 0x1d, 0x8b, 0x03, 0x00, 0x76, 0x8b, 0x03, 0x00, 0x77, 0x8b, + 0x03, 0x00, 0x78, 0x8b, 0x03, 0x00, 0x7c, 0x8b, 0x03, 0x00, 0x7e, 0x8b, + 0x03, 0x00, 0x7f, 0x8b, 0x03, 0x00, 0xf8, 0xa7, 0x03, 0x00, 0xfc, 0xa7, + 0x03, 0x00, 0xfe, 0xa7, 0x03, 0x00, 0xff, 0xa7, 0x03, 0x00, 0xd0, 0xb3, + 0x03, 0x00, 0xd8, 0xb3, 0x03, 0x00, 0xdc, 0xb3, 0x03, 0x00, 0xde, 0xb3, + 0x03, 0x00, 0xdf, 0xb3, 0x03, 0x00, 0xf0, 0xb3, 0x03, 0x00, 0xf1, 0xb3, + 0x03, 0x00, 0xf9, 0xb3, 0x03, 0x00, 0xfd, 0xb3, 0x03, 0x00, 0x77, 0xb8, + 0x03, 0x00, 0x78, 0xb8, 0x03, 0x00, 0x7c, 0xb8, 0x03, 0x00, 0x7e, 0xb8, + 0x03, 0x00, 0x7f, 0xb8, 0x03, 0x00, 0x90, 0xbb, 0x03, 0x00, 0x98, 0xbb, + 0x03, 0x00, 0x9c, 0xbb, 0x03, 0x00, 0x9e, 0xbb, 0x03, 0x00, 0x9f, 0xbb, + 0x03, 0x00, 0x90, 0xbf, 0x03, 0x00, 0x98, 0xbf, 0x03, 0x00, 0x9c, 0xbf, + 0x03, 0x00, 0x9e, 0xbf, 0x03, 0x00, 0x9f, 0xbf, 0x03, 0x00, 0xd0, 0xbf, + 0x03, 0x00, 0xd8, 0xbf, 0x03, 0x00, 0xdc, 0xbf, 0x03, 0x00, 0xde, 0xbf, + 0x03, 0x00, 0xdf, 0xbf, 0x03, 0x00, 0xf3, 0xd3, 0x03, 0x00, 0xfb, 0xd3, + 0x03, 0x00, 0xf4, 0xdb, 0x03, 0x00, 0xf5, 0xdb, 0x03, 0x00, 0xf8, 0xdb, + 0x03, 0x00, 0xfc, 0xdb, 0x03, 0x00, 0xfe, 0xdb, 0x03, 0x00, 0xff, 0xdb, + 0x03, 0x00, 0x0b, 0xe5, 0x03, 0x00, 0x08, 0xf3, 0x03, 0x00, 0x0b, 0xf3, + 0x03, 0x00, 0x0b, 0xf9, 0x03, 0x00, 0x0b, 0xfd, 0x03, 0x00, 0x74, 0xfe, + 0x03, 0x00, 0x75, 0xfe, 0x03, 0x00, 0x78, 0xfe, 0x03, 0x00, 0x7c, 0xfe, + 0x03, 0x00, 0x7e, 0xfe, 0x03, 0x00, 0x7f, 0xfe, 0x03, 0x00, 0x08, 0xff, + 0x03, 0x00, 0x0b, 0xff, 0x03, 0x00, 0x78, 0xff, 0x03, 0x00, 0x7c, 0xff, + 0x03, 0x00, 0x7e, 0xff, 0x03, 0x00, 0x7f, 0xff, 0x03, 0x00, 0xf8, 0x05, + 0x04, 0x00, 0xfc, 0x05, 0x04, 0x00, 0xfe, 0x05, 0x04, 0x00, 0xff, 0x05, + 0x04, 0x00, 0x78, 0x06, 0x04, 0x00, 0x7c, 0x06, 0x04, 0x00, 0x7e, 0x06, + 0x04, 0x00, 0x7f, 0x06, 0x04, 0x00, 0x8b, 0x07, 0x04, 0x00, 0xcb, 0x07, + 0x04, 0x00, 0xeb, 0x07, 0x04, 0x00, 0xf8, 0x07, 0x04, 0x00, 0xfc, 0x07, + 0x04, 0x00, 0xfe, 0x07, 0x04, 0x00, 0xff, 0x07, 0x04, 0x00, 0x78, 0x0a, + 0x04, 0x00, 0x7c, 0x0a, 0x04, 0x00, 0x7e, 0x0a, 0x04, 0x00, 0x7f, 0x0a, + 0x04, 0x00, 0xeb, 0x13, 0x04, 0x00, 0x78, 0x16, 0x04, 0x00, 0x7c, 0x16, + 0x04, 0x00, 0x7e, 0x16, 0x04, 0x00, 0x7f, 0x16, 0x04, 0x00, 0x78, 0x17, + 0x04, 0x00, 0x7c, 0x17, 0x04, 0x00, 0x7e, 0x17, 0x04, 0x00, 0x7f, 0x17, + 0x04, 0x00, 0xf8, 0x17, 0x04, 0x00, 0xfc, 0x17, 0x04, 0x00, 0xfe, 0x17, + 0x04, 0x00, 0xff, 0x17, 0x04, 0x00, 0x78, 0x1a, 0x04, 0x00, 0x7c, 0x1a, + 0x04, 0x00, 0x7e, 0x1a, 0x04, 0x00, 0x7f, 0x1a, 0x04, 0x00, 0xb8, 0x24, + 0x04, 0x00, 0xbc, 0x24, 0x04, 0x00, 0xbe, 0x24, 0x04, 0x00, 0xbf, 0x24, + 0x04, 0x00, 0xf8, 0x29, 0x04, 0x00, 0xfc, 0x29, 0x04, 0x00, 0xfe, 0x29, + 0x04, 0x00, 0xff, 0x29, 0x04, 0x00, 0xf8, 0x2b, 0x04, 0x00, 0xfc, 0x2b, + 0x04, 0x00, 0xfe, 0x2b, 0x04, 0x00, 0xff, 0x2b, 0x04, 0x00, 0xf8, 0x2d, + 0x04, 0x00, 0xfc, 0x2d, 0x04, 0x00, 0xfe, 0x2d, 0x04, 0x00, 0xff, 0x2d, + 0x04, 0x00, 0xb8, 0x30, 0x04, 0x00, 0xbc, 0x30, 0x04, 0x00, 0xbe, 0x30, + 0x04, 0x00, 0xbf, 0x30, 0x04, 0x00, 0xeb, 0x33, 0x04, 0x00, 0xf0, 0x33, + 0x04, 0x00, 0xf1, 0x33, 0x04, 0x00, 0xf7, 0x33, 0x04, 0x00, 0xf9, 0x33, + 0x04, 0x00, 0xfd, 0x33, 0x04, 0x00, 0xb0, 0x34, 0x04, 0x00, 0xb1, 0x34, + 0x04, 0x00, 0xb7, 0x34, 0x04, 0x00, 0xb9, 0x34, 0x04, 0x00, 0xbd, 0x34, + 0x04, 0x00, 0xb0, 0x38, 0x04, 0x00, 0xb1, 0x38, 0x04, 0x00, 0xb7, 0x38, + 0x04, 0x00, 0xb9, 0x38, 0x04, 0x00, 0xbd, 0x38, 0x04, 0x00, 0xeb, 0x3b, + 0x04, 0x00, 0xf0, 0x3b, 0x04, 0x00, 0xf1, 0x3b, 0x04, 0x00, 0xf7, 0x3b, + 0x04, 0x00, 0xf9, 0x3b, 0x04, 0x00, 0xfd, 0x3b, 0x04, 0x00, 0xb0, 0x44, + 0x04, 0x00, 0xb1, 0x44, 0x04, 0x00, 0xb9, 0x44, 0x04, 0x00, 0xbd, 0x44, + 0x04, 0x00, 0xb0, 0x46, 0x04, 0x00, 0xb1, 0x46, 0x04, 0x00, 0xb9, 0x46, + 0x04, 0x00, 0xbd, 0x46, 0x04, 0x00, 0xeb, 0x4b, 0x04, 0x00, 0xf8, 0x4b, + 0x04, 0x00, 0xfc, 0x4b, 0x04, 0x00, 0xfe, 0x4b, 0x04, 0x00, 0xff, 0x4b, + 0x04, 0x00, 0x78, 0x52, 0x04, 0x00, 0x7c, 0x52, 0x04, 0x00, 0x7e, 0x52, + 0x04, 0x00, 0x7f, 0x52, 0x04, 0x00, 0x8b, 0x53, 0x04, 0x00, 0x78, 0x5c, + 0x04, 0x00, 0x7c, 0x5c, 0x04, 0x00, 0x7e, 0x5c, 0x04, 0x00, 0x7f, 0x5c, + 0x04, 0x00, 0xf0, 0x5f, 0x04, 0x00, 0xf1, 0x5f, 0x04, 0x00, 0xf9, 0x5f, + 0x04, 0x00, 0xfd, 0x5f, 0x04, 0x00, 0x0b, 0x67, 0x04, 0x00, 0x78, 0x6b, + 0x04, 0x00, 0x7c, 0x6b, 0x04, 0x00, 0x7e, 0x6b, 0x04, 0x00, 0x7f, 0x6b, + 0x04, 0x00, 0xf7, 0x81, 0x04, 0x00, 0x78, 0x85, 0x04, 0x00, 0x7c, 0x85, + 0x04, 0x00, 0x7e, 0x85, 0x04, 0x00, 0x7f, 0x85, 0x04, 0x00, 0xf7, 0x87, + 0x04, 0x00, 0x0b, 0x8b, 0x04, 0x00, 0xf1, 0x8b, 0x04, 0x00, 0xf7, 0x8b, + 0x04, 0x00, 0xf9, 0x8b, 0x04, 0x00, 0xbb, 0x8e, 0x04, 0x00, 0x78, 0xa7, + 0x04, 0x00, 0x7c, 0xa7, 0x04, 0x00, 0x7e, 0xa7, 0x04, 0x00, 0x7f, 0xa7, + 0x04, 0x00, 0xf1, 0xb3, 0x04, 0x00, 0xf7, 0xb3, 0x04, 0x00, 0xf9, 0xb3, + 0x04, 0x00, 0x78, 0xbb, 0x04, 0x00, 0x7c, 0xbb, 0x04, 0x00, 0x7e, 0xbb, + 0x04, 0x00, 0x7f, 0xbb, 0x04, 0x00, 0xf1, 0xbf, 0x04, 0x00, 0xf7, 0xbf, + 0x04, 0x00, 0xf9, 0xbf, 0x04, 0x00, 0xb0, 0xc0, 0x04, 0x00, 0x78, 0xc2, + 0x04, 0x00, 0x7c, 0xc2, 0x04, 0x00, 0x7e, 0xc2, 0x04, 0x00, 0x7f, 0xc2, + 0x04, 0x00, 0x78, 0xc3, 0x04, 0x00, 0x7c, 0xc3, 0x04, 0x00, 0x7e, 0xc3, + 0x04, 0x00, 0x7f, 0xc3, 0x04, 0x00, 0xb0, 0xc6, 0x04, 0x00, 0xb0, 0xc8, + 0x04, 0x00, 0x18, 0xcf, 0x04, 0x00, 0x1c, 0xcf, 0x04, 0x00, 0x1e, 0xcf, + 0x04, 0x00, 0x1f, 0xcf, 0x04, 0x00, 0x91, 0xcf, 0x04, 0x00, 0x96, 0xcf, + 0x04, 0x00, 0x97, 0xcf, 0x04, 0x00, 0x98, 0xcf, 0x04, 0x00, 0x9c, 0xcf, + 0x04, 0x00, 0x9e, 0xcf, 0x04, 0x00, 0x9f, 0xcf, 0x04, 0x00, 0xd1, 0xcf, + 0x04, 0x00, 0xd6, 0xcf, 0x04, 0x00, 0xd7, 0xcf, 0x04, 0x00, 0xd8, 0xcf, + 0x04, 0x00, 0xdc, 0xcf, 0x04, 0x00, 0xde, 0xcf, 0x04, 0x00, 0xdf, 0xcf, + 0x04, 0x00, 0x88, 0xd7, 0x04, 0x00, 0x8b, 0xd7, 0x04, 0x00, 0xb0, 0xe0, + 0x04, 0x00, 0xb0, 0xe8, 0x04, 0x00, 0xb0, 0xf0, 0x04, 0x00, 0x88, 0xf3, + 0x04, 0x00, 0x8b, 0xf3, 0x04, 0x00, 0x90, 0xf3, 0x04, 0x00, 0xb0, 0xf4, + 0x04, 0x00, 0xb0, 0xf6, 0x04, 0x00, 0x78, 0xfe, 0x04, 0x00, 0x7c, 0xfe, + 0x04, 0x00, 0x7e, 0xfe, 0x04, 0x00, 0x7f, 0xfe, 0x04, 0x00, 0x90, 0xff, + 0x04, 0x00, 0x99, 0xff, 0x04, 0x00, 0x9d, 0xff, 0x04, 0x00, 0xd0, 0xff, + 0x04, 0x00, 0xd9, 0xff, 0x04, 0x00, 0xdd, 0xff, 0x04, 0x00, 0x73, 0x01, + 0x05, 0x00, 0x7b, 0x01, 0x05, 0x00, 0xd8, 0x03, 0x05, 0x00, 0xf3, 0x03, + 0x05, 0x00, 0xfb, 0x03, 0x05, 0x00, 0x73, 0x04, 0x05, 0x00, 0x7b, 0x04, + 0x05, 0x00, 0xf4, 0x05, 0x05, 0x00, 0xf5, 0x05, 0x05, 0x00, 0xf8, 0x05, + 0x05, 0x00, 0xfc, 0x05, 0x05, 0x00, 0xfe, 0x05, 0x05, 0x00, 0xff, 0x05, + 0x05, 0x00, 0x74, 0x06, 0x05, 0x00, 0x75, 0x06, 0x05, 0x00, 0x78, 0x06, + 0x05, 0x00, 0x7c, 0x06, 0x05, 0x00, 0x7e, 0x06, 0x05, 0x00, 0x7f, 0x06, + 0x05, 0x00, 0x78, 0x07, 0x05, 0x00, 0x7c, 0x07, 0x05, 0x00, 0x7e, 0x07, + 0x05, 0x00, 0x7f, 0x07, 0x05, 0x00, 0xf4, 0x07, 0x05, 0x00, 0xf5, 0x07, + 0x05, 0x00, 0xf8, 0x07, 0x05, 0x00, 0xfc, 0x07, 0x05, 0x00, 0xfe, 0x07, + 0x05, 0x00, 0xff, 0x07, 0x05, 0x00, 0x74, 0x0a, 0x05, 0x00, 0x75, 0x0a, + 0x05, 0x00, 0x78, 0x0a, 0x05, 0x00, 0x7c, 0x0a, 0x05, 0x00, 0x7e, 0x0a, + 0x05, 0x00, 0x7f, 0x0a, 0x05, 0x00, 0x98, 0x0f, 0x05, 0x00, 0xd8, 0x0f, + 0x05, 0x00, 0x18, 0x11, 0x05, 0x00, 0x74, 0x11, 0x05, 0x00, 0x75, 0x11, + 0x05, 0x00, 0x78, 0x11, 0x05, 0x00, 0x7c, 0x11, 0x05, 0x00, 0x7e, 0x11, + 0x05, 0x00, 0x7f, 0x11, 0x05, 0x00, 0x73, 0x16, 0x05, 0x00, 0x7b, 0x16, + 0x05, 0x00, 0x74, 0x17, 0x05, 0x00, 0x75, 0x17, 0x05, 0x00, 0x78, 0x17, + 0x05, 0x00, 0x7c, 0x17, 0x05, 0x00, 0x7e, 0x17, 0x05, 0x00, 0x7f, 0x17, + 0x05, 0x00, 0xf3, 0x17, 0x05, 0x00, 0xfb, 0x17, 0x05, 0x00, 0xf3, 0x19, + 0x05, 0x00, 0xfb, 0x19, 0x05, 0x00, 0xf8, 0x27, 0x05, 0x00, 0xfc, 0x27, + 0x05, 0x00, 0xfe, 0x27, 0x05, 0x00, 0xff, 0x27, 0x05, 0x00, 0x88, 0x33, + 0x05, 0x00, 0x8b, 0x33, 0x05, 0x00, 0x90, 0x33, 0x05, 0x00, 0x98, 0x33, + 0x05, 0x00, 0x9c, 0x33, 0x05, 0x00, 0x9e, 0x33, 0x05, 0x00, 0x9f, 0x33, + 0x05, 0x00, 0x88, 0x3f, 0x05, 0x00, 0x8b, 0x3f, 0x05, 0x00, 0xf0, 0x3f, + 0x05, 0x00, 0xf1, 0x3f, 0x05, 0x00, 0xf9, 0x3f, 0x05, 0x00, 0xfd, 0x3f, + 0x05, 0x00, 0x78, 0x43, 0x05, 0x00, 0x7c, 0x43, 0x05, 0x00, 0x7e, 0x43, + 0x05, 0x00, 0x7f, 0x43, 0x05, 0x00, 0x70, 0x44, 0x05, 0x00, 0x71, 0x44, + 0x05, 0x00, 0x79, 0x44, 0x05, 0x00, 0x7d, 0x44, 0x05, 0x00, 0xf6, 0x45, + 0x05, 0x00, 0xf7, 0x45, 0x05, 0x00, 0xf8, 0x45, 0x05, 0x00, 0xfc, 0x45, + 0x05, 0x00, 0xfe, 0x45, 0x05, 0x00, 0xff, 0x45, 0x05, 0x00, 0x76, 0x46, + 0x05, 0x00, 0x77, 0x46, 0x05, 0x00, 0x78, 0x46, 0x05, 0x00, 0x7c, 0x46, + 0x05, 0x00, 0x7e, 0x46, 0x05, 0x00, 0x7f, 0x46, 0x05, 0x00, 0xf0, 0x49, + 0x05, 0x00, 0xf1, 0x49, 0x05, 0x00, 0xf9, 0x49, 0x05, 0x00, 0xfd, 0x49, + 0x05, 0x00, 0xd0, 0x4b, 0x05, 0x00, 0xe6, 0x4b, 0x05, 0x00, 0xf0, 0x4b, + 0x05, 0x00, 0xf0, 0x4f, 0x05, 0x00, 0xf1, 0x4f, 0x05, 0x00, 0xf9, 0x4f, + 0x05, 0x00, 0xfd, 0x4f, 0x05, 0x00, 0xb0, 0x50, 0x05, 0x00, 0xf0, 0x51, + 0x05, 0x00, 0xf1, 0x51, 0x05, 0x00, 0xf9, 0x51, 0x05, 0x00, 0xfd, 0x51, + 0x05, 0x00, 0xb0, 0x54, 0x05, 0x00, 0x78, 0x55, 0x05, 0x00, 0x7c, 0x55, + 0x05, 0x00, 0x7e, 0x55, 0x05, 0x00, 0x7f, 0x55, 0x05, 0x00, 0xf7, 0x55, + 0x05, 0x00, 0xf8, 0x55, 0x05, 0x00, 0xfc, 0x55, 0x05, 0x00, 0xfe, 0x55, + 0x05, 0x00, 0xff, 0x55, 0x05, 0x00, 0xb0, 0x56, 0x05, 0x00, 0x86, 0x57, + 0x05, 0x00, 0xc6, 0x57, 0x05, 0x00, 0xe6, 0x57, 0x05, 0x00, 0xf6, 0x57, + 0x05, 0x00, 0xf7, 0x57, 0x05, 0x00, 0xf8, 0x57, 0x05, 0x00, 0xfc, 0x57, + 0x05, 0x00, 0xfe, 0x57, 0x05, 0x00, 0xff, 0x57, 0x05, 0x00, 0xf6, 0x59, + 0x05, 0x00, 0xf7, 0x59, 0x05, 0x00, 0xf8, 0x59, 0x05, 0x00, 0xfc, 0x59, + 0x05, 0x00, 0xfe, 0x59, 0x05, 0x00, 0xff, 0x59, 0x05, 0x00, 0xb0, 0x5a, + 0x05, 0x00, 0xf6, 0x5d, 0x05, 0x00, 0xf7, 0x5d, 0x05, 0x00, 0xf8, 0x5d, + 0x05, 0x00, 0xfc, 0x5d, 0x05, 0x00, 0xfe, 0x5d, 0x05, 0x00, 0xff, 0x5d, + 0x05, 0x00, 0xf0, 0x5f, 0x05, 0x00, 0xf1, 0x5f, 0x05, 0x00, 0xf9, 0x5f, + 0x05, 0x00, 0xfd, 0x5f, 0x05, 0x00, 0x73, 0x66, 0x05, 0x00, 0x7b, 0x66, + 0x05, 0x00, 0x18, 0x67, 0x05, 0x00, 0x1c, 0x67, 0x05, 0x00, 0x1e, 0x67, + 0x05, 0x00, 0x1f, 0x67, 0x05, 0x00, 0x98, 0x67, 0x05, 0x00, 0xd8, 0x67, + 0x05, 0x00, 0xf3, 0x69, 0x05, 0x00, 0xfb, 0x69, 0x05, 0x00, 0xf4, 0x6f, + 0x05, 0x00, 0xf5, 0x6f, 0x05, 0x00, 0xf8, 0x6f, 0x05, 0x00, 0xfc, 0x6f, + 0x05, 0x00, 0xfe, 0x6f, 0x05, 0x00, 0xff, 0x6f, 0x05, 0x00, 0x73, 0x76, + 0x05, 0x00, 0x7b, 0x76, 0x05, 0x00, 0x74, 0x77, 0x05, 0x00, 0x75, 0x77, + 0x05, 0x00, 0x78, 0x77, 0x05, 0x00, 0x7c, 0x77, 0x05, 0x00, 0x7e, 0x77, + 0x05, 0x00, 0x7f, 0x77, 0x05, 0x00, 0x98, 0x77, 0x05, 0x00, 0xd8, 0x77, + 0x05, 0x00, 0xf4, 0x7f, 0x05, 0x00, 0xf5, 0x7f, 0x05, 0x00, 0xf8, 0x7f, + 0x05, 0x00, 0xfc, 0x7f, 0x05, 0x00, 0xfe, 0x7f, 0x05, 0x00, 0xff, 0x7f, + 0x05, 0x00, 0xb1, 0x84, 0x05, 0x00, 0xb9, 0x84, 0x05, 0x00, 0x6b, 0x85, + 0x05, 0x00, 0x78, 0x85, 0x05, 0x00, 0x7c, 0x85, 0x05, 0x00, 0x7e, 0x85, + 0x05, 0x00, 0x7f, 0x85, 0x05, 0x00, 0xb1, 0x86, 0x05, 0x00, 0xb9, 0x86, + 0x05, 0x00, 0x0b, 0x87, 0x05, 0x00, 0x78, 0x8b, 0x05, 0x00, 0x7c, 0x8b, + 0x05, 0x00, 0x7e, 0x8b, 0x05, 0x00, 0x7f, 0x8b, 0x05, 0x00, 0xf1, 0x8b, + 0x05, 0x00, 0xf7, 0x8b, 0x05, 0x00, 0xf9, 0x8b, 0x05, 0x00, 0xb8, 0xa4, + 0x05, 0x00, 0xbc, 0xa4, 0x05, 0x00, 0xbe, 0xa4, 0x05, 0x00, 0xbf, 0xa4, + 0x05, 0x00, 0xf8, 0xab, 0x05, 0x00, 0xfc, 0xab, 0x05, 0x00, 0xfe, 0xab, + 0x05, 0x00, 0xff, 0xab, 0x05, 0x00, 0x8b, 0xb3, 0x05, 0x00, 0xb0, 0xb8, + 0x05, 0x00, 0xb1, 0xb8, 0x05, 0x00, 0xb7, 0xb8, 0x05, 0x00, 0xb9, 0xb8, + 0x05, 0x00, 0xbd, 0xb8, 0x05, 0x00, 0xeb, 0xbb, 0x05, 0x00, 0xf0, 0xbb, + 0x05, 0x00, 0xf1, 0xbb, 0x05, 0x00, 0xf7, 0xbb, 0x05, 0x00, 0xf9, 0xbb, + 0x05, 0x00, 0xfd, 0xbb, 0x05, 0x00, 0x78, 0xbe, 0x05, 0x00, 0x7c, 0xbe, + 0x05, 0x00, 0x7e, 0xbe, 0x05, 0x00, 0x7f, 0xbe, 0x05, 0x00, 0xf8, 0xbf, + 0x05, 0x00, 0xfc, 0xbf, 0x05, 0x00, 0xfe, 0xbf, 0x05, 0x00, 0xff, 0xbf, + 0x05, 0x00, 0x6b, 0xc5, 0x05, 0x00, 0x78, 0xc5, 0x05, 0x00, 0x7c, 0xc5, + 0x05, 0x00, 0x7e, 0xc5, 0x05, 0x00, 0x7f, 0xc5, 0x05, 0x00, 0xf1, 0xc7, + 0x05, 0x00, 0xf9, 0xc7, 0x05, 0x00, 0x6b, 0xe5, 0x05, 0x00, 0x78, 0xe5, + 0x05, 0x00, 0x7c, 0xe5, 0x05, 0x00, 0x7e, 0xe5, 0x05, 0x00, 0x7f, 0xe5, + 0x05, 0x00, 0x78, 0xf9, 0x05, 0x00, 0x7c, 0xf9, 0x05, 0x00, 0x7e, 0xf9, + 0x05, 0x00, 0x7f, 0xf9, 0x05, 0x00, 0x6b, 0xfd, 0x05, 0x00, 0x78, 0xfd, + 0x05, 0x00, 0x7c, 0xfd, 0x05, 0x00, 0x7e, 0xfd, 0x05, 0x00, 0x7f, 0xfd, + 0x05, 0x00, 0x78, 0xff, 0x05, 0x00, 0x7c, 0xff, 0x05, 0x00, 0x7e, 0xff, + 0x05, 0x00, 0x7f, 0xff, 0x05, 0x00, 0xb8, 0x01, 0x06, 0x00, 0xbc, 0x01, + 0x06, 0x00, 0xbe, 0x01, 0x06, 0x00, 0xbf, 0x01, 0x06, 0x00, 0xe8, 0x02, + 0x06, 0x00, 0xeb, 0x02, 0x06, 0x00, 0xf8, 0x02, 0x06, 0x00, 0xfc, 0x02, + 0x06, 0x00, 0xfe, 0x02, 0x06, 0x00, 0xff, 0x02, 0x06, 0x00, 0xb8, 0x04, + 0x06, 0x00, 0xbc, 0x04, 0x06, 0x00, 0xbe, 0x04, 0x06, 0x00, 0xbf, 0x04, + 0x06, 0x00, 0x38, 0x07, 0x06, 0x00, 0x3c, 0x07, 0x06, 0x00, 0x3e, 0x07, + 0x06, 0x00, 0x3f, 0x07, 0x06, 0x00, 0xb8, 0x07, 0x06, 0x00, 0xbc, 0x07, + 0x06, 0x00, 0xbe, 0x07, 0x06, 0x00, 0xbf, 0x07, 0x06, 0x00, 0x38, 0x08, + 0x06, 0x00, 0x3c, 0x08, 0x06, 0x00, 0x3e, 0x08, 0x06, 0x00, 0x3f, 0x08, + 0x06, 0x00, 0x48, 0x0a, 0x06, 0x00, 0x4b, 0x0a, 0x06, 0x00, 0xb8, 0x0a, + 0x06, 0x00, 0xbc, 0x0a, 0x06, 0x00, 0xbe, 0x0a, 0x06, 0x00, 0xbf, 0x0a, + 0x06, 0x00, 0xe8, 0x0b, 0x06, 0x00, 0xeb, 0x0b, 0x06, 0x00, 0xf8, 0x0b, + 0x06, 0x00, 0xfc, 0x0b, 0x06, 0x00, 0xfe, 0x0b, 0x06, 0x00, 0xff, 0x0b, + 0x06, 0x00, 0xcb, 0x0d, 0x06, 0x00, 0xf8, 0x0d, 0x06, 0x00, 0xfc, 0x0d, + 0x06, 0x00, 0xfe, 0x0d, 0x06, 0x00, 0xff, 0x0d, 0x06, 0x00, 0xf8, 0x10, + 0x06, 0x00, 0xfc, 0x10, 0x06, 0x00, 0xfe, 0x10, 0x06, 0x00, 0xff, 0x10, + 0x06, 0x00, 0xf8, 0x13, 0x06, 0x00, 0xfc, 0x13, 0x06, 0x00, 0xfe, 0x13, + 0x06, 0x00, 0xff, 0x13, 0x06, 0x00, 0xe8, 0x14, 0x06, 0x00, 0xeb, 0x14, + 0x06, 0x00, 0xf8, 0x14, 0x06, 0x00, 0xfc, 0x14, 0x06, 0x00, 0xfe, 0x14, + 0x06, 0x00, 0xff, 0x14, 0x06, 0x00, 0xeb, 0x16, 0x06, 0x00, 0xf8, 0x16, + 0x06, 0x00, 0xfc, 0x16, 0x06, 0x00, 0xfe, 0x16, 0x06, 0x00, 0xff, 0x16, + 0x06, 0x00, 0x38, 0x19, 0x06, 0x00, 0x3c, 0x19, 0x06, 0x00, 0x3e, 0x19, + 0x06, 0x00, 0x3f, 0x19, 0x06, 0x00, 0xe8, 0x1b, 0x06, 0x00, 0xeb, 0x1b, + 0x06, 0x00, 0xc8, 0x1f, 0x06, 0x00, 0xcb, 0x1f, 0x06, 0x00, 0xe8, 0x1f, + 0x06, 0x00, 0xeb, 0x1f, 0x06, 0x00, 0xf8, 0x1f, 0x06, 0x00, 0xfc, 0x1f, + 0x06, 0x00, 0xfe, 0x1f, 0x06, 0x00, 0xff, 0x1f, 0x06, 0x00, 0x38, 0x22, + 0x06, 0x00, 0x3c, 0x22, 0x06, 0x00, 0x3e, 0x22, 0x06, 0x00, 0x3f, 0x22, + 0x06, 0x00, 0xe8, 0x23, 0x06, 0x00, 0xeb, 0x23, 0x06, 0x00, 0xf8, 0x23, + 0x06, 0x00, 0xfc, 0x23, 0x06, 0x00, 0xfe, 0x23, 0x06, 0x00, 0xff, 0x23, + 0x06, 0x00, 0x58, 0x29, 0x06, 0x00, 0x5c, 0x29, 0x06, 0x00, 0x5e, 0x29, + 0x06, 0x00, 0x5f, 0x29, 0x06, 0x00, 0x58, 0x2d, 0x06, 0x00, 0x5c, 0x2d, + 0x06, 0x00, 0x5e, 0x2d, 0x06, 0x00, 0x5f, 0x2d, 0x06, 0x00, 0x30, 0x35, + 0x06, 0x00, 0x31, 0x35, 0x06, 0x00, 0x39, 0x35, 0x06, 0x00, 0x3d, 0x35, + 0x06, 0x00, 0x50, 0x35, 0x06, 0x00, 0x51, 0x35, 0x06, 0x00, 0x56, 0x35, + 0x06, 0x00, 0x57, 0x35, 0x06, 0x00, 0x59, 0x35, 0x06, 0x00, 0x5d, 0x35, + 0x06, 0x00, 0xc7, 0x39, 0x06, 0x00, 0xcb, 0x39, 0x06, 0x00, 0xf7, 0x39, + 0x06, 0x00, 0xf8, 0x39, 0x06, 0x00, 0xfc, 0x39, 0x06, 0x00, 0xfe, 0x39, + 0x06, 0x00, 0xff, 0x39, 0x06, 0x00, 0xb8, 0x3d, 0x06, 0x00, 0xbc, 0x3d, + 0x06, 0x00, 0xbe, 0x3d, 0x06, 0x00, 0xbf, 0x3d, 0x06, 0x00, 0xf0, 0x3d, + 0x06, 0x00, 0xf1, 0x3d, 0x06, 0x00, 0xf9, 0x3d, 0x06, 0x00, 0xfd, 0x3d, + 0x06, 0x00, 0x88, 0x3f, 0x06, 0x00, 0x8b, 0x3f, 0x06, 0x00, 0xb0, 0x40, + 0x06, 0x00, 0xb1, 0x40, 0x06, 0x00, 0xb9, 0x40, 0x06, 0x00, 0xbd, 0x40, + 0x06, 0x00, 0xb0, 0x44, 0x06, 0x00, 0xb1, 0x44, 0x06, 0x00, 0xb9, 0x44, + 0x06, 0x00, 0xbd, 0x44, 0x06, 0x00, 0x47, 0x46, 0x06, 0x00, 0x4b, 0x46, + 0x06, 0x00, 0xb0, 0x46, 0x06, 0x00, 0xb1, 0x46, 0x06, 0x00, 0xb9, 0x46, + 0x06, 0x00, 0xbd, 0x46, 0x06, 0x00, 0xb8, 0x4c, 0x06, 0x00, 0xbc, 0x4c, + 0x06, 0x00, 0xbe, 0x4c, 0x06, 0x00, 0xbf, 0x4c, 0x06, 0x00, 0x30, 0x53, + 0x06, 0x00, 0x31, 0x53, 0x06, 0x00, 0x39, 0x53, 0x06, 0x00, 0x3d, 0x53, + 0x06, 0x00, 0xc7, 0x53, 0x06, 0x00, 0xcb, 0x53, 0x06, 0x00, 0xf7, 0x53, + 0x06, 0x00, 0xf8, 0x53, 0x06, 0x00, 0xfc, 0x53, 0x06, 0x00, 0xfe, 0x53, + 0x06, 0x00, 0xff, 0x53, 0x06, 0x00, 0x37, 0x59, 0x06, 0x00, 0x38, 0x59, + 0x06, 0x00, 0x3c, 0x59, 0x06, 0x00, 0x3e, 0x59, 0x06, 0x00, 0x3f, 0x59, + 0x06, 0x00, 0xb8, 0x59, 0x06, 0x00, 0xbc, 0x59, 0x06, 0x00, 0xbe, 0x59, + 0x06, 0x00, 0xbf, 0x59, 0x06, 0x00, 0xf0, 0x59, 0x06, 0x00, 0xf1, 0x59, + 0x06, 0x00, 0xf9, 0x59, 0x06, 0x00, 0xfd, 0x59, 0x06, 0x00, 0x30, 0x5d, + 0x06, 0x00, 0x31, 0x5d, 0x06, 0x00, 0x39, 0x5d, 0x06, 0x00, 0x3d, 0x5d, + 0x06, 0x00, 0xc7, 0x5d, 0x06, 0x00, 0xcb, 0x5d, 0x06, 0x00, 0xf7, 0x5d, + 0x06, 0x00, 0xf8, 0x5d, 0x06, 0x00, 0xfc, 0x5d, 0x06, 0x00, 0xfe, 0x5d, + 0x06, 0x00, 0xff, 0x5d, 0x06, 0x00, 0x37, 0x5f, 0x06, 0x00, 0x38, 0x5f, + 0x06, 0x00, 0x3c, 0x5f, 0x06, 0x00, 0x3e, 0x5f, 0x06, 0x00, 0x3f, 0x5f, + 0x06, 0x00, 0xb8, 0x5f, 0x06, 0x00, 0xbc, 0x5f, 0x06, 0x00, 0xbe, 0x5f, + 0x06, 0x00, 0xbf, 0x5f, 0x06, 0x00, 0xf0, 0x5f, 0x06, 0x00, 0xf1, 0x5f, + 0x06, 0x00, 0xf9, 0x5f, 0x06, 0x00, 0xfd, 0x5f, 0x06, 0x00, 0xeb, 0x64, + 0x06, 0x00, 0xeb, 0x66, 0x06, 0x00, 0xf8, 0x6a, 0x06, 0x00, 0xfc, 0x6a, + 0x06, 0x00, 0xfe, 0x6a, 0x06, 0x00, 0xff, 0x6a, 0x06, 0x00, 0xcb, 0x7a, + 0x06, 0x00, 0xeb, 0x7a, 0x06, 0x00, 0xf8, 0x7c, 0x06, 0x00, 0xfc, 0x7c, + 0x06, 0x00, 0xfe, 0x7c, 0x06, 0x00, 0xff, 0x7c, 0x06, 0x00, 0xf1, 0x80, + 0x06, 0x00, 0xf9, 0x80, 0x06, 0x00, 0xf7, 0x81, 0x06, 0x00, 0xf1, 0x82, + 0x06, 0x00, 0xf9, 0x82, 0x06, 0x00, 0x4b, 0x87, 0x06, 0x00, 0xf7, 0x87, + 0x06, 0x00, 0xbb, 0x89, 0x06, 0x00, 0x4b, 0x8b, 0x06, 0x00, 0xf1, 0x8b, + 0x06, 0x00, 0xf7, 0x8b, 0x06, 0x00, 0xf9, 0x8b, 0x06, 0x00, 0xbb, 0x8d, + 0x06, 0x00, 0x3b, 0x95, 0x06, 0x00, 0x4b, 0xa4, 0x06, 0x00, 0x3b, 0xa5, + 0x06, 0x00, 0x4b, 0xa7, 0x06, 0x00, 0x4b, 0xab, 0x06, 0x00, 0xbb, 0xb2, + 0x06, 0x00, 0xf1, 0xb3, 0x06, 0x00, 0xf7, 0xb3, 0x06, 0x00, 0xf9, 0xb3, + 0x06, 0x00, 0xf1, 0xb7, 0x06, 0x00, 0xf7, 0xb7, 0x06, 0x00, 0xf9, 0xb7, + 0x06, 0x00, 0x4b, 0xbb, 0x06, 0x00, 0xf1, 0xbb, 0x06, 0x00, 0xf7, 0xbb, + 0x06, 0x00, 0xf9, 0xbb, 0x06, 0x00, 0xbb, 0xbe, 0x06, 0x00, 0xf1, 0xbf, + 0x06, 0x00, 0xf7, 0xbf, 0x06, 0x00, 0xf9, 0xbf, 0x06, 0x00, 0x30, 0xc2, + 0x06, 0x00, 0xe6, 0xc3, 0x06, 0x00, 0xf6, 0xc3, 0x06, 0x00, 0xf7, 0xc3, + 0x06, 0x00, 0xf8, 0xc3, 0x06, 0x00, 0xfc, 0xc3, 0x06, 0x00, 0xfe, 0xc3, + 0x06, 0x00, 0xff, 0xc3, 0x06, 0x00, 0xf6, 0xc5, 0x06, 0x00, 0xf7, 0xc5, + 0x06, 0x00, 0xf8, 0xc5, 0x06, 0x00, 0xfc, 0xc5, 0x06, 0x00, 0xfe, 0xc5, + 0x06, 0x00, 0xff, 0xc5, 0x06, 0x00, 0x51, 0xc9, 0x06, 0x00, 0x56, 0xc9, + 0x06, 0x00, 0x57, 0xc9, 0x06, 0x00, 0x58, 0xc9, 0x06, 0x00, 0x5c, 0xc9, + 0x06, 0x00, 0x5e, 0xc9, 0x06, 0x00, 0x5f, 0xc9, 0x06, 0x00, 0xf0, 0xcf, + 0x06, 0x00, 0xf1, 0xcf, 0x06, 0x00, 0xf9, 0xcf, 0x06, 0x00, 0xfd, 0xcf, + 0x06, 0x00, 0xf8, 0xd9, 0x06, 0x00, 0xfc, 0xd9, 0x06, 0x00, 0xfe, 0xd9, + 0x06, 0x00, 0xff, 0xd9, 0x06, 0x00, 0xf8, 0xdd, 0x06, 0x00, 0xfc, 0xdd, + 0x06, 0x00, 0xfe, 0xdd, 0x06, 0x00, 0xff, 0xdd, 0x06, 0x00, 0xf0, 0xe5, + 0x06, 0x00, 0x30, 0xe9, 0x06, 0x00, 0x51, 0xe9, 0x06, 0x00, 0x56, 0xe9, + 0x06, 0x00, 0x57, 0xe9, 0x06, 0x00, 0x58, 0xe9, 0x06, 0x00, 0x5c, 0xe9, + 0x06, 0x00, 0x5e, 0xe9, 0x06, 0x00, 0x5f, 0xe9, 0x06, 0x00, 0x30, 0xec, + 0x06, 0x00, 0x30, 0xed, 0x06, 0x00, 0xf0, 0xef, 0x06, 0x00, 0xf1, 0xef, + 0x06, 0x00, 0xf9, 0xef, 0x06, 0x00, 0xfd, 0xef, 0x06, 0x00, 0x88, 0xf3, + 0x06, 0x00, 0x8b, 0xf3, 0x06, 0x00, 0xf7, 0xf9, 0x06, 0x00, 0xf8, 0xf9, + 0x06, 0x00, 0xfc, 0xf9, 0x06, 0x00, 0xfe, 0xf9, 0x06, 0x00, 0xff, 0xf9, + 0x06, 0x00, 0xf0, 0xfd, 0x06, 0x00, 0x30, 0xff, 0x06, 0x00, 0x33, 0x00, + 0x07, 0x00, 0x3b, 0x00, 0x07, 0x00, 0x33, 0x01, 0x07, 0x00, 0x3b, 0x01, + 0x07, 0x00, 0xb3, 0x01, 0x07, 0x00, 0xbb, 0x01, 0x07, 0x00, 0xc3, 0x01, + 0x07, 0x00, 0xc4, 0x01, 0x07, 0x00, 0xc5, 0x01, 0x07, 0x00, 0xc8, 0x01, + 0x07, 0x00, 0xcb, 0x01, 0x07, 0x00, 0xcc, 0x01, 0x07, 0x00, 0xce, 0x01, + 0x07, 0x00, 0xcf, 0x01, 0x07, 0x00, 0xf4, 0x01, 0x07, 0x00, 0xf5, 0x01, + 0x07, 0x00, 0xf8, 0x01, 0x07, 0x00, 0xfc, 0x01, 0x07, 0x00, 0xfe, 0x01, + 0x07, 0x00, 0xff, 0x01, 0x07, 0x00, 0x34, 0x02, 0x07, 0x00, 0x35, 0x02, + 0x07, 0x00, 0x38, 0x02, 0x07, 0x00, 0x3c, 0x02, 0x07, 0x00, 0x3e, 0x02, + 0x07, 0x00, 0x3f, 0x02, 0x07, 0x00, 0x34, 0x03, 0x07, 0x00, 0x35, 0x03, + 0x07, 0x00, 0x38, 0x03, 0x07, 0x00, 0x3c, 0x03, 0x07, 0x00, 0x3e, 0x03, + 0x07, 0x00, 0x3f, 0x03, 0x07, 0x00, 0xf3, 0x03, 0x07, 0x00, 0xfb, 0x03, + 0x07, 0x00, 0xb4, 0x04, 0x07, 0x00, 0xb5, 0x04, 0x07, 0x00, 0xb8, 0x04, + 0x07, 0x00, 0xbc, 0x04, 0x07, 0x00, 0xbe, 0x04, 0x07, 0x00, 0xbf, 0x04, + 0x07, 0x00, 0xb3, 0x06, 0x07, 0x00, 0xbb, 0x06, 0x07, 0x00, 0xc8, 0x06, + 0x07, 0x00, 0xcb, 0x06, 0x07, 0x00, 0xf8, 0x06, 0x07, 0x00, 0xfc, 0x06, + 0x07, 0x00, 0xfe, 0x06, 0x07, 0x00, 0xff, 0x06, 0x07, 0x00, 0x58, 0x09, + 0x07, 0x00, 0x5c, 0x09, 0x07, 0x00, 0x5e, 0x09, 0x07, 0x00, 0x5f, 0x09, + 0x07, 0x00, 0xcb, 0x09, 0x07, 0x00, 0x43, 0x0a, 0x07, 0x00, 0x44, 0x0a, + 0x07, 0x00, 0x45, 0x0a, 0x07, 0x00, 0x48, 0x0a, 0x07, 0x00, 0x4b, 0x0a, + 0x07, 0x00, 0x4c, 0x0a, 0x07, 0x00, 0x4e, 0x0a, 0x07, 0x00, 0x4f, 0x0a, + 0x07, 0x00, 0x48, 0x0b, 0x07, 0x00, 0x4b, 0x0b, 0x07, 0x00, 0x88, 0x0b, + 0x07, 0x00, 0x8b, 0x0b, 0x07, 0x00, 0x8c, 0x0b, 0x07, 0x00, 0x8e, 0x0b, + 0x07, 0x00, 0x8f, 0x0b, 0x07, 0x00, 0x53, 0x0d, 0x07, 0x00, 0x54, 0x0d, + 0x07, 0x00, 0x55, 0x0d, 0x07, 0x00, 0x5b, 0x0d, 0x07, 0x00, 0x33, 0x0f, + 0x07, 0x00, 0x3b, 0x0f, 0x07, 0x00, 0xe4, 0x0f, 0x07, 0x00, 0xe5, 0x0f, + 0x07, 0x00, 0xe8, 0x0f, 0x07, 0x00, 0xeb, 0x0f, 0x07, 0x00, 0xec, 0x0f, + 0x07, 0x00, 0xee, 0x0f, 0x07, 0x00, 0xef, 0x0f, 0x07, 0x00, 0xf4, 0x0f, + 0x07, 0x00, 0xf5, 0x0f, 0x07, 0x00, 0xf8, 0x0f, 0x07, 0x00, 0xfc, 0x0f, + 0x07, 0x00, 0xfe, 0x0f, 0x07, 0x00, 0xff, 0x0f, 0x07, 0x00, 0x33, 0x11, + 0x07, 0x00, 0x3b, 0x11, 0x07, 0x00, 0xf4, 0x11, 0x07, 0x00, 0xf5, 0x11, + 0x07, 0x00, 0xf8, 0x11, 0x07, 0x00, 0xfc, 0x11, 0x07, 0x00, 0xfe, 0x11, + 0x07, 0x00, 0xff, 0x11, 0x07, 0x00, 0x58, 0x15, 0x07, 0x00, 0x83, 0x17, + 0x07, 0x00, 0x84, 0x17, 0x07, 0x00, 0x85, 0x17, 0x07, 0x00, 0xe3, 0x17, + 0x07, 0x00, 0xf3, 0x17, 0x07, 0x00, 0xfb, 0x17, 0x07, 0x00, 0xc8, 0x18, + 0x07, 0x00, 0xcb, 0x18, 0x07, 0x00, 0xf8, 0x1a, 0x07, 0x00, 0xfc, 0x1a, + 0x07, 0x00, 0xfe, 0x1a, 0x07, 0x00, 0xff, 0x1a, 0x07, 0x00, 0x48, 0x1b, + 0x07, 0x00, 0x4b, 0x1b, 0x07, 0x00, 0xc8, 0x1c, 0x07, 0x00, 0xcb, 0x1c, + 0x07, 0x00, 0xf8, 0x1c, 0x07, 0x00, 0xfc, 0x1c, 0x07, 0x00, 0xfe, 0x1c, + 0x07, 0x00, 0xff, 0x1c, 0x07, 0x00, 0x38, 0x1e, 0x07, 0x00, 0x3c, 0x1e, + 0x07, 0x00, 0x3e, 0x1e, 0x07, 0x00, 0x3f, 0x1e, 0x07, 0x00, 0x33, 0x1f, + 0x07, 0x00, 0x3b, 0x1f, 0x07, 0x00, 0xc8, 0x23, 0x07, 0x00, 0xcb, 0x23, + 0x07, 0x00, 0xf8, 0x23, 0x07, 0x00, 0xfc, 0x23, 0x07, 0x00, 0xfe, 0x23, + 0x07, 0x00, 0xff, 0x23, 0x07, 0x00, 0x38, 0x25, 0x07, 0x00, 0x3c, 0x25, + 0x07, 0x00, 0x3e, 0x25, 0x07, 0x00, 0x3f, 0x25, 0x07, 0x00, 0xf8, 0x29, + 0x07, 0x00, 0xfc, 0x29, 0x07, 0x00, 0xfe, 0x29, 0x07, 0x00, 0xff, 0x29, + 0x07, 0x00, 0xf8, 0x2d, 0x07, 0x00, 0xfc, 0x2d, 0x07, 0x00, 0xfe, 0x2d, + 0x07, 0x00, 0xff, 0x2d, 0x07, 0x00, 0x36, 0x33, 0x07, 0x00, 0x37, 0x33, + 0x07, 0x00, 0x38, 0x33, 0x07, 0x00, 0x3c, 0x33, 0x07, 0x00, 0x3e, 0x33, + 0x07, 0x00, 0x3f, 0x33, 0x07, 0x00, 0xb8, 0x33, 0x07, 0x00, 0xbc, 0x33, + 0x07, 0x00, 0xbe, 0x33, 0x07, 0x00, 0xbf, 0x33, 0x07, 0x00, 0xe9, 0x33, + 0x07, 0x00, 0xea, 0x33, 0x07, 0x00, 0xf0, 0x33, 0x07, 0x00, 0xf1, 0x33, + 0x07, 0x00, 0xf9, 0x33, 0x07, 0x00, 0xfd, 0x33, 0x07, 0x00, 0xc7, 0x35, + 0x07, 0x00, 0xcb, 0x35, 0x07, 0x00, 0xf7, 0x35, 0x07, 0x00, 0xf8, 0x35, + 0x07, 0x00, 0xfc, 0x35, 0x07, 0x00, 0xfe, 0x35, 0x07, 0x00, 0xff, 0x35, + 0x07, 0x00, 0x30, 0x39, 0x07, 0x00, 0x31, 0x39, 0x07, 0x00, 0x39, 0x39, + 0x07, 0x00, 0x3d, 0x39, 0x07, 0x00, 0xc7, 0x39, 0x07, 0x00, 0xcb, 0x39, + 0x07, 0x00, 0xf7, 0x39, 0x07, 0x00, 0xf8, 0x39, 0x07, 0x00, 0xfc, 0x39, + 0x07, 0x00, 0xfe, 0x39, 0x07, 0x00, 0xff, 0x39, 0x07, 0x00, 0x37, 0x3d, + 0x07, 0x00, 0x38, 0x3d, 0x07, 0x00, 0x3c, 0x3d, 0x07, 0x00, 0x3e, 0x3d, + 0x07, 0x00, 0x3f, 0x3d, 0x07, 0x00, 0xb8, 0x3d, 0x07, 0x00, 0xbc, 0x3d, + 0x07, 0x00, 0xbe, 0x3d, 0x07, 0x00, 0xbf, 0x3d, 0x07, 0x00, 0xf0, 0x3d, + 0x07, 0x00, 0xf1, 0x3d, 0x07, 0x00, 0xf9, 0x3d, 0x07, 0x00, 0xfd, 0x3d, + 0x07, 0x00, 0x30, 0x3f, 0x07, 0x00, 0x31, 0x3f, 0x07, 0x00, 0x39, 0x3f, + 0x07, 0x00, 0x3d, 0x3f, 0x07, 0x00, 0xe6, 0x3f, 0x07, 0x00, 0xe7, 0x3f, + 0x07, 0x00, 0xe8, 0x3f, 0x07, 0x00, 0xeb, 0x3f, 0x07, 0x00, 0xf6, 0x3f, + 0x07, 0x00, 0xf7, 0x3f, 0x07, 0x00, 0xf8, 0x3f, 0x07, 0x00, 0xfc, 0x3f, + 0x07, 0x00, 0xfe, 0x3f, 0x07, 0x00, 0xff, 0x3f, 0x07, 0x00, 0x37, 0x40, + 0x07, 0x00, 0x38, 0x40, 0x07, 0x00, 0x3c, 0x40, 0x07, 0x00, 0x3e, 0x40, + 0x07, 0x00, 0x3f, 0x40, 0x07, 0x00, 0x30, 0x41, 0x07, 0x00, 0x31, 0x41, + 0x07, 0x00, 0x39, 0x41, 0x07, 0x00, 0x3d, 0x41, 0x07, 0x00, 0xb7, 0x41, + 0x07, 0x00, 0xb8, 0x41, 0x07, 0x00, 0xbc, 0x41, 0x07, 0x00, 0xbe, 0x41, + 0x07, 0x00, 0xbf, 0x41, 0x07, 0x00, 0xc7, 0x41, 0x07, 0x00, 0xcb, 0x41, + 0x07, 0x00, 0xf7, 0x41, 0x07, 0x00, 0xf8, 0x41, 0x07, 0x00, 0xfc, 0x41, + 0x07, 0x00, 0xfe, 0x41, 0x07, 0x00, 0xff, 0x41, 0x07, 0x00, 0x37, 0x42, + 0x07, 0x00, 0x38, 0x42, 0x07, 0x00, 0x3c, 0x42, 0x07, 0x00, 0x3e, 0x42, + 0x07, 0x00, 0x3f, 0x42, 0x07, 0x00, 0x37, 0x43, 0x07, 0x00, 0x38, 0x43, + 0x07, 0x00, 0x3c, 0x43, 0x07, 0x00, 0x3e, 0x43, 0x07, 0x00, 0x3f, 0x43, + 0x07, 0x00, 0xb8, 0x43, 0x07, 0x00, 0xbc, 0x43, 0x07, 0x00, 0xbe, 0x43, + 0x07, 0x00, 0xbf, 0x43, 0x07, 0x00, 0xf0, 0x43, 0x07, 0x00, 0xf1, 0x43, + 0x07, 0x00, 0xf9, 0x43, 0x07, 0x00, 0xfd, 0x43, 0x07, 0x00, 0xb0, 0x44, + 0x07, 0x00, 0xb1, 0x44, 0x07, 0x00, 0xb9, 0x44, 0x07, 0x00, 0xbd, 0x44, + 0x07, 0x00, 0x47, 0x46, 0x07, 0x00, 0x4b, 0x46, 0x07, 0x00, 0xb0, 0x46, + 0x07, 0x00, 0xb1, 0x46, 0x07, 0x00, 0xb9, 0x46, 0x07, 0x00, 0xbd, 0x46, + 0x07, 0x00, 0x8b, 0x4f, 0x07, 0x00, 0xcb, 0x4f, 0x07, 0x00, 0xeb, 0x4f, + 0x07, 0x00, 0xf0, 0x4f, 0x07, 0x00, 0xf1, 0x4f, 0x07, 0x00, 0xf7, 0x4f, + 0x07, 0x00, 0xf9, 0x4f, 0x07, 0x00, 0xfd, 0x4f, 0x07, 0x00, 0x30, 0x53, + 0x07, 0x00, 0x31, 0x53, 0x07, 0x00, 0x39, 0x53, 0x07, 0x00, 0x3d, 0x53, + 0x07, 0x00, 0xc7, 0x53, 0x07, 0x00, 0xcb, 0x53, 0x07, 0x00, 0xf7, 0x53, + 0x07, 0x00, 0xf8, 0x53, 0x07, 0x00, 0xfc, 0x53, 0x07, 0x00, 0xfe, 0x53, + 0x07, 0x00, 0xff, 0x53, 0x07, 0x00, 0x37, 0x59, 0x07, 0x00, 0x38, 0x59, + 0x07, 0x00, 0x3c, 0x59, 0x07, 0x00, 0x3e, 0x59, 0x07, 0x00, 0x3f, 0x59, + 0x07, 0x00, 0xb8, 0x59, 0x07, 0x00, 0xbc, 0x59, 0x07, 0x00, 0xbe, 0x59, + 0x07, 0x00, 0xbf, 0x59, 0x07, 0x00, 0xf0, 0x59, 0x07, 0x00, 0xf1, 0x59, + 0x07, 0x00, 0xf9, 0x59, 0x07, 0x00, 0xfd, 0x59, 0x07, 0x00, 0x30, 0x5d, + 0x07, 0x00, 0x31, 0x5d, 0x07, 0x00, 0x39, 0x5d, 0x07, 0x00, 0x3d, 0x5d, + 0x07, 0x00, 0xc7, 0x5d, 0x07, 0x00, 0xcb, 0x5d, 0x07, 0x00, 0xf7, 0x5d, + 0x07, 0x00, 0xf8, 0x5d, 0x07, 0x00, 0xfc, 0x5d, 0x07, 0x00, 0xfe, 0x5d, + 0x07, 0x00, 0xff, 0x5d, 0x07, 0x00, 0x37, 0x5f, 0x07, 0x00, 0x38, 0x5f, + 0x07, 0x00, 0x3c, 0x5f, 0x07, 0x00, 0x3e, 0x5f, 0x07, 0x00, 0x3f, 0x5f, + 0x07, 0x00, 0xb8, 0x5f, 0x07, 0x00, 0xbc, 0x5f, 0x07, 0x00, 0xbe, 0x5f, + 0x07, 0x00, 0xbf, 0x5f, 0x07, 0x00, 0xf0, 0x5f, 0x07, 0x00, 0xf1, 0x5f, + 0x07, 0x00, 0xf9, 0x5f, 0x07, 0x00, 0xfd, 0x5f, 0x07, 0x00, 0xeb, 0x64, + 0x07, 0x00, 0xeb, 0x66, 0x07, 0x00, 0xf8, 0x6a, 0x07, 0x00, 0xfc, 0x6a, + 0x07, 0x00, 0xfe, 0x6a, 0x07, 0x00, 0xff, 0x6a, 0x07, 0x00, 0xcb, 0x7a, + 0x07, 0x00, 0xeb, 0x7a, 0x07, 0x00, 0xf8, 0x7c, 0x07, 0x00, 0xfc, 0x7c, + 0x07, 0x00, 0xfe, 0x7c, 0x07, 0x00, 0xff, 0x7c, 0x07, 0x00, 0xb0, 0x80, + 0x07, 0x00, 0xb1, 0x80, 0x07, 0x00, 0xb3, 0x80, 0x07, 0x00, 0xb9, 0x80, + 0x07, 0x00, 0xbb, 0x80, 0x07, 0x00, 0xbd, 0x80, 0x07, 0x00, 0xb4, 0x82, + 0x07, 0x00, 0xb5, 0x82, 0x07, 0x00, 0xb8, 0x82, 0x07, 0x00, 0xbc, 0x82, + 0x07, 0x00, 0xbe, 0x82, 0x07, 0x00, 0xbf, 0x82, 0x07, 0x00, 0x40, 0x84, + 0x07, 0x00, 0x41, 0x84, 0x07, 0x00, 0x42, 0x84, 0x07, 0x00, 0x49, 0x84, + 0x07, 0x00, 0x4a, 0x84, 0x07, 0x00, 0x4d, 0x84, 0x07, 0x00, 0xb2, 0x84, + 0x07, 0x00, 0xb4, 0x84, 0x07, 0x00, 0xb5, 0x84, 0x07, 0x00, 0xb6, 0x84, + 0x07, 0x00, 0xb7, 0x84, 0x07, 0x00, 0xb8, 0x84, 0x07, 0x00, 0xba, 0x84, + 0x07, 0x00, 0xbc, 0x84, 0x07, 0x00, 0xbe, 0x84, 0x07, 0x00, 0xbf, 0x84, + 0x07, 0x00, 0xc6, 0x84, 0x07, 0x00, 0xc7, 0x84, 0x07, 0x00, 0xc8, 0x84, + 0x07, 0x00, 0xcb, 0x84, 0x07, 0x00, 0xf6, 0x84, 0x07, 0x00, 0xf7, 0x84, + 0x07, 0x00, 0xf8, 0x84, 0x07, 0x00, 0xfc, 0x84, 0x07, 0x00, 0xfe, 0x84, + 0x07, 0x00, 0xff, 0x84, 0x07, 0x00, 0x40, 0x86, 0x07, 0x00, 0x41, 0x86, + 0x07, 0x00, 0x42, 0x86, 0x07, 0x00, 0x49, 0x86, 0x07, 0x00, 0x4a, 0x86, + 0x07, 0x00, 0x4d, 0x86, 0x07, 0x00, 0xb0, 0x86, 0x07, 0x00, 0xb1, 0x86, + 0x07, 0x00, 0xb3, 0x86, 0x07, 0x00, 0xb9, 0x86, 0x07, 0x00, 0xbb, 0x86, + 0x07, 0x00, 0xbd, 0x86, 0x07, 0x00, 0xc9, 0x86, 0x07, 0x00, 0xca, 0x86, + 0x07, 0x00, 0xf0, 0x86, 0x07, 0x00, 0xf1, 0x86, 0x07, 0x00, 0xf9, 0x86, + 0x07, 0x00, 0xfd, 0x86, 0x07, 0x00, 0x49, 0x87, 0x07, 0x00, 0x4a, 0x87, + 0x07, 0x00, 0xb0, 0x88, 0x07, 0x00, 0xb1, 0x88, 0x07, 0x00, 0xb3, 0x88, + 0x07, 0x00, 0xb9, 0x88, 0x07, 0x00, 0xbb, 0x88, 0x07, 0x00, 0xbd, 0x88, + 0x07, 0x00, 0x43, 0x8a, 0x07, 0x00, 0x44, 0x8a, 0x07, 0x00, 0x45, 0x8a, + 0x07, 0x00, 0x46, 0x8a, 0x07, 0x00, 0x47, 0x8a, 0x07, 0x00, 0x48, 0x8a, + 0x07, 0x00, 0x4b, 0x8a, 0x07, 0x00, 0x4c, 0x8a, 0x07, 0x00, 0x4e, 0x8a, + 0x07, 0x00, 0x4f, 0x8a, 0x07, 0x00, 0xb7, 0x8a, 0x07, 0x00, 0xeb, 0x8a, + 0x07, 0x00, 0xf7, 0x8a, 0x07, 0x00, 0xf8, 0x8a, 0x07, 0x00, 0xfc, 0x8a, + 0x07, 0x00, 0xfe, 0x8a, 0x07, 0x00, 0xff, 0x8a, 0x07, 0x00, 0x46, 0x8b, + 0x07, 0x00, 0x47, 0x8b, 0x07, 0x00, 0x48, 0x8b, 0x07, 0x00, 0x4b, 0x8b, + 0x07, 0x00, 0x80, 0x8b, 0x07, 0x00, 0x81, 0x8b, 0x07, 0x00, 0x82, 0x8b, + 0x07, 0x00, 0x88, 0x8b, 0x07, 0x00, 0x8b, 0x8b, 0x07, 0x00, 0x8c, 0x8b, + 0x07, 0x00, 0x8e, 0x8b, 0x07, 0x00, 0x8f, 0x8b, 0x07, 0x00, 0xb3, 0x8c, + 0x07, 0x00, 0xbb, 0x8c, 0x07, 0x00, 0x88, 0x8f, 0x07, 0x00, 0x8b, 0x8f, + 0x07, 0x00, 0x8c, 0x8f, 0x07, 0x00, 0x8e, 0x8f, 0x07, 0x00, 0x8f, 0x8f, + 0x07, 0x00, 0xf4, 0x93, 0x07, 0x00, 0xf5, 0x93, 0x07, 0x00, 0xf8, 0x93, + 0x07, 0x00, 0xfc, 0x93, 0x07, 0x00, 0xfe, 0x93, 0x07, 0x00, 0xff, 0x93, + 0x07, 0x00, 0x34, 0x99, 0x07, 0x00, 0x35, 0x99, 0x07, 0x00, 0x38, 0x99, + 0x07, 0x00, 0x3c, 0x99, 0x07, 0x00, 0x3e, 0x99, 0x07, 0x00, 0x3f, 0x99, + 0x07, 0x00, 0xf3, 0x99, 0x07, 0x00, 0xfb, 0x99, 0x07, 0x00, 0xf3, 0x9d, + 0x07, 0x00, 0xfb, 0x9d, 0x07, 0x00, 0xf4, 0x9f, 0x07, 0x00, 0xf5, 0x9f, + 0x07, 0x00, 0xf8, 0x9f, 0x07, 0x00, 0xfc, 0x9f, 0x07, 0x00, 0xfe, 0x9f, + 0x07, 0x00, 0xff, 0x9f, 0x07, 0x00, 0xb8, 0xa0, 0x07, 0x00, 0xbc, 0xa0, + 0x07, 0x00, 0xbe, 0xa0, 0x07, 0x00, 0xbf, 0xa0, 0x07, 0x00, 0x4b, 0xa4, + 0x07, 0x00, 0xb8, 0xa4, 0x07, 0x00, 0xbc, 0xa4, 0x07, 0x00, 0xbe, 0xa4, + 0x07, 0x00, 0xbf, 0xa4, 0x07, 0x00, 0xb8, 0xa6, 0x07, 0x00, 0xbc, 0xa6, + 0x07, 0x00, 0xbe, 0xa6, 0x07, 0x00, 0xbf, 0xa6, 0x07, 0x00, 0xb6, 0xb0, + 0x07, 0x00, 0xb7, 0xb0, 0x07, 0x00, 0xb8, 0xb0, 0x07, 0x00, 0xbc, 0xb0, + 0x07, 0x00, 0xbe, 0xb0, 0x07, 0x00, 0xbf, 0xb0, 0x07, 0x00, 0xb0, 0xb4, + 0x07, 0x00, 0xb1, 0xb4, 0x07, 0x00, 0xb9, 0xb4, 0x07, 0x00, 0xbd, 0xb4, + 0x07, 0x00, 0xb0, 0xb6, 0x07, 0x00, 0xb1, 0xb6, 0x07, 0x00, 0xb9, 0xb6, + 0x07, 0x00, 0xbd, 0xb6, 0x07, 0x00, 0x88, 0xb7, 0x07, 0x00, 0x8b, 0xb7, + 0x07, 0x00, 0x47, 0xb8, 0x07, 0x00, 0x4b, 0xb8, 0x07, 0x00, 0xb0, 0xb8, + 0x07, 0x00, 0xb1, 0xb8, 0x07, 0x00, 0xb9, 0xb8, 0x07, 0x00, 0xbd, 0xb8, + 0x07, 0x00, 0x46, 0xba, 0x07, 0x00, 0x47, 0xba, 0x07, 0x00, 0x48, 0xba, + 0x07, 0x00, 0x4b, 0xba, 0x07, 0x00, 0xb7, 0xba, 0x07, 0x00, 0xb8, 0xba, + 0x07, 0x00, 0xbc, 0xba, 0x07, 0x00, 0xbe, 0xba, 0x07, 0x00, 0xbf, 0xba, + 0x07, 0x00, 0x88, 0xbb, 0x07, 0x00, 0x8b, 0xbb, 0x07, 0x00, 0x48, 0xbe, + 0x07, 0x00, 0x4b, 0xbe, 0x07, 0x00, 0x88, 0xbf, 0x07, 0x00, 0x8b, 0xbf, + 0x07, 0x00, 0xc0, 0xc3, 0x07, 0x00, 0xc1, 0xc3, 0x07, 0x00, 0xc2, 0xc3, + 0x07, 0x00, 0xc9, 0xc3, 0x07, 0x00, 0xca, 0xc3, 0x07, 0x00, 0xcd, 0xc3, + 0x07, 0x00, 0xf0, 0xc3, 0x07, 0x00, 0xf1, 0xc3, 0x07, 0x00, 0xf3, 0xc3, + 0x07, 0x00, 0xf9, 0xc3, 0x07, 0x00, 0xfb, 0xc3, 0x07, 0x00, 0xfd, 0xc3, + 0x07, 0x00, 0x30, 0xc5, 0x07, 0x00, 0x31, 0xc5, 0x07, 0x00, 0x33, 0xc5, + 0x07, 0x00, 0x39, 0xc5, 0x07, 0x00, 0x3b, 0xc5, 0x07, 0x00, 0x3d, 0xc5, + 0x07, 0x00, 0xb3, 0xc5, 0x07, 0x00, 0xbb, 0xc5, 0x07, 0x00, 0xc3, 0xc5, + 0x07, 0x00, 0xc4, 0xc5, 0x07, 0x00, 0xc5, 0xc5, 0x07, 0x00, 0xc6, 0xc5, + 0x07, 0x00, 0xc7, 0xc5, 0x07, 0x00, 0xc8, 0xc5, 0x07, 0x00, 0xcb, 0xc5, + 0x07, 0x00, 0xcc, 0xc5, 0x07, 0x00, 0xce, 0xc5, 0x07, 0x00, 0xcf, 0xc5, + 0x07, 0x00, 0xf2, 0xc5, 0x07, 0x00, 0xf4, 0xc5, 0x07, 0x00, 0xf5, 0xc5, + 0x07, 0x00, 0xf6, 0xc5, 0x07, 0x00, 0xf7, 0xc5, 0x07, 0x00, 0xf8, 0xc5, + 0x07, 0x00, 0xfa, 0xc5, 0x07, 0x00, 0xfc, 0xc5, 0x07, 0x00, 0xfe, 0xc5, + 0x07, 0x00, 0xff, 0xc5, 0x07, 0x00, 0xf7, 0xc9, 0x07, 0x00, 0xf7, 0xcd, + 0x07, 0x00, 0x88, 0xcf, 0x07, 0x00, 0x8b, 0xcf, 0x07, 0x00, 0x8c, 0xcf, + 0x07, 0x00, 0x8e, 0xcf, 0x07, 0x00, 0x8f, 0xcf, 0x07, 0x00, 0xc3, 0xcf, + 0x07, 0x00, 0xc4, 0xcf, 0x07, 0x00, 0xc5, 0xcf, 0x07, 0x00, 0xc6, 0xcf, + 0x07, 0x00, 0xc7, 0xcf, 0x07, 0x00, 0xc8, 0xcf, 0x07, 0x00, 0xcb, 0xcf, + 0x07, 0x00, 0xcc, 0xcf, 0x07, 0x00, 0xce, 0xcf, 0x07, 0x00, 0xcf, 0xcf, + 0x07, 0x00, 0xe0, 0xcf, 0x07, 0x00, 0xe1, 0xcf, 0x07, 0x00, 0xe2, 0xcf, + 0x07, 0x00, 0xe4, 0xcf, 0x07, 0x00, 0xe5, 0xcf, 0x07, 0x00, 0xe6, 0xcf, + 0x07, 0x00, 0xe7, 0xcf, 0x07, 0x00, 0xe8, 0xcf, 0x07, 0x00, 0xeb, 0xcf, + 0x07, 0x00, 0xec, 0xcf, 0x07, 0x00, 0xee, 0xcf, 0x07, 0x00, 0xef, 0xcf, + 0x07, 0x00, 0xf2, 0xcf, 0x07, 0x00, 0xf4, 0xcf, 0x07, 0x00, 0xf5, 0xcf, + 0x07, 0x00, 0xf6, 0xcf, 0x07, 0x00, 0xf7, 0xcf, 0x07, 0x00, 0xf8, 0xcf, + 0x07, 0x00, 0xfa, 0xcf, 0x07, 0x00, 0xfc, 0xcf, 0x07, 0x00, 0xfe, 0xcf, + 0x07, 0x00, 0xff, 0xcf, 0x07, 0x00, 0x34, 0xd3, 0x07, 0x00, 0x35, 0xd3, + 0x07, 0x00, 0x38, 0xd3, 0x07, 0x00, 0x3c, 0xd3, 0x07, 0x00, 0x3e, 0xd3, + 0x07, 0x00, 0x3f, 0xd3, 0x07, 0x00, 0xf3, 0xd3, 0x07, 0x00, 0xfb, 0xd3, + 0x07, 0x00, 0x34, 0xd9, 0x07, 0x00, 0x35, 0xd9, 0x07, 0x00, 0x38, 0xd9, + 0x07, 0x00, 0x3c, 0xd9, 0x07, 0x00, 0x3e, 0xd9, 0x07, 0x00, 0x3f, 0xd9, + 0x07, 0x00, 0xf3, 0xd9, 0x07, 0x00, 0xfb, 0xd9, 0x07, 0x00, 0x33, 0xdd, + 0x07, 0x00, 0x3b, 0xdd, 0x07, 0x00, 0xc3, 0xdd, 0x07, 0x00, 0xc4, 0xdd, + 0x07, 0x00, 0xc5, 0xdd, 0x07, 0x00, 0xc8, 0xdd, 0x07, 0x00, 0xcb, 0xdd, + 0x07, 0x00, 0xcc, 0xdd, 0x07, 0x00, 0xce, 0xdd, 0x07, 0x00, 0xcf, 0xdd, + 0x07, 0x00, 0xf4, 0xdd, 0x07, 0x00, 0xf5, 0xdd, 0x07, 0x00, 0xf8, 0xdd, + 0x07, 0x00, 0xfc, 0xdd, 0x07, 0x00, 0xfe, 0xdd, 0x07, 0x00, 0xff, 0xdd, + 0x07, 0x00, 0x38, 0xde, 0x07, 0x00, 0x3c, 0xde, 0x07, 0x00, 0x3e, 0xde, + 0x07, 0x00, 0x3f, 0xde, 0x07, 0x00, 0x33, 0xdf, 0x07, 0x00, 0x3b, 0xdf, + 0x07, 0x00, 0xc3, 0xdf, 0x07, 0x00, 0xc4, 0xdf, 0x07, 0x00, 0xc5, 0xdf, + 0x07, 0x00, 0xc8, 0xdf, 0x07, 0x00, 0xcb, 0xdf, 0x07, 0x00, 0xcc, 0xdf, + 0x07, 0x00, 0xce, 0xdf, 0x07, 0x00, 0xcf, 0xdf, 0x07, 0x00, 0xf4, 0xdf, + 0x07, 0x00, 0xf5, 0xdf, 0x07, 0x00, 0xf8, 0xdf, 0x07, 0x00, 0xfc, 0xdf, + 0x07, 0x00, 0xfe, 0xdf, 0x07, 0x00, 0xff, 0xdf, 0x07, 0x00, 0xb4, 0xe2, + 0x07, 0x00, 0xb5, 0xe2, 0x07, 0x00, 0xb8, 0xe2, 0x07, 0x00, 0xbc, 0xe2, + 0x07, 0x00, 0xbe, 0xe2, 0x07, 0x00, 0xbf, 0xe2, 0x07, 0x00, 0xf2, 0xe3, + 0x07, 0x00, 0xf4, 0xe3, 0x07, 0x00, 0xf5, 0xe3, 0x07, 0x00, 0xf6, 0xe3, + 0x07, 0x00, 0xf7, 0xe3, 0x07, 0x00, 0xf8, 0xe3, 0x07, 0x00, 0xfa, 0xe3, + 0x07, 0x00, 0xfc, 0xe3, 0x07, 0x00, 0xfe, 0xe3, 0x07, 0x00, 0xff, 0xe3, + 0x07, 0x00, 0x51, 0xe5, 0x07, 0x00, 0x56, 0xe5, 0x07, 0x00, 0x57, 0xe5, + 0x07, 0x00, 0x59, 0xe5, 0x07, 0x00, 0x5d, 0xe5, 0x07, 0x00, 0xf7, 0xe5, + 0x07, 0x00, 0xf0, 0xe9, 0x07, 0x00, 0xf1, 0xe9, 0x07, 0x00, 0xf3, 0xe9, + 0x07, 0x00, 0xf9, 0xe9, 0x07, 0x00, 0xfb, 0xe9, 0x07, 0x00, 0xfd, 0xe9, + 0x07, 0x00, 0xf0, 0xed, 0x07, 0x00, 0xf1, 0xed, 0x07, 0x00, 0xf3, 0xed, + 0x07, 0x00, 0xf9, 0xed, 0x07, 0x00, 0xfb, 0xed, 0x07, 0x00, 0xfd, 0xed, + 0x07, 0x00, 0xf2, 0xef, 0x07, 0x00, 0xf4, 0xef, 0x07, 0x00, 0xf5, 0xef, + 0x07, 0x00, 0xf6, 0xef, 0x07, 0x00, 0xf7, 0xef, 0x07, 0x00, 0xf8, 0xef, + 0x07, 0x00, 0xfa, 0xef, 0x07, 0x00, 0xfc, 0xef, 0x07, 0x00, 0xfe, 0xef, + 0x07, 0x00, 0xff, 0xef, 0x07, 0x00, 0xf2, 0xf3, 0x07, 0x00, 0xf4, 0xf3, + 0x07, 0x00, 0xf5, 0xf3, 0x07, 0x00, 0xf6, 0xf3, 0x07, 0x00, 0xf7, 0xf3, + 0x07, 0x00, 0xf8, 0xf3, 0x07, 0x00, 0xfa, 0xf3, 0x07, 0x00, 0xfc, 0xf3, + 0x07, 0x00, 0xfe, 0xf3, 0x07, 0x00, 0xff, 0xf3, 0x07, 0x00, 0xf7, 0xf5, + 0x07, 0x00, 0x31, 0xf9, 0x07, 0x00, 0x39, 0xf9, 0x07, 0x00, 0x50, 0xf9, + 0x07, 0x00, 0x51, 0xf9, 0x07, 0x00, 0x56, 0xf9, 0x07, 0x00, 0x57, 0xf9, + 0x07, 0x00, 0x59, 0xf9, 0x07, 0x00, 0x5d, 0xf9, 0x07, 0x00, 0xf7, 0xf9, + 0x07, 0x00, 0x51, 0xfd, 0x07, 0x00, 0x56, 0xfd, 0x07, 0x00, 0x57, 0xfd, + 0x07, 0x00, 0x59, 0xfd, 0x07, 0x00, 0x5d, 0xfd, 0x07, 0x00, 0xf7, 0xfd, + 0x07, 0x00, 0x88, 0xff, 0x07, 0x00, 0x8b, 0xff, 0x07, 0x00, 0x8c, 0xff, + 0x07, 0x00, 0x8e, 0xff, 0x07, 0x00, 0x8f, 0xff, 0x07, 0x00, 0xc3, 0xff, + 0x07, 0x00, 0xc4, 0xff, 0x07, 0x00, 0xc5, 0xff, 0x07, 0x00, 0xc6, 0xff, + 0x07, 0x00, 0xc7, 0xff, 0x07, 0x00, 0xc8, 0xff, 0x07, 0x00, 0xcb, 0xff, + 0x07, 0x00, 0xcc, 0xff, 0x07, 0x00, 0xce, 0xff, 0x07, 0x00, 0xcf, 0xff, + 0x07, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xe1, 0xff, 0x07, 0x00, 0xe2, 0xff, + 0x07, 0x00, 0xe4, 0xff, 0x07, 0x00, 0xe5, 0xff, 0x07, 0x00, 0xe6, 0xff, + 0x07, 0x00, 0xe7, 0xff, 0x07, 0x00, 0xe8, 0xff, 0x07, 0x00, 0xeb, 0xff, + 0x07, 0x00, 0xec, 0xff, 0x07, 0x00, 0xee, 0xff, 0x07, 0x00, 0xef, 0xff, + 0x07, 0x00, 0xf2, 0xff, 0x07, 0x00, 0xf4, 0xff, 0x07, 0x00, 0xf5, 0xff, + 0x07, 0x00, 0xf6, 0xff, 0x07, 0x00, 0xf7, 0xff, 0x07, 0x00, 0xf8, 0xff, + 0x07, 0x00, 0xfa, 0xff, 0x07, 0x00, 0xfc, 0xff, 0x07, 0x00, 0xfe, 0xff, + 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xf8, 0x00, 0x08, 0x00, 0xfc, 0x00, + 0x08, 0x00, 0xfe, 0x00, 0x08, 0x00, 0xff, 0x00, 0x08, 0x00, 0x78, 0x01, + 0x08, 0x00, 0x7c, 0x01, 0x08, 0x00, 0x7e, 0x01, 0x08, 0x00, 0x7f, 0x01, + 0x08, 0x00, 0xcb, 0x02, 0x08, 0x00, 0xeb, 0x02, 0x08, 0x00, 0xeb, 0x03, + 0x08, 0x00, 0xeb, 0x0b, 0x08, 0x00, 0xf8, 0x0b, 0x08, 0x00, 0xfc, 0x0b, + 0x08, 0x00, 0xfe, 0x0b, 0x08, 0x00, 0xff, 0x0b, 0x08, 0x00, 0xf8, 0x14, + 0x08, 0x00, 0xfc, 0x14, 0x08, 0x00, 0xfe, 0x14, 0x08, 0x00, 0xff, 0x14, + 0x08, 0x00, 0x2b, 0x16, 0x08, 0x00, 0x78, 0x16, 0x08, 0x00, 0x7c, 0x16, + 0x08, 0x00, 0x7e, 0x16, 0x08, 0x00, 0x7f, 0x16, 0x08, 0x00, 0x2b, 0x17, + 0x08, 0x00, 0x78, 0x17, 0x08, 0x00, 0x7c, 0x17, 0x08, 0x00, 0x7e, 0x17, + 0x08, 0x00, 0x7f, 0x17, 0x08, 0x00, 0xab, 0x17, 0x08, 0x00, 0xf8, 0x17, + 0x08, 0x00, 0xfc, 0x17, 0x08, 0x00, 0xfe, 0x17, 0x08, 0x00, 0xff, 0x17, + 0x08, 0x00, 0x4b, 0x18, 0x08, 0x00, 0xeb, 0x1b, 0x08, 0x00, 0x2b, 0x1f, + 0x08, 0x00, 0xf8, 0x21, 0x08, 0x00, 0xfc, 0x21, 0x08, 0x00, 0xfe, 0x21, + 0x08, 0x00, 0xff, 0x21, 0x08, 0x00, 0xcb, 0x22, 0x08, 0x00, 0xeb, 0x22, + 0x08, 0x00, 0xeb, 0x23, 0x08, 0x00, 0x8b, 0x27, 0x08, 0x00, 0xcb, 0x27, + 0x08, 0x00, 0xeb, 0x27, 0x08, 0x00, 0xf8, 0x27, 0x08, 0x00, 0xfc, 0x27, + 0x08, 0x00, 0xfe, 0x27, 0x08, 0x00, 0xff, 0x27, 0x08, 0x00, 0xf8, 0x29, + 0x08, 0x00, 0xfc, 0x29, 0x08, 0x00, 0xfe, 0x29, 0x08, 0x00, 0xff, 0x29, + 0x08, 0x00, 0x8b, 0x2b, 0x08, 0x00, 0x47, 0x30, 0x08, 0x00, 0xb0, 0x30, + 0x08, 0x00, 0xb0, 0x34, 0x08, 0x00, 0x0b, 0x35, 0x08, 0x00, 0xb0, 0x37, + 0x08, 0x00, 0x8b, 0x3b, 0x08, 0x00, 0xf0, 0x3f, 0x08, 0x00, 0xf1, 0x3f, + 0x08, 0x00, 0xf7, 0x3f, 0x08, 0x00, 0xf9, 0x3f, 0x08, 0x00, 0xfd, 0x3f, + 0x08, 0x00, 0x77, 0x40, 0x08, 0x00, 0x78, 0x40, 0x08, 0x00, 0x7c, 0x40, + 0x08, 0x00, 0x7e, 0x40, 0x08, 0x00, 0x7f, 0x40, 0x08, 0x00, 0xf0, 0x41, + 0x08, 0x00, 0xf1, 0x41, 0x08, 0x00, 0xf9, 0x41, 0x08, 0x00, 0xfd, 0x41, + 0x08, 0x00, 0x8b, 0x43, 0x08, 0x00, 0xb0, 0x44, 0x08, 0x00, 0xb0, 0x46, + 0x08, 0x00, 0xb0, 0x47, 0x08, 0x00, 0xb0, 0x48, 0x08, 0x00, 0x6b, 0x49, + 0x08, 0x00, 0x30, 0x4b, 0x08, 0x00, 0xf0, 0x4b, 0x08, 0x00, 0x6b, 0x4d, + 0x08, 0x00, 0x8b, 0x4f, 0x08, 0x00, 0xcb, 0x4f, 0x08, 0x00, 0xeb, 0x4f, + 0x08, 0x00, 0xf0, 0x4f, 0x08, 0x00, 0xf1, 0x4f, 0x08, 0x00, 0xf7, 0x4f, + 0x08, 0x00, 0xf9, 0x4f, 0x08, 0x00, 0xfd, 0x4f, 0x08, 0x00, 0x78, 0x52, + 0x08, 0x00, 0x7c, 0x52, 0x08, 0x00, 0x7e, 0x52, 0x08, 0x00, 0x7f, 0x52, + 0x08, 0x00, 0x6b, 0x55, 0x08, 0x00, 0x78, 0x55, 0x08, 0x00, 0x7c, 0x55, + 0x08, 0x00, 0x7e, 0x55, 0x08, 0x00, 0x7f, 0x55, 0x08, 0x00, 0xcb, 0x57, + 0x08, 0x00, 0xeb, 0x57, 0x08, 0x00, 0xf8, 0x57, 0x08, 0x00, 0xfc, 0x57, + 0x08, 0x00, 0xfe, 0x57, 0x08, 0x00, 0xff, 0x57, 0x08, 0x00, 0x8b, 0x5b, + 0x08, 0x00, 0x78, 0x5c, 0x08, 0x00, 0x7c, 0x5c, 0x08, 0x00, 0x7e, 0x5c, + 0x08, 0x00, 0x7f, 0x5c, 0x08, 0x00, 0x78, 0x5e, 0x08, 0x00, 0x7c, 0x5e, + 0x08, 0x00, 0x7e, 0x5e, 0x08, 0x00, 0x7f, 0x5e, 0x08, 0x00, 0xf7, 0x5f, + 0x08, 0x00, 0xf8, 0x5f, 0x08, 0x00, 0xfc, 0x5f, 0x08, 0x00, 0xfe, 0x5f, + 0x08, 0x00, 0xff, 0x5f, 0x08, 0x00, 0x0b, 0x67, 0x08, 0x00, 0xcb, 0x6a, + 0x08, 0x00, 0xeb, 0x6a, 0x08, 0x00, 0xf8, 0x6a, 0x08, 0x00, 0xfc, 0x6a, + 0x08, 0x00, 0xfe, 0x6a, 0x08, 0x00, 0xff, 0x6a, 0x08, 0x00, 0x0b, 0x6b, + 0x08, 0x00, 0x4b, 0x6b, 0x08, 0x00, 0x4b, 0x78, 0x08, 0x00, 0xcb, 0x7a, + 0x08, 0x00, 0xeb, 0x7a, 0x08, 0x00, 0x0b, 0x7b, 0x08, 0x00, 0x4b, 0x7b, + 0x08, 0x00, 0xf8, 0x7c, 0x08, 0x00, 0xfc, 0x7c, 0x08, 0x00, 0xfe, 0x7c, + 0x08, 0x00, 0xff, 0x7c, 0x08, 0x00, 0x2b, 0x7e, 0x08, 0x00, 0xc7, 0x84, + 0x08, 0x00, 0xf7, 0x84, 0x08, 0x00, 0xf8, 0x84, 0x08, 0x00, 0xfc, 0x84, + 0x08, 0x00, 0xfe, 0x84, 0x08, 0x00, 0xff, 0x84, 0x08, 0x00, 0xc7, 0x86, + 0x08, 0x00, 0xf7, 0x86, 0x08, 0x00, 0xf8, 0x86, 0x08, 0x00, 0xfc, 0x86, + 0x08, 0x00, 0xfe, 0x86, 0x08, 0x00, 0xff, 0x86, 0x08, 0x00, 0xf7, 0x87, + 0x08, 0x00, 0x0b, 0x8a, 0x08, 0x00, 0x4b, 0x8b, 0x08, 0x00, 0x78, 0x8b, + 0x08, 0x00, 0x7c, 0x8b, 0x08, 0x00, 0x7e, 0x8b, 0x08, 0x00, 0x7f, 0x8b, + 0x08, 0x00, 0x0b, 0x8e, 0x08, 0x00, 0xbb, 0x8e, 0x08, 0x00, 0xf1, 0x8f, + 0x08, 0x00, 0xf7, 0x8f, 0x08, 0x00, 0xf9, 0x8f, 0x08, 0x00, 0xfb, 0x95, + 0x08, 0x00, 0xf8, 0x9a, 0x08, 0x00, 0xfc, 0x9a, 0x08, 0x00, 0xfe, 0x9a, + 0x08, 0x00, 0xff, 0x9a, 0x08, 0x00, 0xeb, 0xa4, 0x08, 0x00, 0xf8, 0xa4, + 0x08, 0x00, 0xfc, 0xa4, 0x08, 0x00, 0xfe, 0xa4, 0x08, 0x00, 0xff, 0xa4, + 0x08, 0x00, 0x3b, 0xa5, 0x08, 0x00, 0x0b, 0xa6, 0x08, 0x00, 0x2b, 0xa6, + 0x08, 0x00, 0xeb, 0xa6, 0x08, 0x00, 0x4b, 0xab, 0x08, 0x00, 0x71, 0xb1, + 0x08, 0x00, 0x77, 0xb1, 0x08, 0x00, 0x79, 0xb1, 0x08, 0x00, 0xf1, 0xb3, + 0x08, 0x00, 0xf7, 0xb3, 0x08, 0x00, 0xf9, 0xb3, 0x08, 0x00, 0x0b, 0xb5, + 0x08, 0x00, 0xf1, 0xb7, 0x08, 0x00, 0xf7, 0xb7, 0x08, 0x00, 0xf9, 0xb7, + 0x08, 0x00, 0xf0, 0xb8, 0x08, 0x00, 0xf1, 0xb8, 0x08, 0x00, 0xf7, 0xb8, + 0x08, 0x00, 0xf9, 0xb8, 0x08, 0x00, 0xfd, 0xb8, 0x08, 0x00, 0xbb, 0xb9, + 0x08, 0x00, 0x0b, 0xba, 0x08, 0x00, 0x4b, 0xbb, 0x08, 0x00, 0x78, 0xbb, + 0x08, 0x00, 0x7c, 0xbb, 0x08, 0x00, 0x7e, 0xbb, 0x08, 0x00, 0x7f, 0xbb, + 0x08, 0x00, 0xbb, 0xbd, 0x08, 0x00, 0xb0, 0xc0, 0x08, 0x00, 0xf6, 0xc0, + 0x08, 0x00, 0xf7, 0xc0, 0x08, 0x00, 0xf8, 0xc0, 0x08, 0x00, 0xfc, 0xc0, + 0x08, 0x00, 0xfe, 0xc0, 0x08, 0x00, 0xff, 0xc0, 0x08, 0x00, 0xf0, 0xc1, + 0x08, 0x00, 0xf1, 0xc1, 0x08, 0x00, 0xf9, 0xc1, 0x08, 0x00, 0xfd, 0xc1, + 0x08, 0x00, 0x78, 0xc3, 0x08, 0x00, 0x7c, 0xc3, 0x08, 0x00, 0x7e, 0xc3, + 0x08, 0x00, 0x7f, 0xc3, 0x08, 0x00, 0x30, 0xc7, 0x08, 0x00, 0x47, 0xc8, + 0x08, 0x00, 0x4b, 0xc8, 0x08, 0x00, 0xb0, 0xc8, 0x08, 0x00, 0xf0, 0xc9, + 0x08, 0x00, 0xf1, 0xc9, 0x08, 0x00, 0xf9, 0xc9, 0x08, 0x00, 0xfd, 0xc9, + 0x08, 0x00, 0x30, 0xcb, 0x08, 0x00, 0xe6, 0xcb, 0x08, 0x00, 0xf0, 0xcb, + 0x08, 0x00, 0xd1, 0xcc, 0x08, 0x00, 0xd6, 0xcc, 0x08, 0x00, 0xd7, 0xcc, + 0x08, 0x00, 0xd8, 0xcc, 0x08, 0x00, 0xdc, 0xcc, 0x08, 0x00, 0xde, 0xcc, + 0x08, 0x00, 0xdf, 0xcc, 0x08, 0x00, 0xf0, 0xcc, 0x08, 0x00, 0xf1, 0xcc, + 0x08, 0x00, 0xf9, 0xcc, 0x08, 0x00, 0xfd, 0xcc, 0x08, 0x00, 0x2b, 0xce, + 0x08, 0x00, 0xf0, 0xce, 0x08, 0x00, 0xf1, 0xce, 0x08, 0x00, 0xf9, 0xce, + 0x08, 0x00, 0xfd, 0xce, 0x08, 0x00, 0x28, 0xcf, 0x08, 0x00, 0x2b, 0xcf, + 0x08, 0x00, 0xa8, 0xcf, 0x08, 0x00, 0xab, 0xcf, 0x08, 0x00, 0xf0, 0xcf, + 0x08, 0x00, 0xf1, 0xcf, 0x08, 0x00, 0xf9, 0xcf, 0x08, 0x00, 0xfd, 0xcf, + 0x08, 0x00, 0xc8, 0xd0, 0x08, 0x00, 0xcb, 0xd0, 0x08, 0x00, 0x48, 0xd1, + 0x08, 0x00, 0x4b, 0xd1, 0x08, 0x00, 0xf8, 0xd1, 0x08, 0x00, 0xfc, 0xd1, + 0x08, 0x00, 0xfe, 0xd1, 0x08, 0x00, 0xff, 0xd1, 0x08, 0x00, 0xc8, 0xd3, + 0x08, 0x00, 0xcb, 0xd3, 0x08, 0x00, 0xe8, 0xd4, 0x08, 0x00, 0xeb, 0xd4, + 0x08, 0x00, 0xf8, 0xd5, 0x08, 0x00, 0xfc, 0xd5, 0x08, 0x00, 0xfe, 0xd5, + 0x08, 0x00, 0xff, 0xd5, 0x08, 0x00, 0xeb, 0xd6, 0x08, 0x00, 0x88, 0xd7, + 0x08, 0x00, 0x8b, 0xd7, 0x08, 0x00, 0xc8, 0xd7, 0x08, 0x00, 0xcb, 0xd7, + 0x08, 0x00, 0xe8, 0xd7, 0x08, 0x00, 0xeb, 0xd7, 0x08, 0x00, 0xf8, 0xdb, + 0x08, 0x00, 0xfc, 0xdb, 0x08, 0x00, 0xfe, 0xdb, 0x08, 0x00, 0xff, 0xdb, + 0x08, 0x00, 0xb0, 0xe0, 0x08, 0x00, 0xf6, 0xe1, 0x08, 0x00, 0xf7, 0xe1, + 0x08, 0x00, 0xf8, 0xe1, 0x08, 0x00, 0xfc, 0xe1, 0x08, 0x00, 0xfe, 0xe1, + 0x08, 0x00, 0xff, 0xe1, 0x08, 0x00, 0x30, 0xe5, 0x08, 0x00, 0x30, 0xe7, + 0x08, 0x00, 0xb0, 0xe8, 0x08, 0x00, 0xf6, 0xe9, 0x08, 0x00, 0xf7, 0xe9, + 0x08, 0x00, 0xf8, 0xe9, 0x08, 0x00, 0xfc, 0xe9, 0x08, 0x00, 0xfe, 0xe9, + 0x08, 0x00, 0xff, 0xe9, 0x08, 0x00, 0x30, 0xeb, 0x08, 0x00, 0xf0, 0xeb, + 0x08, 0x00, 0xf0, 0xec, 0x08, 0x00, 0xf1, 0xec, 0x08, 0x00, 0xf9, 0xec, + 0x08, 0x00, 0xfd, 0xec, 0x08, 0x00, 0xf0, 0xed, 0x08, 0x00, 0xf6, 0xee, + 0x08, 0x00, 0xf7, 0xee, 0x08, 0x00, 0xf8, 0xee, 0x08, 0x00, 0xfc, 0xee, + 0x08, 0x00, 0xfe, 0xee, 0x08, 0x00, 0xff, 0xee, 0x08, 0x00, 0xf0, 0xef, + 0x08, 0x00, 0xf1, 0xef, 0x08, 0x00, 0xf9, 0xef, 0x08, 0x00, 0xfd, 0xef, + 0x08, 0x00, 0x47, 0xf0, 0x08, 0x00, 0x4b, 0xf0, 0x08, 0x00, 0xb0, 0xf0, + 0x08, 0x00, 0xf0, 0xf1, 0x08, 0x00, 0xf1, 0xf1, 0x08, 0x00, 0xf9, 0xf1, + 0x08, 0x00, 0xfd, 0xf1, 0x08, 0x00, 0x30, 0xf3, 0x08, 0x00, 0xd0, 0xf3, + 0x08, 0x00, 0xe6, 0xf3, 0x08, 0x00, 0xf0, 0xf3, 0x08, 0x00, 0xb0, 0xf4, + 0x08, 0x00, 0xf0, 0xf4, 0x08, 0x00, 0xf1, 0xf4, 0x08, 0x00, 0xf9, 0xf4, + 0x08, 0x00, 0xfd, 0xf4, 0x08, 0x00, 0xb0, 0xf6, 0x08, 0x00, 0xf0, 0xf6, + 0x08, 0x00, 0xf1, 0xf6, 0x08, 0x00, 0xf9, 0xf6, 0x08, 0x00, 0xfd, 0xf6, + 0x08, 0x00, 0x86, 0xf7, 0x08, 0x00, 0xf0, 0xf7, 0x08, 0x00, 0xf1, 0xf7, + 0x08, 0x00, 0xf9, 0xf7, 0x08, 0x00, 0xfd, 0xf7, 0x08, 0x00, 0x30, 0xf9, + 0x08, 0x00, 0x30, 0xfb, 0x08, 0x00, 0xe6, 0xfb, 0x08, 0x00, 0xf0, 0xfb, + 0x08, 0x00, 0x30, 0xfd, 0x08, 0x00, 0x78, 0xfe, 0x08, 0x00, 0x7c, 0xfe, + 0x08, 0x00, 0x7e, 0xfe, 0x08, 0x00, 0x7f, 0xfe, 0x08, 0x00, 0x30, 0xff, + 0x08, 0x00, 0x90, 0xff, 0x08, 0x00, 0x99, 0xff, 0x08, 0x00, 0x9d, 0xff, + 0x08, 0x00, 0xd0, 0xff, 0x08, 0x00, 0xd9, 0xff, 0x08, 0x00, 0xdd, 0xff, + 0x08, 0x00, 0xf3, 0x00, 0x09, 0x00, 0xfb, 0x00, 0x09, 0x00, 0xf3, 0x01, + 0x09, 0x00, 0xfb, 0x01, 0x09, 0x00, 0xf3, 0x02, 0x09, 0x00, 0xfb, 0x02, + 0x09, 0x00, 0x58, 0x05, 0x09, 0x00, 0x5c, 0x05, 0x09, 0x00, 0x5e, 0x05, + 0x09, 0x00, 0x5f, 0x05, 0x09, 0x00, 0xf4, 0x07, 0x09, 0x00, 0xf5, 0x07, + 0x09, 0x00, 0xf8, 0x07, 0x09, 0x00, 0xfc, 0x07, 0x09, 0x00, 0xfe, 0x07, + 0x09, 0x00, 0xff, 0x07, 0x09, 0x00, 0xf3, 0x08, 0x09, 0x00, 0xfb, 0x08, + 0x09, 0x00, 0xf4, 0x0b, 0x09, 0x00, 0xf5, 0x0b, 0x09, 0x00, 0xf8, 0x0b, + 0x09, 0x00, 0xfc, 0x0b, 0x09, 0x00, 0xfe, 0x0b, 0x09, 0x00, 0xff, 0x0b, + 0x09, 0x00, 0xf4, 0x0c, 0x09, 0x00, 0xf5, 0x0c, 0x09, 0x00, 0xf8, 0x0c, + 0x09, 0x00, 0xfc, 0x0c, 0x09, 0x00, 0xfe, 0x0c, 0x09, 0x00, 0xff, 0x0c, + 0x09, 0x00, 0xf4, 0x11, 0x09, 0x00, 0xf5, 0x11, 0x09, 0x00, 0xf8, 0x11, + 0x09, 0x00, 0xfc, 0x11, 0x09, 0x00, 0xfe, 0x11, 0x09, 0x00, 0xff, 0x11, + 0x09, 0x00, 0xf4, 0x14, 0x09, 0x00, 0xf5, 0x14, 0x09, 0x00, 0xf8, 0x14, + 0x09, 0x00, 0xfc, 0x14, 0x09, 0x00, 0xfe, 0x14, 0x09, 0x00, 0xff, 0x14, + 0x09, 0x00, 0xf4, 0x1f, 0x09, 0x00, 0xf5, 0x1f, 0x09, 0x00, 0xf8, 0x1f, + 0x09, 0x00, 0xfc, 0x1f, 0x09, 0x00, 0xfe, 0x1f, 0x09, 0x00, 0xff, 0x1f, + 0x09, 0x00, 0xcb, 0x25, 0x09, 0x00, 0xf8, 0x29, 0x09, 0x00, 0xfc, 0x29, + 0x09, 0x00, 0xfe, 0x29, 0x09, 0x00, 0xff, 0x29, 0x09, 0x00, 0x88, 0x33, + 0x09, 0x00, 0x8b, 0x33, 0x09, 0x00, 0xc7, 0x35, 0x09, 0x00, 0xf7, 0x35, + 0x09, 0x00, 0xf8, 0x35, 0x09, 0x00, 0xfc, 0x35, 0x09, 0x00, 0xfe, 0x35, + 0x09, 0x00, 0xff, 0x35, 0x09, 0x00, 0xcb, 0x39, 0x09, 0x00, 0xf0, 0x39, + 0x09, 0x00, 0xf1, 0x39, 0x09, 0x00, 0xf9, 0x39, 0x09, 0x00, 0xfd, 0x39, + 0x09, 0x00, 0xcb, 0x3d, 0x09, 0x00, 0xf0, 0x3d, 0x09, 0x00, 0xf1, 0x3d, + 0x09, 0x00, 0xf9, 0x3d, 0x09, 0x00, 0xfd, 0x3d, 0x09, 0x00, 0x88, 0x3f, + 0x09, 0x00, 0x8b, 0x3f, 0x09, 0x00, 0x30, 0x40, 0x09, 0x00, 0x30, 0x41, + 0x09, 0x00, 0xf0, 0x41, 0x09, 0x00, 0xf1, 0x41, 0x09, 0x00, 0xf9, 0x41, + 0x09, 0x00, 0xfd, 0x41, 0x09, 0x00, 0x30, 0x42, 0x09, 0x00, 0xf6, 0x43, + 0x09, 0x00, 0xf7, 0x43, 0x09, 0x00, 0xf8, 0x43, 0x09, 0x00, 0xfc, 0x43, + 0x09, 0x00, 0xfe, 0x43, 0x09, 0x00, 0xff, 0x43, 0x09, 0x00, 0xb0, 0x46, + 0x09, 0x00, 0x51, 0x49, 0x09, 0x00, 0x56, 0x49, 0x09, 0x00, 0x57, 0x49, + 0x09, 0x00, 0x58, 0x49, 0x09, 0x00, 0x5c, 0x49, 0x09, 0x00, 0x5e, 0x49, + 0x09, 0x00, 0x5f, 0x49, 0x09, 0x00, 0xf0, 0x49, 0x09, 0x00, 0xf1, 0x49, + 0x09, 0x00, 0xf9, 0x49, 0x09, 0x00, 0xfd, 0x49, 0x09, 0x00, 0xf0, 0x4f, + 0x09, 0x00, 0xf1, 0x4f, 0x09, 0x00, 0xf9, 0x4f, 0x09, 0x00, 0xfd, 0x4f, + 0x09, 0x00, 0x30, 0x53, 0x09, 0x00, 0xf0, 0x53, 0x09, 0x00, 0xf1, 0x53, + 0x09, 0x00, 0xf9, 0x53, 0x09, 0x00, 0xfd, 0x53, 0x09, 0x00, 0xf6, 0x59, + 0x09, 0x00, 0xf7, 0x59, 0x09, 0x00, 0xf8, 0x59, 0x09, 0x00, 0xfc, 0x59, + 0x09, 0x00, 0xfe, 0x59, 0x09, 0x00, 0xff, 0x59, 0x09, 0x00, 0xf6, 0x5d, + 0x09, 0x00, 0xf7, 0x5d, 0x09, 0x00, 0xf8, 0x5d, 0x09, 0x00, 0xfc, 0x5d, + 0x09, 0x00, 0xfe, 0x5d, 0x09, 0x00, 0xff, 0x5d, 0x09, 0x00, 0x30, 0x5f, + 0x09, 0x00, 0xf0, 0x5f, 0x09, 0x00, 0xf1, 0x5f, 0x09, 0x00, 0xf9, 0x5f, + 0x09, 0x00, 0xfd, 0x5f, 0x09, 0x00, 0xf4, 0x61, 0x09, 0x00, 0xf5, 0x61, + 0x09, 0x00, 0xf8, 0x61, 0x09, 0x00, 0xfc, 0x61, 0x09, 0x00, 0xfe, 0x61, + 0x09, 0x00, 0xff, 0x61, 0x09, 0x00, 0xf3, 0x69, 0x09, 0x00, 0xfb, 0x69, + 0x09, 0x00, 0xf8, 0x6a, 0x09, 0x00, 0xfc, 0x6a, 0x09, 0x00, 0xfe, 0x6a, + 0x09, 0x00, 0xff, 0x6a, 0x09, 0x00, 0xf4, 0x6f, 0x09, 0x00, 0xf5, 0x6f, + 0x09, 0x00, 0xf8, 0x6f, 0x09, 0x00, 0xfc, 0x6f, 0x09, 0x00, 0xfe, 0x6f, + 0x09, 0x00, 0xff, 0x6f, 0x09, 0x00, 0xcb, 0x72, 0x09, 0x00, 0xeb, 0x72, + 0x09, 0x00, 0xf8, 0x72, 0x09, 0x00, 0xfc, 0x72, 0x09, 0x00, 0xfe, 0x72, + 0x09, 0x00, 0xff, 0x72, 0x09, 0x00, 0xf3, 0x77, 0x09, 0x00, 0xfb, 0x77, + 0x09, 0x00, 0xe8, 0x7c, 0x09, 0x00, 0xeb, 0x7c, 0x09, 0x00, 0xf8, 0x7c, + 0x09, 0x00, 0xfc, 0x7c, 0x09, 0x00, 0xfe, 0x7c, 0x09, 0x00, 0xff, 0x7c, + 0x09, 0x00, 0xeb, 0x7e, 0x09, 0x00, 0xf8, 0x7e, 0x09, 0x00, 0xfc, 0x7e, + 0x09, 0x00, 0xfe, 0x7e, 0x09, 0x00, 0xff, 0x7e, 0x09, 0x00, 0xb7, 0x80, + 0x09, 0x00, 0xf7, 0x83, 0x09, 0x00, 0xb1, 0x84, 0x09, 0x00, 0xb9, 0x84, + 0x09, 0x00, 0x31, 0x85, 0x09, 0x00, 0x39, 0x85, 0x09, 0x00, 0x37, 0x86, + 0x09, 0x00, 0x38, 0x86, 0x09, 0x00, 0x3c, 0x86, 0x09, 0x00, 0x3e, 0x86, + 0x09, 0x00, 0x3f, 0x86, 0x09, 0x00, 0xb1, 0x86, 0x09, 0x00, 0xb9, 0x86, + 0x09, 0x00, 0x37, 0x87, 0x09, 0x00, 0x47, 0x87, 0x09, 0x00, 0x4b, 0x87, + 0x09, 0x00, 0xb1, 0x87, 0x09, 0x00, 0xb9, 0x87, 0x09, 0x00, 0xf1, 0x87, + 0x09, 0x00, 0xf9, 0x87, 0x09, 0x00, 0xb1, 0x88, 0x09, 0x00, 0xb7, 0x88, + 0x09, 0x00, 0xb9, 0x88, 0x09, 0x00, 0xb1, 0x8b, 0x09, 0x00, 0xb7, 0x8b, + 0x09, 0x00, 0xb9, 0x8b, 0x09, 0x00, 0xf1, 0x8b, 0x09, 0x00, 0xf7, 0x8b, + 0x09, 0x00, 0xf9, 0x8b, 0x09, 0x00, 0x38, 0x9e, 0x09, 0x00, 0x3c, 0x9e, + 0x09, 0x00, 0x3e, 0x9e, 0x09, 0x00, 0x3f, 0x9e, 0x09, 0x00, 0xb8, 0xa4, + 0x09, 0x00, 0xbc, 0xa4, 0x09, 0x00, 0xbe, 0xa4, 0x09, 0x00, 0xbf, 0xa4, + 0x09, 0x00, 0x4b, 0xa6, 0x09, 0x00, 0x38, 0xa7, 0x09, 0x00, 0x3c, 0xa7, + 0x09, 0x00, 0x3e, 0xa7, 0x09, 0x00, 0x3f, 0xa7, 0x09, 0x00, 0xb8, 0xa7, + 0x09, 0x00, 0xbc, 0xa7, 0x09, 0x00, 0xbe, 0xa7, 0x09, 0x00, 0xbf, 0xa7, + 0x09, 0x00, 0xeb, 0xa7, 0x09, 0x00, 0xf8, 0xab, 0x09, 0x00, 0xfc, 0xab, + 0x09, 0x00, 0xfe, 0xab, 0x09, 0x00, 0xff, 0xab, 0x09, 0x00, 0xcb, 0xaf, + 0x09, 0x00, 0xeb, 0xaf, 0x09, 0x00, 0xf8, 0xaf, 0x09, 0x00, 0xfc, 0xaf, + 0x09, 0x00, 0xfe, 0xaf, 0x09, 0x00, 0xff, 0xaf, 0x09, 0x00, 0xb8, 0xb0, + 0x09, 0x00, 0xbc, 0xb0, 0x09, 0x00, 0xbe, 0xb0, 0x09, 0x00, 0xbf, 0xb0, + 0x09, 0x00, 0x4b, 0xb2, 0x09, 0x00, 0x38, 0xb3, 0x09, 0x00, 0x3c, 0xb3, + 0x09, 0x00, 0x3e, 0xb3, 0x09, 0x00, 0x3f, 0xb3, 0x09, 0x00, 0xb8, 0xb3, + 0x09, 0x00, 0xbc, 0xb3, 0x09, 0x00, 0xbe, 0xb3, 0x09, 0x00, 0xbf, 0xb3, + 0x09, 0x00, 0xeb, 0xb3, 0x09, 0x00, 0xf0, 0xb3, 0x09, 0x00, 0xf1, 0xb3, + 0x09, 0x00, 0xf7, 0xb3, 0x09, 0x00, 0xf9, 0xb3, 0x09, 0x00, 0xfd, 0xb3, + 0x09, 0x00, 0xb0, 0xb4, 0x09, 0x00, 0xb1, 0xb4, 0x09, 0x00, 0xb7, 0xb4, + 0x09, 0x00, 0xb9, 0xb4, 0x09, 0x00, 0xbd, 0xb4, 0x09, 0x00, 0xeb, 0xb7, + 0x09, 0x00, 0xf0, 0xb7, 0x09, 0x00, 0xf1, 0xb7, 0x09, 0x00, 0xf7, 0xb7, + 0x09, 0x00, 0xf9, 0xb7, 0x09, 0x00, 0xfd, 0xb7, 0x09, 0x00, 0xb0, 0xb8, + 0x09, 0x00, 0xb1, 0xb8, 0x09, 0x00, 0xb7, 0xb8, 0x09, 0x00, 0xb9, 0xb8, + 0x09, 0x00, 0xbd, 0xb8, 0x09, 0x00, 0x38, 0xbb, 0x09, 0x00, 0x3c, 0xbb, + 0x09, 0x00, 0x3e, 0xbb, 0x09, 0x00, 0x3f, 0xbb, 0x09, 0x00, 0xb0, 0xbb, + 0x09, 0x00, 0xb1, 0xbb, 0x09, 0x00, 0xb7, 0xbb, 0x09, 0x00, 0xb9, 0xbb, + 0x09, 0x00, 0xbd, 0xbb, 0x09, 0x00, 0xeb, 0xbb, 0x09, 0x00, 0xf0, 0xbb, + 0x09, 0x00, 0xf1, 0xbb, 0x09, 0x00, 0xf7, 0xbb, 0x09, 0x00, 0xf9, 0xbb, + 0x09, 0x00, 0xfd, 0xbb, 0x09, 0x00, 0x4b, 0xbc, 0x09, 0x00, 0x30, 0xbf, + 0x09, 0x00, 0x31, 0xbf, 0x09, 0x00, 0x37, 0xbf, 0x09, 0x00, 0x39, 0xbf, + 0x09, 0x00, 0x3d, 0xbf, 0x09, 0x00, 0xf8, 0xbf, 0x09, 0x00, 0xfc, 0xbf, + 0x09, 0x00, 0xfe, 0xbf, 0x09, 0x00, 0xff, 0xbf, 0x09, 0x00, 0xf7, 0xc5, + 0x09, 0x00, 0xcb, 0xdd, 0x09, 0x00, 0xf1, 0xe9, 0x09, 0x00, 0xf9, 0xe9, + 0x09, 0x00, 0xf1, 0xed, 0x09, 0x00, 0xf9, 0xed, 0x09, 0x00, 0xf8, 0xfc, + 0x09, 0x00, 0xfc, 0xfc, 0x09, 0x00, 0xfe, 0xfc, 0x09, 0x00, 0xff, 0xfc, + 0x09, 0x00, 0x31, 0xff, 0x09, 0x00, 0x37, 0xff, 0x09, 0x00, 0x39, 0xff, + 0x09, 0x00, 0xb8, 0x01, 0x0a, 0x00, 0xbc, 0x01, 0x0a, 0x00, 0xbe, 0x01, + 0x0a, 0x00, 0xbf, 0x01, 0x0a, 0x00, 0xb8, 0x04, 0x0a, 0x00, 0xbc, 0x04, + 0x0a, 0x00, 0xbe, 0x04, 0x0a, 0x00, 0xbf, 0x04, 0x0a, 0x00, 0xf8, 0x05, + 0x0a, 0x00, 0xfc, 0x05, 0x0a, 0x00, 0xfe, 0x05, 0x0a, 0x00, 0xff, 0x05, + 0x0a, 0x00, 0x38, 0x07, 0x0a, 0x00, 0x3c, 0x07, 0x0a, 0x00, 0x3e, 0x07, + 0x0a, 0x00, 0x3f, 0x07, 0x0a, 0x00, 0xb8, 0x07, 0x0a, 0x00, 0xbc, 0x07, + 0x0a, 0x00, 0xbe, 0x07, 0x0a, 0x00, 0xbf, 0x07, 0x0a, 0x00, 0x38, 0x08, + 0x0a, 0x00, 0x3c, 0x08, 0x0a, 0x00, 0x3e, 0x08, 0x0a, 0x00, 0x3f, 0x08, + 0x0a, 0x00, 0xb8, 0x0a, 0x0a, 0x00, 0xbc, 0x0a, 0x0a, 0x00, 0xbe, 0x0a, + 0x0a, 0x00, 0xbf, 0x0a, 0x0a, 0x00, 0xe8, 0x0b, 0x0a, 0x00, 0xeb, 0x0b, + 0x0a, 0x00, 0xf8, 0x0b, 0x0a, 0x00, 0xfc, 0x0b, 0x0a, 0x00, 0xfe, 0x0b, + 0x0a, 0x00, 0xff, 0x0b, 0x0a, 0x00, 0xf8, 0x10, 0x0a, 0x00, 0xfc, 0x10, + 0x0a, 0x00, 0xfe, 0x10, 0x0a, 0x00, 0xff, 0x10, 0x0a, 0x00, 0xb8, 0x11, + 0x0a, 0x00, 0xbc, 0x11, 0x0a, 0x00, 0xbe, 0x11, 0x0a, 0x00, 0xbf, 0x11, + 0x0a, 0x00, 0xf8, 0x13, 0x0a, 0x00, 0xfc, 0x13, 0x0a, 0x00, 0xfe, 0x13, + 0x0a, 0x00, 0xff, 0x13, 0x0a, 0x00, 0xe8, 0x14, 0x0a, 0x00, 0xeb, 0x14, + 0x0a, 0x00, 0xf8, 0x14, 0x0a, 0x00, 0xfc, 0x14, 0x0a, 0x00, 0xfe, 0x14, + 0x0a, 0x00, 0xff, 0x14, 0x0a, 0x00, 0xeb, 0x16, 0x0a, 0x00, 0xf8, 0x16, + 0x0a, 0x00, 0xfc, 0x16, 0x0a, 0x00, 0xfe, 0x16, 0x0a, 0x00, 0xff, 0x16, + 0x0a, 0x00, 0x88, 0x17, 0x0a, 0x00, 0x8b, 0x17, 0x0a, 0x00, 0xc8, 0x17, + 0x0a, 0x00, 0xcb, 0x17, 0x0a, 0x00, 0xe8, 0x17, 0x0a, 0x00, 0xeb, 0x17, + 0x0a, 0x00, 0xf8, 0x17, 0x0a, 0x00, 0xfc, 0x17, 0x0a, 0x00, 0xfe, 0x17, + 0x0a, 0x00, 0xff, 0x17, 0x0a, 0x00, 0x38, 0x19, 0x0a, 0x00, 0x3c, 0x19, + 0x0a, 0x00, 0x3e, 0x19, 0x0a, 0x00, 0x3f, 0x19, 0x0a, 0x00, 0xe8, 0x1b, + 0x0a, 0x00, 0xeb, 0x1b, 0x0a, 0x00, 0x38, 0x22, 0x0a, 0x00, 0x3c, 0x22, + 0x0a, 0x00, 0x3e, 0x22, 0x0a, 0x00, 0x3f, 0x22, 0x0a, 0x00, 0xc8, 0x22, + 0x0a, 0x00, 0xcb, 0x22, 0x0a, 0x00, 0xe8, 0x22, 0x0a, 0x00, 0xeb, 0x22, + 0x0a, 0x00, 0xf8, 0x22, 0x0a, 0x00, 0xfc, 0x22, 0x0a, 0x00, 0xfe, 0x22, + 0x0a, 0x00, 0xff, 0x22, 0x0a, 0x00, 0xe8, 0x23, 0x0a, 0x00, 0xeb, 0x23, + 0x0a, 0x00, 0xf8, 0x23, 0x0a, 0x00, 0xfc, 0x23, 0x0a, 0x00, 0xfe, 0x23, + 0x0a, 0x00, 0xff, 0x23, 0x0a, 0x00, 0x58, 0x29, 0x0a, 0x00, 0x5c, 0x29, + 0x0a, 0x00, 0x5e, 0x29, 0x0a, 0x00, 0x5f, 0x29, 0x0a, 0x00, 0xf8, 0x29, + 0x0a, 0x00, 0xfc, 0x29, 0x0a, 0x00, 0xfe, 0x29, 0x0a, 0x00, 0xff, 0x29, + 0x0a, 0x00, 0x58, 0x2d, 0x0a, 0x00, 0x5c, 0x2d, 0x0a, 0x00, 0x5e, 0x2d, + 0x0a, 0x00, 0x5f, 0x2d, 0x0a, 0x00, 0xf8, 0x2d, 0x0a, 0x00, 0xfc, 0x2d, + 0x0a, 0x00, 0xfe, 0x2d, 0x0a, 0x00, 0xff, 0x2d, 0x0a, 0x00, 0x38, 0x2f, + 0x0a, 0x00, 0x3c, 0x2f, 0x0a, 0x00, 0x3e, 0x2f, 0x0a, 0x00, 0x3f, 0x2f, + 0x0a, 0x00, 0x30, 0x35, 0x0a, 0x00, 0x31, 0x35, 0x0a, 0x00, 0x39, 0x35, + 0x0a, 0x00, 0x3d, 0x35, 0x0a, 0x00, 0x50, 0x35, 0x0a, 0x00, 0x51, 0x35, + 0x0a, 0x00, 0x56, 0x35, 0x0a, 0x00, 0x57, 0x35, 0x0a, 0x00, 0x59, 0x35, + 0x0a, 0x00, 0x5d, 0x35, 0x0a, 0x00, 0xf7, 0x35, 0x0a, 0x00, 0xf8, 0x35, + 0x0a, 0x00, 0xfc, 0x35, 0x0a, 0x00, 0xfe, 0x35, 0x0a, 0x00, 0xff, 0x35, + 0x0a, 0x00, 0xb8, 0x3d, 0x0a, 0x00, 0xbc, 0x3d, 0x0a, 0x00, 0xbe, 0x3d, + 0x0a, 0x00, 0xbf, 0x3d, 0x0a, 0x00, 0x88, 0x3f, 0x0a, 0x00, 0x8b, 0x3f, + 0x0a, 0x00, 0xc6, 0x3f, 0x0a, 0x00, 0xc7, 0x3f, 0x0a, 0x00, 0xc8, 0x3f, + 0x0a, 0x00, 0xcb, 0x3f, 0x0a, 0x00, 0xe6, 0x3f, 0x0a, 0x00, 0xe7, 0x3f, + 0x0a, 0x00, 0xe8, 0x3f, 0x0a, 0x00, 0xeb, 0x3f, 0x0a, 0x00, 0xf6, 0x3f, + 0x0a, 0x00, 0xf7, 0x3f, 0x0a, 0x00, 0xf8, 0x3f, 0x0a, 0x00, 0xfc, 0x3f, + 0x0a, 0x00, 0xfe, 0x3f, 0x0a, 0x00, 0xff, 0x3f, 0x0a, 0x00, 0xb0, 0x40, + 0x0a, 0x00, 0xb1, 0x40, 0x0a, 0x00, 0xb9, 0x40, 0x0a, 0x00, 0xbd, 0x40, + 0x0a, 0x00, 0xf7, 0x41, 0x0a, 0x00, 0xf8, 0x41, 0x0a, 0x00, 0xfc, 0x41, + 0x0a, 0x00, 0xfe, 0x41, 0x0a, 0x00, 0xff, 0x41, 0x0a, 0x00, 0xb0, 0x44, + 0x0a, 0x00, 0xb1, 0x44, 0x0a, 0x00, 0xb9, 0x44, 0x0a, 0x00, 0xbd, 0x44, + 0x0a, 0x00, 0xf7, 0x45, 0x0a, 0x00, 0xf8, 0x45, 0x0a, 0x00, 0xfc, 0x45, + 0x0a, 0x00, 0xfe, 0x45, 0x0a, 0x00, 0xff, 0x45, 0x0a, 0x00, 0xb0, 0x46, + 0x0a, 0x00, 0xb1, 0x46, 0x0a, 0x00, 0xb9, 0x46, 0x0a, 0x00, 0xbd, 0x46, + 0x0a, 0x00, 0xf0, 0x47, 0x0a, 0x00, 0xf1, 0x47, 0x0a, 0x00, 0xf9, 0x47, + 0x0a, 0x00, 0xfd, 0x47, 0x0a, 0x00, 0xb8, 0x4c, 0x0a, 0x00, 0xbc, 0x4c, + 0x0a, 0x00, 0xbe, 0x4c, 0x0a, 0x00, 0xbf, 0x4c, 0x0a, 0x00, 0x8b, 0x4f, + 0x0a, 0x00, 0xcb, 0x4f, 0x0a, 0x00, 0xeb, 0x4f, 0x0a, 0x00, 0xf0, 0x4f, + 0x0a, 0x00, 0xf1, 0x4f, 0x0a, 0x00, 0xf7, 0x4f, 0x0a, 0x00, 0xf9, 0x4f, + 0x0a, 0x00, 0xfd, 0x4f, 0x0a, 0x00, 0x30, 0x53, 0x0a, 0x00, 0x31, 0x53, + 0x0a, 0x00, 0x39, 0x53, 0x0a, 0x00, 0x3d, 0x53, 0x0a, 0x00, 0xc7, 0x53, + 0x0a, 0x00, 0xcb, 0x53, 0x0a, 0x00, 0xf7, 0x53, 0x0a, 0x00, 0xf8, 0x53, + 0x0a, 0x00, 0xfc, 0x53, 0x0a, 0x00, 0xfe, 0x53, 0x0a, 0x00, 0xff, 0x53, + 0x0a, 0x00, 0x37, 0x59, 0x0a, 0x00, 0x38, 0x59, 0x0a, 0x00, 0x3c, 0x59, + 0x0a, 0x00, 0x3e, 0x59, 0x0a, 0x00, 0x3f, 0x59, 0x0a, 0x00, 0xb8, 0x59, + 0x0a, 0x00, 0xbc, 0x59, 0x0a, 0x00, 0xbe, 0x59, 0x0a, 0x00, 0xbf, 0x59, + 0x0a, 0x00, 0x30, 0x5d, 0x0a, 0x00, 0x31, 0x5d, 0x0a, 0x00, 0x39, 0x5d, + 0x0a, 0x00, 0x3d, 0x5d, 0x0a, 0x00, 0x37, 0x5f, 0x0a, 0x00, 0x38, 0x5f, + 0x0a, 0x00, 0x3c, 0x5f, 0x0a, 0x00, 0x3e, 0x5f, 0x0a, 0x00, 0x3f, 0x5f, + 0x0a, 0x00, 0xb8, 0x5f, 0x0a, 0x00, 0xbc, 0x5f, 0x0a, 0x00, 0xbe, 0x5f, + 0x0a, 0x00, 0xbf, 0x5f, 0x0a, 0x00, 0xeb, 0x64, 0x0a, 0x00, 0xeb, 0x66, + 0x0a, 0x00, 0xf8, 0x7c, 0x0a, 0x00, 0xfc, 0x7c, 0x0a, 0x00, 0xfe, 0x7c, + 0x0a, 0x00, 0xff, 0x7c, 0x0a, 0x00, 0x37, 0x80, 0x0a, 0x00, 0xf1, 0x80, + 0x0a, 0x00, 0xf9, 0x80, 0x0a, 0x00, 0xb1, 0x81, 0x0a, 0x00, 0xb9, 0x81, + 0x0a, 0x00, 0xf1, 0x81, 0x0a, 0x00, 0xf9, 0x81, 0x0a, 0x00, 0xf7, 0x82, + 0x0a, 0x00, 0xb1, 0x84, 0x0a, 0x00, 0xb9, 0x84, 0x0a, 0x00, 0x31, 0x85, + 0x0a, 0x00, 0x39, 0x85, 0x0a, 0x00, 0x37, 0x86, 0x0a, 0x00, 0x38, 0x86, + 0x0a, 0x00, 0x3c, 0x86, 0x0a, 0x00, 0x3e, 0x86, 0x0a, 0x00, 0x3f, 0x86, + 0x0a, 0x00, 0xb1, 0x86, 0x0a, 0x00, 0xb9, 0x86, 0x0a, 0x00, 0x37, 0x87, + 0x0a, 0x00, 0x47, 0x87, 0x0a, 0x00, 0x4b, 0x87, 0x0a, 0x00, 0xb1, 0x87, + 0x0a, 0x00, 0xb9, 0x87, 0x0a, 0x00, 0xf1, 0x87, 0x0a, 0x00, 0xf9, 0x87, + 0x0a, 0x00, 0xb1, 0x8b, 0x0a, 0x00, 0xb7, 0x8b, 0x0a, 0x00, 0xb9, 0x8b, + 0x0a, 0x00, 0xf1, 0x8b, 0x0a, 0x00, 0xf7, 0x8b, 0x0a, 0x00, 0xf9, 0x8b, + 0x0a, 0x00, 0xf1, 0x8c, 0x0a, 0x00, 0xf7, 0x8c, 0x0a, 0x00, 0xf9, 0x8c, + 0x0a, 0x00, 0x38, 0x9e, 0x0a, 0x00, 0x3c, 0x9e, 0x0a, 0x00, 0x3e, 0x9e, + 0x0a, 0x00, 0x3f, 0x9e, 0x0a, 0x00, 0x4b, 0xa6, 0x0a, 0x00, 0x4b, 0xa7, + 0x0a, 0x00, 0xb1, 0xb0, 0x0a, 0x00, 0xb7, 0xb0, 0x0a, 0x00, 0xb9, 0xb0, + 0x0a, 0x00, 0x4b, 0xb2, 0x0a, 0x00, 0x4b, 0xb3, 0x0a, 0x00, 0xf1, 0xb3, + 0x0a, 0x00, 0xf7, 0xb3, 0x0a, 0x00, 0xf9, 0xb3, 0x0a, 0x00, 0xb1, 0xb8, + 0x0a, 0x00, 0xb7, 0xb8, 0x0a, 0x00, 0xb9, 0xb8, 0x0a, 0x00, 0xb1, 0xbb, + 0x0a, 0x00, 0xb7, 0xbb, 0x0a, 0x00, 0xb9, 0xbb, 0x0a, 0x00, 0xf1, 0xbb, + 0x0a, 0x00, 0xf7, 0xbb, 0x0a, 0x00, 0xf9, 0xbb, 0x0a, 0x00, 0x31, 0xbf, + 0x0a, 0x00, 0x37, 0xbf, 0x0a, 0x00, 0x39, 0xbf, 0x0a, 0x00, 0x36, 0xc2, + 0x0a, 0x00, 0x37, 0xc2, 0x0a, 0x00, 0x38, 0xc2, 0x0a, 0x00, 0x3c, 0xc2, + 0x0a, 0x00, 0x3e, 0xc2, 0x0a, 0x00, 0x3f, 0xc2, 0x0a, 0x00, 0x48, 0xc2, + 0x0a, 0x00, 0x4b, 0xc2, 0x0a, 0x00, 0x30, 0xc3, 0x0a, 0x00, 0x31, 0xc3, + 0x0a, 0x00, 0x39, 0xc3, 0x0a, 0x00, 0x3d, 0xc3, 0x0a, 0x00, 0x48, 0xc3, + 0x0a, 0x00, 0x4b, 0xc3, 0x0a, 0x00, 0xe6, 0xc3, 0x0a, 0x00, 0xe7, 0xc3, + 0x0a, 0x00, 0xe8, 0xc3, 0x0a, 0x00, 0xeb, 0xc3, 0x0a, 0x00, 0xf6, 0xc3, + 0x0a, 0x00, 0xf7, 0xc3, 0x0a, 0x00, 0xf8, 0xc3, 0x0a, 0x00, 0xfc, 0xc3, + 0x0a, 0x00, 0xfe, 0xc3, 0x0a, 0x00, 0xff, 0xc3, 0x0a, 0x00, 0xc6, 0xc5, + 0x0a, 0x00, 0xc7, 0xc5, 0x0a, 0x00, 0xc8, 0xc5, 0x0a, 0x00, 0xcb, 0xc5, + 0x0a, 0x00, 0xf6, 0xc5, 0x0a, 0x00, 0xf7, 0xc5, 0x0a, 0x00, 0xf8, 0xc5, + 0x0a, 0x00, 0xfc, 0xc5, 0x0a, 0x00, 0xfe, 0xc5, 0x0a, 0x00, 0xff, 0xc5, + 0x0a, 0x00, 0x37, 0xc9, 0x0a, 0x00, 0x38, 0xc9, 0x0a, 0x00, 0x3c, 0xc9, + 0x0a, 0x00, 0x3e, 0xc9, 0x0a, 0x00, 0x3f, 0xc9, 0x0a, 0x00, 0x58, 0xc9, + 0x0a, 0x00, 0x5c, 0xc9, 0x0a, 0x00, 0x5e, 0xc9, 0x0a, 0x00, 0x5f, 0xc9, + 0x0a, 0x00, 0xb8, 0xc9, 0x0a, 0x00, 0xbc, 0xc9, 0x0a, 0x00, 0xbe, 0xc9, + 0x0a, 0x00, 0xbf, 0xc9, 0x0a, 0x00, 0x30, 0xcc, 0x0a, 0x00, 0xb8, 0xcc, + 0x0a, 0x00, 0xbc, 0xcc, 0x0a, 0x00, 0xbe, 0xcc, 0x0a, 0x00, 0xbf, 0xcc, + 0x0a, 0x00, 0x30, 0xcd, 0x0a, 0x00, 0x50, 0xcd, 0x0a, 0x00, 0x58, 0xcd, + 0x0a, 0x00, 0x5c, 0xcd, 0x0a, 0x00, 0x5e, 0xcd, 0x0a, 0x00, 0x5f, 0xcd, + 0x0a, 0x00, 0xb8, 0xce, 0x0a, 0x00, 0xbc, 0xce, 0x0a, 0x00, 0xbe, 0xce, + 0x0a, 0x00, 0xbf, 0xce, 0x0a, 0x00, 0xc9, 0xcf, 0x0a, 0x00, 0xca, 0xcf, + 0x0a, 0x00, 0xe9, 0xcf, 0x0a, 0x00, 0xea, 0xcf, 0x0a, 0x00, 0xf0, 0xcf, + 0x0a, 0x00, 0xf1, 0xcf, 0x0a, 0x00, 0xf9, 0xcf, 0x0a, 0x00, 0xfd, 0xcf, + 0x0a, 0x00, 0xc8, 0xdd, 0x0a, 0x00, 0xcb, 0xdd, 0x0a, 0x00, 0xf8, 0xdd, + 0x0a, 0x00, 0xfc, 0xdd, 0x0a, 0x00, 0xfe, 0xdd, 0x0a, 0x00, 0xff, 0xdd, + 0x0a, 0x00, 0x30, 0xe3, 0x0a, 0x00, 0x48, 0xe3, 0x0a, 0x00, 0x4b, 0xe3, + 0x0a, 0x00, 0xf0, 0xe3, 0x0a, 0x00, 0xf1, 0xe3, 0x0a, 0x00, 0xf9, 0xe3, + 0x0a, 0x00, 0xfd, 0xe3, 0x0a, 0x00, 0xf7, 0xe5, 0x0a, 0x00, 0xf8, 0xe5, + 0x0a, 0x00, 0xfc, 0xe5, 0x0a, 0x00, 0xfe, 0xe5, 0x0a, 0x00, 0xff, 0xe5, + 0x0a, 0x00, 0x30, 0xe9, 0x0a, 0x00, 0x31, 0xe9, 0x0a, 0x00, 0x39, 0xe9, + 0x0a, 0x00, 0x3d, 0xe9, 0x0a, 0x00, 0x58, 0xe9, 0x0a, 0x00, 0x5c, 0xe9, + 0x0a, 0x00, 0x5e, 0xe9, 0x0a, 0x00, 0x5f, 0xe9, 0x0a, 0x00, 0xb8, 0xec, + 0x0a, 0x00, 0xbc, 0xec, 0x0a, 0x00, 0xbe, 0xec, 0x0a, 0x00, 0xbf, 0xec, + 0x0a, 0x00, 0x50, 0xed, 0x0a, 0x00, 0x58, 0xed, 0x0a, 0x00, 0x5c, 0xed, + 0x0a, 0x00, 0x5e, 0xed, 0x0a, 0x00, 0x5f, 0xed, 0x0a, 0x00, 0xc9, 0xef, + 0x0a, 0x00, 0xca, 0xef, 0x0a, 0x00, 0xe9, 0xef, 0x0a, 0x00, 0xea, 0xef, + 0x0a, 0x00, 0xf0, 0xef, 0x0a, 0x00, 0xf1, 0xef, 0x0a, 0x00, 0xf9, 0xef, + 0x0a, 0x00, 0xfd, 0xef, 0x0a, 0x00, 0x30, 0xf5, 0x0a, 0x00, 0x50, 0xf5, + 0x0a, 0x00, 0x58, 0xf5, 0x0a, 0x00, 0x5c, 0xf5, 0x0a, 0x00, 0x5e, 0xf5, + 0x0a, 0x00, 0x5f, 0xf5, 0x0a, 0x00, 0xf7, 0xf9, 0x0a, 0x00, 0xf8, 0xf9, + 0x0a, 0x00, 0xfc, 0xf9, 0x0a, 0x00, 0xfe, 0xf9, 0x0a, 0x00, 0xff, 0xf9, + 0x0a, 0x00, 0xf7, 0xfd, 0x0a, 0x00, 0xf8, 0xfd, 0x0a, 0x00, 0xfc, 0xfd, + 0x0a, 0x00, 0xfe, 0xfd, 0x0a, 0x00, 0xff, 0xfd, 0x0a, 0x00, 0x30, 0xff, + 0x0a, 0x00, 0x31, 0xff, 0x0a, 0x00, 0x39, 0xff, 0x0a, 0x00, 0x3d, 0xff, + 0x0a, 0x00, 0xf8, 0x04, 0x0b, 0x00, 0xfc, 0x04, 0x0b, 0x00, 0xfe, 0x04, + 0x0b, 0x00, 0xff, 0x04, 0x0b, 0x00, 0xc8, 0x06, 0x0b, 0x00, 0xcb, 0x06, + 0x0b, 0x00, 0xf4, 0x07, 0x0b, 0x00, 0xf5, 0x07, 0x0b, 0x00, 0xf8, 0x07, + 0x0b, 0x00, 0xfc, 0x07, 0x0b, 0x00, 0xfe, 0x07, 0x0b, 0x00, 0xff, 0x07, + 0x0b, 0x00, 0x78, 0x0b, 0x0b, 0x00, 0x7c, 0x0b, 0x0b, 0x00, 0x7e, 0x0b, + 0x0b, 0x00, 0x7f, 0x0b, 0x0b, 0x00, 0xf4, 0x0c, 0x0b, 0x00, 0xf5, 0x0c, + 0x0b, 0x00, 0xf8, 0x0c, 0x0b, 0x00, 0xfc, 0x0c, 0x0b, 0x00, 0xfe, 0x0c, + 0x0b, 0x00, 0xff, 0x0c, 0x0b, 0x00, 0x23, 0x0f, 0x0b, 0x00, 0x28, 0x0f, + 0x0b, 0x00, 0x2b, 0x0f, 0x0b, 0x00, 0x2c, 0x0f, 0x0b, 0x00, 0x2e, 0x0f, + 0x0b, 0x00, 0x2f, 0x0f, 0x0b, 0x00, 0xf3, 0x0f, 0x0b, 0x00, 0xfb, 0x0f, + 0x0b, 0x00, 0x73, 0x16, 0x0b, 0x00, 0x7b, 0x16, 0x0b, 0x00, 0x74, 0x17, + 0x0b, 0x00, 0x75, 0x17, 0x0b, 0x00, 0x78, 0x17, 0x0b, 0x00, 0x7c, 0x17, + 0x0b, 0x00, 0x7e, 0x17, 0x0b, 0x00, 0x7f, 0x17, 0x0b, 0x00, 0x98, 0x17, + 0x0b, 0x00, 0xd8, 0x17, 0x0b, 0x00, 0xf8, 0x23, 0x0b, 0x00, 0xfc, 0x23, + 0x0b, 0x00, 0xfe, 0x23, 0x0b, 0x00, 0xff, 0x23, 0x0b, 0x00, 0x30, 0x33, + 0x0b, 0x00, 0xd0, 0x33, 0x0b, 0x00, 0xd8, 0x33, 0x0b, 0x00, 0xdc, 0x33, + 0x0b, 0x00, 0xde, 0x33, 0x0b, 0x00, 0xdf, 0x33, 0x0b, 0x00, 0xf0, 0x33, + 0x0b, 0x00, 0xf1, 0x33, 0x0b, 0x00, 0xf9, 0x33, 0x0b, 0x00, 0xfd, 0x33, + 0x0b, 0x00, 0x30, 0x39, 0x0b, 0x00, 0x30, 0x3b, 0x0b, 0x00, 0xf0, 0x3b, + 0x0b, 0x00, 0xf1, 0x3b, 0x0b, 0x00, 0xf9, 0x3b, 0x0b, 0x00, 0xfd, 0x3b, + 0x0b, 0x00, 0x30, 0x3d, 0x0b, 0x00, 0x30, 0x3f, 0x0b, 0x00, 0x90, 0x3f, + 0x0b, 0x00, 0x98, 0x3f, 0x0b, 0x00, 0x9c, 0x3f, 0x0b, 0x00, 0x9e, 0x3f, + 0x0b, 0x00, 0x9f, 0x3f, 0x0b, 0x00, 0xd0, 0x3f, 0x0b, 0x00, 0xd8, 0x3f, + 0x0b, 0x00, 0xdc, 0x3f, 0x0b, 0x00, 0xde, 0x3f, 0x0b, 0x00, 0xdf, 0x3f, + 0x0b, 0x00, 0x30, 0x40, 0x0b, 0x00, 0x30, 0x41, 0x0b, 0x00, 0x4b, 0x43, + 0x0b, 0x00, 0xb0, 0x44, 0x0b, 0x00, 0xb0, 0x46, 0x0b, 0x00, 0xf7, 0x47, + 0x0b, 0x00, 0xf8, 0x47, 0x0b, 0x00, 0xfc, 0x47, 0x0b, 0x00, 0xfe, 0x47, + 0x0b, 0x00, 0xff, 0x47, 0x0b, 0x00, 0x6b, 0x49, 0x0b, 0x00, 0x8b, 0x4b, + 0x0b, 0x00, 0xeb, 0x4c, 0x0b, 0x00, 0xf0, 0x4c, 0x0b, 0x00, 0xf1, 0x4c, + 0x0b, 0x00, 0xf7, 0x4c, 0x0b, 0x00, 0xf9, 0x4c, 0x0b, 0x00, 0xfd, 0x4c, + 0x0b, 0x00, 0x6b, 0x4d, 0x0b, 0x00, 0x0b, 0x4e, 0x0b, 0x00, 0xeb, 0x4e, + 0x0b, 0x00, 0x8b, 0x4f, 0x0b, 0x00, 0xcb, 0x4f, 0x0b, 0x00, 0xeb, 0x4f, + 0x0b, 0x00, 0xf0, 0x4f, 0x0b, 0x00, 0xf1, 0x4f, 0x0b, 0x00, 0xf7, 0x4f, + 0x0b, 0x00, 0xf9, 0x4f, 0x0b, 0x00, 0xfd, 0x4f, 0x0b, 0x00, 0x47, 0x50, + 0x0b, 0x00, 0xcb, 0x50, 0x0b, 0x00, 0xf0, 0x50, 0x0b, 0x00, 0xf1, 0x50, + 0x0b, 0x00, 0xf9, 0x50, 0x0b, 0x00, 0xfd, 0x50, 0x0b, 0x00, 0x47, 0x51, + 0x0b, 0x00, 0xf0, 0x51, 0x0b, 0x00, 0xf1, 0x51, 0x0b, 0x00, 0xf9, 0x51, + 0x0b, 0x00, 0xfd, 0x51, 0x0b, 0x00, 0x78, 0x52, 0x0b, 0x00, 0x7c, 0x52, + 0x0b, 0x00, 0x7e, 0x52, 0x0b, 0x00, 0x7f, 0x52, 0x0b, 0x00, 0xc7, 0x53, + 0x0b, 0x00, 0xf7, 0x53, 0x0b, 0x00, 0xf8, 0x53, 0x0b, 0x00, 0xfc, 0x53, + 0x0b, 0x00, 0xfe, 0x53, 0x0b, 0x00, 0xff, 0x53, 0x0b, 0x00, 0xb0, 0x54, + 0x0b, 0x00, 0xeb, 0x54, 0x0b, 0x00, 0xf8, 0x54, 0x0b, 0x00, 0xfc, 0x54, + 0x0b, 0x00, 0xfe, 0x54, 0x0b, 0x00, 0xff, 0x54, 0x0b, 0x00, 0x6b, 0x55, + 0x0b, 0x00, 0x78, 0x55, 0x0b, 0x00, 0x7c, 0x55, 0x0b, 0x00, 0x7e, 0x55, + 0x0b, 0x00, 0x7f, 0x55, 0x0b, 0x00, 0xeb, 0x56, 0x0b, 0x00, 0xcb, 0x57, + 0x0b, 0x00, 0xeb, 0x57, 0x0b, 0x00, 0xf8, 0x57, 0x0b, 0x00, 0xfc, 0x57, + 0x0b, 0x00, 0xfe, 0x57, 0x0b, 0x00, 0xff, 0x57, 0x0b, 0x00, 0xb0, 0x5b, + 0x0b, 0x00, 0xc7, 0x5b, 0x0b, 0x00, 0xf7, 0x5b, 0x0b, 0x00, 0xf8, 0x5b, + 0x0b, 0x00, 0xfc, 0x5b, 0x0b, 0x00, 0xfe, 0x5b, 0x0b, 0x00, 0xff, 0x5b, + 0x0b, 0x00, 0x78, 0x5c, 0x0b, 0x00, 0x7c, 0x5c, 0x0b, 0x00, 0x7e, 0x5c, + 0x0b, 0x00, 0x7f, 0x5c, 0x0b, 0x00, 0x78, 0x5e, 0x0b, 0x00, 0x7c, 0x5e, + 0x0b, 0x00, 0x7e, 0x5e, 0x0b, 0x00, 0x7f, 0x5e, 0x0b, 0x00, 0xeb, 0x64, + 0x0b, 0x00, 0x3b, 0x65, 0x0b, 0x00, 0x0b, 0x66, 0x0b, 0x00, 0xeb, 0x66, + 0x0b, 0x00, 0x4b, 0x6b, 0x0b, 0x00, 0x3b, 0x70, 0x0b, 0x00, 0x3b, 0x74, + 0x0b, 0x00, 0xfb, 0x75, 0x0b, 0x00, 0x3b, 0x76, 0x0b, 0x00, 0x4b, 0x78, + 0x0b, 0x00, 0xeb, 0x78, 0x0b, 0x00, 0x3b, 0x79, 0x0b, 0x00, 0x0b, 0x7a, + 0x0b, 0x00, 0x2b, 0x7a, 0x0b, 0x00, 0x4b, 0x7b, 0x0b, 0x00, 0x3b, 0x7d, + 0x0b, 0x00, 0x70, 0x80, 0x0b, 0x00, 0x71, 0x80, 0x0b, 0x00, 0x73, 0x80, + 0x0b, 0x00, 0x79, 0x80, 0x0b, 0x00, 0x7b, 0x80, 0x0b, 0x00, 0x7d, 0x80, + 0x0b, 0x00, 0x70, 0x81, 0x0b, 0x00, 0x71, 0x81, 0x0b, 0x00, 0x73, 0x81, + 0x0b, 0x00, 0x79, 0x81, 0x0b, 0x00, 0x7b, 0x81, 0x0b, 0x00, 0x7d, 0x81, + 0x0b, 0x00, 0xf2, 0x81, 0x0b, 0x00, 0xf4, 0x81, 0x0b, 0x00, 0xf5, 0x81, + 0x0b, 0x00, 0xf6, 0x81, 0x0b, 0x00, 0xf7, 0x81, 0x0b, 0x00, 0xf8, 0x81, + 0x0b, 0x00, 0xfa, 0x81, 0x0b, 0x00, 0xfc, 0x81, 0x0b, 0x00, 0xfe, 0x81, + 0x0b, 0x00, 0xff, 0x81, 0x0b, 0x00, 0x73, 0x82, 0x0b, 0x00, 0x7b, 0x82, + 0x0b, 0x00, 0xf0, 0x83, 0x0b, 0x00, 0xf1, 0x83, 0x0b, 0x00, 0xf3, 0x83, + 0x0b, 0x00, 0xf9, 0x83, 0x0b, 0x00, 0xfb, 0x83, 0x0b, 0x00, 0xfd, 0x83, + 0x0b, 0x00, 0xf0, 0x84, 0x0b, 0x00, 0xf1, 0x84, 0x0b, 0x00, 0xf9, 0x84, + 0x0b, 0x00, 0xfd, 0x84, 0x0b, 0x00, 0xf6, 0x86, 0x0b, 0x00, 0xf7, 0x86, + 0x0b, 0x00, 0xf8, 0x86, 0x0b, 0x00, 0xfc, 0x86, 0x0b, 0x00, 0xfe, 0x86, + 0x0b, 0x00, 0xff, 0x86, 0x0b, 0x00, 0xf0, 0x87, 0x0b, 0x00, 0xf1, 0x87, + 0x0b, 0x00, 0xf3, 0x87, 0x0b, 0x00, 0xf9, 0x87, 0x0b, 0x00, 0xfb, 0x87, + 0x0b, 0x00, 0xfd, 0x87, 0x0b, 0x00, 0x77, 0x88, 0x0b, 0x00, 0x2b, 0x8a, + 0x0b, 0x00, 0x11, 0x8b, 0x0b, 0x00, 0x16, 0x8b, 0x0b, 0x00, 0x17, 0x8b, + 0x0b, 0x00, 0x19, 0x8b, 0x0b, 0x00, 0x1d, 0x8b, 0x0b, 0x00, 0x76, 0x8b, + 0x0b, 0x00, 0x77, 0x8b, 0x0b, 0x00, 0x78, 0x8b, 0x0b, 0x00, 0x7c, 0x8b, + 0x0b, 0x00, 0x7e, 0x8b, 0x0b, 0x00, 0x7f, 0x8b, 0x0b, 0x00, 0x73, 0x8e, + 0x0b, 0x00, 0x7b, 0x8e, 0x0b, 0x00, 0x74, 0x8f, 0x0b, 0x00, 0x75, 0x8f, + 0x0b, 0x00, 0x78, 0x8f, 0x0b, 0x00, 0x7c, 0x8f, 0x0b, 0x00, 0x7e, 0x8f, + 0x0b, 0x00, 0x7f, 0x8f, 0x0b, 0x00, 0xf8, 0x9a, 0x0b, 0x00, 0xfc, 0x9a, + 0x0b, 0x00, 0xfe, 0x9a, 0x0b, 0x00, 0xff, 0x9a, 0x0b, 0x00, 0x78, 0xa0, + 0x0b, 0x00, 0x7c, 0xa0, 0x0b, 0x00, 0x7e, 0xa0, 0x0b, 0x00, 0x7f, 0xa0, + 0x0b, 0x00, 0xf8, 0xa1, 0x0b, 0x00, 0xfc, 0xa1, 0x0b, 0x00, 0xfe, 0xa1, + 0x0b, 0x00, 0xff, 0xa1, 0x0b, 0x00, 0xf8, 0xa3, 0x0b, 0x00, 0xfc, 0xa3, + 0x0b, 0x00, 0xfe, 0xa3, 0x0b, 0x00, 0xff, 0xa3, 0x0b, 0x00, 0xf8, 0xa7, + 0x0b, 0x00, 0xfc, 0xa7, 0x0b, 0x00, 0xfe, 0xa7, 0x0b, 0x00, 0xff, 0xa7, + 0x0b, 0x00, 0x70, 0xb0, 0x0b, 0x00, 0x71, 0xb0, 0x0b, 0x00, 0x79, 0xb0, + 0x0b, 0x00, 0x7d, 0xb0, 0x0b, 0x00, 0xb0, 0xb0, 0x0b, 0x00, 0x70, 0xb1, + 0x0b, 0x00, 0x71, 0xb1, 0x0b, 0x00, 0x79, 0xb1, 0x0b, 0x00, 0x7d, 0xb1, + 0x0b, 0x00, 0xf7, 0xb1, 0x0b, 0x00, 0xf8, 0xb1, 0x0b, 0x00, 0xfc, 0xb1, + 0x0b, 0x00, 0xfe, 0xb1, 0x0b, 0x00, 0xff, 0xb1, 0x0b, 0x00, 0x30, 0xb3, + 0x0b, 0x00, 0xd0, 0xb3, 0x0b, 0x00, 0xd8, 0xb3, 0x0b, 0x00, 0xdc, 0xb3, + 0x0b, 0x00, 0xde, 0xb3, 0x0b, 0x00, 0xdf, 0xb3, 0x0b, 0x00, 0xf0, 0xb3, + 0x0b, 0x00, 0xf1, 0xb3, 0x0b, 0x00, 0xf9, 0xb3, 0x0b, 0x00, 0xfd, 0xb3, + 0x0b, 0x00, 0xb0, 0xb4, 0x0b, 0x00, 0xb0, 0xb6, 0x0b, 0x00, 0x86, 0xb7, + 0x0b, 0x00, 0xc6, 0xb7, 0x0b, 0x00, 0xe6, 0xb7, 0x0b, 0x00, 0xf6, 0xb7, + 0x0b, 0x00, 0xf7, 0xb7, 0x0b, 0x00, 0xf8, 0xb7, 0x0b, 0x00, 0xfc, 0xb7, + 0x0b, 0x00, 0xfe, 0xb7, 0x0b, 0x00, 0xff, 0xb7, 0x0b, 0x00, 0x47, 0xb8, + 0x0b, 0x00, 0x77, 0xb8, 0x0b, 0x00, 0x78, 0xb8, 0x0b, 0x00, 0x7c, 0xb8, + 0x0b, 0x00, 0x7e, 0xb8, 0x0b, 0x00, 0x7f, 0xb8, 0x0b, 0x00, 0x30, 0xb9, + 0x0b, 0x00, 0x90, 0xbb, 0x0b, 0x00, 0x98, 0xbb, 0x0b, 0x00, 0x9c, 0xbb, + 0x0b, 0x00, 0x9e, 0xbb, 0x0b, 0x00, 0x9f, 0xbb, 0x0b, 0x00, 0x30, 0xbd, + 0x0b, 0x00, 0x30, 0xbf, 0x0b, 0x00, 0x90, 0xbf, 0x0b, 0x00, 0x98, 0xbf, + 0x0b, 0x00, 0x9c, 0xbf, 0x0b, 0x00, 0x9e, 0xbf, 0x0b, 0x00, 0x9f, 0xbf, + 0x0b, 0x00, 0xd0, 0xbf, 0x0b, 0x00, 0xd8, 0xbf, 0x0b, 0x00, 0xdc, 0xbf, + 0x0b, 0x00, 0xde, 0xbf, 0x0b, 0x00, 0xdf, 0xbf, 0x0b, 0x00, 0x73, 0xc2, + 0x0b, 0x00, 0x7b, 0xc2, 0x0b, 0x00, 0xf0, 0xc3, 0x0b, 0x00, 0xf1, 0xc3, + 0x0b, 0x00, 0xf3, 0xc3, 0x0b, 0x00, 0xf9, 0xc3, 0x0b, 0x00, 0xfb, 0xc3, + 0x0b, 0x00, 0xfd, 0xc3, 0x0b, 0x00, 0x30, 0xca, 0x0b, 0x00, 0xcb, 0xca, + 0x0b, 0x00, 0xeb, 0xca, 0x0b, 0x00, 0xf7, 0xca, 0x0b, 0x00, 0xf8, 0xca, + 0x0b, 0x00, 0xfc, 0xca, 0x0b, 0x00, 0xfe, 0xca, 0x0b, 0x00, 0xff, 0xca, + 0x0b, 0x00, 0x74, 0xce, 0x0b, 0x00, 0x75, 0xce, 0x0b, 0x00, 0x78, 0xce, + 0x0b, 0x00, 0x7c, 0xce, 0x0b, 0x00, 0x7e, 0xce, 0x0b, 0x00, 0x7f, 0xce, + 0x0b, 0x00, 0x18, 0xcf, 0x0b, 0x00, 0x73, 0xcf, 0x0b, 0x00, 0x7b, 0xcf, + 0x0b, 0x00, 0xf8, 0xd2, 0x0b, 0x00, 0xfc, 0xd2, 0x0b, 0x00, 0xfe, 0xd2, + 0x0b, 0x00, 0xff, 0xd2, 0x0b, 0x00, 0xf3, 0xd3, 0x0b, 0x00, 0xfb, 0xd3, + 0x0b, 0x00, 0xf4, 0xdb, 0x0b, 0x00, 0xf5, 0xdb, 0x0b, 0x00, 0xf8, 0xdb, + 0x0b, 0x00, 0xfc, 0xdb, 0x0b, 0x00, 0xfe, 0xdb, 0x0b, 0x00, 0xff, 0xdb, + 0x0b, 0x00, 0x30, 0xe4, 0x0b, 0x00, 0x0b, 0xe5, 0x0b, 0x00, 0x50, 0xe5, + 0x0b, 0x00, 0x30, 0xe6, 0x0b, 0x00, 0xf0, 0xea, 0x0b, 0x00, 0xf1, 0xea, + 0x0b, 0x00, 0xf9, 0xea, 0x0b, 0x00, 0xfd, 0xea, 0x0b, 0x00, 0x74, 0xee, + 0x0b, 0x00, 0x75, 0xee, 0x0b, 0x00, 0x78, 0xee, 0x0b, 0x00, 0x7c, 0xee, + 0x0b, 0x00, 0x7e, 0xee, 0x0b, 0x00, 0x7f, 0xee, 0x0b, 0x00, 0x73, 0xef, + 0x0b, 0x00, 0x7b, 0xef, 0x0b, 0x00, 0x30, 0xf2, 0x0b, 0x00, 0xcb, 0xf2, + 0x0b, 0x00, 0xeb, 0xf2, 0x0b, 0x00, 0xf7, 0xf2, 0x0b, 0x00, 0xf8, 0xf2, + 0x0b, 0x00, 0xfc, 0xf2, 0x0b, 0x00, 0xfe, 0xf2, 0x0b, 0x00, 0xff, 0xf2, + 0x0b, 0x00, 0x08, 0xf3, 0x0b, 0x00, 0x0b, 0xf3, 0x0b, 0x00, 0x30, 0xf8, + 0x0b, 0x00, 0x0b, 0xf9, 0x0b, 0x00, 0x50, 0xf9, 0x0b, 0x00, 0x59, 0xf9, + 0x0b, 0x00, 0x5d, 0xf9, 0x0b, 0x00, 0x30, 0xfa, 0x0b, 0x00, 0xcb, 0xfa, + 0x0b, 0x00, 0xeb, 0xfa, 0x0b, 0x00, 0xf7, 0xfa, 0x0b, 0x00, 0xf8, 0xfa, + 0x0b, 0x00, 0xfc, 0xfa, 0x0b, 0x00, 0xfe, 0xfa, 0x0b, 0x00, 0xff, 0xfa, + 0x0b, 0x00, 0x30, 0xfc, 0x0b, 0x00, 0x0b, 0xfd, 0x0b, 0x00, 0x50, 0xfd, + 0x0b, 0x00, 0x30, 0xfe, 0x0b, 0x00, 0x74, 0xfe, 0x0b, 0x00, 0x75, 0xfe, + 0x0b, 0x00, 0x78, 0xfe, 0x0b, 0x00, 0x7c, 0xfe, 0x0b, 0x00, 0x7e, 0xfe, + 0x0b, 0x00, 0x7f, 0xfe, 0x0b, 0x00, 0x08, 0xff, 0x0b, 0x00, 0x0b, 0xff, + 0x0b, 0x00, 0x78, 0xff, 0x0b, 0x00, 0x7c, 0xff, 0x0b, 0x00, 0x7e, 0xff, + 0x0b, 0x00, 0x7f, 0xff, 0x0b, 0x00, 0xcb, 0x05, 0x0c, 0x00, 0xeb, 0x05, + 0x0c, 0x00, 0xf8, 0x05, 0x0c, 0x00, 0xfc, 0x05, 0x0c, 0x00, 0xfe, 0x05, + 0x0c, 0x00, 0xff, 0x05, 0x0c, 0x00, 0x6b, 0x06, 0x0c, 0x00, 0x78, 0x06, + 0x0c, 0x00, 0x7c, 0x06, 0x0c, 0x00, 0x7e, 0x06, 0x0c, 0x00, 0x7f, 0x06, + 0x0c, 0x00, 0x8b, 0x07, 0x0c, 0x00, 0xcb, 0x07, 0x0c, 0x00, 0xeb, 0x07, + 0x0c, 0x00, 0xf8, 0x07, 0x0c, 0x00, 0xfc, 0x07, 0x0c, 0x00, 0xfe, 0x07, + 0x0c, 0x00, 0xff, 0x07, 0x0c, 0x00, 0x6b, 0x08, 0x0c, 0x00, 0x8b, 0x08, + 0x0c, 0x00, 0xb8, 0x08, 0x0c, 0x00, 0xbc, 0x08, 0x0c, 0x00, 0xbe, 0x08, + 0x0c, 0x00, 0xbf, 0x08, 0x0c, 0x00, 0xf8, 0x0b, 0x0c, 0x00, 0xfc, 0x0b, + 0x0c, 0x00, 0xfe, 0x0b, 0x0c, 0x00, 0xff, 0x0b, 0x0c, 0x00, 0xcb, 0x0f, + 0x0c, 0x00, 0xeb, 0x0f, 0x0c, 0x00, 0xeb, 0x13, 0x0c, 0x00, 0x78, 0x1a, + 0x0c, 0x00, 0x7c, 0x1a, 0x0c, 0x00, 0x7e, 0x1a, 0x0c, 0x00, 0x7f, 0x1a, + 0x0c, 0x00, 0xcb, 0x1d, 0x0c, 0x00, 0xeb, 0x1d, 0x0c, 0x00, 0x8b, 0x20, + 0x0c, 0x00, 0x8b, 0x27, 0x0c, 0x00, 0xcb, 0x27, 0x0c, 0x00, 0xeb, 0x27, + 0x0c, 0x00, 0x8b, 0x28, 0x0c, 0x00, 0xcb, 0x29, 0x0c, 0x00, 0xeb, 0x29, + 0x0c, 0x00, 0xf8, 0x29, 0x0c, 0x00, 0xfc, 0x29, 0x0c, 0x00, 0xfe, 0x29, + 0x0c, 0x00, 0xff, 0x29, 0x0c, 0x00, 0xf8, 0x2b, 0x0c, 0x00, 0xfc, 0x2b, + 0x0c, 0x00, 0xfe, 0x2b, 0x0c, 0x00, 0xff, 0x2b, 0x0c, 0x00, 0xf8, 0x2d, + 0x0c, 0x00, 0xfc, 0x2d, 0x0c, 0x00, 0xfe, 0x2d, 0x0c, 0x00, 0xff, 0x2d, + 0x0c, 0x00, 0x6b, 0x32, 0x0c, 0x00, 0xab, 0x32, 0x0c, 0x00, 0x8b, 0x33, + 0x0c, 0x00, 0x78, 0x35, 0x0c, 0x00, 0x7c, 0x35, 0x0c, 0x00, 0x7e, 0x35, + 0x0c, 0x00, 0x7f, 0x35, 0x0c, 0x00, 0xcb, 0x37, 0x0c, 0x00, 0xeb, 0x37, + 0x0c, 0x00, 0xf0, 0x37, 0x0c, 0x00, 0xf1, 0x37, 0x0c, 0x00, 0xf7, 0x37, + 0x0c, 0x00, 0xf9, 0x37, 0x0c, 0x00, 0xfd, 0x37, 0x0c, 0x00, 0x6b, 0x3c, + 0x0c, 0x00, 0x78, 0x3e, 0x0c, 0x00, 0x7c, 0x3e, 0x0c, 0x00, 0x7e, 0x3e, + 0x0c, 0x00, 0x7f, 0x3e, 0x0c, 0x00, 0xf8, 0x3f, 0x0c, 0x00, 0xfc, 0x3f, + 0x0c, 0x00, 0xfe, 0x3f, 0x0c, 0x00, 0xff, 0x3f, 0x0c, 0x00, 0xb0, 0x44, + 0x0c, 0x00, 0xb1, 0x44, 0x0c, 0x00, 0xb9, 0x44, 0x0c, 0x00, 0xbd, 0x44, + 0x0c, 0x00, 0xb0, 0x46, 0x0c, 0x00, 0xb1, 0x46, 0x0c, 0x00, 0xb9, 0x46, + 0x0c, 0x00, 0xbd, 0x46, 0x0c, 0x00, 0x70, 0x4a, 0x0c, 0x00, 0x71, 0x4a, + 0x0c, 0x00, 0x77, 0x4a, 0x0c, 0x00, 0x79, 0x4a, 0x0c, 0x00, 0x7d, 0x4a, + 0x0c, 0x00, 0x6b, 0x52, 0x0c, 0x00, 0x78, 0x52, 0x0c, 0x00, 0x7c, 0x52, + 0x0c, 0x00, 0x7e, 0x52, 0x0c, 0x00, 0x7f, 0x52, 0x0c, 0x00, 0xab, 0x52, + 0x0c, 0x00, 0x8b, 0x53, 0x0c, 0x00, 0x6b, 0x5c, 0x0c, 0x00, 0x78, 0x5c, + 0x0c, 0x00, 0x7c, 0x5c, 0x0c, 0x00, 0x7e, 0x5c, 0x0c, 0x00, 0x7f, 0x5c, + 0x0c, 0x00, 0xf0, 0x5f, 0x0c, 0x00, 0xf1, 0x5f, 0x0c, 0x00, 0xf9, 0x5f, + 0x0c, 0x00, 0xfd, 0x5f, 0x0c, 0x00, 0x6b, 0x67, 0x0c, 0x00, 0x8b, 0x6a, + 0x0c, 0x00, 0x78, 0x6b, 0x0c, 0x00, 0x7c, 0x6b, 0x0c, 0x00, 0x7e, 0x6b, + 0x0c, 0x00, 0x7f, 0x6b, 0x0c, 0x00, 0x71, 0x80, 0x0c, 0x00, 0x79, 0x80, + 0x0c, 0x00, 0x71, 0x84, 0x0c, 0x00, 0x79, 0x84, 0x0c, 0x00, 0x78, 0x85, + 0x0c, 0x00, 0x7c, 0x85, 0x0c, 0x00, 0x7e, 0x85, 0x0c, 0x00, 0x7f, 0x85, + 0x0c, 0x00, 0xf7, 0x85, 0x0c, 0x00, 0x71, 0x86, 0x0c, 0x00, 0x79, 0x86, + 0x0c, 0x00, 0x0b, 0x87, 0x0c, 0x00, 0x70, 0x87, 0x0c, 0x00, 0x71, 0x87, + 0x0c, 0x00, 0x79, 0x87, 0x0c, 0x00, 0x7d, 0x87, 0x0c, 0x00, 0xf7, 0x87, + 0x0c, 0x00, 0x8b, 0x8a, 0x0c, 0x00, 0x0b, 0x8b, 0x0c, 0x00, 0x6b, 0x8b, + 0x0c, 0x00, 0x78, 0x8b, 0x0c, 0x00, 0x7c, 0x8b, 0x0c, 0x00, 0x7e, 0x8b, + 0x0c, 0x00, 0x7f, 0x8b, 0x0c, 0x00, 0xf1, 0x8b, 0x0c, 0x00, 0xf7, 0x8b, + 0x0c, 0x00, 0xf9, 0x8b, 0x0c, 0x00, 0xfb, 0x95, 0x0c, 0x00, 0xbb, 0xb2, + 0x0c, 0x00, 0xf1, 0xb3, 0x0c, 0x00, 0xf7, 0xb3, 0x0c, 0x00, 0xf9, 0xb3, + 0x0c, 0x00, 0xbb, 0xbe, 0x0c, 0x00, 0xf1, 0xbf, 0x0c, 0x00, 0xf7, 0xbf, + 0x0c, 0x00, 0xf9, 0xbf, 0x0c, 0x00, 0xf0, 0xc1, 0x0c, 0x00, 0xf1, 0xc1, + 0x0c, 0x00, 0xf9, 0xc1, 0x0c, 0x00, 0xfd, 0xc1, 0x0c, 0x00, 0x91, 0xc3, + 0x0c, 0x00, 0x96, 0xc3, 0x0c, 0x00, 0x97, 0xc3, 0x0c, 0x00, 0x99, 0xc3, + 0x0c, 0x00, 0x9d, 0xc3, 0x0c, 0x00, 0xf6, 0xc5, 0x0c, 0x00, 0xf7, 0xc5, + 0x0c, 0x00, 0xf8, 0xc5, 0x0c, 0x00, 0xfc, 0xc5, 0x0c, 0x00, 0xfe, 0xc5, + 0x0c, 0x00, 0xff, 0xc5, 0x0c, 0x00, 0xf0, 0xc9, 0x0c, 0x00, 0xf1, 0xc9, + 0x0c, 0x00, 0xf9, 0xc9, 0x0c, 0x00, 0xfd, 0xc9, 0x0c, 0x00, 0x18, 0xcf, + 0x0c, 0x00, 0x1c, 0xcf, 0x0c, 0x00, 0x1e, 0xcf, 0x0c, 0x00, 0x1f, 0xcf, + 0x0c, 0x00, 0x91, 0xcf, 0x0c, 0x00, 0x96, 0xcf, 0x0c, 0x00, 0x97, 0xcf, + 0x0c, 0x00, 0x98, 0xcf, 0x0c, 0x00, 0x9c, 0xcf, 0x0c, 0x00, 0x9e, 0xcf, + 0x0c, 0x00, 0x9f, 0xcf, 0x0c, 0x00, 0xd1, 0xcf, 0x0c, 0x00, 0xd6, 0xcf, + 0x0c, 0x00, 0xd7, 0xcf, 0x0c, 0x00, 0xd8, 0xcf, 0x0c, 0x00, 0xdc, 0xcf, + 0x0c, 0x00, 0xde, 0xcf, 0x0c, 0x00, 0xdf, 0xcf, 0x0c, 0x00, 0xf8, 0xd1, + 0x0c, 0x00, 0xfc, 0xd1, 0x0c, 0x00, 0xfe, 0xd1, 0x0c, 0x00, 0xff, 0xd1, + 0x0c, 0x00, 0x98, 0xd3, 0x0c, 0x00, 0x9c, 0xd3, 0x0c, 0x00, 0x9e, 0xd3, + 0x0c, 0x00, 0x9f, 0xd3, 0x0c, 0x00, 0xf8, 0xd5, 0x0c, 0x00, 0xfc, 0xd5, + 0x0c, 0x00, 0xfe, 0xd5, 0x0c, 0x00, 0xff, 0xd5, 0x0c, 0x00, 0x88, 0xd7, + 0x0c, 0x00, 0x8b, 0xd7, 0x0c, 0x00, 0xf8, 0xd9, 0x0c, 0x00, 0xfc, 0xd9, + 0x0c, 0x00, 0xfe, 0xd9, 0x0c, 0x00, 0xff, 0xd9, 0x0c, 0x00, 0xf8, 0xdd, + 0x0c, 0x00, 0xfc, 0xdd, 0x0c, 0x00, 0xfe, 0xdd, 0x0c, 0x00, 0xff, 0xdd, + 0x0c, 0x00, 0x98, 0xdf, 0x0c, 0x00, 0x9c, 0xdf, 0x0c, 0x00, 0x9e, 0xdf, + 0x0c, 0x00, 0x9f, 0xdf, 0x0c, 0x00, 0xf6, 0xe1, 0x0c, 0x00, 0xf7, 0xe1, + 0x0c, 0x00, 0xf8, 0xe1, 0x0c, 0x00, 0xfc, 0xe1, 0x0c, 0x00, 0xfe, 0xe1, + 0x0c, 0x00, 0xff, 0xe1, 0x0c, 0x00, 0x8b, 0xe5, 0x0c, 0x00, 0xcb, 0xe5, + 0x0c, 0x00, 0xeb, 0xe5, 0x0c, 0x00, 0xf0, 0xe5, 0x0c, 0x00, 0xf6, 0xe9, + 0x0c, 0x00, 0xf7, 0xe9, 0x0c, 0x00, 0xf8, 0xe9, 0x0c, 0x00, 0xfc, 0xe9, + 0x0c, 0x00, 0xfe, 0xe9, 0x0c, 0x00, 0xff, 0xe9, 0x0c, 0x00, 0xb0, 0xea, + 0x0c, 0x00, 0xf0, 0xed, 0x0c, 0x00, 0x18, 0xef, 0x0c, 0x00, 0x1c, 0xef, + 0x0c, 0x00, 0x1e, 0xef, 0x0c, 0x00, 0x1f, 0xef, 0x0c, 0x00, 0x91, 0xef, + 0x0c, 0x00, 0x96, 0xef, 0x0c, 0x00, 0x97, 0xef, 0x0c, 0x00, 0x98, 0xef, + 0x0c, 0x00, 0x9c, 0xef, 0x0c, 0x00, 0x9e, 0xef, 0x0c, 0x00, 0x9f, 0xef, + 0x0c, 0x00, 0xd1, 0xef, 0x0c, 0x00, 0xd6, 0xef, 0x0c, 0x00, 0xd7, 0xef, + 0x0c, 0x00, 0xd8, 0xef, 0x0c, 0x00, 0xdc, 0xef, 0x0c, 0x00, 0xde, 0xef, + 0x0c, 0x00, 0xdf, 0xef, 0x0c, 0x00, 0x8b, 0xf1, 0x0c, 0x00, 0xf0, 0xf1, + 0x0c, 0x00, 0xf1, 0xf1, 0x0c, 0x00, 0xf9, 0xf1, 0x0c, 0x00, 0xfd, 0xf1, + 0x0c, 0x00, 0x88, 0xf3, 0x0c, 0x00, 0x8b, 0xf3, 0x0c, 0x00, 0x90, 0xf3, + 0x0c, 0x00, 0x8b, 0xf9, 0x0c, 0x00, 0xcb, 0xf9, 0x0c, 0x00, 0xeb, 0xf9, + 0x0c, 0x00, 0xf7, 0xf9, 0x0c, 0x00, 0xf8, 0xf9, 0x0c, 0x00, 0xfc, 0xf9, + 0x0c, 0x00, 0xfe, 0xf9, 0x0c, 0x00, 0xff, 0xf9, 0x0c, 0x00, 0x8b, 0xfd, + 0x0c, 0x00, 0xcb, 0xfd, 0x0c, 0x00, 0xeb, 0xfd, 0x0c, 0x00, 0xf0, 0xfd, + 0x0c, 0x00, 0x90, 0xff, 0x0c, 0x00, 0x99, 0xff, 0x0c, 0x00, 0x9d, 0xff, + 0x0c, 0x00, 0xd0, 0xff, 0x0c, 0x00, 0xd9, 0xff, 0x0c, 0x00, 0xdd, 0xff, + 0x0c, 0x00, 0xf4, 0x07, 0x0d, 0x00, 0xf5, 0x07, 0x0d, 0x00, 0xf8, 0x07, + 0x0d, 0x00, 0xfc, 0x07, 0x0d, 0x00, 0xfe, 0x07, 0x0d, 0x00, 0xff, 0x07, + 0x0d, 0x00, 0xf4, 0x0b, 0x0d, 0x00, 0xf5, 0x0b, 0x0d, 0x00, 0xf8, 0x0b, + 0x0d, 0x00, 0xfc, 0x0b, 0x0d, 0x00, 0xfe, 0x0b, 0x0d, 0x00, 0xff, 0x0b, + 0x0d, 0x00, 0xf4, 0x1f, 0x0d, 0x00, 0xf5, 0x1f, 0x0d, 0x00, 0xf8, 0x1f, + 0x0d, 0x00, 0xfc, 0x1f, 0x0d, 0x00, 0xfe, 0x1f, 0x0d, 0x00, 0xff, 0x1f, + 0x0d, 0x00, 0xcb, 0x25, 0x0d, 0x00, 0xeb, 0x25, 0x0d, 0x00, 0xf0, 0x33, + 0x0d, 0x00, 0xf1, 0x33, 0x0d, 0x00, 0xf9, 0x33, 0x0d, 0x00, 0xfd, 0x33, + 0x0d, 0x00, 0x8b, 0x39, 0x0d, 0x00, 0xcb, 0x39, 0x0d, 0x00, 0xeb, 0x39, + 0x0d, 0x00, 0xf0, 0x39, 0x0d, 0x00, 0xf1, 0x39, 0x0d, 0x00, 0xf9, 0x39, + 0x0d, 0x00, 0xfd, 0x39, 0x0d, 0x00, 0x8b, 0x3d, 0x0d, 0x00, 0xcb, 0x3d, + 0x0d, 0x00, 0xeb, 0x3d, 0x0d, 0x00, 0xf0, 0x3d, 0x0d, 0x00, 0xf1, 0x3d, + 0x0d, 0x00, 0xf9, 0x3d, 0x0d, 0x00, 0xfd, 0x3d, 0x0d, 0x00, 0xb0, 0x40, + 0x0d, 0x00, 0xf0, 0x41, 0x0d, 0x00, 0xf1, 0x41, 0x0d, 0x00, 0xf9, 0x41, + 0x0d, 0x00, 0xfd, 0x41, 0x0d, 0x00, 0xe6, 0x43, 0x0d, 0x00, 0xf6, 0x43, + 0x0d, 0x00, 0xf7, 0x43, 0x0d, 0x00, 0xf8, 0x43, 0x0d, 0x00, 0xfc, 0x43, + 0x0d, 0x00, 0xfe, 0x43, 0x0d, 0x00, 0xff, 0x43, 0x0d, 0x00, 0xf6, 0x45, + 0x0d, 0x00, 0xf7, 0x45, 0x0d, 0x00, 0xf8, 0x45, 0x0d, 0x00, 0xfc, 0x45, + 0x0d, 0x00, 0xfe, 0x45, 0x0d, 0x00, 0xff, 0x45, 0x0d, 0x00, 0xb0, 0x46, + 0x0d, 0x00, 0x86, 0x48, 0x0d, 0x00, 0xb0, 0x48, 0x0d, 0x00, 0xf0, 0x49, + 0x0d, 0x00, 0xf1, 0x49, 0x0d, 0x00, 0xf9, 0x49, 0x0d, 0x00, 0xfd, 0x49, + 0x0d, 0x00, 0xe6, 0x4b, 0x0d, 0x00, 0xf0, 0x4b, 0x0d, 0x00, 0x88, 0x53, + 0x0d, 0x00, 0x8b, 0x53, 0x0d, 0x00, 0x88, 0x5f, 0x0d, 0x00, 0x8b, 0x5f, + 0x0d, 0x00, 0xf0, 0x5f, 0x0d, 0x00, 0xf1, 0x5f, 0x0d, 0x00, 0xf9, 0x5f, + 0x0d, 0x00, 0xfd, 0x5f, 0x0d, 0x00, 0xf4, 0x61, 0x0d, 0x00, 0xf5, 0x61, + 0x0d, 0x00, 0xf8, 0x61, 0x0d, 0x00, 0xfc, 0x61, 0x0d, 0x00, 0xfe, 0x61, + 0x0d, 0x00, 0xff, 0x61, 0x0d, 0x00, 0xf3, 0x69, 0x0d, 0x00, 0xfb, 0x69, + 0x0d, 0x00, 0x8b, 0x84, 0x0d, 0x00, 0xb1, 0x84, 0x0d, 0x00, 0xb9, 0x84, + 0x0d, 0x00, 0xf7, 0x85, 0x0d, 0x00, 0x8b, 0x86, 0x0d, 0x00, 0xb1, 0x86, + 0x0d, 0x00, 0xb9, 0x86, 0x0d, 0x00, 0x8b, 0xa7, 0x0d, 0x00, 0xcb, 0xa7, + 0x0d, 0x00, 0xeb, 0xa7, 0x0d, 0x00, 0xf8, 0xab, 0x0d, 0x00, 0xfc, 0xab, + 0x0d, 0x00, 0xfe, 0xab, 0x0d, 0x00, 0xff, 0xab, 0x0d, 0x00, 0x8b, 0xb3, + 0x0d, 0x00, 0xf8, 0xbf, 0x0d, 0x00, 0xfc, 0xbf, 0x0d, 0x00, 0xfe, 0xbf, + 0x0d, 0x00, 0xff, 0xbf, 0x0d, 0x00, 0x8b, 0xe5, 0x0d, 0x00, 0x8b, 0xfd, + 0x0d, 0x00, 0x18, 0x01, 0x0e, 0x00, 0x1c, 0x01, 0x0e, 0x00, 0x1e, 0x01, + 0x0e, 0x00, 0x1f, 0x01, 0x0e, 0x00, 0x68, 0x01, 0x0e, 0x00, 0x6b, 0x01, + 0x0e, 0x00, 0x78, 0x01, 0x0e, 0x00, 0x7c, 0x01, 0x0e, 0x00, 0x7e, 0x01, + 0x0e, 0x00, 0x7f, 0x01, 0x0e, 0x00, 0xd8, 0x01, 0x0e, 0x00, 0xdc, 0x01, + 0x0e, 0x00, 0xde, 0x01, 0x0e, 0x00, 0xdf, 0x01, 0x0e, 0x00, 0xe8, 0x03, + 0x0e, 0x00, 0xeb, 0x03, 0x0e, 0x00, 0xf8, 0x03, 0x0e, 0x00, 0xfc, 0x03, + 0x0e, 0x00, 0xfe, 0x03, 0x0e, 0x00, 0xff, 0x03, 0x0e, 0x00, 0x98, 0x07, + 0x0e, 0x00, 0x9c, 0x07, 0x0e, 0x00, 0x9e, 0x07, 0x0e, 0x00, 0x9f, 0x07, + 0x0e, 0x00, 0x98, 0x08, 0x0e, 0x00, 0x9c, 0x08, 0x0e, 0x00, 0x9e, 0x08, + 0x0e, 0x00, 0x9f, 0x08, 0x0e, 0x00, 0xb8, 0x08, 0x0e, 0x00, 0xbc, 0x08, + 0x0e, 0x00, 0xbe, 0x08, 0x0e, 0x00, 0xbf, 0x08, 0x0e, 0x00, 0x68, 0x0a, + 0x0e, 0x00, 0x6b, 0x0a, 0x0e, 0x00, 0x78, 0x0a, 0x0e, 0x00, 0x7c, 0x0a, + 0x0e, 0x00, 0x7e, 0x0a, 0x0e, 0x00, 0x7f, 0x0a, 0x0e, 0x00, 0xb8, 0x0a, + 0x0e, 0x00, 0xbc, 0x0a, 0x0e, 0x00, 0xbe, 0x0a, 0x0e, 0x00, 0xbf, 0x0a, + 0x0e, 0x00, 0xe8, 0x0b, 0x0e, 0x00, 0xeb, 0x0b, 0x0e, 0x00, 0xf8, 0x0b, + 0x0e, 0x00, 0xfc, 0x0b, 0x0e, 0x00, 0xfe, 0x0b, 0x0e, 0x00, 0xff, 0x0b, + 0x0e, 0x00, 0xeb, 0x0d, 0x0e, 0x00, 0xf8, 0x0d, 0x0e, 0x00, 0xfc, 0x0d, + 0x0e, 0x00, 0xfe, 0x0d, 0x0e, 0x00, 0xff, 0x0d, 0x0e, 0x00, 0x98, 0x0f, + 0x0e, 0x00, 0x9c, 0x0f, 0x0e, 0x00, 0x9e, 0x0f, 0x0e, 0x00, 0x9f, 0x0f, + 0x0e, 0x00, 0x18, 0x11, 0x0e, 0x00, 0x1c, 0x11, 0x0e, 0x00, 0x1e, 0x11, + 0x0e, 0x00, 0x1f, 0x11, 0x0e, 0x00, 0x68, 0x11, 0x0e, 0x00, 0x6b, 0x11, + 0x0e, 0x00, 0x78, 0x11, 0x0e, 0x00, 0x7c, 0x11, 0x0e, 0x00, 0x7e, 0x11, + 0x0e, 0x00, 0x7f, 0x11, 0x0e, 0x00, 0xf8, 0x13, 0x0e, 0x00, 0xfc, 0x13, + 0x0e, 0x00, 0xfe, 0x13, 0x0e, 0x00, 0xff, 0x13, 0x0e, 0x00, 0x78, 0x14, + 0x0e, 0x00, 0x7c, 0x14, 0x0e, 0x00, 0x7e, 0x14, 0x0e, 0x00, 0x7f, 0x14, + 0x0e, 0x00, 0x88, 0x14, 0x0e, 0x00, 0x8b, 0x14, 0x0e, 0x00, 0xcb, 0x15, + 0x0e, 0x00, 0xeb, 0x15, 0x0e, 0x00, 0x68, 0x16, 0x0e, 0x00, 0x6b, 0x16, + 0x0e, 0x00, 0x78, 0x16, 0x0e, 0x00, 0x7c, 0x16, 0x0e, 0x00, 0x7e, 0x16, + 0x0e, 0x00, 0x7f, 0x16, 0x0e, 0x00, 0x8b, 0x16, 0x0e, 0x00, 0x68, 0x17, + 0x0e, 0x00, 0x6b, 0x17, 0x0e, 0x00, 0x78, 0x17, 0x0e, 0x00, 0x7c, 0x17, + 0x0e, 0x00, 0x7e, 0x17, 0x0e, 0x00, 0x7f, 0x17, 0x0e, 0x00, 0x88, 0x17, + 0x0e, 0x00, 0x8b, 0x17, 0x0e, 0x00, 0xc8, 0x17, 0x0e, 0x00, 0xcb, 0x17, + 0x0e, 0x00, 0xe8, 0x17, 0x0e, 0x00, 0xeb, 0x17, 0x0e, 0x00, 0xf8, 0x17, + 0x0e, 0x00, 0xfc, 0x17, 0x0e, 0x00, 0xfe, 0x17, 0x0e, 0x00, 0xff, 0x17, + 0x0e, 0x00, 0x98, 0x19, 0x0e, 0x00, 0x9c, 0x19, 0x0e, 0x00, 0x9e, 0x19, + 0x0e, 0x00, 0x9f, 0x19, 0x0e, 0x00, 0xd8, 0x19, 0x0e, 0x00, 0xdc, 0x19, + 0x0e, 0x00, 0xde, 0x19, 0x0e, 0x00, 0xdf, 0x19, 0x0e, 0x00, 0x88, 0x1b, + 0x0e, 0x00, 0x8b, 0x1b, 0x0e, 0x00, 0x98, 0x1b, 0x0e, 0x00, 0x9c, 0x1b, + 0x0e, 0x00, 0x9e, 0x1b, 0x0e, 0x00, 0x9f, 0x1b, 0x0e, 0x00, 0x98, 0x1d, + 0x0e, 0x00, 0x9c, 0x1d, 0x0e, 0x00, 0x9e, 0x1d, 0x0e, 0x00, 0x9f, 0x1d, + 0x0e, 0x00, 0xd8, 0x1d, 0x0e, 0x00, 0xdc, 0x1d, 0x0e, 0x00, 0xde, 0x1d, + 0x0e, 0x00, 0xdf, 0x1d, 0x0e, 0x00, 0xc8, 0x1f, 0x0e, 0x00, 0xcb, 0x1f, + 0x0e, 0x00, 0xe8, 0x1f, 0x0e, 0x00, 0xeb, 0x1f, 0x0e, 0x00, 0xf8, 0x1f, + 0x0e, 0x00, 0xfc, 0x1f, 0x0e, 0x00, 0xfe, 0x1f, 0x0e, 0x00, 0xff, 0x1f, + 0x0e, 0x00, 0xb8, 0x20, 0x0e, 0x00, 0xbc, 0x20, 0x0e, 0x00, 0xbe, 0x20, + 0x0e, 0x00, 0xbf, 0x20, 0x0e, 0x00, 0xe8, 0x23, 0x0e, 0x00, 0xeb, 0x23, + 0x0e, 0x00, 0xf8, 0x23, 0x0e, 0x00, 0xfc, 0x23, 0x0e, 0x00, 0xfe, 0x23, + 0x0e, 0x00, 0xff, 0x23, 0x0e, 0x00, 0xe8, 0x2b, 0x0e, 0x00, 0xeb, 0x2b, + 0x0e, 0x00, 0x98, 0x2c, 0x0e, 0x00, 0x9c, 0x2c, 0x0e, 0x00, 0x9e, 0x2c, + 0x0e, 0x00, 0x9f, 0x2c, 0x0e, 0x00, 0xf0, 0x31, 0x0e, 0x00, 0xf1, 0x31, + 0x0e, 0x00, 0xf9, 0x31, 0x0e, 0x00, 0xfd, 0x31, 0x0e, 0x00, 0x98, 0x33, + 0x0e, 0x00, 0x9c, 0x33, 0x0e, 0x00, 0x9e, 0x33, 0x0e, 0x00, 0x9f, 0x33, + 0x0e, 0x00, 0x68, 0x35, 0x0e, 0x00, 0x6b, 0x35, 0x0e, 0x00, 0x78, 0x35, + 0x0e, 0x00, 0x7c, 0x35, 0x0e, 0x00, 0x7e, 0x35, 0x0e, 0x00, 0x7f, 0x35, + 0x0e, 0x00, 0xeb, 0x35, 0x0e, 0x00, 0xf7, 0x35, 0x0e, 0x00, 0xf8, 0x35, + 0x0e, 0x00, 0xfc, 0x35, 0x0e, 0x00, 0xfe, 0x35, 0x0e, 0x00, 0xff, 0x35, + 0x0e, 0x00, 0x88, 0x37, 0x0e, 0x00, 0x8b, 0x37, 0x0e, 0x00, 0xeb, 0x39, + 0x0e, 0x00, 0xf7, 0x39, 0x0e, 0x00, 0xf8, 0x39, 0x0e, 0x00, 0xfc, 0x39, + 0x0e, 0x00, 0xfe, 0x39, 0x0e, 0x00, 0xff, 0x39, 0x0e, 0x00, 0x88, 0x3b, + 0x0e, 0x00, 0x8b, 0x3b, 0x0e, 0x00, 0xf0, 0x3d, 0x0e, 0x00, 0xf1, 0x3d, + 0x0e, 0x00, 0xf9, 0x3d, 0x0e, 0x00, 0xfd, 0x3d, 0x0e, 0x00, 0x88, 0x3f, + 0x0e, 0x00, 0x8b, 0x3f, 0x0e, 0x00, 0x90, 0x3f, 0x0e, 0x00, 0x91, 0x3f, + 0x0e, 0x00, 0x96, 0x3f, 0x0e, 0x00, 0x97, 0x3f, 0x0e, 0x00, 0x99, 0x3f, + 0x0e, 0x00, 0x9d, 0x3f, 0x0e, 0x00, 0x8b, 0x47, 0x0e, 0x00, 0x78, 0x52, + 0x0e, 0x00, 0x7c, 0x52, 0x0e, 0x00, 0x7e, 0x52, 0x0e, 0x00, 0x7f, 0x52, + 0x0e, 0x00, 0xb8, 0x52, 0x0e, 0x00, 0xbc, 0x52, 0x0e, 0x00, 0xbe, 0x52, + 0x0e, 0x00, 0xbf, 0x52, 0x0e, 0x00, 0xeb, 0x53, 0x0e, 0x00, 0xf7, 0x53, + 0x0e, 0x00, 0xf8, 0x53, 0x0e, 0x00, 0xfc, 0x53, 0x0e, 0x00, 0xfe, 0x53, + 0x0e, 0x00, 0xff, 0x53, 0x0e, 0x00, 0xb7, 0x58, 0x0e, 0x00, 0xb8, 0x58, + 0x0e, 0x00, 0xbc, 0x58, 0x0e, 0x00, 0xbe, 0x58, 0x0e, 0x00, 0xbf, 0x58, + 0x0e, 0x00, 0xb0, 0x5a, 0x0e, 0x00, 0xb1, 0x5a, 0x0e, 0x00, 0xb9, 0x5a, + 0x0e, 0x00, 0xbd, 0x5a, 0x0e, 0x00, 0xeb, 0x5b, 0x0e, 0x00, 0xf7, 0x5b, + 0x0e, 0x00, 0xf8, 0x5b, 0x0e, 0x00, 0xfc, 0x5b, 0x0e, 0x00, 0xfe, 0x5b, + 0x0e, 0x00, 0xff, 0x5b, 0x0e, 0x00, 0x78, 0x5c, 0x0e, 0x00, 0x7c, 0x5c, + 0x0e, 0x00, 0x7e, 0x5c, 0x0e, 0x00, 0x7f, 0x5c, 0x0e, 0x00, 0xb8, 0x5c, + 0x0e, 0x00, 0xbc, 0x5c, 0x0e, 0x00, 0xbe, 0x5c, 0x0e, 0x00, 0xbf, 0x5c, + 0x0e, 0x00, 0xb8, 0x5e, 0x0e, 0x00, 0xbc, 0x5e, 0x0e, 0x00, 0xbe, 0x5e, + 0x0e, 0x00, 0xbf, 0x5e, 0x0e, 0x00, 0xf0, 0x5f, 0x0e, 0x00, 0xf1, 0x5f, + 0x0e, 0x00, 0xf9, 0x5f, 0x0e, 0x00, 0xfd, 0x5f, 0x0e, 0x00, 0x0b, 0x67, + 0x0e, 0x00, 0x8b, 0x7a, 0x0e, 0x00, 0x77, 0x81, 0x0e, 0x00, 0xf7, 0x81, + 0x0e, 0x00, 0xf7, 0x83, 0x0e, 0x00, 0x8b, 0x8a, 0x0e, 0x00, 0x0b, 0x8b, + 0x0e, 0x00, 0x6b, 0x8b, 0x0e, 0x00, 0x78, 0x8b, 0x0e, 0x00, 0x7c, 0x8b, + 0x0e, 0x00, 0x7e, 0x8b, 0x0e, 0x00, 0x7f, 0x8b, 0x0e, 0x00, 0xf1, 0x8b, + 0x0e, 0x00, 0xf7, 0x8b, 0x0e, 0x00, 0xf9, 0x8b, 0x0e, 0x00, 0xfb, 0x95, + 0x0e, 0x00, 0x8b, 0x98, 0x0e, 0x00, 0x0b, 0xab, 0x0e, 0x00, 0x6b, 0xab, + 0x0e, 0x00, 0xbb, 0xb2, 0x0e, 0x00, 0xf1, 0xb3, 0x0e, 0x00, 0xf7, 0xb3, + 0x0e, 0x00, 0xf9, 0xb3, 0x0e, 0x00, 0xbb, 0xbe, 0x0e, 0x00, 0xf1, 0xbf, + 0x0e, 0x00, 0xf7, 0xbf, 0x0e, 0x00, 0xf9, 0xbf, 0x0e, 0x00, 0x86, 0xc0, + 0x0e, 0x00, 0xb0, 0xc0, 0x0e, 0x00, 0x78, 0xc2, 0x0e, 0x00, 0x7c, 0xc2, + 0x0e, 0x00, 0x7e, 0xc2, 0x0e, 0x00, 0x7f, 0xc2, 0x0e, 0x00, 0x88, 0xc2, + 0x0e, 0x00, 0x8b, 0xc2, 0x0e, 0x00, 0x90, 0xc2, 0x0e, 0x00, 0x98, 0xc2, + 0x0e, 0x00, 0x9c, 0xc2, 0x0e, 0x00, 0x9e, 0xc2, 0x0e, 0x00, 0x9f, 0xc2, + 0x0e, 0x00, 0x78, 0xc3, 0x0e, 0x00, 0x7c, 0xc3, 0x0e, 0x00, 0x7e, 0xc3, + 0x0e, 0x00, 0x7f, 0xc3, 0x0e, 0x00, 0xd1, 0xc3, 0x0e, 0x00, 0xd6, 0xc3, + 0x0e, 0x00, 0xd7, 0xc3, 0x0e, 0x00, 0xd9, 0xc3, 0x0e, 0x00, 0xdd, 0xc3, + 0x0e, 0x00, 0xe6, 0xc3, 0x0e, 0x00, 0xf6, 0xc3, 0x0e, 0x00, 0xf7, 0xc3, + 0x0e, 0x00, 0xf8, 0xc3, 0x0e, 0x00, 0xfc, 0xc3, 0x0e, 0x00, 0xfe, 0xc3, + 0x0e, 0x00, 0xff, 0xc3, 0x0e, 0x00, 0x91, 0xc5, 0x0e, 0x00, 0x96, 0xc5, + 0x0e, 0x00, 0x97, 0xc5, 0x0e, 0x00, 0x99, 0xc5, 0x0e, 0x00, 0x9d, 0xc5, + 0x0e, 0x00, 0xb0, 0xc6, 0x0e, 0x00, 0xf0, 0xc7, 0x0e, 0x00, 0xf1, 0xc7, + 0x0e, 0x00, 0xf9, 0xc7, 0x0e, 0x00, 0xfd, 0xc7, 0x0e, 0x00, 0xf0, 0xc9, + 0x0e, 0x00, 0xf1, 0xc9, 0x0e, 0x00, 0xf9, 0xc9, 0x0e, 0x00, 0xfd, 0xc9, + 0x0e, 0x00, 0x18, 0xcf, 0x0e, 0x00, 0x1c, 0xcf, 0x0e, 0x00, 0x1e, 0xcf, + 0x0e, 0x00, 0x1f, 0xcf, 0x0e, 0x00, 0x91, 0xcf, 0x0e, 0x00, 0x96, 0xcf, + 0x0e, 0x00, 0x97, 0xcf, 0x0e, 0x00, 0x98, 0xcf, 0x0e, 0x00, 0x9c, 0xcf, + 0x0e, 0x00, 0x9e, 0xcf, 0x0e, 0x00, 0x9f, 0xcf, 0x0e, 0x00, 0xd1, 0xcf, + 0x0e, 0x00, 0xd6, 0xcf, 0x0e, 0x00, 0xd7, 0xcf, 0x0e, 0x00, 0xd8, 0xcf, + 0x0e, 0x00, 0xdc, 0xcf, 0x0e, 0x00, 0xde, 0xcf, 0x0e, 0x00, 0xdf, 0xcf, + 0x0e, 0x00, 0x88, 0xd0, 0x0e, 0x00, 0x8b, 0xd0, 0x0e, 0x00, 0xd8, 0xd3, + 0x0e, 0x00, 0xdc, 0xd3, 0x0e, 0x00, 0xde, 0xd3, 0x0e, 0x00, 0xdf, 0xd3, + 0x0e, 0x00, 0xe8, 0xd3, 0x0e, 0x00, 0xeb, 0xd3, 0x0e, 0x00, 0xf8, 0xd5, + 0x0e, 0x00, 0xfc, 0xd5, 0x0e, 0x00, 0xfe, 0xd5, 0x0e, 0x00, 0xff, 0xd5, + 0x0e, 0x00, 0x88, 0xd7, 0x0e, 0x00, 0x8b, 0xd7, 0x0e, 0x00, 0xf8, 0xdb, + 0x0e, 0x00, 0xfc, 0xdb, 0x0e, 0x00, 0xfe, 0xdb, 0x0e, 0x00, 0xff, 0xdb, + 0x0e, 0x00, 0xd8, 0xdf, 0x0e, 0x00, 0xdc, 0xdf, 0x0e, 0x00, 0xde, 0xdf, + 0x0e, 0x00, 0xdf, 0xdf, 0x0e, 0x00, 0xe8, 0xdf, 0x0e, 0x00, 0xeb, 0xdf, + 0x0e, 0x00, 0x86, 0xe0, 0x0e, 0x00, 0xb0, 0xe0, 0x0e, 0x00, 0x90, 0xe2, + 0x0e, 0x00, 0x99, 0xe2, 0x0e, 0x00, 0x9d, 0xe2, 0x0e, 0x00, 0x8b, 0xe5, + 0x0e, 0x00, 0xcb, 0xe5, 0x0e, 0x00, 0xeb, 0xe5, 0x0e, 0x00, 0xf0, 0xe5, + 0x0e, 0x00, 0x86, 0xe8, 0x0e, 0x00, 0xb0, 0xe8, 0x0e, 0x00, 0x08, 0xe9, + 0x0e, 0x00, 0x0b, 0xe9, 0x0e, 0x00, 0x90, 0xe9, 0x0e, 0x00, 0x99, 0xe9, + 0x0e, 0x00, 0x9d, 0xe9, 0x0e, 0x00, 0xd0, 0xe9, 0x0e, 0x00, 0xd9, 0xe9, + 0x0e, 0x00, 0xdd, 0xe9, 0x0e, 0x00, 0xe6, 0xeb, 0x0e, 0x00, 0xf0, 0xeb, + 0x0e, 0x00, 0x68, 0xec, 0x0e, 0x00, 0x6b, 0xec, 0x0e, 0x00, 0x91, 0xec, + 0x0e, 0x00, 0x96, 0xec, 0x0e, 0x00, 0x97, 0xec, 0x0e, 0x00, 0x98, 0xec, + 0x0e, 0x00, 0x9c, 0xec, 0x0e, 0x00, 0x9e, 0xec, 0x0e, 0x00, 0x9f, 0xec, + 0x0e, 0x00, 0x08, 0xed, 0x0e, 0x00, 0x0b, 0xed, 0x0e, 0x00, 0x90, 0xed, + 0x0e, 0x00, 0xd0, 0xed, 0x0e, 0x00, 0x88, 0xee, 0x0e, 0x00, 0x8b, 0xee, + 0x0e, 0x00, 0x90, 0xee, 0x0e, 0x00, 0x99, 0xee, 0x0e, 0x00, 0x9d, 0xee, + 0x0e, 0x00, 0xf0, 0xef, 0x0e, 0x00, 0xf1, 0xef, 0x0e, 0x00, 0xf9, 0xef, + 0x0e, 0x00, 0xfd, 0xef, 0x0e, 0x00, 0x8b, 0xf1, 0x0e, 0x00, 0xf0, 0xf1, + 0x0e, 0x00, 0xf1, 0xf1, 0x0e, 0x00, 0xf9, 0xf1, 0x0e, 0x00, 0xfd, 0xf1, + 0x0e, 0x00, 0x88, 0xf3, 0x0e, 0x00, 0x8b, 0xf3, 0x0e, 0x00, 0x90, 0xf3, + 0x0e, 0x00, 0x8b, 0xf9, 0x0e, 0x00, 0xcb, 0xf9, 0x0e, 0x00, 0xeb, 0xf9, + 0x0e, 0x00, 0xf7, 0xf9, 0x0e, 0x00, 0xf8, 0xf9, 0x0e, 0x00, 0xfc, 0xf9, + 0x0e, 0x00, 0xfe, 0xf9, 0x0e, 0x00, 0xff, 0xf9, 0x0e, 0x00, 0x8b, 0xfd, + 0x0e, 0x00, 0xcb, 0xfd, 0x0e, 0x00, 0xeb, 0xfd, 0x0e, 0x00, 0xf0, 0xfd, + 0x0e, 0x00, 0x90, 0xff, 0x0e, 0x00, 0x99, 0xff, 0x0e, 0x00, 0x9d, 0xff, + 0x0e, 0x00, 0xd0, 0xff, 0x0e, 0x00, 0xd9, 0xff, 0x0e, 0x00, 0xdd, 0xff, + 0x0e, 0x00, 0x73, 0x00, 0x0f, 0x00, 0x7b, 0x00, 0x0f, 0x00, 0xb3, 0x00, + 0x0f, 0x00, 0xbb, 0x00, 0x0f, 0x00, 0x03, 0x01, 0x0f, 0x00, 0x04, 0x01, + 0x0f, 0x00, 0x05, 0x01, 0x0f, 0x00, 0x98, 0x03, 0x0f, 0x00, 0x9c, 0x03, + 0x0f, 0x00, 0x9e, 0x03, 0x0f, 0x00, 0x9f, 0x03, 0x0f, 0x00, 0x73, 0x04, + 0x0f, 0x00, 0x7b, 0x04, 0x0f, 0x00, 0xb4, 0x04, 0x0f, 0x00, 0xb5, 0x04, + 0x0f, 0x00, 0xb8, 0x04, 0x0f, 0x00, 0xbc, 0x04, 0x0f, 0x00, 0xbe, 0x04, + 0x0f, 0x00, 0xbf, 0x04, 0x0f, 0x00, 0xc3, 0x05, 0x0f, 0x00, 0xc4, 0x05, + 0x0f, 0x00, 0xc5, 0x05, 0x0f, 0x00, 0xc8, 0x05, 0x0f, 0x00, 0xcb, 0x05, + 0x0f, 0x00, 0xcc, 0x05, 0x0f, 0x00, 0xce, 0x05, 0x0f, 0x00, 0xcf, 0x05, + 0x0f, 0x00, 0xf4, 0x05, 0x0f, 0x00, 0xf5, 0x05, 0x0f, 0x00, 0xf8, 0x05, + 0x0f, 0x00, 0xfc, 0x05, 0x0f, 0x00, 0xfe, 0x05, 0x0f, 0x00, 0xff, 0x05, + 0x0f, 0x00, 0x73, 0x06, 0x0f, 0x00, 0x7b, 0x06, 0x0f, 0x00, 0xb3, 0x06, + 0x0f, 0x00, 0xbb, 0x06, 0x0f, 0x00, 0xd8, 0x07, 0x0f, 0x00, 0xdc, 0x07, + 0x0f, 0x00, 0xde, 0x07, 0x0f, 0x00, 0xdf, 0x07, 0x0f, 0x00, 0xe3, 0x07, + 0x0f, 0x00, 0xf3, 0x07, 0x0f, 0x00, 0xfb, 0x07, 0x0f, 0x00, 0x83, 0x08, + 0x0f, 0x00, 0x84, 0x08, 0x0f, 0x00, 0x85, 0x08, 0x0f, 0x00, 0x98, 0x08, + 0x0f, 0x00, 0x9c, 0x08, 0x0f, 0x00, 0x9e, 0x08, 0x0f, 0x00, 0x9f, 0x08, + 0x0f, 0x00, 0xb3, 0x08, 0x0f, 0x00, 0xbb, 0x08, 0x0f, 0x00, 0x64, 0x0a, + 0x0f, 0x00, 0x65, 0x0a, 0x0f, 0x00, 0x68, 0x0a, 0x0f, 0x00, 0x6b, 0x0a, + 0x0f, 0x00, 0x6c, 0x0a, 0x0f, 0x00, 0x6e, 0x0a, 0x0f, 0x00, 0x6f, 0x0a, + 0x0f, 0x00, 0x74, 0x0a, 0x0f, 0x00, 0x75, 0x0a, 0x0f, 0x00, 0x78, 0x0a, + 0x0f, 0x00, 0x7c, 0x0a, 0x0f, 0x00, 0x7e, 0x0a, 0x0f, 0x00, 0x7f, 0x0a, + 0x0f, 0x00, 0x08, 0x0b, 0x0f, 0x00, 0x0b, 0x0b, 0x0f, 0x00, 0x68, 0x0b, + 0x0f, 0x00, 0x6b, 0x0b, 0x0f, 0x00, 0x78, 0x0b, 0x0f, 0x00, 0x7c, 0x0b, + 0x0f, 0x00, 0x7e, 0x0b, 0x0f, 0x00, 0x7f, 0x0b, 0x0f, 0x00, 0xd3, 0x0b, + 0x0f, 0x00, 0xd4, 0x0b, 0x0f, 0x00, 0xd5, 0x0b, 0x0f, 0x00, 0xdb, 0x0b, + 0x0f, 0x00, 0xe4, 0x0b, 0x0f, 0x00, 0xe5, 0x0b, 0x0f, 0x00, 0xe8, 0x0b, + 0x0f, 0x00, 0xeb, 0x0b, 0x0f, 0x00, 0xec, 0x0b, 0x0f, 0x00, 0xee, 0x0b, + 0x0f, 0x00, 0xef, 0x0b, 0x0f, 0x00, 0xf4, 0x0b, 0x0f, 0x00, 0xf5, 0x0b, + 0x0f, 0x00, 0xf8, 0x0b, 0x0f, 0x00, 0xfc, 0x0b, 0x0f, 0x00, 0xfe, 0x0b, + 0x0f, 0x00, 0xff, 0x0b, 0x0f, 0x00, 0x93, 0x0f, 0x0f, 0x00, 0x94, 0x0f, + 0x0f, 0x00, 0x95, 0x0f, 0x0f, 0x00, 0x9b, 0x0f, 0x0f, 0x00, 0x74, 0x10, + 0x0f, 0x00, 0x75, 0x10, 0x0f, 0x00, 0x78, 0x10, 0x0f, 0x00, 0x7c, 0x10, + 0x0f, 0x00, 0x7e, 0x10, 0x0f, 0x00, 0x7f, 0x10, 0x0f, 0x00, 0x03, 0x11, + 0x0f, 0x00, 0x04, 0x11, 0x0f, 0x00, 0x05, 0x11, 0x0f, 0x00, 0x88, 0x14, + 0x0f, 0x00, 0x8b, 0x14, 0x0f, 0x00, 0x8c, 0x14, 0x0f, 0x00, 0x8e, 0x14, + 0x0f, 0x00, 0x8f, 0x14, 0x0f, 0x00, 0x93, 0x14, 0x0f, 0x00, 0x94, 0x14, + 0x0f, 0x00, 0x95, 0x14, 0x0f, 0x00, 0x9b, 0x14, 0x0f, 0x00, 0xb4, 0x14, + 0x0f, 0x00, 0xb5, 0x14, 0x0f, 0x00, 0xb8, 0x14, 0x0f, 0x00, 0xbc, 0x14, + 0x0f, 0x00, 0xbe, 0x14, 0x0f, 0x00, 0xbf, 0x14, 0x0f, 0x00, 0x63, 0x16, + 0x0f, 0x00, 0x73, 0x16, 0x0f, 0x00, 0x7b, 0x16, 0x0f, 0x00, 0x64, 0x17, + 0x0f, 0x00, 0x65, 0x17, 0x0f, 0x00, 0x68, 0x17, 0x0f, 0x00, 0x6b, 0x17, + 0x0f, 0x00, 0x6c, 0x17, 0x0f, 0x00, 0x6e, 0x17, 0x0f, 0x00, 0x6f, 0x17, + 0x0f, 0x00, 0x74, 0x17, 0x0f, 0x00, 0x75, 0x17, 0x0f, 0x00, 0x78, 0x17, + 0x0f, 0x00, 0x7c, 0x17, 0x0f, 0x00, 0x7e, 0x17, 0x0f, 0x00, 0x7f, 0x17, + 0x0f, 0x00, 0x83, 0x17, 0x0f, 0x00, 0x84, 0x17, 0x0f, 0x00, 0x85, 0x17, + 0x0f, 0x00, 0xe3, 0x17, 0x0f, 0x00, 0xf3, 0x17, 0x0f, 0x00, 0xfb, 0x17, + 0x0f, 0x00, 0x74, 0x18, 0x0f, 0x00, 0x75, 0x18, 0x0f, 0x00, 0x78, 0x18, + 0x0f, 0x00, 0x7c, 0x18, 0x0f, 0x00, 0x7e, 0x18, 0x0f, 0x00, 0x7f, 0x18, + 0x0f, 0x00, 0xf3, 0x19, 0x0f, 0x00, 0xfb, 0x19, 0x0f, 0x00, 0x73, 0x1a, + 0x0f, 0x00, 0x7b, 0x1a, 0x0f, 0x00, 0x08, 0x1b, 0x0f, 0x00, 0x0b, 0x1b, + 0x0f, 0x00, 0xd8, 0x1b, 0x0f, 0x00, 0xf3, 0x1b, 0x0f, 0x00, 0xfb, 0x1b, + 0x0f, 0x00, 0xf3, 0x1d, 0x0f, 0x00, 0xfb, 0x1d, 0x0f, 0x00, 0x93, 0x1f, + 0x0f, 0x00, 0x94, 0x1f, 0x0f, 0x00, 0x95, 0x1f, 0x0f, 0x00, 0x9b, 0x1f, + 0x0f, 0x00, 0xd3, 0x1f, 0x0f, 0x00, 0xd4, 0x1f, 0x0f, 0x00, 0xd5, 0x1f, + 0x0f, 0x00, 0xdb, 0x1f, 0x0f, 0x00, 0xb8, 0x24, 0x0f, 0x00, 0xbc, 0x24, + 0x0f, 0x00, 0xbe, 0x24, 0x0f, 0x00, 0xbf, 0x24, 0x0f, 0x00, 0xb8, 0x26, + 0x0f, 0x00, 0xbc, 0x26, 0x0f, 0x00, 0xbe, 0x26, 0x0f, 0x00, 0xbf, 0x26, + 0x0f, 0x00, 0xe8, 0x2b, 0x0f, 0x00, 0xeb, 0x2b, 0x0f, 0x00, 0xd8, 0x33, + 0x0f, 0x00, 0xdc, 0x33, 0x0f, 0x00, 0xde, 0x33, 0x0f, 0x00, 0xdf, 0x33, + 0x0f, 0x00, 0xe9, 0x33, 0x0f, 0x00, 0xea, 0x33, 0x0f, 0x00, 0xf0, 0x33, + 0x0f, 0x00, 0xf1, 0x33, 0x0f, 0x00, 0xf9, 0x33, 0x0f, 0x00, 0xfd, 0x33, + 0x0f, 0x00, 0xb0, 0x38, 0x0f, 0x00, 0xb1, 0x38, 0x0f, 0x00, 0xb9, 0x38, + 0x0f, 0x00, 0xbd, 0x38, 0x0f, 0x00, 0x8b, 0x39, 0x0f, 0x00, 0xb7, 0x3a, + 0x0f, 0x00, 0xb8, 0x3a, 0x0f, 0x00, 0xbc, 0x3a, 0x0f, 0x00, 0xbe, 0x3a, + 0x0f, 0x00, 0xbf, 0x3a, 0x0f, 0x00, 0xe9, 0x3b, 0x0f, 0x00, 0xea, 0x3b, + 0x0f, 0x00, 0xf0, 0x3b, 0x0f, 0x00, 0xf1, 0x3b, 0x0f, 0x00, 0xf9, 0x3b, + 0x0f, 0x00, 0xfd, 0x3b, 0x0f, 0x00, 0x68, 0x3e, 0x0f, 0x00, 0x6b, 0x3e, + 0x0f, 0x00, 0x78, 0x3e, 0x0f, 0x00, 0x7c, 0x3e, 0x0f, 0x00, 0x7e, 0x3e, + 0x0f, 0x00, 0x7f, 0x3e, 0x0f, 0x00, 0xd0, 0x3f, 0x0f, 0x00, 0xd1, 0x3f, + 0x0f, 0x00, 0xd6, 0x3f, 0x0f, 0x00, 0xd7, 0x3f, 0x0f, 0x00, 0xd9, 0x3f, + 0x0f, 0x00, 0xdd, 0x3f, 0x0f, 0x00, 0xe6, 0x3f, 0x0f, 0x00, 0xe7, 0x3f, + 0x0f, 0x00, 0xe8, 0x3f, 0x0f, 0x00, 0xeb, 0x3f, 0x0f, 0x00, 0xf6, 0x3f, + 0x0f, 0x00, 0xf7, 0x3f, 0x0f, 0x00, 0xf8, 0x3f, 0x0f, 0x00, 0xfc, 0x3f, + 0x0f, 0x00, 0xfe, 0x3f, 0x0f, 0x00, 0xff, 0x3f, 0x0f, 0x00, 0x77, 0x40, + 0x0f, 0x00, 0x78, 0x40, 0x0f, 0x00, 0x7c, 0x40, 0x0f, 0x00, 0x7e, 0x40, + 0x0f, 0x00, 0x7f, 0x40, 0x0f, 0x00, 0xb0, 0x40, 0x0f, 0x00, 0xb1, 0x40, + 0x0f, 0x00, 0xb9, 0x40, 0x0f, 0x00, 0xbd, 0x40, 0x0f, 0x00, 0x70, 0x44, + 0x0f, 0x00, 0x71, 0x44, 0x0f, 0x00, 0x79, 0x44, 0x0f, 0x00, 0x7d, 0x44, + 0x0f, 0x00, 0xb0, 0x44, 0x0f, 0x00, 0xb1, 0x44, 0x0f, 0x00, 0xb9, 0x44, + 0x0f, 0x00, 0xbd, 0x44, 0x0f, 0x00, 0xc7, 0x45, 0x0f, 0x00, 0xcb, 0x45, + 0x0f, 0x00, 0xf7, 0x45, 0x0f, 0x00, 0xf8, 0x45, 0x0f, 0x00, 0xfc, 0x45, + 0x0f, 0x00, 0xfe, 0x45, 0x0f, 0x00, 0xff, 0x45, 0x0f, 0x00, 0x77, 0x46, + 0x0f, 0x00, 0x78, 0x46, 0x0f, 0x00, 0x7c, 0x46, 0x0f, 0x00, 0x7e, 0x46, + 0x0f, 0x00, 0x7f, 0x46, 0x0f, 0x00, 0xb0, 0x46, 0x0f, 0x00, 0xb1, 0x46, + 0x0f, 0x00, 0xb9, 0x46, 0x0f, 0x00, 0xbd, 0x46, 0x0f, 0x00, 0xf0, 0x47, + 0x0f, 0x00, 0xf1, 0x47, 0x0f, 0x00, 0xf9, 0x47, 0x0f, 0x00, 0xfd, 0x47, + 0x0f, 0x00, 0x6b, 0x48, 0x0f, 0x00, 0x8b, 0x48, 0x0f, 0x00, 0x6b, 0x49, + 0x0f, 0x00, 0x8b, 0x49, 0x0f, 0x00, 0xcb, 0x49, 0x0f, 0x00, 0xeb, 0x49, + 0x0f, 0x00, 0x70, 0x4a, 0x0f, 0x00, 0x71, 0x4a, 0x0f, 0x00, 0x77, 0x4a, + 0x0f, 0x00, 0x79, 0x4a, 0x0f, 0x00, 0x7d, 0x4a, 0x0f, 0x00, 0xeb, 0x4b, + 0x0f, 0x00, 0xf8, 0x4b, 0x0f, 0x00, 0xfc, 0x4b, 0x0f, 0x00, 0xfe, 0x4b, + 0x0f, 0x00, 0xff, 0x4b, 0x0f, 0x00, 0x0b, 0x4f, 0x0f, 0x00, 0xc7, 0x51, + 0x0f, 0x00, 0xcb, 0x51, 0x0f, 0x00, 0xf7, 0x51, 0x0f, 0x00, 0xf8, 0x51, + 0x0f, 0x00, 0xfc, 0x51, 0x0f, 0x00, 0xfe, 0x51, 0x0f, 0x00, 0xff, 0x51, + 0x0f, 0x00, 0x8b, 0x53, 0x0f, 0x00, 0x78, 0x55, 0x0f, 0x00, 0x7c, 0x55, + 0x0f, 0x00, 0x7e, 0x55, 0x0f, 0x00, 0x7f, 0x55, 0x0f, 0x00, 0xf0, 0x59, + 0x0f, 0x00, 0xf1, 0x59, 0x0f, 0x00, 0xf9, 0x59, 0x0f, 0x00, 0xfd, 0x59, + 0x0f, 0x00, 0xc7, 0x5d, 0x0f, 0x00, 0xcb, 0x5d, 0x0f, 0x00, 0xf7, 0x5d, + 0x0f, 0x00, 0xf8, 0x5d, 0x0f, 0x00, 0xfc, 0x5d, 0x0f, 0x00, 0xfe, 0x5d, + 0x0f, 0x00, 0xff, 0x5d, 0x0f, 0x00, 0x8b, 0x64, 0x0f, 0x00, 0x8b, 0x66, + 0x0f, 0x00, 0x6b, 0x67, 0x0f, 0x00, 0x78, 0x6b, 0x0f, 0x00, 0x7c, 0x6b, + 0x0f, 0x00, 0x7e, 0x6b, 0x0f, 0x00, 0x7f, 0x6b, 0x0f, 0x00, 0x08, 0x85, + 0x0f, 0x00, 0x0b, 0x85, 0x0f, 0x00, 0x18, 0x87, 0x0f, 0x00, 0x1c, 0x87, + 0x0f, 0x00, 0x1e, 0x87, 0x0f, 0x00, 0x1f, 0x87, 0x0f, 0x00, 0x83, 0x87, + 0x0f, 0x00, 0x84, 0x87, 0x0f, 0x00, 0x85, 0x87, 0x0f, 0x00, 0x86, 0x87, + 0x0f, 0x00, 0x87, 0x87, 0x0f, 0x00, 0x89, 0x87, 0x0f, 0x00, 0x8a, 0x87, + 0x0f, 0x00, 0x8d, 0x87, 0x0f, 0x00, 0x90, 0x87, 0x0f, 0x00, 0x91, 0x87, + 0x0f, 0x00, 0x93, 0x87, 0x0f, 0x00, 0x94, 0x87, 0x0f, 0x00, 0x95, 0x87, + 0x0f, 0x00, 0x96, 0x87, 0x0f, 0x00, 0x97, 0x87, 0x0f, 0x00, 0x99, 0x87, + 0x0f, 0x00, 0x9b, 0x87, 0x0f, 0x00, 0x9d, 0x87, 0x0f, 0x00, 0x10, 0x8b, + 0x0f, 0x00, 0x11, 0x8b, 0x0f, 0x00, 0x16, 0x8b, 0x0f, 0x00, 0x17, 0x8b, + 0x0f, 0x00, 0x19, 0x8b, 0x0f, 0x00, 0x1d, 0x8b, 0x0f, 0x00, 0x80, 0x8b, + 0x0f, 0x00, 0x81, 0x8b, 0x0f, 0x00, 0x82, 0x8b, 0x0f, 0x00, 0x88, 0x8b, + 0x0f, 0x00, 0x8b, 0x8b, 0x0f, 0x00, 0x8c, 0x8b, 0x0f, 0x00, 0x8e, 0x8b, + 0x0f, 0x00, 0x8f, 0x8b, 0x0f, 0x00, 0x92, 0x8b, 0x0f, 0x00, 0x98, 0x8b, + 0x0f, 0x00, 0x9a, 0x8b, 0x0f, 0x00, 0x9c, 0x8b, 0x0f, 0x00, 0x9e, 0x8b, + 0x0f, 0x00, 0x9f, 0x8b, 0x0f, 0x00, 0xf4, 0x93, 0x0f, 0x00, 0xf5, 0x93, + 0x0f, 0x00, 0xf8, 0x93, 0x0f, 0x00, 0xfc, 0x93, 0x0f, 0x00, 0xfe, 0x93, + 0x0f, 0x00, 0xff, 0x93, 0x0f, 0x00, 0xf3, 0x9b, 0x0f, 0x00, 0xfb, 0x9b, + 0x0f, 0x00, 0xc3, 0x9f, 0x0f, 0x00, 0xc4, 0x9f, 0x0f, 0x00, 0xc5, 0x9f, + 0x0f, 0x00, 0xc8, 0x9f, 0x0f, 0x00, 0xcb, 0x9f, 0x0f, 0x00, 0xcc, 0x9f, + 0x0f, 0x00, 0xce, 0x9f, 0x0f, 0x00, 0xcf, 0x9f, 0x0f, 0x00, 0xe4, 0x9f, + 0x0f, 0x00, 0xe5, 0x9f, 0x0f, 0x00, 0xe8, 0x9f, 0x0f, 0x00, 0xeb, 0x9f, + 0x0f, 0x00, 0xec, 0x9f, 0x0f, 0x00, 0xee, 0x9f, 0x0f, 0x00, 0xef, 0x9f, + 0x0f, 0x00, 0xf4, 0x9f, 0x0f, 0x00, 0xf5, 0x9f, 0x0f, 0x00, 0xf8, 0x9f, + 0x0f, 0x00, 0xfc, 0x9f, 0x0f, 0x00, 0xfe, 0x9f, 0x0f, 0x00, 0xff, 0x9f, + 0x0f, 0x00, 0x98, 0xa7, 0x0f, 0x00, 0x9c, 0xa7, 0x0f, 0x00, 0x9e, 0xa7, + 0x0f, 0x00, 0x9f, 0xa7, 0x0f, 0x00, 0x88, 0xab, 0x0f, 0x00, 0x8b, 0xab, + 0x0f, 0x00, 0x98, 0xab, 0x0f, 0x00, 0x9c, 0xab, 0x0f, 0x00, 0x9e, 0xab, + 0x0f, 0x00, 0x9f, 0xab, 0x0f, 0x00, 0xd8, 0xb3, 0x0f, 0x00, 0xdc, 0xb3, + 0x0f, 0x00, 0xde, 0xb3, 0x0f, 0x00, 0xdf, 0xb3, 0x0f, 0x00, 0xe9, 0xb3, + 0x0f, 0x00, 0xea, 0xb3, 0x0f, 0x00, 0xf0, 0xb3, 0x0f, 0x00, 0xf1, 0xb3, + 0x0f, 0x00, 0xf9, 0xb3, 0x0f, 0x00, 0xfd, 0xb3, 0x0f, 0x00, 0x8b, 0xb9, + 0x0f, 0x00, 0x88, 0xbb, 0x0f, 0x00, 0x8b, 0xbb, 0x0f, 0x00, 0x98, 0xbb, + 0x0f, 0x00, 0x9c, 0xbb, 0x0f, 0x00, 0x9e, 0xbb, 0x0f, 0x00, 0x9f, 0xbb, + 0x0f, 0x00, 0x68, 0xbe, 0x0f, 0x00, 0x6b, 0xbe, 0x0f, 0x00, 0x78, 0xbe, + 0x0f, 0x00, 0x7c, 0xbe, 0x0f, 0x00, 0x7e, 0xbe, 0x0f, 0x00, 0x7f, 0xbe, + 0x0f, 0x00, 0xd0, 0xbf, 0x0f, 0x00, 0xd1, 0xbf, 0x0f, 0x00, 0xd6, 0xbf, + 0x0f, 0x00, 0xd7, 0xbf, 0x0f, 0x00, 0xd9, 0xbf, 0x0f, 0x00, 0xdd, 0xbf, + 0x0f, 0x00, 0xe6, 0xbf, 0x0f, 0x00, 0xe7, 0xbf, 0x0f, 0x00, 0xe8, 0xbf, + 0x0f, 0x00, 0xeb, 0xbf, 0x0f, 0x00, 0xf6, 0xbf, 0x0f, 0x00, 0xf7, 0xbf, + 0x0f, 0x00, 0xf8, 0xbf, 0x0f, 0x00, 0xfc, 0xbf, 0x0f, 0x00, 0xfe, 0xbf, + 0x0f, 0x00, 0xff, 0xbf, 0x0f, 0x00, 0xb2, 0xc4, 0x0f, 0x00, 0xb4, 0xc4, + 0x0f, 0x00, 0xb5, 0xc4, 0x0f, 0x00, 0xb6, 0xc4, 0x0f, 0x00, 0xb7, 0xc4, + 0x0f, 0x00, 0xb8, 0xc4, 0x0f, 0x00, 0xba, 0xc4, 0x0f, 0x00, 0xbc, 0xc4, + 0x0f, 0x00, 0xbe, 0xc4, 0x0f, 0x00, 0xbf, 0xc4, 0x0f, 0x00, 0x08, 0xc5, + 0x0f, 0x00, 0x0b, 0xc5, 0x0f, 0x00, 0xb0, 0xc6, 0x0f, 0x00, 0xb1, 0xc6, + 0x0f, 0x00, 0xb3, 0xc6, 0x0f, 0x00, 0xb9, 0xc6, 0x0f, 0x00, 0xbb, 0xc6, + 0x0f, 0x00, 0xbd, 0xc6, 0x0f, 0x00, 0xe0, 0xc7, 0x0f, 0x00, 0xe1, 0xc7, + 0x0f, 0x00, 0xe2, 0xc7, 0x0f, 0x00, 0xe4, 0xc7, 0x0f, 0x00, 0xe5, 0xc7, + 0x0f, 0x00, 0xe6, 0xc7, 0x0f, 0x00, 0xe7, 0xc7, 0x0f, 0x00, 0xe8, 0xc7, + 0x0f, 0x00, 0xeb, 0xc7, 0x0f, 0x00, 0xec, 0xc7, 0x0f, 0x00, 0xee, 0xc7, + 0x0f, 0x00, 0xef, 0xc7, 0x0f, 0x00, 0xf2, 0xc7, 0x0f, 0x00, 0xf4, 0xc7, + 0x0f, 0x00, 0xf5, 0xc7, 0x0f, 0x00, 0xf6, 0xc7, 0x0f, 0x00, 0xf7, 0xc7, + 0x0f, 0x00, 0xf8, 0xc7, 0x0f, 0x00, 0xfa, 0xc7, 0x0f, 0x00, 0xfc, 0xc7, + 0x0f, 0x00, 0xfe, 0xc7, 0x0f, 0x00, 0xff, 0xc7, 0x0f, 0x00, 0xf2, 0xcb, + 0x0f, 0x00, 0xf4, 0xcb, 0x0f, 0x00, 0xf5, 0xcb, 0x0f, 0x00, 0xf6, 0xcb, + 0x0f, 0x00, 0xf7, 0xcb, 0x0f, 0x00, 0xf8, 0xcb, 0x0f, 0x00, 0xfa, 0xcb, + 0x0f, 0x00, 0xfc, 0xcb, 0x0f, 0x00, 0xfe, 0xcb, 0x0f, 0x00, 0xff, 0xcb, + 0x0f, 0x00, 0xd8, 0xd3, 0x0f, 0x00, 0xdc, 0xd3, 0x0f, 0x00, 0xde, 0xd3, + 0x0f, 0x00, 0xdf, 0xd3, 0x0f, 0x00, 0xe3, 0xd3, 0x0f, 0x00, 0xf3, 0xd3, + 0x0f, 0x00, 0xfb, 0xd3, 0x0f, 0x00, 0xb3, 0xd8, 0x0f, 0x00, 0xbb, 0xd8, + 0x0f, 0x00, 0xb3, 0xda, 0x0f, 0x00, 0xbb, 0xda, 0x0f, 0x00, 0xe4, 0xdb, + 0x0f, 0x00, 0xe5, 0xdb, 0x0f, 0x00, 0xe8, 0xdb, 0x0f, 0x00, 0xeb, 0xdb, + 0x0f, 0x00, 0xec, 0xdb, 0x0f, 0x00, 0xee, 0xdb, 0x0f, 0x00, 0xef, 0xdb, + 0x0f, 0x00, 0xf4, 0xdb, 0x0f, 0x00, 0xf5, 0xdb, 0x0f, 0x00, 0xf8, 0xdb, + 0x0f, 0x00, 0xfc, 0xdb, 0x0f, 0x00, 0xfe, 0xdb, 0x0f, 0x00, 0xff, 0xdb, + 0x0f, 0x00, 0xd3, 0xdf, 0x0f, 0x00, 0xd4, 0xdf, 0x0f, 0x00, 0xd5, 0xdf, + 0x0f, 0x00, 0xdb, 0xdf, 0x0f, 0x00, 0xe4, 0xdf, 0x0f, 0x00, 0xe5, 0xdf, + 0x0f, 0x00, 0xe8, 0xdf, 0x0f, 0x00, 0xeb, 0xdf, 0x0f, 0x00, 0xec, 0xdf, + 0x0f, 0x00, 0xee, 0xdf, 0x0f, 0x00, 0xef, 0xdf, 0x0f, 0x00, 0xf4, 0xdf, + 0x0f, 0x00, 0xf5, 0xdf, 0x0f, 0x00, 0xf8, 0xdf, 0x0f, 0x00, 0xfc, 0xdf, + 0x0f, 0x00, 0xfe, 0xdf, 0x0f, 0x00, 0xff, 0xdf, 0x0f, 0x00, 0x86, 0xe4, + 0x0f, 0x00, 0x87, 0xe4, 0x0f, 0x00, 0x89, 0xe4, 0x0f, 0x00, 0x8a, 0xe4, + 0x0f, 0x00, 0xb2, 0xe4, 0x0f, 0x00, 0xb4, 0xe4, 0x0f, 0x00, 0xb5, 0xe4, + 0x0f, 0x00, 0xb6, 0xe4, 0x0f, 0x00, 0xb7, 0xe4, 0x0f, 0x00, 0xb8, 0xe4, + 0x0f, 0x00, 0xba, 0xe4, 0x0f, 0x00, 0xbc, 0xe4, 0x0f, 0x00, 0xbe, 0xe4, + 0x0f, 0x00, 0xbf, 0xe4, 0x0f, 0x00, 0xb7, 0xe6, 0x0f, 0x00, 0x83, 0xe7, + 0x0f, 0x00, 0x84, 0xe7, 0x0f, 0x00, 0x85, 0xe7, 0x0f, 0x00, 0x86, 0xe7, + 0x0f, 0x00, 0x87, 0xe7, 0x0f, 0x00, 0x89, 0xe7, 0x0f, 0x00, 0x8a, 0xe7, + 0x0f, 0x00, 0x8d, 0xe7, 0x0f, 0x00, 0xc3, 0xe7, 0x0f, 0x00, 0xc4, 0xe7, + 0x0f, 0x00, 0xc5, 0xe7, 0x0f, 0x00, 0xc6, 0xe7, 0x0f, 0x00, 0xc7, 0xe7, + 0x0f, 0x00, 0xc8, 0xe7, 0x0f, 0x00, 0xcb, 0xe7, 0x0f, 0x00, 0xcc, 0xe7, + 0x0f, 0x00, 0xce, 0xe7, 0x0f, 0x00, 0xcf, 0xe7, 0x0f, 0x00, 0xe0, 0xe7, + 0x0f, 0x00, 0xe1, 0xe7, 0x0f, 0x00, 0xe2, 0xe7, 0x0f, 0x00, 0xe4, 0xe7, + 0x0f, 0x00, 0xe5, 0xe7, 0x0f, 0x00, 0xe6, 0xe7, 0x0f, 0x00, 0xe7, 0xe7, + 0x0f, 0x00, 0xe8, 0xe7, 0x0f, 0x00, 0xeb, 0xe7, 0x0f, 0x00, 0xec, 0xe7, + 0x0f, 0x00, 0xee, 0xe7, 0x0f, 0x00, 0xef, 0xe7, 0x0f, 0x00, 0xf2, 0xe7, + 0x0f, 0x00, 0xf4, 0xe7, 0x0f, 0x00, 0xf5, 0xe7, 0x0f, 0x00, 0xf6, 0xe7, + 0x0f, 0x00, 0xf7, 0xe7, 0x0f, 0x00, 0xf8, 0xe7, 0x0f, 0x00, 0xfa, 0xe7, + 0x0f, 0x00, 0xfc, 0xe7, 0x0f, 0x00, 0xfe, 0xe7, 0x0f, 0x00, 0xff, 0xe7, + 0x0f, 0x00, 0xf2, 0xeb, 0x0f, 0x00, 0xf4, 0xeb, 0x0f, 0x00, 0xf5, 0xeb, + 0x0f, 0x00, 0xf6, 0xeb, 0x0f, 0x00, 0xf7, 0xeb, 0x0f, 0x00, 0xf8, 0xeb, + 0x0f, 0x00, 0xfa, 0xeb, 0x0f, 0x00, 0xfc, 0xeb, 0x0f, 0x00, 0xfe, 0xeb, + 0x0f, 0x00, 0xff, 0xeb, 0x0f, 0x00, 0x74, 0xf2, 0x0f, 0x00, 0x75, 0xf2, + 0x0f, 0x00, 0x78, 0xf2, 0x0f, 0x00, 0x7c, 0xf2, 0x0f, 0x00, 0x7e, 0xf2, + 0x0f, 0x00, 0x7f, 0xf2, 0x0f, 0x00, 0x78, 0xf3, 0x0f, 0x00, 0x7c, 0xf3, + 0x0f, 0x00, 0x7e, 0xf3, 0x0f, 0x00, 0x7f, 0xf3, 0x0f, 0x00, 0xf2, 0xf3, + 0x0f, 0x00, 0xf4, 0xf3, 0x0f, 0x00, 0xf5, 0xf3, 0x0f, 0x00, 0xf6, 0xf3, + 0x0f, 0x00, 0xf7, 0xf3, 0x0f, 0x00, 0xf8, 0xf3, 0x0f, 0x00, 0xfa, 0xf3, + 0x0f, 0x00, 0xfc, 0xf3, 0x0f, 0x00, 0xfe, 0xf3, 0x0f, 0x00, 0xff, 0xf3, + 0x0f, 0x00, 0x86, 0xf8, 0x0f, 0x00, 0x0b, 0xf9, 0x0f, 0x00, 0xf2, 0xfb, + 0x0f, 0x00, 0xf4, 0xfb, 0x0f, 0x00, 0xf5, 0xfb, 0x0f, 0x00, 0xf6, 0xfb, + 0x0f, 0x00, 0xf7, 0xfb, 0x0f, 0x00, 0xf8, 0xfb, 0x0f, 0x00, 0xfa, 0xfb, + 0x0f, 0x00, 0xfc, 0xfb, 0x0f, 0x00, 0xfe, 0xfb, 0x0f, 0x00, 0xff, 0xfb, + 0x0f, 0x00, 0x88, 0xfc, 0x0f, 0x00, 0x8b, 0xfc, 0x0f, 0x00, 0x90, 0xfc, + 0x0f, 0x00, 0x91, 0xfc, 0x0f, 0x00, 0x96, 0xfc, 0x0f, 0x00, 0x97, 0xfc, + 0x0f, 0x00, 0x99, 0xfc, 0x0f, 0x00, 0x9d, 0xfc, 0x0f, 0x00, 0xb3, 0xfc, + 0x0f, 0x00, 0xbb, 0xfc, 0x0f, 0x00, 0x64, 0xfe, 0x0f, 0x00, 0x65, 0xfe, + 0x0f, 0x00, 0x68, 0xfe, 0x0f, 0x00, 0x6b, 0xfe, 0x0f, 0x00, 0x6c, 0xfe, + 0x0f, 0x00, 0x6e, 0xfe, 0x0f, 0x00, 0x6f, 0xfe, 0x0f, 0x00, 0x74, 0xfe, + 0x0f, 0x00, 0x75, 0xfe, 0x0f, 0x00, 0x78, 0xfe, 0x0f, 0x00, 0x7c, 0xfe, + 0x0f, 0x00, 0x7e, 0xfe, 0x0f, 0x00, 0x7f, 0xfe, 0x0f, 0x00, 0x8b, 0xfe, + 0x0f, 0x00, 0x68, 0xff, 0x0f, 0x00, 0x6b, 0xff, 0x0f, 0x00, 0x78, 0xff, + 0x0f, 0x00, 0x7c, 0xff, 0x0f, 0x00, 0x7e, 0xff, 0x0f, 0x00, 0x7f, 0xff, + 0x0f, 0x00, 0x88, 0xff, 0x0f, 0x00, 0x8b, 0xff, 0x0f, 0x00, 0x8c, 0xff, + 0x0f, 0x00, 0x8e, 0xff, 0x0f, 0x00, 0x8f, 0xff, 0x0f, 0x00, 0xc3, 0xff, + 0x0f, 0x00, 0xc4, 0xff, 0x0f, 0x00, 0xc5, 0xff, 0x0f, 0x00, 0xc6, 0xff, + 0x0f, 0x00, 0xc7, 0xff, 0x0f, 0x00, 0xc8, 0xff, 0x0f, 0x00, 0xcb, 0xff, + 0x0f, 0x00, 0xcc, 0xff, 0x0f, 0x00, 0xce, 0xff, 0x0f, 0x00, 0xcf, 0xff, + 0x0f, 0x00, 0xe0, 0xff, 0x0f, 0x00, 0xe1, 0xff, 0x0f, 0x00, 0xe2, 0xff, + 0x0f, 0x00, 0xe4, 0xff, 0x0f, 0x00, 0xe5, 0xff, 0x0f, 0x00, 0xe6, 0xff, + 0x0f, 0x00, 0xe7, 0xff, 0x0f, 0x00, 0xe8, 0xff, 0x0f, 0x00, 0xeb, 0xff, + 0x0f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xee, 0xff, 0x0f, 0x00, 0xef, 0xff, + 0x0f, 0x00, 0xf2, 0xff, 0x0f, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0xf5, 0xff, + 0x0f, 0x00, 0xf6, 0xff, 0x0f, 0x00, 0xf7, 0xff, 0x0f, 0x00, 0xf8, 0xff, + 0x0f, 0x00, 0xfa, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0xfe, 0xff, + 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xf8, 0x00, 0x10, 0x00, 0xfc, 0x00, + 0x10, 0x00, 0xfe, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x00, 0xf8, 0x05, + 0x10, 0x00, 0xfc, 0x05, 0x10, 0x00, 0xfe, 0x05, 0x10, 0x00, 0xff, 0x05, + 0x10, 0x00, 0xcb, 0x09, 0x10, 0x00, 0xeb, 0x09, 0x10, 0x00, 0x4b, 0x0a, + 0x10, 0x00, 0x8b, 0x0b, 0x10, 0x00, 0xcb, 0x0d, 0x10, 0x00, 0xeb, 0x0d, + 0x10, 0x00, 0xcb, 0x15, 0x10, 0x00, 0xeb, 0x15, 0x10, 0x00, 0xeb, 0x1b, + 0x10, 0x00, 0xcb, 0x22, 0x10, 0x00, 0xeb, 0x22, 0x10, 0x00, 0xeb, 0x23, + 0x10, 0x00, 0xcb, 0x29, 0x10, 0x00, 0xeb, 0x29, 0x10, 0x00, 0xf8, 0x29, + 0x10, 0x00, 0xfc, 0x29, 0x10, 0x00, 0xfe, 0x29, 0x10, 0x00, 0xff, 0x29, + 0x10, 0x00, 0xcb, 0x2d, 0x10, 0x00, 0xeb, 0x2d, 0x10, 0x00, 0x30, 0x33, + 0x10, 0x00, 0xf0, 0x33, 0x10, 0x00, 0xf1, 0x33, 0x10, 0x00, 0xf7, 0x33, + 0x10, 0x00, 0xf9, 0x33, 0x10, 0x00, 0xfd, 0x33, 0x10, 0x00, 0x30, 0x3f, + 0x10, 0x00, 0xcb, 0x41, 0x10, 0x00, 0xeb, 0x41, 0x10, 0x00, 0xf0, 0x41, + 0x10, 0x00, 0xf1, 0x41, 0x10, 0x00, 0xf9, 0x41, 0x10, 0x00, 0xfd, 0x41, + 0x10, 0x00, 0x8b, 0x42, 0x10, 0x00, 0xeb, 0x43, 0x10, 0x00, 0xf0, 0x43, + 0x10, 0x00, 0xf1, 0x43, 0x10, 0x00, 0xf9, 0x43, 0x10, 0x00, 0xfd, 0x43, + 0x10, 0x00, 0xb0, 0x44, 0x10, 0x00, 0xf7, 0x45, 0x10, 0x00, 0xf8, 0x45, + 0x10, 0x00, 0xfc, 0x45, 0x10, 0x00, 0xfe, 0x45, 0x10, 0x00, 0xff, 0x45, + 0x10, 0x00, 0xb0, 0x46, 0x10, 0x00, 0xb0, 0x47, 0x10, 0x00, 0x4b, 0x4a, + 0x10, 0x00, 0x8b, 0x4b, 0x10, 0x00, 0x8b, 0x4f, 0x10, 0x00, 0xcb, 0x4f, + 0x10, 0x00, 0xeb, 0x4f, 0x10, 0x00, 0xf0, 0x4f, 0x10, 0x00, 0xf1, 0x4f, + 0x10, 0x00, 0xf7, 0x4f, 0x10, 0x00, 0xf9, 0x4f, 0x10, 0x00, 0xfd, 0x4f, + 0x10, 0x00, 0x8b, 0x55, 0x10, 0x00, 0xcb, 0x55, 0x10, 0x00, 0xeb, 0x55, + 0x10, 0x00, 0xf7, 0x5f, 0x10, 0x00, 0xf8, 0x5f, 0x10, 0x00, 0xfc, 0x5f, + 0x10, 0x00, 0xfe, 0x5f, 0x10, 0x00, 0xff, 0x5f, 0x10, 0x00, 0x4b, 0x64, + 0x10, 0x00, 0xeb, 0x64, 0x10, 0x00, 0xeb, 0x66, 0x10, 0x00, 0x4b, 0x67, + 0x10, 0x00, 0x8b, 0x6a, 0x10, 0x00, 0xcb, 0x6a, 0x10, 0x00, 0xeb, 0x6a, + 0x10, 0x00, 0xf8, 0x6a, 0x10, 0x00, 0xfc, 0x6a, 0x10, 0x00, 0xfe, 0x6a, + 0x10, 0x00, 0xff, 0x6a, 0x10, 0x00, 0xeb, 0x78, 0x10, 0x00, 0x5b, 0x7c, + 0x10, 0x00, 0xf8, 0x7c, 0x10, 0x00, 0xfc, 0x7c, 0x10, 0x00, 0xfe, 0x7c, + 0x10, 0x00, 0xff, 0x7c, 0x10, 0x00, 0xf7, 0x81, 0x10, 0x00, 0xf1, 0x82, + 0x10, 0x00, 0xf9, 0x82, 0x10, 0x00, 0xf7, 0x83, 0x10, 0x00, 0xf7, 0x84, + 0x10, 0x00, 0xf8, 0x84, 0x10, 0x00, 0xfc, 0x84, 0x10, 0x00, 0xfe, 0x84, + 0x10, 0x00, 0xff, 0x84, 0x10, 0x00, 0xf7, 0x86, 0x10, 0x00, 0xf8, 0x86, + 0x10, 0x00, 0xfc, 0x86, 0x10, 0x00, 0xfe, 0x86, 0x10, 0x00, 0xff, 0x86, + 0x10, 0x00, 0xf7, 0x87, 0x10, 0x00, 0x8b, 0x8e, 0x10, 0x00, 0xbb, 0x8e, + 0x10, 0x00, 0xeb, 0xa4, 0x10, 0x00, 0xf8, 0xa4, 0x10, 0x00, 0xfc, 0xa4, + 0x10, 0x00, 0xfe, 0xa4, 0x10, 0x00, 0xff, 0xa4, 0x10, 0x00, 0xeb, 0xa6, + 0x10, 0x00, 0x4b, 0xa7, 0x10, 0x00, 0xf1, 0xb7, 0x10, 0x00, 0xf7, 0xb7, + 0x10, 0x00, 0xf9, 0xb7, 0x10, 0x00, 0xf0, 0xb8, 0x10, 0x00, 0xf1, 0xb8, + 0x10, 0x00, 0xf7, 0xb8, 0x10, 0x00, 0xf9, 0xb8, 0x10, 0x00, 0xfd, 0xb8, + 0x10, 0x00, 0xbb, 0xb9, 0x10, 0x00, 0xf0, 0xbc, 0x10, 0x00, 0xf1, 0xbc, + 0x10, 0x00, 0xf7, 0xbc, 0x10, 0x00, 0xf9, 0xbc, 0x10, 0x00, 0xfd, 0xbc, + 0x10, 0x00, 0xbb, 0xbd, 0x10, 0x00, 0xf1, 0xbf, 0x10, 0x00, 0xf7, 0xbf, + 0x10, 0x00, 0xf9, 0xbf, 0x10, 0x00, 0xf6, 0xc5, 0x10, 0x00, 0xf7, 0xc5, + 0x10, 0x00, 0xf8, 0xc5, 0x10, 0x00, 0xfc, 0xc5, 0x10, 0x00, 0xfe, 0xc5, + 0x10, 0x00, 0xff, 0xc5, 0x10, 0x00, 0xf0, 0xcc, 0x10, 0x00, 0xf1, 0xcc, + 0x10, 0x00, 0xf9, 0xcc, 0x10, 0x00, 0xfd, 0xcc, 0x10, 0x00, 0x51, 0xce, + 0x10, 0x00, 0x56, 0xce, 0x10, 0x00, 0x57, 0xce, 0x10, 0x00, 0x58, 0xce, + 0x10, 0x00, 0x5c, 0xce, 0x10, 0x00, 0x5e, 0xce, 0x10, 0x00, 0x5f, 0xce, + 0x10, 0x00, 0xf0, 0xce, 0x10, 0x00, 0xf1, 0xce, 0x10, 0x00, 0xf9, 0xce, + 0x10, 0x00, 0xfd, 0xce, 0x10, 0x00, 0x51, 0xcf, 0x10, 0x00, 0x56, 0xcf, + 0x10, 0x00, 0x57, 0xcf, 0x10, 0x00, 0x58, 0xcf, 0x10, 0x00, 0x5c, 0xcf, + 0x10, 0x00, 0x5e, 0xcf, 0x10, 0x00, 0x5f, 0xcf, 0x10, 0x00, 0xf0, 0xcf, + 0x10, 0x00, 0xf1, 0xcf, 0x10, 0x00, 0xf9, 0xcf, 0x10, 0x00, 0xfd, 0xcf, + 0x10, 0x00, 0xe8, 0xd3, 0x10, 0x00, 0xeb, 0xd3, 0x10, 0x00, 0xf8, 0xd9, + 0x10, 0x00, 0xfc, 0xd9, 0x10, 0x00, 0xfe, 0xd9, 0x10, 0x00, 0xff, 0xd9, + 0x10, 0x00, 0xf8, 0xdd, 0x10, 0x00, 0xfc, 0xdd, 0x10, 0x00, 0xfe, 0xdd, + 0x10, 0x00, 0xff, 0xdd, 0x10, 0x00, 0x30, 0xe5, 0x10, 0x00, 0x8b, 0xe5, + 0x10, 0x00, 0xcb, 0xe5, 0x10, 0x00, 0xeb, 0xe5, 0x10, 0x00, 0xf0, 0xe5, + 0x10, 0x00, 0x30, 0xec, 0x10, 0x00, 0xf0, 0xec, 0x10, 0x00, 0xf1, 0xec, + 0x10, 0x00, 0xf9, 0xec, 0x10, 0x00, 0xfd, 0xec, 0x10, 0x00, 0xe6, 0xee, + 0x10, 0x00, 0xf6, 0xee, 0x10, 0x00, 0xf7, 0xee, 0x10, 0x00, 0xf8, 0xee, + 0x10, 0x00, 0xfc, 0xee, 0x10, 0x00, 0xfe, 0xee, 0x10, 0x00, 0xff, 0xee, + 0x10, 0x00, 0xf0, 0xef, 0x10, 0x00, 0xf1, 0xef, 0x10, 0x00, 0xf9, 0xef, + 0x10, 0x00, 0xfd, 0xef, 0x10, 0x00, 0x30, 0xf3, 0x10, 0x00, 0xe6, 0xf3, + 0x10, 0x00, 0xf0, 0xf3, 0x10, 0x00, 0x30, 0xf9, 0x10, 0x00, 0x8b, 0xf9, + 0x10, 0x00, 0xcb, 0xf9, 0x10, 0x00, 0xeb, 0xf9, 0x10, 0x00, 0xf7, 0xf9, + 0x10, 0x00, 0xf8, 0xf9, 0x10, 0x00, 0xfc, 0xf9, 0x10, 0x00, 0xfe, 0xf9, + 0x10, 0x00, 0xff, 0xf9, 0x10, 0x00, 0x30, 0xfd, 0x10, 0x00, 0x8b, 0xfd, + 0x10, 0x00, 0xcb, 0xfd, 0x10, 0x00, 0xeb, 0xfd, 0x10, 0x00, 0xf0, 0xfd, + 0x10, 0x00, 0x30, 0xff, 0x10, 0x00, 0x58, 0x00, 0x11, 0x00, 0xf3, 0x00, + 0x11, 0x00, 0xfb, 0x00, 0x11, 0x00, 0xf3, 0x01, 0x11, 0x00, 0xfb, 0x01, + 0x11, 0x00, 0x58, 0x02, 0x11, 0x00, 0xf3, 0x02, 0x11, 0x00, 0xfb, 0x02, + 0x11, 0x00, 0x58, 0x05, 0x11, 0x00, 0x5c, 0x05, 0x11, 0x00, 0x5e, 0x05, + 0x11, 0x00, 0x5f, 0x05, 0x11, 0x00, 0x88, 0x06, 0x11, 0x00, 0x8b, 0x06, + 0x11, 0x00, 0xf4, 0x07, 0x11, 0x00, 0xf5, 0x07, 0x11, 0x00, 0xf8, 0x07, + 0x11, 0x00, 0xfc, 0x07, 0x11, 0x00, 0xfe, 0x07, 0x11, 0x00, 0xff, 0x07, + 0x11, 0x00, 0xf8, 0x0a, 0x11, 0x00, 0xfc, 0x0a, 0x11, 0x00, 0xfe, 0x0a, + 0x11, 0x00, 0xff, 0x0a, 0x11, 0x00, 0xf3, 0x0f, 0x11, 0x00, 0xfb, 0x0f, + 0x11, 0x00, 0xf4, 0x11, 0x11, 0x00, 0xf5, 0x11, 0x11, 0x00, 0xf8, 0x11, + 0x11, 0x00, 0xfc, 0x11, 0x11, 0x00, 0xfe, 0x11, 0x11, 0x00, 0xff, 0x11, + 0x11, 0x00, 0x58, 0x16, 0x11, 0x00, 0xf3, 0x17, 0x11, 0x00, 0xfb, 0x17, + 0x11, 0x00, 0xf4, 0x1f, 0x11, 0x00, 0xf5, 0x1f, 0x11, 0x00, 0xf8, 0x1f, + 0x11, 0x00, 0xfc, 0x1f, 0x11, 0x00, 0xfe, 0x1f, 0x11, 0x00, 0xff, 0x1f, + 0x11, 0x00, 0xc8, 0x29, 0x11, 0x00, 0xcb, 0x29, 0x11, 0x00, 0xe8, 0x29, + 0x11, 0x00, 0xeb, 0x29, 0x11, 0x00, 0xf8, 0x29, 0x11, 0x00, 0xfc, 0x29, + 0x11, 0x00, 0xfe, 0x29, 0x11, 0x00, 0xff, 0x29, 0x11, 0x00, 0xc8, 0x2d, + 0x11, 0x00, 0xcb, 0x2d, 0x11, 0x00, 0xe8, 0x2d, 0x11, 0x00, 0xeb, 0x2d, + 0x11, 0x00, 0x30, 0x33, 0x11, 0x00, 0xf0, 0x33, 0x11, 0x00, 0xf1, 0x33, + 0x11, 0x00, 0xf9, 0x33, 0x11, 0x00, 0xfd, 0x33, 0x11, 0x00, 0x30, 0x39, + 0x11, 0x00, 0x8b, 0x39, 0x11, 0x00, 0x30, 0x3d, 0x11, 0x00, 0x8b, 0x3d, + 0x11, 0x00, 0x30, 0x3f, 0x11, 0x00, 0xf0, 0x3f, 0x11, 0x00, 0xf1, 0x3f, + 0x11, 0x00, 0xf9, 0x3f, 0x11, 0x00, 0xfd, 0x3f, 0x11, 0x00, 0xb0, 0x40, + 0x11, 0x00, 0x30, 0x41, 0x11, 0x00, 0x51, 0x41, 0x11, 0x00, 0x56, 0x41, + 0x11, 0x00, 0x57, 0x41, 0x11, 0x00, 0x59, 0x41, 0x11, 0x00, 0x5d, 0x41, + 0x11, 0x00, 0x30, 0x42, 0x11, 0x00, 0xe6, 0x43, 0x11, 0x00, 0xf6, 0x43, + 0x11, 0x00, 0xf7, 0x43, 0x11, 0x00, 0xf8, 0x43, 0x11, 0x00, 0xfc, 0x43, + 0x11, 0x00, 0xfe, 0x43, 0x11, 0x00, 0xff, 0x43, 0x11, 0x00, 0xf6, 0x45, + 0x11, 0x00, 0xf7, 0x45, 0x11, 0x00, 0xf8, 0x45, 0x11, 0x00, 0xfc, 0x45, + 0x11, 0x00, 0xfe, 0x45, 0x11, 0x00, 0xff, 0x45, 0x11, 0x00, 0x86, 0x48, + 0x11, 0x00, 0xb0, 0x48, 0x11, 0x00, 0x51, 0x49, 0x11, 0x00, 0x56, 0x49, + 0x11, 0x00, 0x57, 0x49, 0x11, 0x00, 0x58, 0x49, 0x11, 0x00, 0x5c, 0x49, + 0x11, 0x00, 0x5e, 0x49, 0x11, 0x00, 0x5f, 0x49, 0x11, 0x00, 0x51, 0x4e, + 0x11, 0x00, 0x56, 0x4e, 0x11, 0x00, 0x57, 0x4e, 0x11, 0x00, 0x58, 0x4e, + 0x11, 0x00, 0x5c, 0x4e, 0x11, 0x00, 0x5e, 0x4e, 0x11, 0x00, 0x5f, 0x4e, + 0x11, 0x00, 0x51, 0x4f, 0x11, 0x00, 0x56, 0x4f, 0x11, 0x00, 0x57, 0x4f, + 0x11, 0x00, 0x58, 0x4f, 0x11, 0x00, 0x5c, 0x4f, 0x11, 0x00, 0x5e, 0x4f, + 0x11, 0x00, 0x5f, 0x4f, 0x11, 0x00, 0xf0, 0x4f, 0x11, 0x00, 0xf1, 0x4f, + 0x11, 0x00, 0xf9, 0x4f, 0x11, 0x00, 0xfd, 0x4f, 0x11, 0x00, 0x48, 0x52, + 0x11, 0x00, 0x4b, 0x52, 0x11, 0x00, 0x30, 0x53, 0x11, 0x00, 0xf0, 0x53, + 0x11, 0x00, 0xf1, 0x53, 0x11, 0x00, 0xf9, 0x53, 0x11, 0x00, 0xfd, 0x53, + 0x11, 0x00, 0xf7, 0x55, 0x11, 0x00, 0xf8, 0x55, 0x11, 0x00, 0xfc, 0x55, + 0x11, 0x00, 0xfe, 0x55, 0x11, 0x00, 0xff, 0x55, 0x11, 0x00, 0x48, 0x5e, + 0x11, 0x00, 0x4b, 0x5e, 0x11, 0x00, 0x30, 0x5f, 0x11, 0x00, 0xf0, 0x5f, + 0x11, 0x00, 0xf1, 0x5f, 0x11, 0x00, 0xf9, 0x5f, 0x11, 0x00, 0xfd, 0x5f, + 0x11, 0x00, 0x58, 0x69, 0x11, 0x00, 0xc8, 0x6a, 0x11, 0x00, 0xcb, 0x6a, + 0x11, 0x00, 0xe8, 0x6a, 0x11, 0x00, 0xeb, 0x6a, 0x11, 0x00, 0xf8, 0x6a, + 0x11, 0x00, 0xfc, 0x6a, 0x11, 0x00, 0xfe, 0x6a, 0x11, 0x00, 0xff, 0x6a, + 0x11, 0x00, 0xf4, 0x6f, 0x11, 0x00, 0xf5, 0x6f, 0x11, 0x00, 0xf8, 0x6f, + 0x11, 0x00, 0xfc, 0x6f, 0x11, 0x00, 0xfe, 0x6f, 0x11, 0x00, 0xff, 0x6f, + 0x11, 0x00, 0xcb, 0x72, 0x11, 0x00, 0xeb, 0x72, 0x11, 0x00, 0xf8, 0x72, + 0x11, 0x00, 0xfc, 0x72, 0x11, 0x00, 0xfe, 0x72, 0x11, 0x00, 0xff, 0x72, + 0x11, 0x00, 0x58, 0x76, 0x11, 0x00, 0xf3, 0x77, 0x11, 0x00, 0xfb, 0x77, + 0x11, 0x00, 0xe8, 0x7c, 0x11, 0x00, 0xeb, 0x7c, 0x11, 0x00, 0xf8, 0x7c, + 0x11, 0x00, 0xfc, 0x7c, 0x11, 0x00, 0xfe, 0x7c, 0x11, 0x00, 0xff, 0x7c, + 0x11, 0x00, 0xeb, 0x7e, 0x11, 0x00, 0xf8, 0x7e, 0x11, 0x00, 0xfc, 0x7e, + 0x11, 0x00, 0xfe, 0x7e, 0x11, 0x00, 0xff, 0x7e, 0x11, 0x00, 0xb7, 0x80, + 0x11, 0x00, 0xf7, 0x83, 0x11, 0x00, 0x8b, 0x84, 0x11, 0x00, 0xb1, 0x84, + 0x11, 0x00, 0xb9, 0x84, 0x11, 0x00, 0x31, 0x85, 0x11, 0x00, 0x39, 0x85, + 0x11, 0x00, 0x37, 0x86, 0x11, 0x00, 0x38, 0x86, 0x11, 0x00, 0x3c, 0x86, + 0x11, 0x00, 0x3e, 0x86, 0x11, 0x00, 0x3f, 0x86, 0x11, 0x00, 0x8b, 0x86, + 0x11, 0x00, 0xb1, 0x86, 0x11, 0x00, 0xb9, 0x86, 0x11, 0x00, 0x37, 0x87, + 0x11, 0x00, 0xb1, 0x87, 0x11, 0x00, 0xb9, 0x87, 0x11, 0x00, 0xf1, 0x87, + 0x11, 0x00, 0xf9, 0x87, 0x11, 0x00, 0x38, 0x9e, 0x11, 0x00, 0x3c, 0x9e, + 0x11, 0x00, 0x3e, 0x9e, 0x11, 0x00, 0x3f, 0x9e, 0x11, 0x00, 0x8b, 0xa0, + 0x11, 0x00, 0xeb, 0xa5, 0x11, 0x00, 0x8b, 0xa7, 0x11, 0x00, 0x8b, 0xa8, + 0x11, 0x00, 0xf8, 0xab, 0x11, 0x00, 0xfc, 0xab, 0x11, 0x00, 0xfe, 0xab, + 0x11, 0x00, 0xff, 0xab, 0x11, 0x00, 0xcb, 0xaf, 0x11, 0x00, 0xeb, 0xaf, + 0x11, 0x00, 0xf8, 0xaf, 0x11, 0x00, 0xfc, 0xaf, 0x11, 0x00, 0xfe, 0xaf, + 0x11, 0x00, 0xff, 0xaf, 0x11, 0x00, 0xeb, 0xb1, 0x11, 0x00, 0x8b, 0xb3, + 0x11, 0x00, 0xeb, 0xbd, 0x11, 0x00, 0xf7, 0xc5, 0x11, 0x00, 0xf1, 0xe9, + 0x11, 0x00, 0xf9, 0xe9, 0x11, 0x00, 0xf1, 0xed, 0x11, 0x00, 0xf9, 0xed, + 0x11, 0x00, 0xb8, 0x08, 0x12, 0x00, 0xbc, 0x08, 0x12, 0x00, 0xbe, 0x08, + 0x12, 0x00, 0xbf, 0x08, 0x12, 0x00, 0xb8, 0x0a, 0x12, 0x00, 0xbc, 0x0a, + 0x12, 0x00, 0xbe, 0x0a, 0x12, 0x00, 0xbf, 0x0a, 0x12, 0x00, 0xe8, 0x0b, + 0x12, 0x00, 0xeb, 0x0b, 0x12, 0x00, 0xf8, 0x0b, 0x12, 0x00, 0xfc, 0x0b, + 0x12, 0x00, 0xfe, 0x0b, 0x12, 0x00, 0xff, 0x0b, 0x12, 0x00, 0xcb, 0x0d, + 0x12, 0x00, 0xeb, 0x0d, 0x12, 0x00, 0xf8, 0x0d, 0x12, 0x00, 0xfc, 0x0d, + 0x12, 0x00, 0xfe, 0x0d, 0x12, 0x00, 0xff, 0x0d, 0x12, 0x00, 0x88, 0x14, + 0x12, 0x00, 0x8b, 0x14, 0x12, 0x00, 0xcb, 0x15, 0x12, 0x00, 0xeb, 0x15, + 0x12, 0x00, 0x8b, 0x16, 0x12, 0x00, 0x88, 0x1b, 0x12, 0x00, 0x8b, 0x1b, + 0x12, 0x00, 0xc8, 0x1f, 0x12, 0x00, 0xcb, 0x1f, 0x12, 0x00, 0xe8, 0x1f, + 0x12, 0x00, 0xeb, 0x1f, 0x12, 0x00, 0xf8, 0x1f, 0x12, 0x00, 0xfc, 0x1f, + 0x12, 0x00, 0xfe, 0x1f, 0x12, 0x00, 0xff, 0x1f, 0x12, 0x00, 0xe8, 0x23, + 0x12, 0x00, 0xeb, 0x23, 0x12, 0x00, 0xf8, 0x23, 0x12, 0x00, 0xfc, 0x23, + 0x12, 0x00, 0xfe, 0x23, 0x12, 0x00, 0xff, 0x23, 0x12, 0x00, 0xc8, 0x29, + 0x12, 0x00, 0xcb, 0x29, 0x12, 0x00, 0xe8, 0x29, 0x12, 0x00, 0xeb, 0x29, + 0x12, 0x00, 0xf8, 0x29, 0x12, 0x00, 0xfc, 0x29, 0x12, 0x00, 0xfe, 0x29, + 0x12, 0x00, 0xff, 0x29, 0x12, 0x00, 0xf8, 0x2d, 0x12, 0x00, 0xfc, 0x2d, + 0x12, 0x00, 0xfe, 0x2d, 0x12, 0x00, 0xff, 0x2d, 0x12, 0x00, 0x88, 0x3f, + 0x12, 0x00, 0x8b, 0x3f, 0x12, 0x00, 0xc6, 0x3f, 0x12, 0x00, 0xc7, 0x3f, + 0x12, 0x00, 0xc8, 0x3f, 0x12, 0x00, 0xcb, 0x3f, 0x12, 0x00, 0xe6, 0x3f, + 0x12, 0x00, 0xe7, 0x3f, 0x12, 0x00, 0xe8, 0x3f, 0x12, 0x00, 0xeb, 0x3f, + 0x12, 0x00, 0xf6, 0x3f, 0x12, 0x00, 0xf7, 0x3f, 0x12, 0x00, 0xf8, 0x3f, + 0x12, 0x00, 0xfc, 0x3f, 0x12, 0x00, 0xfe, 0x3f, 0x12, 0x00, 0xff, 0x3f, + 0x12, 0x00, 0x8b, 0x47, 0x12, 0x00, 0xf0, 0x47, 0x12, 0x00, 0xf1, 0x47, + 0x12, 0x00, 0xf9, 0x47, 0x12, 0x00, 0xfd, 0x47, 0x12, 0x00, 0xb8, 0x52, + 0x12, 0x00, 0xbc, 0x52, 0x12, 0x00, 0xbe, 0x52, 0x12, 0x00, 0xbf, 0x52, + 0x12, 0x00, 0xeb, 0x53, 0x12, 0x00, 0xf7, 0x53, 0x12, 0x00, 0xf8, 0x53, + 0x12, 0x00, 0xfc, 0x53, 0x12, 0x00, 0xfe, 0x53, 0x12, 0x00, 0xff, 0x53, + 0x12, 0x00, 0xf0, 0x59, 0x12, 0x00, 0xf1, 0x59, 0x12, 0x00, 0xf9, 0x59, + 0x12, 0x00, 0xfd, 0x59, 0x12, 0x00, 0xb8, 0x5c, 0x12, 0x00, 0xbc, 0x5c, + 0x12, 0x00, 0xbe, 0x5c, 0x12, 0x00, 0xbf, 0x5c, 0x12, 0x00, 0xf7, 0x5d, + 0x12, 0x00, 0xf8, 0x5d, 0x12, 0x00, 0xfc, 0x5d, 0x12, 0x00, 0xfe, 0x5d, + 0x12, 0x00, 0xff, 0x5d, 0x12, 0x00, 0xb8, 0x5e, 0x12, 0x00, 0xbc, 0x5e, + 0x12, 0x00, 0xbe, 0x5e, 0x12, 0x00, 0xbf, 0x5e, 0x12, 0x00, 0xf1, 0x81, + 0x12, 0x00, 0xf9, 0x81, 0x12, 0x00, 0xf7, 0x85, 0x12, 0x00, 0xb1, 0x88, + 0x12, 0x00, 0xb7, 0x88, 0x12, 0x00, 0xb9, 0x88, 0x12, 0x00, 0x8b, 0x8a, + 0x12, 0x00, 0xf1, 0x8b, 0x12, 0x00, 0xf7, 0x8b, 0x12, 0x00, 0xf9, 0x8b, + 0x12, 0x00, 0x88, 0xc2, 0x12, 0x00, 0x8b, 0xc2, 0x12, 0x00, 0xe6, 0xc3, + 0x12, 0x00, 0xe7, 0xc3, 0x12, 0x00, 0xe8, 0xc3, 0x12, 0x00, 0xeb, 0xc3, + 0x12, 0x00, 0xf6, 0xc3, 0x12, 0x00, 0xf7, 0xc3, 0x12, 0x00, 0xf8, 0xc3, + 0x12, 0x00, 0xfc, 0xc3, 0x12, 0x00, 0xfe, 0xc3, 0x12, 0x00, 0xff, 0xc3, + 0x12, 0x00, 0x88, 0xc5, 0x12, 0x00, 0x8b, 0xc5, 0x12, 0x00, 0xf0, 0xc9, + 0x12, 0x00, 0xf1, 0xc9, 0x12, 0x00, 0xf9, 0xc9, 0x12, 0x00, 0xfd, 0xc9, + 0x12, 0x00, 0x8b, 0xcd, 0x12, 0x00, 0xcb, 0xcd, 0x12, 0x00, 0xeb, 0xcd, + 0x12, 0x00, 0xf0, 0xcd, 0x12, 0x00, 0xf1, 0xcd, 0x12, 0x00, 0xf9, 0xcd, + 0x12, 0x00, 0xfd, 0xcd, 0x12, 0x00, 0xeb, 0xd5, 0x12, 0x00, 0xf8, 0xd5, + 0x12, 0x00, 0xfc, 0xd5, 0x12, 0x00, 0xfe, 0xd5, 0x12, 0x00, 0xff, 0xd5, + 0x12, 0x00, 0xe8, 0xdf, 0x12, 0x00, 0xeb, 0xdf, 0x12, 0x00, 0xf8, 0xdf, + 0x12, 0x00, 0xfc, 0xdf, 0x12, 0x00, 0xfe, 0xdf, 0x12, 0x00, 0xff, 0xdf, + 0x12, 0x00, 0xf0, 0xe3, 0x12, 0x00, 0xf1, 0xe3, 0x12, 0x00, 0xf9, 0xe3, + 0x12, 0x00, 0xfd, 0xe3, 0x12, 0x00, 0xf7, 0xe5, 0x12, 0x00, 0xf8, 0xe5, + 0x12, 0x00, 0xfc, 0xe5, 0x12, 0x00, 0xfe, 0xe5, 0x12, 0x00, 0xff, 0xe5, + 0x12, 0x00, 0xb8, 0xec, 0x12, 0x00, 0xbc, 0xec, 0x12, 0x00, 0xbe, 0xec, + 0x12, 0x00, 0xbf, 0xec, 0x12, 0x00, 0x88, 0xee, 0x12, 0x00, 0x8b, 0xee, + 0x12, 0x00, 0xc9, 0xef, 0x12, 0x00, 0xca, 0xef, 0x12, 0x00, 0xe9, 0xef, + 0x12, 0x00, 0xea, 0xef, 0x12, 0x00, 0xf0, 0xef, 0x12, 0x00, 0xf1, 0xef, + 0x12, 0x00, 0xf9, 0xef, 0x12, 0x00, 0xfd, 0xef, 0x12, 0x00, 0x8b, 0xf5, + 0x12, 0x00, 0xcb, 0xf5, 0x12, 0x00, 0xeb, 0xf5, 0x12, 0x00, 0xf0, 0xf5, + 0x12, 0x00, 0xf1, 0xf5, 0x12, 0x00, 0xf9, 0xf5, 0x12, 0x00, 0xfd, 0xf5, + 0x12, 0x00, 0x8b, 0xf9, 0x12, 0x00, 0xcb, 0xf9, 0x12, 0x00, 0xeb, 0xf9, + 0x12, 0x00, 0xf7, 0xf9, 0x12, 0x00, 0xf8, 0xf9, 0x12, 0x00, 0xfc, 0xf9, + 0x12, 0x00, 0xfe, 0xf9, 0x12, 0x00, 0xff, 0xf9, 0x12, 0x00, 0xf7, 0xfd, + 0x12, 0x00, 0xf8, 0xfd, 0x12, 0x00, 0xfc, 0xfd, 0x12, 0x00, 0xfe, 0xfd, + 0x12, 0x00, 0xff, 0xfd, 0x12, 0x00, 0x73, 0x00, 0x13, 0x00, 0x7b, 0x00, + 0x13, 0x00, 0xf3, 0x01, 0x13, 0x00, 0xfb, 0x01, 0x13, 0x00, 0x98, 0x03, + 0x13, 0x00, 0x98, 0x08, 0x13, 0x00, 0x78, 0x0b, 0x13, 0x00, 0x7c, 0x0b, + 0x13, 0x00, 0x7e, 0x0b, 0x13, 0x00, 0x7f, 0x0b, 0x13, 0x00, 0xf4, 0x0b, + 0x13, 0x00, 0xf5, 0x0b, 0x13, 0x00, 0xf8, 0x0b, 0x13, 0x00, 0xfc, 0x0b, + 0x13, 0x00, 0xfe, 0x0b, 0x13, 0x00, 0xff, 0x0b, 0x13, 0x00, 0xf3, 0x0f, + 0x13, 0x00, 0xfb, 0x0f, 0x13, 0x00, 0xf4, 0x11, 0x13, 0x00, 0xf5, 0x11, + 0x13, 0x00, 0xf8, 0x11, 0x13, 0x00, 0xfc, 0x11, 0x13, 0x00, 0xfe, 0x11, + 0x13, 0x00, 0xff, 0x11, 0x13, 0x00, 0x98, 0x17, 0x13, 0x00, 0xd8, 0x17, + 0x13, 0x00, 0xf4, 0x1f, 0x13, 0x00, 0xf5, 0x1f, 0x13, 0x00, 0xf8, 0x1f, + 0x13, 0x00, 0xfc, 0x1f, 0x13, 0x00, 0xfe, 0x1f, 0x13, 0x00, 0xff, 0x1f, + 0x13, 0x00, 0xcb, 0x25, 0x13, 0x00, 0xeb, 0x25, 0x13, 0x00, 0xd0, 0x33, + 0x13, 0x00, 0xd8, 0x33, 0x13, 0x00, 0xdc, 0x33, 0x13, 0x00, 0xde, 0x33, + 0x13, 0x00, 0xdf, 0x33, 0x13, 0x00, 0xf0, 0x33, 0x13, 0x00, 0xf1, 0x33, + 0x13, 0x00, 0xf9, 0x33, 0x13, 0x00, 0xfd, 0x33, 0x13, 0x00, 0x8b, 0x39, + 0x13, 0x00, 0xcb, 0x39, 0x13, 0x00, 0xeb, 0x39, 0x13, 0x00, 0xf0, 0x39, + 0x13, 0x00, 0xf1, 0x39, 0x13, 0x00, 0xf9, 0x39, 0x13, 0x00, 0xfd, 0x39, + 0x13, 0x00, 0xf0, 0x3b, 0x13, 0x00, 0xf1, 0x3b, 0x13, 0x00, 0xf9, 0x3b, + 0x13, 0x00, 0xfd, 0x3b, 0x13, 0x00, 0x8b, 0x3d, 0x13, 0x00, 0xcb, 0x3d, + 0x13, 0x00, 0xeb, 0x3d, 0x13, 0x00, 0xf0, 0x3d, 0x13, 0x00, 0xf1, 0x3d, + 0x13, 0x00, 0xf9, 0x3d, 0x13, 0x00, 0xfd, 0x3d, 0x13, 0x00, 0x90, 0x3f, + 0x13, 0x00, 0x98, 0x3f, 0x13, 0x00, 0x9c, 0x3f, 0x13, 0x00, 0x9e, 0x3f, + 0x13, 0x00, 0x9f, 0x3f, 0x13, 0x00, 0xd0, 0x3f, 0x13, 0x00, 0xd8, 0x3f, + 0x13, 0x00, 0xdc, 0x3f, 0x13, 0x00, 0xde, 0x3f, 0x13, 0x00, 0xdf, 0x3f, + 0x13, 0x00, 0x77, 0x40, 0x13, 0x00, 0x78, 0x40, 0x13, 0x00, 0x7c, 0x40, + 0x13, 0x00, 0x7e, 0x40, 0x13, 0x00, 0x7f, 0x40, 0x13, 0x00, 0xf0, 0x41, + 0x13, 0x00, 0xf1, 0x41, 0x13, 0x00, 0xf9, 0x41, 0x13, 0x00, 0xfd, 0x41, + 0x13, 0x00, 0x8b, 0x43, 0x13, 0x00, 0xb0, 0x44, 0x13, 0x00, 0xb0, 0x46, + 0x13, 0x00, 0xb0, 0x48, 0x13, 0x00, 0x6b, 0x49, 0x13, 0x00, 0xf0, 0x4b, + 0x13, 0x00, 0x6b, 0x4c, 0x13, 0x00, 0x6b, 0x4d, 0x13, 0x00, 0x6b, 0x4e, + 0x13, 0x00, 0x6b, 0x4f, 0x13, 0x00, 0x8b, 0x4f, 0x13, 0x00, 0xcb, 0x4f, + 0x13, 0x00, 0xeb, 0x4f, 0x13, 0x00, 0xf0, 0x4f, 0x13, 0x00, 0xf1, 0x4f, + 0x13, 0x00, 0xf7, 0x4f, 0x13, 0x00, 0xf9, 0x4f, 0x13, 0x00, 0xfd, 0x4f, + 0x13, 0x00, 0x78, 0x52, 0x13, 0x00, 0x7c, 0x52, 0x13, 0x00, 0x7e, 0x52, + 0x13, 0x00, 0x7f, 0x52, 0x13, 0x00, 0x6b, 0x55, 0x13, 0x00, 0x78, 0x55, + 0x13, 0x00, 0x7c, 0x55, 0x13, 0x00, 0x7e, 0x55, 0x13, 0x00, 0x7f, 0x55, + 0x13, 0x00, 0xcb, 0x57, 0x13, 0x00, 0xeb, 0x57, 0x13, 0x00, 0xf8, 0x57, + 0x13, 0x00, 0xfc, 0x57, 0x13, 0x00, 0xfe, 0x57, 0x13, 0x00, 0xff, 0x57, + 0x13, 0x00, 0x8b, 0x5b, 0x13, 0x00, 0x78, 0x5c, 0x13, 0x00, 0x7c, 0x5c, + 0x13, 0x00, 0x7e, 0x5c, 0x13, 0x00, 0x7f, 0x5c, 0x13, 0x00, 0x78, 0x5e, + 0x13, 0x00, 0x7c, 0x5e, 0x13, 0x00, 0x7e, 0x5e, 0x13, 0x00, 0x7f, 0x5e, + 0x13, 0x00, 0xf7, 0x5f, 0x13, 0x00, 0xf8, 0x5f, 0x13, 0x00, 0xfc, 0x5f, + 0x13, 0x00, 0xfe, 0x5f, 0x13, 0x00, 0xff, 0x5f, 0x13, 0x00, 0x8b, 0x64, + 0x13, 0x00, 0x9b, 0x65, 0x13, 0x00, 0xdb, 0x65, 0x13, 0x00, 0x8b, 0x66, + 0x13, 0x00, 0x0b, 0x67, 0x13, 0x00, 0x0b, 0x6b, 0x13, 0x00, 0x6b, 0x70, + 0x13, 0x00, 0x8b, 0x71, 0x13, 0x00, 0x9b, 0x75, 0x13, 0x00, 0xdb, 0x75, + 0x13, 0x00, 0x6b, 0x78, 0x13, 0x00, 0x8b, 0x78, 0x13, 0x00, 0x8b, 0x7a, + 0x13, 0x00, 0x0b, 0x7b, 0x13, 0x00, 0x6b, 0x7b, 0x13, 0x00, 0x9b, 0x7d, + 0x13, 0x00, 0xdb, 0x7d, 0x13, 0x00, 0x70, 0x84, 0x13, 0x00, 0x71, 0x84, + 0x13, 0x00, 0x73, 0x84, 0x13, 0x00, 0x79, 0x84, 0x13, 0x00, 0x7b, 0x84, + 0x13, 0x00, 0x7d, 0x84, 0x13, 0x00, 0xf2, 0x85, 0x13, 0x00, 0xf4, 0x85, + 0x13, 0x00, 0xf5, 0x85, 0x13, 0x00, 0xf6, 0x85, 0x13, 0x00, 0xf7, 0x85, + 0x13, 0x00, 0xf8, 0x85, 0x13, 0x00, 0xfa, 0x85, 0x13, 0x00, 0xfc, 0x85, + 0x13, 0x00, 0xfe, 0x85, 0x13, 0x00, 0xff, 0x85, 0x13, 0x00, 0x72, 0x86, + 0x13, 0x00, 0x74, 0x86, 0x13, 0x00, 0x75, 0x86, 0x13, 0x00, 0x76, 0x86, + 0x13, 0x00, 0x77, 0x86, 0x13, 0x00, 0x78, 0x86, 0x13, 0x00, 0x7a, 0x86, + 0x13, 0x00, 0x7c, 0x86, 0x13, 0x00, 0x7e, 0x86, 0x13, 0x00, 0x7f, 0x86, + 0x13, 0x00, 0x76, 0x87, 0x13, 0x00, 0x77, 0x87, 0x13, 0x00, 0x78, 0x87, + 0x13, 0x00, 0x7c, 0x87, 0x13, 0x00, 0x7e, 0x87, 0x13, 0x00, 0x7f, 0x87, + 0x13, 0x00, 0xf0, 0x87, 0x13, 0x00, 0xf1, 0x87, 0x13, 0x00, 0xf3, 0x87, + 0x13, 0x00, 0xf9, 0x87, 0x13, 0x00, 0xfb, 0x87, 0x13, 0x00, 0xfd, 0x87, + 0x13, 0x00, 0x72, 0x8a, 0x13, 0x00, 0x74, 0x8a, 0x13, 0x00, 0x75, 0x8a, + 0x13, 0x00, 0x76, 0x8a, 0x13, 0x00, 0x77, 0x8a, 0x13, 0x00, 0x78, 0x8a, + 0x13, 0x00, 0x7a, 0x8a, 0x13, 0x00, 0x7c, 0x8a, 0x13, 0x00, 0x7e, 0x8a, + 0x13, 0x00, 0x7f, 0x8a, 0x13, 0x00, 0x11, 0x8b, 0x13, 0x00, 0x16, 0x8b, + 0x13, 0x00, 0x17, 0x8b, 0x13, 0x00, 0x19, 0x8b, 0x13, 0x00, 0x1d, 0x8b, + 0x13, 0x00, 0xf3, 0x99, 0x13, 0x00, 0xfb, 0x99, 0x13, 0x00, 0x78, 0xa4, + 0x13, 0x00, 0x7c, 0xa4, 0x13, 0x00, 0x7e, 0xa4, 0x13, 0x00, 0x7f, 0xa4, + 0x13, 0x00, 0xcb, 0xa5, 0x13, 0x00, 0xeb, 0xa5, 0x13, 0x00, 0x78, 0xa6, + 0x13, 0x00, 0x7c, 0xa6, 0x13, 0x00, 0x7e, 0xa6, 0x13, 0x00, 0x7f, 0xa6, + 0x13, 0x00, 0xf8, 0xa7, 0x13, 0x00, 0xfc, 0xa7, 0x13, 0x00, 0xfe, 0xa7, + 0x13, 0x00, 0xff, 0xa7, 0x13, 0x00, 0xd0, 0xb3, 0x13, 0x00, 0xd8, 0xb3, + 0x13, 0x00, 0xdc, 0xb3, 0x13, 0x00, 0xde, 0xb3, 0x13, 0x00, 0xdf, 0xb3, + 0x13, 0x00, 0xf0, 0xb3, 0x13, 0x00, 0xf1, 0xb3, 0x13, 0x00, 0xf9, 0xb3, + 0x13, 0x00, 0xfd, 0xb3, 0x13, 0x00, 0x8b, 0xb9, 0x13, 0x00, 0xcb, 0xb9, + 0x13, 0x00, 0xeb, 0xb9, 0x13, 0x00, 0xf0, 0xb9, 0x13, 0x00, 0xf1, 0xb9, + 0x13, 0x00, 0xf9, 0xb9, 0x13, 0x00, 0xfd, 0xb9, 0x13, 0x00, 0x66, 0xba, + 0x13, 0x00, 0x76, 0xba, 0x13, 0x00, 0x77, 0xba, 0x13, 0x00, 0x78, 0xba, + 0x13, 0x00, 0x7c, 0xba, 0x13, 0x00, 0x7e, 0xba, 0x13, 0x00, 0x7f, 0xba, + 0x13, 0x00, 0x90, 0xbb, 0x13, 0x00, 0x98, 0xbb, 0x13, 0x00, 0x9c, 0xbb, + 0x13, 0x00, 0x9e, 0xbb, 0x13, 0x00, 0x9f, 0xbb, 0x13, 0x00, 0x8b, 0xbd, + 0x13, 0x00, 0xcb, 0xbd, 0x13, 0x00, 0xeb, 0xbd, 0x13, 0x00, 0xf0, 0xbd, + 0x13, 0x00, 0xf1, 0xbd, 0x13, 0x00, 0xf9, 0xbd, 0x13, 0x00, 0xfd, 0xbd, + 0x13, 0x00, 0x90, 0xbf, 0x13, 0x00, 0x98, 0xbf, 0x13, 0x00, 0x9c, 0xbf, + 0x13, 0x00, 0x9e, 0xbf, 0x13, 0x00, 0x9f, 0xbf, 0x13, 0x00, 0xd0, 0xbf, + 0x13, 0x00, 0xd8, 0xbf, 0x13, 0x00, 0xdc, 0xbf, 0x13, 0x00, 0xde, 0xbf, + 0x13, 0x00, 0xdf, 0xbf, 0x13, 0x00, 0xf2, 0xc5, 0x13, 0x00, 0xf4, 0xc5, + 0x13, 0x00, 0xf5, 0xc5, 0x13, 0x00, 0xf6, 0xc5, 0x13, 0x00, 0xf7, 0xc5, + 0x13, 0x00, 0xf8, 0xc5, 0x13, 0x00, 0xfa, 0xc5, 0x13, 0x00, 0xfc, 0xc5, + 0x13, 0x00, 0xfe, 0xc5, 0x13, 0x00, 0xff, 0xc5, 0x13, 0x00, 0xd8, 0xd3, + 0x13, 0x00, 0xf3, 0xd3, 0x13, 0x00, 0xfb, 0xd3, 0x13, 0x00, 0xf4, 0xd9, + 0x13, 0x00, 0xf5, 0xd9, 0x13, 0x00, 0xf8, 0xd9, 0x13, 0x00, 0xfc, 0xd9, + 0x13, 0x00, 0xfe, 0xd9, 0x13, 0x00, 0xff, 0xd9, 0x13, 0x00, 0xf4, 0xdb, + 0x13, 0x00, 0xf5, 0xdb, 0x13, 0x00, 0xf8, 0xdb, 0x13, 0x00, 0xfc, 0xdb, + 0x13, 0x00, 0xfe, 0xdb, 0x13, 0x00, 0xff, 0xdb, 0x13, 0x00, 0xf4, 0xdd, + 0x13, 0x00, 0xf5, 0xdd, 0x13, 0x00, 0xf8, 0xdd, 0x13, 0x00, 0xfc, 0xdd, + 0x13, 0x00, 0xfe, 0xdd, 0x13, 0x00, 0xff, 0xdd, 0x13, 0x00, 0x98, 0xdf, + 0x13, 0x00, 0xd8, 0xdf, 0x13, 0x00, 0x0b, 0xe5, 0x13, 0x00, 0x8b, 0xf2, + 0x13, 0x00, 0x08, 0xf3, 0x13, 0x00, 0x0b, 0xf3, 0x13, 0x00, 0x68, 0xf3, + 0x13, 0x00, 0x6b, 0xf3, 0x13, 0x00, 0x0b, 0xf9, 0x13, 0x00, 0xf7, 0xf9, + 0x13, 0x00, 0x88, 0xfc, 0x13, 0x00, 0x8b, 0xfc, 0x13, 0x00, 0x90, 0xfc, + 0x13, 0x00, 0x99, 0xfc, 0x13, 0x00, 0x9d, 0xfc, 0x13, 0x00, 0x0b, 0xfd, + 0x13, 0x00, 0x8b, 0xfe, 0x13, 0x00, 0x08, 0xff, 0x13, 0x00, 0x0b, 0xff, + 0x13, 0x00, 0xcb, 0x05, 0x14, 0x00, 0xeb, 0x05, 0x14, 0x00, 0xf8, 0x05, + 0x14, 0x00, 0xfc, 0x05, 0x14, 0x00, 0xfe, 0x05, 0x14, 0x00, 0xff, 0x05, + 0x14, 0x00, 0x6b, 0x06, 0x14, 0x00, 0x78, 0x06, 0x14, 0x00, 0x7c, 0x06, + 0x14, 0x00, 0x7e, 0x06, 0x14, 0x00, 0x7f, 0x06, 0x14, 0x00, 0x8b, 0x07, + 0x14, 0x00, 0xcb, 0x07, 0x14, 0x00, 0xeb, 0x07, 0x14, 0x00, 0xf8, 0x07, + 0x14, 0x00, 0xfc, 0x07, 0x14, 0x00, 0xfe, 0x07, 0x14, 0x00, 0xff, 0x07, + 0x14, 0x00, 0x6b, 0x08, 0x14, 0x00, 0x8b, 0x08, 0x14, 0x00, 0xb8, 0x08, + 0x14, 0x00, 0xbc, 0x08, 0x14, 0x00, 0xbe, 0x08, 0x14, 0x00, 0xbf, 0x08, + 0x14, 0x00, 0xf8, 0x0b, 0x14, 0x00, 0xfc, 0x0b, 0x14, 0x00, 0xfe, 0x0b, + 0x14, 0x00, 0xff, 0x0b, 0x14, 0x00, 0xcb, 0x0f, 0x14, 0x00, 0xeb, 0x0f, + 0x14, 0x00, 0xeb, 0x13, 0x14, 0x00, 0x78, 0x1a, 0x14, 0x00, 0x7c, 0x1a, + 0x14, 0x00, 0x7e, 0x1a, 0x14, 0x00, 0x7f, 0x1a, 0x14, 0x00, 0xcb, 0x1d, + 0x14, 0x00, 0xeb, 0x1d, 0x14, 0x00, 0x8b, 0x20, 0x14, 0x00, 0x8b, 0x27, + 0x14, 0x00, 0xcb, 0x27, 0x14, 0x00, 0xeb, 0x27, 0x14, 0x00, 0x8b, 0x28, + 0x14, 0x00, 0xcb, 0x29, 0x14, 0x00, 0xeb, 0x29, 0x14, 0x00, 0xf8, 0x29, + 0x14, 0x00, 0xfc, 0x29, 0x14, 0x00, 0xfe, 0x29, 0x14, 0x00, 0xff, 0x29, + 0x14, 0x00, 0xf8, 0x2b, 0x14, 0x00, 0xfc, 0x2b, 0x14, 0x00, 0xfe, 0x2b, + 0x14, 0x00, 0xff, 0x2b, 0x14, 0x00, 0xf8, 0x2d, 0x14, 0x00, 0xfc, 0x2d, + 0x14, 0x00, 0xfe, 0x2d, 0x14, 0x00, 0xff, 0x2d, 0x14, 0x00, 0x6b, 0x32, + 0x14, 0x00, 0xab, 0x32, 0x14, 0x00, 0x8b, 0x33, 0x14, 0x00, 0x78, 0x35, + 0x14, 0x00, 0x7c, 0x35, 0x14, 0x00, 0x7e, 0x35, 0x14, 0x00, 0x7f, 0x35, + 0x14, 0x00, 0xcb, 0x37, 0x14, 0x00, 0xeb, 0x37, 0x14, 0x00, 0xf0, 0x37, + 0x14, 0x00, 0xf1, 0x37, 0x14, 0x00, 0xf7, 0x37, 0x14, 0x00, 0xf9, 0x37, + 0x14, 0x00, 0xfd, 0x37, 0x14, 0x00, 0x6b, 0x3c, 0x14, 0x00, 0x78, 0x3e, + 0x14, 0x00, 0x7c, 0x3e, 0x14, 0x00, 0x7e, 0x3e, 0x14, 0x00, 0x7f, 0x3e, + 0x14, 0x00, 0xf8, 0x3f, 0x14, 0x00, 0xfc, 0x3f, 0x14, 0x00, 0xfe, 0x3f, + 0x14, 0x00, 0xff, 0x3f, 0x14, 0x00, 0xb0, 0x44, 0x14, 0x00, 0xb1, 0x44, + 0x14, 0x00, 0xb9, 0x44, 0x14, 0x00, 0xbd, 0x44, 0x14, 0x00, 0xb0, 0x46, + 0x14, 0x00, 0xb1, 0x46, 0x14, 0x00, 0xb9, 0x46, 0x14, 0x00, 0xbd, 0x46, + 0x14, 0x00, 0x70, 0x4a, 0x14, 0x00, 0x71, 0x4a, 0x14, 0x00, 0x77, 0x4a, + 0x14, 0x00, 0x79, 0x4a, 0x14, 0x00, 0x7d, 0x4a, 0x14, 0x00, 0x6b, 0x52, + 0x14, 0x00, 0x78, 0x52, 0x14, 0x00, 0x7c, 0x52, 0x14, 0x00, 0x7e, 0x52, + 0x14, 0x00, 0x7f, 0x52, 0x14, 0x00, 0xab, 0x52, 0x14, 0x00, 0x8b, 0x53, + 0x14, 0x00, 0x6b, 0x5c, 0x14, 0x00, 0x78, 0x5c, 0x14, 0x00, 0x7c, 0x5c, + 0x14, 0x00, 0x7e, 0x5c, 0x14, 0x00, 0x7f, 0x5c, 0x14, 0x00, 0xf0, 0x5f, + 0x14, 0x00, 0xf1, 0x5f, 0x14, 0x00, 0xf9, 0x5f, 0x14, 0x00, 0xfd, 0x5f, + 0x14, 0x00, 0x6b, 0x67, 0x14, 0x00, 0x8b, 0x6a, 0x14, 0x00, 0x78, 0x6b, + 0x14, 0x00, 0x7c, 0x6b, 0x14, 0x00, 0x7e, 0x6b, 0x14, 0x00, 0x7f, 0x6b, + 0x14, 0x00, 0x71, 0x80, 0x14, 0x00, 0x79, 0x80, 0x14, 0x00, 0x71, 0x84, + 0x14, 0x00, 0x79, 0x84, 0x14, 0x00, 0x78, 0x85, 0x14, 0x00, 0x7c, 0x85, + 0x14, 0x00, 0x7e, 0x85, 0x14, 0x00, 0x7f, 0x85, 0x14, 0x00, 0xf7, 0x85, + 0x14, 0x00, 0x71, 0x86, 0x14, 0x00, 0x79, 0x86, 0x14, 0x00, 0x0b, 0x87, + 0x14, 0x00, 0x70, 0x87, 0x14, 0x00, 0x71, 0x87, 0x14, 0x00, 0x79, 0x87, + 0x14, 0x00, 0x7d, 0x87, 0x14, 0x00, 0xf7, 0x87, 0x14, 0x00, 0x8b, 0x8a, + 0x14, 0x00, 0x0b, 0x8b, 0x14, 0x00, 0x6b, 0x8b, 0x14, 0x00, 0x78, 0x8b, + 0x14, 0x00, 0x7c, 0x8b, 0x14, 0x00, 0x7e, 0x8b, 0x14, 0x00, 0x7f, 0x8b, + 0x14, 0x00, 0xf1, 0x8b, 0x14, 0x00, 0xf7, 0x8b, 0x14, 0x00, 0xf9, 0x8b, + 0x14, 0x00, 0xfb, 0x95, 0x14, 0x00, 0xbb, 0xb2, 0x14, 0x00, 0xf1, 0xb3, + 0x14, 0x00, 0xf7, 0xb3, 0x14, 0x00, 0xf9, 0xb3, 0x14, 0x00, 0xbb, 0xbe, + 0x14, 0x00, 0xf1, 0xbf, 0x14, 0x00, 0xf7, 0xbf, 0x14, 0x00, 0xf9, 0xbf, + 0x14, 0x00, 0xf0, 0xc1, 0x14, 0x00, 0xf1, 0xc1, 0x14, 0x00, 0xf9, 0xc1, + 0x14, 0x00, 0xfd, 0xc1, 0x14, 0x00, 0x91, 0xc3, 0x14, 0x00, 0x96, 0xc3, + 0x14, 0x00, 0x97, 0xc3, 0x14, 0x00, 0x99, 0xc3, 0x14, 0x00, 0x9d, 0xc3, + 0x14, 0x00, 0xf6, 0xc5, 0x14, 0x00, 0xf7, 0xc5, 0x14, 0x00, 0xf8, 0xc5, + 0x14, 0x00, 0xfc, 0xc5, 0x14, 0x00, 0xfe, 0xc5, 0x14, 0x00, 0xff, 0xc5, + 0x14, 0x00, 0xf0, 0xc9, 0x14, 0x00, 0xf1, 0xc9, 0x14, 0x00, 0xf9, 0xc9, + 0x14, 0x00, 0xfd, 0xc9, 0x14, 0x00, 0x18, 0xcf, 0x14, 0x00, 0x1c, 0xcf, + 0x14, 0x00, 0x1e, 0xcf, 0x14, 0x00, 0x1f, 0xcf, 0x14, 0x00, 0x91, 0xcf, + 0x14, 0x00, 0x96, 0xcf, 0x14, 0x00, 0x97, 0xcf, 0x14, 0x00, 0x98, 0xcf, + 0x14, 0x00, 0x9c, 0xcf, 0x14, 0x00, 0x9e, 0xcf, 0x14, 0x00, 0x9f, 0xcf, + 0x14, 0x00, 0xd1, 0xcf, 0x14, 0x00, 0xd6, 0xcf, 0x14, 0x00, 0xd7, 0xcf, + 0x14, 0x00, 0xd8, 0xcf, 0x14, 0x00, 0xdc, 0xcf, 0x14, 0x00, 0xde, 0xcf, + 0x14, 0x00, 0xdf, 0xcf, 0x14, 0x00, 0xf8, 0xd1, 0x14, 0x00, 0xfc, 0xd1, + 0x14, 0x00, 0xfe, 0xd1, 0x14, 0x00, 0xff, 0xd1, 0x14, 0x00, 0x98, 0xd3, + 0x14, 0x00, 0x9c, 0xd3, 0x14, 0x00, 0x9e, 0xd3, 0x14, 0x00, 0x9f, 0xd3, + 0x14, 0x00, 0xf8, 0xd5, 0x14, 0x00, 0xfc, 0xd5, 0x14, 0x00, 0xfe, 0xd5, + 0x14, 0x00, 0xff, 0xd5, 0x14, 0x00, 0x88, 0xd7, 0x14, 0x00, 0x8b, 0xd7, + 0x14, 0x00, 0xf8, 0xd9, 0x14, 0x00, 0xfc, 0xd9, 0x14, 0x00, 0xfe, 0xd9, + 0x14, 0x00, 0xff, 0xd9, 0x14, 0x00, 0xf8, 0xdd, 0x14, 0x00, 0xfc, 0xdd, + 0x14, 0x00, 0xfe, 0xdd, 0x14, 0x00, 0xff, 0xdd, 0x14, 0x00, 0x98, 0xdf, + 0x14, 0x00, 0x9c, 0xdf, 0x14, 0x00, 0x9e, 0xdf, 0x14, 0x00, 0x9f, 0xdf, + 0x14, 0x00, 0xf6, 0xe1, 0x14, 0x00, 0xf7, 0xe1, 0x14, 0x00, 0xf8, 0xe1, + 0x14, 0x00, 0xfc, 0xe1, 0x14, 0x00, 0xfe, 0xe1, 0x14, 0x00, 0xff, 0xe1, + 0x14, 0x00, 0x8b, 0xe5, 0x14, 0x00, 0xcb, 0xe5, 0x14, 0x00, 0xeb, 0xe5, + 0x14, 0x00, 0xf0, 0xe5, 0x14, 0x00, 0xf6, 0xe9, 0x14, 0x00, 0xf7, 0xe9, + 0x14, 0x00, 0xf8, 0xe9, 0x14, 0x00, 0xfc, 0xe9, 0x14, 0x00, 0xfe, 0xe9, + 0x14, 0x00, 0xff, 0xe9, 0x14, 0x00, 0xb0, 0xea, 0x14, 0x00, 0xf0, 0xed, + 0x14, 0x00, 0x18, 0xef, 0x14, 0x00, 0x1c, 0xef, 0x14, 0x00, 0x1e, 0xef, + 0x14, 0x00, 0x1f, 0xef, 0x14, 0x00, 0x91, 0xef, 0x14, 0x00, 0x96, 0xef, + 0x14, 0x00, 0x97, 0xef, 0x14, 0x00, 0x98, 0xef, 0x14, 0x00, 0x9c, 0xef, + 0x14, 0x00, 0x9e, 0xef, 0x14, 0x00, 0x9f, 0xef, 0x14, 0x00, 0xd1, 0xef, + 0x14, 0x00, 0xd6, 0xef, 0x14, 0x00, 0xd7, 0xef, 0x14, 0x00, 0xd8, 0xef, + 0x14, 0x00, 0xdc, 0xef, 0x14, 0x00, 0xde, 0xef, 0x14, 0x00, 0xdf, 0xef, + 0x14, 0x00, 0x8b, 0xf1, 0x14, 0x00, 0xf0, 0xf1, 0x14, 0x00, 0xf1, 0xf1, + 0x14, 0x00, 0xf9, 0xf1, 0x14, 0x00, 0xfd, 0xf1, 0x14, 0x00, 0x88, 0xf3, + 0x14, 0x00, 0x8b, 0xf3, 0x14, 0x00, 0x90, 0xf3, 0x14, 0x00, 0x8b, 0xf9, + 0x14, 0x00, 0xcb, 0xf9, 0x14, 0x00, 0xeb, 0xf9, 0x14, 0x00, 0xf7, 0xf9, + 0x14, 0x00, 0xf8, 0xf9, 0x14, 0x00, 0xfc, 0xf9, 0x14, 0x00, 0xfe, 0xf9, + 0x14, 0x00, 0xff, 0xf9, 0x14, 0x00, 0x8b, 0xfd, 0x14, 0x00, 0xcb, 0xfd, + 0x14, 0x00, 0xeb, 0xfd, 0x14, 0x00, 0xf0, 0xfd, 0x14, 0x00, 0x90, 0xff, + 0x14, 0x00, 0x99, 0xff, 0x14, 0x00, 0x9d, 0xff, 0x14, 0x00, 0xd0, 0xff, + 0x14, 0x00, 0xd9, 0xff, 0x14, 0x00, 0xdd, 0xff, 0x14, 0x00, 0x73, 0x01, + 0x15, 0x00, 0x7b, 0x01, 0x15, 0x00, 0x98, 0x01, 0x15, 0x00, 0xd8, 0x01, + 0x15, 0x00, 0xd8, 0x03, 0x15, 0x00, 0xf3, 0x03, 0x15, 0x00, 0xfb, 0x03, + 0x15, 0x00, 0x73, 0x04, 0x15, 0x00, 0x7b, 0x04, 0x15, 0x00, 0xf4, 0x05, + 0x15, 0x00, 0xf5, 0x05, 0x15, 0x00, 0xf8, 0x05, 0x15, 0x00, 0xfc, 0x05, + 0x15, 0x00, 0xfe, 0x05, 0x15, 0x00, 0xff, 0x05, 0x15, 0x00, 0x74, 0x06, + 0x15, 0x00, 0x75, 0x06, 0x15, 0x00, 0x78, 0x06, 0x15, 0x00, 0x7c, 0x06, + 0x15, 0x00, 0x7e, 0x06, 0x15, 0x00, 0x7f, 0x06, 0x15, 0x00, 0x78, 0x07, + 0x15, 0x00, 0x7c, 0x07, 0x15, 0x00, 0x7e, 0x07, 0x15, 0x00, 0x7f, 0x07, + 0x15, 0x00, 0xf4, 0x07, 0x15, 0x00, 0xf5, 0x07, 0x15, 0x00, 0xf8, 0x07, + 0x15, 0x00, 0xfc, 0x07, 0x15, 0x00, 0xfe, 0x07, 0x15, 0x00, 0xff, 0x07, + 0x15, 0x00, 0x98, 0x08, 0x15, 0x00, 0x78, 0x0b, 0x15, 0x00, 0x7c, 0x0b, + 0x15, 0x00, 0x7e, 0x0b, 0x15, 0x00, 0x7f, 0x0b, 0x15, 0x00, 0xf4, 0x0b, + 0x15, 0x00, 0xf5, 0x0b, 0x15, 0x00, 0xf8, 0x0b, 0x15, 0x00, 0xfc, 0x0b, + 0x15, 0x00, 0xfe, 0x0b, 0x15, 0x00, 0xff, 0x0b, 0x15, 0x00, 0xf3, 0x0f, + 0x15, 0x00, 0xfb, 0x0f, 0x15, 0x00, 0x18, 0x11, 0x15, 0x00, 0x74, 0x11, + 0x15, 0x00, 0x75, 0x11, 0x15, 0x00, 0x78, 0x11, 0x15, 0x00, 0x7c, 0x11, + 0x15, 0x00, 0x7e, 0x11, 0x15, 0x00, 0x7f, 0x11, 0x15, 0x00, 0x98, 0x17, + 0x15, 0x00, 0xd8, 0x17, 0x15, 0x00, 0xf3, 0x19, 0x15, 0x00, 0xfb, 0x19, + 0x15, 0x00, 0xa4, 0x1a, 0x15, 0x00, 0xa5, 0x1a, 0x15, 0x00, 0x98, 0x1e, + 0x15, 0x00, 0x9c, 0x1e, 0x15, 0x00, 0x9e, 0x1e, 0x15, 0x00, 0x9f, 0x1e, + 0x15, 0x00, 0xcb, 0x25, 0x15, 0x00, 0xeb, 0x25, 0x15, 0x00, 0xd0, 0x33, + 0x15, 0x00, 0xd8, 0x33, 0x15, 0x00, 0xdc, 0x33, 0x15, 0x00, 0xde, 0x33, + 0x15, 0x00, 0xdf, 0x33, 0x15, 0x00, 0xf0, 0x33, 0x15, 0x00, 0xf1, 0x33, + 0x15, 0x00, 0xf9, 0x33, 0x15, 0x00, 0xfd, 0x33, 0x15, 0x00, 0x8b, 0x39, + 0x15, 0x00, 0xcb, 0x39, 0x15, 0x00, 0xeb, 0x39, 0x15, 0x00, 0xf0, 0x39, + 0x15, 0x00, 0xf1, 0x39, 0x15, 0x00, 0xf9, 0x39, 0x15, 0x00, 0xfd, 0x39, + 0x15, 0x00, 0xf0, 0x3b, 0x15, 0x00, 0xf1, 0x3b, 0x15, 0x00, 0xf9, 0x3b, + 0x15, 0x00, 0xfd, 0x3b, 0x15, 0x00, 0x8b, 0x3d, 0x15, 0x00, 0xcb, 0x3d, + 0x15, 0x00, 0xeb, 0x3d, 0x15, 0x00, 0xf0, 0x3d, 0x15, 0x00, 0xf1, 0x3d, + 0x15, 0x00, 0xf9, 0x3d, 0x15, 0x00, 0xfd, 0x3d, 0x15, 0x00, 0x90, 0x3f, + 0x15, 0x00, 0x98, 0x3f, 0x15, 0x00, 0x9c, 0x3f, 0x15, 0x00, 0x9e, 0x3f, + 0x15, 0x00, 0x9f, 0x3f, 0x15, 0x00, 0xd0, 0x3f, 0x15, 0x00, 0xd8, 0x3f, + 0x15, 0x00, 0xdc, 0x3f, 0x15, 0x00, 0xde, 0x3f, 0x15, 0x00, 0xdf, 0x3f, + 0x15, 0x00, 0x76, 0x40, 0x15, 0x00, 0x77, 0x40, 0x15, 0x00, 0x78, 0x40, + 0x15, 0x00, 0x7c, 0x40, 0x15, 0x00, 0x7e, 0x40, 0x15, 0x00, 0x7f, 0x40, + 0x15, 0x00, 0xb0, 0x40, 0x15, 0x00, 0xf0, 0x41, 0x15, 0x00, 0xf1, 0x41, + 0x15, 0x00, 0xf9, 0x41, 0x15, 0x00, 0xfd, 0x41, 0x15, 0x00, 0x78, 0x42, + 0x15, 0x00, 0x7c, 0x42, 0x15, 0x00, 0x7e, 0x42, 0x15, 0x00, 0x7f, 0x42, + 0x15, 0x00, 0x91, 0x43, 0x15, 0x00, 0x96, 0x43, 0x15, 0x00, 0x97, 0x43, + 0x15, 0x00, 0x99, 0x43, 0x15, 0x00, 0x9d, 0x43, 0x15, 0x00, 0xb0, 0x46, + 0x15, 0x00, 0x90, 0x47, 0x15, 0x00, 0x98, 0x47, 0x15, 0x00, 0x9c, 0x47, + 0x15, 0x00, 0x9e, 0x47, 0x15, 0x00, 0x9f, 0x47, 0x15, 0x00, 0xd0, 0x47, + 0x15, 0x00, 0xd8, 0x47, 0x15, 0x00, 0xdc, 0x47, 0x15, 0x00, 0xde, 0x47, + 0x15, 0x00, 0xdf, 0x47, 0x15, 0x00, 0x6b, 0x48, 0x15, 0x00, 0x70, 0x48, + 0x15, 0x00, 0x86, 0x48, 0x15, 0x00, 0xb0, 0x48, 0x15, 0x00, 0xd0, 0x4b, + 0x15, 0x00, 0xe6, 0x4b, 0x15, 0x00, 0xf0, 0x4b, 0x15, 0x00, 0xf0, 0x4f, + 0x15, 0x00, 0xf1, 0x4f, 0x15, 0x00, 0xf9, 0x4f, 0x15, 0x00, 0xfd, 0x4f, + 0x15, 0x00, 0x88, 0x53, 0x15, 0x00, 0x8b, 0x53, 0x15, 0x00, 0x90, 0x53, + 0x15, 0x00, 0x98, 0x53, 0x15, 0x00, 0x9c, 0x53, 0x15, 0x00, 0x9e, 0x53, + 0x15, 0x00, 0x9f, 0x53, 0x15, 0x00, 0x78, 0x55, 0x15, 0x00, 0x7c, 0x55, + 0x15, 0x00, 0x7e, 0x55, 0x15, 0x00, 0x7f, 0x55, 0x15, 0x00, 0x86, 0x57, + 0x15, 0x00, 0xc6, 0x57, 0x15, 0x00, 0xe6, 0x57, 0x15, 0x00, 0xf6, 0x57, + 0x15, 0x00, 0xf7, 0x57, 0x15, 0x00, 0xf8, 0x57, 0x15, 0x00, 0xfc, 0x57, + 0x15, 0x00, 0xfe, 0x57, 0x15, 0x00, 0xff, 0x57, 0x15, 0x00, 0x78, 0x5c, + 0x15, 0x00, 0x7c, 0x5c, 0x15, 0x00, 0x7e, 0x5c, 0x15, 0x00, 0x7f, 0x5c, + 0x15, 0x00, 0x88, 0x5f, 0x15, 0x00, 0x8b, 0x5f, 0x15, 0x00, 0xf0, 0x5f, + 0x15, 0x00, 0xf1, 0x5f, 0x15, 0x00, 0xf9, 0x5f, 0x15, 0x00, 0xfd, 0x5f, + 0x15, 0x00, 0xf4, 0x61, 0x15, 0x00, 0xf5, 0x61, 0x15, 0x00, 0xf8, 0x61, + 0x15, 0x00, 0xfc, 0x61, 0x15, 0x00, 0xfe, 0x61, 0x15, 0x00, 0xff, 0x61, + 0x15, 0x00, 0x98, 0x64, 0x15, 0x00, 0x9c, 0x64, 0x15, 0x00, 0x9e, 0x64, + 0x15, 0x00, 0x9f, 0x64, 0x15, 0x00, 0x18, 0x67, 0x15, 0x00, 0x1c, 0x67, + 0x15, 0x00, 0x1e, 0x67, 0x15, 0x00, 0x1f, 0x67, 0x15, 0x00, 0x98, 0x67, + 0x15, 0x00, 0xd8, 0x67, 0x15, 0x00, 0xf4, 0x6f, 0x15, 0x00, 0xf5, 0x6f, + 0x15, 0x00, 0xf8, 0x6f, 0x15, 0x00, 0xfc, 0x6f, 0x15, 0x00, 0xfe, 0x6f, + 0x15, 0x00, 0xff, 0x6f, 0x15, 0x00, 0x98, 0x77, 0x15, 0x00, 0xd8, 0x77, + 0x15, 0x00, 0xf4, 0x7f, 0x15, 0x00, 0xf5, 0x7f, 0x15, 0x00, 0xf8, 0x7f, + 0x15, 0x00, 0xfc, 0x7f, 0x15, 0x00, 0xfe, 0x7f, 0x15, 0x00, 0xff, 0x7f, + 0x15, 0x00, 0x8b, 0x84, 0x15, 0x00, 0xb1, 0x84, 0x15, 0x00, 0xb9, 0x84, + 0x15, 0x00, 0x6b, 0x85, 0x15, 0x00, 0x78, 0x85, 0x15, 0x00, 0x7c, 0x85, + 0x15, 0x00, 0x7e, 0x85, 0x15, 0x00, 0x7f, 0x85, 0x15, 0x00, 0x8b, 0x86, + 0x15, 0x00, 0xb1, 0x86, 0x15, 0x00, 0xb9, 0x86, 0x15, 0x00, 0x0b, 0x87, + 0x15, 0x00, 0xcb, 0xa5, 0x15, 0x00, 0xeb, 0xa5, 0x15, 0x00, 0x6b, 0xa6, + 0x15, 0x00, 0x8b, 0xa7, 0x15, 0x00, 0xcb, 0xa7, 0x15, 0x00, 0xeb, 0xa7, + 0x15, 0x00, 0xf8, 0xab, 0x15, 0x00, 0xfc, 0xab, 0x15, 0x00, 0xfe, 0xab, + 0x15, 0x00, 0xff, 0xab, 0x15, 0x00, 0xeb, 0xb3, 0x15, 0x00, 0xf0, 0xb3, + 0x15, 0x00, 0xf1, 0xb3, 0x15, 0x00, 0xf7, 0xb3, 0x15, 0x00, 0xf9, 0xb3, + 0x15, 0x00, 0xfd, 0xb3, 0x15, 0x00, 0x78, 0xba, 0x15, 0x00, 0x7c, 0xba, + 0x15, 0x00, 0x7e, 0xba, 0x15, 0x00, 0x7f, 0xba, 0x15, 0x00, 0x8b, 0xbd, + 0x15, 0x00, 0xcb, 0xbd, 0x15, 0x00, 0xeb, 0xbd, 0x15, 0x00, 0x6b, 0xc5, + 0x15, 0x00, 0x78, 0xc5, 0x15, 0x00, 0x7c, 0xc5, 0x15, 0x00, 0x7e, 0xc5, + 0x15, 0x00, 0x7f, 0xc5, 0x15, 0x00, 0xf1, 0xc7, 0x15, 0x00, 0xf9, 0xc7, + 0x15, 0x00, 0x8b, 0xca, 0x15, 0x00, 0x8b, 0xe4, 0x15, 0x00, 0x0b, 0xe5, + 0x15, 0x00, 0x8b, 0xe5, 0x15, 0x00, 0x8b, 0xe6, 0x15, 0x00, 0x0b, 0xf3, + 0x15, 0x00, 0x6b, 0xf3, 0x15, 0x00, 0x78, 0xf3, 0x15, 0x00, 0x7c, 0xf3, + 0x15, 0x00, 0x7e, 0xf3, 0x15, 0x00, 0x7f, 0xf3, 0x15, 0x00, 0x8b, 0xfa, + 0x15, 0x00, 0x0b, 0xfd, 0x15, 0x00, 0x8b, 0xfd, 0x15, 0x00, 0xb8, 0x01, + 0x16, 0x00, 0xbc, 0x01, 0x16, 0x00, 0xbe, 0x01, 0x16, 0x00, 0xbf, 0x01, + 0x16, 0x00, 0xe8, 0x02, 0x16, 0x00, 0xeb, 0x02, 0x16, 0x00, 0xf8, 0x02, + 0x16, 0x00, 0xfc, 0x02, 0x16, 0x00, 0xfe, 0x02, 0x16, 0x00, 0xff, 0x02, + 0x16, 0x00, 0xb8, 0x04, 0x16, 0x00, 0xbc, 0x04, 0x16, 0x00, 0xbe, 0x04, + 0x16, 0x00, 0xbf, 0x04, 0x16, 0x00, 0x38, 0x07, 0x16, 0x00, 0x3c, 0x07, + 0x16, 0x00, 0x3e, 0x07, 0x16, 0x00, 0x3f, 0x07, 0x16, 0x00, 0xb8, 0x07, + 0x16, 0x00, 0xbc, 0x07, 0x16, 0x00, 0xbe, 0x07, 0x16, 0x00, 0xbf, 0x07, + 0x16, 0x00, 0xb8, 0x08, 0x16, 0x00, 0xbc, 0x08, 0x16, 0x00, 0xbe, 0x08, + 0x16, 0x00, 0xbf, 0x08, 0x16, 0x00, 0x38, 0x09, 0x16, 0x00, 0x3c, 0x09, + 0x16, 0x00, 0x3e, 0x09, 0x16, 0x00, 0x3f, 0x09, 0x16, 0x00, 0x58, 0x09, + 0x16, 0x00, 0x5c, 0x09, 0x16, 0x00, 0x5e, 0x09, 0x16, 0x00, 0x5f, 0x09, + 0x16, 0x00, 0x88, 0x0b, 0x16, 0x00, 0x8b, 0x0b, 0x16, 0x00, 0x38, 0x0e, + 0x16, 0x00, 0x3c, 0x0e, 0x16, 0x00, 0x3e, 0x0e, 0x16, 0x00, 0x3f, 0x0e, + 0x16, 0x00, 0x38, 0x0f, 0x16, 0x00, 0x3c, 0x0f, 0x16, 0x00, 0x3e, 0x0f, + 0x16, 0x00, 0x3f, 0x0f, 0x16, 0x00, 0x58, 0x10, 0x16, 0x00, 0x5c, 0x10, + 0x16, 0x00, 0x5e, 0x10, 0x16, 0x00, 0x5f, 0x10, 0x16, 0x00, 0xf8, 0x10, + 0x16, 0x00, 0xfc, 0x10, 0x16, 0x00, 0xfe, 0x10, 0x16, 0x00, 0xff, 0x10, + 0x16, 0x00, 0xf8, 0x13, 0x16, 0x00, 0xfc, 0x13, 0x16, 0x00, 0xfe, 0x13, + 0x16, 0x00, 0xff, 0x13, 0x16, 0x00, 0x88, 0x14, 0x16, 0x00, 0x8b, 0x14, + 0x16, 0x00, 0x58, 0x15, 0x16, 0x00, 0x5c, 0x15, 0x16, 0x00, 0x5e, 0x15, + 0x16, 0x00, 0x5f, 0x15, 0x16, 0x00, 0x48, 0x16, 0x16, 0x00, 0x4b, 0x16, + 0x16, 0x00, 0x8b, 0x16, 0x16, 0x00, 0x48, 0x17, 0x16, 0x00, 0x4b, 0x17, + 0x16, 0x00, 0x88, 0x17, 0x16, 0x00, 0x8b, 0x17, 0x16, 0x00, 0xc8, 0x17, + 0x16, 0x00, 0xcb, 0x17, 0x16, 0x00, 0xe8, 0x17, 0x16, 0x00, 0xeb, 0x17, + 0x16, 0x00, 0xf8, 0x17, 0x16, 0x00, 0xfc, 0x17, 0x16, 0x00, 0xfe, 0x17, + 0x16, 0x00, 0xff, 0x17, 0x16, 0x00, 0x38, 0x19, 0x16, 0x00, 0x3c, 0x19, + 0x16, 0x00, 0x3e, 0x19, 0x16, 0x00, 0x3f, 0x19, 0x16, 0x00, 0x48, 0x1a, + 0x16, 0x00, 0x4b, 0x1a, 0x16, 0x00, 0x58, 0x1a, 0x16, 0x00, 0x5c, 0x1a, + 0x16, 0x00, 0x5e, 0x1a, 0x16, 0x00, 0x5f, 0x1a, 0x16, 0x00, 0xe8, 0x1b, + 0x16, 0x00, 0xeb, 0x1b, 0x16, 0x00, 0x58, 0x1c, 0x16, 0x00, 0x5c, 0x1c, + 0x16, 0x00, 0x5e, 0x1c, 0x16, 0x00, 0x5f, 0x1c, 0x16, 0x00, 0xc8, 0x1f, + 0x16, 0x00, 0xcb, 0x1f, 0x16, 0x00, 0xe8, 0x1f, 0x16, 0x00, 0xeb, 0x1f, + 0x16, 0x00, 0xf8, 0x1f, 0x16, 0x00, 0xfc, 0x1f, 0x16, 0x00, 0xfe, 0x1f, + 0x16, 0x00, 0xff, 0x1f, 0x16, 0x00, 0x38, 0x22, 0x16, 0x00, 0x3c, 0x22, + 0x16, 0x00, 0x3e, 0x22, 0x16, 0x00, 0x3f, 0x22, 0x16, 0x00, 0xe8, 0x23, + 0x16, 0x00, 0xeb, 0x23, 0x16, 0x00, 0xf8, 0x23, 0x16, 0x00, 0xfc, 0x23, + 0x16, 0x00, 0xfe, 0x23, 0x16, 0x00, 0xff, 0x23, 0x16, 0x00, 0x38, 0x25, + 0x16, 0x00, 0x3c, 0x25, 0x16, 0x00, 0x3e, 0x25, 0x16, 0x00, 0x3f, 0x25, + 0x16, 0x00, 0x58, 0x29, 0x16, 0x00, 0x5c, 0x29, 0x16, 0x00, 0x5e, 0x29, + 0x16, 0x00, 0x5f, 0x29, 0x16, 0x00, 0x58, 0x2d, 0x16, 0x00, 0x5c, 0x2d, + 0x16, 0x00, 0x5e, 0x2d, 0x16, 0x00, 0x5f, 0x2d, 0x16, 0x00, 0x58, 0x2e, + 0x16, 0x00, 0x5c, 0x2e, 0x16, 0x00, 0x5e, 0x2e, 0x16, 0x00, 0x5f, 0x2e, + 0x16, 0x00, 0x58, 0x2f, 0x16, 0x00, 0x5c, 0x2f, 0x16, 0x00, 0x5e, 0x2f, + 0x16, 0x00, 0x5f, 0x2f, 0x16, 0x00, 0x36, 0x33, 0x16, 0x00, 0x37, 0x33, + 0x16, 0x00, 0x38, 0x33, 0x16, 0x00, 0x3c, 0x33, 0x16, 0x00, 0x3e, 0x33, + 0x16, 0x00, 0x3f, 0x33, 0x16, 0x00, 0xb8, 0x33, 0x16, 0x00, 0xbc, 0x33, + 0x16, 0x00, 0xbe, 0x33, 0x16, 0x00, 0xbf, 0x33, 0x16, 0x00, 0xe9, 0x33, + 0x16, 0x00, 0xea, 0x33, 0x16, 0x00, 0xf0, 0x33, 0x16, 0x00, 0xf1, 0x33, + 0x16, 0x00, 0xf9, 0x33, 0x16, 0x00, 0xfd, 0x33, 0x16, 0x00, 0xeb, 0x35, + 0x16, 0x00, 0xf7, 0x35, 0x16, 0x00, 0xf8, 0x35, 0x16, 0x00, 0xfc, 0x35, + 0x16, 0x00, 0xfe, 0x35, 0x16, 0x00, 0xff, 0x35, 0x16, 0x00, 0x30, 0x39, + 0x16, 0x00, 0x31, 0x39, 0x16, 0x00, 0x39, 0x39, 0x16, 0x00, 0x3d, 0x39, + 0x16, 0x00, 0x8b, 0x39, 0x16, 0x00, 0x37, 0x3d, 0x16, 0x00, 0x38, 0x3d, + 0x16, 0x00, 0x3c, 0x3d, 0x16, 0x00, 0x3e, 0x3d, 0x16, 0x00, 0x3f, 0x3d, + 0x16, 0x00, 0x30, 0x3f, 0x16, 0x00, 0x31, 0x3f, 0x16, 0x00, 0x39, 0x3f, + 0x16, 0x00, 0x3d, 0x3f, 0x16, 0x00, 0xe6, 0x3f, 0x16, 0x00, 0xe7, 0x3f, + 0x16, 0x00, 0xe8, 0x3f, 0x16, 0x00, 0xeb, 0x3f, 0x16, 0x00, 0xf6, 0x3f, + 0x16, 0x00, 0xf7, 0x3f, 0x16, 0x00, 0xf8, 0x3f, 0x16, 0x00, 0xfc, 0x3f, + 0x16, 0x00, 0xfe, 0x3f, 0x16, 0x00, 0xff, 0x3f, 0x16, 0x00, 0xc7, 0x41, + 0x16, 0x00, 0xcb, 0x41, 0x16, 0x00, 0xf7, 0x41, 0x16, 0x00, 0xf8, 0x41, + 0x16, 0x00, 0xfc, 0x41, 0x16, 0x00, 0xfe, 0x41, 0x16, 0x00, 0xff, 0x41, + 0x16, 0x00, 0xc7, 0x45, 0x16, 0x00, 0xcb, 0x45, 0x16, 0x00, 0xf7, 0x45, + 0x16, 0x00, 0xf8, 0x45, 0x16, 0x00, 0xfc, 0x45, 0x16, 0x00, 0xfe, 0x45, + 0x16, 0x00, 0xff, 0x45, 0x16, 0x00, 0x8b, 0x47, 0x16, 0x00, 0x8b, 0x49, + 0x16, 0x00, 0xcb, 0x49, 0x16, 0x00, 0xeb, 0x49, 0x16, 0x00, 0x4b, 0x52, + 0x16, 0x00, 0xb8, 0x52, 0x16, 0x00, 0xbc, 0x52, 0x16, 0x00, 0xbe, 0x52, + 0x16, 0x00, 0xbf, 0x52, 0x16, 0x00, 0x30, 0x53, 0x16, 0x00, 0x31, 0x53, + 0x16, 0x00, 0x39, 0x53, 0x16, 0x00, 0x3d, 0x53, 0x16, 0x00, 0xeb, 0x53, + 0x16, 0x00, 0xf7, 0x53, 0x16, 0x00, 0xf8, 0x53, 0x16, 0x00, 0xfc, 0x53, + 0x16, 0x00, 0xfe, 0x53, 0x16, 0x00, 0xff, 0x53, 0x16, 0x00, 0x37, 0x59, + 0x16, 0x00, 0x38, 0x59, 0x16, 0x00, 0x3c, 0x59, 0x16, 0x00, 0x3e, 0x59, + 0x16, 0x00, 0x3f, 0x59, 0x16, 0x00, 0x4b, 0x5c, 0x16, 0x00, 0xb8, 0x5c, + 0x16, 0x00, 0xbc, 0x5c, 0x16, 0x00, 0xbe, 0x5c, 0x16, 0x00, 0xbf, 0x5c, + 0x16, 0x00, 0x30, 0x5d, 0x16, 0x00, 0x31, 0x5d, 0x16, 0x00, 0x39, 0x5d, + 0x16, 0x00, 0x3d, 0x5d, 0x16, 0x00, 0xb8, 0x5e, 0x16, 0x00, 0xbc, 0x5e, + 0x16, 0x00, 0xbe, 0x5e, 0x16, 0x00, 0xbf, 0x5e, 0x16, 0x00, 0x37, 0x5f, + 0x16, 0x00, 0x38, 0x5f, 0x16, 0x00, 0x3c, 0x5f, 0x16, 0x00, 0x3e, 0x5f, + 0x16, 0x00, 0x3f, 0x5f, 0x16, 0x00, 0xb8, 0x5f, 0x16, 0x00, 0xbc, 0x5f, + 0x16, 0x00, 0xbe, 0x5f, 0x16, 0x00, 0xbf, 0x5f, 0x16, 0x00, 0xf0, 0x5f, + 0x16, 0x00, 0xf1, 0x5f, 0x16, 0x00, 0xf9, 0x5f, 0x16, 0x00, 0xfd, 0x5f, + 0x16, 0x00, 0xeb, 0x64, 0x16, 0x00, 0xeb, 0x66, 0x16, 0x00, 0xcb, 0x6a, + 0x16, 0x00, 0xeb, 0x6a, 0x16, 0x00, 0xf8, 0x6a, 0x16, 0x00, 0xfc, 0x6a, + 0x16, 0x00, 0xfe, 0x6a, 0x16, 0x00, 0xff, 0x6a, 0x16, 0x00, 0x8b, 0x7a, + 0x16, 0x00, 0xcb, 0x7a, 0x16, 0x00, 0xeb, 0x7a, 0x16, 0x00, 0xf8, 0x7c, + 0x16, 0x00, 0xfc, 0x7c, 0x16, 0x00, 0xfe, 0x7c, 0x16, 0x00, 0xff, 0x7c, + 0x16, 0x00, 0xf1, 0x80, 0x16, 0x00, 0xf9, 0x80, 0x16, 0x00, 0xf7, 0x81, + 0x16, 0x00, 0xf1, 0x82, 0x16, 0x00, 0xf9, 0x82, 0x16, 0x00, 0x8b, 0x84, + 0x16, 0x00, 0x8b, 0x86, 0x16, 0x00, 0xf7, 0x87, 0x16, 0x00, 0x8b, 0x8e, + 0x16, 0x00, 0xbb, 0x8e, 0x16, 0x00, 0xf1, 0x8f, 0x16, 0x00, 0xf7, 0x8f, + 0x16, 0x00, 0xf9, 0x8f, 0x16, 0x00, 0xfb, 0x95, 0x16, 0x00, 0xeb, 0xa4, + 0x16, 0x00, 0xf8, 0xa4, 0x16, 0x00, 0xfc, 0xa4, 0x16, 0x00, 0xfe, 0xa4, + 0x16, 0x00, 0xff, 0xa4, 0x16, 0x00, 0xeb, 0xa6, 0x16, 0x00, 0xf0, 0xb8, + 0x16, 0x00, 0xf1, 0xb8, 0x16, 0x00, 0xf7, 0xb8, 0x16, 0x00, 0xf9, 0xb8, + 0x16, 0x00, 0xfd, 0xb8, 0x16, 0x00, 0xbb, 0xb9, 0x16, 0x00, 0xf0, 0xbc, + 0x16, 0x00, 0xf1, 0xbc, 0x16, 0x00, 0xf7, 0xbc, 0x16, 0x00, 0xf9, 0xbc, + 0x16, 0x00, 0xfd, 0xbc, 0x16, 0x00, 0xbb, 0xbd, 0x16, 0x00, 0x30, 0xc2, + 0x16, 0x00, 0x88, 0xc2, 0x16, 0x00, 0x8b, 0xc2, 0x16, 0x00, 0xe6, 0xc3, + 0x16, 0x00, 0xf6, 0xc3, 0x16, 0x00, 0xf7, 0xc3, 0x16, 0x00, 0xf8, 0xc3, + 0x16, 0x00, 0xfc, 0xc3, 0x16, 0x00, 0xfe, 0xc3, 0x16, 0x00, 0xff, 0xc3, + 0x16, 0x00, 0xe6, 0xc5, 0x16, 0x00, 0xf6, 0xc5, 0x16, 0x00, 0xf7, 0xc5, + 0x16, 0x00, 0xf8, 0xc5, 0x16, 0x00, 0xfc, 0xc5, 0x16, 0x00, 0xfe, 0xc5, + 0x16, 0x00, 0xff, 0xc5, 0x16, 0x00, 0xf0, 0xc9, 0x16, 0x00, 0xf1, 0xc9, + 0x16, 0x00, 0xf9, 0xc9, 0x16, 0x00, 0xfd, 0xc9, 0x16, 0x00, 0xf0, 0xcc, + 0x16, 0x00, 0xf1, 0xcc, 0x16, 0x00, 0xf9, 0xcc, 0x16, 0x00, 0xfd, 0xcc, + 0x16, 0x00, 0xf0, 0xce, 0x16, 0x00, 0xf1, 0xce, 0x16, 0x00, 0xf9, 0xce, + 0x16, 0x00, 0xfd, 0xce, 0x16, 0x00, 0x58, 0xd2, 0x16, 0x00, 0x5c, 0xd2, + 0x16, 0x00, 0x5e, 0xd2, 0x16, 0x00, 0x5f, 0xd2, 0x16, 0x00, 0xf8, 0xd5, + 0x16, 0x00, 0xfc, 0xd5, 0x16, 0x00, 0xfe, 0xd5, 0x16, 0x00, 0xff, 0xd5, + 0x16, 0x00, 0xf8, 0xd9, 0x16, 0x00, 0xfc, 0xd9, 0x16, 0x00, 0xfe, 0xd9, + 0x16, 0x00, 0xff, 0xd9, 0x16, 0x00, 0xf8, 0xdd, 0x16, 0x00, 0xfc, 0xdd, + 0x16, 0x00, 0xfe, 0xdd, 0x16, 0x00, 0xff, 0xdd, 0x16, 0x00, 0x58, 0xde, + 0x16, 0x00, 0x5c, 0xde, 0x16, 0x00, 0x5e, 0xde, 0x16, 0x00, 0x5f, 0xde, + 0x16, 0x00, 0x30, 0xe5, 0x16, 0x00, 0x30, 0xe9, 0x16, 0x00, 0x51, 0xe9, + 0x16, 0x00, 0x56, 0xe9, 0x16, 0x00, 0x57, 0xe9, 0x16, 0x00, 0x58, 0xe9, + 0x16, 0x00, 0x5c, 0xe9, 0x16, 0x00, 0x5e, 0xe9, 0x16, 0x00, 0x5f, 0xe9, + 0x16, 0x00, 0x30, 0xec, 0x16, 0x00, 0x48, 0xec, 0x16, 0x00, 0x4b, 0xec, + 0x16, 0x00, 0x50, 0xec, 0x16, 0x00, 0x30, 0xed, 0x16, 0x00, 0x51, 0xee, + 0x16, 0x00, 0x56, 0xee, 0x16, 0x00, 0x57, 0xee, 0x16, 0x00, 0x58, 0xee, + 0x16, 0x00, 0x5c, 0xee, 0x16, 0x00, 0x5e, 0xee, 0x16, 0x00, 0x5f, 0xee, + 0x16, 0x00, 0x88, 0xee, 0x16, 0x00, 0x8b, 0xee, 0x16, 0x00, 0x51, 0xef, + 0x16, 0x00, 0x56, 0xef, 0x16, 0x00, 0x57, 0xef, 0x16, 0x00, 0x58, 0xef, + 0x16, 0x00, 0x5c, 0xef, 0x16, 0x00, 0x5e, 0xef, 0x16, 0x00, 0x5f, 0xef, + 0x16, 0x00, 0xf0, 0xef, 0x16, 0x00, 0xf1, 0xef, 0x16, 0x00, 0xf9, 0xef, + 0x16, 0x00, 0xfd, 0xef, 0x16, 0x00, 0x48, 0xf2, 0x16, 0x00, 0x4b, 0xf2, + 0x16, 0x00, 0x50, 0xf2, 0x16, 0x00, 0x30, 0xf3, 0x16, 0x00, 0xe6, 0xf3, + 0x16, 0x00, 0xf0, 0xf3, 0x16, 0x00, 0x30, 0xf9, 0x16, 0x00, 0x4b, 0xfc, + 0x16, 0x00, 0x30, 0xfd, 0x16, 0x00, 0x48, 0xfe, 0x16, 0x00, 0x4b, 0xfe, + 0x16, 0x00, 0x50, 0xfe, 0x16, 0x00, 0x59, 0xfe, 0x16, 0x00, 0x5d, 0xfe, + 0x16, 0x00, 0x88, 0xff, 0x16, 0x00, 0x8b, 0xff, 0x16, 0x00, 0xc6, 0xff, + 0x16, 0x00, 0xe6, 0xff, 0x16, 0x00, 0xf6, 0xff, 0x16, 0x00, 0xf7, 0xff, + 0x16, 0x00, 0xf8, 0xff, 0x16, 0x00, 0xfc, 0xff, 0x16, 0x00, 0xfe, 0xff, + 0x16, 0x00, 0xff, 0xff, 0x16, 0x00, 0xb3, 0x00, 0x17, 0x00, 0xbb, 0x00, + 0x17, 0x00, 0x33, 0x01, 0x17, 0x00, 0x3b, 0x01, 0x17, 0x00, 0x53, 0x01, + 0x17, 0x00, 0x54, 0x01, 0x17, 0x00, 0x55, 0x01, 0x17, 0x00, 0x5b, 0x01, + 0x17, 0x00, 0x34, 0x02, 0x17, 0x00, 0x35, 0x02, 0x17, 0x00, 0x38, 0x02, + 0x17, 0x00, 0x3c, 0x02, 0x17, 0x00, 0x3e, 0x02, 0x17, 0x00, 0x3f, 0x02, + 0x17, 0x00, 0x34, 0x03, 0x17, 0x00, 0x35, 0x03, 0x17, 0x00, 0x38, 0x03, + 0x17, 0x00, 0x3c, 0x03, 0x17, 0x00, 0x3e, 0x03, 0x17, 0x00, 0x3f, 0x03, + 0x17, 0x00, 0xe3, 0x03, 0x17, 0x00, 0xf3, 0x03, 0x17, 0x00, 0xfb, 0x03, + 0x17, 0x00, 0x38, 0x04, 0x17, 0x00, 0x3c, 0x04, 0x17, 0x00, 0x3e, 0x04, + 0x17, 0x00, 0x3f, 0x04, 0x17, 0x00, 0xc3, 0x05, 0x17, 0x00, 0xc4, 0x05, + 0x17, 0x00, 0xc5, 0x05, 0x17, 0x00, 0xc8, 0x05, 0x17, 0x00, 0xcb, 0x05, + 0x17, 0x00, 0xcc, 0x05, 0x17, 0x00, 0xce, 0x05, 0x17, 0x00, 0xcf, 0x05, + 0x17, 0x00, 0xf4, 0x05, 0x17, 0x00, 0xf5, 0x05, 0x17, 0x00, 0xf8, 0x05, + 0x17, 0x00, 0xfc, 0x05, 0x17, 0x00, 0xfe, 0x05, 0x17, 0x00, 0xff, 0x05, + 0x17, 0x00, 0xe8, 0x06, 0x17, 0x00, 0xeb, 0x06, 0x17, 0x00, 0xf8, 0x06, + 0x17, 0x00, 0xfc, 0x06, 0x17, 0x00, 0xfe, 0x06, 0x17, 0x00, 0xff, 0x06, + 0x17, 0x00, 0x83, 0x07, 0x17, 0x00, 0x84, 0x07, 0x17, 0x00, 0x85, 0x07, + 0x17, 0x00, 0x83, 0x08, 0x17, 0x00, 0x84, 0x08, 0x17, 0x00, 0x85, 0x08, + 0x17, 0x00, 0xb3, 0x08, 0x17, 0x00, 0xbb, 0x08, 0x17, 0x00, 0x58, 0x09, + 0x17, 0x00, 0x5c, 0x09, 0x17, 0x00, 0x5e, 0x09, 0x17, 0x00, 0x5f, 0x09, + 0x17, 0x00, 0x53, 0x0a, 0x17, 0x00, 0x54, 0x0a, 0x17, 0x00, 0x55, 0x0a, + 0x17, 0x00, 0x5b, 0x0a, 0x17, 0x00, 0x88, 0x0b, 0x17, 0x00, 0x8b, 0x0b, + 0x17, 0x00, 0x8c, 0x0b, 0x17, 0x00, 0x8e, 0x0b, 0x17, 0x00, 0x8f, 0x0b, + 0x17, 0x00, 0x53, 0x0d, 0x17, 0x00, 0x54, 0x0d, 0x17, 0x00, 0x55, 0x0d, + 0x17, 0x00, 0x5b, 0x0d, 0x17, 0x00, 0x33, 0x0f, 0x17, 0x00, 0x3b, 0x0f, + 0x17, 0x00, 0xe4, 0x0f, 0x17, 0x00, 0xe5, 0x0f, 0x17, 0x00, 0xe8, 0x0f, + 0x17, 0x00, 0xeb, 0x0f, 0x17, 0x00, 0xec, 0x0f, 0x17, 0x00, 0xee, 0x0f, + 0x17, 0x00, 0xef, 0x0f, 0x17, 0x00, 0xf4, 0x0f, 0x17, 0x00, 0xf5, 0x0f, + 0x17, 0x00, 0xf8, 0x0f, 0x17, 0x00, 0xfc, 0x0f, 0x17, 0x00, 0xfe, 0x0f, + 0x17, 0x00, 0xff, 0x0f, 0x17, 0x00, 0x33, 0x11, 0x17, 0x00, 0x3b, 0x11, + 0x17, 0x00, 0x53, 0x11, 0x17, 0x00, 0x54, 0x11, 0x17, 0x00, 0x55, 0x11, + 0x17, 0x00, 0x5b, 0x11, 0x17, 0x00, 0xb3, 0x11, 0x17, 0x00, 0xbb, 0x11, + 0x17, 0x00, 0x88, 0x14, 0x17, 0x00, 0x8b, 0x14, 0x17, 0x00, 0x8c, 0x14, + 0x17, 0x00, 0x8e, 0x14, 0x17, 0x00, 0x8f, 0x14, 0x17, 0x00, 0xb4, 0x14, + 0x17, 0x00, 0xb5, 0x14, 0x17, 0x00, 0xb8, 0x14, 0x17, 0x00, 0xbc, 0x14, + 0x17, 0x00, 0xbe, 0x14, 0x17, 0x00, 0xbf, 0x14, 0x17, 0x00, 0x58, 0x15, + 0x17, 0x00, 0x58, 0x16, 0x17, 0x00, 0x5c, 0x16, 0x17, 0x00, 0x5e, 0x16, + 0x17, 0x00, 0x5f, 0x16, 0x17, 0x00, 0x43, 0x17, 0x17, 0x00, 0x44, 0x17, + 0x17, 0x00, 0x45, 0x17, 0x17, 0x00, 0x48, 0x17, 0x17, 0x00, 0x4b, 0x17, + 0x17, 0x00, 0x4c, 0x17, 0x17, 0x00, 0x4e, 0x17, 0x17, 0x00, 0x4f, 0x17, + 0x17, 0x00, 0x53, 0x17, 0x17, 0x00, 0x54, 0x17, 0x17, 0x00, 0x55, 0x17, + 0x17, 0x00, 0x5b, 0x17, 0x17, 0x00, 0x83, 0x17, 0x17, 0x00, 0x84, 0x17, + 0x17, 0x00, 0x85, 0x17, 0x17, 0x00, 0xe3, 0x17, 0x17, 0x00, 0xf3, 0x17, + 0x17, 0x00, 0xfb, 0x17, 0x17, 0x00, 0xe8, 0x18, 0x17, 0x00, 0xeb, 0x18, + 0x17, 0x00, 0xf3, 0x19, 0x17, 0x00, 0xfb, 0x19, 0x17, 0x00, 0xb3, 0x1a, + 0x17, 0x00, 0xbb, 0x1a, 0x17, 0x00, 0xc8, 0x1a, 0x17, 0x00, 0xcb, 0x1a, + 0x17, 0x00, 0xe8, 0x1a, 0x17, 0x00, 0xeb, 0x1a, 0x17, 0x00, 0xf8, 0x1a, + 0x17, 0x00, 0xfc, 0x1a, 0x17, 0x00, 0xfe, 0x1a, 0x17, 0x00, 0xff, 0x1a, + 0x17, 0x00, 0xe8, 0x1c, 0x17, 0x00, 0xeb, 0x1c, 0x17, 0x00, 0xf8, 0x1c, + 0x17, 0x00, 0xfc, 0x1c, 0x17, 0x00, 0xfe, 0x1c, 0x17, 0x00, 0xff, 0x1c, + 0x17, 0x00, 0xf3, 0x1d, 0x17, 0x00, 0xfb, 0x1d, 0x17, 0x00, 0x38, 0x1e, + 0x17, 0x00, 0x3c, 0x1e, 0x17, 0x00, 0x3e, 0x1e, 0x17, 0x00, 0x3f, 0x1e, + 0x17, 0x00, 0x33, 0x1f, 0x17, 0x00, 0x3b, 0x1f, 0x17, 0x00, 0xe8, 0x23, + 0x17, 0x00, 0xeb, 0x23, 0x17, 0x00, 0xf8, 0x23, 0x17, 0x00, 0xfc, 0x23, + 0x17, 0x00, 0xfe, 0x23, 0x17, 0x00, 0xff, 0x23, 0x17, 0x00, 0x38, 0x25, + 0x17, 0x00, 0x3c, 0x25, 0x17, 0x00, 0x3e, 0x25, 0x17, 0x00, 0x3f, 0x25, + 0x17, 0x00, 0x36, 0x33, 0x17, 0x00, 0x37, 0x33, 0x17, 0x00, 0x38, 0x33, + 0x17, 0x00, 0x3c, 0x33, 0x17, 0x00, 0x3e, 0x33, 0x17, 0x00, 0x3f, 0x33, + 0x17, 0x00, 0xb8, 0x33, 0x17, 0x00, 0xbc, 0x33, 0x17, 0x00, 0xbe, 0x33, + 0x17, 0x00, 0xbf, 0x33, 0x17, 0x00, 0xe9, 0x33, 0x17, 0x00, 0xea, 0x33, + 0x17, 0x00, 0xf0, 0x33, 0x17, 0x00, 0xf1, 0x33, 0x17, 0x00, 0xf9, 0x33, + 0x17, 0x00, 0xfd, 0x33, 0x17, 0x00, 0x8b, 0x35, 0x17, 0x00, 0x30, 0x39, + 0x17, 0x00, 0x31, 0x39, 0x17, 0x00, 0x39, 0x39, 0x17, 0x00, 0x3d, 0x39, + 0x17, 0x00, 0x8b, 0x39, 0x17, 0x00, 0x37, 0x3d, 0x17, 0x00, 0x38, 0x3d, + 0x17, 0x00, 0x3c, 0x3d, 0x17, 0x00, 0x3e, 0x3d, 0x17, 0x00, 0x3f, 0x3d, + 0x17, 0x00, 0x30, 0x3f, 0x17, 0x00, 0x31, 0x3f, 0x17, 0x00, 0x39, 0x3f, + 0x17, 0x00, 0x3d, 0x3f, 0x17, 0x00, 0xe6, 0x3f, 0x17, 0x00, 0xe7, 0x3f, + 0x17, 0x00, 0xe8, 0x3f, 0x17, 0x00, 0xeb, 0x3f, 0x17, 0x00, 0xf6, 0x3f, + 0x17, 0x00, 0xf7, 0x3f, 0x17, 0x00, 0xf8, 0x3f, 0x17, 0x00, 0xfc, 0x3f, + 0x17, 0x00, 0xfe, 0x3f, 0x17, 0x00, 0xff, 0x3f, 0x17, 0x00, 0x47, 0x40, + 0x17, 0x00, 0x4b, 0x40, 0x17, 0x00, 0xb0, 0x40, 0x17, 0x00, 0xb1, 0x40, + 0x17, 0x00, 0xb9, 0x40, 0x17, 0x00, 0xbd, 0x40, 0x17, 0x00, 0x30, 0x41, + 0x17, 0x00, 0x31, 0x41, 0x17, 0x00, 0x39, 0x41, 0x17, 0x00, 0x3d, 0x41, + 0x17, 0x00, 0x37, 0x42, 0x17, 0x00, 0x38, 0x42, 0x17, 0x00, 0x3c, 0x42, + 0x17, 0x00, 0x3e, 0x42, 0x17, 0x00, 0x3f, 0x42, 0x17, 0x00, 0x37, 0x43, + 0x17, 0x00, 0x38, 0x43, 0x17, 0x00, 0x3c, 0x43, 0x17, 0x00, 0x3e, 0x43, + 0x17, 0x00, 0x3f, 0x43, 0x17, 0x00, 0xb8, 0x43, 0x17, 0x00, 0xbc, 0x43, + 0x17, 0x00, 0xbe, 0x43, 0x17, 0x00, 0xbf, 0x43, 0x17, 0x00, 0xf0, 0x43, + 0x17, 0x00, 0xf1, 0x43, 0x17, 0x00, 0xf9, 0x43, 0x17, 0x00, 0xfd, 0x43, + 0x17, 0x00, 0xc7, 0x45, 0x17, 0x00, 0xcb, 0x45, 0x17, 0x00, 0xf7, 0x45, + 0x17, 0x00, 0xf8, 0x45, 0x17, 0x00, 0xfc, 0x45, 0x17, 0x00, 0xfe, 0x45, + 0x17, 0x00, 0xff, 0x45, 0x17, 0x00, 0x8b, 0x47, 0x17, 0x00, 0x8b, 0x48, + 0x17, 0x00, 0x8b, 0x4c, 0x17, 0x00, 0xb8, 0x4c, 0x17, 0x00, 0xbc, 0x4c, + 0x17, 0x00, 0xbe, 0x4c, 0x17, 0x00, 0xbf, 0x4c, 0x17, 0x00, 0x4b, 0x4e, + 0x17, 0x00, 0x8b, 0x4e, 0x17, 0x00, 0x4b, 0x4f, 0x17, 0x00, 0x8b, 0x4f, + 0x17, 0x00, 0xcb, 0x4f, 0x17, 0x00, 0xeb, 0x4f, 0x17, 0x00, 0xf0, 0x4f, + 0x17, 0x00, 0xf1, 0x4f, 0x17, 0x00, 0xf7, 0x4f, 0x17, 0x00, 0xf9, 0x4f, + 0x17, 0x00, 0xfd, 0x4f, 0x17, 0x00, 0x4b, 0x52, 0x17, 0x00, 0xb8, 0x52, + 0x17, 0x00, 0xbc, 0x52, 0x17, 0x00, 0xbe, 0x52, 0x17, 0x00, 0xbf, 0x52, + 0x17, 0x00, 0x30, 0x53, 0x17, 0x00, 0x31, 0x53, 0x17, 0x00, 0x39, 0x53, + 0x17, 0x00, 0x3d, 0x53, 0x17, 0x00, 0xeb, 0x53, 0x17, 0x00, 0xf7, 0x53, + 0x17, 0x00, 0xf8, 0x53, 0x17, 0x00, 0xfc, 0x53, 0x17, 0x00, 0xfe, 0x53, + 0x17, 0x00, 0xff, 0x53, 0x17, 0x00, 0x37, 0x59, 0x17, 0x00, 0x38, 0x59, + 0x17, 0x00, 0x3c, 0x59, 0x17, 0x00, 0x3e, 0x59, 0x17, 0x00, 0x3f, 0x59, + 0x17, 0x00, 0x4b, 0x5c, 0x17, 0x00, 0xb8, 0x5c, 0x17, 0x00, 0xbc, 0x5c, + 0x17, 0x00, 0xbe, 0x5c, 0x17, 0x00, 0xbf, 0x5c, 0x17, 0x00, 0x30, 0x5d, + 0x17, 0x00, 0x31, 0x5d, 0x17, 0x00, 0x39, 0x5d, 0x17, 0x00, 0x3d, 0x5d, + 0x17, 0x00, 0xb8, 0x5e, 0x17, 0x00, 0xbc, 0x5e, 0x17, 0x00, 0xbe, 0x5e, + 0x17, 0x00, 0xbf, 0x5e, 0x17, 0x00, 0x37, 0x5f, 0x17, 0x00, 0x38, 0x5f, + 0x17, 0x00, 0x3c, 0x5f, 0x17, 0x00, 0x3e, 0x5f, 0x17, 0x00, 0x3f, 0x5f, + 0x17, 0x00, 0xb8, 0x5f, 0x17, 0x00, 0xbc, 0x5f, 0x17, 0x00, 0xbe, 0x5f, + 0x17, 0x00, 0xbf, 0x5f, 0x17, 0x00, 0xf0, 0x5f, 0x17, 0x00, 0xf1, 0x5f, + 0x17, 0x00, 0xf9, 0x5f, 0x17, 0x00, 0xfd, 0x5f, 0x17, 0x00, 0xeb, 0x64, + 0x17, 0x00, 0xeb, 0x66, 0x17, 0x00, 0xcb, 0x6a, 0x17, 0x00, 0xeb, 0x6a, + 0x17, 0x00, 0xf8, 0x6a, 0x17, 0x00, 0xfc, 0x6a, 0x17, 0x00, 0xfe, 0x6a, + 0x17, 0x00, 0xff, 0x6a, 0x17, 0x00, 0x8b, 0x7a, 0x17, 0x00, 0xcb, 0x7a, + 0x17, 0x00, 0xeb, 0x7a, 0x17, 0x00, 0xf8, 0x7c, 0x17, 0x00, 0xfc, 0x7c, + 0x17, 0x00, 0xfe, 0x7c, 0x17, 0x00, 0xff, 0x7c, 0x17, 0x00, 0xc0, 0x81, + 0x17, 0x00, 0xc1, 0x81, 0x17, 0x00, 0xc2, 0x81, 0x17, 0x00, 0xc9, 0x81, + 0x17, 0x00, 0xca, 0x81, 0x17, 0x00, 0xcd, 0x81, 0x17, 0x00, 0xf0, 0x81, + 0x17, 0x00, 0xf1, 0x81, 0x17, 0x00, 0xf3, 0x81, 0x17, 0x00, 0xf9, 0x81, + 0x17, 0x00, 0xfb, 0x81, 0x17, 0x00, 0xfd, 0x81, 0x17, 0x00, 0x83, 0x83, + 0x17, 0x00, 0x84, 0x83, 0x17, 0x00, 0x85, 0x83, 0x17, 0x00, 0x30, 0x84, + 0x17, 0x00, 0x31, 0x84, 0x17, 0x00, 0x39, 0x84, 0x17, 0x00, 0x3d, 0x84, + 0x17, 0x00, 0xe6, 0x84, 0x17, 0x00, 0xe7, 0x84, 0x17, 0x00, 0xe8, 0x84, + 0x17, 0x00, 0xeb, 0x84, 0x17, 0x00, 0xf6, 0x84, 0x17, 0x00, 0xf7, 0x84, + 0x17, 0x00, 0xf8, 0x84, 0x17, 0x00, 0xfc, 0x84, 0x17, 0x00, 0xfe, 0x84, + 0x17, 0x00, 0xff, 0x84, 0x17, 0x00, 0xb3, 0x85, 0x17, 0x00, 0xbb, 0x85, + 0x17, 0x00, 0xc3, 0x85, 0x17, 0x00, 0xc4, 0x85, 0x17, 0x00, 0xc5, 0x85, + 0x17, 0x00, 0xc6, 0x85, 0x17, 0x00, 0xc7, 0x85, 0x17, 0x00, 0xc8, 0x85, + 0x17, 0x00, 0xcb, 0x85, 0x17, 0x00, 0xcc, 0x85, 0x17, 0x00, 0xce, 0x85, + 0x17, 0x00, 0xcf, 0x85, 0x17, 0x00, 0xf2, 0x85, 0x17, 0x00, 0xf4, 0x85, + 0x17, 0x00, 0xf5, 0x85, 0x17, 0x00, 0xf6, 0x85, 0x17, 0x00, 0xf7, 0x85, + 0x17, 0x00, 0xf8, 0x85, 0x17, 0x00, 0xfa, 0x85, 0x17, 0x00, 0xfc, 0x85, + 0x17, 0x00, 0xfe, 0x85, 0x17, 0x00, 0xff, 0x85, 0x17, 0x00, 0xe9, 0x86, + 0x17, 0x00, 0xea, 0x86, 0x17, 0x00, 0xf0, 0x86, 0x17, 0x00, 0xf1, 0x86, + 0x17, 0x00, 0xf9, 0x86, 0x17, 0x00, 0xfd, 0x86, 0x17, 0x00, 0x83, 0x87, + 0x17, 0x00, 0x84, 0x87, 0x17, 0x00, 0x85, 0x87, 0x17, 0x00, 0x86, 0x87, + 0x17, 0x00, 0x87, 0x87, 0x17, 0x00, 0x89, 0x87, 0x17, 0x00, 0x8a, 0x87, + 0x17, 0x00, 0x8d, 0x87, 0x17, 0x00, 0xf7, 0x89, 0x17, 0x00, 0x52, 0x8a, + 0x17, 0x00, 0x58, 0x8a, 0x17, 0x00, 0x5a, 0x8a, 0x17, 0x00, 0x5c, 0x8a, + 0x17, 0x00, 0x5e, 0x8a, 0x17, 0x00, 0x5f, 0x8a, 0x17, 0x00, 0xeb, 0x8a, + 0x17, 0x00, 0xf7, 0x8a, 0x17, 0x00, 0xf8, 0x8a, 0x17, 0x00, 0xfc, 0x8a, + 0x17, 0x00, 0xfe, 0x8a, 0x17, 0x00, 0xff, 0x8a, 0x17, 0x00, 0x58, 0x8b, + 0x17, 0x00, 0x5c, 0x8b, 0x17, 0x00, 0x5e, 0x8b, 0x17, 0x00, 0x5f, 0x8b, + 0x17, 0x00, 0x80, 0x8b, 0x17, 0x00, 0x81, 0x8b, 0x17, 0x00, 0x82, 0x8b, + 0x17, 0x00, 0x88, 0x8b, 0x17, 0x00, 0x8b, 0x8b, 0x17, 0x00, 0x8c, 0x8b, + 0x17, 0x00, 0x8e, 0x8b, 0x17, 0x00, 0x8f, 0x8b, 0x17, 0x00, 0xf1, 0x8d, + 0x17, 0x00, 0xf9, 0x8d, 0x17, 0x00, 0x88, 0x8f, 0x17, 0x00, 0x8b, 0x8f, + 0x17, 0x00, 0x8c, 0x8f, 0x17, 0x00, 0x8e, 0x8f, 0x17, 0x00, 0x8f, 0x8f, + 0x17, 0x00, 0xf4, 0x93, 0x17, 0x00, 0xf5, 0x93, 0x17, 0x00, 0xf8, 0x93, + 0x17, 0x00, 0xfc, 0x93, 0x17, 0x00, 0xfe, 0x93, 0x17, 0x00, 0xff, 0x93, + 0x17, 0x00, 0x34, 0x99, 0x17, 0x00, 0x35, 0x99, 0x17, 0x00, 0x38, 0x99, + 0x17, 0x00, 0x3c, 0x99, 0x17, 0x00, 0x3e, 0x99, 0x17, 0x00, 0x3f, 0x99, + 0x17, 0x00, 0xc3, 0x9f, 0x17, 0x00, 0xc4, 0x9f, 0x17, 0x00, 0xc5, 0x9f, + 0x17, 0x00, 0xc8, 0x9f, 0x17, 0x00, 0xcb, 0x9f, 0x17, 0x00, 0xcc, 0x9f, + 0x17, 0x00, 0xce, 0x9f, 0x17, 0x00, 0xcf, 0x9f, 0x17, 0x00, 0xe4, 0x9f, + 0x17, 0x00, 0xe5, 0x9f, 0x17, 0x00, 0xe8, 0x9f, 0x17, 0x00, 0xeb, 0x9f, + 0x17, 0x00, 0xec, 0x9f, 0x17, 0x00, 0xee, 0x9f, 0x17, 0x00, 0xef, 0x9f, + 0x17, 0x00, 0xf4, 0x9f, 0x17, 0x00, 0xf5, 0x9f, 0x17, 0x00, 0xf8, 0x9f, + 0x17, 0x00, 0xfc, 0x9f, 0x17, 0x00, 0xfe, 0x9f, 0x17, 0x00, 0xff, 0x9f, + 0x17, 0x00, 0x58, 0xa6, 0x17, 0x00, 0x5c, 0xa6, 0x17, 0x00, 0x5e, 0xa6, + 0x17, 0x00, 0x5f, 0xa6, 0x17, 0x00, 0xf8, 0xa9, 0x17, 0x00, 0xfc, 0xa9, + 0x17, 0x00, 0xfe, 0xa9, 0x17, 0x00, 0xff, 0xa9, 0x17, 0x00, 0x88, 0xab, + 0x17, 0x00, 0x8b, 0xab, 0x17, 0x00, 0xf8, 0xad, 0x17, 0x00, 0xfc, 0xad, + 0x17, 0x00, 0xfe, 0xad, 0x17, 0x00, 0xff, 0xad, 0x17, 0x00, 0xf0, 0xb1, + 0x17, 0x00, 0xf1, 0xb1, 0x17, 0x00, 0xf9, 0xb1, 0x17, 0x00, 0xfd, 0xb1, + 0x17, 0x00, 0x58, 0xb2, 0x17, 0x00, 0x5c, 0xb2, 0x17, 0x00, 0x5e, 0xb2, + 0x17, 0x00, 0x5f, 0xb2, 0x17, 0x00, 0xeb, 0xb5, 0x17, 0x00, 0xf7, 0xb5, + 0x17, 0x00, 0xf8, 0xb5, 0x17, 0x00, 0xfc, 0xb5, 0x17, 0x00, 0xfe, 0xb5, + 0x17, 0x00, 0xff, 0xb5, 0x17, 0x00, 0x88, 0xb7, 0x17, 0x00, 0x8b, 0xb7, + 0x17, 0x00, 0xeb, 0xb9, 0x17, 0x00, 0xf7, 0xb9, 0x17, 0x00, 0xf8, 0xb9, + 0x17, 0x00, 0xfc, 0xb9, 0x17, 0x00, 0xfe, 0xb9, 0x17, 0x00, 0xff, 0xb9, + 0x17, 0x00, 0x58, 0xba, 0x17, 0x00, 0x5c, 0xba, 0x17, 0x00, 0x5e, 0xba, + 0x17, 0x00, 0x5f, 0xba, 0x17, 0x00, 0x88, 0xbb, 0x17, 0x00, 0x8b, 0xbb, + 0x17, 0x00, 0xb8, 0xbd, 0x17, 0x00, 0xbc, 0xbd, 0x17, 0x00, 0xbe, 0xbd, + 0x17, 0x00, 0xbf, 0xbd, 0x17, 0x00, 0xf0, 0xbd, 0x17, 0x00, 0xf1, 0xbd, + 0x17, 0x00, 0xf9, 0xbd, 0x17, 0x00, 0xfd, 0xbd, 0x17, 0x00, 0x50, 0xbe, + 0x17, 0x00, 0x51, 0xbe, 0x17, 0x00, 0x56, 0xbe, 0x17, 0x00, 0x57, 0xbe, + 0x17, 0x00, 0x59, 0xbe, 0x17, 0x00, 0x5d, 0xbe, 0x17, 0x00, 0x88, 0xbf, + 0x17, 0x00, 0x8b, 0xbf, 0x17, 0x00, 0xb4, 0xc2, 0x17, 0x00, 0xb5, 0xc2, + 0x17, 0x00, 0xb8, 0xc2, 0x17, 0x00, 0xbc, 0xc2, 0x17, 0x00, 0xbe, 0xc2, + 0x17, 0x00, 0xbf, 0xc2, 0x17, 0x00, 0xe3, 0xc3, 0x17, 0x00, 0xe9, 0xc3, + 0x17, 0x00, 0xea, 0xc3, 0x17, 0x00, 0xed, 0xc3, 0x17, 0x00, 0xf0, 0xc3, + 0x17, 0x00, 0xf1, 0xc3, 0x17, 0x00, 0xf3, 0xc3, 0x17, 0x00, 0xf9, 0xc3, + 0x17, 0x00, 0xfb, 0xc3, 0x17, 0x00, 0xfd, 0xc3, 0x17, 0x00, 0x30, 0xc5, + 0x17, 0x00, 0x31, 0xc5, 0x17, 0x00, 0x33, 0xc5, 0x17, 0x00, 0x39, 0xc5, + 0x17, 0x00, 0x3b, 0xc5, 0x17, 0x00, 0x3d, 0xc5, 0x17, 0x00, 0x58, 0xc5, + 0x17, 0x00, 0x5c, 0xc5, 0x17, 0x00, 0x5e, 0xc5, 0x17, 0x00, 0x5f, 0xc5, + 0x17, 0x00, 0x83, 0xcc, 0x17, 0x00, 0x84, 0xcc, 0x17, 0x00, 0x85, 0xcc, + 0x17, 0x00, 0xb3, 0xcc, 0x17, 0x00, 0xbb, 0xcc, 0x17, 0x00, 0x88, 0xcf, + 0x17, 0x00, 0x8b, 0xcf, 0x17, 0x00, 0x8c, 0xcf, 0x17, 0x00, 0x8e, 0xcf, + 0x17, 0x00, 0x8f, 0xcf, 0x17, 0x00, 0xc3, 0xcf, 0x17, 0x00, 0xc4, 0xcf, + 0x17, 0x00, 0xc5, 0xcf, 0x17, 0x00, 0xc6, 0xcf, 0x17, 0x00, 0xc7, 0xcf, + 0x17, 0x00, 0xc8, 0xcf, 0x17, 0x00, 0xcb, 0xcf, 0x17, 0x00, 0xcc, 0xcf, + 0x17, 0x00, 0xce, 0xcf, 0x17, 0x00, 0xcf, 0xcf, 0x17, 0x00, 0xe0, 0xcf, + 0x17, 0x00, 0xe1, 0xcf, 0x17, 0x00, 0xe2, 0xcf, 0x17, 0x00, 0xe4, 0xcf, + 0x17, 0x00, 0xe5, 0xcf, 0x17, 0x00, 0xe6, 0xcf, 0x17, 0x00, 0xe7, 0xcf, + 0x17, 0x00, 0xe8, 0xcf, 0x17, 0x00, 0xeb, 0xcf, 0x17, 0x00, 0xec, 0xcf, + 0x17, 0x00, 0xee, 0xcf, 0x17, 0x00, 0xef, 0xcf, 0x17, 0x00, 0xf2, 0xcf, + 0x17, 0x00, 0xf4, 0xcf, 0x17, 0x00, 0xf5, 0xcf, 0x17, 0x00, 0xf6, 0xcf, + 0x17, 0x00, 0xf7, 0xcf, 0x17, 0x00, 0xf8, 0xcf, 0x17, 0x00, 0xfa, 0xcf, + 0x17, 0x00, 0xfc, 0xcf, 0x17, 0x00, 0xfe, 0xcf, 0x17, 0x00, 0xff, 0xcf, + 0x17, 0x00, 0x34, 0xd3, 0x17, 0x00, 0x35, 0xd3, 0x17, 0x00, 0x38, 0xd3, + 0x17, 0x00, 0x3c, 0xd3, 0x17, 0x00, 0x3e, 0xd3, 0x17, 0x00, 0x3f, 0xd3, + 0x17, 0x00, 0xe3, 0xd3, 0x17, 0x00, 0xf3, 0xd3, 0x17, 0x00, 0xfb, 0xd3, + 0x17, 0x00, 0x34, 0xd9, 0x17, 0x00, 0x35, 0xd9, 0x17, 0x00, 0x38, 0xd9, + 0x17, 0x00, 0x3c, 0xd9, 0x17, 0x00, 0x3e, 0xd9, 0x17, 0x00, 0x3f, 0xd9, + 0x17, 0x00, 0x33, 0xdd, 0x17, 0x00, 0x3b, 0xdd, 0x17, 0x00, 0x58, 0xdd, + 0x17, 0x00, 0x5c, 0xdd, 0x17, 0x00, 0x5e, 0xdd, 0x17, 0x00, 0x5f, 0xdd, + 0x17, 0x00, 0x38, 0xde, 0x17, 0x00, 0x3c, 0xde, 0x17, 0x00, 0x3e, 0xde, + 0x17, 0x00, 0x3f, 0xde, 0x17, 0x00, 0x33, 0xdf, 0x17, 0x00, 0x3b, 0xdf, + 0x17, 0x00, 0xe4, 0xdf, 0x17, 0x00, 0xe5, 0xdf, 0x17, 0x00, 0xe8, 0xdf, + 0x17, 0x00, 0xeb, 0xdf, 0x17, 0x00, 0xec, 0xdf, 0x17, 0x00, 0xee, 0xdf, + 0x17, 0x00, 0xef, 0xdf, 0x17, 0x00, 0xf4, 0xdf, 0x17, 0x00, 0xf5, 0xdf, + 0x17, 0x00, 0xf8, 0xdf, 0x17, 0x00, 0xfc, 0xdf, 0x17, 0x00, 0xfe, 0xdf, + 0x17, 0x00, 0xff, 0xdf, 0x17, 0x00, 0xf2, 0xe3, 0x17, 0x00, 0xf4, 0xe3, + 0x17, 0x00, 0xf5, 0xe3, 0x17, 0x00, 0xf6, 0xe3, 0x17, 0x00, 0xf7, 0xe3, + 0x17, 0x00, 0xf8, 0xe3, 0x17, 0x00, 0xfa, 0xe3, 0x17, 0x00, 0xfc, 0xe3, + 0x17, 0x00, 0xfe, 0xe3, 0x17, 0x00, 0xff, 0xe3, 0x17, 0x00, 0x51, 0xe5, + 0x17, 0x00, 0x56, 0xe5, 0x17, 0x00, 0x57, 0xe5, 0x17, 0x00, 0x59, 0xe5, + 0x17, 0x00, 0x5d, 0xe5, 0x17, 0x00, 0xb3, 0xec, 0x17, 0x00, 0xbb, 0xec, + 0x17, 0x00, 0xb4, 0xee, 0x17, 0x00, 0xb5, 0xee, 0x17, 0x00, 0xb8, 0xee, + 0x17, 0x00, 0xbc, 0xee, 0x17, 0x00, 0xbe, 0xee, 0x17, 0x00, 0xbf, 0xee, + 0x17, 0x00, 0x88, 0xef, 0x17, 0x00, 0x8b, 0xef, 0x17, 0x00, 0x8c, 0xef, + 0x17, 0x00, 0x8e, 0xef, 0x17, 0x00, 0x8f, 0xef, 0x17, 0x00, 0xc3, 0xef, + 0x17, 0x00, 0xc4, 0xef, 0x17, 0x00, 0xc5, 0xef, 0x17, 0x00, 0xc6, 0xef, + 0x17, 0x00, 0xc7, 0xef, 0x17, 0x00, 0xc8, 0xef, 0x17, 0x00, 0xcb, 0xef, + 0x17, 0x00, 0xcc, 0xef, 0x17, 0x00, 0xce, 0xef, 0x17, 0x00, 0xcf, 0xef, + 0x17, 0x00, 0xe0, 0xef, 0x17, 0x00, 0xe1, 0xef, 0x17, 0x00, 0xe2, 0xef, + 0x17, 0x00, 0xe4, 0xef, 0x17, 0x00, 0xe5, 0xef, 0x17, 0x00, 0xe6, 0xef, + 0x17, 0x00, 0xe7, 0xef, 0x17, 0x00, 0xe8, 0xef, 0x17, 0x00, 0xeb, 0xef, + 0x17, 0x00, 0xec, 0xef, 0x17, 0x00, 0xee, 0xef, 0x17, 0x00, 0xef, 0xef, + 0x17, 0x00, 0xf2, 0xef, 0x17, 0x00, 0xf4, 0xef, 0x17, 0x00, 0xf5, 0xef, + 0x17, 0x00, 0xf6, 0xef, 0x17, 0x00, 0xf7, 0xef, 0x17, 0x00, 0xf8, 0xef, + 0x17, 0x00, 0xfa, 0xef, 0x17, 0x00, 0xfc, 0xef, 0x17, 0x00, 0xfe, 0xef, + 0x17, 0x00, 0xff, 0xef, 0x17, 0x00, 0xf2, 0xf3, 0x17, 0x00, 0xf4, 0xf3, + 0x17, 0x00, 0xf5, 0xf3, 0x17, 0x00, 0xf6, 0xf3, 0x17, 0x00, 0xf7, 0xf3, + 0x17, 0x00, 0xf8, 0xf3, 0x17, 0x00, 0xfa, 0xf3, 0x17, 0x00, 0xfc, 0xf3, + 0x17, 0x00, 0xfe, 0xf3, 0x17, 0x00, 0xff, 0xf3, 0x17, 0x00, 0x31, 0xf9, + 0x17, 0x00, 0x39, 0xf9, 0x17, 0x00, 0x50, 0xf9, 0x17, 0x00, 0x51, 0xf9, + 0x17, 0x00, 0x56, 0xf9, 0x17, 0x00, 0x57, 0xf9, 0x17, 0x00, 0x59, 0xf9, + 0x17, 0x00, 0x5d, 0xf9, 0x17, 0x00, 0x88, 0xfc, 0x17, 0x00, 0x8b, 0xfc, + 0x17, 0x00, 0xb3, 0xfc, 0x17, 0x00, 0xbb, 0xfc, 0x17, 0x00, 0x51, 0xfd, + 0x17, 0x00, 0x56, 0xfd, 0x17, 0x00, 0x57, 0xfd, 0x17, 0x00, 0x59, 0xfd, + 0x17, 0x00, 0x5d, 0xfd, 0x17, 0x00, 0x43, 0xfe, 0x17, 0x00, 0x44, 0xfe, + 0x17, 0x00, 0x45, 0xfe, 0x17, 0x00, 0x48, 0xfe, 0x17, 0x00, 0x4b, 0xfe, + 0x17, 0x00, 0x4c, 0xfe, 0x17, 0x00, 0x4e, 0xfe, 0x17, 0x00, 0x4f, 0xfe, + 0x17, 0x00, 0x50, 0xfe, 0x17, 0x00, 0x51, 0xfe, 0x17, 0x00, 0x53, 0xfe, + 0x17, 0x00, 0x54, 0xfe, 0x17, 0x00, 0x55, 0xfe, 0x17, 0x00, 0x56, 0xfe, + 0x17, 0x00, 0x57, 0xfe, 0x17, 0x00, 0x59, 0xfe, 0x17, 0x00, 0x5b, 0xfe, + 0x17, 0x00, 0x5d, 0xfe, 0x17, 0x00, 0x8b, 0xfe, 0x17, 0x00, 0x48, 0xff, + 0x17, 0x00, 0x4b, 0xff, 0x17, 0x00, 0x50, 0xff, 0x17, 0x00, 0x51, 0xff, + 0x17, 0x00, 0x56, 0xff, 0x17, 0x00, 0x57, 0xff, 0x17, 0x00, 0x59, 0xff, + 0x17, 0x00, 0x5d, 0xff, 0x17, 0x00, 0x88, 0xff, 0x17, 0x00, 0x8b, 0xff, + 0x17, 0x00, 0x8c, 0xff, 0x17, 0x00, 0x8e, 0xff, 0x17, 0x00, 0x8f, 0xff, + 0x17, 0x00, 0xc3, 0xff, 0x17, 0x00, 0xc4, 0xff, 0x17, 0x00, 0xc5, 0xff, + 0x17, 0x00, 0xc6, 0xff, 0x17, 0x00, 0xc7, 0xff, 0x17, 0x00, 0xc8, 0xff, + 0x17, 0x00, 0xcb, 0xff, 0x17, 0x00, 0xcc, 0xff, 0x17, 0x00, 0xce, 0xff, + 0x17, 0x00, 0xcf, 0xff, 0x17, 0x00, 0xe0, 0xff, 0x17, 0x00, 0xe1, 0xff, + 0x17, 0x00, 0xe2, 0xff, 0x17, 0x00, 0xe4, 0xff, 0x17, 0x00, 0xe5, 0xff, + 0x17, 0x00, 0xe6, 0xff, 0x17, 0x00, 0xe7, 0xff, 0x17, 0x00, 0xe8, 0xff, + 0x17, 0x00, 0xeb, 0xff, 0x17, 0x00, 0xec, 0xff, 0x17, 0x00, 0xee, 0xff, + 0x17, 0x00, 0xef, 0xff, 0x17, 0x00, 0xf2, 0xff, 0x17, 0x00, 0xf4, 0xff, + 0x17, 0x00, 0xf5, 0xff, 0x17, 0x00, 0xf6, 0xff, 0x17, 0x00, 0xf7, 0xff, + 0x17, 0x00, 0xf8, 0xff, 0x17, 0x00, 0xfa, 0xff, 0x17, 0x00, 0xfc, 0xff, + 0x17, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xff, 0xff, 0x17, 0x00, 0xf8, 0x00, + 0x18, 0x00, 0xfc, 0x00, 0x18, 0x00, 0xfe, 0x00, 0x18, 0x00, 0xff, 0x00, + 0x18, 0x00, 0x78, 0x01, 0x18, 0x00, 0x7c, 0x01, 0x18, 0x00, 0x7e, 0x01, + 0x18, 0x00, 0x7f, 0x01, 0x18, 0x00, 0xcb, 0x02, 0x18, 0x00, 0xeb, 0x02, + 0x18, 0x00, 0x2b, 0x03, 0x18, 0x00, 0xcb, 0x03, 0x18, 0x00, 0xeb, 0x03, + 0x18, 0x00, 0x2b, 0x09, 0x18, 0x00, 0x2b, 0x0b, 0x18, 0x00, 0x8b, 0x0b, + 0x18, 0x00, 0xab, 0x0b, 0x18, 0x00, 0xcb, 0x0b, 0x18, 0x00, 0xeb, 0x0b, + 0x18, 0x00, 0xf8, 0x0b, 0x18, 0x00, 0xfc, 0x0b, 0x18, 0x00, 0xfe, 0x0b, + 0x18, 0x00, 0xff, 0x0b, 0x18, 0x00, 0x2b, 0x0d, 0x18, 0x00, 0x2b, 0x11, + 0x18, 0x00, 0x2b, 0x19, 0x18, 0x00, 0xf8, 0x21, 0x18, 0x00, 0xfc, 0x21, + 0x18, 0x00, 0xfe, 0x21, 0x18, 0x00, 0xff, 0x21, 0x18, 0x00, 0xcb, 0x22, + 0x18, 0x00, 0xeb, 0x22, 0x18, 0x00, 0x2b, 0x23, 0x18, 0x00, 0xcb, 0x23, + 0x18, 0x00, 0xeb, 0x23, 0x18, 0x00, 0x8b, 0x27, 0x18, 0x00, 0xcb, 0x27, + 0x18, 0x00, 0xeb, 0x27, 0x18, 0x00, 0xf8, 0x27, 0x18, 0x00, 0xfc, 0x27, + 0x18, 0x00, 0xfe, 0x27, 0x18, 0x00, 0xff, 0x27, 0x18, 0x00, 0x8b, 0x2b, + 0x18, 0x00, 0xcb, 0x2b, 0x18, 0x00, 0xeb, 0x2b, 0x18, 0x00, 0xcb, 0x2c, + 0x18, 0x00, 0xeb, 0x2c, 0x18, 0x00, 0xf8, 0x2c, 0x18, 0x00, 0xfc, 0x2c, + 0x18, 0x00, 0xfe, 0x2c, 0x18, 0x00, 0xff, 0x2c, 0x18, 0x00, 0xcb, 0x2e, + 0x18, 0x00, 0xeb, 0x2e, 0x18, 0x00, 0xf8, 0x2e, 0x18, 0x00, 0xfc, 0x2e, + 0x18, 0x00, 0xfe, 0x2e, 0x18, 0x00, 0xff, 0x2e, 0x18, 0x00, 0xcb, 0x2f, + 0x18, 0x00, 0xeb, 0x2f, 0x18, 0x00, 0xf8, 0x2f, 0x18, 0x00, 0xfc, 0x2f, + 0x18, 0x00, 0xfe, 0x2f, 0x18, 0x00, 0xff, 0x2f, 0x18, 0x00, 0x30, 0x33, + 0x18, 0x00, 0x2b, 0x35, 0x18, 0x00, 0xb0, 0x37, 0x18, 0x00, 0x30, 0x3b, + 0x18, 0x00, 0xf0, 0x3f, 0x18, 0x00, 0xf1, 0x3f, 0x18, 0x00, 0xf7, 0x3f, + 0x18, 0x00, 0xf9, 0x3f, 0x18, 0x00, 0xfd, 0x3f, 0x18, 0x00, 0x77, 0x40, + 0x18, 0x00, 0x78, 0x40, 0x18, 0x00, 0x7c, 0x40, 0x18, 0x00, 0x7e, 0x40, + 0x18, 0x00, 0x7f, 0x40, 0x18, 0x00, 0xf0, 0x41, 0x18, 0x00, 0xf1, 0x41, + 0x18, 0x00, 0xf9, 0x41, 0x18, 0x00, 0xfd, 0x41, 0x18, 0x00, 0x0b, 0x43, + 0x18, 0x00, 0xb0, 0x47, 0x18, 0x00, 0xb0, 0x48, 0x18, 0x00, 0x30, 0x4b, + 0x18, 0x00, 0x0b, 0x4f, 0x18, 0x00, 0x78, 0x52, 0x18, 0x00, 0x7c, 0x52, + 0x18, 0x00, 0x7e, 0x52, 0x18, 0x00, 0x7f, 0x52, 0x18, 0x00, 0xb0, 0x54, + 0x18, 0x00, 0x0b, 0x55, 0x18, 0x00, 0x6b, 0x55, 0x18, 0x00, 0x78, 0x55, + 0x18, 0x00, 0x7c, 0x55, 0x18, 0x00, 0x7e, 0x55, 0x18, 0x00, 0x7f, 0x55, + 0x18, 0x00, 0xcb, 0x57, 0x18, 0x00, 0xeb, 0x57, 0x18, 0x00, 0xf8, 0x57, + 0x18, 0x00, 0xfc, 0x57, 0x18, 0x00, 0xfe, 0x57, 0x18, 0x00, 0xff, 0x57, + 0x18, 0x00, 0xb0, 0x58, 0x18, 0x00, 0xb0, 0x5b, 0x18, 0x00, 0x78, 0x5c, + 0x18, 0x00, 0x7c, 0x5c, 0x18, 0x00, 0x7e, 0x5c, 0x18, 0x00, 0x7f, 0x5c, + 0x18, 0x00, 0x78, 0x5e, 0x18, 0x00, 0x7c, 0x5e, 0x18, 0x00, 0x7e, 0x5e, + 0x18, 0x00, 0x7f, 0x5e, 0x18, 0x00, 0xf7, 0x5f, 0x18, 0x00, 0xf8, 0x5f, + 0x18, 0x00, 0xfc, 0x5f, 0x18, 0x00, 0xfe, 0x5f, 0x18, 0x00, 0xff, 0x5f, + 0x18, 0x00, 0xcb, 0x64, 0x18, 0x00, 0xeb, 0x64, 0x18, 0x00, 0xfb, 0x65, + 0x18, 0x00, 0x0b, 0x66, 0x18, 0x00, 0xcb, 0x66, 0x18, 0x00, 0xeb, 0x66, + 0x18, 0x00, 0x0b, 0x6a, 0x18, 0x00, 0x2b, 0x6a, 0x18, 0x00, 0x0b, 0x6b, + 0x18, 0x00, 0xfb, 0x75, 0x18, 0x00, 0xcb, 0x78, 0x18, 0x00, 0xeb, 0x78, + 0x18, 0x00, 0x0b, 0x7a, 0x18, 0x00, 0x2b, 0x7a, 0x18, 0x00, 0x0b, 0x7b, + 0x18, 0x00, 0xfb, 0x7d, 0x18, 0x00, 0xf7, 0x84, 0x18, 0x00, 0xf8, 0x84, + 0x18, 0x00, 0xfc, 0x84, 0x18, 0x00, 0xfe, 0x84, 0x18, 0x00, 0xff, 0x84, + 0x18, 0x00, 0xf7, 0x86, 0x18, 0x00, 0xf8, 0x86, 0x18, 0x00, 0xfc, 0x86, + 0x18, 0x00, 0xfe, 0x86, 0x18, 0x00, 0xff, 0x86, 0x18, 0x00, 0xf7, 0x87, + 0x18, 0x00, 0x0b, 0x89, 0x18, 0x00, 0x0b, 0x8a, 0x18, 0x00, 0x0b, 0x8b, + 0x18, 0x00, 0x78, 0x8b, 0x18, 0x00, 0x7c, 0x8b, 0x18, 0x00, 0x7e, 0x8b, + 0x18, 0x00, 0x7f, 0x8b, 0x18, 0x00, 0x0b, 0x8d, 0x18, 0x00, 0x0b, 0x8e, + 0x18, 0x00, 0xf1, 0x8f, 0x18, 0x00, 0xf7, 0x8f, 0x18, 0x00, 0xf9, 0x8f, + 0x18, 0x00, 0x3b, 0x94, 0x18, 0x00, 0x3b, 0x96, 0x18, 0x00, 0xcb, 0xa4, + 0x18, 0x00, 0xeb, 0xa4, 0x18, 0x00, 0xf8, 0xa4, 0x18, 0x00, 0xfc, 0xa4, + 0x18, 0x00, 0xfe, 0xa4, 0x18, 0x00, 0xff, 0xa4, 0x18, 0x00, 0x0b, 0xa6, + 0x18, 0x00, 0x2b, 0xa6, 0x18, 0x00, 0xcb, 0xa6, 0x18, 0x00, 0xeb, 0xa6, + 0x18, 0x00, 0xf8, 0xaa, 0x18, 0x00, 0xfc, 0xaa, 0x18, 0x00, 0xfe, 0xaa, + 0x18, 0x00, 0xff, 0xaa, 0x18, 0x00, 0x71, 0xb1, 0x18, 0x00, 0x77, 0xb1, + 0x18, 0x00, 0x79, 0xb1, 0x18, 0x00, 0xf1, 0xb3, 0x18, 0x00, 0xf7, 0xb3, + 0x18, 0x00, 0xf9, 0xb3, 0x18, 0x00, 0xf1, 0xb7, 0x18, 0x00, 0xf7, 0xb7, + 0x18, 0x00, 0xf9, 0xb7, 0x18, 0x00, 0xf0, 0xb8, 0x18, 0x00, 0xf1, 0xb8, + 0x18, 0x00, 0xf7, 0xb8, 0x18, 0x00, 0xf9, 0xb8, 0x18, 0x00, 0xfd, 0xb8, + 0x18, 0x00, 0xbb, 0xb9, 0x18, 0x00, 0x0b, 0xba, 0x18, 0x00, 0x0b, 0xbb, + 0x18, 0x00, 0x78, 0xbb, 0x18, 0x00, 0x7c, 0xbb, 0x18, 0x00, 0x7e, 0xbb, + 0x18, 0x00, 0x7f, 0xbb, 0x18, 0x00, 0xbb, 0xbd, 0x18, 0x00, 0xbb, 0xbe, + 0x18, 0x00, 0x30, 0xc0, 0x18, 0x00, 0xf6, 0xc0, 0x18, 0x00, 0xf7, 0xc0, + 0x18, 0x00, 0xf8, 0xc0, 0x18, 0x00, 0xfc, 0xc0, 0x18, 0x00, 0xfe, 0xc0, + 0x18, 0x00, 0xff, 0xc0, 0x18, 0x00, 0x30, 0xc1, 0x18, 0x00, 0xf0, 0xc1, + 0x18, 0x00, 0xf1, 0xc1, 0x18, 0x00, 0xf9, 0xc1, 0x18, 0x00, 0xfd, 0xc1, + 0x18, 0x00, 0x78, 0xc3, 0x18, 0x00, 0x7c, 0xc3, 0x18, 0x00, 0x7e, 0xc3, + 0x18, 0x00, 0x7f, 0xc3, 0x18, 0x00, 0xb0, 0xc6, 0x18, 0x00, 0x30, 0xc7, + 0x18, 0x00, 0xb0, 0xc8, 0x18, 0x00, 0x2b, 0xc9, 0x18, 0x00, 0x30, 0xcb, + 0x18, 0x00, 0xd1, 0xcc, 0x18, 0x00, 0xd6, 0xcc, 0x18, 0x00, 0xd7, 0xcc, + 0x18, 0x00, 0xd8, 0xcc, 0x18, 0x00, 0xdc, 0xcc, 0x18, 0x00, 0xde, 0xcc, + 0x18, 0x00, 0xdf, 0xcc, 0x18, 0x00, 0x18, 0xcf, 0x18, 0x00, 0x1c, 0xcf, + 0x18, 0x00, 0x1e, 0xcf, 0x18, 0x00, 0x1f, 0xcf, 0x18, 0x00, 0x91, 0xcf, + 0x18, 0x00, 0x96, 0xcf, 0x18, 0x00, 0x97, 0xcf, 0x18, 0x00, 0x98, 0xcf, + 0x18, 0x00, 0x9c, 0xcf, 0x18, 0x00, 0x9e, 0xcf, 0x18, 0x00, 0x9f, 0xcf, + 0x18, 0x00, 0xd1, 0xcf, 0x18, 0x00, 0xd6, 0xcf, 0x18, 0x00, 0xd7, 0xcf, + 0x18, 0x00, 0xd8, 0xcf, 0x18, 0x00, 0xdc, 0xcf, 0x18, 0x00, 0xde, 0xcf, + 0x18, 0x00, 0xdf, 0xcf, 0x18, 0x00, 0xf8, 0xd1, 0x18, 0x00, 0xfc, 0xd1, + 0x18, 0x00, 0xfe, 0xd1, 0x18, 0x00, 0xff, 0xd1, 0x18, 0x00, 0xc8, 0xd4, + 0x18, 0x00, 0xcb, 0xd4, 0x18, 0x00, 0xe8, 0xd4, 0x18, 0x00, 0xeb, 0xd4, + 0x18, 0x00, 0xf8, 0xd5, 0x18, 0x00, 0xfc, 0xd5, 0x18, 0x00, 0xfe, 0xd5, + 0x18, 0x00, 0xff, 0xd5, 0x18, 0x00, 0xcb, 0xd6, 0x18, 0x00, 0xeb, 0xd6, + 0x18, 0x00, 0x88, 0xd7, 0x18, 0x00, 0x8b, 0xd7, 0x18, 0x00, 0xc8, 0xd7, + 0x18, 0x00, 0xcb, 0xd7, 0x18, 0x00, 0xe8, 0xd7, 0x18, 0x00, 0xeb, 0xd7, + 0x18, 0x00, 0xf8, 0xdb, 0x18, 0x00, 0xfc, 0xdb, 0x18, 0x00, 0xfe, 0xdb, + 0x18, 0x00, 0xff, 0xdb, 0x18, 0x00, 0xb0, 0xe0, 0x18, 0x00, 0x30, 0xe2, + 0x18, 0x00, 0xf6, 0xe2, 0x18, 0x00, 0xf7, 0xe2, 0x18, 0x00, 0xf8, 0xe2, + 0x18, 0x00, 0xfc, 0xe2, 0x18, 0x00, 0xfe, 0xe2, 0x18, 0x00, 0xff, 0xe2, + 0x18, 0x00, 0x30, 0xe5, 0x18, 0x00, 0xf0, 0xe5, 0x18, 0x00, 0xc6, 0xe7, + 0x18, 0x00, 0xe6, 0xe7, 0x18, 0x00, 0xf6, 0xe7, 0x18, 0x00, 0xf7, 0xe7, + 0x18, 0x00, 0xf8, 0xe7, 0x18, 0x00, 0xfc, 0xe7, 0x18, 0x00, 0xfe, 0xe7, + 0x18, 0x00, 0xff, 0xe7, 0x18, 0x00, 0xb0, 0xe8, 0x18, 0x00, 0xb0, 0xea, + 0x18, 0x00, 0x30, 0xeb, 0x18, 0x00, 0x30, 0xec, 0x18, 0x00, 0x30, 0xee, + 0x18, 0x00, 0xb0, 0xf0, 0x18, 0x00, 0xb0, 0xf1, 0x18, 0x00, 0x30, 0xf3, + 0x18, 0x00, 0x90, 0xf3, 0x18, 0x00, 0xd0, 0xf3, 0x18, 0x00, 0xb0, 0xf4, + 0x18, 0x00, 0xb0, 0xf6, 0x18, 0x00, 0xb0, 0xf7, 0x18, 0x00, 0x30, 0xf9, + 0x18, 0x00, 0xf7, 0xf9, 0x18, 0x00, 0xf8, 0xf9, 0x18, 0x00, 0xfc, 0xf9, + 0x18, 0x00, 0xfe, 0xf9, 0x18, 0x00, 0xff, 0xf9, 0x18, 0x00, 0x30, 0xfb, + 0x18, 0x00, 0x30, 0xfd, 0x18, 0x00, 0xf0, 0xfd, 0x18, 0x00, 0x26, 0xff, + 0x18, 0x00, 0x27, 0xff, 0x18, 0x00, 0x29, 0xff, 0x18, 0x00, 0x2a, 0xff, + 0x18, 0x00, 0x88, 0xff, 0x18, 0x00, 0x8b, 0xff, 0x18, 0x00, 0xc6, 0xff, + 0x18, 0x00, 0xe6, 0xff, 0x18, 0x00, 0xf6, 0xff, 0x18, 0x00, 0xf7, 0xff, + 0x18, 0x00, 0xf8, 0xff, 0x18, 0x00, 0xfc, 0xff, 0x18, 0x00, 0xfe, 0xff, + 0x18, 0x00, 0xff, 0xff, 0x18, 0x00, 0x58, 0x01, 0x19, 0x00, 0xf3, 0x01, + 0x19, 0x00, 0xfb, 0x01, 0x19, 0x00, 0xf3, 0x02, 0x19, 0x00, 0xfb, 0x02, + 0x19, 0x00, 0xf3, 0x03, 0x19, 0x00, 0xfb, 0x03, 0x19, 0x00, 0xf8, 0x04, + 0x19, 0x00, 0xfc, 0x04, 0x19, 0x00, 0xfe, 0x04, 0x19, 0x00, 0xff, 0x04, + 0x19, 0x00, 0xe8, 0x06, 0x19, 0x00, 0xeb, 0x06, 0x19, 0x00, 0xf4, 0x07, + 0x19, 0x00, 0xf5, 0x07, 0x19, 0x00, 0xf8, 0x07, 0x19, 0x00, 0xfc, 0x07, + 0x19, 0x00, 0xfe, 0x07, 0x19, 0x00, 0xff, 0x07, 0x19, 0x00, 0xf4, 0x11, + 0x19, 0x00, 0xf5, 0x11, 0x19, 0x00, 0xf8, 0x11, 0x19, 0x00, 0xfc, 0x11, + 0x19, 0x00, 0xfe, 0x11, 0x19, 0x00, 0xff, 0x11, 0x19, 0x00, 0xc8, 0x1c, + 0x19, 0x00, 0xcb, 0x1c, 0x19, 0x00, 0xe8, 0x1c, 0x19, 0x00, 0xeb, 0x1c, + 0x19, 0x00, 0xf8, 0x1c, 0x19, 0x00, 0xfc, 0x1c, 0x19, 0x00, 0xfe, 0x1c, + 0x19, 0x00, 0xff, 0x1c, 0x19, 0x00, 0xf4, 0x1f, 0x19, 0x00, 0xf5, 0x1f, + 0x19, 0x00, 0xf8, 0x1f, 0x19, 0x00, 0xfc, 0x1f, 0x19, 0x00, 0xfe, 0x1f, + 0x19, 0x00, 0xff, 0x1f, 0x19, 0x00, 0xf8, 0x23, 0x19, 0x00, 0xfc, 0x23, + 0x19, 0x00, 0xfe, 0x23, 0x19, 0x00, 0xff, 0x23, 0x19, 0x00, 0xf8, 0x29, + 0x19, 0x00, 0xfc, 0x29, 0x19, 0x00, 0xfe, 0x29, 0x19, 0x00, 0xff, 0x29, + 0x19, 0x00, 0x30, 0x33, 0x19, 0x00, 0xf0, 0x33, 0x19, 0x00, 0xf1, 0x33, + 0x19, 0x00, 0xf9, 0x33, 0x19, 0x00, 0xfd, 0x33, 0x19, 0x00, 0xf7, 0x35, + 0x19, 0x00, 0xf8, 0x35, 0x19, 0x00, 0xfc, 0x35, 0x19, 0x00, 0xfe, 0x35, + 0x19, 0x00, 0xff, 0x35, 0x19, 0x00, 0x30, 0x39, 0x19, 0x00, 0xf0, 0x39, + 0x19, 0x00, 0xf1, 0x39, 0x19, 0x00, 0xf9, 0x39, 0x19, 0x00, 0xfd, 0x39, + 0x19, 0x00, 0x30, 0x3d, 0x19, 0x00, 0xf0, 0x3d, 0x19, 0x00, 0xf1, 0x3d, + 0x19, 0x00, 0xf9, 0x3d, 0x19, 0x00, 0xfd, 0x3d, 0x19, 0x00, 0x30, 0x3f, + 0x19, 0x00, 0xb0, 0x40, 0x19, 0x00, 0xf6, 0x40, 0x19, 0x00, 0xf7, 0x40, + 0x19, 0x00, 0xf8, 0x40, 0x19, 0x00, 0xfc, 0x40, 0x19, 0x00, 0xfe, 0x40, + 0x19, 0x00, 0xff, 0x40, 0x19, 0x00, 0xf0, 0x41, 0x19, 0x00, 0xf1, 0x41, + 0x19, 0x00, 0xf9, 0x41, 0x19, 0x00, 0xfd, 0x41, 0x19, 0x00, 0x30, 0x47, + 0x19, 0x00, 0x51, 0x49, 0x19, 0x00, 0x56, 0x49, 0x19, 0x00, 0x57, 0x49, + 0x19, 0x00, 0x58, 0x49, 0x19, 0x00, 0x5c, 0x49, 0x19, 0x00, 0x5e, 0x49, + 0x19, 0x00, 0x5f, 0x49, 0x19, 0x00, 0xf0, 0x49, 0x19, 0x00, 0xf1, 0x49, + 0x19, 0x00, 0xf9, 0x49, 0x19, 0x00, 0xfd, 0x49, 0x19, 0x00, 0xc6, 0x4b, + 0x19, 0x00, 0xe6, 0x4b, 0x19, 0x00, 0xf0, 0x4b, 0x19, 0x00, 0xf0, 0x4c, + 0x19, 0x00, 0xf1, 0x4c, 0x19, 0x00, 0xf9, 0x4c, 0x19, 0x00, 0xfd, 0x4c, + 0x19, 0x00, 0xf0, 0x4e, 0x19, 0x00, 0xf1, 0x4e, 0x19, 0x00, 0xf9, 0x4e, + 0x19, 0x00, 0xfd, 0x4e, 0x19, 0x00, 0xf0, 0x4f, 0x19, 0x00, 0xf1, 0x4f, + 0x19, 0x00, 0xf9, 0x4f, 0x19, 0x00, 0xfd, 0x4f, 0x19, 0x00, 0x51, 0x55, + 0x19, 0x00, 0x56, 0x55, 0x19, 0x00, 0x57, 0x55, 0x19, 0x00, 0x59, 0x55, + 0x19, 0x00, 0x5d, 0x55, 0x19, 0x00, 0xf6, 0x59, 0x19, 0x00, 0xf7, 0x59, + 0x19, 0x00, 0xf8, 0x59, 0x19, 0x00, 0xfc, 0x59, 0x19, 0x00, 0xfe, 0x59, + 0x19, 0x00, 0xff, 0x59, 0x19, 0x00, 0xf6, 0x5d, 0x19, 0x00, 0xf7, 0x5d, + 0x19, 0x00, 0xf8, 0x5d, 0x19, 0x00, 0xfc, 0x5d, 0x19, 0x00, 0xfe, 0x5d, + 0x19, 0x00, 0xff, 0x5d, 0x19, 0x00, 0xf0, 0x5f, 0x19, 0x00, 0xf1, 0x5f, + 0x19, 0x00, 0xf9, 0x5f, 0x19, 0x00, 0xfd, 0x5f, 0x19, 0x00, 0xf4, 0x61, + 0x19, 0x00, 0xf5, 0x61, 0x19, 0x00, 0xf8, 0x61, 0x19, 0x00, 0xfc, 0x61, + 0x19, 0x00, 0xfe, 0x61, 0x19, 0x00, 0xff, 0x61, 0x19, 0x00, 0xf3, 0x69, + 0x19, 0x00, 0xfb, 0x69, 0x19, 0x00, 0xf8, 0x6a, 0x19, 0x00, 0xfc, 0x6a, + 0x19, 0x00, 0xfe, 0x6a, 0x19, 0x00, 0xff, 0x6a, 0x19, 0x00, 0xf3, 0x6c, + 0x19, 0x00, 0xfb, 0x6c, 0x19, 0x00, 0xf4, 0x6e, 0x19, 0x00, 0xf5, 0x6e, + 0x19, 0x00, 0xf8, 0x6e, 0x19, 0x00, 0xfc, 0x6e, 0x19, 0x00, 0xfe, 0x6e, + 0x19, 0x00, 0xff, 0x6e, 0x19, 0x00, 0xf4, 0x6f, 0x19, 0x00, 0xf5, 0x6f, + 0x19, 0x00, 0xf8, 0x6f, 0x19, 0x00, 0xfc, 0x6f, 0x19, 0x00, 0xfe, 0x6f, + 0x19, 0x00, 0xff, 0x6f, 0x19, 0x00, 0xcb, 0x72, 0x19, 0x00, 0xeb, 0x72, + 0x19, 0x00, 0xf8, 0x72, 0x19, 0x00, 0xfc, 0x72, 0x19, 0x00, 0xfe, 0x72, + 0x19, 0x00, 0xff, 0x72, 0x19, 0x00, 0xf4, 0x74, 0x19, 0x00, 0xf5, 0x74, + 0x19, 0x00, 0xf8, 0x74, 0x19, 0x00, 0xfc, 0x74, 0x19, 0x00, 0xfe, 0x74, + 0x19, 0x00, 0xff, 0x74, 0x19, 0x00, 0xf3, 0x77, 0x19, 0x00, 0xfb, 0x77, + 0x19, 0x00, 0x30, 0x84, 0x19, 0x00, 0x31, 0x84, 0x19, 0x00, 0x39, 0x84, + 0x19, 0x00, 0x3d, 0x84, 0x19, 0x00, 0xf0, 0x84, 0x19, 0x00, 0xf1, 0x84, + 0x19, 0x00, 0xf9, 0x84, 0x19, 0x00, 0xfd, 0x84, 0x19, 0x00, 0xf0, 0x86, + 0x19, 0x00, 0xf1, 0x86, 0x19, 0x00, 0xf9, 0x86, 0x19, 0x00, 0xfd, 0x86, + 0x19, 0x00, 0xf1, 0x87, 0x19, 0x00, 0xf9, 0x87, 0x19, 0x00, 0x38, 0x9e, + 0x19, 0x00, 0x3c, 0x9e, 0x19, 0x00, 0x3e, 0x9e, 0x19, 0x00, 0x3f, 0x9e, + 0x19, 0x00, 0x8b, 0xa7, 0x19, 0x00, 0xcb, 0xa7, 0x19, 0x00, 0xeb, 0xa7, + 0x19, 0x00, 0xcb, 0xaf, 0x19, 0x00, 0xeb, 0xaf, 0x19, 0x00, 0xf8, 0xaf, + 0x19, 0x00, 0xfc, 0xaf, 0x19, 0x00, 0xfe, 0xaf, 0x19, 0x00, 0xff, 0xaf, + 0x19, 0x00, 0x8b, 0xb3, 0x19, 0x00, 0xcb, 0xb7, 0x19, 0x00, 0xeb, 0xb7, + 0x19, 0x00, 0xf0, 0xb7, 0x19, 0x00, 0xf1, 0xb7, 0x19, 0x00, 0xf7, 0xb7, + 0x19, 0x00, 0xf9, 0xb7, 0x19, 0x00, 0xfd, 0xb7, 0x19, 0x00, 0xf8, 0xbf, + 0x19, 0x00, 0xfc, 0xbf, 0x19, 0x00, 0xfe, 0xbf, 0x19, 0x00, 0xff, 0xbf, + 0x19, 0x00, 0xf7, 0xc3, 0x19, 0x00, 0x31, 0xc5, 0x19, 0x00, 0x39, 0xc5, + 0x19, 0x00, 0xf7, 0xc5, 0x19, 0x00, 0x38, 0xde, 0x19, 0x00, 0x3c, 0xde, + 0x19, 0x00, 0x3e, 0xde, 0x19, 0x00, 0x3f, 0xde, 0x19, 0x00, 0xf1, 0xe3, + 0x19, 0x00, 0xf9, 0xe3, 0x19, 0x00, 0xf1, 0xe9, 0x19, 0x00, 0xf9, 0xe9, + 0x19, 0x00, 0xf1, 0xed, 0x19, 0x00, 0xf9, 0xed, 0x19, 0x00, 0x31, 0xff, + 0x19, 0x00, 0x37, 0xff, 0x19, 0x00, 0x39, 0xff, 0x19, 0x00, 0xb8, 0x00, + 0x1a, 0x00, 0xbc, 0x00, 0x1a, 0x00, 0xbe, 0x00, 0x1a, 0x00, 0xbf, 0x00, + 0x1a, 0x00, 0xb8, 0x04, 0x1a, 0x00, 0xbc, 0x04, 0x1a, 0x00, 0xbe, 0x04, + 0x1a, 0x00, 0xbf, 0x04, 0x1a, 0x00, 0xb8, 0x08, 0x1a, 0x00, 0xbc, 0x08, + 0x1a, 0x00, 0xbe, 0x08, 0x1a, 0x00, 0xbf, 0x08, 0x1a, 0x00, 0xf8, 0x13, + 0x1a, 0x00, 0xfc, 0x13, 0x1a, 0x00, 0xfe, 0x13, 0x1a, 0x00, 0xff, 0x13, + 0x1a, 0x00, 0x88, 0x1b, 0x1a, 0x00, 0x8b, 0x1b, 0x1a, 0x00, 0xc8, 0x1b, + 0x1a, 0x00, 0xcb, 0x1b, 0x1a, 0x00, 0xe8, 0x1b, 0x1a, 0x00, 0xeb, 0x1b, + 0x1a, 0x00, 0xc8, 0x23, 0x1a, 0x00, 0xcb, 0x23, 0x1a, 0x00, 0xe8, 0x23, + 0x1a, 0x00, 0xeb, 0x23, 0x1a, 0x00, 0xf8, 0x23, 0x1a, 0x00, 0xfc, 0x23, + 0x1a, 0x00, 0xfe, 0x23, 0x1a, 0x00, 0xff, 0x23, 0x1a, 0x00, 0xc9, 0x33, + 0x1a, 0x00, 0xca, 0x33, 0x1a, 0x00, 0xe9, 0x33, 0x1a, 0x00, 0xea, 0x33, + 0x1a, 0x00, 0xf0, 0x33, 0x1a, 0x00, 0xf1, 0x33, 0x1a, 0x00, 0xf9, 0x33, + 0x1a, 0x00, 0xfd, 0x33, 0x1a, 0x00, 0xf7, 0x35, 0x1a, 0x00, 0xf8, 0x35, + 0x1a, 0x00, 0xfc, 0x35, 0x1a, 0x00, 0xfe, 0x35, 0x1a, 0x00, 0xff, 0x35, + 0x1a, 0x00, 0xf7, 0x39, 0x1a, 0x00, 0xf8, 0x39, 0x1a, 0x00, 0xfc, 0x39, + 0x1a, 0x00, 0xfe, 0x39, 0x1a, 0x00, 0xff, 0x39, 0x1a, 0x00, 0xf0, 0x3d, + 0x1a, 0x00, 0xf1, 0x3d, 0x1a, 0x00, 0xf9, 0x3d, 0x1a, 0x00, 0xfd, 0x3d, + 0x1a, 0x00, 0xf7, 0x45, 0x1a, 0x00, 0xf8, 0x45, 0x1a, 0x00, 0xfc, 0x45, + 0x1a, 0x00, 0xfe, 0x45, 0x1a, 0x00, 0xff, 0x45, 0x1a, 0x00, 0xf0, 0x47, + 0x1a, 0x00, 0xf1, 0x47, 0x1a, 0x00, 0xf9, 0x47, 0x1a, 0x00, 0xfd, 0x47, + 0x1a, 0x00, 0xcb, 0x4b, 0x1a, 0x00, 0xeb, 0x4b, 0x1a, 0x00, 0xf8, 0x4b, + 0x1a, 0x00, 0xfc, 0x4b, 0x1a, 0x00, 0xfe, 0x4b, 0x1a, 0x00, 0xff, 0x4b, + 0x1a, 0x00, 0xf7, 0x53, 0x1a, 0x00, 0xf8, 0x53, 0x1a, 0x00, 0xfc, 0x53, + 0x1a, 0x00, 0xfe, 0x53, 0x1a, 0x00, 0xff, 0x53, 0x1a, 0x00, 0xb8, 0x5c, + 0x1a, 0x00, 0xbc, 0x5c, 0x1a, 0x00, 0xbe, 0x5c, 0x1a, 0x00, 0xbf, 0x5c, + 0x1a, 0x00, 0xb8, 0x5e, 0x1a, 0x00, 0xbc, 0x5e, 0x1a, 0x00, 0xbe, 0x5e, + 0x1a, 0x00, 0xbf, 0x5e, 0x1a, 0x00, 0xb7, 0x80, 0x1a, 0x00, 0xf1, 0x81, + 0x1a, 0x00, 0xf9, 0x81, 0x1a, 0x00, 0xf7, 0x83, 0x1a, 0x00, 0xb1, 0x84, + 0x1a, 0x00, 0xb9, 0x84, 0x1a, 0x00, 0xf7, 0x85, 0x1a, 0x00, 0xb1, 0x86, + 0x1a, 0x00, 0xb9, 0x86, 0x1a, 0x00, 0xb1, 0x88, 0x1a, 0x00, 0xb7, 0x88, + 0x1a, 0x00, 0xb9, 0x88, 0x1a, 0x00, 0xf1, 0x8b, 0x1a, 0x00, 0xf7, 0x8b, + 0x1a, 0x00, 0xf9, 0x8b, 0x1a, 0x00, 0x88, 0xc3, 0x1a, 0x00, 0x8b, 0xc3, + 0x1a, 0x00, 0xb8, 0xcc, 0x1a, 0x00, 0xbc, 0xcc, 0x1a, 0x00, 0xbe, 0xcc, + 0x1a, 0x00, 0xbf, 0xcc, 0x1a, 0x00, 0xb8, 0xce, 0x1a, 0x00, 0xbc, 0xce, + 0x1a, 0x00, 0xbe, 0xce, 0x1a, 0x00, 0xbf, 0xce, 0x1a, 0x00, 0xc9, 0xcf, + 0x1a, 0x00, 0xca, 0xcf, 0x1a, 0x00, 0xe9, 0xcf, 0x1a, 0x00, 0xea, 0xcf, + 0x1a, 0x00, 0xf0, 0xcf, 0x1a, 0x00, 0xf1, 0xcf, 0x1a, 0x00, 0xf9, 0xcf, + 0x1a, 0x00, 0xfd, 0xcf, 0x1a, 0x00, 0xc8, 0xdf, 0x1a, 0x00, 0xcb, 0xdf, + 0x1a, 0x00, 0xe8, 0xdf, 0x1a, 0x00, 0xeb, 0xdf, 0x1a, 0x00, 0xf8, 0xdf, + 0x1a, 0x00, 0xfc, 0xdf, 0x1a, 0x00, 0xfe, 0xdf, 0x1a, 0x00, 0xff, 0xdf, + 0x1a, 0x00, 0xb8, 0xec, 0x1a, 0x00, 0xbc, 0xec, 0x1a, 0x00, 0xbe, 0xec, + 0x1a, 0x00, 0xbf, 0xec, 0x1a, 0x00, 0xc9, 0xef, 0x1a, 0x00, 0xca, 0xef, + 0x1a, 0x00, 0xe9, 0xef, 0x1a, 0x00, 0xea, 0xef, 0x1a, 0x00, 0xf0, 0xef, + 0x1a, 0x00, 0xf1, 0xef, 0x1a, 0x00, 0xf9, 0xef, 0x1a, 0x00, 0xfd, 0xef, + 0x1a, 0x00, 0x88, 0xff, 0x1a, 0x00, 0x8b, 0xff, 0x1a, 0x00, 0xc6, 0xff, + 0x1a, 0x00, 0xc7, 0xff, 0x1a, 0x00, 0xc8, 0xff, 0x1a, 0x00, 0xcb, 0xff, + 0x1a, 0x00, 0xe6, 0xff, 0x1a, 0x00, 0xe7, 0xff, 0x1a, 0x00, 0xe8, 0xff, + 0x1a, 0x00, 0xeb, 0xff, 0x1a, 0x00, 0xf6, 0xff, 0x1a, 0x00, 0xf7, 0xff, + 0x1a, 0x00, 0xf8, 0xff, 0x1a, 0x00, 0xfc, 0xff, 0x1a, 0x00, 0xfe, 0xff, + 0x1a, 0x00, 0xff, 0xff, 0x1a, 0x00, 0x73, 0x04, 0x1b, 0x00, 0x7b, 0x04, + 0x1b, 0x00, 0xf4, 0x05, 0x1b, 0x00, 0xf5, 0x05, 0x1b, 0x00, 0xf8, 0x05, + 0x1b, 0x00, 0xfc, 0x05, 0x1b, 0x00, 0xfe, 0x05, 0x1b, 0x00, 0xff, 0x05, + 0x1b, 0x00, 0x74, 0x06, 0x1b, 0x00, 0x75, 0x06, 0x1b, 0x00, 0x78, 0x06, + 0x1b, 0x00, 0x7c, 0x06, 0x1b, 0x00, 0x7e, 0x06, 0x1b, 0x00, 0x7f, 0x06, + 0x1b, 0x00, 0x78, 0x07, 0x1b, 0x00, 0x7c, 0x07, 0x1b, 0x00, 0x7e, 0x07, + 0x1b, 0x00, 0x7f, 0x07, 0x1b, 0x00, 0x74, 0x0a, 0x1b, 0x00, 0x75, 0x0a, + 0x1b, 0x00, 0x78, 0x0a, 0x1b, 0x00, 0x7c, 0x0a, 0x1b, 0x00, 0x7e, 0x0a, + 0x1b, 0x00, 0x7f, 0x0a, 0x1b, 0x00, 0xf4, 0x0b, 0x1b, 0x00, 0xf5, 0x0b, + 0x1b, 0x00, 0xf8, 0x0b, 0x1b, 0x00, 0xfc, 0x0b, 0x1b, 0x00, 0xfe, 0x0b, + 0x1b, 0x00, 0xff, 0x0b, 0x1b, 0x00, 0xf3, 0x0f, 0x1b, 0x00, 0xfb, 0x0f, + 0x1b, 0x00, 0x74, 0x11, 0x1b, 0x00, 0x75, 0x11, 0x1b, 0x00, 0x78, 0x11, + 0x1b, 0x00, 0x7c, 0x11, 0x1b, 0x00, 0x7e, 0x11, 0x1b, 0x00, 0x7f, 0x11, + 0x1b, 0x00, 0xf4, 0x11, 0x1b, 0x00, 0xf5, 0x11, 0x1b, 0x00, 0xf8, 0x11, + 0x1b, 0x00, 0xfc, 0x11, 0x1b, 0x00, 0xfe, 0x11, 0x1b, 0x00, 0xff, 0x11, + 0x1b, 0x00, 0xf3, 0x17, 0x1b, 0x00, 0xfb, 0x17, 0x1b, 0x00, 0x88, 0x33, + 0x1b, 0x00, 0x8b, 0x33, 0x1b, 0x00, 0xf0, 0x33, 0x1b, 0x00, 0xf1, 0x33, + 0x1b, 0x00, 0xf9, 0x33, 0x1b, 0x00, 0xfd, 0x33, 0x1b, 0x00, 0xf0, 0x3b, + 0x1b, 0x00, 0xf1, 0x3b, 0x1b, 0x00, 0xf9, 0x3b, 0x1b, 0x00, 0xfd, 0x3b, + 0x1b, 0x00, 0x90, 0x3f, 0x1b, 0x00, 0x98, 0x3f, 0x1b, 0x00, 0x9c, 0x3f, + 0x1b, 0x00, 0x9e, 0x3f, 0x1b, 0x00, 0x9f, 0x3f, 0x1b, 0x00, 0xd0, 0x3f, + 0x1b, 0x00, 0xd8, 0x3f, 0x1b, 0x00, 0xdc, 0x3f, 0x1b, 0x00, 0xde, 0x3f, + 0x1b, 0x00, 0xdf, 0x3f, 0x1b, 0x00, 0x70, 0x44, 0x1b, 0x00, 0x71, 0x44, + 0x1b, 0x00, 0x79, 0x44, 0x1b, 0x00, 0x7d, 0x44, 0x1b, 0x00, 0xb0, 0x44, + 0x1b, 0x00, 0xf7, 0x45, 0x1b, 0x00, 0xf8, 0x45, 0x1b, 0x00, 0xfc, 0x45, + 0x1b, 0x00, 0xfe, 0x45, 0x1b, 0x00, 0xff, 0x45, 0x1b, 0x00, 0x70, 0x46, + 0x1b, 0x00, 0x71, 0x46, 0x1b, 0x00, 0x79, 0x46, 0x1b, 0x00, 0x7d, 0x46, + 0x1b, 0x00, 0xb0, 0x46, 0x1b, 0x00, 0x0b, 0x4f, 0x1b, 0x00, 0xf0, 0x51, + 0x1b, 0x00, 0xf1, 0x51, 0x1b, 0x00, 0xf9, 0x51, 0x1b, 0x00, 0xfd, 0x51, + 0x1b, 0x00, 0x0b, 0x55, 0x1b, 0x00, 0x6b, 0x55, 0x1b, 0x00, 0x78, 0x55, + 0x1b, 0x00, 0x7c, 0x55, 0x1b, 0x00, 0x7e, 0x55, 0x1b, 0x00, 0x7f, 0x55, + 0x1b, 0x00, 0xcb, 0x57, 0x1b, 0x00, 0xeb, 0x57, 0x1b, 0x00, 0xf8, 0x57, + 0x1b, 0x00, 0xfc, 0x57, 0x1b, 0x00, 0xfe, 0x57, 0x1b, 0x00, 0xff, 0x57, + 0x1b, 0x00, 0xf7, 0x59, 0x1b, 0x00, 0xf8, 0x59, 0x1b, 0x00, 0xfc, 0x59, + 0x1b, 0x00, 0xfe, 0x59, 0x1b, 0x00, 0xff, 0x59, 0x1b, 0x00, 0xb0, 0x5a, + 0x1b, 0x00, 0xf7, 0x5d, 0x1b, 0x00, 0xf8, 0x5d, 0x1b, 0x00, 0xfc, 0x5d, + 0x1b, 0x00, 0xfe, 0x5d, 0x1b, 0x00, 0xff, 0x5d, 0x1b, 0x00, 0xf7, 0x5f, + 0x1b, 0x00, 0xf8, 0x5f, 0x1b, 0x00, 0xfc, 0x5f, 0x1b, 0x00, 0xfe, 0x5f, + 0x1b, 0x00, 0xff, 0x5f, 0x1b, 0x00, 0x0b, 0x7b, 0x1b, 0x00, 0xf0, 0x87, + 0x1b, 0x00, 0xf1, 0x87, 0x1b, 0x00, 0xf3, 0x87, 0x1b, 0x00, 0xf9, 0x87, + 0x1b, 0x00, 0xfb, 0x87, 0x1b, 0x00, 0xfd, 0x87, 0x1b, 0x00, 0x11, 0x8b, + 0x1b, 0x00, 0x16, 0x8b, 0x1b, 0x00, 0x17, 0x8b, 0x1b, 0x00, 0x19, 0x8b, + 0x1b, 0x00, 0x1d, 0x8b, 0x1b, 0x00, 0x76, 0x8b, 0x1b, 0x00, 0x77, 0x8b, + 0x1b, 0x00, 0x78, 0x8b, 0x1b, 0x00, 0x7c, 0x8b, 0x1b, 0x00, 0x7e, 0x8b, + 0x1b, 0x00, 0x7f, 0x8b, 0x1b, 0x00, 0xf3, 0x99, 0x1b, 0x00, 0xfb, 0x99, + 0x1b, 0x00, 0xf4, 0x9f, 0x1b, 0x00, 0xf5, 0x9f, 0x1b, 0x00, 0xf8, 0x9f, + 0x1b, 0x00, 0xfc, 0x9f, 0x1b, 0x00, 0xfe, 0x9f, 0x1b, 0x00, 0xff, 0x9f, + 0x1b, 0x00, 0xf8, 0xa7, 0x1b, 0x00, 0xfc, 0xa7, 0x1b, 0x00, 0xfe, 0xa7, + 0x1b, 0x00, 0xff, 0xa7, 0x1b, 0x00, 0x88, 0xb3, 0x1b, 0x00, 0x8b, 0xb3, + 0x1b, 0x00, 0xf0, 0xb3, 0x1b, 0x00, 0xf1, 0xb3, 0x1b, 0x00, 0xf9, 0xb3, + 0x1b, 0x00, 0xfd, 0xb3, 0x1b, 0x00, 0x77, 0xb8, 0x1b, 0x00, 0x78, 0xb8, + 0x1b, 0x00, 0x7c, 0xb8, 0x1b, 0x00, 0x7e, 0xb8, 0x1b, 0x00, 0x7f, 0xb8, + 0x1b, 0x00, 0x90, 0xbb, 0x1b, 0x00, 0x98, 0xbb, 0x1b, 0x00, 0x9c, 0xbb, + 0x1b, 0x00, 0x9e, 0xbb, 0x1b, 0x00, 0x9f, 0xbb, 0x1b, 0x00, 0xd0, 0xbb, + 0x1b, 0x00, 0xd8, 0xbb, 0x1b, 0x00, 0xdc, 0xbb, 0x1b, 0x00, 0xde, 0xbb, + 0x1b, 0x00, 0xdf, 0xbb, 0x1b, 0x00, 0x90, 0xbf, 0x1b, 0x00, 0x98, 0xbf, + 0x1b, 0x00, 0x9c, 0xbf, 0x1b, 0x00, 0x9e, 0xbf, 0x1b, 0x00, 0x9f, 0xbf, + 0x1b, 0x00, 0xd0, 0xbf, 0x1b, 0x00, 0xd8, 0xbf, 0x1b, 0x00, 0xdc, 0xbf, + 0x1b, 0x00, 0xde, 0xbf, 0x1b, 0x00, 0xdf, 0xbf, 0x1b, 0x00, 0xf3, 0xd3, + 0x1b, 0x00, 0xfb, 0xd3, 0x1b, 0x00, 0xf4, 0xdb, 0x1b, 0x00, 0xf5, 0xdb, + 0x1b, 0x00, 0xf8, 0xdb, 0x1b, 0x00, 0xfc, 0xdb, 0x1b, 0x00, 0xfe, 0xdb, + 0x1b, 0x00, 0xff, 0xdb, 0x1b, 0x00, 0x0b, 0xe5, 0x1b, 0x00, 0x68, 0xe5, + 0x1b, 0x00, 0x6b, 0xe5, 0x1b, 0x00, 0xf2, 0xe7, 0x1b, 0x00, 0xf4, 0xe7, + 0x1b, 0x00, 0xf5, 0xe7, 0x1b, 0x00, 0xf6, 0xe7, 0x1b, 0x00, 0xf7, 0xe7, + 0x1b, 0x00, 0xf8, 0xe7, 0x1b, 0x00, 0xfa, 0xe7, 0x1b, 0x00, 0xfc, 0xe7, + 0x1b, 0x00, 0xfe, 0xe7, 0x1b, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0x08, 0xf3, + 0x1b, 0x00, 0x0b, 0xf3, 0x1b, 0x00, 0x0b, 0xf9, 0x1b, 0x00, 0x68, 0xf9, + 0x1b, 0x00, 0x6b, 0xf9, 0x1b, 0x00, 0x78, 0xf9, 0x1b, 0x00, 0x7c, 0xf9, + 0x1b, 0x00, 0x7e, 0xf9, 0x1b, 0x00, 0x7f, 0xf9, 0x1b, 0x00, 0xf7, 0xf9, + 0x1b, 0x00, 0x0b, 0xfd, 0x1b, 0x00, 0x68, 0xfd, 0x1b, 0x00, 0x6b, 0xfd, + 0x1b, 0x00, 0xf2, 0xff, 0x1b, 0x00, 0xf4, 0xff, 0x1b, 0x00, 0xf5, 0xff, + 0x1b, 0x00, 0xf6, 0xff, 0x1b, 0x00, 0xf7, 0xff, 0x1b, 0x00, 0xf8, 0xff, + 0x1b, 0x00, 0xfa, 0xff, 0x1b, 0x00, 0xfc, 0xff, 0x1b, 0x00, 0xfe, 0xff, + 0x1b, 0x00, 0xff, 0xff, 0x1b, 0x00, 0xcb, 0x00, 0x1c, 0x00, 0xeb, 0x00, + 0x1c, 0x00, 0xf8, 0x00, 0x1c, 0x00, 0xfc, 0x00, 0x1c, 0x00, 0xfe, 0x00, + 0x1c, 0x00, 0xff, 0x00, 0x1c, 0x00, 0x38, 0x01, 0x1c, 0x00, 0x3c, 0x01, + 0x1c, 0x00, 0x3e, 0x01, 0x1c, 0x00, 0x3f, 0x01, 0x1c, 0x00, 0xb8, 0x01, + 0x1c, 0x00, 0xbc, 0x01, 0x1c, 0x00, 0xbe, 0x01, 0x1c, 0x00, 0xbf, 0x01, + 0x1c, 0x00, 0x38, 0x02, 0x1c, 0x00, 0x3c, 0x02, 0x1c, 0x00, 0x3e, 0x02, + 0x1c, 0x00, 0x3f, 0x02, 0x1c, 0x00, 0xcb, 0x02, 0x1c, 0x00, 0xeb, 0x02, + 0x1c, 0x00, 0xf8, 0x02, 0x1c, 0x00, 0xfc, 0x02, 0x1c, 0x00, 0xfe, 0x02, + 0x1c, 0x00, 0xff, 0x02, 0x1c, 0x00, 0x2b, 0x03, 0x1c, 0x00, 0xb8, 0x08, + 0x1c, 0x00, 0xbc, 0x08, 0x1c, 0x00, 0xbe, 0x08, 0x1c, 0x00, 0xbf, 0x08, + 0x1c, 0x00, 0xcb, 0x08, 0x1c, 0x00, 0xeb, 0x08, 0x1c, 0x00, 0x2b, 0x0b, + 0x1c, 0x00, 0xab, 0x0b, 0x1c, 0x00, 0xf8, 0x0b, 0x1c, 0x00, 0xfc, 0x0b, + 0x1c, 0x00, 0xfe, 0x0b, 0x1c, 0x00, 0xff, 0x0b, 0x1c, 0x00, 0x2b, 0x0d, + 0x1c, 0x00, 0x38, 0x0f, 0x1c, 0x00, 0x3c, 0x0f, 0x1c, 0x00, 0x3e, 0x0f, + 0x1c, 0x00, 0x3f, 0x0f, 0x1c, 0x00, 0x2b, 0x11, 0x1c, 0x00, 0x2b, 0x13, + 0x1c, 0x00, 0xcb, 0x13, 0x1c, 0x00, 0xeb, 0x13, 0x1c, 0x00, 0x2b, 0x19, + 0x1c, 0x00, 0x78, 0x1a, 0x1c, 0x00, 0x7c, 0x1a, 0x1c, 0x00, 0x7e, 0x1a, + 0x1c, 0x00, 0x7f, 0x1a, 0x1c, 0x00, 0x2b, 0x1d, 0x1c, 0x00, 0x38, 0x1f, + 0x1c, 0x00, 0x3c, 0x1f, 0x1c, 0x00, 0x3e, 0x1f, 0x1c, 0x00, 0x3f, 0x1f, + 0x1c, 0x00, 0x38, 0x22, 0x1c, 0x00, 0x3c, 0x22, 0x1c, 0x00, 0x3e, 0x22, + 0x1c, 0x00, 0x3f, 0x22, 0x1c, 0x00, 0xcb, 0x22, 0x1c, 0x00, 0xeb, 0x22, + 0x1c, 0x00, 0xf8, 0x22, 0x1c, 0x00, 0xfc, 0x22, 0x1c, 0x00, 0xfe, 0x22, + 0x1c, 0x00, 0xff, 0x22, 0x1c, 0x00, 0x2b, 0x23, 0x1c, 0x00, 0xb8, 0x24, + 0x1c, 0x00, 0xbc, 0x24, 0x1c, 0x00, 0xbe, 0x24, 0x1c, 0x00, 0xbf, 0x24, + 0x1c, 0x00, 0x8b, 0x27, 0x1c, 0x00, 0xcb, 0x27, 0x1c, 0x00, 0xeb, 0x27, + 0x1c, 0x00, 0xcb, 0x28, 0x1c, 0x00, 0xeb, 0x28, 0x1c, 0x00, 0xf8, 0x2b, + 0x1c, 0x00, 0xfc, 0x2b, 0x1c, 0x00, 0xfe, 0x2b, 0x1c, 0x00, 0xff, 0x2b, + 0x1c, 0x00, 0xcb, 0x2c, 0x1c, 0x00, 0xeb, 0x2c, 0x1c, 0x00, 0xf8, 0x2c, + 0x1c, 0x00, 0xfc, 0x2c, 0x1c, 0x00, 0xfe, 0x2c, 0x1c, 0x00, 0xff, 0x2c, + 0x1c, 0x00, 0xcb, 0x2e, 0x1c, 0x00, 0xeb, 0x2e, 0x1c, 0x00, 0xf8, 0x2e, + 0x1c, 0x00, 0xfc, 0x2e, 0x1c, 0x00, 0xfe, 0x2e, 0x1c, 0x00, 0xff, 0x2e, + 0x1c, 0x00, 0xcb, 0x2f, 0x1c, 0x00, 0xeb, 0x2f, 0x1c, 0x00, 0xf8, 0x2f, + 0x1c, 0x00, 0xfc, 0x2f, 0x1c, 0x00, 0xfe, 0x2f, 0x1c, 0x00, 0xff, 0x2f, + 0x1c, 0x00, 0x38, 0x33, 0x1c, 0x00, 0x3c, 0x33, 0x1c, 0x00, 0x3e, 0x33, + 0x1c, 0x00, 0x3f, 0x33, 0x1c, 0x00, 0xb8, 0x33, 0x1c, 0x00, 0xbc, 0x33, + 0x1c, 0x00, 0xbe, 0x33, 0x1c, 0x00, 0xbf, 0x33, 0x1c, 0x00, 0x2b, 0x35, + 0x1c, 0x00, 0x38, 0x37, 0x1c, 0x00, 0x3c, 0x37, 0x1c, 0x00, 0x3e, 0x37, + 0x1c, 0x00, 0x3f, 0x37, 0x1c, 0x00, 0xb0, 0x37, 0x1c, 0x00, 0xb1, 0x37, + 0x1c, 0x00, 0xb7, 0x37, 0x1c, 0x00, 0xb9, 0x37, 0x1c, 0x00, 0xbd, 0x37, + 0x1c, 0x00, 0xb0, 0x38, 0x1c, 0x00, 0xb1, 0x38, 0x1c, 0x00, 0xb7, 0x38, + 0x1c, 0x00, 0xb9, 0x38, 0x1c, 0x00, 0xbd, 0x38, 0x1c, 0x00, 0x38, 0x3b, + 0x1c, 0x00, 0x3c, 0x3b, 0x1c, 0x00, 0x3e, 0x3b, 0x1c, 0x00, 0x3f, 0x3b, + 0x1c, 0x00, 0xb0, 0x3b, 0x1c, 0x00, 0xb1, 0x3b, 0x1c, 0x00, 0xb7, 0x3b, + 0x1c, 0x00, 0xb9, 0x3b, 0x1c, 0x00, 0xbd, 0x3b, 0x1c, 0x00, 0x78, 0x3e, + 0x1c, 0x00, 0x7c, 0x3e, 0x1c, 0x00, 0x7e, 0x3e, 0x1c, 0x00, 0x7f, 0x3e, + 0x1c, 0x00, 0x2b, 0x3f, 0x1c, 0x00, 0xab, 0x3f, 0x1c, 0x00, 0xf8, 0x3f, + 0x1c, 0x00, 0xfc, 0x3f, 0x1c, 0x00, 0xfe, 0x3f, 0x1c, 0x00, 0xff, 0x3f, + 0x1c, 0x00, 0x77, 0x40, 0x1c, 0x00, 0x78, 0x40, 0x1c, 0x00, 0x7c, 0x40, + 0x1c, 0x00, 0x7e, 0x40, 0x1c, 0x00, 0x7f, 0x40, 0x1c, 0x00, 0xf7, 0x41, + 0x1c, 0x00, 0xf8, 0x41, 0x1c, 0x00, 0xfc, 0x41, 0x1c, 0x00, 0xfe, 0x41, + 0x1c, 0x00, 0xff, 0x41, 0x1c, 0x00, 0x30, 0x45, 0x1c, 0x00, 0x31, 0x45, + 0x1c, 0x00, 0x39, 0x45, 0x1c, 0x00, 0x3d, 0x45, 0x1c, 0x00, 0x37, 0x47, + 0x1c, 0x00, 0x38, 0x47, 0x1c, 0x00, 0x3c, 0x47, 0x1c, 0x00, 0x3e, 0x47, + 0x1c, 0x00, 0x3f, 0x47, 0x1c, 0x00, 0xb0, 0x47, 0x1c, 0x00, 0xb1, 0x47, + 0x1c, 0x00, 0xb9, 0x47, 0x1c, 0x00, 0xbd, 0x47, 0x1c, 0x00, 0x70, 0x4a, + 0x1c, 0x00, 0x71, 0x4a, 0x1c, 0x00, 0x77, 0x4a, 0x1c, 0x00, 0x79, 0x4a, + 0x1c, 0x00, 0x7d, 0x4a, 0x1c, 0x00, 0xb0, 0x4b, 0x1c, 0x00, 0x0b, 0x4f, + 0x1c, 0x00, 0xb0, 0x50, 0x1c, 0x00, 0xb1, 0x50, 0x1c, 0x00, 0xb9, 0x50, + 0x1c, 0x00, 0xbd, 0x50, 0x1c, 0x00, 0x78, 0x52, 0x1c, 0x00, 0x7c, 0x52, + 0x1c, 0x00, 0x7e, 0x52, 0x1c, 0x00, 0x7f, 0x52, 0x1c, 0x00, 0x30, 0x53, + 0x1c, 0x00, 0x31, 0x53, 0x1c, 0x00, 0x39, 0x53, 0x1c, 0x00, 0x3d, 0x53, + 0x1c, 0x00, 0xb0, 0x54, 0x1c, 0x00, 0xb1, 0x54, 0x1c, 0x00, 0xb7, 0x54, + 0x1c, 0x00, 0xb9, 0x54, 0x1c, 0x00, 0xbd, 0x54, 0x1c, 0x00, 0x78, 0x55, + 0x1c, 0x00, 0x7c, 0x55, 0x1c, 0x00, 0x7e, 0x55, 0x1c, 0x00, 0x7f, 0x55, + 0x1c, 0x00, 0xcb, 0x57, 0x1c, 0x00, 0xeb, 0x57, 0x1c, 0x00, 0xf0, 0x57, + 0x1c, 0x00, 0xf1, 0x57, 0x1c, 0x00, 0xf7, 0x57, 0x1c, 0x00, 0xf9, 0x57, + 0x1c, 0x00, 0xfd, 0x57, 0x1c, 0x00, 0xb7, 0x58, 0x1c, 0x00, 0xb8, 0x58, + 0x1c, 0x00, 0xbc, 0x58, 0x1c, 0x00, 0xbe, 0x58, 0x1c, 0x00, 0xbf, 0x58, + 0x1c, 0x00, 0x37, 0x59, 0x1c, 0x00, 0x38, 0x59, 0x1c, 0x00, 0x3c, 0x59, + 0x1c, 0x00, 0x3e, 0x59, 0x1c, 0x00, 0x3f, 0x59, 0x1c, 0x00, 0xb8, 0x59, + 0x1c, 0x00, 0xbc, 0x59, 0x1c, 0x00, 0xbe, 0x59, 0x1c, 0x00, 0xbf, 0x59, + 0x1c, 0x00, 0x30, 0x5b, 0x1c, 0x00, 0x31, 0x5b, 0x1c, 0x00, 0x39, 0x5b, + 0x1c, 0x00, 0x3d, 0x5b, 0x1c, 0x00, 0xb7, 0x5b, 0x1c, 0x00, 0xb8, 0x5b, + 0x1c, 0x00, 0xbc, 0x5b, 0x1c, 0x00, 0xbe, 0x5b, 0x1c, 0x00, 0xbf, 0x5b, + 0x1c, 0x00, 0x78, 0x5c, 0x1c, 0x00, 0x7c, 0x5c, 0x1c, 0x00, 0x7e, 0x5c, + 0x1c, 0x00, 0x7f, 0x5c, 0x1c, 0x00, 0xb8, 0x5c, 0x1c, 0x00, 0xbc, 0x5c, + 0x1c, 0x00, 0xbe, 0x5c, 0x1c, 0x00, 0xbf, 0x5c, 0x1c, 0x00, 0x30, 0x5d, + 0x1c, 0x00, 0x31, 0x5d, 0x1c, 0x00, 0x39, 0x5d, 0x1c, 0x00, 0x3d, 0x5d, + 0x1c, 0x00, 0xb8, 0x5e, 0x1c, 0x00, 0xbc, 0x5e, 0x1c, 0x00, 0xbe, 0x5e, + 0x1c, 0x00, 0xbf, 0x5e, 0x1c, 0x00, 0x2b, 0x5f, 0x1c, 0x00, 0xab, 0x5f, + 0x1c, 0x00, 0xf0, 0x5f, 0x1c, 0x00, 0xf1, 0x5f, 0x1c, 0x00, 0xf9, 0x5f, + 0x1c, 0x00, 0xfd, 0x5f, 0x1c, 0x00, 0xcb, 0x64, 0x1c, 0x00, 0xeb, 0x64, + 0x1c, 0x00, 0x0b, 0x66, 0x1c, 0x00, 0xcb, 0x66, 0x1c, 0x00, 0xeb, 0x66, + 0x1c, 0x00, 0x71, 0x80, 0x1c, 0x00, 0x79, 0x80, 0x1c, 0x00, 0xf1, 0x80, + 0x1c, 0x00, 0xf9, 0x80, 0x1c, 0x00, 0x77, 0x81, 0x1c, 0x00, 0xf7, 0x81, + 0x1c, 0x00, 0xf1, 0x82, 0x1c, 0x00, 0xf9, 0x82, 0x1c, 0x00, 0xf7, 0x83, + 0x1c, 0x00, 0x71, 0x84, 0x1c, 0x00, 0x79, 0x84, 0x1c, 0x00, 0x78, 0x85, + 0x1c, 0x00, 0x7c, 0x85, 0x1c, 0x00, 0x7e, 0x85, 0x1c, 0x00, 0x7f, 0x85, + 0x1c, 0x00, 0xf7, 0x85, 0x1c, 0x00, 0x71, 0x86, 0x1c, 0x00, 0x79, 0x86, + 0x1c, 0x00, 0x70, 0x87, 0x1c, 0x00, 0x71, 0x87, 0x1c, 0x00, 0x79, 0x87, + 0x1c, 0x00, 0x7d, 0x87, 0x1c, 0x00, 0x0b, 0x89, 0x1c, 0x00, 0xbb, 0x89, + 0x1c, 0x00, 0x0b, 0x8b, 0x1c, 0x00, 0xf1, 0x8b, 0x1c, 0x00, 0xf7, 0x8b, + 0x1c, 0x00, 0xf9, 0x8b, 0x1c, 0x00, 0x0b, 0x8d, 0x1c, 0x00, 0xbb, 0x8d, + 0x1c, 0x00, 0x3b, 0x94, 0x1c, 0x00, 0x3b, 0x96, 0x1c, 0x00, 0x0b, 0xa7, + 0x1c, 0x00, 0x78, 0xa7, 0x1c, 0x00, 0x7c, 0xa7, 0x1c, 0x00, 0x7e, 0xa7, + 0x1c, 0x00, 0x7f, 0xa7, 0x1c, 0x00, 0xf8, 0xaa, 0x1c, 0x00, 0xfc, 0xaa, + 0x1c, 0x00, 0xfe, 0xaa, 0x1c, 0x00, 0xff, 0xaa, 0x1c, 0x00, 0xbb, 0xb2, + 0x1c, 0x00, 0x71, 0xb7, 0x1c, 0x00, 0x77, 0xb7, 0x1c, 0x00, 0x79, 0xb7, + 0x1c, 0x00, 0x0b, 0xbb, 0x1c, 0x00, 0xf1, 0xbb, 0x1c, 0x00, 0xf7, 0xbb, + 0x1c, 0x00, 0xf9, 0xbb, 0x1c, 0x00, 0xf0, 0xbc, 0x1c, 0x00, 0xf1, 0xbc, + 0x1c, 0x00, 0xf7, 0xbc, 0x1c, 0x00, 0xf9, 0xbc, 0x1c, 0x00, 0xfd, 0xbc, + 0x1c, 0x00, 0xbb, 0xbe, 0x1c, 0x00, 0xf1, 0xbf, 0x1c, 0x00, 0xf7, 0xbf, + 0x1c, 0x00, 0xf9, 0xbf, 0x1c, 0x00, 0x30, 0xc0, 0x1c, 0x00, 0x30, 0xc1, + 0x1c, 0x00, 0x30, 0xc2, 0x1c, 0x00, 0x78, 0xc2, 0x1c, 0x00, 0x7c, 0xc2, + 0x1c, 0x00, 0x7e, 0xc2, 0x1c, 0x00, 0x7f, 0xc2, 0x1c, 0x00, 0xf0, 0xc2, + 0x1c, 0x00, 0xf1, 0xc2, 0x1c, 0x00, 0xf9, 0xc2, 0x1c, 0x00, 0xfd, 0xc2, + 0x1c, 0x00, 0xf6, 0xc3, 0x1c, 0x00, 0xf7, 0xc3, 0x1c, 0x00, 0xf8, 0xc3, + 0x1c, 0x00, 0xfc, 0xc3, 0x1c, 0x00, 0xfe, 0xc3, 0x1c, 0x00, 0xff, 0xc3, + 0x1c, 0x00, 0xf6, 0xc5, 0x1c, 0x00, 0xf7, 0xc5, 0x1c, 0x00, 0xf8, 0xc5, + 0x1c, 0x00, 0xfc, 0xc5, 0x1c, 0x00, 0xfe, 0xc5, 0x1c, 0x00, 0xff, 0xc5, + 0x1c, 0x00, 0xb0, 0xc6, 0x1c, 0x00, 0xf0, 0xc7, 0x1c, 0x00, 0xf1, 0xc7, + 0x1c, 0x00, 0xf9, 0xc7, 0x1c, 0x00, 0xfd, 0xc7, 0x1c, 0x00, 0xb0, 0xc8, + 0x1c, 0x00, 0x2b, 0xc9, 0x1c, 0x00, 0x30, 0xcb, 0x1c, 0x00, 0xd1, 0xcc, + 0x1c, 0x00, 0xd6, 0xcc, 0x1c, 0x00, 0xd7, 0xcc, 0x1c, 0x00, 0xd8, 0xcc, + 0x1c, 0x00, 0xdc, 0xcc, 0x1c, 0x00, 0xde, 0xcc, 0x1c, 0x00, 0xdf, 0xcc, + 0x1c, 0x00, 0x18, 0xcf, 0x1c, 0x00, 0x1c, 0xcf, 0x1c, 0x00, 0x1e, 0xcf, + 0x1c, 0x00, 0x1f, 0xcf, 0x1c, 0x00, 0x91, 0xcf, 0x1c, 0x00, 0x96, 0xcf, + 0x1c, 0x00, 0x97, 0xcf, 0x1c, 0x00, 0x98, 0xcf, 0x1c, 0x00, 0x9c, 0xcf, + 0x1c, 0x00, 0x9e, 0xcf, 0x1c, 0x00, 0x9f, 0xcf, 0x1c, 0x00, 0xd1, 0xcf, + 0x1c, 0x00, 0xd6, 0xcf, 0x1c, 0x00, 0xd7, 0xcf, 0x1c, 0x00, 0xd8, 0xcf, + 0x1c, 0x00, 0xdc, 0xcf, 0x1c, 0x00, 0xde, 0xcf, 0x1c, 0x00, 0xdf, 0xcf, + 0x1c, 0x00, 0x48, 0xd8, 0x1c, 0x00, 0x4b, 0xd8, 0x1c, 0x00, 0xf8, 0xd9, + 0x1c, 0x00, 0xfc, 0xd9, 0x1c, 0x00, 0xfe, 0xd9, 0x1c, 0x00, 0xff, 0xd9, + 0x1c, 0x00, 0xf8, 0xdd, 0x1c, 0x00, 0xfc, 0xdd, 0x1c, 0x00, 0xfe, 0xdd, + 0x1c, 0x00, 0xff, 0xdd, 0x1c, 0x00, 0xb0, 0xe0, 0x1c, 0x00, 0x30, 0xe2, + 0x1c, 0x00, 0xf6, 0xe2, 0x1c, 0x00, 0xf7, 0xe2, 0x1c, 0x00, 0xf8, 0xe2, + 0x1c, 0x00, 0xfc, 0xe2, 0x1c, 0x00, 0xfe, 0xe2, 0x1c, 0x00, 0xff, 0xe2, + 0x1c, 0x00, 0x30, 0xe5, 0x1c, 0x00, 0xf0, 0xe5, 0x1c, 0x00, 0xc6, 0xe7, + 0x1c, 0x00, 0xe6, 0xe7, 0x1c, 0x00, 0xf6, 0xe7, 0x1c, 0x00, 0xf7, 0xe7, + 0x1c, 0x00, 0xf8, 0xe7, 0x1c, 0x00, 0xfc, 0xe7, 0x1c, 0x00, 0xfe, 0xe7, + 0x1c, 0x00, 0xff, 0xe7, 0x1c, 0x00, 0xb0, 0xe8, 0x1c, 0x00, 0xb0, 0xea, + 0x1c, 0x00, 0x30, 0xeb, 0x1c, 0x00, 0x30, 0xec, 0x1c, 0x00, 0x30, 0xee, + 0x1c, 0x00, 0xb0, 0xf0, 0x1c, 0x00, 0xb0, 0xf1, 0x1c, 0x00, 0x30, 0xf3, + 0x1c, 0x00, 0x90, 0xf3, 0x1c, 0x00, 0xd0, 0xf3, 0x1c, 0x00, 0xb0, 0xf4, + 0x1c, 0x00, 0xb0, 0xf6, 0x1c, 0x00, 0xb0, 0xf7, 0x1c, 0x00, 0x30, 0xf9, + 0x1c, 0x00, 0xf7, 0xf9, 0x1c, 0x00, 0xf8, 0xf9, 0x1c, 0x00, 0xfc, 0xf9, + 0x1c, 0x00, 0xfe, 0xf9, 0x1c, 0x00, 0xff, 0xf9, 0x1c, 0x00, 0x30, 0xfb, + 0x1c, 0x00, 0x30, 0xfd, 0x1c, 0x00, 0xf0, 0xfd, 0x1c, 0x00, 0x26, 0xff, + 0x1c, 0x00, 0x27, 0xff, 0x1c, 0x00, 0x29, 0xff, 0x1c, 0x00, 0x2a, 0xff, + 0x1c, 0x00, 0x88, 0xff, 0x1c, 0x00, 0x8b, 0xff, 0x1c, 0x00, 0xc6, 0xff, + 0x1c, 0x00, 0xe6, 0xff, 0x1c, 0x00, 0xf6, 0xff, 0x1c, 0x00, 0xf7, 0xff, + 0x1c, 0x00, 0xf8, 0xff, 0x1c, 0x00, 0xfc, 0xff, 0x1c, 0x00, 0xfe, 0xff, + 0x1c, 0x00, 0xff, 0xff, 0x1c, 0x00, 0xf3, 0x00, 0x1d, 0x00, 0xfb, 0x00, + 0x1d, 0x00, 0x58, 0x01, 0x1d, 0x00, 0xf4, 0x05, 0x1d, 0x00, 0xf5, 0x05, + 0x1d, 0x00, 0xf8, 0x05, 0x1d, 0x00, 0xfc, 0x05, 0x1d, 0x00, 0xfe, 0x05, + 0x1d, 0x00, 0xff, 0x05, 0x1d, 0x00, 0xf3, 0x08, 0x1d, 0x00, 0xfb, 0x08, + 0x1d, 0x00, 0xf8, 0x0a, 0x1d, 0x00, 0xfc, 0x0a, 0x1d, 0x00, 0xfe, 0x0a, + 0x1d, 0x00, 0xff, 0x0a, 0x1d, 0x00, 0xf4, 0x0b, 0x1d, 0x00, 0xf5, 0x0b, + 0x1d, 0x00, 0xf8, 0x0b, 0x1d, 0x00, 0xfc, 0x0b, 0x1d, 0x00, 0xfe, 0x0b, + 0x1d, 0x00, 0xff, 0x0b, 0x1d, 0x00, 0xf4, 0x0c, 0x1d, 0x00, 0xf5, 0x0c, + 0x1d, 0x00, 0xf8, 0x0c, 0x1d, 0x00, 0xfc, 0x0c, 0x1d, 0x00, 0xfe, 0x0c, + 0x1d, 0x00, 0xff, 0x0c, 0x1d, 0x00, 0xf3, 0x0f, 0x1d, 0x00, 0xfb, 0x0f, + 0x1d, 0x00, 0xf4, 0x11, 0x1d, 0x00, 0xf5, 0x11, 0x1d, 0x00, 0xf8, 0x11, + 0x1d, 0x00, 0xfc, 0x11, 0x1d, 0x00, 0xfe, 0x11, 0x1d, 0x00, 0xff, 0x11, + 0x1d, 0x00, 0xc8, 0x1c, 0x1d, 0x00, 0xcb, 0x1c, 0x1d, 0x00, 0xe8, 0x1c, + 0x1d, 0x00, 0xeb, 0x1c, 0x1d, 0x00, 0xf8, 0x1c, 0x1d, 0x00, 0xfc, 0x1c, + 0x1d, 0x00, 0xfe, 0x1c, 0x1d, 0x00, 0xff, 0x1c, 0x1d, 0x00, 0xf4, 0x1f, + 0x1d, 0x00, 0xf5, 0x1f, 0x1d, 0x00, 0xf8, 0x1f, 0x1d, 0x00, 0xfc, 0x1f, + 0x1d, 0x00, 0xfe, 0x1f, 0x1d, 0x00, 0xff, 0x1f, 0x1d, 0x00, 0xf8, 0x29, + 0x1d, 0x00, 0xfc, 0x29, 0x1d, 0x00, 0xfe, 0x29, 0x1d, 0x00, 0xff, 0x29, + 0x1d, 0x00, 0x30, 0x33, 0x1d, 0x00, 0x30, 0x39, 0x1d, 0x00, 0x30, 0x3d, + 0x1d, 0x00, 0x88, 0x3f, 0x1d, 0x00, 0x8b, 0x3f, 0x1d, 0x00, 0xf0, 0x3f, + 0x1d, 0x00, 0xf1, 0x3f, 0x1d, 0x00, 0xf9, 0x3f, 0x1d, 0x00, 0xfd, 0x3f, + 0x1d, 0x00, 0xb0, 0x40, 0x1d, 0x00, 0x30, 0x42, 0x1d, 0x00, 0xf0, 0x42, + 0x1d, 0x00, 0xf1, 0x42, 0x1d, 0x00, 0xf9, 0x42, 0x1d, 0x00, 0xfd, 0x42, + 0x1d, 0x00, 0xf6, 0x43, 0x1d, 0x00, 0xf7, 0x43, 0x1d, 0x00, 0xf8, 0x43, + 0x1d, 0x00, 0xfc, 0x43, 0x1d, 0x00, 0xfe, 0x43, 0x1d, 0x00, 0xff, 0x43, + 0x1d, 0x00, 0xf6, 0x45, 0x1d, 0x00, 0xf7, 0x45, 0x1d, 0x00, 0xf8, 0x45, + 0x1d, 0x00, 0xfc, 0x45, 0x1d, 0x00, 0xfe, 0x45, 0x1d, 0x00, 0xff, 0x45, + 0x1d, 0x00, 0xf0, 0x47, 0x1d, 0x00, 0xf1, 0x47, 0x1d, 0x00, 0xf9, 0x47, + 0x1d, 0x00, 0xfd, 0x47, 0x1d, 0x00, 0x51, 0x49, 0x1d, 0x00, 0x56, 0x49, + 0x1d, 0x00, 0x57, 0x49, 0x1d, 0x00, 0x58, 0x49, 0x1d, 0x00, 0x5c, 0x49, + 0x1d, 0x00, 0x5e, 0x49, 0x1d, 0x00, 0x5f, 0x49, 0x1d, 0x00, 0xf0, 0x49, + 0x1d, 0x00, 0xf1, 0x49, 0x1d, 0x00, 0xf9, 0x49, 0x1d, 0x00, 0xfd, 0x49, + 0x1d, 0x00, 0xc6, 0x4b, 0x1d, 0x00, 0xe6, 0x4b, 0x1d, 0x00, 0xf0, 0x4b, + 0x1d, 0x00, 0xf0, 0x4c, 0x1d, 0x00, 0xf1, 0x4c, 0x1d, 0x00, 0xf9, 0x4c, + 0x1d, 0x00, 0xfd, 0x4c, 0x1d, 0x00, 0xf0, 0x4e, 0x1d, 0x00, 0xf1, 0x4e, + 0x1d, 0x00, 0xf9, 0x4e, 0x1d, 0x00, 0xfd, 0x4e, 0x1d, 0x00, 0xf0, 0x4f, + 0x1d, 0x00, 0xf1, 0x4f, 0x1d, 0x00, 0xf9, 0x4f, 0x1d, 0x00, 0xfd, 0x4f, + 0x1d, 0x00, 0xf0, 0x53, 0x1d, 0x00, 0xf1, 0x53, 0x1d, 0x00, 0xf9, 0x53, + 0x1d, 0x00, 0xfd, 0x53, 0x1d, 0x00, 0x51, 0x55, 0x1d, 0x00, 0x56, 0x55, + 0x1d, 0x00, 0x57, 0x55, 0x1d, 0x00, 0x59, 0x55, 0x1d, 0x00, 0x5d, 0x55, + 0x1d, 0x00, 0xf7, 0x55, 0x1d, 0x00, 0xf8, 0x55, 0x1d, 0x00, 0xfc, 0x55, + 0x1d, 0x00, 0xfe, 0x55, 0x1d, 0x00, 0xff, 0x55, 0x1d, 0x00, 0x30, 0x5f, + 0x1d, 0x00, 0xf4, 0x61, 0x1d, 0x00, 0xf5, 0x61, 0x1d, 0x00, 0xf8, 0x61, + 0x1d, 0x00, 0xfc, 0x61, 0x1d, 0x00, 0xfe, 0x61, 0x1d, 0x00, 0xff, 0x61, + 0x1d, 0x00, 0xf3, 0x69, 0x1d, 0x00, 0xfb, 0x69, 0x1d, 0x00, 0xf8, 0x6a, + 0x1d, 0x00, 0xfc, 0x6a, 0x1d, 0x00, 0xfe, 0x6a, 0x1d, 0x00, 0xff, 0x6a, + 0x1d, 0x00, 0xf3, 0x6c, 0x1d, 0x00, 0xfb, 0x6c, 0x1d, 0x00, 0xf4, 0x6e, + 0x1d, 0x00, 0xf5, 0x6e, 0x1d, 0x00, 0xf8, 0x6e, 0x1d, 0x00, 0xfc, 0x6e, + 0x1d, 0x00, 0xfe, 0x6e, 0x1d, 0x00, 0xff, 0x6e, 0x1d, 0x00, 0xf4, 0x6f, + 0x1d, 0x00, 0xf5, 0x6f, 0x1d, 0x00, 0xf8, 0x6f, 0x1d, 0x00, 0xfc, 0x6f, + 0x1d, 0x00, 0xfe, 0x6f, 0x1d, 0x00, 0xff, 0x6f, 0x1d, 0x00, 0xcb, 0x72, + 0x1d, 0x00, 0xeb, 0x72, 0x1d, 0x00, 0xf8, 0x72, 0x1d, 0x00, 0xfc, 0x72, + 0x1d, 0x00, 0xfe, 0x72, 0x1d, 0x00, 0xff, 0x72, 0x1d, 0x00, 0xf4, 0x74, + 0x1d, 0x00, 0xf5, 0x74, 0x1d, 0x00, 0xf8, 0x74, 0x1d, 0x00, 0xfc, 0x74, + 0x1d, 0x00, 0xfe, 0x74, 0x1d, 0x00, 0xff, 0x74, 0x1d, 0x00, 0xf3, 0x77, + 0x1d, 0x00, 0xfb, 0x77, 0x1d, 0x00, 0xf1, 0x81, 0x1d, 0x00, 0xf9, 0x81, + 0x1d, 0x00, 0xf7, 0x83, 0x1d, 0x00, 0xf7, 0x85, 0x1d, 0x00, 0x37, 0x86, + 0x1d, 0x00, 0x38, 0x86, 0x1d, 0x00, 0x3c, 0x86, 0x1d, 0x00, 0x3e, 0x86, + 0x1d, 0x00, 0x3f, 0x86, 0x1d, 0x00, 0x37, 0x87, 0x1d, 0x00, 0xb1, 0x87, + 0x1d, 0x00, 0xb9, 0x87, 0x1d, 0x00, 0xf1, 0x8b, 0x1d, 0x00, 0xf7, 0x8b, + 0x1d, 0x00, 0xf9, 0x8b, 0x1d, 0x00, 0x38, 0x9e, 0x1d, 0x00, 0x3c, 0x9e, + 0x1d, 0x00, 0x3e, 0x9e, 0x1d, 0x00, 0x3f, 0x9e, 0x1d, 0x00, 0x38, 0xa7, + 0x1d, 0x00, 0x3c, 0xa7, 0x1d, 0x00, 0x3e, 0xa7, 0x1d, 0x00, 0x3f, 0xa7, + 0x1d, 0x00, 0xb8, 0xa7, 0x1d, 0x00, 0xbc, 0xa7, 0x1d, 0x00, 0xbe, 0xa7, + 0x1d, 0x00, 0xbf, 0xa7, 0x1d, 0x00, 0xcb, 0xaf, 0x1d, 0x00, 0xeb, 0xaf, + 0x1d, 0x00, 0xf8, 0xaf, 0x1d, 0x00, 0xfc, 0xaf, 0x1d, 0x00, 0xfe, 0xaf, + 0x1d, 0x00, 0xff, 0xaf, 0x1d, 0x00, 0x8b, 0xb3, 0x1d, 0x00, 0xcb, 0xb3, + 0x1d, 0x00, 0xeb, 0xb3, 0x1d, 0x00, 0xf0, 0xb3, 0x1d, 0x00, 0xf1, 0xb3, + 0x1d, 0x00, 0xf7, 0xb3, 0x1d, 0x00, 0xf9, 0xb3, 0x1d, 0x00, 0xfd, 0xb3, + 0x1d, 0x00, 0xcb, 0xbb, 0x1d, 0x00, 0xeb, 0xbb, 0x1d, 0x00, 0xf0, 0xbb, + 0x1d, 0x00, 0xf1, 0xbb, 0x1d, 0x00, 0xf7, 0xbb, 0x1d, 0x00, 0xf9, 0xbb, + 0x1d, 0x00, 0xfd, 0xbb, 0x1d, 0x00, 0x30, 0xbf, 0x1d, 0x00, 0x31, 0xbf, + 0x1d, 0x00, 0x37, 0xbf, 0x1d, 0x00, 0x39, 0xbf, 0x1d, 0x00, 0x3d, 0xbf, + 0x1d, 0x00, 0x31, 0xc5, 0x1d, 0x00, 0x39, 0xc5, 0x1d, 0x00, 0x4b, 0xc5, + 0x1d, 0x00, 0xf1, 0xe3, 0x1d, 0x00, 0xf9, 0xe3, 0x1d, 0x00, 0xf1, 0xe9, + 0x1d, 0x00, 0xf9, 0xe9, 0x1d, 0x00, 0xf1, 0xed, 0x1d, 0x00, 0xf9, 0xed, + 0x1d, 0x00, 0x31, 0xff, 0x1d, 0x00, 0x37, 0xff, 0x1d, 0x00, 0x39, 0xff, + 0x1d, 0x00, 0x48, 0x00, 0x1e, 0x00, 0x4b, 0x00, 0x1e, 0x00, 0x78, 0x00, + 0x1e, 0x00, 0x7c, 0x00, 0x1e, 0x00, 0x7e, 0x00, 0x1e, 0x00, 0x7f, 0x00, + 0x1e, 0x00, 0xb8, 0x00, 0x1e, 0x00, 0xbc, 0x00, 0x1e, 0x00, 0xbe, 0x00, + 0x1e, 0x00, 0xbf, 0x00, 0x1e, 0x00, 0x38, 0x01, 0x1e, 0x00, 0x3c, 0x01, + 0x1e, 0x00, 0x3e, 0x01, 0x1e, 0x00, 0x3f, 0x01, 0x1e, 0x00, 0x28, 0x02, + 0x1e, 0x00, 0x2b, 0x02, 0x1e, 0x00, 0xf8, 0x05, 0x1e, 0x00, 0xfc, 0x05, + 0x1e, 0x00, 0xfe, 0x05, 0x1e, 0x00, 0xff, 0x05, 0x1e, 0x00, 0x28, 0x07, + 0x1e, 0x00, 0x2b, 0x07, 0x1e, 0x00, 0xa8, 0x07, 0x1e, 0x00, 0xab, 0x07, + 0x1e, 0x00, 0xb8, 0x08, 0x1e, 0x00, 0xbc, 0x08, 0x1e, 0x00, 0xbe, 0x08, + 0x1e, 0x00, 0xbf, 0x08, 0x1e, 0x00, 0x78, 0x0a, 0x1e, 0x00, 0x7c, 0x0a, + 0x1e, 0x00, 0x7e, 0x0a, 0x1e, 0x00, 0x7f, 0x0a, 0x1e, 0x00, 0x88, 0x0b, + 0x1e, 0x00, 0x8b, 0x0b, 0x1e, 0x00, 0xd8, 0x0c, 0x1e, 0x00, 0xdc, 0x0c, + 0x1e, 0x00, 0xde, 0x0c, 0x1e, 0x00, 0xdf, 0x0c, 0x1e, 0x00, 0x2b, 0x0e, + 0x1e, 0x00, 0x28, 0x0f, 0x1e, 0x00, 0x2b, 0x0f, 0x1e, 0x00, 0x28, 0x11, + 0x1e, 0x00, 0x2b, 0x11, 0x1e, 0x00, 0xf8, 0x13, 0x1e, 0x00, 0xfc, 0x13, + 0x1e, 0x00, 0xfe, 0x13, 0x1e, 0x00, 0xff, 0x13, 0x1e, 0x00, 0x58, 0x15, + 0x1e, 0x00, 0x5c, 0x15, 0x1e, 0x00, 0x5e, 0x15, 0x1e, 0x00, 0x5f, 0x15, + 0x1e, 0x00, 0x08, 0x17, 0x1e, 0x00, 0x0b, 0x17, 0x1e, 0x00, 0x28, 0x19, + 0x1e, 0x00, 0x2b, 0x19, 0x1e, 0x00, 0x98, 0x1b, 0x1e, 0x00, 0x9c, 0x1b, + 0x1e, 0x00, 0x9e, 0x1b, 0x1e, 0x00, 0x9f, 0x1b, 0x1e, 0x00, 0xd8, 0x1b, + 0x1e, 0x00, 0xdc, 0x1b, 0x1e, 0x00, 0xde, 0x1b, 0x1e, 0x00, 0xdf, 0x1b, + 0x1e, 0x00, 0x28, 0x1d, 0x1e, 0x00, 0x2b, 0x1d, 0x1e, 0x00, 0xb8, 0x21, + 0x1e, 0x00, 0xbc, 0x21, 0x1e, 0x00, 0xbe, 0x21, 0x1e, 0x00, 0xbf, 0x21, + 0x1e, 0x00, 0x28, 0x22, 0x1e, 0x00, 0x2b, 0x22, 0x1e, 0x00, 0xb8, 0x24, + 0x1e, 0x00, 0xbc, 0x24, 0x1e, 0x00, 0xbe, 0x24, 0x1e, 0x00, 0xbf, 0x24, + 0x1e, 0x00, 0x38, 0x25, 0x1e, 0x00, 0x3c, 0x25, 0x1e, 0x00, 0x3e, 0x25, + 0x1e, 0x00, 0x3f, 0x25, 0x1e, 0x00, 0xb8, 0x26, 0x1e, 0x00, 0xbc, 0x26, + 0x1e, 0x00, 0xbe, 0x26, 0x1e, 0x00, 0xbf, 0x26, 0x1e, 0x00, 0x38, 0x27, + 0x1e, 0x00, 0x3c, 0x27, 0x1e, 0x00, 0x3e, 0x27, 0x1e, 0x00, 0x3f, 0x27, + 0x1e, 0x00, 0xb8, 0x27, 0x1e, 0x00, 0xbc, 0x27, 0x1e, 0x00, 0xbe, 0x27, + 0x1e, 0x00, 0xbf, 0x27, 0x1e, 0x00, 0xf8, 0x28, 0x1e, 0x00, 0xfc, 0x28, + 0x1e, 0x00, 0xfe, 0x28, 0x1e, 0x00, 0xff, 0x28, 0x1e, 0x00, 0x58, 0x29, + 0x1e, 0x00, 0x5c, 0x29, 0x1e, 0x00, 0x5e, 0x29, 0x1e, 0x00, 0x5f, 0x29, + 0x1e, 0x00, 0x88, 0x2b, 0x1e, 0x00, 0x8b, 0x2b, 0x1e, 0x00, 0xc8, 0x2b, + 0x1e, 0x00, 0xcb, 0x2b, 0x1e, 0x00, 0xe8, 0x2b, 0x1e, 0x00, 0xeb, 0x2b, + 0x1e, 0x00, 0x58, 0x2d, 0x1e, 0x00, 0x5c, 0x2d, 0x1e, 0x00, 0x5e, 0x2d, + 0x1e, 0x00, 0x5f, 0x2d, 0x1e, 0x00, 0xc8, 0x2e, 0x1e, 0x00, 0xcb, 0x2e, + 0x1e, 0x00, 0xe8, 0x2e, 0x1e, 0x00, 0xeb, 0x2e, 0x1e, 0x00, 0xf8, 0x2e, + 0x1e, 0x00, 0xfc, 0x2e, 0x1e, 0x00, 0xfe, 0x2e, 0x1e, 0x00, 0xff, 0x2e, + 0x1e, 0x00, 0x28, 0x2f, 0x1e, 0x00, 0x2b, 0x2f, 0x1e, 0x00, 0x30, 0x30, + 0x1e, 0x00, 0x31, 0x30, 0x1e, 0x00, 0x39, 0x30, 0x1e, 0x00, 0x3d, 0x30, + 0x1e, 0x00, 0xe6, 0x30, 0x1e, 0x00, 0xe7, 0x30, 0x1e, 0x00, 0xe8, 0x30, + 0x1e, 0x00, 0xeb, 0x30, 0x1e, 0x00, 0xf6, 0x30, 0x1e, 0x00, 0xf7, 0x30, + 0x1e, 0x00, 0xf8, 0x30, 0x1e, 0x00, 0xfc, 0x30, 0x1e, 0x00, 0xfe, 0x30, + 0x1e, 0x00, 0xff, 0x30, 0x1e, 0x00, 0xb0, 0x31, 0x1e, 0x00, 0xb1, 0x31, + 0x1e, 0x00, 0xb9, 0x31, 0x1e, 0x00, 0xbd, 0x31, 0x1e, 0x00, 0x36, 0x33, + 0x1e, 0x00, 0x37, 0x33, 0x1e, 0x00, 0x38, 0x33, 0x1e, 0x00, 0x3c, 0x33, + 0x1e, 0x00, 0x3e, 0x33, 0x1e, 0x00, 0x3f, 0x33, 0x1e, 0x00, 0xb8, 0x33, + 0x1e, 0x00, 0xbc, 0x33, 0x1e, 0x00, 0xbe, 0x33, 0x1e, 0x00, 0xbf, 0x33, + 0x1e, 0x00, 0xd8, 0x33, 0x1e, 0x00, 0xdc, 0x33, 0x1e, 0x00, 0xde, 0x33, + 0x1e, 0x00, 0xdf, 0x33, 0x1e, 0x00, 0xe9, 0x33, 0x1e, 0x00, 0xea, 0x33, + 0x1e, 0x00, 0xf0, 0x33, 0x1e, 0x00, 0xf1, 0x33, 0x1e, 0x00, 0xf9, 0x33, + 0x1e, 0x00, 0xfd, 0x33, 0x1e, 0x00, 0x30, 0x34, 0x1e, 0x00, 0x31, 0x34, + 0x1e, 0x00, 0x39, 0x34, 0x1e, 0x00, 0x3d, 0x34, 0x1e, 0x00, 0xe9, 0x34, + 0x1e, 0x00, 0xea, 0x34, 0x1e, 0x00, 0xf0, 0x34, 0x1e, 0x00, 0xf1, 0x34, + 0x1e, 0x00, 0xf9, 0x34, 0x1e, 0x00, 0xfd, 0x34, 0x1e, 0x00, 0x68, 0x35, + 0x1e, 0x00, 0x6b, 0x35, 0x1e, 0x00, 0x78, 0x35, 0x1e, 0x00, 0x7c, 0x35, + 0x1e, 0x00, 0x7e, 0x35, 0x1e, 0x00, 0x7f, 0x35, 0x1e, 0x00, 0xf0, 0x36, + 0x1e, 0x00, 0xf1, 0x36, 0x1e, 0x00, 0xf9, 0x36, 0x1e, 0x00, 0xfd, 0x36, + 0x1e, 0x00, 0x88, 0x37, 0x1e, 0x00, 0x8b, 0x37, 0x1e, 0x00, 0xc9, 0x37, + 0x1e, 0x00, 0xca, 0x37, 0x1e, 0x00, 0xe9, 0x37, 0x1e, 0x00, 0xea, 0x37, + 0x1e, 0x00, 0xf0, 0x37, 0x1e, 0x00, 0xf1, 0x37, 0x1e, 0x00, 0xf9, 0x37, + 0x1e, 0x00, 0xfd, 0x37, 0x1e, 0x00, 0x47, 0x38, 0x1e, 0x00, 0x4b, 0x38, + 0x1e, 0x00, 0xb0, 0x38, 0x1e, 0x00, 0xb1, 0x38, 0x1e, 0x00, 0xb9, 0x38, + 0x1e, 0x00, 0xbd, 0x38, 0x1e, 0x00, 0x30, 0x39, 0x1e, 0x00, 0x31, 0x39, + 0x1e, 0x00, 0x39, 0x39, 0x1e, 0x00, 0x3d, 0x39, 0x1e, 0x00, 0xf7, 0x39, + 0x1e, 0x00, 0xf8, 0x39, 0x1e, 0x00, 0xfc, 0x39, 0x1e, 0x00, 0xfe, 0x39, + 0x1e, 0x00, 0xff, 0x39, 0x1e, 0x00, 0xb7, 0x3a, 0x1e, 0x00, 0xb8, 0x3a, + 0x1e, 0x00, 0xbc, 0x3a, 0x1e, 0x00, 0xbe, 0x3a, 0x1e, 0x00, 0xbf, 0x3a, + 0x1e, 0x00, 0x36, 0x3b, 0x1e, 0x00, 0x37, 0x3b, 0x1e, 0x00, 0x38, 0x3b, + 0x1e, 0x00, 0x3c, 0x3b, 0x1e, 0x00, 0x3e, 0x3b, 0x1e, 0x00, 0x3f, 0x3b, + 0x1e, 0x00, 0xb0, 0x3b, 0x1e, 0x00, 0xb1, 0x3b, 0x1e, 0x00, 0xb9, 0x3b, + 0x1e, 0x00, 0xbd, 0x3b, 0x1e, 0x00, 0xe9, 0x3b, 0x1e, 0x00, 0xea, 0x3b, + 0x1e, 0x00, 0xf0, 0x3b, 0x1e, 0x00, 0xf1, 0x3b, 0x1e, 0x00, 0xf9, 0x3b, + 0x1e, 0x00, 0xfd, 0x3b, 0x1e, 0x00, 0x37, 0x3d, 0x1e, 0x00, 0x38, 0x3d, + 0x1e, 0x00, 0x3c, 0x3d, 0x1e, 0x00, 0x3e, 0x3d, 0x1e, 0x00, 0x3f, 0x3d, + 0x1e, 0x00, 0xf0, 0x3d, 0x1e, 0x00, 0xf1, 0x3d, 0x1e, 0x00, 0xf9, 0x3d, + 0x1e, 0x00, 0xfd, 0x3d, 0x1e, 0x00, 0x30, 0x3f, 0x1e, 0x00, 0x31, 0x3f, + 0x1e, 0x00, 0x39, 0x3f, 0x1e, 0x00, 0x3d, 0x3f, 0x1e, 0x00, 0x90, 0x3f, + 0x1e, 0x00, 0x91, 0x3f, 0x1e, 0x00, 0x96, 0x3f, 0x1e, 0x00, 0x97, 0x3f, + 0x1e, 0x00, 0x99, 0x3f, 0x1e, 0x00, 0x9d, 0x3f, 0x1e, 0x00, 0xd0, 0x3f, + 0x1e, 0x00, 0xd1, 0x3f, 0x1e, 0x00, 0xd6, 0x3f, 0x1e, 0x00, 0xd7, 0x3f, + 0x1e, 0x00, 0xd9, 0x3f, 0x1e, 0x00, 0xdd, 0x3f, 0x1e, 0x00, 0x70, 0x44, + 0x1e, 0x00, 0x71, 0x44, 0x1e, 0x00, 0x79, 0x44, 0x1e, 0x00, 0x7d, 0x44, + 0x1e, 0x00, 0xf7, 0x45, 0x1e, 0x00, 0xf8, 0x45, 0x1e, 0x00, 0xfc, 0x45, + 0x1e, 0x00, 0xfe, 0x45, 0x1e, 0x00, 0xff, 0x45, 0x1e, 0x00, 0x77, 0x46, + 0x1e, 0x00, 0x78, 0x46, 0x1e, 0x00, 0x7c, 0x46, 0x1e, 0x00, 0x7e, 0x46, + 0x1e, 0x00, 0x7f, 0x46, 0x1e, 0x00, 0x37, 0x47, 0x1e, 0x00, 0x38, 0x47, + 0x1e, 0x00, 0x3c, 0x47, 0x1e, 0x00, 0x3e, 0x47, 0x1e, 0x00, 0x3f, 0x47, + 0x1e, 0x00, 0xb0, 0x47, 0x1e, 0x00, 0xb1, 0x47, 0x1e, 0x00, 0xb9, 0x47, + 0x1e, 0x00, 0xbd, 0x47, 0x1e, 0x00, 0x0b, 0x49, 0x1e, 0x00, 0x6b, 0x49, + 0x1e, 0x00, 0x70, 0x4a, 0x1e, 0x00, 0x71, 0x4a, 0x1e, 0x00, 0x77, 0x4a, + 0x1e, 0x00, 0x79, 0x4a, 0x1e, 0x00, 0x7d, 0x4a, 0x1e, 0x00, 0x2b, 0x4b, + 0x1e, 0x00, 0xcb, 0x4b, 0x1e, 0x00, 0xeb, 0x4b, 0x1e, 0x00, 0xf8, 0x4b, + 0x1e, 0x00, 0xfc, 0x4b, 0x1e, 0x00, 0xfe, 0x4b, 0x1e, 0x00, 0xff, 0x4b, + 0x1e, 0x00, 0x8b, 0x4f, 0x1e, 0x00, 0xcb, 0x4f, 0x1e, 0x00, 0xeb, 0x4f, + 0x1e, 0x00, 0xf0, 0x4f, 0x1e, 0x00, 0xf1, 0x4f, 0x1e, 0x00, 0xf7, 0x4f, + 0x1e, 0x00, 0xf9, 0x4f, 0x1e, 0x00, 0xfd, 0x4f, 0x1e, 0x00, 0xb0, 0x50, + 0x1e, 0x00, 0xb1, 0x50, 0x1e, 0x00, 0xb9, 0x50, 0x1e, 0x00, 0xbd, 0x50, + 0x1e, 0x00, 0xf7, 0x51, 0x1e, 0x00, 0xf8, 0x51, 0x1e, 0x00, 0xfc, 0x51, + 0x1e, 0x00, 0xfe, 0x51, 0x1e, 0x00, 0xff, 0x51, 0x1e, 0x00, 0xb8, 0x52, + 0x1e, 0x00, 0xbc, 0x52, 0x1e, 0x00, 0xbe, 0x52, 0x1e, 0x00, 0xbf, 0x52, + 0x1e, 0x00, 0xb0, 0x54, 0x1e, 0x00, 0xb1, 0x54, 0x1e, 0x00, 0xb7, 0x54, + 0x1e, 0x00, 0xb9, 0x54, 0x1e, 0x00, 0xbd, 0x54, 0x1e, 0x00, 0x78, 0x55, + 0x1e, 0x00, 0x7c, 0x55, 0x1e, 0x00, 0x7e, 0x55, 0x1e, 0x00, 0x7f, 0x55, + 0x1e, 0x00, 0xcb, 0x57, 0x1e, 0x00, 0xeb, 0x57, 0x1e, 0x00, 0xf0, 0x57, + 0x1e, 0x00, 0xf1, 0x57, 0x1e, 0x00, 0xf7, 0x57, 0x1e, 0x00, 0xf9, 0x57, + 0x1e, 0x00, 0xfd, 0x57, 0x1e, 0x00, 0xb7, 0x58, 0x1e, 0x00, 0xb8, 0x58, + 0x1e, 0x00, 0xbc, 0x58, 0x1e, 0x00, 0xbe, 0x58, 0x1e, 0x00, 0xbf, 0x58, + 0x1e, 0x00, 0xf0, 0x59, 0x1e, 0x00, 0xf1, 0x59, 0x1e, 0x00, 0xf9, 0x59, + 0x1e, 0x00, 0xfd, 0x59, 0x1e, 0x00, 0xb0, 0x5a, 0x1e, 0x00, 0xb1, 0x5a, + 0x1e, 0x00, 0xb9, 0x5a, 0x1e, 0x00, 0xbd, 0x5a, 0x1e, 0x00, 0xb8, 0x5c, + 0x1e, 0x00, 0xbc, 0x5c, 0x1e, 0x00, 0xbe, 0x5c, 0x1e, 0x00, 0xbf, 0x5c, + 0x1e, 0x00, 0xf7, 0x5d, 0x1e, 0x00, 0xf8, 0x5d, 0x1e, 0x00, 0xfc, 0x5d, + 0x1e, 0x00, 0xfe, 0x5d, 0x1e, 0x00, 0xff, 0x5d, 0x1e, 0x00, 0xb8, 0x5e, + 0x1e, 0x00, 0xbc, 0x5e, 0x1e, 0x00, 0xbe, 0x5e, 0x1e, 0x00, 0xbf, 0x5e, + 0x1e, 0x00, 0xf0, 0x5f, 0x1e, 0x00, 0xf1, 0x5f, 0x1e, 0x00, 0xf9, 0x5f, + 0x1e, 0x00, 0xfd, 0x5f, 0x1e, 0x00, 0x0b, 0x67, 0x1e, 0x00, 0xf8, 0x6a, + 0x1e, 0x00, 0xfc, 0x6a, 0x1e, 0x00, 0xfe, 0x6a, 0x1e, 0x00, 0xff, 0x6a, + 0x1e, 0x00, 0x2b, 0x72, 0x1e, 0x00, 0xcb, 0x7a, 0x1e, 0x00, 0xeb, 0x7a, + 0x1e, 0x00, 0xf8, 0x7c, 0x1e, 0x00, 0xfc, 0x7c, 0x1e, 0x00, 0xfe, 0x7c, + 0x1e, 0x00, 0xff, 0x7c, 0x1e, 0x00, 0x2b, 0x7e, 0x1e, 0x00, 0x71, 0x80, + 0x1e, 0x00, 0x79, 0x80, 0x1e, 0x00, 0xf7, 0x81, 0x1e, 0x00, 0x71, 0x84, + 0x1e, 0x00, 0x79, 0x84, 0x1e, 0x00, 0xf7, 0x84, 0x1e, 0x00, 0xf8, 0x84, + 0x1e, 0x00, 0xfc, 0x84, 0x1e, 0x00, 0xfe, 0x84, 0x1e, 0x00, 0xff, 0x84, + 0x1e, 0x00, 0xf7, 0x85, 0x1e, 0x00, 0x0b, 0x86, 0x1e, 0x00, 0x71, 0x86, + 0x1e, 0x00, 0x79, 0x86, 0x1e, 0x00, 0xf7, 0x86, 0x1e, 0x00, 0xf8, 0x86, + 0x1e, 0x00, 0xfc, 0x86, 0x1e, 0x00, 0xfe, 0x86, 0x1e, 0x00, 0xff, 0x86, + 0x1e, 0x00, 0x70, 0x87, 0x1e, 0x00, 0x71, 0x87, 0x1e, 0x00, 0x79, 0x87, + 0x1e, 0x00, 0x7d, 0x87, 0x1e, 0x00, 0xf7, 0x87, 0x1e, 0x00, 0xbb, 0x89, + 0x1e, 0x00, 0x0b, 0x8a, 0x1e, 0x00, 0xbb, 0x8d, 0x1e, 0x00, 0x0b, 0x8e, + 0x1e, 0x00, 0xf1, 0x8f, 0x1e, 0x00, 0xf7, 0x8f, 0x1e, 0x00, 0xf9, 0x8f, + 0x1e, 0x00, 0x3b, 0x94, 0x1e, 0x00, 0x3b, 0x95, 0x1e, 0x00, 0xcb, 0x9a, + 0x1e, 0x00, 0xeb, 0x9a, 0x1e, 0x00, 0xf8, 0x9a, 0x1e, 0x00, 0xfc, 0x9a, + 0x1e, 0x00, 0xfe, 0x9a, 0x1e, 0x00, 0xff, 0x9a, 0x1e, 0x00, 0xeb, 0xa4, + 0x1e, 0x00, 0xf8, 0xa4, 0x1e, 0x00, 0xfc, 0xa4, 0x1e, 0x00, 0xfe, 0xa4, + 0x1e, 0x00, 0xff, 0xa4, 0x1e, 0x00, 0x3b, 0xa5, 0x1e, 0x00, 0x0b, 0xa6, + 0x1e, 0x00, 0x2b, 0xa6, 0x1e, 0x00, 0xeb, 0xa6, 0x1e, 0x00, 0x78, 0xa7, + 0x1e, 0x00, 0x7c, 0xa7, 0x1e, 0x00, 0x7e, 0xa7, 0x1e, 0x00, 0x7f, 0xa7, + 0x1e, 0x00, 0x0b, 0xaa, 0x1e, 0x00, 0x2b, 0xaa, 0x1e, 0x00, 0x0b, 0xab, + 0x1e, 0x00, 0x71, 0xb1, 0x1e, 0x00, 0x77, 0xb1, 0x1e, 0x00, 0x79, 0xb1, + 0x1e, 0x00, 0xbb, 0xb2, 0x1e, 0x00, 0xf1, 0xb3, 0x1e, 0x00, 0xf7, 0xb3, + 0x1e, 0x00, 0xf9, 0xb3, 0x1e, 0x00, 0x0b, 0xb5, 0x1e, 0x00, 0x71, 0xb7, + 0x1e, 0x00, 0x77, 0xb7, 0x1e, 0x00, 0x79, 0xb7, 0x1e, 0x00, 0xf1, 0xb7, + 0x1e, 0x00, 0xf7, 0xb7, 0x1e, 0x00, 0xf9, 0xb7, 0x1e, 0x00, 0xf0, 0xb8, + 0x1e, 0x00, 0xf1, 0xb8, 0x1e, 0x00, 0xf7, 0xb8, 0x1e, 0x00, 0xf9, 0xb8, + 0x1e, 0x00, 0xfd, 0xb8, 0x1e, 0x00, 0x0b, 0xba, 0x1e, 0x00, 0xbb, 0xbe, + 0x1e, 0x00, 0x30, 0xc0, 0x1e, 0x00, 0xe6, 0xc0, 0x1e, 0x00, 0xf6, 0xc0, + 0x1e, 0x00, 0xf7, 0xc0, 0x1e, 0x00, 0xf8, 0xc0, 0x1e, 0x00, 0xfc, 0xc0, + 0x1e, 0x00, 0xfe, 0xc0, 0x1e, 0x00, 0xff, 0xc0, 0x1e, 0x00, 0x08, 0xc2, + 0x1e, 0x00, 0x0b, 0xc2, 0x1e, 0x00, 0x18, 0xc2, 0x1e, 0x00, 0x1c, 0xc2, + 0x1e, 0x00, 0x1e, 0xc2, 0x1e, 0x00, 0x1f, 0xc2, 0x1e, 0x00, 0x28, 0xc2, + 0x1e, 0x00, 0x2b, 0xc2, 0x1e, 0x00, 0x78, 0xc2, 0x1e, 0x00, 0x7c, 0xc2, + 0x1e, 0x00, 0x7e, 0xc2, 0x1e, 0x00, 0x7f, 0xc2, 0x1e, 0x00, 0xd0, 0xc2, + 0x1e, 0x00, 0xd8, 0xc2, 0x1e, 0x00, 0xdc, 0xc2, 0x1e, 0x00, 0xde, 0xc2, + 0x1e, 0x00, 0xdf, 0xc2, 0x1e, 0x00, 0x91, 0xc3, 0x1e, 0x00, 0x96, 0xc3, + 0x1e, 0x00, 0x97, 0xc3, 0x1e, 0x00, 0x99, 0xc3, 0x1e, 0x00, 0x9d, 0xc3, + 0x1e, 0x00, 0xf6, 0xc5, 0x1e, 0x00, 0xf7, 0xc5, 0x1e, 0x00, 0xf8, 0xc5, + 0x1e, 0x00, 0xfc, 0xc5, 0x1e, 0x00, 0xfe, 0xc5, 0x1e, 0x00, 0xff, 0xc5, + 0x1e, 0x00, 0xb0, 0xc6, 0x1e, 0x00, 0x30, 0xc7, 0x1e, 0x00, 0xb0, 0xc8, + 0x1e, 0x00, 0x51, 0xc9, 0x1e, 0x00, 0x56, 0xc9, 0x1e, 0x00, 0x57, 0xc9, + 0x1e, 0x00, 0x58, 0xc9, 0x1e, 0x00, 0x5c, 0xc9, 0x1e, 0x00, 0x5e, 0xc9, + 0x1e, 0x00, 0x5f, 0xc9, 0x1e, 0x00, 0xc6, 0xcb, 0x1e, 0x00, 0xe6, 0xcb, + 0x1e, 0x00, 0xf0, 0xcb, 0x1e, 0x00, 0xf0, 0xcc, 0x1e, 0x00, 0xf1, 0xcc, + 0x1e, 0x00, 0xf9, 0xcc, 0x1e, 0x00, 0xfd, 0xcc, 0x1e, 0x00, 0x2b, 0xce, + 0x1e, 0x00, 0xf0, 0xce, 0x1e, 0x00, 0xf1, 0xce, 0x1e, 0x00, 0xf9, 0xce, + 0x1e, 0x00, 0xfd, 0xce, 0x1e, 0x00, 0x28, 0xcf, 0x1e, 0x00, 0x2b, 0xcf, + 0x1e, 0x00, 0xa8, 0xcf, 0x1e, 0x00, 0xab, 0xcf, 0x1e, 0x00, 0xf0, 0xcf, + 0x1e, 0x00, 0xf1, 0xcf, 0x1e, 0x00, 0xf9, 0xcf, 0x1e, 0x00, 0xfd, 0xcf, + 0x1e, 0x00, 0xe8, 0xd0, 0x1e, 0x00, 0xeb, 0xd0, 0x1e, 0x00, 0xd8, 0xd3, + 0x1e, 0x00, 0xdc, 0xd3, 0x1e, 0x00, 0xde, 0xd3, 0x1e, 0x00, 0xdf, 0xd3, + 0x1e, 0x00, 0xe8, 0xd3, 0x1e, 0x00, 0xeb, 0xd3, 0x1e, 0x00, 0xe8, 0xd4, + 0x1e, 0x00, 0xeb, 0xd4, 0x1e, 0x00, 0xeb, 0xd6, 0x1e, 0x00, 0x88, 0xd7, + 0x1e, 0x00, 0x8b, 0xd7, 0x1e, 0x00, 0xc8, 0xd7, 0x1e, 0x00, 0xcb, 0xd7, + 0x1e, 0x00, 0xe8, 0xd7, 0x1e, 0x00, 0xeb, 0xd7, 0x1e, 0x00, 0x48, 0xd8, + 0x1e, 0x00, 0x4b, 0xd8, 0x1e, 0x00, 0xf8, 0xd9, 0x1e, 0x00, 0xfc, 0xd9, + 0x1e, 0x00, 0xfe, 0xd9, 0x1e, 0x00, 0xff, 0xd9, 0x1e, 0x00, 0xf8, 0xdb, + 0x1e, 0x00, 0xfc, 0xdb, 0x1e, 0x00, 0xfe, 0xdb, 0x1e, 0x00, 0xff, 0xdb, + 0x1e, 0x00, 0xf8, 0xdd, 0x1e, 0x00, 0xfc, 0xdd, 0x1e, 0x00, 0xfe, 0xdd, + 0x1e, 0x00, 0xff, 0xdd, 0x1e, 0x00, 0x98, 0xdf, 0x1e, 0x00, 0x9c, 0xdf, + 0x1e, 0x00, 0x9e, 0xdf, 0x1e, 0x00, 0x9f, 0xdf, 0x1e, 0x00, 0xd8, 0xdf, + 0x1e, 0x00, 0xdc, 0xdf, 0x1e, 0x00, 0xde, 0xdf, 0x1e, 0x00, 0xdf, 0xdf, + 0x1e, 0x00, 0xb0, 0xe0, 0x1e, 0x00, 0x30, 0xe1, 0x1e, 0x00, 0x46, 0xe1, + 0x1e, 0x00, 0x51, 0xe1, 0x1e, 0x00, 0x56, 0xe1, 0x1e, 0x00, 0x57, 0xe1, + 0x1e, 0x00, 0x58, 0xe1, 0x1e, 0x00, 0x5c, 0xe1, 0x1e, 0x00, 0x5e, 0xe1, + 0x1e, 0x00, 0x5f, 0xe1, 0x1e, 0x00, 0x08, 0xe2, 0x1e, 0x00, 0x0b, 0xe2, + 0x1e, 0x00, 0x26, 0xe2, 0x1e, 0x00, 0xd0, 0xe2, 0x1e, 0x00, 0xd9, 0xe2, + 0x1e, 0x00, 0xdd, 0xe2, 0x1e, 0x00, 0x2b, 0xe5, 0x1e, 0x00, 0xf0, 0xe5, + 0x1e, 0x00, 0x30, 0xe7, 0x1e, 0x00, 0xb0, 0xe8, 0x1e, 0x00, 0x08, 0xe9, + 0x1e, 0x00, 0x0b, 0xe9, 0x1e, 0x00, 0x30, 0xe9, 0x1e, 0x00, 0x51, 0xe9, + 0x1e, 0x00, 0x56, 0xe9, 0x1e, 0x00, 0x57, 0xe9, 0x1e, 0x00, 0x58, 0xe9, + 0x1e, 0x00, 0x5c, 0xe9, 0x1e, 0x00, 0x5e, 0xe9, 0x1e, 0x00, 0x5f, 0xe9, + 0x1e, 0x00, 0xb0, 0xea, 0x1e, 0x00, 0xc6, 0xeb, 0x1e, 0x00, 0xe6, 0xeb, + 0x1e, 0x00, 0xf0, 0xeb, 0x1e, 0x00, 0x30, 0xec, 0x1e, 0x00, 0xf0, 0xec, + 0x1e, 0x00, 0xf1, 0xec, 0x1e, 0x00, 0xf9, 0xec, 0x1e, 0x00, 0xfd, 0xec, + 0x1e, 0x00, 0x08, 0xed, 0x1e, 0x00, 0x0b, 0xed, 0x1e, 0x00, 0x30, 0xed, + 0x1e, 0x00, 0x08, 0xee, 0x1e, 0x00, 0x0b, 0xee, 0x1e, 0x00, 0x26, 0xee, + 0x1e, 0x00, 0x27, 0xee, 0x1e, 0x00, 0x29, 0xee, 0x1e, 0x00, 0x2a, 0xee, + 0x1e, 0x00, 0xc6, 0xee, 0x1e, 0x00, 0xe6, 0xee, 0x1e, 0x00, 0xf6, 0xee, + 0x1e, 0x00, 0xf7, 0xee, 0x1e, 0x00, 0xf8, 0xee, 0x1e, 0x00, 0xfc, 0xee, + 0x1e, 0x00, 0xfe, 0xee, 0x1e, 0x00, 0xff, 0xee, 0x1e, 0x00, 0x28, 0xef, + 0x1e, 0x00, 0x2b, 0xef, 0x1e, 0x00, 0xa8, 0xef, 0x1e, 0x00, 0xab, 0xef, + 0x1e, 0x00, 0xf0, 0xef, 0x1e, 0x00, 0xf1, 0xef, 0x1e, 0x00, 0xf9, 0xef, + 0x1e, 0x00, 0xfd, 0xef, 0x1e, 0x00, 0xb0, 0xf0, 0x1e, 0x00, 0x46, 0xf1, + 0x1e, 0x00, 0x51, 0xf1, 0x1e, 0x00, 0x56, 0xf1, 0x1e, 0x00, 0x57, 0xf1, + 0x1e, 0x00, 0x58, 0xf1, 0x1e, 0x00, 0x5c, 0xf1, 0x1e, 0x00, 0x5e, 0xf1, + 0x1e, 0x00, 0x5f, 0xf1, 0x1e, 0x00, 0xb0, 0xf1, 0x1e, 0x00, 0x26, 0xf3, + 0x1e, 0x00, 0x88, 0xf3, 0x1e, 0x00, 0x8b, 0xf3, 0x1e, 0x00, 0xa8, 0xf3, + 0x1e, 0x00, 0xab, 0xf3, 0x1e, 0x00, 0xc6, 0xf3, 0x1e, 0x00, 0xe6, 0xf3, + 0x1e, 0x00, 0xf0, 0xf3, 0x1e, 0x00, 0xb0, 0xf4, 0x1e, 0x00, 0xf0, 0xf4, + 0x1e, 0x00, 0xf1, 0xf4, 0x1e, 0x00, 0xf9, 0xf4, 0x1e, 0x00, 0xfd, 0xf4, + 0x1e, 0x00, 0xb0, 0xf6, 0x1e, 0x00, 0xf0, 0xf6, 0x1e, 0x00, 0xf1, 0xf6, + 0x1e, 0x00, 0xf9, 0xf6, 0x1e, 0x00, 0xfd, 0xf6, 0x1e, 0x00, 0x86, 0xf7, + 0x1e, 0x00, 0xf0, 0xf7, 0x1e, 0x00, 0xf1, 0xf7, 0x1e, 0x00, 0xf9, 0xf7, + 0x1e, 0x00, 0xfd, 0xf7, 0x1e, 0x00, 0xf7, 0xf9, 0x1e, 0x00, 0xf8, 0xf9, + 0x1e, 0x00, 0xfc, 0xf9, 0x1e, 0x00, 0xfe, 0xf9, 0x1e, 0x00, 0xff, 0xf9, + 0x1e, 0x00, 0xc6, 0xfb, 0x1e, 0x00, 0xe6, 0xfb, 0x1e, 0x00, 0xf0, 0xfb, + 0x1e, 0x00, 0x2b, 0xfd, 0x1e, 0x00, 0xf0, 0xfd, 0x1e, 0x00, 0x30, 0xff, + 0x1e, 0x00, 0x90, 0xff, 0x1e, 0x00, 0x99, 0xff, 0x1e, 0x00, 0x9d, 0xff, + 0x1e, 0x00, 0xd0, 0xff, 0x1e, 0x00, 0xd9, 0xff, 0x1e, 0x00, 0xdd, 0xff, + 0x1e, 0x00, 0x73, 0x00, 0x1f, 0x00, 0x7b, 0x00, 0x1f, 0x00, 0xb3, 0x00, + 0x1f, 0x00, 0xbb, 0x00, 0x1f, 0x00, 0xf3, 0x00, 0x1f, 0x00, 0xfb, 0x00, + 0x1f, 0x00, 0x43, 0x01, 0x1f, 0x00, 0x44, 0x01, 0x1f, 0x00, 0x45, 0x01, + 0x1f, 0x00, 0x48, 0x01, 0x1f, 0x00, 0x4b, 0x01, 0x1f, 0x00, 0x4c, 0x01, + 0x1f, 0x00, 0x4e, 0x01, 0x1f, 0x00, 0x4f, 0x01, 0x1f, 0x00, 0x74, 0x01, + 0x1f, 0x00, 0x75, 0x01, 0x1f, 0x00, 0x78, 0x01, 0x1f, 0x00, 0x7c, 0x01, + 0x1f, 0x00, 0x7e, 0x01, 0x1f, 0x00, 0x7f, 0x01, 0x1f, 0x00, 0xf4, 0x01, + 0x1f, 0x00, 0xf5, 0x01, 0x1f, 0x00, 0xf8, 0x01, 0x1f, 0x00, 0xfc, 0x01, + 0x1f, 0x00, 0xfe, 0x01, 0x1f, 0x00, 0xff, 0x01, 0x1f, 0x00, 0x34, 0x02, + 0x1f, 0x00, 0x35, 0x02, 0x1f, 0x00, 0x38, 0x02, 0x1f, 0x00, 0x3c, 0x02, + 0x1f, 0x00, 0x3e, 0x02, 0x1f, 0x00, 0x3f, 0x02, 0x1f, 0x00, 0xf4, 0x02, + 0x1f, 0x00, 0xf5, 0x02, 0x1f, 0x00, 0xf8, 0x02, 0x1f, 0x00, 0xfc, 0x02, + 0x1f, 0x00, 0xfe, 0x02, 0x1f, 0x00, 0xff, 0x02, 0x1f, 0x00, 0x34, 0x03, + 0x1f, 0x00, 0x35, 0x03, 0x1f, 0x00, 0x38, 0x03, 0x1f, 0x00, 0x3c, 0x03, + 0x1f, 0x00, 0x3e, 0x03, 0x1f, 0x00, 0x3f, 0x03, 0x1f, 0x00, 0xf3, 0x03, + 0x1f, 0x00, 0xfb, 0x03, 0x1f, 0x00, 0x38, 0x04, 0x1f, 0x00, 0x3c, 0x04, + 0x1f, 0x00, 0x3e, 0x04, 0x1f, 0x00, 0x3f, 0x04, 0x1f, 0x00, 0x73, 0x04, + 0x1f, 0x00, 0x7b, 0x04, 0x1f, 0x00, 0xf4, 0x05, 0x1f, 0x00, 0xf5, 0x05, + 0x1f, 0x00, 0xf8, 0x05, 0x1f, 0x00, 0xfc, 0x05, 0x1f, 0x00, 0xfe, 0x05, + 0x1f, 0x00, 0xff, 0x05, 0x1f, 0x00, 0x73, 0x06, 0x1f, 0x00, 0x7b, 0x06, + 0x1f, 0x00, 0x34, 0x07, 0x1f, 0x00, 0x35, 0x07, 0x1f, 0x00, 0x38, 0x07, + 0x1f, 0x00, 0x3c, 0x07, 0x1f, 0x00, 0x3e, 0x07, 0x1f, 0x00, 0x3f, 0x07, + 0x1f, 0x00, 0xb4, 0x07, 0x1f, 0x00, 0xb5, 0x07, 0x1f, 0x00, 0xb8, 0x07, + 0x1f, 0x00, 0xbc, 0x07, 0x1f, 0x00, 0xbe, 0x07, 0x1f, 0x00, 0xbf, 0x07, + 0x1f, 0x00, 0x4b, 0x08, 0x1f, 0x00, 0xb3, 0x08, 0x1f, 0x00, 0xbb, 0x08, + 0x1f, 0x00, 0xd8, 0x08, 0x1f, 0x00, 0xdc, 0x08, 0x1f, 0x00, 0xde, 0x08, + 0x1f, 0x00, 0xdf, 0x08, 0x1f, 0x00, 0xe3, 0x08, 0x1f, 0x00, 0xf3, 0x08, + 0x1f, 0x00, 0xfb, 0x08, 0x1f, 0x00, 0x58, 0x09, 0x1f, 0x00, 0x5c, 0x09, + 0x1f, 0x00, 0x5e, 0x09, 0x1f, 0x00, 0x5f, 0x09, 0x1f, 0x00, 0x74, 0x0a, + 0x1f, 0x00, 0x75, 0x0a, 0x1f, 0x00, 0x78, 0x0a, 0x1f, 0x00, 0x7c, 0x0a, + 0x1f, 0x00, 0x7e, 0x0a, 0x1f, 0x00, 0x7f, 0x0a, 0x1f, 0x00, 0x08, 0x0b, + 0x1f, 0x00, 0x0b, 0x0b, 0x1f, 0x00, 0x33, 0x0b, 0x1f, 0x00, 0x3b, 0x0b, + 0x1f, 0x00, 0xb3, 0x0b, 0x1f, 0x00, 0xbb, 0x0b, 0x1f, 0x00, 0xd3, 0x0b, + 0x1f, 0x00, 0xd4, 0x0b, 0x1f, 0x00, 0xd5, 0x0b, 0x1f, 0x00, 0xdb, 0x0b, + 0x1f, 0x00, 0xe4, 0x0b, 0x1f, 0x00, 0xe5, 0x0b, 0x1f, 0x00, 0xe8, 0x0b, + 0x1f, 0x00, 0xeb, 0x0b, 0x1f, 0x00, 0xec, 0x0b, 0x1f, 0x00, 0xee, 0x0b, + 0x1f, 0x00, 0xef, 0x0b, 0x1f, 0x00, 0xf4, 0x0b, 0x1f, 0x00, 0xf5, 0x0b, + 0x1f, 0x00, 0xf8, 0x0b, 0x1f, 0x00, 0xfc, 0x0b, 0x1f, 0x00, 0xfe, 0x0b, + 0x1f, 0x00, 0xff, 0x0b, 0x1f, 0x00, 0x53, 0x0d, 0x1f, 0x00, 0x54, 0x0d, + 0x1f, 0x00, 0x55, 0x0d, 0x1f, 0x00, 0x5b, 0x0d, 0x1f, 0x00, 0x33, 0x0f, + 0x1f, 0x00, 0x3b, 0x0f, 0x1f, 0x00, 0x93, 0x0f, 0x1f, 0x00, 0x94, 0x0f, + 0x1f, 0x00, 0x95, 0x0f, 0x1f, 0x00, 0x9b, 0x0f, 0x1f, 0x00, 0xd3, 0x0f, + 0x1f, 0x00, 0xd4, 0x0f, 0x1f, 0x00, 0xd5, 0x0f, 0x1f, 0x00, 0xdb, 0x0f, + 0x1f, 0x00, 0x74, 0x10, 0x1f, 0x00, 0x75, 0x10, 0x1f, 0x00, 0x78, 0x10, + 0x1f, 0x00, 0x7c, 0x10, 0x1f, 0x00, 0x7e, 0x10, 0x1f, 0x00, 0x7f, 0x10, + 0x1f, 0x00, 0xf4, 0x10, 0x1f, 0x00, 0xf5, 0x10, 0x1f, 0x00, 0xf8, 0x10, + 0x1f, 0x00, 0xfc, 0x10, 0x1f, 0x00, 0xfe, 0x10, 0x1f, 0x00, 0xff, 0x10, + 0x1f, 0x00, 0x33, 0x11, 0x1f, 0x00, 0x3b, 0x11, 0x1f, 0x00, 0x74, 0x11, + 0x1f, 0x00, 0x75, 0x11, 0x1f, 0x00, 0x10, 0x27, 0x00, 0x00, 0xbe, 0x00, + 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xfc, 0x03, + 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xb8, 0x04, + 0x00, 0x00, 0xb8, 0x06, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xfc, 0x07, + 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xb8, 0x08, + 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xbe, 0x10, 0x00, 0x00, 0xbf, 0x10, + 0x00, 0x00, 0xeb, 0x13, 0x00, 0x00, 0xfe, 0x13, 0x00, 0x00, 0xff, 0x13, + 0x00, 0x00, 0xb8, 0x14, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xcb, 0x17, + 0x00, 0x00, 0xeb, 0x17, 0x00, 0x00, 0xb8, 0x18, 0x00, 0x00, 0xb8, 0x1a, + 0x00, 0x00, 0xf8, 0x1b, 0x00, 0x00, 0xf8, 0x29, 0x00, 0x00, 0xfc, 0x29, + 0x00, 0x00, 0xfe, 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xfe, 0x2d, + 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xcb, 0x2f, 0x00, 0x00, 0xeb, 0x2f, + 0x00, 0x00, 0xf8, 0x2f, 0x00, 0x00, 0xfc, 0x2f, 0x00, 0x00, 0xfe, 0x2f, + 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xf7, 0x39, 0x00, 0x00, 0xf7, 0x3d, + 0x00, 0x00, 0xc7, 0x3f, 0x00, 0x00, 0xe7, 0x3f, 0x00, 0x00, 0xf0, 0x3f, + 0x00, 0x00, 0xf1, 0x3f, 0x00, 0x00, 0xf7, 0x3f, 0x00, 0x00, 0xf9, 0x3f, + 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xb8, 0x52, 0x00, 0x00, 0xe7, 0x53, + 0x00, 0x00, 0xf7, 0x53, 0x00, 0x00, 0xf8, 0x53, 0x00, 0x00, 0xfc, 0x53, + 0x00, 0x00, 0xfe, 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xb8, 0x5c, + 0x00, 0x00, 0xb8, 0x5e, 0x00, 0x00, 0x8e, 0x6b, 0x00, 0x00, 0x8f, 0x6b, + 0x00, 0x00, 0xf3, 0x79, 0x00, 0x00, 0xfb, 0x79, 0x00, 0x00, 0xf4, 0x7d, + 0x00, 0x00, 0xce, 0x7f, 0x00, 0x00, 0xcf, 0x7f, 0x00, 0x00, 0xee, 0x7f, + 0x00, 0x00, 0xef, 0x7f, 0x00, 0x00, 0xf3, 0x7f, 0x00, 0x00, 0xfb, 0x7f, + 0x00, 0x00, 0xb1, 0x80, 0x00, 0x00, 0xb8, 0x80, 0x00, 0x00, 0xb4, 0x82, + 0x00, 0x00, 0xbe, 0x82, 0x00, 0x00, 0xbf, 0x82, 0x00, 0x00, 0xb1, 0x84, + 0x00, 0x00, 0xb8, 0x84, 0x00, 0x00, 0xf1, 0x85, 0x00, 0x00, 0xf3, 0x85, + 0x00, 0x00, 0xf9, 0x85, 0x00, 0x00, 0xfb, 0x85, 0x00, 0x00, 0xfd, 0x85, + 0x00, 0x00, 0xb1, 0x86, 0x00, 0x00, 0xb8, 0x86, 0x00, 0x00, 0xb0, 0x88, + 0x00, 0x00, 0xbe, 0x88, 0x00, 0x00, 0xb3, 0x8a, 0x00, 0x00, 0xbb, 0x8a, + 0x00, 0x00, 0xbf, 0x8a, 0x00, 0x00, 0xb4, 0x8c, 0x00, 0x00, 0xb8, 0x8c, + 0x00, 0x00, 0xb4, 0x8e, 0x00, 0x00, 0x84, 0x8f, 0x00, 0x00, 0x8e, 0x8f, + 0x00, 0x00, 0x8f, 0x8f, 0x00, 0x00, 0xcd, 0x8f, 0x00, 0x00, 0xce, 0x8f, + 0x00, 0x00, 0xcf, 0x8f, 0x00, 0x00, 0xe1, 0x8f, 0x00, 0x00, 0xe2, 0x8f, + 0x00, 0x00, 0xed, 0x8f, 0x00, 0x00, 0xee, 0x8f, 0x00, 0x00, 0xef, 0x8f, + 0x00, 0x00, 0xf2, 0x8f, 0x00, 0x00, 0xf8, 0x8f, 0x00, 0x00, 0xfa, 0x8f, + 0x00, 0x00, 0xfc, 0x8f, 0x00, 0x00, 0xfe, 0x8f, 0x00, 0x00, 0xff, 0x8f, + 0x00, 0x00, 0xce, 0x93, 0x00, 0x00, 0xcf, 0x93, 0x00, 0x00, 0xf8, 0x93, + 0x00, 0x00, 0xf3, 0x99, 0x00, 0x00, 0xfb, 0x99, 0x00, 0x00, 0xf8, 0x9d, + 0x00, 0x00, 0xf3, 0xa7, 0x00, 0x00, 0xfb, 0xa7, 0x00, 0x00, 0xce, 0xab, + 0x00, 0x00, 0xcf, 0xab, 0x00, 0x00, 0xf8, 0xab, 0x00, 0x00, 0xe1, 0xb3, + 0x00, 0x00, 0xe2, 0xb3, 0x00, 0x00, 0xed, 0xb3, 0x00, 0x00, 0xee, 0xb3, + 0x00, 0x00, 0xef, 0xb3, 0x00, 0x00, 0xf2, 0xb3, 0x00, 0x00, 0xf8, 0xb3, + 0x00, 0x00, 0xfa, 0xb3, 0x00, 0x00, 0xfc, 0xb3, 0x00, 0x00, 0xfe, 0xb3, + 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0xb9, 0x00, 0x00, 0xe1, 0xbb, + 0x00, 0x00, 0xe2, 0xbb, 0x00, 0x00, 0xed, 0xbb, 0x00, 0x00, 0xee, 0xbb, + 0x00, 0x00, 0xef, 0xbb, 0x00, 0x00, 0xf2, 0xbb, 0x00, 0x00, 0xf8, 0xbb, + 0x00, 0x00, 0xfa, 0xbb, 0x00, 0x00, 0xfc, 0xbb, 0x00, 0x00, 0xfe, 0xbb, + 0x00, 0x00, 0xff, 0xbb, 0x00, 0x00, 0xff, 0xbd, 0x00, 0x00, 0xc6, 0xc3, + 0x00, 0x00, 0xc7, 0xc3, 0x00, 0x00, 0xf6, 0xc3, 0x00, 0x00, 0xf7, 0xc3, + 0x00, 0x00, 0xf8, 0xc3, 0x00, 0x00, 0xfc, 0xc3, 0x00, 0x00, 0xfe, 0xc3, + 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xf0, 0xc9, 0x00, 0x00, 0xf1, 0xc9, + 0x00, 0x00, 0xf9, 0xc9, 0x00, 0x00, 0xfd, 0xc9, 0x00, 0x00, 0xf1, 0xcd, + 0x00, 0x00, 0xf8, 0xcd, 0x00, 0x00, 0xc8, 0xd3, 0x00, 0x00, 0xcb, 0xd3, + 0x00, 0x00, 0xf8, 0xd9, 0x00, 0x00, 0xfc, 0xd9, 0x00, 0x00, 0xfe, 0xd9, + 0x00, 0x00, 0xff, 0xd9, 0x00, 0x00, 0xf8, 0xdd, 0x00, 0x00, 0xfc, 0xdd, + 0x00, 0x00, 0xfe, 0xdd, 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0xf1, 0xe3, + 0x00, 0x00, 0xf8, 0xe3, 0x00, 0x00, 0xf6, 0xe9, 0x00, 0x00, 0xf7, 0xe9, + 0x00, 0x00, 0xf8, 0xe9, 0x00, 0x00, 0xfc, 0xe9, 0x00, 0x00, 0xfe, 0xe9, + 0x00, 0x00, 0xff, 0xe9, 0x00, 0x00, 0xf0, 0xed, 0x00, 0x00, 0xf6, 0xed, + 0x00, 0x00, 0xf7, 0xed, 0x00, 0x00, 0xfd, 0xed, 0x00, 0x00, 0xfe, 0xed, + 0x00, 0x00, 0xff, 0xed, 0x00, 0x00, 0xe6, 0xf3, 0x00, 0x00, 0xe7, 0xf3, + 0x00, 0x00, 0xe8, 0xf3, 0x00, 0x00, 0xe9, 0xf3, 0x00, 0x00, 0xeb, 0xf3, + 0x00, 0x00, 0xf0, 0xf3, 0x00, 0x00, 0xf6, 0xf3, 0x00, 0x00, 0xf7, 0xf3, + 0x00, 0x00, 0xfd, 0xf3, 0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0xff, 0xf3, + 0x00, 0x00, 0xf7, 0xf9, 0x00, 0x00, 0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xf9, + 0x00, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xf0, 0xfd, + 0x00, 0x00, 0xf7, 0xfd, 0x00, 0x00, 0xfd, 0xfd, 0x00, 0x00, 0xfe, 0xfd, + 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xbe, 0x00, 0x01, 0x00, 0xbf, 0x00, + 0x01, 0x00, 0xc4, 0x01, 0x01, 0x00, 0xc5, 0x01, 0x01, 0x00, 0xce, 0x01, + 0x01, 0x00, 0xcf, 0x01, 0x01, 0x00, 0xf4, 0x01, 0x01, 0x00, 0xf5, 0x01, + 0x01, 0x00, 0xf8, 0x01, 0x01, 0x00, 0xfc, 0x01, 0x01, 0x00, 0xfe, 0x01, + 0x01, 0x00, 0xff, 0x01, 0x01, 0x00, 0xe4, 0x03, 0x01, 0x00, 0xee, 0x03, + 0x01, 0x00, 0xef, 0x03, 0x01, 0x00, 0xf4, 0x03, 0x01, 0x00, 0xf5, 0x03, + 0x01, 0x00, 0xf8, 0x03, 0x01, 0x00, 0xfc, 0x03, 0x01, 0x00, 0xfe, 0x03, + 0x01, 0x00, 0xff, 0x03, 0x01, 0x00, 0xbe, 0x04, 0x01, 0x00, 0xbf, 0x04, + 0x01, 0x00, 0xb8, 0x06, 0x01, 0x00, 0xbe, 0x08, 0x01, 0x00, 0xbf, 0x08, + 0x01, 0x00, 0xcf, 0x09, 0x01, 0x00, 0xf8, 0x09, 0x01, 0x00, 0xfc, 0x09, + 0x01, 0x00, 0xfe, 0x09, 0x01, 0x00, 0xff, 0x09, 0x01, 0x00, 0xb4, 0x0a, + 0x01, 0x00, 0xbe, 0x0a, 0x01, 0x00, 0xbf, 0x0a, 0x01, 0x00, 0xe8, 0x0b, + 0x01, 0x00, 0xf3, 0x0b, 0x01, 0x00, 0xfb, 0x0b, 0x01, 0x00, 0xcf, 0x0d, + 0x01, 0x00, 0xf8, 0x0d, 0x01, 0x00, 0xfc, 0x0d, 0x01, 0x00, 0xfe, 0x0d, + 0x01, 0x00, 0xff, 0x0d, 0x01, 0x00, 0xe4, 0x0f, 0x01, 0x00, 0xee, 0x0f, + 0x01, 0x00, 0xef, 0x0f, 0x01, 0x00, 0xf4, 0x0f, 0x01, 0x00, 0xf5, 0x0f, + 0x01, 0x00, 0xf8, 0x0f, 0x01, 0x00, 0xfc, 0x0f, 0x01, 0x00, 0xfe, 0x0f, + 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, 0xbe, 0x10, 0x01, 0x00, 0xbf, 0x10, + 0x01, 0x00, 0xf3, 0x11, 0x01, 0x00, 0xfb, 0x11, 0x01, 0x00, 0xee, 0x13, + 0x01, 0x00, 0xef, 0x13, 0x01, 0x00, 0xf8, 0x13, 0x01, 0x00, 0xbe, 0x14, + 0x01, 0x00, 0xbf, 0x14, 0x01, 0x00, 0xb4, 0x16, 0x01, 0x00, 0xbe, 0x16, + 0x01, 0x00, 0xbf, 0x16, 0x01, 0x00, 0x88, 0x17, 0x01, 0x00, 0xbe, 0x18, + 0x01, 0x00, 0xbf, 0x18, 0x01, 0x00, 0xf4, 0x19, 0x01, 0x00, 0xf5, 0x19, + 0x01, 0x00, 0xf8, 0x19, 0x01, 0x00, 0xfc, 0x19, 0x01, 0x00, 0xfe, 0x19, + 0x01, 0x00, 0xff, 0x19, 0x01, 0x00, 0xe8, 0x1b, 0x01, 0x00, 0xfe, 0x1b, + 0x01, 0x00, 0xff, 0x1b, 0x01, 0x00, 0xfe, 0x1d, 0x01, 0x00, 0xff, 0x1d, + 0x01, 0x00, 0xce, 0x1f, 0x01, 0x00, 0xcf, 0x1f, 0x01, 0x00, 0xee, 0x1f, + 0x01, 0x00, 0xef, 0x1f, 0x01, 0x00, 0xf3, 0x1f, 0x01, 0x00, 0xfb, 0x1f, + 0x01, 0x00, 0xbe, 0x32, 0x01, 0x00, 0xbf, 0x32, 0x01, 0x00, 0xe8, 0x33, + 0x01, 0x00, 0xe9, 0x33, 0x01, 0x00, 0xeb, 0x33, 0x01, 0x00, 0xf0, 0x33, + 0x01, 0x00, 0xf1, 0x33, 0x01, 0x00, 0xf9, 0x33, 0x01, 0x00, 0xfd, 0x33, + 0x01, 0x00, 0xcb, 0x39, 0x01, 0x00, 0xf0, 0x39, 0x01, 0x00, 0xf1, 0x39, + 0x01, 0x00, 0xf9, 0x39, 0x01, 0x00, 0xfd, 0x39, 0x01, 0x00, 0xbe, 0x3c, + 0x01, 0x00, 0xbf, 0x3c, 0x01, 0x00, 0xcb, 0x3d, 0x01, 0x00, 0xf0, 0x3d, + 0x01, 0x00, 0xf1, 0x3d, 0x01, 0x00, 0xf9, 0x3d, 0x01, 0x00, 0xfd, 0x3d, + 0x01, 0x00, 0xbe, 0x3e, 0x01, 0x00, 0xbf, 0x3e, 0x01, 0x00, 0xe8, 0x3f, + 0x01, 0x00, 0xe9, 0x3f, 0x01, 0x00, 0xeb, 0x3f, 0x01, 0x00, 0xf0, 0x3f, + 0x01, 0x00, 0xf1, 0x3f, 0x01, 0x00, 0xf9, 0x3f, 0x01, 0x00, 0xfd, 0x3f, + 0x01, 0x00, 0xb1, 0x40, 0x01, 0x00, 0xb8, 0x40, 0x01, 0x00, 0xc6, 0x41, + 0x01, 0x00, 0xc7, 0x41, 0x01, 0x00, 0xf6, 0x41, 0x01, 0x00, 0xf7, 0x41, + 0x01, 0x00, 0xf8, 0x41, 0x01, 0x00, 0xfc, 0x41, 0x01, 0x00, 0xfe, 0x41, + 0x01, 0x00, 0xff, 0x41, 0x01, 0x00, 0xb8, 0x42, 0x01, 0x00, 0xb0, 0x44, + 0x01, 0x00, 0xb6, 0x44, 0x01, 0x00, 0xb7, 0x44, 0x01, 0x00, 0xbd, 0x44, + 0x01, 0x00, 0xbe, 0x44, 0x01, 0x00, 0xbf, 0x44, 0x01, 0x00, 0xb1, 0x46, + 0x01, 0x00, 0xb8, 0x46, 0x01, 0x00, 0xc6, 0x47, 0x01, 0x00, 0xc7, 0x47, + 0x01, 0x00, 0xf6, 0x47, 0x01, 0x00, 0xf7, 0x47, 0x01, 0x00, 0xf8, 0x47, + 0x01, 0x00, 0xfc, 0x47, 0x01, 0x00, 0xfe, 0x47, 0x01, 0x00, 0xff, 0x47, + 0x01, 0x00, 0xb1, 0x48, 0x01, 0x00, 0xb8, 0x48, 0x01, 0x00, 0xf7, 0x49, + 0x01, 0x00, 0xf8, 0x49, 0x01, 0x00, 0xfc, 0x49, 0x01, 0x00, 0xfe, 0x49, + 0x01, 0x00, 0xff, 0x49, 0x01, 0x00, 0x86, 0x4b, 0x01, 0x00, 0x87, 0x4b, + 0x01, 0x00, 0x88, 0x4b, 0x01, 0x00, 0x89, 0x4b, 0x01, 0x00, 0x8b, 0x4b, + 0x01, 0x00, 0xbe, 0x4c, 0x01, 0x00, 0xbf, 0x4c, 0x01, 0x00, 0xf0, 0x4d, + 0x01, 0x00, 0xf7, 0x4d, 0x01, 0x00, 0xfd, 0x4d, 0x01, 0x00, 0xfe, 0x4d, + 0x01, 0x00, 0xff, 0x4d, 0x01, 0x00, 0xbe, 0x4e, 0x01, 0x00, 0xbf, 0x4e, + 0x01, 0x00, 0xc8, 0x53, 0x01, 0x00, 0xc9, 0x53, 0x01, 0x00, 0xcb, 0x53, + 0x01, 0x00, 0xf0, 0x53, 0x01, 0x00, 0xf1, 0x53, 0x01, 0x00, 0xf9, 0x53, + 0x01, 0x00, 0xfd, 0x53, 0x01, 0x00, 0xf7, 0x55, 0x01, 0x00, 0xf8, 0x55, + 0x01, 0x00, 0xfc, 0x55, 0x01, 0x00, 0xfe, 0x55, 0x01, 0x00, 0xff, 0x55, + 0x01, 0x00, 0xc8, 0x5f, 0x01, 0x00, 0xc9, 0x5f, 0x01, 0x00, 0xcb, 0x5f, + 0x01, 0x00, 0xf0, 0x5f, 0x01, 0x00, 0xf1, 0x5f, 0x01, 0x00, 0xf9, 0x5f, + 0x01, 0x00, 0xfd, 0x5f, 0x01, 0x00, 0xbe, 0x60, 0x01, 0x00, 0xbf, 0x60, + 0x01, 0x00, 0xf3, 0x61, 0x01, 0x00, 0xfb, 0x61, 0x01, 0x00, 0xbe, 0x64, + 0x01, 0x00, 0xbf, 0x64, 0x01, 0x00, 0xb4, 0x66, 0x01, 0x00, 0xbe, 0x66, + 0x01, 0x00, 0xbf, 0x66, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0xc8, 0x67, + 0x01, 0x00, 0xe4, 0x67, 0x01, 0x00, 0xe8, 0x67, 0x01, 0x00, 0xf4, 0x67, + 0x01, 0x00, 0xf5, 0x67, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, 0xfc, 0x67, + 0x01, 0x00, 0xfe, 0x67, 0x01, 0x00, 0xff, 0x67, 0x01, 0x00, 0xbe, 0x68, + 0x01, 0x00, 0xbf, 0x68, 0x01, 0x00, 0xf4, 0x69, 0x01, 0x00, 0xf5, 0x69, + 0x01, 0x00, 0xf8, 0x69, 0x01, 0x00, 0xfc, 0x69, 0x01, 0x00, 0xfe, 0x69, + 0x01, 0x00, 0xff, 0x69, 0x01, 0x00, 0xfe, 0x6d, 0x01, 0x00, 0xff, 0x6d, + 0x01, 0x00, 0xbe, 0x70, 0x01, 0x00, 0xbf, 0x70, 0x01, 0x00, 0xf8, 0x71, + 0x01, 0x00, 0xfc, 0x71, 0x01, 0x00, 0xfe, 0x71, 0x01, 0x00, 0xff, 0x71, + 0x01, 0x00, 0xbe, 0x74, 0x01, 0x00, 0xbf, 0x74, 0x01, 0x00, 0xb4, 0x76, + 0x01, 0x00, 0xbe, 0x76, 0x01, 0x00, 0xbf, 0x76, 0x01, 0x00, 0xc4, 0x77, + 0x01, 0x00, 0xc8, 0x77, 0x01, 0x00, 0xe4, 0x77, 0x01, 0x00, 0xe8, 0x77, + 0x01, 0x00, 0xf4, 0x77, 0x01, 0x00, 0xf5, 0x77, 0x01, 0x00, 0xf8, 0x77, + 0x01, 0x00, 0xfc, 0x77, 0x01, 0x00, 0xfe, 0x77, 0x01, 0x00, 0xff, 0x77, + 0x01, 0x00, 0xbe, 0x78, 0x01, 0x00, 0xbf, 0x78, 0x01, 0x00, 0xf3, 0x79, + 0x01, 0x00, 0xfb, 0x79, 0x01, 0x00, 0x88, 0x7b, 0x01, 0x00, 0xf8, 0x7d, + 0x01, 0x00, 0xcd, 0x85, 0x01, 0x00, 0xf1, 0x85, 0x01, 0x00, 0xf3, 0x85, + 0x01, 0x00, 0xf9, 0x85, 0x01, 0x00, 0xfb, 0x85, 0x01, 0x00, 0xfd, 0x85, + 0x01, 0x00, 0x83, 0x87, 0x01, 0x00, 0x87, 0x87, 0x01, 0x00, 0x8d, 0x87, + 0x01, 0x00, 0xe1, 0x87, 0x01, 0x00, 0xe2, 0x87, 0x01, 0x00, 0xe7, 0x87, + 0x01, 0x00, 0xeb, 0x87, 0x01, 0x00, 0xee, 0x87, 0x01, 0x00, 0xef, 0x87, + 0x01, 0x00, 0xf2, 0x87, 0x01, 0x00, 0xf7, 0x87, 0x01, 0x00, 0xf8, 0x87, + 0x01, 0x00, 0xfa, 0x87, 0x01, 0x00, 0xfc, 0x87, 0x01, 0x00, 0xfe, 0x87, + 0x01, 0x00, 0xff, 0x87, 0x01, 0x00, 0x8b, 0x8b, 0x01, 0x00, 0x8d, 0x8b, + 0x01, 0x00, 0xf3, 0x93, 0x01, 0x00, 0xfb, 0x93, 0x01, 0x00, 0xf3, 0x99, + 0x01, 0x00, 0xfb, 0x99, 0x01, 0x00, 0xf3, 0x9d, 0x01, 0x00, 0xfb, 0x9d, + 0x01, 0x00, 0xe3, 0x9f, 0x01, 0x00, 0xf3, 0x9f, 0x01, 0x00, 0xfb, 0x9f, + 0x01, 0x00, 0xff, 0xa5, 0x01, 0x00, 0xf8, 0xa7, 0x01, 0x00, 0xfc, 0xa7, + 0x01, 0x00, 0xfe, 0xa7, 0x01, 0x00, 0xff, 0xa7, 0x01, 0x00, 0xb8, 0xaa, + 0x01, 0x00, 0xbc, 0xaa, 0x01, 0x00, 0xbe, 0xaa, 0x01, 0x00, 0xbf, 0xaa, + 0x01, 0x00, 0x8b, 0xab, 0x01, 0x00, 0x8b, 0xbb, 0x01, 0x00, 0x8b, 0xbf, + 0x01, 0x00, 0xeb, 0xd3, 0x01, 0x00, 0xee, 0xd3, 0x01, 0x00, 0xef, 0xd3, + 0x01, 0x00, 0xf8, 0xd3, 0x01, 0x00, 0xfc, 0xd3, 0x01, 0x00, 0xfe, 0xd3, + 0x01, 0x00, 0xff, 0xd3, 0x01, 0x00, 0xf3, 0xd9, 0x01, 0x00, 0xfb, 0xd9, + 0x01, 0x00, 0xc3, 0xdd, 0x01, 0x00, 0xcf, 0xdd, 0x01, 0x00, 0xf8, 0xdd, + 0x01, 0x00, 0xfc, 0xdd, 0x01, 0x00, 0xfe, 0xdd, 0x01, 0x00, 0xff, 0xdd, + 0x01, 0x00, 0xe3, 0xdf, 0x01, 0x00, 0xf3, 0xdf, 0x01, 0x00, 0xfb, 0xdf, + 0x01, 0x00, 0xe1, 0xf3, 0x01, 0x00, 0xe2, 0xf3, 0x01, 0x00, 0xed, 0xf3, + 0x01, 0x00, 0xee, 0xf3, 0x01, 0x00, 0xef, 0xf3, 0x01, 0x00, 0xf2, 0xf3, + 0x01, 0x00, 0xf8, 0xf3, 0x01, 0x00, 0xfa, 0xf3, 0x01, 0x00, 0xfc, 0xf3, + 0x01, 0x00, 0xfe, 0xf3, 0x01, 0x00, 0xff, 0xf3, 0x01, 0x00, 0xff, 0xf9, + 0x01, 0x00, 0xb3, 0xfc, 0x01, 0x00, 0xbb, 0xfc, 0x01, 0x00, 0xff, 0xfd, + 0x01, 0x00, 0xb3, 0xfe, 0x01, 0x00, 0xbb, 0xfe, 0x01, 0x00, 0x83, 0xff, + 0x01, 0x00, 0x8e, 0xff, 0x01, 0x00, 0x8f, 0xff, 0x01, 0x00, 0xce, 0xff, + 0x01, 0x00, 0xcf, 0xff, 0x01, 0x00, 0xe1, 0xff, 0x01, 0x00, 0xe2, 0xff, + 0x01, 0x00, 0xee, 0xff, 0x01, 0x00, 0xef, 0xff, 0x01, 0x00, 0xf2, 0xff, + 0x01, 0x00, 0xf8, 0xff, 0x01, 0x00, 0xfa, 0xff, 0x01, 0x00, 0xfc, 0xff, + 0x01, 0x00, 0xfe, 0xff, 0x01, 0x00, 0xff, 0xff, 0x01, 0x00, 0xb8, 0x06, + 0x02, 0x00, 0xbc, 0x06, 0x02, 0x00, 0xbe, 0x06, 0x02, 0x00, 0xbf, 0x06, + 0x02, 0x00, 0xc8, 0x07, 0x02, 0x00, 0xcb, 0x07, 0x02, 0x00, 0xe8, 0x07, + 0x02, 0x00, 0xeb, 0x07, 0x02, 0x00, 0xf8, 0x07, 0x02, 0x00, 0xfc, 0x07, + 0x02, 0x00, 0xfe, 0x07, 0x02, 0x00, 0xff, 0x07, 0x02, 0x00, 0xc8, 0x0f, + 0x02, 0x00, 0xcb, 0x0f, 0x02, 0x00, 0xe8, 0x0f, 0x02, 0x00, 0xeb, 0x0f, + 0x02, 0x00, 0xf8, 0x0f, 0x02, 0x00, 0xfc, 0x0f, 0x02, 0x00, 0xfe, 0x0f, + 0x02, 0x00, 0xff, 0x0f, 0x02, 0x00, 0xbe, 0x10, 0x02, 0x00, 0xbf, 0x10, + 0x02, 0x00, 0xb8, 0x14, 0x02, 0x00, 0xbc, 0x14, 0x02, 0x00, 0xbe, 0x14, + 0x02, 0x00, 0xbf, 0x14, 0x02, 0x00, 0xb8, 0x16, 0x02, 0x00, 0xbc, 0x16, + 0x02, 0x00, 0xbe, 0x16, 0x02, 0x00, 0xbf, 0x16, 0x02, 0x00, 0xb8, 0x18, + 0x02, 0x00, 0xb8, 0x1a, 0x02, 0x00, 0xbc, 0x1a, 0x02, 0x00, 0xbe, 0x1a, + 0x02, 0x00, 0xbf, 0x1a, 0x02, 0x00, 0xe8, 0x23, 0x02, 0x00, 0xeb, 0x23, + 0x02, 0x00, 0xf8, 0x23, 0x02, 0x00, 0xfc, 0x23, 0x02, 0x00, 0xfe, 0x23, + 0x02, 0x00, 0xff, 0x23, 0x02, 0x00, 0xf8, 0x29, 0x02, 0x00, 0xfc, 0x29, + 0x02, 0x00, 0xfe, 0x29, 0x02, 0x00, 0xff, 0x29, 0x02, 0x00, 0xf8, 0x2d, + 0x02, 0x00, 0xfc, 0x2d, 0x02, 0x00, 0xfe, 0x2d, 0x02, 0x00, 0xff, 0x2d, + 0x02, 0x00, 0xe9, 0x33, 0x02, 0x00, 0xea, 0x33, 0x02, 0x00, 0xf0, 0x33, + 0x02, 0x00, 0xf1, 0x33, 0x02, 0x00, 0xf9, 0x33, 0x02, 0x00, 0xfd, 0x33, + 0x02, 0x00, 0xf7, 0x35, 0x02, 0x00, 0xf8, 0x35, 0x02, 0x00, 0xfc, 0x35, + 0x02, 0x00, 0xfe, 0x35, 0x02, 0x00, 0xff, 0x35, 0x02, 0x00, 0xf7, 0x39, + 0x02, 0x00, 0xf8, 0x39, 0x02, 0x00, 0xfc, 0x39, 0x02, 0x00, 0xfe, 0x39, + 0x02, 0x00, 0xff, 0x39, 0x02, 0x00, 0xf0, 0x3d, 0x02, 0x00, 0xf1, 0x3d, + 0x02, 0x00, 0xf9, 0x3d, 0x02, 0x00, 0xfd, 0x3d, 0x02, 0x00, 0xf0, 0x45, + 0x02, 0x00, 0xf1, 0x45, 0x02, 0x00, 0xf9, 0x45, 0x02, 0x00, 0xfd, 0x45, + 0x02, 0x00, 0xf7, 0x47, 0x02, 0x00, 0xf8, 0x47, 0x02, 0x00, 0xfc, 0x47, + 0x02, 0x00, 0xfe, 0x47, 0x02, 0x00, 0xff, 0x47, 0x02, 0x00, 0xb8, 0x52, + 0x02, 0x00, 0xbc, 0x52, 0x02, 0x00, 0xbe, 0x52, 0x02, 0x00, 0xbf, 0x52, + 0x02, 0x00, 0xcb, 0x53, 0x02, 0x00, 0xf7, 0x53, 0x02, 0x00, 0xf8, 0x53, + 0x02, 0x00, 0xfc, 0x53, 0x02, 0x00, 0xfe, 0x53, 0x02, 0x00, 0xff, 0x53, + 0x02, 0x00, 0xf3, 0x65, 0x02, 0x00, 0xfb, 0x65, 0x02, 0x00, 0xce, 0x67, + 0x02, 0x00, 0xcf, 0x67, 0x02, 0x00, 0xee, 0x67, 0x02, 0x00, 0xef, 0x67, + 0x02, 0x00, 0xf8, 0x67, 0x02, 0x00, 0xfc, 0x67, 0x02, 0x00, 0xfe, 0x67, + 0x02, 0x00, 0xff, 0x67, 0x02, 0x00, 0xf3, 0x79, 0x02, 0x00, 0xfb, 0x79, + 0x02, 0x00, 0xf3, 0x7d, 0x02, 0x00, 0xfb, 0x7d, 0x02, 0x00, 0xc3, 0x7f, + 0x02, 0x00, 0xcb, 0x7f, 0x02, 0x00, 0xe3, 0x7f, 0x02, 0x00, 0xeb, 0x7f, + 0x02, 0x00, 0xf3, 0x7f, 0x02, 0x00, 0xfb, 0x7f, 0x02, 0x00, 0xb1, 0x80, + 0x02, 0x00, 0xb3, 0x80, 0x02, 0x00, 0xb9, 0x80, 0x02, 0x00, 0xbb, 0x80, + 0x02, 0x00, 0xbd, 0x80, 0x02, 0x00, 0xc3, 0x81, 0x02, 0x00, 0xf2, 0x81, + 0x02, 0x00, 0xf7, 0x81, 0x02, 0x00, 0xf8, 0x81, 0x02, 0x00, 0xfa, 0x81, + 0x02, 0x00, 0xfc, 0x81, 0x02, 0x00, 0xfe, 0x81, 0x02, 0x00, 0xff, 0x81, + 0x02, 0x00, 0xb3, 0x82, 0x02, 0x00, 0xbb, 0x82, 0x02, 0x00, 0xb2, 0x84, + 0x02, 0x00, 0xb7, 0x84, 0x02, 0x00, 0xb8, 0x84, 0x02, 0x00, 0xba, 0x84, + 0x02, 0x00, 0xbc, 0x84, 0x02, 0x00, 0xbe, 0x84, 0x02, 0x00, 0xbf, 0x84, + 0x02, 0x00, 0xcd, 0x85, 0x02, 0x00, 0xf1, 0x85, 0x02, 0x00, 0xf3, 0x85, + 0x02, 0x00, 0xf9, 0x85, 0x02, 0x00, 0xfb, 0x85, 0x02, 0x00, 0xfd, 0x85, + 0x02, 0x00, 0xb2, 0x86, 0x02, 0x00, 0xb7, 0x86, 0x02, 0x00, 0xb8, 0x86, + 0x02, 0x00, 0xba, 0x86, 0x02, 0x00, 0xbc, 0x86, 0x02, 0x00, 0xbe, 0x86, + 0x02, 0x00, 0xbf, 0x86, 0x02, 0x00, 0xb2, 0x88, 0x02, 0x00, 0xb8, 0x88, + 0x02, 0x00, 0xba, 0x88, 0x02, 0x00, 0xbc, 0x88, 0x02, 0x00, 0xbe, 0x88, + 0x02, 0x00, 0xbf, 0x88, 0x02, 0x00, 0xf3, 0x89, 0x02, 0x00, 0xf7, 0x89, + 0x02, 0x00, 0xfb, 0x89, 0x02, 0x00, 0xb3, 0x8a, 0x02, 0x00, 0xb7, 0x8a, + 0x02, 0x00, 0xbb, 0x8a, 0x02, 0x00, 0xb8, 0x8c, 0x02, 0x00, 0xbc, 0x8c, + 0x02, 0x00, 0xbe, 0x8c, 0x02, 0x00, 0xbf, 0x8c, 0x02, 0x00, 0xff, 0x8d, + 0x02, 0x00, 0xbf, 0x8e, 0x02, 0x00, 0xf3, 0x93, 0x02, 0x00, 0xfb, 0x93, + 0x02, 0x00, 0xe3, 0x9f, 0x02, 0x00, 0xf3, 0x9f, 0x02, 0x00, 0xfb, 0x9f, + 0x02, 0x00, 0x83, 0xa7, 0x02, 0x00, 0x8e, 0xa7, 0x02, 0x00, 0x8f, 0xa7, + 0x02, 0x00, 0xee, 0xa7, 0x02, 0x00, 0xef, 0xa7, 0x02, 0x00, 0xf8, 0xa7, + 0x02, 0x00, 0xfc, 0xa7, 0x02, 0x00, 0xfe, 0xa7, 0x02, 0x00, 0xff, 0xa7, + 0x02, 0x00, 0xb8, 0xaa, 0x02, 0x00, 0xbc, 0xaa, 0x02, 0x00, 0xbe, 0xaa, + 0x02, 0x00, 0xbf, 0xaa, 0x02, 0x00, 0x84, 0xab, 0x02, 0x00, 0xf3, 0xab, + 0x02, 0x00, 0xfb, 0xab, 0x02, 0x00, 0x83, 0xb3, 0x02, 0x00, 0x8e, 0xb3, + 0x02, 0x00, 0x8f, 0xb3, 0x02, 0x00, 0xe1, 0xb3, 0x02, 0x00, 0xe2, 0xb3, + 0x02, 0x00, 0xee, 0xb3, 0x02, 0x00, 0xef, 0xb3, 0x02, 0x00, 0xf2, 0xb3, + 0x02, 0x00, 0xf8, 0xb3, 0x02, 0x00, 0xfa, 0xb3, 0x02, 0x00, 0xfc, 0xb3, + 0x02, 0x00, 0xfe, 0xb3, 0x02, 0x00, 0xff, 0xb3, 0x02, 0x00, 0x8b, 0xbb, + 0x02, 0x00, 0x8d, 0xbb, 0x02, 0x00, 0xe1, 0xbb, 0x02, 0x00, 0xe2, 0xbb, + 0x02, 0x00, 0xee, 0xbb, 0x02, 0x00, 0xef, 0xbb, 0x02, 0x00, 0xf2, 0xbb, + 0x02, 0x00, 0xf8, 0xbb, 0x02, 0x00, 0xfa, 0xbb, 0x02, 0x00, 0xfc, 0xbb, + 0x02, 0x00, 0xfe, 0xbb, 0x02, 0x00, 0xff, 0xbb, 0x02, 0x00, 0x8b, 0xbf, + 0x02, 0x00, 0xe3, 0xbf, 0x02, 0x00, 0xe7, 0xbf, 0x02, 0x00, 0xeb, 0xbf, + 0x02, 0x00, 0xed, 0xbf, 0x02, 0x00, 0xf1, 0xbf, 0x02, 0x00, 0xf3, 0xbf, + 0x02, 0x00, 0xf7, 0xbf, 0x02, 0x00, 0xf9, 0xbf, 0x02, 0x00, 0xfb, 0xbf, + 0x02, 0x00, 0xfd, 0xbf, 0x02, 0x00, 0xe6, 0xc3, 0x02, 0x00, 0xe7, 0xc3, + 0x02, 0x00, 0xe8, 0xc3, 0x02, 0x00, 0xeb, 0xc3, 0x02, 0x00, 0xf6, 0xc3, + 0x02, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0xf8, 0xc3, 0x02, 0x00, 0xfc, 0xc3, + 0x02, 0x00, 0xfe, 0xc3, 0x02, 0x00, 0xff, 0xc3, 0x02, 0x00, 0xb8, 0xcc, + 0x02, 0x00, 0xbc, 0xcc, 0x02, 0x00, 0xbe, 0xcc, 0x02, 0x00, 0xbf, 0xcc, + 0x02, 0x00, 0xb8, 0xce, 0x02, 0x00, 0xbc, 0xce, 0x02, 0x00, 0xbe, 0xce, + 0x02, 0x00, 0xbf, 0xce, 0x02, 0x00, 0xc9, 0xcf, 0x02, 0x00, 0xca, 0xcf, + 0x02, 0x00, 0xe9, 0xcf, 0x02, 0x00, 0xea, 0xcf, 0x02, 0x00, 0xf0, 0xcf, + 0x02, 0x00, 0xf1, 0xcf, 0x02, 0x00, 0xf9, 0xcf, 0x02, 0x00, 0xfd, 0xcf, + 0x02, 0x00, 0xe8, 0xdf, 0x02, 0x00, 0xeb, 0xdf, 0x02, 0x00, 0xf8, 0xdf, + 0x02, 0x00, 0xfc, 0xdf, 0x02, 0x00, 0xfe, 0xdf, 0x02, 0x00, 0xff, 0xdf, + 0x02, 0x00, 0xe8, 0xe3, 0x02, 0x00, 0xe9, 0xe3, 0x02, 0x00, 0xeb, 0xe3, + 0x02, 0x00, 0xf0, 0xe3, 0x02, 0x00, 0xf1, 0xe3, 0x02, 0x00, 0xf9, 0xe3, + 0x02, 0x00, 0xfd, 0xe3, 0x02, 0x00, 0xb8, 0xec, 0x02, 0x00, 0xbc, 0xec, + 0x02, 0x00, 0xbe, 0xec, 0x02, 0x00, 0xbf, 0xec, 0x02, 0x00, 0xc9, 0xef, + 0x02, 0x00, 0xca, 0xef, 0x02, 0x00, 0xe9, 0xef, 0x02, 0x00, 0xea, 0xef, + 0x02, 0x00, 0xf0, 0xef, 0x02, 0x00, 0xf1, 0xef, 0x02, 0x00, 0xf9, 0xef, + 0x02, 0x00, 0xfd, 0xef, 0x02, 0x00, 0xe6, 0xf3, 0x02, 0x00, 0xe7, 0xf3, + 0x02, 0x00, 0xf6, 0xf3, 0x02, 0x00, 0xf7, 0xf3, 0x02, 0x00, 0xf8, 0xf3, + 0x02, 0x00, 0xfc, 0xf3, 0x02, 0x00, 0xfe, 0xf3, 0x02, 0x00, 0xff, 0xf3, + 0x02, 0x00, 0x88, 0xff, 0x02, 0x00, 0x8b, 0xff, 0x02, 0x00, 0xc6, 0xff, + 0x02, 0x00, 0xc7, 0xff, 0x02, 0x00, 0xc8, 0xff, 0x02, 0x00, 0xcb, 0xff, + 0x02, 0x00, 0xe6, 0xff, 0x02, 0x00, 0xe7, 0xff, 0x02, 0x00, 0xe8, 0xff, + 0x02, 0x00, 0xeb, 0xff, 0x02, 0x00, 0xf6, 0xff, 0x02, 0x00, 0xf7, 0xff, + 0x02, 0x00, 0xf8, 0xff, 0x02, 0x00, 0xfc, 0xff, 0x02, 0x00, 0xfe, 0xff, + 0x02, 0x00, 0xff, 0xff, 0x02, 0x00, 0x73, 0x00, 0x03, 0x00, 0x7b, 0x00, + 0x03, 0x00, 0xbe, 0x00, 0x03, 0x00, 0xbf, 0x00, 0x03, 0x00, 0x73, 0x01, + 0x03, 0x00, 0x7b, 0x01, 0x03, 0x00, 0xbe, 0x04, 0x03, 0x00, 0xbf, 0x04, + 0x03, 0x00, 0xf4, 0x05, 0x03, 0x00, 0xf5, 0x05, 0x03, 0x00, 0xf8, 0x05, + 0x03, 0x00, 0xfc, 0x05, 0x03, 0x00, 0xfe, 0x05, 0x03, 0x00, 0xff, 0x05, + 0x03, 0x00, 0xb8, 0x06, 0x03, 0x00, 0x78, 0x08, 0x03, 0x00, 0x7c, 0x08, + 0x03, 0x00, 0x7e, 0x08, 0x03, 0x00, 0x7f, 0x08, 0x03, 0x00, 0xbe, 0x08, + 0x03, 0x00, 0xbf, 0x08, 0x03, 0x00, 0xf3, 0x09, 0x03, 0x00, 0xfb, 0x09, + 0x03, 0x00, 0xb4, 0x0a, 0x03, 0x00, 0xbe, 0x0a, 0x03, 0x00, 0xbf, 0x0a, + 0x03, 0x00, 0x78, 0x0b, 0x03, 0x00, 0x7c, 0x0b, 0x03, 0x00, 0x7e, 0x0b, + 0x03, 0x00, 0x7f, 0x0b, 0x03, 0x00, 0x88, 0x0b, 0x03, 0x00, 0xe8, 0x0b, + 0x03, 0x00, 0xf3, 0x0b, 0x03, 0x00, 0xfb, 0x0b, 0x03, 0x00, 0xf3, 0x0d, + 0x03, 0x00, 0xfb, 0x0d, 0x03, 0x00, 0xc8, 0x0f, 0x03, 0x00, 0xe8, 0x0f, + 0x03, 0x00, 0xf3, 0x0f, 0x03, 0x00, 0xfb, 0x0f, 0x03, 0x00, 0x7e, 0x10, + 0x03, 0x00, 0x7f, 0x10, 0x03, 0x00, 0xbe, 0x10, 0x03, 0x00, 0xbf, 0x10, + 0x03, 0x00, 0x74, 0x11, 0x03, 0x00, 0x75, 0x11, 0x03, 0x00, 0x78, 0x11, + 0x03, 0x00, 0x7c, 0x11, 0x03, 0x00, 0x7e, 0x11, 0x03, 0x00, 0x7f, 0x11, + 0x03, 0x00, 0xbe, 0x14, 0x03, 0x00, 0xbf, 0x14, 0x03, 0x00, 0xf4, 0x15, + 0x03, 0x00, 0xfe, 0x15, 0x03, 0x00, 0xff, 0x15, 0x03, 0x00, 0xb4, 0x16, + 0x03, 0x00, 0xbe, 0x16, 0x03, 0x00, 0xbf, 0x16, 0x03, 0x00, 0x88, 0x17, + 0x03, 0x00, 0x98, 0x17, 0x03, 0x00, 0x9c, 0x17, 0x03, 0x00, 0x9e, 0x17, + 0x03, 0x00, 0x9f, 0x17, 0x03, 0x00, 0xd8, 0x17, 0x03, 0x00, 0xdc, 0x17, + 0x03, 0x00, 0xde, 0x17, 0x03, 0x00, 0xdf, 0x17, 0x03, 0x00, 0x7e, 0x18, + 0x03, 0x00, 0x7f, 0x18, 0x03, 0x00, 0xbe, 0x18, 0x03, 0x00, 0xbf, 0x18, + 0x03, 0x00, 0xf3, 0x19, 0x03, 0x00, 0xfb, 0x19, 0x03, 0x00, 0xb8, 0x1a, + 0x03, 0x00, 0x78, 0x1b, 0x03, 0x00, 0xc8, 0x1b, 0x03, 0x00, 0xfe, 0x1b, + 0x03, 0x00, 0xff, 0x1b, 0x03, 0x00, 0xf8, 0x1d, 0x03, 0x00, 0xf4, 0x1f, + 0x03, 0x00, 0xf5, 0x1f, 0x03, 0x00, 0xf8, 0x1f, 0x03, 0x00, 0xfc, 0x1f, + 0x03, 0x00, 0xfe, 0x1f, 0x03, 0x00, 0xff, 0x1f, 0x03, 0x00, 0xb8, 0x26, + 0x03, 0x00, 0xbe, 0x2a, 0x03, 0x00, 0xbf, 0x2a, 0x03, 0x00, 0xf8, 0x2b, + 0x03, 0x00, 0xbe, 0x32, 0x03, 0x00, 0xbf, 0x32, 0x03, 0x00, 0xd1, 0x33, + 0x03, 0x00, 0xd6, 0x33, 0x03, 0x00, 0xd7, 0x33, 0x03, 0x00, 0xd9, 0x33, + 0x03, 0x00, 0xdd, 0x33, 0x03, 0x00, 0xe8, 0x33, 0x03, 0x00, 0xe9, 0x33, + 0x03, 0x00, 0xeb, 0x33, 0x03, 0x00, 0xf0, 0x33, 0x03, 0x00, 0xf1, 0x33, + 0x03, 0x00, 0xf9, 0x33, 0x03, 0x00, 0xfd, 0x33, 0x03, 0x00, 0xb1, 0x3a, + 0x03, 0x00, 0xb8, 0x3a, 0x03, 0x00, 0xe8, 0x3b, 0x03, 0x00, 0xe9, 0x3b, + 0x03, 0x00, 0xeb, 0x3b, 0x03, 0x00, 0xf0, 0x3b, 0x03, 0x00, 0xf1, 0x3b, + 0x03, 0x00, 0xf9, 0x3b, 0x03, 0x00, 0xfd, 0x3b, 0x03, 0x00, 0x78, 0x3c, + 0x03, 0x00, 0x7c, 0x3c, 0x03, 0x00, 0x7e, 0x3c, 0x03, 0x00, 0x7f, 0x3c, + 0x03, 0x00, 0x78, 0x3e, 0x03, 0x00, 0x7c, 0x3e, 0x03, 0x00, 0x7e, 0x3e, + 0x03, 0x00, 0x7f, 0x3e, 0x03, 0x00, 0x91, 0x3f, 0x03, 0x00, 0x96, 0x3f, + 0x03, 0x00, 0x97, 0x3f, 0x03, 0x00, 0x99, 0x3f, 0x03, 0x00, 0x9d, 0x3f, + 0x03, 0x00, 0xd1, 0x3f, 0x03, 0x00, 0xd6, 0x3f, 0x03, 0x00, 0xd7, 0x3f, + 0x03, 0x00, 0xd9, 0x3f, 0x03, 0x00, 0xdd, 0x3f, 0x03, 0x00, 0x77, 0x40, + 0x03, 0x00, 0x78, 0x40, 0x03, 0x00, 0x7c, 0x40, 0x03, 0x00, 0x7e, 0x40, + 0x03, 0x00, 0x7f, 0x40, 0x03, 0x00, 0xb0, 0x40, 0x03, 0x00, 0xb7, 0x40, + 0x03, 0x00, 0xbd, 0x40, 0x03, 0x00, 0xbe, 0x40, 0x03, 0x00, 0xbf, 0x40, + 0x03, 0x00, 0x77, 0x41, 0x03, 0x00, 0x78, 0x41, 0x03, 0x00, 0x7c, 0x41, + 0x03, 0x00, 0x7e, 0x41, 0x03, 0x00, 0x7f, 0x41, 0x03, 0x00, 0x78, 0x42, + 0x03, 0x00, 0x7c, 0x42, 0x03, 0x00, 0x7e, 0x42, 0x03, 0x00, 0x7f, 0x42, + 0x03, 0x00, 0xb1, 0x44, 0x03, 0x00, 0xb8, 0x44, 0x03, 0x00, 0xf7, 0x45, + 0x03, 0x00, 0xf8, 0x45, 0x03, 0x00, 0xfc, 0x45, 0x03, 0x00, 0xfe, 0x45, + 0x03, 0x00, 0xff, 0x45, 0x03, 0x00, 0xb1, 0x46, 0x03, 0x00, 0xb8, 0x46, + 0x03, 0x00, 0x7f, 0x48, 0x03, 0x00, 0xb1, 0x48, 0x03, 0x00, 0xb7, 0x48, + 0x03, 0x00, 0xb8, 0x48, 0x03, 0x00, 0xf7, 0x49, 0x03, 0x00, 0xbf, 0x4a, + 0x03, 0x00, 0xd0, 0x4b, 0x03, 0x00, 0xdf, 0x4b, 0x03, 0x00, 0xe7, 0x4b, + 0x03, 0x00, 0xeb, 0x4b, 0x03, 0x00, 0xf1, 0x4b, 0x03, 0x00, 0xf7, 0x4b, + 0x03, 0x00, 0xf8, 0x4b, 0x03, 0x00, 0x7f, 0x4c, 0x03, 0x00, 0xf7, 0x4d, + 0x03, 0x00, 0x78, 0x4e, 0x03, 0x00, 0x7c, 0x4e, 0x03, 0x00, 0x7e, 0x4e, + 0x03, 0x00, 0x7f, 0x4e, 0x03, 0x00, 0x1f, 0x4f, 0x03, 0x00, 0x78, 0x4f, + 0x03, 0x00, 0x7c, 0x4f, 0x03, 0x00, 0x7e, 0x4f, 0x03, 0x00, 0x7f, 0x4f, + 0x03, 0x00, 0xc7, 0x4f, 0x03, 0x00, 0xcb, 0x4f, 0x03, 0x00, 0xe7, 0x4f, + 0x03, 0x00, 0xeb, 0x4f, 0x03, 0x00, 0xf0, 0x4f, 0x03, 0x00, 0xf1, 0x4f, + 0x03, 0x00, 0xf7, 0x4f, 0x03, 0x00, 0xf9, 0x4f, 0x03, 0x00, 0xfd, 0x4f, + 0x03, 0x00, 0xf0, 0x51, 0x03, 0x00, 0xf1, 0x51, 0x03, 0x00, 0xf9, 0x51, + 0x03, 0x00, 0xfd, 0x51, 0x03, 0x00, 0xb0, 0x54, 0x03, 0x00, 0xbd, 0x54, + 0x03, 0x00, 0xbe, 0x54, 0x03, 0x00, 0xbf, 0x54, 0x03, 0x00, 0xff, 0x55, + 0x03, 0x00, 0xcb, 0x57, 0x03, 0x00, 0xeb, 0x57, 0x03, 0x00, 0xf8, 0x57, + 0x03, 0x00, 0xfc, 0x57, 0x03, 0x00, 0xfe, 0x57, 0x03, 0x00, 0xff, 0x57, + 0x03, 0x00, 0xb0, 0x58, 0x03, 0x00, 0xb7, 0x58, 0x03, 0x00, 0xbd, 0x58, + 0x03, 0x00, 0xbe, 0x58, 0x03, 0x00, 0xbf, 0x58, 0x03, 0x00, 0xf7, 0x59, + 0x03, 0x00, 0xf8, 0x59, 0x03, 0x00, 0xfc, 0x59, 0x03, 0x00, 0xfe, 0x59, + 0x03, 0x00, 0xff, 0x59, 0x03, 0x00, 0xb8, 0x5c, 0x03, 0x00, 0xf7, 0x5d, + 0x03, 0x00, 0xf8, 0x5d, 0x03, 0x00, 0xfc, 0x5d, 0x03, 0x00, 0xfe, 0x5d, + 0x03, 0x00, 0xff, 0x5d, 0x03, 0x00, 0xb8, 0x5e, 0x03, 0x00, 0xf7, 0x5f, + 0x03, 0x00, 0xf8, 0x5f, 0x03, 0x00, 0xfc, 0x5f, 0x03, 0x00, 0xfe, 0x5f, + 0x03, 0x00, 0xff, 0x5f, 0x03, 0x00, 0x74, 0x60, 0x03, 0x00, 0x7e, 0x60, + 0x03, 0x00, 0x7f, 0x60, 0x03, 0x00, 0xb8, 0x60, 0x03, 0x00, 0x73, 0x61, + 0x03, 0x00, 0x7b, 0x61, 0x03, 0x00, 0xbe, 0x64, 0x03, 0x00, 0xbf, 0x64, + 0x03, 0x00, 0xf3, 0x65, 0x03, 0x00, 0xfb, 0x65, 0x03, 0x00, 0xff, 0x65, + 0x03, 0x00, 0xb3, 0x66, 0x03, 0x00, 0xbb, 0x66, 0x03, 0x00, 0xbf, 0x66, + 0x03, 0x00, 0x74, 0x68, 0x03, 0x00, 0x7e, 0x68, 0x03, 0x00, 0x7f, 0x68, + 0x03, 0x00, 0xb8, 0x68, 0x03, 0x00, 0xf3, 0x69, 0x03, 0x00, 0xfb, 0x69, + 0x03, 0x00, 0xb8, 0x6a, 0x03, 0x00, 0x7e, 0x6b, 0x03, 0x00, 0x7f, 0x6b, + 0x03, 0x00, 0xce, 0x6b, 0x03, 0x00, 0xcf, 0x6b, 0x03, 0x00, 0xf8, 0x6b, + 0x03, 0x00, 0xf8, 0x6d, 0x03, 0x00, 0xf3, 0x6f, 0x03, 0x00, 0xfb, 0x6f, + 0x03, 0x00, 0x74, 0x70, 0x03, 0x00, 0xbe, 0x70, 0x03, 0x00, 0xbf, 0x70, + 0x03, 0x00, 0x13, 0x71, 0x03, 0x00, 0x1f, 0x71, 0x03, 0x00, 0x78, 0x71, + 0x03, 0x00, 0x7c, 0x71, 0x03, 0x00, 0x7e, 0x71, 0x03, 0x00, 0x7f, 0x71, + 0x03, 0x00, 0xbe, 0x74, 0x03, 0x00, 0xbf, 0x74, 0x03, 0x00, 0xf3, 0x75, + 0x03, 0x00, 0xfb, 0x75, 0x03, 0x00, 0xff, 0x75, 0x03, 0x00, 0xb3, 0x76, + 0x03, 0x00, 0xbb, 0x76, 0x03, 0x00, 0xbf, 0x76, 0x03, 0x00, 0x74, 0x78, + 0x03, 0x00, 0xbe, 0x78, 0x03, 0x00, 0xbf, 0x78, 0x03, 0x00, 0xff, 0x79, + 0x03, 0x00, 0xb3, 0x7a, 0x03, 0x00, 0xbb, 0x7a, 0x03, 0x00, 0xbf, 0x7a, + 0x03, 0x00, 0x78, 0x7b, 0x03, 0x00, 0xfe, 0x7b, 0x03, 0x00, 0xff, 0x7b, + 0x03, 0x00, 0xf3, 0x7d, 0x03, 0x00, 0xfb, 0x7d, 0x03, 0x00, 0xff, 0x7d, + 0x03, 0x00, 0xf8, 0x7f, 0x03, 0x00, 0xfc, 0x7f, 0x03, 0x00, 0xfe, 0x7f, + 0x03, 0x00, 0xff, 0x7f, 0x03, 0x00, 0x70, 0x84, 0x03, 0x00, 0x71, 0x84, + 0x03, 0x00, 0x73, 0x84, 0x03, 0x00, 0x79, 0x84, 0x03, 0x00, 0x7b, 0x84, + 0x03, 0x00, 0x7d, 0x84, 0x03, 0x00, 0x78, 0x85, 0x03, 0x00, 0x7c, 0x85, + 0x03, 0x00, 0x7e, 0x85, 0x03, 0x00, 0x7f, 0x85, 0x03, 0x00, 0x72, 0x86, + 0x03, 0x00, 0x74, 0x86, 0x03, 0x00, 0x75, 0x86, 0x03, 0x00, 0x76, 0x86, + 0x03, 0x00, 0x77, 0x86, 0x03, 0x00, 0x78, 0x86, 0x03, 0x00, 0x7a, 0x86, + 0x03, 0x00, 0x7c, 0x86, 0x03, 0x00, 0x7e, 0x86, 0x03, 0x00, 0x7f, 0x86, + 0x03, 0x00, 0x76, 0x87, 0x03, 0x00, 0x77, 0x87, 0x03, 0x00, 0x78, 0x87, + 0x03, 0x00, 0x7c, 0x87, 0x03, 0x00, 0x7e, 0x87, 0x03, 0x00, 0x7f, 0x87, + 0x03, 0x00, 0xf2, 0x87, 0x03, 0x00, 0xf4, 0x87, 0x03, 0x00, 0xf5, 0x87, + 0x03, 0x00, 0xf6, 0x87, 0x03, 0x00, 0xf7, 0x87, 0x03, 0x00, 0xf8, 0x87, + 0x03, 0x00, 0xfa, 0x87, 0x03, 0x00, 0xfc, 0x87, 0x03, 0x00, 0xfe, 0x87, + 0x03, 0x00, 0xff, 0x87, 0x03, 0x00, 0x72, 0x8a, 0x03, 0x00, 0x74, 0x8a, + 0x03, 0x00, 0x75, 0x8a, 0x03, 0x00, 0x76, 0x8a, 0x03, 0x00, 0x77, 0x8a, + 0x03, 0x00, 0x78, 0x8a, 0x03, 0x00, 0x7a, 0x8a, 0x03, 0x00, 0x7c, 0x8a, + 0x03, 0x00, 0x7e, 0x8a, 0x03, 0x00, 0x7f, 0x8a, 0x03, 0x00, 0x90, 0x8b, + 0x03, 0x00, 0x98, 0x8b, 0x03, 0x00, 0x9a, 0x8b, 0x03, 0x00, 0x9c, 0x8b, + 0x03, 0x00, 0x9e, 0x8b, 0x03, 0x00, 0x9f, 0x8b, 0x03, 0x00, 0xc8, 0x93, + 0x03, 0x00, 0xfe, 0x93, 0x03, 0x00, 0xff, 0x93, 0x03, 0x00, 0xbe, 0x9a, + 0x03, 0x00, 0xbf, 0x9a, 0x03, 0x00, 0xc5, 0x9b, 0x03, 0x00, 0xcf, 0x9b, + 0x03, 0x00, 0xf8, 0x9b, 0x03, 0x00, 0x78, 0xa4, 0x03, 0x00, 0x7c, 0xa4, + 0x03, 0x00, 0x7e, 0xa4, 0x03, 0x00, 0x7f, 0xa4, 0x03, 0x00, 0x78, 0xa6, + 0x03, 0x00, 0x7c, 0xa6, 0x03, 0x00, 0x7e, 0xa6, 0x03, 0x00, 0x7f, 0xa6, + 0x03, 0x00, 0xc8, 0xa7, 0x03, 0x00, 0xcb, 0xa7, 0x03, 0x00, 0xe8, 0xa7, + 0x03, 0x00, 0xeb, 0xa7, 0x03, 0x00, 0x78, 0xaa, 0x03, 0x00, 0xbe, 0xb2, + 0x03, 0x00, 0xbf, 0xb2, 0x03, 0x00, 0x88, 0xb3, 0x03, 0x00, 0x8b, 0xb3, + 0x03, 0x00, 0xd1, 0xb3, 0x03, 0x00, 0xd6, 0xb3, 0x03, 0x00, 0xd7, 0xb3, + 0x03, 0x00, 0xd9, 0xb3, 0x03, 0x00, 0xdd, 0xb3, 0x03, 0x00, 0xe8, 0xb3, + 0x03, 0x00, 0xe9, 0xb3, 0x03, 0x00, 0xeb, 0xb3, 0x03, 0x00, 0xf0, 0xb3, + 0x03, 0x00, 0xf1, 0xb3, 0x03, 0x00, 0xf9, 0xb3, 0x03, 0x00, 0xfd, 0xb3, + 0x03, 0x00, 0x76, 0xba, 0x03, 0x00, 0x77, 0xba, 0x03, 0x00, 0x78, 0xba, + 0x03, 0x00, 0x7c, 0xba, 0x03, 0x00, 0x7e, 0xba, 0x03, 0x00, 0x7f, 0xba, + 0x03, 0x00, 0x90, 0xbb, 0x03, 0x00, 0x98, 0xbb, 0x03, 0x00, 0x9c, 0xbb, + 0x03, 0x00, 0x9e, 0xbb, 0x03, 0x00, 0x9f, 0xbb, 0x03, 0x00, 0xbe, 0xbc, + 0x03, 0x00, 0xbf, 0xbc, 0x03, 0x00, 0xbe, 0xbe, 0x03, 0x00, 0xbf, 0xbe, + 0x03, 0x00, 0x88, 0xbf, 0x03, 0x00, 0x8b, 0xbf, 0x03, 0x00, 0x91, 0xbf, + 0x03, 0x00, 0x96, 0xbf, 0x03, 0x00, 0x97, 0xbf, 0x03, 0x00, 0x99, 0xbf, + 0x03, 0x00, 0x9d, 0xbf, 0x03, 0x00, 0xd1, 0xbf, 0x03, 0x00, 0xd6, 0xbf, + 0x03, 0x00, 0xd7, 0xbf, 0x03, 0x00, 0xd9, 0xbf, 0x03, 0x00, 0xdd, 0xbf, + 0x03, 0x00, 0xb0, 0xc6, 0x03, 0x00, 0xb6, 0xc6, 0x03, 0x00, 0xbe, 0xc6, + 0x03, 0x00, 0xb1, 0xca, 0x03, 0x00, 0xb8, 0xca, 0x03, 0x00, 0xe6, 0xcb, + 0x03, 0x00, 0xe8, 0xcb, 0x03, 0x00, 0xf0, 0xcb, 0x03, 0x00, 0xf6, 0xcb, + 0x03, 0x00, 0xfe, 0xcb, 0x03, 0x00, 0xc8, 0xd3, 0x03, 0x00, 0xf3, 0xd3, + 0x03, 0x00, 0xfb, 0xd3, 0x03, 0x00, 0xbe, 0xda, 0x03, 0x00, 0xbf, 0xda, + 0x03, 0x00, 0xc4, 0xdb, 0x03, 0x00, 0xc5, 0xdb, 0x03, 0x00, 0xce, 0xdb, + 0x03, 0x00, 0xcf, 0xdb, 0x03, 0x00, 0xf4, 0xdb, 0x03, 0x00, 0xf5, 0xdb, + 0x03, 0x00, 0xf8, 0xdb, 0x03, 0x00, 0xfc, 0xdb, 0x03, 0x00, 0xfe, 0xdb, + 0x03, 0x00, 0xff, 0xdb, 0x03, 0x00, 0xb1, 0xe6, 0x03, 0x00, 0xb8, 0xe6, + 0x03, 0x00, 0x8e, 0xe7, 0x03, 0x00, 0xb0, 0xea, 0x03, 0x00, 0xb6, 0xea, + 0x03, 0x00, 0xbe, 0xea, 0x03, 0x00, 0xf0, 0xeb, 0x03, 0x00, 0xf6, 0xeb, + 0x03, 0x00, 0xfe, 0xeb, 0x03, 0x00, 0xb4, 0xf2, 0x03, 0x00, 0xbe, 0xf2, + 0x03, 0x00, 0xbf, 0xf2, 0x03, 0x00, 0xd6, 0xf3, 0x03, 0x00, 0xde, 0xf3, + 0x03, 0x00, 0xe6, 0xf3, 0x03, 0x00, 0xe8, 0xf3, 0x03, 0x00, 0xf0, 0xf3, + 0x03, 0x00, 0xf6, 0xf3, 0x03, 0x00, 0xfe, 0xf3, 0x03, 0x00, 0x1f, 0xf9, + 0x03, 0x00, 0xb1, 0xfa, 0x03, 0x00, 0xb8, 0xfa, 0x03, 0x00, 0xe6, 0xfb, + 0x03, 0x00, 0xe8, 0xfb, 0x03, 0x00, 0xf0, 0xfb, 0x03, 0x00, 0xf6, 0xfb, + 0x03, 0x00, 0xfe, 0xfb, 0x03, 0x00, 0x78, 0xfc, 0x03, 0x00, 0x1f, 0xfd, + 0x03, 0x00, 0x78, 0xfd, 0x03, 0x00, 0x73, 0xfe, 0x03, 0x00, 0x7b, 0xfe, + 0x03, 0x00, 0x18, 0xff, 0x03, 0x00, 0x1c, 0xff, 0x03, 0x00, 0x1e, 0xff, + 0x03, 0x00, 0x1f, 0xff, 0x03, 0x00, 0x96, 0xff, 0x03, 0x00, 0x98, 0xff, + 0x03, 0x00, 0x9a, 0xff, 0x03, 0x00, 0x9c, 0xff, 0x03, 0x00, 0x9e, 0xff, + 0x03, 0x00, 0x9f, 0xff, 0x03, 0x00, 0xd6, 0xff, 0x03, 0x00, 0xd8, 0xff, + 0x03, 0x00, 0xda, 0xff, 0x03, 0x00, 0xdc, 0xff, 0x03, 0x00, 0xde, 0xff, + 0x03, 0x00, 0xdf, 0xff, 0x03, 0x00, 0x78, 0x00, 0x04, 0x00, 0x7c, 0x00, + 0x04, 0x00, 0x7e, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x04, 0x00, 0xb8, 0x00, + 0x04, 0x00, 0xbc, 0x00, 0x04, 0x00, 0xbe, 0x00, 0x04, 0x00, 0xbf, 0x00, + 0x04, 0x00, 0xb8, 0x04, 0x04, 0x00, 0xbc, 0x04, 0x04, 0x00, 0xbe, 0x04, + 0x04, 0x00, 0xbf, 0x04, 0x04, 0x00, 0xb8, 0x06, 0x04, 0x00, 0xbc, 0x06, + 0x04, 0x00, 0xbe, 0x06, 0x04, 0x00, 0xbf, 0x06, 0x04, 0x00, 0xdf, 0x0b, + 0x04, 0x00, 0xeb, 0x0b, 0x04, 0x00, 0xff, 0x0d, 0x04, 0x00, 0xcb, 0x0f, + 0x04, 0x00, 0xeb, 0x0f, 0x04, 0x00, 0xb8, 0x10, 0x04, 0x00, 0xb8, 0x14, + 0x04, 0x00, 0xbc, 0x14, 0x04, 0x00, 0xbe, 0x14, 0x04, 0x00, 0xbf, 0x14, + 0x04, 0x00, 0xbf, 0x16, 0x04, 0x00, 0x1f, 0x17, 0x04, 0x00, 0xcb, 0x17, + 0x04, 0x00, 0xeb, 0x17, 0x04, 0x00, 0x78, 0x18, 0x04, 0x00, 0x7c, 0x18, + 0x04, 0x00, 0x7e, 0x18, 0x04, 0x00, 0x7f, 0x18, 0x04, 0x00, 0xbe, 0x18, + 0x04, 0x00, 0xbf, 0x18, 0x04, 0x00, 0xb8, 0x1a, 0x04, 0x00, 0xbc, 0x1a, + 0x04, 0x00, 0xbe, 0x1a, 0x04, 0x00, 0xbf, 0x1a, 0x04, 0x00, 0xeb, 0x1b, + 0x04, 0x00, 0x8b, 0x27, 0x04, 0x00, 0xf8, 0x29, 0x04, 0x00, 0xfc, 0x29, + 0x04, 0x00, 0xfe, 0x29, 0x04, 0x00, 0xff, 0x29, 0x04, 0x00, 0xf8, 0x2d, + 0x04, 0x00, 0xfc, 0x2d, 0x04, 0x00, 0xfe, 0x2d, 0x04, 0x00, 0xff, 0x2d, + 0x04, 0x00, 0xcb, 0x2f, 0x04, 0x00, 0xeb, 0x2f, 0x04, 0x00, 0xf8, 0x2f, + 0x04, 0x00, 0xfc, 0x2f, 0x04, 0x00, 0xfe, 0x2f, 0x04, 0x00, 0xff, 0x2f, + 0x04, 0x00, 0xf7, 0x31, 0x04, 0x00, 0x78, 0x32, 0x04, 0x00, 0x7c, 0x32, + 0x04, 0x00, 0x7e, 0x32, 0x04, 0x00, 0x7f, 0x32, 0x04, 0x00, 0x8b, 0x33, + 0x04, 0x00, 0x90, 0x33, 0x04, 0x00, 0x91, 0x33, 0x04, 0x00, 0x96, 0x33, + 0x04, 0x00, 0x97, 0x33, 0x04, 0x00, 0x9f, 0x33, 0x04, 0x00, 0x6b, 0x35, + 0x04, 0x00, 0x87, 0x37, 0x04, 0x00, 0xff, 0x39, 0x04, 0x00, 0x87, 0x3b, + 0x04, 0x00, 0x7f, 0x3c, 0x04, 0x00, 0xf7, 0x3d, 0x04, 0x00, 0xf8, 0x3f, + 0x04, 0x00, 0xfc, 0x3f, 0x04, 0x00, 0xfe, 0x3f, 0x04, 0x00, 0xff, 0x3f, + 0x04, 0x00, 0x70, 0x44, 0x04, 0x00, 0x71, 0x44, 0x04, 0x00, 0x79, 0x44, + 0x04, 0x00, 0x7d, 0x44, 0x04, 0x00, 0xf7, 0x45, 0x04, 0x00, 0xf8, 0x45, + 0x04, 0x00, 0xfc, 0x45, 0x04, 0x00, 0xfe, 0x45, 0x04, 0x00, 0xff, 0x45, + 0x04, 0x00, 0x77, 0x46, 0x04, 0x00, 0x78, 0x46, 0x04, 0x00, 0x7c, 0x46, + 0x04, 0x00, 0x7e, 0x46, 0x04, 0x00, 0x7f, 0x46, 0x04, 0x00, 0x87, 0x47, + 0x04, 0x00, 0x9f, 0x47, 0x04, 0x00, 0xdf, 0x47, 0x04, 0x00, 0x70, 0x4a, + 0x04, 0x00, 0x71, 0x4a, 0x04, 0x00, 0x77, 0x4a, 0x04, 0x00, 0x79, 0x4a, + 0x04, 0x00, 0x7d, 0x4a, 0x04, 0x00, 0x87, 0x4b, 0x04, 0x00, 0x8b, 0x4b, + 0x04, 0x00, 0x91, 0x4b, 0x04, 0x00, 0x96, 0x4b, 0x04, 0x00, 0x97, 0x4b, + 0x04, 0x00, 0x9f, 0x4b, 0x04, 0x00, 0xb8, 0x52, 0x04, 0x00, 0xbc, 0x52, + 0x04, 0x00, 0xbe, 0x52, 0x04, 0x00, 0xbf, 0x52, 0x04, 0x00, 0xdf, 0x53, + 0x04, 0x00, 0xe7, 0x53, 0x04, 0x00, 0xeb, 0x53, 0x04, 0x00, 0xf7, 0x53, + 0x04, 0x00, 0xf8, 0x53, 0x04, 0x00, 0xfc, 0x53, 0x04, 0x00, 0xfe, 0x53, + 0x04, 0x00, 0xff, 0x53, 0x04, 0x00, 0xb7, 0x58, 0x04, 0x00, 0xb8, 0x58, + 0x04, 0x00, 0xbc, 0x58, 0x04, 0x00, 0xbe, 0x58, 0x04, 0x00, 0xbf, 0x58, + 0x04, 0x00, 0xb0, 0x5a, 0x04, 0x00, 0xb1, 0x5a, 0x04, 0x00, 0xb9, 0x5a, + 0x04, 0x00, 0xbd, 0x5a, 0x04, 0x00, 0xe7, 0x5b, 0x04, 0x00, 0xeb, 0x5b, + 0x04, 0x00, 0xf7, 0x5b, 0x04, 0x00, 0xf8, 0x5b, 0x04, 0x00, 0xfc, 0x5b, + 0x04, 0x00, 0xfe, 0x5b, 0x04, 0x00, 0xff, 0x5b, 0x04, 0x00, 0xb8, 0x5c, + 0x04, 0x00, 0xbc, 0x5c, 0x04, 0x00, 0xbe, 0x5c, 0x04, 0x00, 0xbf, 0x5c, + 0x04, 0x00, 0xb8, 0x5e, 0x04, 0x00, 0xbc, 0x5e, 0x04, 0x00, 0xbe, 0x5e, + 0x04, 0x00, 0xbf, 0x5e, 0x04, 0x00, 0x90, 0x5f, 0x04, 0x00, 0x91, 0x5f, + 0x04, 0x00, 0x96, 0x5f, 0x04, 0x00, 0x97, 0x5f, 0x04, 0x00, 0xd0, 0x5f, + 0x04, 0x00, 0xd1, 0x5f, 0x04, 0x00, 0xd6, 0x5f, 0x04, 0x00, 0xd7, 0x5f, + 0x04, 0x00, 0x73, 0x64, 0x04, 0x00, 0x7b, 0x64, 0x04, 0x00, 0xff, 0x65, + 0x04, 0x00, 0x73, 0x66, 0x04, 0x00, 0x7b, 0x66, 0x04, 0x00, 0x83, 0x67, + 0x04, 0x00, 0x8e, 0x67, 0x04, 0x00, 0x8f, 0x67, 0x04, 0x00, 0x9b, 0x67, + 0x04, 0x00, 0xdb, 0x67, 0x04, 0x00, 0x78, 0x6a, 0x04, 0x00, 0x7c, 0x6a, + 0x04, 0x00, 0x7e, 0x6a, 0x04, 0x00, 0x7f, 0x6a, 0x04, 0x00, 0x84, 0x6b, + 0x04, 0x00, 0xd5, 0x73, 0x04, 0x00, 0xee, 0x73, 0x04, 0x00, 0xef, 0x73, + 0x04, 0x00, 0xf8, 0x73, 0x04, 0x00, 0xfc, 0x73, 0x04, 0x00, 0xfe, 0x73, + 0x04, 0x00, 0xff, 0x73, 0x04, 0x00, 0x73, 0x7a, 0x04, 0x00, 0x7b, 0x7a, + 0x04, 0x00, 0x84, 0x7b, 0x04, 0x00, 0x8e, 0x7b, 0x04, 0x00, 0x8f, 0x7b, + 0x04, 0x00, 0x95, 0x7b, 0x04, 0x00, 0x9b, 0x7f, 0x04, 0x00, 0xdb, 0x7f, + 0x04, 0x00, 0x71, 0x80, 0x04, 0x00, 0x73, 0x80, 0x04, 0x00, 0x79, 0x80, + 0x04, 0x00, 0x7b, 0x80, 0x04, 0x00, 0x7d, 0x80, 0x04, 0x00, 0xb1, 0x80, + 0x04, 0x00, 0xb8, 0x80, 0x04, 0x00, 0x72, 0x81, 0x04, 0x00, 0x77, 0x81, + 0x04, 0x00, 0x78, 0x81, 0x04, 0x00, 0x7a, 0x81, 0x04, 0x00, 0x7c, 0x81, + 0x04, 0x00, 0x7e, 0x81, 0x04, 0x00, 0x7f, 0x81, 0x04, 0x00, 0xf1, 0x81, + 0x04, 0x00, 0xf3, 0x81, 0x04, 0x00, 0xf9, 0x81, 0x04, 0x00, 0xfb, 0x81, + 0x04, 0x00, 0xfd, 0x81, 0x04, 0x00, 0xcd, 0x83, 0x04, 0x00, 0xf2, 0x83, + 0x04, 0x00, 0xf7, 0x83, 0x04, 0x00, 0xf8, 0x83, 0x04, 0x00, 0xfa, 0x83, + 0x04, 0x00, 0xfc, 0x83, 0x04, 0x00, 0xfe, 0x83, 0x04, 0x00, 0xff, 0x83, + 0x04, 0x00, 0x71, 0x84, 0x04, 0x00, 0x73, 0x84, 0x04, 0x00, 0x79, 0x84, + 0x04, 0x00, 0x7b, 0x84, 0x04, 0x00, 0x7d, 0x84, 0x04, 0x00, 0xb1, 0x84, + 0x04, 0x00, 0xb8, 0x84, 0x04, 0x00, 0xcd, 0x85, 0x04, 0x00, 0xf2, 0x85, + 0x04, 0x00, 0xf7, 0x85, 0x04, 0x00, 0xf8, 0x85, 0x04, 0x00, 0xfa, 0x85, + 0x04, 0x00, 0xfc, 0x85, 0x04, 0x00, 0xfe, 0x85, 0x04, 0x00, 0xff, 0x85, + 0x04, 0x00, 0x71, 0x86, 0x04, 0x00, 0x73, 0x86, 0x04, 0x00, 0x79, 0x86, + 0x04, 0x00, 0x7b, 0x86, 0x04, 0x00, 0x7d, 0x86, 0x04, 0x00, 0xb1, 0x86, + 0x04, 0x00, 0xb8, 0x86, 0x04, 0x00, 0x70, 0x87, 0x04, 0x00, 0x71, 0x87, + 0x04, 0x00, 0x79, 0x87, 0x04, 0x00, 0x7d, 0x87, 0x04, 0x00, 0xf1, 0x87, + 0x04, 0x00, 0xf3, 0x87, 0x04, 0x00, 0xf9, 0x87, 0x04, 0x00, 0xfb, 0x87, + 0x04, 0x00, 0xfd, 0x87, 0x04, 0x00, 0x7f, 0x88, 0x04, 0x00, 0xb0, 0x88, + 0x04, 0x00, 0xbe, 0x88, 0x04, 0x00, 0x03, 0x89, 0x04, 0x00, 0x72, 0x8a, + 0x04, 0x00, 0x78, 0x8a, 0x04, 0x00, 0x7a, 0x8a, 0x04, 0x00, 0x7c, 0x8a, + 0x04, 0x00, 0x7e, 0x8a, 0x04, 0x00, 0x7f, 0x8a, 0x04, 0x00, 0xb3, 0x8a, + 0x04, 0x00, 0xbb, 0x8a, 0x04, 0x00, 0xbf, 0x8a, 0x04, 0x00, 0x11, 0x8b, + 0x04, 0x00, 0x16, 0x8b, 0x04, 0x00, 0x17, 0x8b, 0x04, 0x00, 0x1f, 0x8b, + 0x04, 0x00, 0x78, 0x8b, 0x04, 0x00, 0x7c, 0x8b, 0x04, 0x00, 0x7e, 0x8b, + 0x04, 0x00, 0x7f, 0x8b, 0x04, 0x00, 0x90, 0x8b, 0x04, 0x00, 0x03, 0x8d, + 0x04, 0x00, 0xd6, 0x8f, 0x04, 0x00, 0xdf, 0x8f, 0x04, 0x00, 0xe7, 0x8f, + 0x04, 0x00, 0xf1, 0x8f, 0x04, 0x00, 0xf3, 0x8f, 0x04, 0x00, 0xf7, 0x8f, + 0x04, 0x00, 0xf9, 0x8f, 0x04, 0x00, 0xfb, 0x8f, 0x04, 0x00, 0xfd, 0x8f, + 0x04, 0x00, 0xce, 0x93, 0x04, 0x00, 0xcf, 0x93, 0x04, 0x00, 0xf8, 0x93, + 0x04, 0x00, 0xf3, 0x95, 0x04, 0x00, 0xfb, 0x95, 0x04, 0x00, 0xff, 0x95, + 0x04, 0x00, 0x84, 0x97, 0x04, 0x00, 0x8e, 0x97, 0x04, 0x00, 0x8f, 0x97, + 0x04, 0x00, 0xb4, 0x9a, 0x04, 0x00, 0xbe, 0x9a, 0x04, 0x00, 0xbf, 0x9a, + 0x04, 0x00, 0xc4, 0x9b, 0x04, 0x00, 0xf4, 0x9b, 0x04, 0x00, 0xfe, 0x9b, + 0x04, 0x00, 0xff, 0x9b, 0x04, 0x00, 0xf3, 0x9f, 0x04, 0x00, 0xfb, 0x9f, + 0x04, 0x00, 0x0b, 0xa7, 0x04, 0x00, 0x9f, 0xa7, 0x04, 0x00, 0xb8, 0xaa, + 0x04, 0x00, 0xce, 0xab, 0x04, 0x00, 0xcf, 0xab, 0x04, 0x00, 0xf8, 0xab, + 0x04, 0x00, 0x78, 0xb2, 0x04, 0x00, 0x7c, 0xb2, 0x04, 0x00, 0x7e, 0xb2, + 0x04, 0x00, 0x7f, 0xb2, 0x04, 0x00, 0xb3, 0xb2, 0x04, 0x00, 0xbb, 0xb2, + 0x04, 0x00, 0xbf, 0xb2, 0x04, 0x00, 0x1f, 0xb3, 0x04, 0x00, 0x78, 0xb3, + 0x04, 0x00, 0x7c, 0xb3, 0x04, 0x00, 0x7e, 0xb3, 0x04, 0x00, 0x7f, 0xb3, + 0x04, 0x00, 0x96, 0xb3, 0x04, 0x00, 0x9f, 0xb3, 0x04, 0x00, 0x1f, 0xb9, + 0x04, 0x00, 0x6b, 0xb9, 0x04, 0x00, 0x78, 0xb9, 0x04, 0x00, 0x7c, 0xb9, + 0x04, 0x00, 0x7e, 0xb9, 0x04, 0x00, 0x7f, 0xb9, 0x04, 0x00, 0xc3, 0xb9, + 0x04, 0x00, 0xf3, 0xb9, 0x04, 0x00, 0xf7, 0xb9, 0x04, 0x00, 0xfb, 0xb9, + 0x04, 0x00, 0x07, 0xbb, 0x04, 0x00, 0x0b, 0xbb, 0x04, 0x00, 0xd0, 0xbb, + 0x04, 0x00, 0xe1, 0xbb, 0x04, 0x00, 0xe2, 0xbb, 0x04, 0x00, 0xed, 0xbb, + 0x04, 0x00, 0xee, 0xbb, 0x04, 0x00, 0xef, 0xbb, 0x04, 0x00, 0xf2, 0xbb, + 0x04, 0x00, 0xf8, 0xbb, 0x04, 0x00, 0xfa, 0xbb, 0x04, 0x00, 0xfc, 0xbb, + 0x04, 0x00, 0xfe, 0xbb, 0x04, 0x00, 0xff, 0xbb, 0x04, 0x00, 0x7f, 0xbc, + 0x04, 0x00, 0xbe, 0xbc, 0x04, 0x00, 0xbf, 0xbc, 0x04, 0x00, 0x1f, 0xbd, + 0x04, 0x00, 0x6b, 0xbd, 0x04, 0x00, 0x78, 0xbd, 0x04, 0x00, 0x7c, 0xbd, + 0x04, 0x00, 0x7e, 0xbd, 0x04, 0x00, 0x7f, 0xbd, 0x04, 0x00, 0xc3, 0xbd, + 0x04, 0x00, 0xf3, 0xbd, 0x04, 0x00, 0xf7, 0xbd, 0x04, 0x00, 0xfb, 0xbd, + 0x04, 0x00, 0x78, 0xbe, 0x04, 0x00, 0x7c, 0xbe, 0x04, 0x00, 0x7e, 0xbe, + 0x04, 0x00, 0x7f, 0xbe, 0x04, 0x00, 0xb3, 0xbe, 0x04, 0x00, 0xbb, 0xbe, + 0x04, 0x00, 0xbf, 0xbe, 0x04, 0x00, 0x1f, 0xbf, 0x04, 0x00, 0x78, 0xbf, + 0x04, 0x00, 0x7c, 0xbf, 0x04, 0x00, 0x7e, 0xbf, 0x04, 0x00, 0x7f, 0xbf, + 0x04, 0x00, 0x96, 0xbf, 0x04, 0x00, 0x9f, 0xbf, 0x04, 0x00, 0xc6, 0xc3, + 0x04, 0x00, 0xc7, 0xc3, 0x04, 0x00, 0xf6, 0xc3, 0x04, 0x00, 0xf7, 0xc3, + 0x04, 0x00, 0xf8, 0xc3, 0x04, 0x00, 0xfc, 0xc3, 0x04, 0x00, 0xfe, 0xc3, + 0x04, 0x00, 0xff, 0xc3, 0x04, 0x00, 0xc6, 0xc5, 0x04, 0x00, 0xc7, 0xc5, + 0x04, 0x00, 0xf6, 0xc5, 0x04, 0x00, 0xf7, 0xc5, 0x04, 0x00, 0xf8, 0xc5, + 0x04, 0x00, 0xfc, 0xc5, 0x04, 0x00, 0xfe, 0xc5, 0x04, 0x00, 0xff, 0xc5, + 0x04, 0x00, 0x0b, 0xc9, 0x04, 0x00, 0xb1, 0xca, 0x04, 0x00, 0xb8, 0xca, + 0x04, 0x00, 0xe6, 0xcb, 0x04, 0x00, 0xe7, 0xcb, 0x04, 0x00, 0xe8, 0xcb, + 0x04, 0x00, 0xe9, 0xcb, 0x04, 0x00, 0xeb, 0xcb, 0x04, 0x00, 0xf0, 0xcb, + 0x04, 0x00, 0xf6, 0xcb, 0x04, 0x00, 0xf7, 0xcb, 0x04, 0x00, 0xfd, 0xcb, + 0x04, 0x00, 0xfe, 0xcb, 0x04, 0x00, 0xff, 0xcb, 0x04, 0x00, 0x0b, 0xcd, + 0x04, 0x00, 0xf0, 0xcf, 0x04, 0x00, 0xf1, 0xcf, 0x04, 0x00, 0xf9, 0xcf, + 0x04, 0x00, 0xfd, 0xcf, 0x04, 0x00, 0xc8, 0xd3, 0x04, 0x00, 0xcb, 0xd3, + 0x04, 0x00, 0xf8, 0xd5, 0x04, 0x00, 0xfc, 0xd5, 0x04, 0x00, 0xfe, 0xd5, + 0x04, 0x00, 0xff, 0xd5, 0x04, 0x00, 0xf8, 0xdb, 0x04, 0x00, 0xfc, 0xdb, + 0x04, 0x00, 0xfe, 0xdb, 0x04, 0x00, 0xff, 0xdb, 0x04, 0x00, 0xc8, 0xdf, + 0x04, 0x00, 0xcb, 0xdf, 0x04, 0x00, 0xbe, 0xe2, 0x04, 0x00, 0xbf, 0xe2, + 0x04, 0x00, 0xf1, 0xe3, 0x04, 0x00, 0xf8, 0xe3, 0x04, 0x00, 0xf0, 0xe5, + 0x04, 0x00, 0xf7, 0xe5, 0x04, 0x00, 0xfd, 0xe5, 0x04, 0x00, 0xfe, 0xe5, + 0x04, 0x00, 0xff, 0xe5, 0x04, 0x00, 0xb0, 0xea, 0x04, 0x00, 0xb6, 0xea, + 0x04, 0x00, 0xb7, 0xea, 0x04, 0x00, 0xbd, 0xea, 0x04, 0x00, 0xbe, 0xea, + 0x04, 0x00, 0xbf, 0xea, 0x04, 0x00, 0xc6, 0xeb, 0x04, 0x00, 0xc7, 0xeb, + 0x04, 0x00, 0xc8, 0xeb, 0x04, 0x00, 0xc9, 0xeb, 0x04, 0x00, 0xcb, 0xeb, + 0x04, 0x00, 0xf0, 0xeb, 0x04, 0x00, 0xf6, 0xeb, 0x04, 0x00, 0xf7, 0xeb, + 0x04, 0x00, 0xfd, 0xeb, 0x04, 0x00, 0xfe, 0xeb, 0x04, 0x00, 0xff, 0xeb, + 0x04, 0x00, 0xf0, 0xef, 0x04, 0x00, 0xf1, 0xef, 0x04, 0x00, 0xf9, 0xef, + 0x04, 0x00, 0xfd, 0xef, 0x04, 0x00, 0xbe, 0xf2, 0x04, 0x00, 0xbf, 0xf2, + 0x04, 0x00, 0xd1, 0xf3, 0x04, 0x00, 0xd6, 0xf3, 0x04, 0x00, 0xd7, 0xf3, + 0x04, 0x00, 0xdd, 0xf3, 0x04, 0x00, 0xde, 0xf3, 0x04, 0x00, 0xdf, 0xf3, + 0x04, 0x00, 0xe6, 0xf3, 0x04, 0x00, 0xe7, 0xf3, 0x04, 0x00, 0xe8, 0xf3, + 0x04, 0x00, 0xe9, 0xf3, 0x04, 0x00, 0xeb, 0xf3, 0x04, 0x00, 0xf0, 0xf3, + 0x04, 0x00, 0xf6, 0xf3, 0x04, 0x00, 0xf7, 0xf3, 0x04, 0x00, 0xfd, 0xf3, + 0x04, 0x00, 0xfe, 0xf3, 0x04, 0x00, 0xff, 0xf3, 0x04, 0x00, 0x0b, 0xf5, + 0x04, 0x00, 0xf1, 0xf5, 0x04, 0x00, 0xf8, 0xf5, 0x04, 0x00, 0x86, 0xf7, + 0x04, 0x00, 0x87, 0xf7, 0x04, 0x00, 0x88, 0xf7, 0x04, 0x00, 0x89, 0xf7, + 0x04, 0x00, 0x8b, 0xf7, 0x04, 0x00, 0xb1, 0xfa, 0x04, 0x00, 0xb8, 0xfa, + 0x04, 0x00, 0xe6, 0xfb, 0x04, 0x00, 0xe7, 0xfb, 0x04, 0x00, 0xe8, 0xfb, + 0x04, 0x00, 0xe9, 0xfb, 0x04, 0x00, 0xeb, 0xfb, 0x04, 0x00, 0xf0, 0xfb, + 0x04, 0x00, 0xf6, 0xfb, 0x04, 0x00, 0xf7, 0xfb, 0x04, 0x00, 0xfd, 0xfb, + 0x04, 0x00, 0xfe, 0xfb, 0x04, 0x00, 0xff, 0xfb, 0x04, 0x00, 0x88, 0xff, + 0x04, 0x00, 0x8b, 0xff, 0x04, 0x00, 0xc6, 0xff, 0x04, 0x00, 0xc7, 0xff, + 0x04, 0x00, 0xc8, 0xff, 0x04, 0x00, 0xc9, 0xff, 0x04, 0x00, 0xcb, 0xff, + 0x04, 0x00, 0xe6, 0xff, 0x04, 0x00, 0xe7, 0xff, 0x04, 0x00, 0xe8, 0xff, + 0x04, 0x00, 0xe9, 0xff, 0x04, 0x00, 0xeb, 0xff, 0x04, 0x00, 0xf6, 0xff, + 0x04, 0x00, 0xf7, 0xff, 0x04, 0x00, 0xf8, 0xff, 0x04, 0x00, 0xfc, 0xff, + 0x04, 0x00, 0xfe, 0xff, 0x04, 0x00, 0xff, 0xff, 0x04, 0x00, 0x73, 0x00, + 0x05, 0x00, 0x7b, 0x00, 0x05, 0x00, 0xbe, 0x00, 0x05, 0x00, 0xbf, 0x00, + 0x05, 0x00, 0x0e, 0x01, 0x05, 0x00, 0x0f, 0x01, 0x05, 0x00, 0xe8, 0x03, + 0x05, 0x00, 0xf3, 0x03, 0x05, 0x00, 0xfb, 0x03, 0x05, 0x00, 0xbe, 0x04, + 0x05, 0x00, 0xbf, 0x04, 0x05, 0x00, 0xf4, 0x05, 0x05, 0x00, 0xf5, 0x05, + 0x05, 0x00, 0xf8, 0x05, 0x05, 0x00, 0xfc, 0x05, 0x05, 0x00, 0xfe, 0x05, + 0x05, 0x00, 0xff, 0x05, 0x05, 0x00, 0xb8, 0x06, 0x05, 0x00, 0xc8, 0x07, + 0x05, 0x00, 0xe8, 0x07, 0x05, 0x00, 0xf3, 0x07, 0x05, 0x00, 0xfb, 0x07, + 0x05, 0x00, 0x78, 0x08, 0x05, 0x00, 0x7c, 0x08, 0x05, 0x00, 0x7e, 0x08, + 0x05, 0x00, 0x7f, 0x08, 0x05, 0x00, 0xbe, 0x08, 0x05, 0x00, 0xbf, 0x08, + 0x05, 0x00, 0xf3, 0x09, 0x05, 0x00, 0xfb, 0x09, 0x05, 0x00, 0xb4, 0x0a, + 0x05, 0x00, 0xbe, 0x0a, 0x05, 0x00, 0xbf, 0x0a, 0x05, 0x00, 0x78, 0x0b, + 0x05, 0x00, 0x7c, 0x0b, 0x05, 0x00, 0x7e, 0x0b, 0x05, 0x00, 0x7f, 0x0b, + 0x05, 0x00, 0xf3, 0x0d, 0x05, 0x00, 0xfb, 0x0d, 0x05, 0x00, 0x7e, 0x10, + 0x05, 0x00, 0x7f, 0x10, 0x05, 0x00, 0xbe, 0x10, 0x05, 0x00, 0xbf, 0x10, + 0x05, 0x00, 0x0e, 0x11, 0x05, 0x00, 0x0f, 0x11, 0x05, 0x00, 0xde, 0x13, + 0x05, 0x00, 0xdf, 0x13, 0x05, 0x00, 0xe8, 0x13, 0x05, 0x00, 0xfe, 0x13, + 0x05, 0x00, 0xff, 0x13, 0x05, 0x00, 0xbe, 0x14, 0x05, 0x00, 0xbf, 0x14, + 0x05, 0x00, 0xf4, 0x15, 0x05, 0x00, 0xfe, 0x15, 0x05, 0x00, 0xff, 0x15, + 0x05, 0x00, 0xb4, 0x16, 0x05, 0x00, 0xbe, 0x16, 0x05, 0x00, 0xbf, 0x16, + 0x05, 0x00, 0x08, 0x17, 0x05, 0x00, 0x15, 0x17, 0x05, 0x00, 0xc4, 0x17, + 0x05, 0x00, 0xc8, 0x17, 0x05, 0x00, 0xe4, 0x17, 0x05, 0x00, 0xe8, 0x17, + 0x05, 0x00, 0xf4, 0x17, 0x05, 0x00, 0xf5, 0x17, 0x05, 0x00, 0xf8, 0x17, + 0x05, 0x00, 0xfc, 0x17, 0x05, 0x00, 0xfe, 0x17, 0x05, 0x00, 0xff, 0x17, + 0x05, 0x00, 0x7e, 0x18, 0x05, 0x00, 0x7f, 0x18, 0x05, 0x00, 0xbe, 0x18, + 0x05, 0x00, 0xbf, 0x18, 0x05, 0x00, 0xf3, 0x19, 0x05, 0x00, 0xfb, 0x19, + 0x05, 0x00, 0xb8, 0x1a, 0x05, 0x00, 0x78, 0x1b, 0x05, 0x00, 0x9e, 0x1b, + 0x05, 0x00, 0x9f, 0x1b, 0x05, 0x00, 0xf8, 0x1d, 0x05, 0x00, 0x98, 0x1f, + 0x05, 0x00, 0x9c, 0x1f, 0x05, 0x00, 0x9e, 0x1f, 0x05, 0x00, 0x9f, 0x1f, + 0x05, 0x00, 0xd8, 0x1f, 0x05, 0x00, 0xdc, 0x1f, 0x05, 0x00, 0xde, 0x1f, + 0x05, 0x00, 0xdf, 0x1f, 0x05, 0x00, 0xb8, 0x26, 0x05, 0x00, 0xf8, 0x27, + 0x05, 0x00, 0xfc, 0x27, 0x05, 0x00, 0xfe, 0x27, 0x05, 0x00, 0xff, 0x27, + 0x05, 0x00, 0xbe, 0x2a, 0x05, 0x00, 0xbf, 0x2a, 0x05, 0x00, 0xbe, 0x32, + 0x05, 0x00, 0xbf, 0x32, 0x05, 0x00, 0x88, 0x33, 0x05, 0x00, 0x8b, 0x33, + 0x05, 0x00, 0x91, 0x33, 0x05, 0x00, 0x96, 0x33, 0x05, 0x00, 0x97, 0x33, + 0x05, 0x00, 0x99, 0x33, 0x05, 0x00, 0x9d, 0x33, 0x05, 0x00, 0xb1, 0x3a, + 0x05, 0x00, 0xb8, 0x3a, 0x05, 0x00, 0x78, 0x3c, 0x05, 0x00, 0x7c, 0x3c, + 0x05, 0x00, 0x7e, 0x3c, 0x05, 0x00, 0x7f, 0x3c, 0x05, 0x00, 0x78, 0x3e, + 0x05, 0x00, 0x7c, 0x3e, 0x05, 0x00, 0x7e, 0x3e, 0x05, 0x00, 0x7f, 0x3e, + 0x05, 0x00, 0x88, 0x3f, 0x05, 0x00, 0x8b, 0x3f, 0x05, 0x00, 0xc8, 0x3f, + 0x05, 0x00, 0xc9, 0x3f, 0x05, 0x00, 0xcb, 0x3f, 0x05, 0x00, 0xe8, 0x3f, + 0x05, 0x00, 0xe9, 0x3f, 0x05, 0x00, 0xeb, 0x3f, 0x05, 0x00, 0xf0, 0x3f, + 0x05, 0x00, 0xf1, 0x3f, 0x05, 0x00, 0xf9, 0x3f, 0x05, 0x00, 0xfd, 0x3f, + 0x05, 0x00, 0x76, 0x40, 0x05, 0x00, 0x77, 0x40, 0x05, 0x00, 0x78, 0x40, + 0x05, 0x00, 0x7c, 0x40, 0x05, 0x00, 0x7e, 0x40, 0x05, 0x00, 0x7f, 0x40, + 0x05, 0x00, 0xb1, 0x40, 0x05, 0x00, 0xb8, 0x40, 0x05, 0x00, 0x70, 0x41, + 0x05, 0x00, 0x71, 0x41, 0x05, 0x00, 0x79, 0x41, 0x05, 0x00, 0x7d, 0x41, + 0x05, 0x00, 0xb0, 0x44, 0x05, 0x00, 0xb6, 0x44, 0x05, 0x00, 0xb7, 0x44, + 0x05, 0x00, 0xbd, 0x44, 0x05, 0x00, 0xbe, 0x44, 0x05, 0x00, 0xbf, 0x44, + 0x05, 0x00, 0xf6, 0x45, 0x05, 0x00, 0xf7, 0x45, 0x05, 0x00, 0xf8, 0x45, + 0x05, 0x00, 0xfc, 0x45, 0x05, 0x00, 0xfe, 0x45, 0x05, 0x00, 0xff, 0x45, + 0x05, 0x00, 0xb1, 0x46, 0x05, 0x00, 0xb8, 0x46, 0x05, 0x00, 0x70, 0x48, + 0x05, 0x00, 0x77, 0x48, 0x05, 0x00, 0x7d, 0x48, 0x05, 0x00, 0x7e, 0x48, + 0x05, 0x00, 0x7f, 0x48, 0x05, 0x00, 0xb1, 0x48, 0x05, 0x00, 0xb8, 0x48, + 0x05, 0x00, 0x0b, 0x49, 0x05, 0x00, 0xf0, 0x49, 0x05, 0x00, 0xf1, 0x49, + 0x05, 0x00, 0xf9, 0x49, 0x05, 0x00, 0xfd, 0x49, 0x05, 0x00, 0xb0, 0x4a, + 0x05, 0x00, 0xb7, 0x4a, 0x05, 0x00, 0xbd, 0x4a, 0x05, 0x00, 0xbe, 0x4a, + 0x05, 0x00, 0xbf, 0x4a, 0x05, 0x00, 0x86, 0x4b, 0x05, 0x00, 0x87, 0x4b, + 0x05, 0x00, 0x88, 0x4b, 0x05, 0x00, 0x89, 0x4b, 0x05, 0x00, 0x8b, 0x4b, + 0x05, 0x00, 0xd0, 0x4b, 0x05, 0x00, 0xd8, 0x4b, 0x05, 0x00, 0xf1, 0x4b, + 0x05, 0x00, 0xf8, 0x4b, 0x05, 0x00, 0x7e, 0x4c, 0x05, 0x00, 0x7f, 0x4c, + 0x05, 0x00, 0x0b, 0x4d, 0x05, 0x00, 0xf1, 0x4d, 0x05, 0x00, 0xf8, 0x4d, + 0x05, 0x00, 0x78, 0x4e, 0x05, 0x00, 0x7c, 0x4e, 0x05, 0x00, 0x7e, 0x4e, + 0x05, 0x00, 0x7f, 0x4e, 0x05, 0x00, 0x08, 0x4f, 0x05, 0x00, 0x0b, 0x4f, + 0x05, 0x00, 0x78, 0x4f, 0x05, 0x00, 0x7c, 0x4f, 0x05, 0x00, 0x7e, 0x4f, + 0x05, 0x00, 0x7f, 0x4f, 0x05, 0x00, 0xf0, 0x4f, 0x05, 0x00, 0xf1, 0x4f, + 0x05, 0x00, 0xf9, 0x4f, 0x05, 0x00, 0xfd, 0x4f, 0x05, 0x00, 0xf0, 0x51, + 0x05, 0x00, 0xf1, 0x51, 0x05, 0x00, 0xf9, 0x51, 0x05, 0x00, 0xfd, 0x51, + 0x05, 0x00, 0x78, 0x52, 0x05, 0x00, 0x7c, 0x52, 0x05, 0x00, 0x7e, 0x52, + 0x05, 0x00, 0x7f, 0x52, 0x05, 0x00, 0xb0, 0x54, 0x05, 0x00, 0xb6, 0x54, + 0x05, 0x00, 0xb7, 0x54, 0x05, 0x00, 0xbd, 0x54, 0x05, 0x00, 0xbe, 0x54, + 0x05, 0x00, 0xbf, 0x54, 0x05, 0x00, 0x1f, 0x55, 0x05, 0x00, 0x68, 0x55, + 0x05, 0x00, 0x6b, 0x55, 0x05, 0x00, 0xf7, 0x55, 0x05, 0x00, 0xf8, 0x55, + 0x05, 0x00, 0xfc, 0x55, 0x05, 0x00, 0xfe, 0x55, 0x05, 0x00, 0xff, 0x55, + 0x05, 0x00, 0xc6, 0x57, 0x05, 0x00, 0xc7, 0x57, 0x05, 0x00, 0xe6, 0x57, + 0x05, 0x00, 0xe7, 0x57, 0x05, 0x00, 0xf6, 0x57, 0x05, 0x00, 0xf7, 0x57, + 0x05, 0x00, 0xf8, 0x57, 0x05, 0x00, 0xfc, 0x57, 0x05, 0x00, 0xfe, 0x57, + 0x05, 0x00, 0xff, 0x57, 0x05, 0x00, 0xb1, 0x58, 0x05, 0x00, 0xb8, 0x58, + 0x05, 0x00, 0xf6, 0x59, 0x05, 0x00, 0xf7, 0x59, 0x05, 0x00, 0xf8, 0x59, + 0x05, 0x00, 0xfc, 0x59, 0x05, 0x00, 0xfe, 0x59, 0x05, 0x00, 0xff, 0x59, + 0x05, 0x00, 0xbe, 0x5c, 0x05, 0x00, 0xbf, 0x5c, 0x05, 0x00, 0xf6, 0x5d, + 0x05, 0x00, 0xf7, 0x5d, 0x05, 0x00, 0xf8, 0x5d, 0x05, 0x00, 0xfc, 0x5d, + 0x05, 0x00, 0xfe, 0x5d, 0x05, 0x00, 0xff, 0x5d, 0x05, 0x00, 0xb8, 0x5e, + 0x05, 0x00, 0xf0, 0x5f, 0x05, 0x00, 0xf1, 0x5f, 0x05, 0x00, 0xf9, 0x5f, + 0x05, 0x00, 0xfd, 0x5f, 0x05, 0x00, 0x7e, 0x60, 0x05, 0x00, 0x7f, 0x60, + 0x05, 0x00, 0xbe, 0x60, 0x05, 0x00, 0xbf, 0x60, 0x05, 0x00, 0x74, 0x61, + 0x05, 0x00, 0x75, 0x61, 0x05, 0x00, 0x78, 0x61, 0x05, 0x00, 0x7c, 0x61, + 0x05, 0x00, 0x7e, 0x61, 0x05, 0x00, 0x7f, 0x61, 0x05, 0x00, 0xbe, 0x64, + 0x05, 0x00, 0xbf, 0x64, 0x05, 0x00, 0xf4, 0x65, 0x05, 0x00, 0xfe, 0x65, + 0x05, 0x00, 0xff, 0x65, 0x05, 0x00, 0xb4, 0x66, 0x05, 0x00, 0xbe, 0x66, + 0x05, 0x00, 0xbf, 0x66, 0x05, 0x00, 0x88, 0x67, 0x05, 0x00, 0x98, 0x67, + 0x05, 0x00, 0x9c, 0x67, 0x05, 0x00, 0x9e, 0x67, 0x05, 0x00, 0x9f, 0x67, + 0x05, 0x00, 0xd8, 0x67, 0x05, 0x00, 0xdc, 0x67, 0x05, 0x00, 0xde, 0x67, + 0x05, 0x00, 0xdf, 0x67, 0x05, 0x00, 0x7e, 0x68, 0x05, 0x00, 0x7f, 0x68, + 0x05, 0x00, 0xbe, 0x68, 0x05, 0x00, 0xbf, 0x68, 0x05, 0x00, 0xf3, 0x69, + 0x05, 0x00, 0xfb, 0x69, 0x05, 0x00, 0xb8, 0x6a, 0x05, 0x00, 0x78, 0x6b, + 0x05, 0x00, 0xc8, 0x6b, 0x05, 0x00, 0xfe, 0x6b, 0x05, 0x00, 0xff, 0x6b, + 0x05, 0x00, 0xf8, 0x6d, 0x05, 0x00, 0xf4, 0x6f, 0x05, 0x00, 0xf5, 0x6f, + 0x05, 0x00, 0xf8, 0x6f, 0x05, 0x00, 0xfc, 0x6f, 0x05, 0x00, 0xfe, 0x6f, + 0x05, 0x00, 0xff, 0x6f, 0x05, 0x00, 0x78, 0x70, 0x05, 0x00, 0xbe, 0x70, + 0x05, 0x00, 0xbf, 0x70, 0x05, 0x00, 0x15, 0x71, 0x05, 0x00, 0x64, 0x71, + 0x05, 0x00, 0x68, 0x71, 0x05, 0x00, 0x74, 0x71, 0x05, 0x00, 0x75, 0x71, + 0x05, 0x00, 0x78, 0x71, 0x05, 0x00, 0x7c, 0x71, 0x05, 0x00, 0x7e, 0x71, + 0x05, 0x00, 0x7f, 0x71, 0x05, 0x00, 0x9e, 0x73, 0x05, 0x00, 0x9f, 0x73, + 0x05, 0x00, 0xbe, 0x74, 0x05, 0x00, 0xbf, 0x74, 0x05, 0x00, 0xf4, 0x75, + 0x05, 0x00, 0xfe, 0x75, 0x05, 0x00, 0xff, 0x75, 0x05, 0x00, 0xb4, 0x76, + 0x05, 0x00, 0xbe, 0x76, 0x05, 0x00, 0xbf, 0x76, 0x05, 0x00, 0x88, 0x77, + 0x05, 0x00, 0x98, 0x77, 0x05, 0x00, 0x9c, 0x77, 0x05, 0x00, 0x9e, 0x77, + 0x05, 0x00, 0x9f, 0x77, 0x05, 0x00, 0xd8, 0x77, 0x05, 0x00, 0xdc, 0x77, + 0x05, 0x00, 0xde, 0x77, 0x05, 0x00, 0xdf, 0x77, 0x05, 0x00, 0x78, 0x78, + 0x05, 0x00, 0xbe, 0x78, 0x05, 0x00, 0xbf, 0x78, 0x05, 0x00, 0xf8, 0x79, + 0x05, 0x00, 0xfc, 0x79, 0x05, 0x00, 0xfe, 0x79, 0x05, 0x00, 0xff, 0x79, + 0x05, 0x00, 0xb4, 0x7a, 0x05, 0x00, 0xbe, 0x7a, 0x05, 0x00, 0xbf, 0x7a, + 0x05, 0x00, 0x1e, 0x7b, 0x05, 0x00, 0x1f, 0x7b, 0x05, 0x00, 0x78, 0x7b, + 0x05, 0x00, 0x88, 0x7b, 0x05, 0x00, 0xde, 0x7b, 0x05, 0x00, 0xdf, 0x7b, + 0x05, 0x00, 0xe8, 0x7b, 0x05, 0x00, 0xfe, 0x7b, 0x05, 0x00, 0xff, 0x7b, + 0x05, 0x00, 0xf4, 0x7d, 0x05, 0x00, 0xfe, 0x7d, 0x05, 0x00, 0xff, 0x7d, + 0x05, 0x00, 0xc4, 0x7f, 0x05, 0x00, 0xc8, 0x7f, 0x05, 0x00, 0xe4, 0x7f, + 0x05, 0x00, 0xe8, 0x7f, 0x05, 0x00, 0xf4, 0x7f, 0x05, 0x00, 0xf5, 0x7f, + 0x05, 0x00, 0xf8, 0x7f, 0x05, 0x00, 0xfc, 0x7f, 0x05, 0x00, 0xfe, 0x7f, + 0x05, 0x00, 0xff, 0x7f, 0x05, 0x00, 0x71, 0x84, 0x05, 0x00, 0x73, 0x84, + 0x05, 0x00, 0x79, 0x84, 0x05, 0x00, 0x7b, 0x84, 0x05, 0x00, 0x7d, 0x84, + 0x05, 0x00, 0x72, 0x86, 0x05, 0x00, 0x77, 0x86, 0x05, 0x00, 0x78, 0x86, + 0x05, 0x00, 0x7a, 0x86, 0x05, 0x00, 0x7c, 0x86, 0x05, 0x00, 0x7e, 0x86, + 0x05, 0x00, 0x7f, 0x86, 0x05, 0x00, 0x77, 0x87, 0x05, 0x00, 0x78, 0x87, + 0x05, 0x00, 0x7c, 0x87, 0x05, 0x00, 0x7e, 0x87, 0x05, 0x00, 0x7f, 0x87, + 0x05, 0x00, 0x83, 0x87, 0x05, 0x00, 0x87, 0x87, 0x05, 0x00, 0x8d, 0x87, + 0x05, 0x00, 0x92, 0x87, 0x05, 0x00, 0x9f, 0x87, 0x05, 0x00, 0xd2, 0x87, + 0x05, 0x00, 0xdf, 0x87, 0x05, 0x00, 0x72, 0x8a, 0x05, 0x00, 0x78, 0x8a, + 0x05, 0x00, 0x7a, 0x8a, 0x05, 0x00, 0x7c, 0x8a, 0x05, 0x00, 0x7e, 0x8a, + 0x05, 0x00, 0x7f, 0x8a, 0x05, 0x00, 0x10, 0x8b, 0x05, 0x00, 0x11, 0x8b, + 0x05, 0x00, 0x16, 0x8b, 0x05, 0x00, 0x17, 0x8b, 0x05, 0x00, 0x1f, 0x8b, + 0x05, 0x00, 0x8b, 0x8b, 0x05, 0x00, 0x8d, 0x8b, 0x05, 0x00, 0xd2, 0x8b, + 0x05, 0x00, 0xdb, 0x8b, 0x05, 0x00, 0xe1, 0x8b, 0x05, 0x00, 0xe2, 0x8b, + 0x05, 0x00, 0xee, 0x8b, 0x05, 0x00, 0xef, 0x8b, 0x05, 0x00, 0xf2, 0x8b, + 0x05, 0x00, 0xf8, 0x8b, 0x05, 0x00, 0xfa, 0x8b, 0x05, 0x00, 0xfc, 0x8b, + 0x05, 0x00, 0xfe, 0x8b, 0x05, 0x00, 0xff, 0x8b, 0x05, 0x00, 0xb3, 0x9a, + 0x05, 0x00, 0xbb, 0x9a, 0x05, 0x00, 0x8e, 0x9b, 0x05, 0x00, 0x8f, 0x9b, + 0x05, 0x00, 0xe3, 0x9f, 0x05, 0x00, 0xf3, 0x9f, 0x05, 0x00, 0xfb, 0x9f, + 0x05, 0x00, 0x7f, 0xa4, 0x05, 0x00, 0x78, 0xaa, 0x05, 0x00, 0x7c, 0xaa, + 0x05, 0x00, 0x7e, 0xaa, 0x05, 0x00, 0x7f, 0xaa, 0x05, 0x00, 0x8b, 0xab, + 0x05, 0x00, 0xeb, 0xab, 0x05, 0x00, 0x90, 0xb3, 0x05, 0x00, 0x91, 0xb3, + 0x05, 0x00, 0x96, 0xb3, 0x05, 0x00, 0x97, 0xb3, 0x05, 0x00, 0x9f, 0xb3, + 0x05, 0x00, 0x78, 0xba, 0x05, 0x00, 0x7c, 0xba, 0x05, 0x00, 0x7e, 0xba, + 0x05, 0x00, 0x7f, 0xba, 0x05, 0x00, 0x8b, 0xbb, 0x05, 0x00, 0xf8, 0xbb, + 0x05, 0x00, 0xfc, 0xbb, 0x05, 0x00, 0xfe, 0xbb, 0x05, 0x00, 0xff, 0xbb, + 0x05, 0x00, 0xf8, 0xbf, 0x05, 0x00, 0xfc, 0xbf, 0x05, 0x00, 0xfe, 0xbf, + 0x05, 0x00, 0xff, 0xbf, 0x05, 0x00, 0x1f, 0xc5, 0x05, 0x00, 0xb1, 0xc6, + 0x05, 0x00, 0xb3, 0xc6, 0x05, 0x00, 0xb9, 0xc6, 0x05, 0x00, 0xbb, 0xc6, + 0x05, 0x00, 0xbd, 0xc6, 0x05, 0x00, 0xcd, 0xc7, 0x05, 0x00, 0xe3, 0xc7, + 0x05, 0x00, 0xed, 0xc7, 0x05, 0x00, 0xf1, 0xc7, 0x05, 0x00, 0xf3, 0xc7, + 0x05, 0x00, 0xf9, 0xc7, 0x05, 0x00, 0xfb, 0xc7, 0x05, 0x00, 0xfd, 0xc7, + 0x05, 0x00, 0xbf, 0xca, 0x05, 0x00, 0x9f, 0xd3, 0x05, 0x00, 0xb3, 0xda, + 0x05, 0x00, 0xbb, 0xda, 0x05, 0x00, 0x83, 0xdb, 0x05, 0x00, 0xe3, 0xdf, + 0x05, 0x00, 0xf3, 0xdf, 0x05, 0x00, 0xfb, 0xdf, 0x05, 0x00, 0xbf, 0xe6, + 0x05, 0x00, 0xce, 0xe7, 0x05, 0x00, 0xcf, 0xe7, 0x05, 0x00, 0xe1, 0xe7, + 0x05, 0x00, 0xe2, 0xe7, 0x05, 0x00, 0xee, 0xe7, 0x05, 0x00, 0xef, 0xe7, + 0x05, 0x00, 0xf2, 0xe7, 0x05, 0x00, 0xf8, 0xe7, 0x05, 0x00, 0xfa, 0xe7, + 0x05, 0x00, 0xfc, 0xe7, 0x05, 0x00, 0xfe, 0xe7, 0x05, 0x00, 0xff, 0xe7, + 0x05, 0x00, 0xb1, 0xea, 0x05, 0x00, 0xb3, 0xea, 0x05, 0x00, 0xb9, 0xea, + 0x05, 0x00, 0xbb, 0xea, 0x05, 0x00, 0xbd, 0xea, 0x05, 0x00, 0x8d, 0xeb, + 0x05, 0x00, 0x8e, 0xeb, 0x05, 0x00, 0x8f, 0xeb, 0x05, 0x00, 0xb3, 0xf2, + 0x05, 0x00, 0xbb, 0xf2, 0x05, 0x00, 0x84, 0xf3, 0x05, 0x00, 0x8e, 0xf3, + 0x05, 0x00, 0x8f, 0xf3, 0x05, 0x00, 0x90, 0xf3, 0x05, 0x00, 0x0b, 0xf9, + 0x05, 0x00, 0xbf, 0xfa, 0x05, 0x00, 0x73, 0xfc, 0x05, 0x00, 0x7b, 0xfc, + 0x05, 0x00, 0x73, 0xfe, 0x05, 0x00, 0x7b, 0xfe, 0x05, 0x00, 0x83, 0xff, + 0x05, 0x00, 0x8e, 0xff, 0x05, 0x00, 0x8f, 0xff, 0x05, 0x00, 0xce, 0xff, + 0x05, 0x00, 0xcf, 0xff, 0x05, 0x00, 0xe1, 0xff, 0x05, 0x00, 0xe2, 0xff, + 0x05, 0x00, 0xee, 0xff, 0x05, 0x00, 0xef, 0xff, 0x05, 0x00, 0xf2, 0xff, + 0x05, 0x00, 0xf8, 0xff, 0x05, 0x00, 0xfa, 0xff, 0x05, 0x00, 0xfc, 0xff, + 0x05, 0x00, 0xfe, 0xff, 0x05, 0x00, 0xff, 0xff, 0x05, 0x00, 0x38, 0x00, + 0x06, 0x00, 0x3c, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x06, 0x00, 0x3f, 0x00, + 0x06, 0x00, 0xe8, 0x00, 0x06, 0x00, 0xeb, 0x00, 0x06, 0x00, 0xf8, 0x00, + 0x06, 0x00, 0xfc, 0x00, 0x06, 0x00, 0xfe, 0x00, 0x06, 0x00, 0xff, 0x00, + 0x06, 0x00, 0xc8, 0x01, 0x06, 0x00, 0xcb, 0x01, 0x06, 0x00, 0xf8, 0x01, + 0x06, 0x00, 0xfc, 0x01, 0x06, 0x00, 0xfe, 0x01, 0x06, 0x00, 0xff, 0x01, + 0x06, 0x00, 0x38, 0x03, 0x06, 0x00, 0x3c, 0x03, 0x06, 0x00, 0x3e, 0x03, + 0x06, 0x00, 0x3f, 0x03, 0x06, 0x00, 0x88, 0x07, 0x06, 0x00, 0x8b, 0x07, + 0x06, 0x00, 0xe8, 0x07, 0x06, 0x00, 0xeb, 0x07, 0x06, 0x00, 0xf8, 0x07, + 0x06, 0x00, 0xfc, 0x07, 0x06, 0x00, 0xfe, 0x07, 0x06, 0x00, 0xff, 0x07, + 0x06, 0x00, 0x4b, 0x08, 0x06, 0x00, 0xcb, 0x09, 0x06, 0x00, 0xf8, 0x09, + 0x06, 0x00, 0xfc, 0x09, 0x06, 0x00, 0xfe, 0x09, 0x06, 0x00, 0xff, 0x09, + 0x06, 0x00, 0xe8, 0x0f, 0x06, 0x00, 0xeb, 0x0f, 0x06, 0x00, 0xf8, 0x0f, + 0x06, 0x00, 0xfc, 0x0f, 0x06, 0x00, 0xfe, 0x0f, 0x06, 0x00, 0xff, 0x0f, + 0x06, 0x00, 0x38, 0x10, 0x06, 0x00, 0xbe, 0x10, 0x06, 0x00, 0xbf, 0x10, + 0x06, 0x00, 0xe8, 0x10, 0x06, 0x00, 0xeb, 0x10, 0x06, 0x00, 0xf8, 0x11, + 0x06, 0x00, 0xfc, 0x11, 0x06, 0x00, 0xfe, 0x11, 0x06, 0x00, 0xff, 0x11, + 0x06, 0x00, 0x3e, 0x14, 0x06, 0x00, 0x3f, 0x14, 0x06, 0x00, 0xb8, 0x14, + 0x06, 0x00, 0xbc, 0x14, 0x06, 0x00, 0xbe, 0x14, 0x06, 0x00, 0xbf, 0x14, + 0x06, 0x00, 0x38, 0x15, 0x06, 0x00, 0x38, 0x16, 0x06, 0x00, 0x3c, 0x16, + 0x06, 0x00, 0x3e, 0x16, 0x06, 0x00, 0x3f, 0x16, 0x06, 0x00, 0xb8, 0x16, + 0x06, 0x00, 0xbc, 0x16, 0x06, 0x00, 0xbe, 0x16, 0x06, 0x00, 0xbf, 0x16, + 0x06, 0x00, 0x38, 0x17, 0x06, 0x00, 0x3c, 0x17, 0x06, 0x00, 0x3e, 0x17, + 0x06, 0x00, 0x3f, 0x17, 0x06, 0x00, 0xb8, 0x1a, 0x06, 0x00, 0xbc, 0x1a, + 0x06, 0x00, 0xbe, 0x1a, 0x06, 0x00, 0xbf, 0x1a, 0x06, 0x00, 0x38, 0x1d, + 0x06, 0x00, 0x38, 0x1f, 0x06, 0x00, 0x3c, 0x1f, 0x06, 0x00, 0x3e, 0x1f, + 0x06, 0x00, 0x3f, 0x1f, 0x06, 0x00, 0x38, 0x22, 0x06, 0x00, 0x3c, 0x22, + 0x06, 0x00, 0x3e, 0x22, 0x06, 0x00, 0x3f, 0x22, 0x06, 0x00, 0x38, 0x25, + 0x06, 0x00, 0x3c, 0x25, 0x06, 0x00, 0x3e, 0x25, 0x06, 0x00, 0x3f, 0x25, + 0x06, 0x00, 0x58, 0x29, 0x06, 0x00, 0x5c, 0x29, 0x06, 0x00, 0x5e, 0x29, + 0x06, 0x00, 0x5f, 0x29, 0x06, 0x00, 0x38, 0x2d, 0x06, 0x00, 0x58, 0x2d, + 0x06, 0x00, 0x5c, 0x2d, 0x06, 0x00, 0x5e, 0x2d, 0x06, 0x00, 0x5f, 0x2d, + 0x06, 0x00, 0xe8, 0x2e, 0x06, 0x00, 0xeb, 0x2e, 0x06, 0x00, 0xf8, 0x2e, + 0x06, 0x00, 0xfc, 0x2e, 0x06, 0x00, 0xfe, 0x2e, 0x06, 0x00, 0xff, 0x2e, + 0x06, 0x00, 0x38, 0x2f, 0x06, 0x00, 0x3c, 0x2f, 0x06, 0x00, 0x3e, 0x2f, + 0x06, 0x00, 0x3f, 0x2f, 0x06, 0x00, 0x36, 0x33, 0x06, 0x00, 0x37, 0x33, + 0x06, 0x00, 0x38, 0x33, 0x06, 0x00, 0x3c, 0x33, 0x06, 0x00, 0x3e, 0x33, + 0x06, 0x00, 0x3f, 0x33, 0x06, 0x00, 0xb8, 0x33, 0x06, 0x00, 0xbc, 0x33, + 0x06, 0x00, 0xbe, 0x33, 0x06, 0x00, 0xbf, 0x33, 0x06, 0x00, 0xe9, 0x33, + 0x06, 0x00, 0xea, 0x33, 0x06, 0x00, 0xf0, 0x33, 0x06, 0x00, 0xf1, 0x33, + 0x06, 0x00, 0xf9, 0x33, 0x06, 0x00, 0xfd, 0x33, 0x06, 0x00, 0xcb, 0x35, + 0x06, 0x00, 0xf7, 0x35, 0x06, 0x00, 0xf8, 0x35, 0x06, 0x00, 0xfc, 0x35, + 0x06, 0x00, 0xfe, 0x35, 0x06, 0x00, 0xff, 0x35, 0x06, 0x00, 0xcb, 0x39, + 0x06, 0x00, 0xf7, 0x39, 0x06, 0x00, 0xf8, 0x39, 0x06, 0x00, 0xfc, 0x39, + 0x06, 0x00, 0xfe, 0x39, 0x06, 0x00, 0xff, 0x39, 0x06, 0x00, 0xf0, 0x3d, + 0x06, 0x00, 0xf1, 0x3d, 0x06, 0x00, 0xf9, 0x3d, 0x06, 0x00, 0xfd, 0x3d, + 0x06, 0x00, 0x48, 0x3e, 0x06, 0x00, 0x4b, 0x3e, 0x06, 0x00, 0x30, 0x3f, + 0x06, 0x00, 0x31, 0x3f, 0x06, 0x00, 0x39, 0x3f, 0x06, 0x00, 0x3d, 0x3f, + 0x06, 0x00, 0xe6, 0x3f, 0x06, 0x00, 0xe7, 0x3f, 0x06, 0x00, 0xe8, 0x3f, + 0x06, 0x00, 0xeb, 0x3f, 0x06, 0x00, 0xf6, 0x3f, 0x06, 0x00, 0xf7, 0x3f, + 0x06, 0x00, 0xf8, 0x3f, 0x06, 0x00, 0xfc, 0x3f, 0x06, 0x00, 0xfe, 0x3f, + 0x06, 0x00, 0xff, 0x3f, 0x06, 0x00, 0xcb, 0x43, 0x06, 0x00, 0xf7, 0x43, + 0x06, 0x00, 0xf8, 0x43, 0x06, 0x00, 0xfc, 0x43, 0x06, 0x00, 0xfe, 0x43, + 0x06, 0x00, 0xff, 0x43, 0x06, 0x00, 0x37, 0x45, 0x06, 0x00, 0x38, 0x45, + 0x06, 0x00, 0x3c, 0x45, 0x06, 0x00, 0x3e, 0x45, 0x06, 0x00, 0x3f, 0x45, + 0x06, 0x00, 0xb8, 0x45, 0x06, 0x00, 0xbc, 0x45, 0x06, 0x00, 0xbe, 0x45, + 0x06, 0x00, 0xbf, 0x45, 0x06, 0x00, 0xf0, 0x45, 0x06, 0x00, 0xf1, 0x45, + 0x06, 0x00, 0xf9, 0x45, 0x06, 0x00, 0xfd, 0x45, 0x06, 0x00, 0xb7, 0x47, + 0x06, 0x00, 0xb8, 0x47, 0x06, 0x00, 0xbc, 0x47, 0x06, 0x00, 0xbe, 0x47, + 0x06, 0x00, 0xbf, 0x47, 0x06, 0x00, 0xb7, 0x4a, 0x06, 0x00, 0x30, 0x4b, + 0x06, 0x00, 0x3d, 0x4b, 0x06, 0x00, 0x3e, 0x4b, 0x06, 0x00, 0x3f, 0x4b, + 0x06, 0x00, 0xb1, 0x4b, 0x06, 0x00, 0xb7, 0x4b, 0x06, 0x00, 0xb8, 0x4b, + 0x06, 0x00, 0xe7, 0x4b, 0x06, 0x00, 0xf0, 0x4b, 0x06, 0x00, 0xf1, 0x4b, + 0x06, 0x00, 0xf7, 0x4b, 0x06, 0x00, 0xf9, 0x4b, 0x06, 0x00, 0xfd, 0x4b, + 0x06, 0x00, 0xf8, 0x4f, 0x06, 0x00, 0xfc, 0x4f, 0x06, 0x00, 0xfe, 0x4f, + 0x06, 0x00, 0xff, 0x4f, 0x06, 0x00, 0x4b, 0x52, 0x06, 0x00, 0xb8, 0x52, + 0x06, 0x00, 0xbc, 0x52, 0x06, 0x00, 0xbe, 0x52, 0x06, 0x00, 0xbf, 0x52, + 0x06, 0x00, 0x37, 0x59, 0x06, 0x00, 0x38, 0x59, 0x06, 0x00, 0x3c, 0x59, + 0x06, 0x00, 0x3e, 0x59, 0x06, 0x00, 0x3f, 0x59, 0x06, 0x00, 0xf0, 0x59, + 0x06, 0x00, 0xf1, 0x59, 0x06, 0x00, 0xf9, 0x59, 0x06, 0x00, 0xfd, 0x59, + 0x06, 0x00, 0x4b, 0x5c, 0x06, 0x00, 0xb8, 0x5c, 0x06, 0x00, 0xbc, 0x5c, + 0x06, 0x00, 0xbe, 0x5c, 0x06, 0x00, 0xbf, 0x5c, 0x06, 0x00, 0x30, 0x5d, + 0x06, 0x00, 0x31, 0x5d, 0x06, 0x00, 0x39, 0x5d, 0x06, 0x00, 0x3d, 0x5d, + 0x06, 0x00, 0xcb, 0x5d, 0x06, 0x00, 0xf7, 0x5d, 0x06, 0x00, 0xf8, 0x5d, + 0x06, 0x00, 0xfc, 0x5d, 0x06, 0x00, 0xfe, 0x5d, 0x06, 0x00, 0xff, 0x5d, + 0x06, 0x00, 0xb8, 0x5e, 0x06, 0x00, 0xbc, 0x5e, 0x06, 0x00, 0xbe, 0x5e, + 0x06, 0x00, 0xbf, 0x5e, 0x06, 0x00, 0xcf, 0x63, 0x06, 0x00, 0xf8, 0x63, + 0x06, 0x00, 0xfc, 0x63, 0x06, 0x00, 0xfe, 0x63, 0x06, 0x00, 0xff, 0x63, + 0x06, 0x00, 0x33, 0x65, 0x06, 0x00, 0x3b, 0x65, 0x06, 0x00, 0x3f, 0x65, + 0x06, 0x00, 0xf3, 0x65, 0x06, 0x00, 0xfb, 0x65, 0x06, 0x00, 0xff, 0x66, + 0x06, 0x00, 0x33, 0x67, 0x06, 0x00, 0x3b, 0x67, 0x06, 0x00, 0x83, 0x67, + 0x06, 0x00, 0x8e, 0x67, 0x06, 0x00, 0x8f, 0x67, 0x06, 0x00, 0x3e, 0x6a, + 0x06, 0x00, 0x3f, 0x6a, 0x06, 0x00, 0xb8, 0x6a, 0x06, 0x00, 0xbc, 0x6a, + 0x06, 0x00, 0xbe, 0x6a, 0x06, 0x00, 0xbf, 0x6a, 0x06, 0x00, 0x34, 0x6b, + 0x06, 0x00, 0x3e, 0x6b, 0x06, 0x00, 0x3f, 0x6b, 0x06, 0x00, 0xb4, 0x6b, + 0x06, 0x00, 0xbe, 0x6b, 0x06, 0x00, 0xbf, 0x6b, 0x06, 0x00, 0xf3, 0x6b, + 0x06, 0x00, 0xfb, 0x6b, 0x06, 0x00, 0xf8, 0x6f, 0x06, 0x00, 0xfc, 0x6f, + 0x06, 0x00, 0xfe, 0x6f, 0x06, 0x00, 0xff, 0x6f, 0x06, 0x00, 0x3f, 0x72, + 0x06, 0x00, 0xcb, 0x72, 0x06, 0x00, 0xeb, 0x72, 0x06, 0x00, 0x3e, 0x73, + 0x06, 0x00, 0x3f, 0x73, 0x06, 0x00, 0xf3, 0x73, 0x06, 0x00, 0xfb, 0x73, + 0x06, 0x00, 0xf3, 0x75, 0x06, 0x00, 0xfb, 0x75, 0x06, 0x00, 0x83, 0x77, + 0x06, 0x00, 0x8e, 0x77, 0x06, 0x00, 0x8f, 0x77, 0x06, 0x00, 0xb3, 0x7a, + 0x06, 0x00, 0xbb, 0x7a, 0x06, 0x00, 0xff, 0x7a, 0x06, 0x00, 0x34, 0x7b, + 0x06, 0x00, 0x38, 0x7b, 0x06, 0x00, 0xb4, 0x7b, 0x06, 0x00, 0xb8, 0x7b, + 0x06, 0x00, 0xee, 0x7b, 0x06, 0x00, 0xef, 0x7b, 0x06, 0x00, 0xf8, 0x7b, + 0x06, 0x00, 0xfc, 0x7b, 0x06, 0x00, 0xfe, 0x7b, 0x06, 0x00, 0xff, 0x7b, + 0x06, 0x00, 0xc3, 0x7f, 0x06, 0x00, 0xcb, 0x7f, 0x06, 0x00, 0xe3, 0x7f, + 0x06, 0x00, 0xeb, 0x7f, 0x06, 0x00, 0xf3, 0x7f, 0x06, 0x00, 0xfb, 0x7f, + 0x06, 0x00, 0x31, 0x80, 0x06, 0x00, 0x38, 0x80, 0x06, 0x00, 0x4d, 0x80, + 0x06, 0x00, 0xb1, 0x80, 0x06, 0x00, 0xb8, 0x80, 0x06, 0x00, 0xe1, 0x80, + 0x06, 0x00, 0xe2, 0x80, 0x06, 0x00, 0xe7, 0x80, 0x06, 0x00, 0xed, 0x80, + 0x06, 0x00, 0xee, 0x80, 0x06, 0x00, 0xef, 0x80, 0x06, 0x00, 0xf2, 0x80, + 0x06, 0x00, 0xf7, 0x80, 0x06, 0x00, 0xf8, 0x80, 0x06, 0x00, 0xfa, 0x80, + 0x06, 0x00, 0xfc, 0x80, 0x06, 0x00, 0xfe, 0x80, 0x06, 0x00, 0xff, 0x80, + 0x06, 0x00, 0xf1, 0x81, 0x06, 0x00, 0xf3, 0x81, 0x06, 0x00, 0xf9, 0x81, + 0x06, 0x00, 0xfb, 0x81, 0x06, 0x00, 0xfd, 0x81, 0x06, 0x00, 0xb4, 0x82, + 0x06, 0x00, 0xbe, 0x82, 0x06, 0x00, 0xbf, 0x82, 0x06, 0x00, 0xe1, 0x82, + 0x06, 0x00, 0xe2, 0x82, 0x06, 0x00, 0xe7, 0x82, 0x06, 0x00, 0xed, 0x82, + 0x06, 0x00, 0xee, 0x82, 0x06, 0x00, 0xef, 0x82, 0x06, 0x00, 0xf2, 0x82, + 0x06, 0x00, 0xf7, 0x82, 0x06, 0x00, 0xf8, 0x82, 0x06, 0x00, 0xfa, 0x82, + 0x06, 0x00, 0xfc, 0x82, 0x06, 0x00, 0xfe, 0x82, 0x06, 0x00, 0xff, 0x82, + 0x06, 0x00, 0x30, 0x83, 0x06, 0x00, 0x3e, 0x83, 0x06, 0x00, 0x4f, 0x83, + 0x06, 0x00, 0xb4, 0x83, 0x06, 0x00, 0xbe, 0x83, 0x06, 0x00, 0xbf, 0x83, + 0x06, 0x00, 0xf1, 0x83, 0x06, 0x00, 0xf3, 0x83, 0x06, 0x00, 0xf9, 0x83, + 0x06, 0x00, 0xfb, 0x83, 0x06, 0x00, 0xfd, 0x83, 0x06, 0x00, 0x30, 0x84, + 0x06, 0x00, 0x37, 0x84, 0x06, 0x00, 0x3d, 0x84, 0x06, 0x00, 0x3e, 0x84, + 0x06, 0x00, 0x3f, 0x84, 0x06, 0x00, 0xeb, 0x84, 0x06, 0x00, 0xf0, 0x84, + 0x06, 0x00, 0xf1, 0x84, 0x06, 0x00, 0xf9, 0x84, 0x06, 0x00, 0xfd, 0x84, + 0x06, 0x00, 0xb4, 0x85, 0x06, 0x00, 0xbe, 0x85, 0x06, 0x00, 0xbf, 0x85, + 0x06, 0x00, 0xf1, 0x85, 0x06, 0x00, 0xf3, 0x85, 0x06, 0x00, 0xf9, 0x85, + 0x06, 0x00, 0xfb, 0x85, 0x06, 0x00, 0xfd, 0x85, 0x06, 0x00, 0x30, 0x86, + 0x06, 0x00, 0x37, 0x86, 0x06, 0x00, 0x3d, 0x86, 0x06, 0x00, 0x3e, 0x86, + 0x06, 0x00, 0x3f, 0x86, 0x06, 0x00, 0x30, 0x87, 0x06, 0x00, 0x3e, 0x87, + 0x06, 0x00, 0x8d, 0x87, 0x06, 0x00, 0x8e, 0x87, 0x06, 0x00, 0x8f, 0x87, + 0x06, 0x00, 0xf1, 0x87, 0x06, 0x00, 0xf3, 0x87, 0x06, 0x00, 0xf9, 0x87, + 0x06, 0x00, 0xfb, 0x87, 0x06, 0x00, 0xfd, 0x87, 0x06, 0x00, 0x43, 0x88, + 0x06, 0x00, 0xb0, 0x88, 0x06, 0x00, 0xbe, 0x88, 0x06, 0x00, 0xff, 0x89, + 0x06, 0x00, 0x37, 0x8a, 0x06, 0x00, 0x4f, 0x8c, 0x06, 0x00, 0xb4, 0x8c, + 0x06, 0x00, 0xb8, 0x8c, 0x06, 0x00, 0xff, 0x8d, 0x06, 0x00, 0x33, 0x8e, + 0x06, 0x00, 0x3b, 0x8e, 0x06, 0x00, 0x3f, 0x8e, 0x06, 0x00, 0x4f, 0x8e, + 0x06, 0x00, 0xb4, 0x8e, 0x06, 0x00, 0x31, 0x8f, 0x06, 0x00, 0x38, 0x8f, + 0x06, 0x00, 0xb4, 0x8f, 0x06, 0x00, 0xb8, 0x8f, 0x06, 0x00, 0xe1, 0x8f, + 0x06, 0x00, 0xe2, 0x8f, 0x06, 0x00, 0xed, 0x8f, 0x06, 0x00, 0xee, 0x8f, + 0x06, 0x00, 0xef, 0x8f, 0x06, 0x00, 0xf2, 0x8f, 0x06, 0x00, 0xf8, 0x8f, + 0x06, 0x00, 0xfa, 0x8f, 0x06, 0x00, 0xfc, 0x8f, 0x06, 0x00, 0xfe, 0x8f, + 0x06, 0x00, 0xff, 0x8f, 0x06, 0x00, 0x38, 0x92, 0x06, 0x00, 0x38, 0x93, + 0x06, 0x00, 0xee, 0x93, 0x06, 0x00, 0xef, 0x93, 0x06, 0x00, 0xf8, 0x93, + 0x06, 0x00, 0xf3, 0x95, 0x06, 0x00, 0xfb, 0x95, 0x06, 0x00, 0xff, 0x95, + 0x06, 0x00, 0xf3, 0x99, 0x06, 0x00, 0xfb, 0x99, 0x06, 0x00, 0x38, 0x9c, + 0x06, 0x00, 0xf8, 0x9d, 0x06, 0x00, 0xce, 0x9f, 0x06, 0x00, 0xcf, 0x9f, + 0x06, 0x00, 0xee, 0x9f, 0x06, 0x00, 0xef, 0x9f, 0x06, 0x00, 0xf3, 0x9f, + 0x06, 0x00, 0xfb, 0x9f, 0x06, 0x00, 0x3f, 0xa4, 0x06, 0x00, 0xcf, 0xa5, + 0x06, 0x00, 0xff, 0xa5, 0x06, 0x00, 0x3f, 0xa6, 0x06, 0x00, 0x3e, 0xa7, + 0x06, 0x00, 0x3f, 0xa7, 0x06, 0x00, 0xf3, 0xa7, 0x06, 0x00, 0xfb, 0xa7, + 0x06, 0x00, 0xb8, 0xaa, 0x06, 0x00, 0x8e, 0xab, 0x06, 0x00, 0x8f, 0xab, + 0x06, 0x00, 0x37, 0xb2, 0x06, 0x00, 0x84, 0xb3, 0x06, 0x00, 0x8e, 0xb3, + 0x06, 0x00, 0x8f, 0xb3, 0x06, 0x00, 0xff, 0xb5, 0x06, 0x00, 0xe1, 0xb7, + 0x06, 0x00, 0xe2, 0xb7, 0x06, 0x00, 0xed, 0xb7, 0x06, 0x00, 0xee, 0xb7, + 0x06, 0x00, 0xef, 0xb7, 0x06, 0x00, 0xf2, 0xb7, 0x06, 0x00, 0xf8, 0xb7, + 0x06, 0x00, 0xfa, 0xb7, 0x06, 0x00, 0xfc, 0xb7, 0x06, 0x00, 0xfe, 0xb7, + 0x06, 0x00, 0xff, 0xb7, 0x06, 0x00, 0x37, 0xb8, 0x06, 0x00, 0xeb, 0xb8, + 0x06, 0x00, 0xf8, 0xb8, 0x06, 0x00, 0xfc, 0xb8, 0x06, 0x00, 0xfe, 0xb8, + 0x06, 0x00, 0xff, 0xb8, 0x06, 0x00, 0x37, 0xb9, 0x06, 0x00, 0x51, 0xb9, + 0x06, 0x00, 0x56, 0xb9, 0x06, 0x00, 0x57, 0xb9, 0x06, 0x00, 0x5f, 0xb9, + 0x06, 0x00, 0xb4, 0xb9, 0x06, 0x00, 0x37, 0xba, 0x06, 0x00, 0x37, 0xbc, + 0x06, 0x00, 0xeb, 0xbc, 0x06, 0x00, 0xf8, 0xbc, 0x06, 0x00, 0xfc, 0xbc, + 0x06, 0x00, 0xfe, 0xbc, 0x06, 0x00, 0xff, 0xbc, 0x06, 0x00, 0x37, 0xbd, + 0x06, 0x00, 0x51, 0xbd, 0x06, 0x00, 0x56, 0xbd, 0x06, 0x00, 0x57, 0xbd, + 0x06, 0x00, 0x5f, 0xbd, 0x06, 0x00, 0xb4, 0xbd, 0x06, 0x00, 0xeb, 0xbe, + 0x06, 0x00, 0xff, 0xbe, 0x06, 0x00, 0x84, 0xbf, 0x06, 0x00, 0x8e, 0xbf, + 0x06, 0x00, 0x8f, 0xbf, 0x06, 0x00, 0x30, 0xc2, 0x06, 0x00, 0x36, 0xc2, + 0x06, 0x00, 0x37, 0xc2, 0x06, 0x00, 0x3d, 0xc2, 0x06, 0x00, 0x3e, 0xc2, + 0x06, 0x00, 0x3f, 0xc2, 0x06, 0x00, 0x31, 0xc5, 0x06, 0x00, 0x38, 0xc5, + 0x06, 0x00, 0x31, 0xc9, 0x06, 0x00, 0x38, 0xc9, 0x06, 0x00, 0x51, 0xc9, + 0x06, 0x00, 0x56, 0xc9, 0x06, 0x00, 0x57, 0xc9, 0x06, 0x00, 0x58, 0xc9, + 0x06, 0x00, 0x5c, 0xc9, 0x06, 0x00, 0x5e, 0xc9, 0x06, 0x00, 0x5f, 0xc9, + 0x06, 0x00, 0xf0, 0xcc, 0x06, 0x00, 0xf1, 0xcc, 0x06, 0x00, 0xf9, 0xcc, + 0x06, 0x00, 0xfd, 0xcc, 0x06, 0x00, 0x31, 0xcd, 0x06, 0x00, 0x38, 0xcd, + 0x06, 0x00, 0x51, 0xcd, 0x06, 0x00, 0x56, 0xcd, 0x06, 0x00, 0x57, 0xcd, + 0x06, 0x00, 0x5d, 0xcd, 0x06, 0x00, 0x5e, 0xcd, 0x06, 0x00, 0x5f, 0xcd, + 0x06, 0x00, 0x31, 0xce, 0x06, 0x00, 0x38, 0xce, 0x06, 0x00, 0xf0, 0xce, + 0x06, 0x00, 0xf1, 0xce, 0x06, 0x00, 0xf9, 0xce, 0x06, 0x00, 0xfd, 0xce, + 0x06, 0x00, 0x31, 0xcf, 0x06, 0x00, 0x38, 0xcf, 0x06, 0x00, 0xb8, 0xcf, + 0x06, 0x00, 0x3e, 0xd3, 0x06, 0x00, 0x3f, 0xd3, 0x06, 0x00, 0xe8, 0xd3, + 0x06, 0x00, 0xeb, 0xd3, 0x06, 0x00, 0xf8, 0xd5, 0x06, 0x00, 0xfc, 0xd5, + 0x06, 0x00, 0xfe, 0xd5, 0x06, 0x00, 0xff, 0xd5, 0x06, 0x00, 0xf8, 0xd9, + 0x06, 0x00, 0xfc, 0xd9, 0x06, 0x00, 0xfe, 0xd9, 0x06, 0x00, 0xff, 0xd9, + 0x06, 0x00, 0xf8, 0xdd, 0x06, 0x00, 0xfc, 0xdd, 0x06, 0x00, 0xfe, 0xdd, + 0x06, 0x00, 0xff, 0xdd, 0x06, 0x00, 0x3e, 0xdf, 0x06, 0x00, 0x3f, 0xdf, + 0x06, 0x00, 0xe8, 0xdf, 0x06, 0x00, 0xeb, 0xdf, 0x06, 0x00, 0xbe, 0xe2, + 0x06, 0x00, 0xbf, 0xe2, 0x06, 0x00, 0x30, 0xe5, 0x06, 0x00, 0x37, 0xe5, + 0x06, 0x00, 0x3d, 0xe5, 0x06, 0x00, 0x3e, 0xe5, 0x06, 0x00, 0x3f, 0xe5, + 0x06, 0x00, 0xbe, 0xe5, 0x06, 0x00, 0xbf, 0xe5, 0x06, 0x00, 0x30, 0xe9, + 0x06, 0x00, 0x36, 0xe9, 0x06, 0x00, 0x37, 0xe9, 0x06, 0x00, 0x3d, 0xe9, + 0x06, 0x00, 0x3e, 0xe9, 0x06, 0x00, 0x3f, 0xe9, 0x06, 0x00, 0x51, 0xe9, + 0x06, 0x00, 0x56, 0xe9, 0x06, 0x00, 0x57, 0xe9, 0x06, 0x00, 0x58, 0xe9, + 0x06, 0x00, 0x5c, 0xe9, 0x06, 0x00, 0x5e, 0xe9, 0x06, 0x00, 0x5f, 0xe9, + 0x06, 0x00, 0xf0, 0xec, 0x06, 0x00, 0xf1, 0xec, 0x06, 0x00, 0xf9, 0xec, + 0x06, 0x00, 0xfd, 0xec, 0x06, 0x00, 0x30, 0xed, 0x06, 0x00, 0x36, 0xed, + 0x06, 0x00, 0x37, 0xed, 0x06, 0x00, 0x3d, 0xed, 0x06, 0x00, 0x3e, 0xed, + 0x06, 0x00, 0x3f, 0xed, 0x06, 0x00, 0x51, 0xed, 0x06, 0x00, 0x56, 0xed, + 0x06, 0x00, 0x57, 0xed, 0x06, 0x00, 0x5d, 0xed, 0x06, 0x00, 0x5e, 0xed, + 0x06, 0x00, 0x5f, 0xed, 0x06, 0x00, 0x30, 0xee, 0x06, 0x00, 0x36, 0xee, + 0x06, 0x00, 0x37, 0xee, 0x06, 0x00, 0x3d, 0xee, 0x06, 0x00, 0x3e, 0xee, + 0x06, 0x00, 0x3f, 0xee, 0x06, 0x00, 0xe6, 0xee, 0x06, 0x00, 0xe7, 0xee, + 0x06, 0x00, 0xe8, 0xee, 0x06, 0x00, 0xe9, 0xee, 0x06, 0x00, 0xeb, 0xee, + 0x06, 0x00, 0xf6, 0xee, 0x06, 0x00, 0xf7, 0xee, 0x06, 0x00, 0xf8, 0xee, + 0x06, 0x00, 0xfc, 0xee, 0x06, 0x00, 0xfe, 0xee, 0x06, 0x00, 0xff, 0xee, + 0x06, 0x00, 0x31, 0xef, 0x06, 0x00, 0x38, 0xef, 0x06, 0x00, 0xb8, 0xef, + 0x06, 0x00, 0x30, 0xf3, 0x06, 0x00, 0x36, 0xf3, 0x06, 0x00, 0x37, 0xf3, + 0x06, 0x00, 0x3d, 0xf3, 0x06, 0x00, 0x3e, 0xf3, 0x06, 0x00, 0x3f, 0xf3, + 0x06, 0x00, 0xbe, 0xf3, 0x06, 0x00, 0xbf, 0xf3, 0x06, 0x00, 0xe6, 0xf3, + 0x06, 0x00, 0xe7, 0xf3, 0x06, 0x00, 0xe8, 0xf3, 0x06, 0x00, 0xe9, 0xf3, + 0x06, 0x00, 0xeb, 0xf3, 0x06, 0x00, 0xf0, 0xf3, 0x06, 0x00, 0xf6, 0xf3, + 0x06, 0x00, 0xf7, 0xf3, 0x06, 0x00, 0xfd, 0xf3, 0x06, 0x00, 0xfe, 0xf3, + 0x06, 0x00, 0xff, 0xf3, 0x06, 0x00, 0xf1, 0xf5, 0x06, 0x00, 0xf8, 0xf5, + 0x06, 0x00, 0xbe, 0xf9, 0x06, 0x00, 0xbf, 0xf9, 0x06, 0x00, 0xf7, 0xf9, + 0x06, 0x00, 0xf8, 0xf9, 0x06, 0x00, 0xfc, 0xf9, 0x06, 0x00, 0xfe, 0xf9, + 0x06, 0x00, 0xff, 0xf9, 0x06, 0x00, 0xbe, 0xfc, 0x06, 0x00, 0xbf, 0xfc, + 0x06, 0x00, 0xbe, 0xfd, 0x06, 0x00, 0xbf, 0xfd, 0x06, 0x00, 0xf0, 0xfd, + 0x06, 0x00, 0xf7, 0xfd, 0x06, 0x00, 0xfd, 0xfd, 0x06, 0x00, 0xfe, 0xfd, + 0x06, 0x00, 0xff, 0xfd, 0x06, 0x00, 0xbe, 0xfe, 0x06, 0x00, 0xbf, 0xfe, + 0x06, 0x00, 0x88, 0xff, 0x06, 0x00, 0x8b, 0xff, 0x06, 0x00, 0xc6, 0xff, + 0x06, 0x00, 0xc7, 0xff, 0x06, 0x00, 0xc8, 0xff, 0x06, 0x00, 0xc9, 0xff, + 0x06, 0x00, 0xcb, 0xff, 0x06, 0x00, 0xe6, 0xff, 0x06, 0x00, 0xe7, 0xff, + 0x06, 0x00, 0xe8, 0xff, 0x06, 0x00, 0xe9, 0xff, 0x06, 0x00, 0xeb, 0xff, + 0x06, 0x00, 0xf6, 0xff, 0x06, 0x00, 0xf7, 0xff, 0x06, 0x00, 0xf8, 0xff, + 0x06, 0x00, 0xfc, 0xff, 0x06, 0x00, 0xfe, 0xff, 0x06, 0x00, 0xff, 0xff, + 0x06, 0x00, 0x34, 0x00, 0x07, 0x00, 0x35, 0x00, 0x07, 0x00, 0x38, 0x00, + 0x07, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x3e, 0x00, 0x07, 0x00, 0x3f, 0x00, + 0x07, 0x00, 0x43, 0x00, 0x07, 0x00, 0x44, 0x00, 0x07, 0x00, 0x45, 0x00, + 0x07, 0x00, 0x48, 0x00, 0x07, 0x00, 0x4b, 0x00, 0x07, 0x00, 0x4c, 0x00, + 0x07, 0x00, 0x4e, 0x00, 0x07, 0x00, 0x4f, 0x00, 0x07, 0x00, 0xb4, 0x00, + 0x07, 0x00, 0xb5, 0x00, 0x07, 0x00, 0xb8, 0x00, 0x07, 0x00, 0xbc, 0x00, + 0x07, 0x00, 0xbe, 0x00, 0x07, 0x00, 0xbf, 0x00, 0x07, 0x00, 0x34, 0x01, + 0x07, 0x00, 0x35, 0x01, 0x07, 0x00, 0x38, 0x01, 0x07, 0x00, 0x3c, 0x01, + 0x07, 0x00, 0x3e, 0x01, 0x07, 0x00, 0x3f, 0x01, 0x07, 0x00, 0xf3, 0x01, + 0x07, 0x00, 0xfb, 0x01, 0x07, 0x00, 0x33, 0x02, 0x07, 0x00, 0x3b, 0x02, + 0x07, 0x00, 0x34, 0x05, 0x07, 0x00, 0x35, 0x05, 0x07, 0x00, 0x38, 0x05, + 0x07, 0x00, 0x3c, 0x05, 0x07, 0x00, 0x3e, 0x05, 0x07, 0x00, 0x3f, 0x05, + 0x07, 0x00, 0xf3, 0x05, 0x07, 0x00, 0xfb, 0x05, 0x07, 0x00, 0xb3, 0x07, + 0x07, 0x00, 0xbb, 0x07, 0x07, 0x00, 0xb4, 0x08, 0x07, 0x00, 0xb5, 0x08, + 0x07, 0x00, 0xb8, 0x08, 0x07, 0x00, 0xbc, 0x08, 0x07, 0x00, 0xbe, 0x08, + 0x07, 0x00, 0xbf, 0x08, 0x07, 0x00, 0xe4, 0x08, 0x07, 0x00, 0xe5, 0x08, + 0x07, 0x00, 0xe8, 0x08, 0x07, 0x00, 0xeb, 0x08, 0x07, 0x00, 0xec, 0x08, + 0x07, 0x00, 0xee, 0x08, 0x07, 0x00, 0xef, 0x08, 0x07, 0x00, 0xf4, 0x08, + 0x07, 0x00, 0xf5, 0x08, 0x07, 0x00, 0xf8, 0x08, 0x07, 0x00, 0xfc, 0x08, + 0x07, 0x00, 0xfe, 0x08, 0x07, 0x00, 0xff, 0x08, 0x07, 0x00, 0x38, 0x09, + 0x07, 0x00, 0x3c, 0x09, 0x07, 0x00, 0x3e, 0x09, 0x07, 0x00, 0x3f, 0x09, + 0x07, 0x00, 0x53, 0x09, 0x07, 0x00, 0x54, 0x09, 0x07, 0x00, 0x55, 0x09, + 0x07, 0x00, 0x5b, 0x09, 0x07, 0x00, 0xf3, 0x09, 0x07, 0x00, 0xfb, 0x09, + 0x07, 0x00, 0xeb, 0x0a, 0x07, 0x00, 0xf8, 0x0a, 0x07, 0x00, 0xfc, 0x0a, + 0x07, 0x00, 0xfe, 0x0a, 0x07, 0x00, 0xff, 0x0a, 0x07, 0x00, 0x34, 0x0b, + 0x07, 0x00, 0x35, 0x0b, 0x07, 0x00, 0x38, 0x0b, 0x07, 0x00, 0x3c, 0x0b, + 0x07, 0x00, 0x3e, 0x0b, 0x07, 0x00, 0x3f, 0x0b, 0x07, 0x00, 0xb4, 0x0b, + 0x07, 0x00, 0xb5, 0x0b, 0x07, 0x00, 0xb8, 0x0b, 0x07, 0x00, 0xbc, 0x0b, + 0x07, 0x00, 0xbe, 0x0b, 0x07, 0x00, 0xbf, 0x0b, 0x07, 0x00, 0xe3, 0x0b, + 0x07, 0x00, 0xf3, 0x0b, 0x07, 0x00, 0xfb, 0x0b, 0x07, 0x00, 0xe4, 0x0c, + 0x07, 0x00, 0xe5, 0x0c, 0x07, 0x00, 0xe8, 0x0c, 0x07, 0x00, 0xeb, 0x0c, + 0x07, 0x00, 0xec, 0x0c, 0x07, 0x00, 0xee, 0x0c, 0x07, 0x00, 0xef, 0x0c, + 0x07, 0x00, 0xf4, 0x0c, 0x07, 0x00, 0xf5, 0x0c, 0x07, 0x00, 0xf8, 0x0c, + 0x07, 0x00, 0xfc, 0x0c, 0x07, 0x00, 0xfe, 0x0c, 0x07, 0x00, 0xff, 0x0c, + 0x07, 0x00, 0x33, 0x0d, 0x07, 0x00, 0x3b, 0x0d, 0x07, 0x00, 0x58, 0x0d, + 0x07, 0x00, 0x5c, 0x0d, 0x07, 0x00, 0x5e, 0x0d, 0x07, 0x00, 0x5f, 0x0d, + 0x07, 0x00, 0xc3, 0x0d, 0x07, 0x00, 0xcf, 0x0d, 0x07, 0x00, 0xf8, 0x0d, + 0x07, 0x00, 0xfc, 0x0d, 0x07, 0x00, 0xfe, 0x0d, 0x07, 0x00, 0xff, 0x0d, + 0x07, 0x00, 0xeb, 0x0e, 0x07, 0x00, 0xee, 0x0e, 0x07, 0x00, 0xef, 0x0e, + 0x07, 0x00, 0xf8, 0x0e, 0x07, 0x00, 0xfc, 0x0e, 0x07, 0x00, 0xfe, 0x0e, + 0x07, 0x00, 0xff, 0x0e, 0x07, 0x00, 0x38, 0x10, 0x07, 0x00, 0x48, 0x10, + 0x07, 0x00, 0xb8, 0x10, 0x07, 0x00, 0x34, 0x11, 0x07, 0x00, 0x35, 0x11, + 0x07, 0x00, 0x38, 0x11, 0x07, 0x00, 0x3c, 0x11, 0x07, 0x00, 0x3e, 0x11, + 0x07, 0x00, 0x3f, 0x11, 0x07, 0x00, 0xb4, 0x11, 0x07, 0x00, 0xb5, 0x11, + 0x07, 0x00, 0xb8, 0x11, 0x07, 0x00, 0xbc, 0x11, 0x07, 0x00, 0xbe, 0x11, + 0x07, 0x00, 0xbf, 0x11, 0x07, 0x00, 0xf3, 0x11, 0x07, 0x00, 0xfb, 0x11, + 0x07, 0x00, 0x38, 0x12, 0x07, 0x00, 0xf8, 0x12, 0x07, 0x00, 0xfc, 0x12, + 0x07, 0x00, 0xfe, 0x12, 0x07, 0x00, 0xff, 0x12, 0x07, 0x00, 0x3e, 0x13, + 0x07, 0x00, 0x3f, 0x13, 0x07, 0x00, 0xc8, 0x13, 0x07, 0x00, 0xf3, 0x13, + 0x07, 0x00, 0xfb, 0x13, 0x07, 0x00, 0x34, 0x14, 0x07, 0x00, 0x3e, 0x14, + 0x07, 0x00, 0x3f, 0x14, 0x07, 0x00, 0xb3, 0x14, 0x07, 0x00, 0xbb, 0x14, + 0x07, 0x00, 0xe3, 0x14, 0x07, 0x00, 0xf3, 0x14, 0x07, 0x00, 0xfb, 0x14, + 0x07, 0x00, 0xb3, 0x16, 0x07, 0x00, 0xbb, 0x16, 0x07, 0x00, 0xb3, 0x17, + 0x07, 0x00, 0xbb, 0x17, 0x07, 0x00, 0xc3, 0x17, 0x07, 0x00, 0xc4, 0x17, + 0x07, 0x00, 0xc5, 0x17, 0x07, 0x00, 0xc8, 0x17, 0x07, 0x00, 0xcb, 0x17, + 0x07, 0x00, 0xcc, 0x17, 0x07, 0x00, 0xce, 0x17, 0x07, 0x00, 0xcf, 0x17, + 0x07, 0x00, 0xe4, 0x17, 0x07, 0x00, 0xe5, 0x17, 0x07, 0x00, 0xe8, 0x17, + 0x07, 0x00, 0xeb, 0x17, 0x07, 0x00, 0xec, 0x17, 0x07, 0x00, 0xee, 0x17, + 0x07, 0x00, 0xef, 0x17, 0x07, 0x00, 0xf4, 0x17, 0x07, 0x00, 0xf5, 0x17, + 0x07, 0x00, 0xf8, 0x17, 0x07, 0x00, 0xfc, 0x17, 0x07, 0x00, 0xfe, 0x17, + 0x07, 0x00, 0xff, 0x17, 0x07, 0x00, 0x3e, 0x18, 0x07, 0x00, 0x3f, 0x18, + 0x07, 0x00, 0x3e, 0x1a, 0x07, 0x00, 0x3f, 0x1a, 0x07, 0x00, 0xb4, 0x1a, + 0x07, 0x00, 0xb5, 0x1a, 0x07, 0x00, 0xb8, 0x1a, 0x07, 0x00, 0xbc, 0x1a, + 0x07, 0x00, 0xbe, 0x1a, 0x07, 0x00, 0xbf, 0x1a, 0x07, 0x00, 0x38, 0x1b, + 0x07, 0x00, 0xb8, 0x1b, 0x07, 0x00, 0xc4, 0x1b, 0x07, 0x00, 0xc5, 0x1b, + 0x07, 0x00, 0xce, 0x1b, 0x07, 0x00, 0xcf, 0x1b, 0x07, 0x00, 0xf4, 0x1b, + 0x07, 0x00, 0xf5, 0x1b, 0x07, 0x00, 0xf8, 0x1b, 0x07, 0x00, 0xfc, 0x1b, + 0x07, 0x00, 0xfe, 0x1b, 0x07, 0x00, 0xff, 0x1b, 0x07, 0x00, 0xf3, 0x1f, + 0x07, 0x00, 0xfb, 0x1f, 0x07, 0x00, 0xf8, 0x29, 0x07, 0x00, 0xfc, 0x29, + 0x07, 0x00, 0xfe, 0x29, 0x07, 0x00, 0xff, 0x29, 0x07, 0x00, 0xf8, 0x2d, + 0x07, 0x00, 0xfc, 0x2d, 0x07, 0x00, 0xfe, 0x2d, 0x07, 0x00, 0xff, 0x2d, + 0x07, 0x00, 0x30, 0x39, 0x07, 0x00, 0x31, 0x39, 0x07, 0x00, 0x39, 0x39, + 0x07, 0x00, 0x3d, 0x39, 0x07, 0x00, 0xcb, 0x39, 0x07, 0x00, 0xf7, 0x39, + 0x07, 0x00, 0xf8, 0x39, 0x07, 0x00, 0xfc, 0x39, 0x07, 0x00, 0xfe, 0x39, + 0x07, 0x00, 0xff, 0x39, 0x07, 0x00, 0x37, 0x3d, 0x07, 0x00, 0x38, 0x3d, + 0x07, 0x00, 0x3c, 0x3d, 0x07, 0x00, 0x3e, 0x3d, 0x07, 0x00, 0x3f, 0x3d, + 0x07, 0x00, 0xf0, 0x3d, 0x07, 0x00, 0xf1, 0x3d, 0x07, 0x00, 0xf9, 0x3d, + 0x07, 0x00, 0xfd, 0x3d, 0x07, 0x00, 0x48, 0x3e, 0x07, 0x00, 0x4b, 0x3e, + 0x07, 0x00, 0x88, 0x3f, 0x07, 0x00, 0x8b, 0x3f, 0x07, 0x00, 0x30, 0x40, + 0x07, 0x00, 0x31, 0x40, 0x07, 0x00, 0x39, 0x40, 0x07, 0x00, 0x3d, 0x40, + 0x07, 0x00, 0xb7, 0x40, 0x07, 0x00, 0xb8, 0x40, 0x07, 0x00, 0xbc, 0x40, + 0x07, 0x00, 0xbe, 0x40, 0x07, 0x00, 0xbf, 0x40, 0x07, 0x00, 0x37, 0x41, + 0x07, 0x00, 0x38, 0x41, 0x07, 0x00, 0x3c, 0x41, 0x07, 0x00, 0x3e, 0x41, + 0x07, 0x00, 0x3f, 0x41, 0x07, 0x00, 0x4b, 0x41, 0x07, 0x00, 0xf0, 0x41, + 0x07, 0x00, 0xf1, 0x41, 0x07, 0x00, 0xf9, 0x41, 0x07, 0x00, 0xfd, 0x41, + 0x07, 0x00, 0x30, 0x42, 0x07, 0x00, 0x31, 0x42, 0x07, 0x00, 0x39, 0x42, + 0x07, 0x00, 0x3d, 0x42, 0x07, 0x00, 0x4b, 0x42, 0x07, 0x00, 0xb8, 0x42, + 0x07, 0x00, 0xbc, 0x42, 0x07, 0x00, 0xbe, 0x42, 0x07, 0x00, 0xbf, 0x42, + 0x07, 0x00, 0x4b, 0x43, 0x07, 0x00, 0x37, 0x45, 0x07, 0x00, 0x38, 0x45, + 0x07, 0x00, 0x3c, 0x45, 0x07, 0x00, 0x3e, 0x45, 0x07, 0x00, 0x3f, 0x45, + 0x07, 0x00, 0xb8, 0x45, 0x07, 0x00, 0xbc, 0x45, 0x07, 0x00, 0xbe, 0x45, + 0x07, 0x00, 0xbf, 0x45, 0x07, 0x00, 0xf0, 0x45, 0x07, 0x00, 0xf1, 0x45, + 0x07, 0x00, 0xf9, 0x45, 0x07, 0x00, 0xfd, 0x45, 0x07, 0x00, 0xb7, 0x47, + 0x07, 0x00, 0xb8, 0x47, 0x07, 0x00, 0xbc, 0x47, 0x07, 0x00, 0xbe, 0x47, + 0x07, 0x00, 0xbf, 0x47, 0x07, 0x00, 0xb0, 0x48, 0x07, 0x00, 0xbd, 0x48, + 0x07, 0x00, 0xbe, 0x48, 0x07, 0x00, 0xbf, 0x48, 0x07, 0x00, 0xeb, 0x48, + 0x07, 0x00, 0xf8, 0x48, 0x07, 0x00, 0xfc, 0x48, 0x07, 0x00, 0xfe, 0x48, + 0x07, 0x00, 0xff, 0x48, 0x07, 0x00, 0x37, 0x49, 0x07, 0x00, 0x50, 0x49, + 0x07, 0x00, 0x51, 0x49, 0x07, 0x00, 0x56, 0x49, 0x07, 0x00, 0x57, 0x49, + 0x07, 0x00, 0x5f, 0x49, 0x07, 0x00, 0xff, 0x49, 0x07, 0x00, 0xb7, 0x4a, + 0x07, 0x00, 0x30, 0x4b, 0x07, 0x00, 0x3d, 0x4b, 0x07, 0x00, 0x3e, 0x4b, + 0x07, 0x00, 0x3f, 0x4b, 0x07, 0x00, 0xb1, 0x4b, 0x07, 0x00, 0xb7, 0x4b, + 0x07, 0x00, 0xb8, 0x4b, 0x07, 0x00, 0xe7, 0x4b, 0x07, 0x00, 0xf0, 0x4b, + 0x07, 0x00, 0xf1, 0x4b, 0x07, 0x00, 0xf7, 0x4b, 0x07, 0x00, 0xf9, 0x4b, + 0x07, 0x00, 0xfd, 0x4b, 0x07, 0x00, 0x37, 0x4c, 0x07, 0x00, 0xf8, 0x4c, + 0x07, 0x00, 0xfc, 0x4c, 0x07, 0x00, 0xfe, 0x4c, 0x07, 0x00, 0xff, 0x4c, + 0x07, 0x00, 0x37, 0x4d, 0x07, 0x00, 0x51, 0x4d, 0x07, 0x00, 0x56, 0x4d, + 0x07, 0x00, 0x57, 0x4d, 0x07, 0x00, 0x5f, 0x4d, 0x07, 0x00, 0xff, 0x4d, + 0x07, 0x00, 0x37, 0x4e, 0x07, 0x00, 0xff, 0x4e, 0x07, 0x00, 0x30, 0x4f, + 0x07, 0x00, 0x31, 0x4f, 0x07, 0x00, 0x37, 0x4f, 0x07, 0x00, 0x39, 0x4f, + 0x07, 0x00, 0x3d, 0x4f, 0x07, 0x00, 0x4b, 0x52, 0x07, 0x00, 0xb8, 0x52, + 0x07, 0x00, 0xbc, 0x52, 0x07, 0x00, 0xbe, 0x52, 0x07, 0x00, 0xbf, 0x52, + 0x07, 0x00, 0x37, 0x55, 0x07, 0x00, 0x50, 0x55, 0x07, 0x00, 0x51, 0x55, + 0x07, 0x00, 0x56, 0x55, 0x07, 0x00, 0x57, 0x55, 0x07, 0x00, 0x5f, 0x55, + 0x07, 0x00, 0xff, 0x55, 0x07, 0x00, 0x37, 0x59, 0x07, 0x00, 0x38, 0x59, + 0x07, 0x00, 0x3c, 0x59, 0x07, 0x00, 0x3e, 0x59, 0x07, 0x00, 0x3f, 0x59, + 0x07, 0x00, 0xf0, 0x59, 0x07, 0x00, 0xf1, 0x59, 0x07, 0x00, 0xf9, 0x59, + 0x07, 0x00, 0xfd, 0x59, 0x07, 0x00, 0x4b, 0x5c, 0x07, 0x00, 0xb8, 0x5c, + 0x07, 0x00, 0xbc, 0x5c, 0x07, 0x00, 0xbe, 0x5c, 0x07, 0x00, 0xbf, 0x5c, + 0x07, 0x00, 0x30, 0x5d, 0x07, 0x00, 0x31, 0x5d, 0x07, 0x00, 0x39, 0x5d, + 0x07, 0x00, 0x3d, 0x5d, 0x07, 0x00, 0xcb, 0x5d, 0x07, 0x00, 0xf7, 0x5d, + 0x07, 0x00, 0xf8, 0x5d, 0x07, 0x00, 0xfc, 0x5d, 0x07, 0x00, 0xfe, 0x5d, + 0x07, 0x00, 0xff, 0x5d, 0x07, 0x00, 0xb8, 0x5e, 0x07, 0x00, 0xbc, 0x5e, + 0x07, 0x00, 0xbe, 0x5e, 0x07, 0x00, 0xbf, 0x5e, 0x07, 0x00, 0x38, 0x60, + 0x07, 0x00, 0xb4, 0x60, 0x07, 0x00, 0xbe, 0x60, 0x07, 0x00, 0xbf, 0x60, + 0x07, 0x00, 0x38, 0x61, 0x07, 0x00, 0x3c, 0x61, 0x07, 0x00, 0x3e, 0x61, + 0x07, 0x00, 0x3f, 0x61, 0x07, 0x00, 0x43, 0x61, 0x07, 0x00, 0x4f, 0x61, + 0x07, 0x00, 0xb8, 0x61, 0x07, 0x00, 0xbc, 0x61, 0x07, 0x00, 0xbe, 0x61, + 0x07, 0x00, 0xbf, 0x61, 0x07, 0x00, 0xf3, 0x61, 0x07, 0x00, 0xfb, 0x61, + 0x07, 0x00, 0x33, 0x65, 0x07, 0x00, 0x3b, 0x65, 0x07, 0x00, 0x3f, 0x65, + 0x07, 0x00, 0xf3, 0x65, 0x07, 0x00, 0xfb, 0x65, 0x07, 0x00, 0xff, 0x66, + 0x07, 0x00, 0x33, 0x67, 0x07, 0x00, 0x3b, 0x67, 0x07, 0x00, 0x83, 0x67, + 0x07, 0x00, 0x8e, 0x67, 0x07, 0x00, 0x8f, 0x67, 0x07, 0x00, 0xb4, 0x68, + 0x07, 0x00, 0xbe, 0x68, 0x07, 0x00, 0xbf, 0x68, 0x07, 0x00, 0xcf, 0x68, + 0x07, 0x00, 0xf8, 0x68, 0x07, 0x00, 0xfc, 0x68, 0x07, 0x00, 0xfe, 0x68, + 0x07, 0x00, 0xff, 0x68, 0x07, 0x00, 0x33, 0x69, 0x07, 0x00, 0x3b, 0x69, + 0x07, 0x00, 0xf8, 0x69, 0x07, 0x00, 0xfc, 0x69, 0x07, 0x00, 0xfe, 0x69, + 0x07, 0x00, 0xff, 0x69, 0x07, 0x00, 0x3e, 0x6a, 0x07, 0x00, 0x3f, 0x6a, + 0x07, 0x00, 0xb8, 0x6a, 0x07, 0x00, 0xbc, 0x6a, 0x07, 0x00, 0xbe, 0x6a, + 0x07, 0x00, 0xbf, 0x6a, 0x07, 0x00, 0x34, 0x6b, 0x07, 0x00, 0x3e, 0x6b, + 0x07, 0x00, 0x3f, 0x6b, 0x07, 0x00, 0xb4, 0x6b, 0x07, 0x00, 0xbe, 0x6b, + 0x07, 0x00, 0xbf, 0x6b, 0x07, 0x00, 0xf3, 0x6b, 0x07, 0x00, 0xfb, 0x6b, + 0x07, 0x00, 0x34, 0x6c, 0x07, 0x00, 0x3e, 0x6c, 0x07, 0x00, 0x3f, 0x6c, + 0x07, 0x00, 0xf3, 0x6c, 0x07, 0x00, 0xfb, 0x6c, 0x07, 0x00, 0x38, 0x6d, + 0x07, 0x00, 0xf8, 0x6d, 0x07, 0x00, 0xfc, 0x6d, 0x07, 0x00, 0xfe, 0x6d, + 0x07, 0x00, 0xff, 0x6d, 0x07, 0x00, 0x38, 0x6e, 0x07, 0x00, 0x3c, 0x6e, + 0x07, 0x00, 0x3e, 0x6e, 0x07, 0x00, 0x3f, 0x6e, 0x07, 0x00, 0xf3, 0x6e, + 0x07, 0x00, 0xfb, 0x6e, 0x07, 0x00, 0x33, 0x6f, 0x07, 0x00, 0x3b, 0x6f, + 0x07, 0x00, 0x33, 0x70, 0x07, 0x00, 0x3b, 0x70, 0x07, 0x00, 0x3f, 0x70, + 0x07, 0x00, 0x4f, 0x70, 0x07, 0x00, 0xb4, 0x70, 0x07, 0x00, 0xb8, 0x70, + 0x07, 0x00, 0x33, 0x71, 0x07, 0x00, 0x3b, 0x71, 0x07, 0x00, 0x5b, 0x71, + 0x07, 0x00, 0xb3, 0x71, 0x07, 0x00, 0xbb, 0x71, 0x07, 0x00, 0xff, 0x71, + 0x07, 0x00, 0x3f, 0x72, 0x07, 0x00, 0xcb, 0x72, 0x07, 0x00, 0xeb, 0x72, + 0x07, 0x00, 0x3e, 0x73, 0x07, 0x00, 0x3f, 0x73, 0x07, 0x00, 0xf3, 0x73, + 0x07, 0x00, 0xfb, 0x73, 0x07, 0x00, 0x33, 0x74, 0x07, 0x00, 0x3b, 0x74, + 0x07, 0x00, 0x3f, 0x74, 0x07, 0x00, 0xb3, 0x74, 0x07, 0x00, 0xbb, 0x74, + 0x07, 0x00, 0xe3, 0x74, 0x07, 0x00, 0xeb, 0x74, 0x07, 0x00, 0xf3, 0x74, + 0x07, 0x00, 0xfb, 0x74, 0x07, 0x00, 0xb3, 0x76, 0x07, 0x00, 0xbb, 0x76, + 0x07, 0x00, 0xb3, 0x77, 0x07, 0x00, 0xbb, 0x77, 0x07, 0x00, 0xce, 0x77, + 0x07, 0x00, 0xcf, 0x77, 0x07, 0x00, 0xee, 0x77, 0x07, 0x00, 0xef, 0x77, + 0x07, 0x00, 0xf8, 0x77, 0x07, 0x00, 0xfc, 0x77, 0x07, 0x00, 0xfe, 0x77, + 0x07, 0x00, 0xff, 0x77, 0x07, 0x00, 0xb3, 0x7a, 0x07, 0x00, 0xbb, 0x7a, + 0x07, 0x00, 0xff, 0x7a, 0x07, 0x00, 0x34, 0x7b, 0x07, 0x00, 0x38, 0x7b, + 0x07, 0x00, 0xb4, 0x7b, 0x07, 0x00, 0xb8, 0x7b, 0x07, 0x00, 0xee, 0x7b, + 0x07, 0x00, 0xef, 0x7b, 0x07, 0x00, 0xf8, 0x7b, 0x07, 0x00, 0xfc, 0x7b, + 0x07, 0x00, 0xfe, 0x7b, 0x07, 0x00, 0xff, 0x7b, 0x07, 0x00, 0xc3, 0x7f, + 0x07, 0x00, 0xcb, 0x7f, 0x07, 0x00, 0xe3, 0x7f, 0x07, 0x00, 0xeb, 0x7f, + 0x07, 0x00, 0xf3, 0x7f, 0x07, 0x00, 0xfb, 0x7f, 0x07, 0x00, 0xc3, 0x83, + 0x07, 0x00, 0xc4, 0x83, 0x07, 0x00, 0xc5, 0x83, 0x07, 0x00, 0xc6, 0x83, + 0x07, 0x00, 0xc7, 0x83, 0x07, 0x00, 0xc8, 0x83, 0x07, 0x00, 0xcb, 0x83, + 0x07, 0x00, 0xcc, 0x83, 0x07, 0x00, 0xce, 0x83, 0x07, 0x00, 0xcf, 0x83, + 0x07, 0x00, 0xf2, 0x83, 0x07, 0x00, 0xf4, 0x83, 0x07, 0x00, 0xf5, 0x83, + 0x07, 0x00, 0xf6, 0x83, 0x07, 0x00, 0xf7, 0x83, 0x07, 0x00, 0xf8, 0x83, + 0x07, 0x00, 0xfa, 0x83, 0x07, 0x00, 0xfc, 0x83, 0x07, 0x00, 0xfe, 0x83, + 0x07, 0x00, 0xff, 0x83, 0x07, 0x00, 0x36, 0x84, 0x07, 0x00, 0x37, 0x84, + 0x07, 0x00, 0x38, 0x84, 0x07, 0x00, 0x3c, 0x84, 0x07, 0x00, 0x3e, 0x84, + 0x07, 0x00, 0x3f, 0x84, 0x07, 0x00, 0x32, 0x85, 0x07, 0x00, 0x34, 0x85, + 0x07, 0x00, 0x35, 0x85, 0x07, 0x00, 0x36, 0x85, 0x07, 0x00, 0x37, 0x85, + 0x07, 0x00, 0x38, 0x85, 0x07, 0x00, 0x3a, 0x85, 0x07, 0x00, 0x3c, 0x85, + 0x07, 0x00, 0x3e, 0x85, 0x07, 0x00, 0x3f, 0x85, 0x07, 0x00, 0xb4, 0x85, + 0x07, 0x00, 0xb5, 0x85, 0x07, 0x00, 0xb8, 0x85, 0x07, 0x00, 0xbc, 0x85, + 0x07, 0x00, 0xbe, 0x85, 0x07, 0x00, 0xbf, 0x85, 0x07, 0x00, 0xc0, 0x85, + 0x07, 0x00, 0xc1, 0x85, 0x07, 0x00, 0xc2, 0x85, 0x07, 0x00, 0xc9, 0x85, + 0x07, 0x00, 0xca, 0x85, 0x07, 0x00, 0xcd, 0x85, 0x07, 0x00, 0xf0, 0x85, + 0x07, 0x00, 0xf1, 0x85, 0x07, 0x00, 0xf3, 0x85, 0x07, 0x00, 0xf9, 0x85, + 0x07, 0x00, 0xfb, 0x85, 0x07, 0x00, 0xfd, 0x85, 0x07, 0x00, 0xc6, 0x86, + 0x07, 0x00, 0xc7, 0x86, 0x07, 0x00, 0xc8, 0x86, 0x07, 0x00, 0xcb, 0x86, + 0x07, 0x00, 0xf6, 0x86, 0x07, 0x00, 0xf7, 0x86, 0x07, 0x00, 0xf8, 0x86, + 0x07, 0x00, 0xfc, 0x86, 0x07, 0x00, 0xfe, 0x86, 0x07, 0x00, 0xff, 0x86, + 0x07, 0x00, 0xb0, 0x87, 0x07, 0x00, 0xb1, 0x87, 0x07, 0x00, 0xb3, 0x87, + 0x07, 0x00, 0xb9, 0x87, 0x07, 0x00, 0xbb, 0x87, 0x07, 0x00, 0xbd, 0x87, + 0x07, 0x00, 0xf0, 0x8a, 0x07, 0x00, 0xf1, 0x8a, 0x07, 0x00, 0xf9, 0x8a, + 0x07, 0x00, 0xfd, 0x8a, 0x07, 0x00, 0x30, 0x8b, 0x07, 0x00, 0x31, 0x8b, + 0x07, 0x00, 0x33, 0x8b, 0x07, 0x00, 0x39, 0x8b, 0x07, 0x00, 0x3b, 0x8b, + 0x07, 0x00, 0x3d, 0x8b, 0x07, 0x00, 0xb2, 0x8b, 0x07, 0x00, 0xb4, 0x8b, + 0x07, 0x00, 0xb5, 0x8b, 0x07, 0x00, 0xb6, 0x8b, 0x07, 0x00, 0xb7, 0x8b, + 0x07, 0x00, 0xb8, 0x8b, 0x07, 0x00, 0xba, 0x8b, 0x07, 0x00, 0xbc, 0x8b, + 0x07, 0x00, 0xbe, 0x8b, 0x07, 0x00, 0xbf, 0x8b, 0x07, 0x00, 0xe0, 0x8b, + 0x07, 0x00, 0xe1, 0x8b, 0x07, 0x00, 0xe2, 0x8b, 0x07, 0x00, 0xe4, 0x8b, + 0x07, 0x00, 0xe5, 0x8b, 0x07, 0x00, 0xe6, 0x8b, 0x07, 0x00, 0xe7, 0x8b, + 0x07, 0x00, 0xe8, 0x8b, 0x07, 0x00, 0xeb, 0x8b, 0x07, 0x00, 0xec, 0x8b, + 0x07, 0x00, 0xee, 0x8b, 0x07, 0x00, 0xef, 0x8b, 0x07, 0x00, 0xf2, 0x8b, + 0x07, 0x00, 0xf4, 0x8b, 0x07, 0x00, 0xf5, 0x8b, 0x07, 0x00, 0xf6, 0x8b, + 0x07, 0x00, 0xf7, 0x8b, 0x07, 0x00, 0xf8, 0x8b, 0x07, 0x00, 0xfa, 0x8b, + 0x07, 0x00, 0xfc, 0x8b, 0x07, 0x00, 0xfe, 0x8b, 0x07, 0x00, 0xff, 0x8b, + 0x07, 0x00, 0xe3, 0x8f, 0x07, 0x00, 0xe9, 0x8f, 0x07, 0x00, 0xea, 0x8f, + 0x07, 0x00, 0xed, 0x8f, 0x07, 0x00, 0xf0, 0x8f, 0x07, 0x00, 0xf1, 0x8f, + 0x07, 0x00, 0xf3, 0x8f, 0x07, 0x00, 0xf9, 0x8f, 0x07, 0x00, 0xfb, 0x8f, + 0x07, 0x00, 0xfd, 0x8f, 0x07, 0x00, 0x34, 0x99, 0x07, 0x00, 0x35, 0x99, + 0x07, 0x00, 0x38, 0x99, 0x07, 0x00, 0x3c, 0x99, 0x07, 0x00, 0x3e, 0x99, + 0x07, 0x00, 0x3f, 0x99, 0x07, 0x00, 0xf3, 0x99, 0x07, 0x00, 0xfb, 0x99, + 0x07, 0x00, 0x3e, 0x9c, 0x07, 0x00, 0x3f, 0x9c, 0x07, 0x00, 0xc8, 0x9c, + 0x07, 0x00, 0xcb, 0x9c, 0x07, 0x00, 0xf8, 0x9c, 0x07, 0x00, 0xfc, 0x9c, + 0x07, 0x00, 0xfe, 0x9c, 0x07, 0x00, 0xff, 0x9c, 0x07, 0x00, 0x3e, 0x9d, + 0x07, 0x00, 0x3f, 0x9d, 0x07, 0x00, 0xf3, 0x9d, 0x07, 0x00, 0xfb, 0x9d, + 0x07, 0x00, 0x38, 0x9e, 0x07, 0x00, 0x3c, 0x9e, 0x07, 0x00, 0x3e, 0x9e, + 0x07, 0x00, 0x3f, 0x9e, 0x07, 0x00, 0x33, 0x9f, 0x07, 0x00, 0x3b, 0x9f, + 0x07, 0x00, 0xcb, 0xa5, 0x07, 0x00, 0xf8, 0xa5, 0x07, 0x00, 0xfc, 0xa5, + 0x07, 0x00, 0xfe, 0xa5, 0x07, 0x00, 0xff, 0xa5, 0x07, 0x00, 0xb8, 0xaa, + 0x07, 0x00, 0xbc, 0xaa, 0x07, 0x00, 0xbe, 0xaa, 0x07, 0x00, 0xbf, 0xaa, + 0x07, 0x00, 0x38, 0xab, 0x07, 0x00, 0xb8, 0xab, 0x07, 0x00, 0xf8, 0xab, + 0x07, 0x00, 0xfc, 0xab, 0x07, 0x00, 0xfe, 0xab, 0x07, 0x00, 0xff, 0xab, + 0x07, 0x00, 0xf8, 0xaf, 0x07, 0x00, 0xfc, 0xaf, 0x07, 0x00, 0xfe, 0xaf, + 0x07, 0x00, 0xff, 0xaf, 0x07, 0x00, 0x30, 0xb3, 0x07, 0x00, 0x31, 0xb3, + 0x07, 0x00, 0x39, 0xb3, 0x07, 0x00, 0x3d, 0xb3, 0x07, 0x00, 0xe6, 0xb3, + 0x07, 0x00, 0xe7, 0xb3, 0x07, 0x00, 0xe8, 0xb3, 0x07, 0x00, 0xeb, 0xb3, + 0x07, 0x00, 0xf6, 0xb3, 0x07, 0x00, 0xf7, 0xb3, 0x07, 0x00, 0xf8, 0xb3, + 0x07, 0x00, 0xfc, 0xb3, 0x07, 0x00, 0xfe, 0xb3, 0x07, 0x00, 0xff, 0xb3, + 0x07, 0x00, 0xf0, 0xb5, 0x07, 0x00, 0xf1, 0xb5, 0x07, 0x00, 0xf9, 0xb5, + 0x07, 0x00, 0xfd, 0xb5, 0x07, 0x00, 0xb8, 0xb9, 0x07, 0x00, 0xbc, 0xb9, + 0x07, 0x00, 0xbe, 0xb9, 0x07, 0x00, 0xbf, 0xb9, 0x07, 0x00, 0x30, 0xbb, + 0x07, 0x00, 0x31, 0xbb, 0x07, 0x00, 0x39, 0xbb, 0x07, 0x00, 0x3d, 0xbb, + 0x07, 0x00, 0xb6, 0xbb, 0x07, 0x00, 0xb7, 0xbb, 0x07, 0x00, 0xb8, 0xbb, + 0x07, 0x00, 0xbc, 0xbb, 0x07, 0x00, 0xbe, 0xbb, 0x07, 0x00, 0xbf, 0xbb, + 0x07, 0x00, 0xe6, 0xbb, 0x07, 0x00, 0xe7, 0xbb, 0x07, 0x00, 0xe8, 0xbb, + 0x07, 0x00, 0xeb, 0xbb, 0x07, 0x00, 0xf6, 0xbb, 0x07, 0x00, 0xf7, 0xbb, + 0x07, 0x00, 0xf8, 0xbb, 0x07, 0x00, 0xfc, 0xbb, 0x07, 0x00, 0xfe, 0xbb, + 0x07, 0x00, 0xff, 0xbb, 0x07, 0x00, 0x36, 0xbf, 0x07, 0x00, 0x37, 0xbf, + 0x07, 0x00, 0x38, 0xbf, 0x07, 0x00, 0x3c, 0xbf, 0x07, 0x00, 0x3e, 0xbf, + 0x07, 0x00, 0x3f, 0xbf, 0x07, 0x00, 0xb8, 0xbf, 0x07, 0x00, 0xbc, 0xbf, + 0x07, 0x00, 0xbe, 0xbf, 0x07, 0x00, 0xbf, 0xbf, 0x07, 0x00, 0xe9, 0xbf, + 0x07, 0x00, 0xea, 0xbf, 0x07, 0x00, 0xf0, 0xbf, 0x07, 0x00, 0xf1, 0xbf, + 0x07, 0x00, 0xf9, 0xbf, 0x07, 0x00, 0xfd, 0xbf, 0x07, 0x00, 0xb4, 0xc2, + 0x07, 0x00, 0xb5, 0xc2, 0x07, 0x00, 0xb8, 0xc2, 0x07, 0x00, 0xbc, 0xc2, + 0x07, 0x00, 0xbe, 0xc2, 0x07, 0x00, 0xbf, 0xc2, 0x07, 0x00, 0xf2, 0xc9, + 0x07, 0x00, 0xf7, 0xc9, 0x07, 0x00, 0xf8, 0xc9, 0x07, 0x00, 0xfa, 0xc9, + 0x07, 0x00, 0xfc, 0xc9, 0x07, 0x00, 0xfe, 0xc9, 0x07, 0x00, 0xff, 0xc9, + 0x07, 0x00, 0xb3, 0xcc, 0x07, 0x00, 0xbb, 0xcc, 0x07, 0x00, 0xf2, 0xcd, + 0x07, 0x00, 0xf7, 0xcd, 0x07, 0x00, 0xf8, 0xcd, 0x07, 0x00, 0xfa, 0xcd, + 0x07, 0x00, 0xfc, 0xcd, 0x07, 0x00, 0xfe, 0xcd, 0x07, 0x00, 0xff, 0xcd, + 0x07, 0x00, 0xb3, 0xce, 0x07, 0x00, 0xbb, 0xce, 0x07, 0x00, 0x34, 0xd9, + 0x07, 0x00, 0x35, 0xd9, 0x07, 0x00, 0x38, 0xd9, 0x07, 0x00, 0x3c, 0xd9, + 0x07, 0x00, 0x3e, 0xd9, 0x07, 0x00, 0x3f, 0xd9, 0x07, 0x00, 0xf3, 0xd9, + 0x07, 0x00, 0xfb, 0xd9, 0x07, 0x00, 0xc8, 0xdc, 0x07, 0x00, 0xcb, 0xdc, + 0x07, 0x00, 0xf8, 0xdc, 0x07, 0x00, 0xfc, 0xdc, 0x07, 0x00, 0xfe, 0xdc, + 0x07, 0x00, 0xff, 0xdc, 0x07, 0x00, 0x33, 0xdd, 0x07, 0x00, 0x3b, 0xdd, + 0x07, 0x00, 0xc3, 0xdd, 0x07, 0x00, 0xc4, 0xdd, 0x07, 0x00, 0xc5, 0xdd, + 0x07, 0x00, 0xc8, 0xdd, 0x07, 0x00, 0xcb, 0xdd, 0x07, 0x00, 0xcc, 0xdd, + 0x07, 0x00, 0xce, 0xdd, 0x07, 0x00, 0xcf, 0xdd, 0x07, 0x00, 0xf4, 0xdd, + 0x07, 0x00, 0xf5, 0xdd, 0x07, 0x00, 0xf8, 0xdd, 0x07, 0x00, 0xfc, 0xdd, + 0x07, 0x00, 0xfe, 0xdd, 0x07, 0x00, 0xff, 0xdd, 0x07, 0x00, 0xb8, 0xe5, + 0x07, 0x00, 0xf0, 0xe9, 0x07, 0x00, 0xf1, 0xe9, 0x07, 0x00, 0xf3, 0xe9, + 0x07, 0x00, 0xf9, 0xe9, 0x07, 0x00, 0xfb, 0xe9, 0x07, 0x00, 0xfd, 0xe9, + 0x07, 0x00, 0xb3, 0xec, 0x07, 0x00, 0xbb, 0xec, 0x07, 0x00, 0xf0, 0xed, + 0x07, 0x00, 0xf1, 0xed, 0x07, 0x00, 0xf3, 0xed, 0x07, 0x00, 0xf9, 0xed, + 0x07, 0x00, 0xfb, 0xed, 0x07, 0x00, 0xfd, 0xed, 0x07, 0x00, 0xb4, 0xee, + 0x07, 0x00, 0xb5, 0xee, 0x07, 0x00, 0xb8, 0xee, 0x07, 0x00, 0xbc, 0xee, + 0x07, 0x00, 0xbe, 0xee, 0x07, 0x00, 0xbf, 0xee, 0x07, 0x00, 0x8e, 0xf3, + 0x07, 0x00, 0x8f, 0xf3, 0x07, 0x00, 0x31, 0xf9, 0x07, 0x00, 0x33, 0xf9, + 0x07, 0x00, 0x39, 0xf9, 0x07, 0x00, 0x3b, 0xf9, 0x07, 0x00, 0x3d, 0xf9, + 0x07, 0x00, 0x50, 0xf9, 0x07, 0x00, 0x51, 0xf9, 0x07, 0x00, 0x56, 0xf9, + 0x07, 0x00, 0x57, 0xf9, 0x07, 0x00, 0x59, 0xf9, 0x07, 0x00, 0x5d, 0xf9, + 0x07, 0x00, 0xb3, 0xf9, 0x07, 0x00, 0xbb, 0xf9, 0x07, 0x00, 0xf2, 0xf9, + 0x07, 0x00, 0xf7, 0xf9, 0x07, 0x00, 0xf8, 0xf9, 0x07, 0x00, 0xfa, 0xf9, + 0x07, 0x00, 0xfc, 0xf9, 0x07, 0x00, 0xfe, 0xf9, 0x07, 0x00, 0xff, 0xf9, + 0x07, 0x00, 0x31, 0xfc, 0x07, 0x00, 0x38, 0xfc, 0x07, 0x00, 0xb3, 0xfc, + 0x07, 0x00, 0xbb, 0xfc, 0x07, 0x00, 0xe6, 0xfc, 0x07, 0x00, 0xe7, 0xfc, + 0x07, 0x00, 0xe8, 0xfc, 0x07, 0x00, 0xeb, 0xfc, 0x07, 0x00, 0xf6, 0xfc, + 0x07, 0x00, 0xf7, 0xfc, 0x07, 0x00, 0xf8, 0xfc, 0x07, 0x00, 0xfc, 0xfc, + 0x07, 0x00, 0xfe, 0xfc, 0x07, 0x00, 0xff, 0xfc, 0x07, 0x00, 0x31, 0xfd, + 0x07, 0x00, 0x38, 0xfd, 0x07, 0x00, 0x51, 0xfd, 0x07, 0x00, 0x56, 0xfd, + 0x07, 0x00, 0x57, 0xfd, 0x07, 0x00, 0x59, 0xfd, 0x07, 0x00, 0x5d, 0xfd, + 0x07, 0x00, 0xb8, 0xfd, 0x07, 0x00, 0xf2, 0xfd, 0x07, 0x00, 0xf7, 0xfd, + 0x07, 0x00, 0xf8, 0xfd, 0x07, 0x00, 0xfa, 0xfd, 0x07, 0x00, 0xfc, 0xfd, + 0x07, 0x00, 0xfe, 0xfd, 0x07, 0x00, 0xff, 0xfd, 0x07, 0x00, 0x30, 0xfe, + 0x07, 0x00, 0x31, 0xfe, 0x07, 0x00, 0x39, 0xfe, 0x07, 0x00, 0x3d, 0xfe, + 0x07, 0x00, 0xb3, 0xfe, 0x07, 0x00, 0xbb, 0xfe, 0x07, 0x00, 0xe7, 0xfe, + 0x07, 0x00, 0xeb, 0xfe, 0x07, 0x00, 0xf7, 0xfe, 0x07, 0x00, 0xf8, 0xfe, + 0x07, 0x00, 0xfc, 0xfe, 0x07, 0x00, 0xfe, 0xfe, 0x07, 0x00, 0xff, 0xfe, + 0x07, 0x00, 0x30, 0xff, 0x07, 0x00, 0x31, 0xff, 0x07, 0x00, 0x33, 0xff, + 0x07, 0x00, 0x39, 0xff, 0x07, 0x00, 0x3b, 0xff, 0x07, 0x00, 0x3d, 0xff, + 0x07, 0x00, 0xb3, 0xff, 0x07, 0x00, 0xbb, 0xff, 0x07, 0x00, 0x3e, 0x00, + 0x08, 0x00, 0x3f, 0x00, 0x08, 0x00, 0x4b, 0x00, 0x08, 0x00, 0x78, 0x00, + 0x08, 0x00, 0x7c, 0x00, 0x08, 0x00, 0x7e, 0x00, 0x08, 0x00, 0x7f, 0x00, + 0x08, 0x00, 0xbe, 0x00, 0x08, 0x00, 0xbf, 0x00, 0x08, 0x00, 0xeb, 0x00, + 0x08, 0x00, 0x3e, 0x02, 0x08, 0x00, 0x3f, 0x02, 0x08, 0x00, 0xcb, 0x02, + 0x08, 0x00, 0xeb, 0x02, 0x08, 0x00, 0x38, 0x05, 0x08, 0x00, 0xf8, 0x05, + 0x08, 0x00, 0xfc, 0x05, 0x08, 0x00, 0xfe, 0x05, 0x08, 0x00, 0xff, 0x05, + 0x08, 0x00, 0x38, 0x07, 0x08, 0x00, 0x9f, 0x07, 0x08, 0x00, 0xab, 0x07, + 0x08, 0x00, 0xdf, 0x07, 0x08, 0x00, 0x4b, 0x08, 0x08, 0x00, 0xb8, 0x08, + 0x08, 0x00, 0x5f, 0x09, 0x08, 0x00, 0xff, 0x09, 0x08, 0x00, 0x78, 0x0a, + 0x08, 0x00, 0x7c, 0x0a, 0x08, 0x00, 0x7e, 0x0a, 0x08, 0x00, 0x7f, 0x0a, + 0x08, 0x00, 0x9f, 0x0b, 0x08, 0x00, 0xeb, 0x0c, 0x08, 0x00, 0xf8, 0x0c, + 0x08, 0x00, 0xfc, 0x0c, 0x08, 0x00, 0xfe, 0x0c, 0x08, 0x00, 0xff, 0x0c, + 0x08, 0x00, 0x5f, 0x0d, 0x08, 0x00, 0xff, 0x0d, 0x08, 0x00, 0xeb, 0x0e, + 0x08, 0x00, 0xff, 0x0e, 0x08, 0x00, 0xcb, 0x0f, 0x08, 0x00, 0xeb, 0x0f, + 0x08, 0x00, 0xf8, 0x0f, 0x08, 0x00, 0xfc, 0x0f, 0x08, 0x00, 0xfe, 0x0f, + 0x08, 0x00, 0xff, 0x0f, 0x08, 0x00, 0x3e, 0x10, 0x08, 0x00, 0x3f, 0x10, + 0x08, 0x00, 0x4b, 0x10, 0x08, 0x00, 0x78, 0x10, 0x08, 0x00, 0xbe, 0x10, + 0x08, 0x00, 0xbf, 0x10, 0x08, 0x00, 0xdf, 0x10, 0x08, 0x00, 0xeb, 0x10, + 0x08, 0x00, 0xfe, 0x10, 0x08, 0x00, 0xff, 0x10, 0x08, 0x00, 0x38, 0x13, + 0x08, 0x00, 0xf8, 0x13, 0x08, 0x00, 0xb8, 0x14, 0x08, 0x00, 0x2b, 0x16, + 0x08, 0x00, 0xdf, 0x16, 0x08, 0x00, 0xeb, 0x16, 0x08, 0x00, 0x1f, 0x17, + 0x08, 0x00, 0x2b, 0x17, 0x08, 0x00, 0xb8, 0x17, 0x08, 0x00, 0xcb, 0x17, + 0x08, 0x00, 0xeb, 0x17, 0x08, 0x00, 0x7e, 0x1a, 0x08, 0x00, 0x7f, 0x1a, + 0x08, 0x00, 0x38, 0x1f, 0x08, 0x00, 0x38, 0x21, 0x08, 0x00, 0xb8, 0x21, + 0x08, 0x00, 0xf8, 0x21, 0x08, 0x00, 0xfc, 0x21, 0x08, 0x00, 0xfe, 0x21, + 0x08, 0x00, 0xff, 0x21, 0x08, 0x00, 0x3e, 0x22, 0x08, 0x00, 0x3f, 0x22, + 0x08, 0x00, 0xcb, 0x22, 0x08, 0x00, 0xeb, 0x22, 0x08, 0x00, 0xb8, 0x24, + 0x08, 0x00, 0x3f, 0x25, 0x08, 0x00, 0xb8, 0x27, 0x08, 0x00, 0xcb, 0x27, + 0x08, 0x00, 0xeb, 0x27, 0x08, 0x00, 0xf8, 0x27, 0x08, 0x00, 0xfc, 0x27, + 0x08, 0x00, 0xfe, 0x27, 0x08, 0x00, 0xff, 0x27, 0x08, 0x00, 0x38, 0x28, + 0x08, 0x00, 0xf8, 0x28, 0x08, 0x00, 0x3e, 0x29, 0x08, 0x00, 0x3f, 0x29, + 0x08, 0x00, 0xf8, 0x29, 0x08, 0x00, 0xfc, 0x29, 0x08, 0x00, 0xfe, 0x29, + 0x08, 0x00, 0xff, 0x29, 0x08, 0x00, 0xbe, 0x2a, 0x08, 0x00, 0xbf, 0x2a, + 0x08, 0x00, 0x3e, 0x2b, 0x08, 0x00, 0x3f, 0x2b, 0x08, 0x00, 0xbe, 0x2b, + 0x08, 0x00, 0xbf, 0x2b, 0x08, 0x00, 0xeb, 0x2b, 0x08, 0x00, 0xfe, 0x2b, + 0x08, 0x00, 0xff, 0x2b, 0x08, 0x00, 0x3e, 0x2c, 0x08, 0x00, 0x3f, 0x2c, + 0x08, 0x00, 0xdf, 0x2c, 0x08, 0x00, 0xeb, 0x2c, 0x08, 0x00, 0xf8, 0x2c, + 0x08, 0x00, 0xfc, 0x2c, 0x08, 0x00, 0xfe, 0x2c, 0x08, 0x00, 0xff, 0x2c, + 0x08, 0x00, 0x3e, 0x2d, 0x08, 0x00, 0x3f, 0x2d, 0x08, 0x00, 0xfe, 0x2d, + 0x08, 0x00, 0xff, 0x2d, 0x08, 0x00, 0x2b, 0x2e, 0x08, 0x00, 0xdf, 0x2e, + 0x08, 0x00, 0xeb, 0x2e, 0x08, 0x00, 0xf8, 0x2e, 0x08, 0x00, 0xfc, 0x2e, + 0x08, 0x00, 0xfe, 0x2e, 0x08, 0x00, 0xff, 0x2e, 0x08, 0x00, 0x2b, 0x2f, + 0x08, 0x00, 0xcb, 0x2f, 0x08, 0x00, 0xeb, 0x2f, 0x08, 0x00, 0xf8, 0x2f, + 0x08, 0x00, 0xfc, 0x2f, 0x08, 0x00, 0xfe, 0x2f, 0x08, 0x00, 0xff, 0x2f, + 0x08, 0x00, 0x37, 0x31, 0x08, 0x00, 0x51, 0x31, 0x08, 0x00, 0x56, 0x31, + 0x08, 0x00, 0x57, 0x31, 0x08, 0x00, 0x5f, 0x31, 0x08, 0x00, 0xbf, 0x31, + 0x08, 0x00, 0xff, 0x31, 0x08, 0x00, 0xbf, 0x32, 0x08, 0x00, 0x30, 0x33, + 0x08, 0x00, 0x3d, 0x33, 0x08, 0x00, 0x3e, 0x33, 0x08, 0x00, 0x3f, 0x33, + 0x08, 0x00, 0xbe, 0x33, 0x08, 0x00, 0xbf, 0x33, 0x08, 0x00, 0xd1, 0x33, + 0x08, 0x00, 0xd6, 0x33, 0x08, 0x00, 0xd7, 0x33, 0x08, 0x00, 0xdf, 0x33, + 0x08, 0x00, 0xe7, 0x33, 0x08, 0x00, 0xf0, 0x33, 0x08, 0x00, 0xf1, 0x33, + 0x08, 0x00, 0xf7, 0x33, 0x08, 0x00, 0xf9, 0x33, 0x08, 0x00, 0xfd, 0x33, + 0x08, 0x00, 0x37, 0x34, 0x08, 0x00, 0xeb, 0x34, 0x08, 0x00, 0xf8, 0x34, + 0x08, 0x00, 0xfc, 0x34, 0x08, 0x00, 0xfe, 0x34, 0x08, 0x00, 0xff, 0x34, + 0x08, 0x00, 0x37, 0x36, 0x08, 0x00, 0x31, 0x37, 0x08, 0x00, 0x37, 0x37, + 0x08, 0x00, 0x38, 0x37, 0x08, 0x00, 0x4b, 0x38, 0x08, 0x00, 0xb1, 0x38, + 0x08, 0x00, 0xb7, 0x38, 0x08, 0x00, 0xb8, 0x38, 0x08, 0x00, 0xb7, 0x3a, + 0x08, 0x00, 0x30, 0x3b, 0x08, 0x00, 0x3d, 0x3b, 0x08, 0x00, 0x3e, 0x3b, + 0x08, 0x00, 0x3f, 0x3b, 0x08, 0x00, 0xb1, 0x3b, 0x08, 0x00, 0xb7, 0x3b, + 0x08, 0x00, 0xb8, 0x3b, 0x08, 0x00, 0xe7, 0x3b, 0x08, 0x00, 0xf0, 0x3b, + 0x08, 0x00, 0xf1, 0x3b, 0x08, 0x00, 0xf7, 0x3b, 0x08, 0x00, 0xf9, 0x3b, + 0x08, 0x00, 0xfd, 0x3b, 0x08, 0x00, 0xbe, 0x3c, 0x08, 0x00, 0xbf, 0x3c, + 0x08, 0x00, 0xbf, 0x3e, 0x08, 0x00, 0x30, 0x3f, 0x08, 0x00, 0x3d, 0x3f, + 0x08, 0x00, 0x3e, 0x3f, 0x08, 0x00, 0x3f, 0x3f, 0x08, 0x00, 0x91, 0x3f, + 0x08, 0x00, 0x96, 0x3f, 0x08, 0x00, 0x97, 0x3f, 0x08, 0x00, 0x9f, 0x3f, + 0x08, 0x00, 0xbe, 0x3f, 0x08, 0x00, 0xbf, 0x3f, 0x08, 0x00, 0xd1, 0x3f, + 0x08, 0x00, 0xd6, 0x3f, 0x08, 0x00, 0xd7, 0x3f, 0x08, 0x00, 0xdf, 0x3f, + 0x08, 0x00, 0x11, 0x41, 0x08, 0x00, 0x16, 0x41, 0x08, 0x00, 0x17, 0x41, + 0x08, 0x00, 0x67, 0x41, 0x08, 0x00, 0x77, 0x41, 0x08, 0x00, 0x78, 0x41, + 0x08, 0x00, 0x7c, 0x41, 0x08, 0x00, 0x7e, 0x41, 0x08, 0x00, 0x7f, 0x41, + 0x08, 0x00, 0xf7, 0x41, 0x08, 0x00, 0xf8, 0x41, 0x08, 0x00, 0xfc, 0x41, + 0x08, 0x00, 0xfe, 0x41, 0x08, 0x00, 0xff, 0x41, 0x08, 0x00, 0xbe, 0x42, + 0x08, 0x00, 0xbf, 0x42, 0x08, 0x00, 0x78, 0x43, 0x08, 0x00, 0x7c, 0x43, + 0x08, 0x00, 0x7e, 0x43, 0x08, 0x00, 0x7f, 0x43, 0x08, 0x00, 0xd1, 0x43, + 0x08, 0x00, 0xd6, 0x43, 0x08, 0x00, 0xd7, 0x43, 0x08, 0x00, 0xeb, 0x43, + 0x08, 0x00, 0xf0, 0x43, 0x08, 0x00, 0xf1, 0x43, 0x08, 0x00, 0xf9, 0x43, + 0x08, 0x00, 0xfd, 0x43, 0x08, 0x00, 0x70, 0x44, 0x08, 0x00, 0x71, 0x44, + 0x08, 0x00, 0x79, 0x44, 0x08, 0x00, 0x7d, 0x44, 0x08, 0x00, 0x31, 0x45, + 0x08, 0x00, 0x38, 0x45, 0x08, 0x00, 0xf7, 0x45, 0x08, 0x00, 0xf8, 0x45, + 0x08, 0x00, 0xfc, 0x45, 0x08, 0x00, 0xfe, 0x45, 0x08, 0x00, 0xff, 0x45, + 0x08, 0x00, 0x70, 0x46, 0x08, 0x00, 0x71, 0x46, 0x08, 0x00, 0x79, 0x46, + 0x08, 0x00, 0x7d, 0x46, 0x08, 0x00, 0x30, 0x47, 0x08, 0x00, 0x37, 0x47, + 0x08, 0x00, 0x3d, 0x47, 0x08, 0x00, 0x3e, 0x47, 0x08, 0x00, 0x3f, 0x47, + 0x08, 0x00, 0x91, 0x47, 0x08, 0x00, 0x96, 0x47, 0x08, 0x00, 0x97, 0x47, + 0x08, 0x00, 0xab, 0x47, 0x08, 0x00, 0xd1, 0x47, 0x08, 0x00, 0xd6, 0x47, + 0x08, 0x00, 0xd7, 0x47, 0x08, 0x00, 0x71, 0x4a, 0x08, 0x00, 0x77, 0x4a, + 0x08, 0x00, 0x78, 0x4a, 0x08, 0x00, 0x90, 0x4b, 0x08, 0x00, 0x9f, 0x4b, + 0x08, 0x00, 0xb8, 0x4c, 0x08, 0x00, 0x1f, 0x4f, 0x08, 0x00, 0x90, 0x4f, + 0x08, 0x00, 0x9f, 0x4f, 0x08, 0x00, 0xd0, 0x4f, 0x08, 0x00, 0xdf, 0x4f, + 0x08, 0x00, 0xb1, 0x50, 0x08, 0x00, 0xb8, 0x50, 0x08, 0x00, 0xb8, 0x52, + 0x08, 0x00, 0x31, 0x53, 0x08, 0x00, 0x38, 0x53, 0x08, 0x00, 0xb8, 0x53, + 0x08, 0x00, 0xd0, 0x53, 0x08, 0x00, 0xdf, 0x53, 0x08, 0x00, 0xe7, 0x53, + 0x08, 0x00, 0xf7, 0x53, 0x08, 0x00, 0xf8, 0x53, 0x08, 0x00, 0xfc, 0x53, + 0x08, 0x00, 0xfe, 0x53, 0x08, 0x00, 0xff, 0x53, 0x08, 0x00, 0xb0, 0x54, + 0x08, 0x00, 0xbd, 0x54, 0x08, 0x00, 0xbe, 0x54, 0x08, 0x00, 0xbf, 0x54, + 0x08, 0x00, 0xff, 0x55, 0x08, 0x00, 0xbf, 0x56, 0x08, 0x00, 0xcb, 0x57, + 0x08, 0x00, 0xeb, 0x57, 0x08, 0x00, 0xf8, 0x57, 0x08, 0x00, 0xfc, 0x57, + 0x08, 0x00, 0xfe, 0x57, 0x08, 0x00, 0xff, 0x57, 0x08, 0x00, 0x4b, 0x58, + 0x08, 0x00, 0xb0, 0x58, 0x08, 0x00, 0xb7, 0x58, 0x08, 0x00, 0xbd, 0x58, + 0x08, 0x00, 0xbe, 0x58, 0x08, 0x00, 0xbf, 0x58, 0x08, 0x00, 0xb0, 0x5a, + 0x08, 0x00, 0xb7, 0x5a, 0x08, 0x00, 0xbd, 0x5a, 0x08, 0x00, 0xbe, 0x5a, + 0x08, 0x00, 0xbf, 0x5a, 0x08, 0x00, 0x31, 0x5b, 0x08, 0x00, 0x38, 0x5b, + 0x08, 0x00, 0xb0, 0x5b, 0x08, 0x00, 0xb7, 0x5b, 0x08, 0x00, 0xbd, 0x5b, + 0x08, 0x00, 0xbe, 0x5b, 0x08, 0x00, 0xbf, 0x5b, 0x08, 0x00, 0xe7, 0x5b, + 0x08, 0x00, 0xf7, 0x5b, 0x08, 0x00, 0xf8, 0x5b, 0x08, 0x00, 0xfc, 0x5b, + 0x08, 0x00, 0xfe, 0x5b, 0x08, 0x00, 0xff, 0x5b, 0x08, 0x00, 0xb8, 0x5c, + 0x08, 0x00, 0xb8, 0x5e, 0x08, 0x00, 0x31, 0x5f, 0x08, 0x00, 0x38, 0x5f, + 0x08, 0x00, 0x90, 0x5f, 0x08, 0x00, 0x9f, 0x5f, 0x08, 0x00, 0xb8, 0x5f, + 0x08, 0x00, 0xd0, 0x5f, 0x08, 0x00, 0xdf, 0x5f, 0x08, 0x00, 0x1f, 0x61, + 0x08, 0x00, 0x6e, 0x61, 0x08, 0x00, 0x6f, 0x61, 0x08, 0x00, 0x73, 0x61, + 0x08, 0x00, 0x7b, 0x61, 0x08, 0x00, 0xf3, 0x61, 0x08, 0x00, 0xfb, 0x61, + 0x08, 0x00, 0xd5, 0x63, 0x08, 0x00, 0xee, 0x63, 0x08, 0x00, 0xef, 0x63, + 0x08, 0x00, 0xf8, 0x63, 0x08, 0x00, 0x3f, 0x64, 0x08, 0x00, 0x74, 0x64, + 0x08, 0x00, 0xf8, 0x64, 0x08, 0x00, 0xfc, 0x64, 0x08, 0x00, 0xfe, 0x64, + 0x08, 0x00, 0xff, 0x64, 0x08, 0x00, 0x33, 0x65, 0x08, 0x00, 0x3b, 0x65, + 0x08, 0x00, 0x3f, 0x65, 0x08, 0x00, 0x5f, 0x65, 0x08, 0x00, 0xf3, 0x65, + 0x08, 0x00, 0xfb, 0x65, 0x08, 0x00, 0xff, 0x65, 0x08, 0x00, 0x0b, 0x66, + 0x08, 0x00, 0x3f, 0x66, 0x08, 0x00, 0x73, 0x66, 0x08, 0x00, 0x7b, 0x66, + 0x08, 0x00, 0x3e, 0x67, 0x08, 0x00, 0x3f, 0x67, 0x08, 0x00, 0xa3, 0x67, + 0x08, 0x00, 0xae, 0x67, 0x08, 0x00, 0xaf, 0x67, 0x08, 0x00, 0x0b, 0x6a, + 0x08, 0x00, 0x38, 0x6a, 0x08, 0x00, 0x74, 0x6a, 0x08, 0x00, 0x7e, 0x6a, + 0x08, 0x00, 0x7f, 0x6a, 0x08, 0x00, 0x8e, 0x6b, 0x08, 0x00, 0x8f, 0x6b, + 0x08, 0x00, 0x95, 0x6b, 0x08, 0x00, 0x95, 0x6f, 0x08, 0x00, 0xd5, 0x6f, + 0x08, 0x00, 0x13, 0x71, 0x08, 0x00, 0x1f, 0x71, 0x08, 0x00, 0x78, 0x71, + 0x08, 0x00, 0x7c, 0x71, 0x08, 0x00, 0x7e, 0x71, 0x08, 0x00, 0x7f, 0x71, + 0x08, 0x00, 0xff, 0x71, 0x08, 0x00, 0x2b, 0x72, 0x08, 0x00, 0x3e, 0x73, + 0x08, 0x00, 0x3f, 0x73, 0x08, 0x00, 0xfe, 0x73, 0x08, 0x00, 0xff, 0x73, + 0x08, 0x00, 0x74, 0x74, 0x08, 0x00, 0xf3, 0x75, 0x08, 0x00, 0xfb, 0x75, + 0x08, 0x00, 0xff, 0x75, 0x08, 0x00, 0x73, 0x76, 0x08, 0x00, 0x7b, 0x76, + 0x08, 0x00, 0x78, 0x77, 0x08, 0x00, 0x7c, 0x77, 0x08, 0x00, 0x7e, 0x77, + 0x08, 0x00, 0x7f, 0x77, 0x08, 0x00, 0x3f, 0x78, 0x08, 0x00, 0xfe, 0x78, + 0x08, 0x00, 0xff, 0x78, 0x08, 0x00, 0x0b, 0x7a, 0x08, 0x00, 0x3f, 0x7a, + 0x08, 0x00, 0x74, 0x7a, 0x08, 0x00, 0x78, 0x7a, 0x08, 0x00, 0xff, 0x7a, + 0x08, 0x00, 0x3f, 0x7e, 0x08, 0x00, 0x3e, 0x7f, 0x08, 0x00, 0x3f, 0x7f, + 0x08, 0x00, 0x31, 0x80, 0x08, 0x00, 0x38, 0x80, 0x08, 0x00, 0x4d, 0x80, + 0x08, 0x00, 0x71, 0x80, 0x08, 0x00, 0x73, 0x80, 0x08, 0x00, 0x79, 0x80, + 0x08, 0x00, 0x7b, 0x80, 0x08, 0x00, 0x7d, 0x80, 0x08, 0x00, 0xb1, 0x80, + 0x08, 0x00, 0xb8, 0x80, 0x08, 0x00, 0x30, 0x81, 0x08, 0x00, 0x3e, 0x81, + 0x08, 0x00, 0x72, 0x81, 0x08, 0x00, 0x77, 0x81, 0x08, 0x00, 0x78, 0x81, + 0x08, 0x00, 0x7a, 0x81, 0x08, 0x00, 0x7c, 0x81, 0x08, 0x00, 0x7e, 0x81, + 0x08, 0x00, 0x7f, 0x81, 0x08, 0x00, 0x73, 0x82, 0x08, 0x00, 0x7b, 0x82, + 0x08, 0x00, 0x31, 0x83, 0x08, 0x00, 0x38, 0x83, 0x08, 0x00, 0xb8, 0x83, + 0x08, 0x00, 0xcd, 0x83, 0x08, 0x00, 0xf2, 0x83, 0x08, 0x00, 0xf7, 0x83, + 0x08, 0x00, 0xf8, 0x83, 0x08, 0x00, 0xfa, 0x83, 0x08, 0x00, 0xfc, 0x83, + 0x08, 0x00, 0xfe, 0x83, 0x08, 0x00, 0xff, 0x83, 0x08, 0x00, 0x30, 0x84, + 0x08, 0x00, 0x37, 0x84, 0x08, 0x00, 0x3d, 0x84, 0x08, 0x00, 0x3e, 0x84, + 0x08, 0x00, 0x3f, 0x84, 0x08, 0x00, 0x71, 0x84, 0x08, 0x00, 0x73, 0x84, + 0x08, 0x00, 0x79, 0x84, 0x08, 0x00, 0x7b, 0x84, 0x08, 0x00, 0x7d, 0x84, + 0x08, 0x00, 0xf2, 0x85, 0x08, 0x00, 0xf7, 0x85, 0x08, 0x00, 0xf8, 0x85, + 0x08, 0x00, 0xfa, 0x85, 0x08, 0x00, 0xfc, 0x85, 0x08, 0x00, 0xfe, 0x85, + 0x08, 0x00, 0xff, 0x85, 0x08, 0x00, 0x71, 0x86, 0x08, 0x00, 0x73, 0x86, + 0x08, 0x00, 0x79, 0x86, 0x08, 0x00, 0x7b, 0x86, 0x08, 0x00, 0x7d, 0x86, + 0x08, 0x00, 0xcb, 0x86, 0x08, 0x00, 0xf0, 0x86, 0x08, 0x00, 0xf1, 0x86, + 0x08, 0x00, 0xf9, 0x86, 0x08, 0x00, 0xfd, 0x86, 0x08, 0x00, 0x70, 0x87, + 0x08, 0x00, 0x71, 0x87, 0x08, 0x00, 0x79, 0x87, 0x08, 0x00, 0x7d, 0x87, + 0x08, 0x00, 0xb1, 0x87, 0x08, 0x00, 0xb8, 0x87, 0x08, 0x00, 0xf1, 0x87, + 0x08, 0x00, 0xf3, 0x87, 0x08, 0x00, 0xf9, 0x87, 0x08, 0x00, 0xfb, 0x87, + 0x08, 0x00, 0xfd, 0x87, 0x08, 0x00, 0x43, 0x88, 0x08, 0x00, 0x7f, 0x88, + 0x08, 0x00, 0xb0, 0x88, 0x08, 0x00, 0xbe, 0x88, 0x08, 0x00, 0xd6, 0x88, + 0x08, 0x00, 0xdf, 0x88, 0x08, 0x00, 0xe7, 0x88, 0x08, 0x00, 0xf1, 0x88, + 0x08, 0x00, 0xf3, 0x88, 0x08, 0x00, 0xf7, 0x88, 0x08, 0x00, 0xf9, 0x88, + 0x08, 0x00, 0xfb, 0x88, 0x08, 0x00, 0xfd, 0x88, 0x08, 0x00, 0x03, 0x89, + 0x08, 0x00, 0xb3, 0x89, 0x08, 0x00, 0xbb, 0x89, 0x08, 0x00, 0xbf, 0x89, + 0x08, 0x00, 0xf3, 0x89, 0x08, 0x00, 0xf7, 0x89, 0x08, 0x00, 0xfb, 0x89, + 0x08, 0x00, 0x27, 0x8a, 0x08, 0x00, 0x72, 0x8a, 0x08, 0x00, 0x78, 0x8a, + 0x08, 0x00, 0x7a, 0x8a, 0x08, 0x00, 0x7c, 0x8a, 0x08, 0x00, 0x7e, 0x8a, + 0x08, 0x00, 0x7f, 0x8a, 0x08, 0x00, 0x07, 0x8b, 0x08, 0x00, 0x0b, 0x8b, + 0x08, 0x00, 0x31, 0x8b, 0x08, 0x00, 0x38, 0x8b, 0x08, 0x00, 0xb0, 0x8b, + 0x08, 0x00, 0xbe, 0x8b, 0x08, 0x00, 0xd0, 0x8b, 0x08, 0x00, 0xe1, 0x8b, + 0x08, 0x00, 0xe2, 0x8b, 0x08, 0x00, 0xed, 0x8b, 0x08, 0x00, 0xee, 0x8b, + 0x08, 0x00, 0xef, 0x8b, 0x08, 0x00, 0xf2, 0x8b, 0x08, 0x00, 0xf8, 0x8b, + 0x08, 0x00, 0xfa, 0x8b, 0x08, 0x00, 0xfc, 0x8b, 0x08, 0x00, 0xfe, 0x8b, + 0x08, 0x00, 0xff, 0x8b, 0x08, 0x00, 0x37, 0x8c, 0x08, 0x00, 0x7f, 0x8c, + 0x08, 0x00, 0x03, 0x8d, 0x08, 0x00, 0xb3, 0x8d, 0x08, 0x00, 0xbb, 0x8d, + 0x08, 0x00, 0xbf, 0x8d, 0x08, 0x00, 0xf3, 0x8d, 0x08, 0x00, 0xf7, 0x8d, + 0x08, 0x00, 0xfb, 0x8d, 0x08, 0x00, 0x37, 0x8e, 0x08, 0x00, 0x78, 0x8e, + 0x08, 0x00, 0x7c, 0x8e, 0x08, 0x00, 0x7e, 0x8e, 0x08, 0x00, 0x7f, 0x8e, + 0x08, 0x00, 0x15, 0x8f, 0x08, 0x00, 0x30, 0x8f, 0x08, 0x00, 0x3e, 0x8f, + 0x08, 0x00, 0x73, 0x8f, 0x08, 0x00, 0x7b, 0x8f, 0x08, 0x00, 0x96, 0x8f, + 0x08, 0x00, 0x9f, 0x8f, 0x08, 0x00, 0xbe, 0x8f, 0x08, 0x00, 0xbf, 0x8f, + 0x08, 0x00, 0xd6, 0x8f, 0x08, 0x00, 0xdf, 0x8f, 0x08, 0x00, 0xce, 0x90, + 0x08, 0x00, 0xcf, 0x90, 0x08, 0x00, 0xf8, 0x90, 0x08, 0x00, 0xb4, 0x91, + 0x08, 0x00, 0xbe, 0x91, 0x08, 0x00, 0xbf, 0x91, 0x08, 0x00, 0xf8, 0x91, + 0x08, 0x00, 0xfc, 0x91, 0x08, 0x00, 0xfe, 0x91, 0x08, 0x00, 0xff, 0x91, + 0x08, 0x00, 0x38, 0x92, 0x08, 0x00, 0x33, 0x94, 0x08, 0x00, 0x3b, 0x94, + 0x08, 0x00, 0x3f, 0x94, 0x08, 0x00, 0x33, 0x95, 0x08, 0x00, 0x3b, 0x95, + 0x08, 0x00, 0x3f, 0x95, 0x08, 0x00, 0xff, 0x96, 0x08, 0x00, 0xb4, 0x97, + 0x08, 0x00, 0xb8, 0x97, 0x08, 0x00, 0xce, 0x97, 0x08, 0x00, 0xcf, 0x97, + 0x08, 0x00, 0xee, 0x97, 0x08, 0x00, 0xef, 0x97, 0x08, 0x00, 0xf3, 0x97, + 0x08, 0x00, 0xfb, 0x97, 0x08, 0x00, 0x44, 0x98, 0x08, 0x00, 0xb4, 0x98, + 0x08, 0x00, 0xbe, 0x98, 0x08, 0x00, 0xbf, 0x98, 0x08, 0x00, 0xcb, 0x98, + 0x08, 0x00, 0xfe, 0x98, 0x08, 0x00, 0xff, 0x98, 0x08, 0x00, 0x38, 0x99, + 0x08, 0x00, 0x3e, 0x9a, 0x08, 0x00, 0x3f, 0x9a, 0x08, 0x00, 0xb4, 0x9a, + 0x08, 0x00, 0xbe, 0x9a, 0x08, 0x00, 0xbf, 0x9a, 0x08, 0x00, 0xf8, 0x9a, + 0x08, 0x00, 0xfc, 0x9a, 0x08, 0x00, 0xfe, 0x9a, 0x08, 0x00, 0xff, 0x9a, + 0x08, 0x00, 0x4b, 0x9b, 0x08, 0x00, 0x38, 0x9d, 0x08, 0x00, 0xf3, 0x9f, + 0x08, 0x00, 0xfb, 0x9f, 0x08, 0x00, 0xf8, 0xa1, 0x08, 0x00, 0xfc, 0xa1, + 0x08, 0x00, 0xfe, 0xa1, 0x08, 0x00, 0xff, 0xa1, 0x08, 0x00, 0x3f, 0xa4, + 0x08, 0x00, 0x7f, 0xa4, 0x08, 0x00, 0xf3, 0xa5, 0x08, 0x00, 0xfb, 0xa5, + 0x08, 0x00, 0x2b, 0xa6, 0x08, 0x00, 0x78, 0xa6, 0x08, 0x00, 0x7c, 0xa6, + 0x08, 0x00, 0x7e, 0xa6, 0x08, 0x00, 0x7f, 0xa6, 0x08, 0x00, 0xdf, 0xa6, + 0x08, 0x00, 0x0b, 0xa7, 0x08, 0x00, 0x1f, 0xa7, 0x08, 0x00, 0x2b, 0xa7, + 0x08, 0x00, 0x78, 0xa7, 0x08, 0x00, 0x7c, 0xa7, 0x08, 0x00, 0x7e, 0xa7, + 0x08, 0x00, 0x7f, 0xa7, 0x08, 0x00, 0xbe, 0xa7, 0x08, 0x00, 0xbf, 0xa7, + 0x08, 0x00, 0xf3, 0xa7, 0x08, 0x00, 0xfb, 0xa7, 0x08, 0x00, 0x74, 0xaa, + 0x08, 0x00, 0x7e, 0xaa, 0x08, 0x00, 0x7f, 0xaa, 0x08, 0x00, 0x38, 0xab, + 0x08, 0x00, 0xb8, 0xab, 0x08, 0x00, 0xce, 0xab, 0x08, 0x00, 0xcf, 0xab, + 0x08, 0x00, 0xf8, 0xab, 0x08, 0x00, 0xf3, 0xaf, 0x08, 0x00, 0xfb, 0xaf, + 0x08, 0x00, 0x03, 0xb1, 0x08, 0x00, 0xff, 0xb1, 0x08, 0x00, 0x0b, 0xb2, + 0x08, 0x00, 0x1f, 0xb2, 0x08, 0x00, 0x3f, 0xb2, 0x08, 0x00, 0xb3, 0xb2, + 0x08, 0x00, 0xbb, 0xb2, 0x08, 0x00, 0xbf, 0xb2, 0x08, 0x00, 0xc7, 0xb2, + 0x08, 0x00, 0xe7, 0xb2, 0x08, 0x00, 0xf7, 0xb2, 0x08, 0x00, 0x1f, 0xb3, + 0x08, 0x00, 0x78, 0xb3, 0x08, 0x00, 0x7c, 0xb3, 0x08, 0x00, 0x7e, 0xb3, + 0x08, 0x00, 0x7f, 0xb3, 0x08, 0x00, 0x96, 0xb3, 0x08, 0x00, 0x9f, 0xb3, + 0x08, 0x00, 0x7f, 0xb4, 0x08, 0x00, 0x13, 0xb5, 0x08, 0x00, 0x1b, 0xb5, + 0x08, 0x00, 0x73, 0xb5, 0x08, 0x00, 0x7b, 0xb5, 0x08, 0x00, 0xf3, 0xb5, + 0x08, 0x00, 0xf7, 0xb5, 0x08, 0x00, 0xfb, 0xb5, 0x08, 0x00, 0x72, 0xb6, + 0x08, 0x00, 0x78, 0xb6, 0x08, 0x00, 0x7a, 0xb6, 0x08, 0x00, 0x7c, 0xb6, + 0x08, 0x00, 0x7e, 0xb6, 0x08, 0x00, 0x7f, 0xb6, 0x08, 0x00, 0x10, 0xb7, + 0x08, 0x00, 0x71, 0xb7, 0x08, 0x00, 0x73, 0xb7, 0x08, 0x00, 0x77, 0xb7, + 0x08, 0x00, 0x79, 0xb7, 0x08, 0x00, 0x7b, 0xb7, 0x08, 0x00, 0x7d, 0xb7, + 0x08, 0x00, 0xcd, 0xb7, 0x08, 0x00, 0xce, 0xb7, 0x08, 0x00, 0xcf, 0xb7, + 0x08, 0x00, 0xe1, 0xb7, 0x08, 0x00, 0xe2, 0xb7, 0x08, 0x00, 0xed, 0xb7, + 0x08, 0x00, 0xee, 0xb7, 0x08, 0x00, 0xef, 0xb7, 0x08, 0x00, 0xf2, 0xb7, + 0x08, 0x00, 0xf8, 0xb7, 0x08, 0x00, 0xfa, 0xb7, 0x08, 0x00, 0xfc, 0xb7, + 0x08, 0x00, 0xfe, 0xb7, 0x08, 0x00, 0xff, 0xb7, 0x08, 0x00, 0x37, 0xb8, + 0x08, 0x00, 0x1f, 0xb9, 0x08, 0x00, 0x33, 0xb9, 0x08, 0x00, 0x3b, 0xb9, + 0x08, 0x00, 0x3f, 0xb9, 0x08, 0x00, 0x50, 0xb9, 0x08, 0x00, 0x6b, 0xb9, + 0x08, 0x00, 0x78, 0xb9, 0x08, 0x00, 0x7c, 0xb9, 0x08, 0x00, 0x7e, 0xb9, + 0x08, 0x00, 0x7f, 0xb9, 0x08, 0x00, 0x27, 0xba, 0x08, 0x00, 0x72, 0xba, + 0x08, 0x00, 0x78, 0xba, 0x08, 0x00, 0x7a, 0xba, 0x08, 0x00, 0x7c, 0xba, + 0x08, 0x00, 0x7e, 0xba, 0x08, 0x00, 0x7f, 0xba, 0x08, 0x00, 0x07, 0xbb, + 0x08, 0x00, 0x0b, 0xbb, 0x08, 0x00, 0x31, 0xbb, 0x08, 0x00, 0x38, 0xbb, + 0x08, 0x00, 0xb0, 0xbb, 0x08, 0x00, 0xbe, 0xbb, 0x08, 0x00, 0xd0, 0xbb, + 0x08, 0x00, 0xe1, 0xbb, 0x08, 0x00, 0xe2, 0xbb, 0x08, 0x00, 0xed, 0xbb, + 0x08, 0x00, 0xee, 0xbb, 0x08, 0x00, 0xef, 0xbb, 0x08, 0x00, 0xf2, 0xbb, + 0x08, 0x00, 0xf8, 0xbb, 0x08, 0x00, 0xfa, 0xbb, 0x08, 0x00, 0xfc, 0xbb, + 0x08, 0x00, 0xfe, 0xbb, 0x08, 0x00, 0xff, 0xbb, 0x08, 0x00, 0xbe, 0xbc, + 0x08, 0x00, 0xbf, 0xbc, 0x08, 0x00, 0xd1, 0xbc, 0x08, 0x00, 0xd6, 0xbc, + 0x08, 0x00, 0xd7, 0xbc, 0x08, 0x00, 0xdf, 0xbc, 0x08, 0x00, 0xe7, 0xbc, + 0x08, 0x00, 0xf0, 0xbc, 0x08, 0x00, 0xf1, 0xbc, 0x08, 0x00, 0xf7, 0xbc, + 0x08, 0x00, 0xf9, 0xbc, 0x08, 0x00, 0xfd, 0xbc, 0x08, 0x00, 0x1f, 0xbd, + 0x08, 0x00, 0x33, 0xbd, 0x08, 0x00, 0x3b, 0xbd, 0x08, 0x00, 0x3f, 0xbd, + 0x08, 0x00, 0x50, 0xbd, 0x08, 0x00, 0x6b, 0xbd, 0x08, 0x00, 0x78, 0xbd, + 0x08, 0x00, 0x7c, 0xbd, 0x08, 0x00, 0x7e, 0xbd, 0x08, 0x00, 0x7f, 0xbd, + 0x08, 0x00, 0x0b, 0xbe, 0x08, 0x00, 0x1f, 0xbe, 0x08, 0x00, 0x2b, 0xbe, + 0x08, 0x00, 0xb3, 0xbe, 0x08, 0x00, 0xbb, 0xbe, 0x08, 0x00, 0xbf, 0xbe, + 0x08, 0x00, 0xd7, 0xbe, 0x08, 0x00, 0xdf, 0xbe, 0x08, 0x00, 0xe7, 0xbe, + 0x08, 0x00, 0xf7, 0xbe, 0x08, 0x00, 0x21, 0xbf, 0x08, 0x00, 0x22, 0xbf, + 0x08, 0x00, 0x2b, 0xbf, 0x08, 0x00, 0x2d, 0xbf, 0x08, 0x00, 0xab, 0xbf, + 0x08, 0x00, 0xc7, 0xbf, 0x08, 0x00, 0xe7, 0xbf, 0x08, 0x00, 0xf1, 0xbf, + 0x08, 0x00, 0xf3, 0xbf, 0x08, 0x00, 0xf7, 0xbf, 0x08, 0x00, 0xf9, 0xbf, + 0x08, 0x00, 0xfb, 0xbf, 0x08, 0x00, 0xfd, 0xbf, 0x08, 0x00, 0xc6, 0xc0, + 0x08, 0x00, 0xc7, 0xc0, 0x08, 0x00, 0xf6, 0xc0, 0x08, 0x00, 0xf7, 0xc0, + 0x08, 0x00, 0xf8, 0xc0, 0x08, 0x00, 0xfc, 0xc0, 0x08, 0x00, 0xfe, 0xc0, + 0x08, 0x00, 0xff, 0xc0, 0x08, 0x00, 0xb1, 0xc1, 0x08, 0x00, 0xb8, 0xc1, + 0x08, 0x00, 0xf0, 0xc1, 0x08, 0x00, 0xf1, 0xc1, 0x08, 0x00, 0xf9, 0xc1, + 0x08, 0x00, 0xfd, 0xc1, 0x08, 0x00, 0x31, 0xc3, 0x08, 0x00, 0x38, 0xc3, + 0x08, 0x00, 0xb8, 0xc3, 0x08, 0x00, 0xc6, 0xc3, 0x08, 0x00, 0xc7, 0xc3, + 0x08, 0x00, 0xf6, 0xc3, 0x08, 0x00, 0xf7, 0xc3, 0x08, 0x00, 0xf8, 0xc3, + 0x08, 0x00, 0xfc, 0xc3, 0x08, 0x00, 0xfe, 0xc3, 0x08, 0x00, 0xff, 0xc3, + 0x08, 0x00, 0xb1, 0xc4, 0x08, 0x00, 0xb8, 0xc4, 0x08, 0x00, 0xf6, 0xc5, + 0x08, 0x00, 0xf7, 0xc5, 0x08, 0x00, 0xf8, 0xc5, 0x08, 0x00, 0xfc, 0xc5, + 0x08, 0x00, 0xfe, 0xc5, 0x08, 0x00, 0xff, 0xc5, 0x08, 0x00, 0xb0, 0xc6, + 0x08, 0x00, 0xb6, 0xc6, 0x08, 0x00, 0xb7, 0xc6, 0x08, 0x00, 0xbd, 0xc6, + 0x08, 0x00, 0xbe, 0xc6, 0x08, 0x00, 0xbf, 0xc6, 0x08, 0x00, 0x30, 0xc7, + 0x08, 0x00, 0x36, 0xc7, 0x08, 0x00, 0x37, 0xc7, 0x08, 0x00, 0x3d, 0xc7, + 0x08, 0x00, 0x3e, 0xc7, 0x08, 0x00, 0x3f, 0xc7, 0x08, 0x00, 0x31, 0xc8, + 0x08, 0x00, 0x38, 0xc8, 0x08, 0x00, 0x0b, 0xc9, 0x08, 0x00, 0xb8, 0xc9, + 0x08, 0x00, 0xf0, 0xc9, 0x08, 0x00, 0xf1, 0xc9, 0x08, 0x00, 0xf9, 0xc9, + 0x08, 0x00, 0xfd, 0xc9, 0x08, 0x00, 0xb1, 0xca, 0x08, 0x00, 0xb8, 0xca, + 0x08, 0x00, 0x31, 0xcc, 0x08, 0x00, 0x38, 0xcc, 0x08, 0x00, 0x7e, 0xcc, + 0x08, 0x00, 0x7f, 0xcc, 0x08, 0x00, 0x0b, 0xcd, 0x08, 0x00, 0xb8, 0xcd, + 0x08, 0x00, 0xf1, 0xcd, 0x08, 0x00, 0xf8, 0xcd, 0x08, 0x00, 0x31, 0xce, + 0x08, 0x00, 0x38, 0xce, 0x08, 0x00, 0x78, 0xce, 0x08, 0x00, 0x7c, 0xce, + 0x08, 0x00, 0x7e, 0xce, 0x08, 0x00, 0x7f, 0xce, 0x08, 0x00, 0x08, 0xcf, + 0x08, 0x00, 0x0b, 0xcf, 0x08, 0x00, 0x31, 0xcf, 0x08, 0x00, 0x38, 0xcf, + 0x08, 0x00, 0x78, 0xcf, 0x08, 0x00, 0x7c, 0xcf, 0x08, 0x00, 0x7e, 0xcf, + 0x08, 0x00, 0x7f, 0xcf, 0x08, 0x00, 0x90, 0xcf, 0x08, 0x00, 0x99, 0xcf, + 0x08, 0x00, 0x9d, 0xcf, 0x08, 0x00, 0xb8, 0xcf, 0x08, 0x00, 0xd0, 0xcf, + 0x08, 0x00, 0xd9, 0xcf, 0x08, 0x00, 0xdd, 0xcf, 0x08, 0x00, 0xc8, 0xd0, + 0x08, 0x00, 0xcb, 0xd0, 0x08, 0x00, 0xb8, 0xd1, 0x08, 0x00, 0xf8, 0xd1, + 0x08, 0x00, 0xfc, 0xd1, 0x08, 0x00, 0xfe, 0xd1, 0x08, 0x00, 0xff, 0xd1, + 0x08, 0x00, 0x3e, 0xd4, 0x08, 0x00, 0x3f, 0xd4, 0x08, 0x00, 0x38, 0xd5, + 0x08, 0x00, 0xeb, 0xd6, 0x08, 0x00, 0xbe, 0xd7, 0x08, 0x00, 0xbf, 0xd7, + 0x08, 0x00, 0xc8, 0xd7, 0x08, 0x00, 0xcb, 0xd7, 0x08, 0x00, 0xe8, 0xd7, + 0x08, 0x00, 0xeb, 0xd7, 0x08, 0x00, 0x48, 0xd8, 0x08, 0x00, 0x4b, 0xd8, + 0x08, 0x00, 0xb8, 0xd8, 0x08, 0x00, 0x38, 0xd9, 0x08, 0x00, 0xbe, 0xda, + 0x08, 0x00, 0xbf, 0xda, 0x08, 0x00, 0x38, 0xdd, 0x08, 0x00, 0xf1, 0xe0, + 0x08, 0x00, 0xf8, 0xe0, 0x08, 0x00, 0xb1, 0xe1, 0x08, 0x00, 0xb8, 0xe1, + 0x08, 0x00, 0xf6, 0xe1, 0x08, 0x00, 0xf7, 0xe1, 0x08, 0x00, 0xf8, 0xe1, + 0x08, 0x00, 0xfc, 0xe1, 0x08, 0x00, 0xfe, 0xe1, 0x08, 0x00, 0xff, 0xe1, + 0x08, 0x00, 0x7e, 0xe2, 0x08, 0x00, 0x7f, 0xe2, 0x08, 0x00, 0x31, 0xe3, + 0x08, 0x00, 0x38, 0xe3, 0x08, 0x00, 0xb8, 0xe3, 0x08, 0x00, 0xf1, 0xe3, + 0x08, 0x00, 0xf8, 0xe3, 0x08, 0x00, 0xb1, 0xe4, 0x08, 0x00, 0xb8, 0xe4, + 0x08, 0x00, 0xf0, 0xe5, 0x08, 0x00, 0xf7, 0xe5, 0x08, 0x00, 0xfd, 0xe5, + 0x08, 0x00, 0xfe, 0xe5, 0x08, 0x00, 0xff, 0xe5, 0x08, 0x00, 0xb1, 0xe6, + 0x08, 0x00, 0xb8, 0xe6, 0x08, 0x00, 0x30, 0xe7, 0x08, 0x00, 0x36, 0xe7, + 0x08, 0x00, 0x37, 0xe7, 0x08, 0x00, 0x3d, 0xe7, 0x08, 0x00, 0x3e, 0xe7, + 0x08, 0x00, 0x3f, 0xe7, 0x08, 0x00, 0x30, 0xe8, 0x08, 0x00, 0x36, 0xe8, + 0x08, 0x00, 0x37, 0xe8, 0x08, 0x00, 0x3d, 0xe8, 0x08, 0x00, 0x3e, 0xe8, + 0x08, 0x00, 0x3f, 0xe8, 0x08, 0x00, 0xbe, 0xe9, 0x08, 0x00, 0xbf, 0xe9, + 0x08, 0x00, 0xf6, 0xe9, 0x08, 0x00, 0xf7, 0xe9, 0x08, 0x00, 0xf8, 0xe9, + 0x08, 0x00, 0xfc, 0xe9, 0x08, 0x00, 0xfe, 0xe9, 0x08, 0x00, 0xff, 0xe9, + 0x08, 0x00, 0xb0, 0xea, 0x08, 0x00, 0xb6, 0xea, 0x08, 0x00, 0xb7, 0xea, + 0x08, 0x00, 0xbd, 0xea, 0x08, 0x00, 0xbe, 0xea, 0x08, 0x00, 0xbf, 0xea, + 0x08, 0x00, 0x30, 0xec, 0x08, 0x00, 0x36, 0xec, 0x08, 0x00, 0x37, 0xec, + 0x08, 0x00, 0x3d, 0xec, 0x08, 0x00, 0x3e, 0xec, 0x08, 0x00, 0x3f, 0xec, + 0x08, 0x00, 0x78, 0xec, 0x08, 0x00, 0xbe, 0xed, 0x08, 0x00, 0xbf, 0xed, + 0x08, 0x00, 0xf0, 0xed, 0x08, 0x00, 0xf6, 0xed, 0x08, 0x00, 0xf7, 0xed, + 0x08, 0x00, 0xfd, 0xed, 0x08, 0x00, 0xfe, 0xed, 0x08, 0x00, 0xff, 0xed, + 0x08, 0x00, 0x30, 0xee, 0x08, 0x00, 0x36, 0xee, 0x08, 0x00, 0x37, 0xee, + 0x08, 0x00, 0x3d, 0xee, 0x08, 0x00, 0x3e, 0xee, 0x08, 0x00, 0x3f, 0xee, + 0x08, 0x00, 0x78, 0xee, 0x08, 0x00, 0x7c, 0xee, 0x08, 0x00, 0x7e, 0xee, + 0x08, 0x00, 0x7f, 0xee, 0x08, 0x00, 0x31, 0xef, 0x08, 0x00, 0x38, 0xef, + 0x08, 0x00, 0x78, 0xef, 0x08, 0x00, 0x7c, 0xef, 0x08, 0x00, 0x7e, 0xef, + 0x08, 0x00, 0x7f, 0xef, 0x08, 0x00, 0xb8, 0xef, 0x08, 0x00, 0xf1, 0xf0, + 0x08, 0x00, 0xf8, 0xf0, 0x08, 0x00, 0xb0, 0xf1, 0x08, 0x00, 0xb7, 0xf1, + 0x08, 0x00, 0xbd, 0xf1, 0x08, 0x00, 0xbe, 0xf1, 0x08, 0x00, 0xbf, 0xf1, + 0x08, 0x00, 0xf0, 0xf1, 0x08, 0x00, 0xf1, 0xf1, 0x08, 0x00, 0xf9, 0xf1, + 0x08, 0x00, 0xfd, 0xf1, 0x08, 0x00, 0xbe, 0xf2, 0x08, 0x00, 0xbf, 0xf2, + 0x08, 0x00, 0x88, 0xf3, 0x08, 0x00, 0x8b, 0xf3, 0x08, 0x00, 0x91, 0xf3, + 0x08, 0x00, 0x96, 0xf3, 0x08, 0x00, 0x97, 0xf3, 0x08, 0x00, 0x9d, 0xf3, + 0x08, 0x00, 0x9e, 0xf3, 0x08, 0x00, 0x9f, 0xf3, 0x08, 0x00, 0x31, 0xf4, + 0x08, 0x00, 0x38, 0xf4, 0x08, 0x00, 0x0b, 0xf5, 0x08, 0x00, 0x31, 0xf5, + 0x08, 0x00, 0x38, 0xf5, 0x08, 0x00, 0x51, 0xf5, 0x08, 0x00, 0x56, 0xf5, + 0x08, 0x00, 0x57, 0xf5, 0x08, 0x00, 0x5d, 0xf5, 0x08, 0x00, 0x5e, 0xf5, + 0x08, 0x00, 0x5f, 0xf5, 0x08, 0x00, 0xb8, 0xf5, 0x08, 0x00, 0xf0, 0xf6, + 0x08, 0x00, 0xf1, 0xf6, 0x08, 0x00, 0xf9, 0xf6, 0x08, 0x00, 0xfd, 0xf6, + 0x08, 0x00, 0xb0, 0xf7, 0x08, 0x00, 0xb6, 0xf7, 0x08, 0x00, 0xb7, 0xf7, + 0x08, 0x00, 0xbd, 0xf7, 0x08, 0x00, 0xbe, 0xf7, 0x08, 0x00, 0xbf, 0xf7, + 0x08, 0x00, 0xf0, 0xf7, 0x08, 0x00, 0xf1, 0xf7, 0x08, 0x00, 0xf9, 0xf7, + 0x08, 0x00, 0xfd, 0xf7, 0x08, 0x00, 0xb1, 0xf8, 0x08, 0x00, 0xb8, 0xf8, + 0x08, 0x00, 0x30, 0xf9, 0x08, 0x00, 0x37, 0xf9, 0x08, 0x00, 0x3d, 0xf9, + 0x08, 0x00, 0x3e, 0xf9, 0x08, 0x00, 0x3f, 0xf9, 0x08, 0x00, 0xb1, 0xfa, + 0x08, 0x00, 0xb8, 0xfa, 0x08, 0x00, 0xbe, 0xfc, 0x08, 0x00, 0xbf, 0xfc, + 0x08, 0x00, 0x30, 0xfd, 0x08, 0x00, 0x37, 0xfd, 0x08, 0x00, 0x3d, 0xfd, + 0x08, 0x00, 0x3e, 0xfd, 0x08, 0x00, 0x3f, 0xfd, 0x08, 0x00, 0xbe, 0xfe, + 0x08, 0x00, 0xbf, 0xfe, 0x08, 0x00, 0x28, 0xff, 0x08, 0x00, 0x2b, 0xff, + 0x08, 0x00, 0x88, 0xff, 0x08, 0x00, 0x8b, 0xff, 0x08, 0x00, 0xa8, 0xff, + 0x08, 0x00, 0xab, 0xff, 0x08, 0x00, 0xc6, 0xff, 0x08, 0x00, 0xc7, 0xff, + 0x08, 0x00, 0xc8, 0xff, 0x08, 0x00, 0xc9, 0xff, 0x08, 0x00, 0xcb, 0xff, + 0x08, 0x00, 0xe6, 0xff, 0x08, 0x00, 0xe7, 0xff, 0x08, 0x00, 0xe8, 0xff, + 0x08, 0x00, 0xe9, 0xff, 0x08, 0x00, 0xeb, 0xff, 0x08, 0x00, 0xf6, 0xff, + 0x08, 0x00, 0xf7, 0xff, 0x08, 0x00, 0xf8, 0xff, 0x08, 0x00, 0xfc, 0xff, + 0x08, 0x00, 0xfe, 0xff, 0x08, 0x00, 0xff, 0xff, 0x08, 0x00, 0x3e, 0x00, + 0x09, 0x00, 0x3f, 0x00, 0x09, 0x00, 0x44, 0x00, 0x09, 0x00, 0x45, 0x00, + 0x09, 0x00, 0x4e, 0x00, 0x09, 0x00, 0x4f, 0x00, 0x09, 0x00, 0xbe, 0x00, + 0x09, 0x00, 0xbf, 0x00, 0x09, 0x00, 0xe4, 0x00, 0x09, 0x00, 0xee, 0x00, + 0x09, 0x00, 0xef, 0x00, 0x09, 0x00, 0xf4, 0x00, 0x09, 0x00, 0xf5, 0x00, + 0x09, 0x00, 0xf8, 0x00, 0x09, 0x00, 0xfc, 0x00, 0x09, 0x00, 0xfe, 0x00, + 0x09, 0x00, 0xff, 0x00, 0x09, 0x00, 0xc4, 0x01, 0x09, 0x00, 0xc5, 0x01, + 0x09, 0x00, 0xce, 0x01, 0x09, 0x00, 0xcf, 0x01, 0x09, 0x00, 0xf4, 0x01, + 0x09, 0x00, 0xf5, 0x01, 0x09, 0x00, 0xf8, 0x01, 0x09, 0x00, 0xfc, 0x01, + 0x09, 0x00, 0xfe, 0x01, 0x09, 0x00, 0xff, 0x01, 0x09, 0x00, 0xe4, 0x02, + 0x09, 0x00, 0xee, 0x02, 0x09, 0x00, 0xef, 0x02, 0x09, 0x00, 0xf4, 0x02, + 0x09, 0x00, 0xf5, 0x02, 0x09, 0x00, 0xf8, 0x02, 0x09, 0x00, 0xfc, 0x02, + 0x09, 0x00, 0xfe, 0x02, 0x09, 0x00, 0xff, 0x02, 0x09, 0x00, 0x3e, 0x05, + 0x09, 0x00, 0x3f, 0x05, 0x09, 0x00, 0x38, 0x06, 0x09, 0x00, 0x3e, 0x07, + 0x09, 0x00, 0x3f, 0x07, 0x09, 0x00, 0x88, 0x07, 0x09, 0x00, 0xe8, 0x07, + 0x09, 0x00, 0xf3, 0x07, 0x09, 0x00, 0xfb, 0x07, 0x09, 0x00, 0x38, 0x08, + 0x09, 0x00, 0xbe, 0x08, 0x09, 0x00, 0xbf, 0x08, 0x09, 0x00, 0xe4, 0x08, + 0x09, 0x00, 0xee, 0x08, 0x09, 0x00, 0xef, 0x08, 0x09, 0x00, 0xf4, 0x08, + 0x09, 0x00, 0xf5, 0x08, 0x09, 0x00, 0xf8, 0x08, 0x09, 0x00, 0xfc, 0x08, + 0x09, 0x00, 0xfe, 0x08, 0x09, 0x00, 0xff, 0x08, 0x09, 0x00, 0xcf, 0x09, + 0x09, 0x00, 0xf8, 0x09, 0x09, 0x00, 0xfc, 0x09, 0x09, 0x00, 0xfe, 0x09, + 0x09, 0x00, 0xff, 0x09, 0x09, 0x00, 0x3e, 0x0a, 0x09, 0x00, 0x3f, 0x0a, + 0x09, 0x00, 0x3e, 0x0b, 0x09, 0x00, 0x3f, 0x0b, 0x09, 0x00, 0x88, 0x0b, + 0x09, 0x00, 0xe8, 0x0b, 0x09, 0x00, 0xf3, 0x0b, 0x09, 0x00, 0xfb, 0x0b, + 0x09, 0x00, 0x34, 0x0c, 0x09, 0x00, 0x3e, 0x0c, 0x09, 0x00, 0x3f, 0x0c, + 0x09, 0x00, 0xe8, 0x0c, 0x09, 0x00, 0xf3, 0x0c, 0x09, 0x00, 0xfb, 0x0c, + 0x09, 0x00, 0xcf, 0x0d, 0x09, 0x00, 0xf8, 0x0d, 0x09, 0x00, 0xfc, 0x0d, + 0x09, 0x00, 0xfe, 0x0d, 0x09, 0x00, 0xff, 0x0d, 0x09, 0x00, 0xf3, 0x0e, + 0x09, 0x00, 0xfb, 0x0e, 0x09, 0x00, 0x3e, 0x10, 0x09, 0x00, 0x3f, 0x10, + 0x09, 0x00, 0x45, 0x10, 0x09, 0x00, 0x4f, 0x10, 0x09, 0x00, 0xbe, 0x10, + 0x09, 0x00, 0xbf, 0x10, 0x09, 0x00, 0xee, 0x10, 0x09, 0x00, 0xef, 0x10, + 0x09, 0x00, 0xf8, 0x10, 0x09, 0x00, 0xb8, 0x11, 0x09, 0x00, 0xf3, 0x11, + 0x09, 0x00, 0xfb, 0x11, 0x09, 0x00, 0x38, 0x13, 0x09, 0x00, 0xee, 0x13, + 0x09, 0x00, 0xef, 0x13, 0x09, 0x00, 0xf8, 0x13, 0x09, 0x00, 0xbe, 0x14, + 0x09, 0x00, 0xbf, 0x14, 0x09, 0x00, 0xee, 0x14, 0x09, 0x00, 0xef, 0x14, + 0x09, 0x00, 0xf3, 0x14, 0x09, 0x00, 0xfb, 0x14, 0x09, 0x00, 0xf8, 0x15, + 0x09, 0x00, 0x38, 0x16, 0x09, 0x00, 0xb4, 0x16, 0x09, 0x00, 0xbe, 0x16, + 0x09, 0x00, 0xbf, 0x16, 0x09, 0x00, 0xee, 0x16, 0x09, 0x00, 0xef, 0x16, + 0x09, 0x00, 0xf3, 0x16, 0x09, 0x00, 0xfb, 0x16, 0x09, 0x00, 0x3e, 0x17, + 0x09, 0x00, 0x3f, 0x17, 0x09, 0x00, 0x88, 0x17, 0x09, 0x00, 0x3e, 0x19, + 0x09, 0x00, 0x3f, 0x19, 0x09, 0x00, 0x58, 0x19, 0x09, 0x00, 0x5c, 0x19, + 0x09, 0x00, 0x5e, 0x19, 0x09, 0x00, 0x5f, 0x19, 0x09, 0x00, 0xb8, 0x1a, + 0x09, 0x00, 0x3e, 0x1b, 0x09, 0x00, 0x3f, 0x1b, 0x09, 0x00, 0x88, 0x1b, + 0x09, 0x00, 0xe8, 0x1b, 0x09, 0x00, 0xfe, 0x1b, 0x09, 0x00, 0xff, 0x1b, + 0x09, 0x00, 0x3e, 0x1c, 0x09, 0x00, 0x3f, 0x1c, 0x09, 0x00, 0x3e, 0x1d, + 0x09, 0x00, 0x3f, 0x1d, 0x09, 0x00, 0x5e, 0x1d, 0x09, 0x00, 0x5f, 0x1d, + 0x09, 0x00, 0xce, 0x1f, 0x09, 0x00, 0xcf, 0x1f, 0x09, 0x00, 0xee, 0x1f, + 0x09, 0x00, 0xef, 0x1f, 0x09, 0x00, 0xf3, 0x1f, 0x09, 0x00, 0xfb, 0x1f, + 0x09, 0x00, 0xcb, 0x25, 0x09, 0x00, 0xf8, 0x29, 0x09, 0x00, 0xfc, 0x29, + 0x09, 0x00, 0xfe, 0x29, 0x09, 0x00, 0xff, 0x29, 0x09, 0x00, 0xfe, 0x2d, + 0x09, 0x00, 0xff, 0x2d, 0x09, 0x00, 0x48, 0x32, 0x09, 0x00, 0x4b, 0x32, + 0x09, 0x00, 0xbe, 0x32, 0x09, 0x00, 0xbf, 0x32, 0x09, 0x00, 0x88, 0x33, + 0x09, 0x00, 0x8b, 0x33, 0x09, 0x00, 0xf7, 0x35, 0x09, 0x00, 0xf8, 0x35, + 0x09, 0x00, 0xfc, 0x35, 0x09, 0x00, 0xfe, 0x35, 0x09, 0x00, 0xff, 0x35, + 0x09, 0x00, 0xcb, 0x39, 0x09, 0x00, 0xf0, 0x39, 0x09, 0x00, 0xf1, 0x39, + 0x09, 0x00, 0xf9, 0x39, 0x09, 0x00, 0xfd, 0x39, 0x09, 0x00, 0xcb, 0x3d, + 0x09, 0x00, 0xf0, 0x3d, 0x09, 0x00, 0xf1, 0x3d, 0x09, 0x00, 0xf9, 0x3d, + 0x09, 0x00, 0xfd, 0x3d, 0x09, 0x00, 0x88, 0x3f, 0x09, 0x00, 0x8b, 0x3f, + 0x09, 0x00, 0x31, 0x40, 0x09, 0x00, 0x38, 0x40, 0x09, 0x00, 0x48, 0x40, + 0x09, 0x00, 0x49, 0x40, 0x09, 0x00, 0x4b, 0x40, 0x09, 0x00, 0xb1, 0x40, + 0x09, 0x00, 0xb8, 0x40, 0x09, 0x00, 0x31, 0x41, 0x09, 0x00, 0x38, 0x41, + 0x09, 0x00, 0x46, 0x41, 0x09, 0x00, 0x47, 0x41, 0x09, 0x00, 0xc6, 0x41, + 0x09, 0x00, 0xc7, 0x41, 0x09, 0x00, 0xf6, 0x41, 0x09, 0x00, 0xf7, 0x41, + 0x09, 0x00, 0xf8, 0x41, 0x09, 0x00, 0xfc, 0x41, 0x09, 0x00, 0xfe, 0x41, + 0x09, 0x00, 0xff, 0x41, 0x09, 0x00, 0x31, 0x42, 0x09, 0x00, 0x38, 0x42, + 0x09, 0x00, 0x48, 0x42, 0x09, 0x00, 0x4b, 0x42, 0x09, 0x00, 0xb8, 0x42, + 0x09, 0x00, 0x30, 0x43, 0x09, 0x00, 0x36, 0x43, 0x09, 0x00, 0x37, 0x43, + 0x09, 0x00, 0x3d, 0x43, 0x09, 0x00, 0x3e, 0x43, 0x09, 0x00, 0x3f, 0x43, + 0x09, 0x00, 0x48, 0x43, 0x09, 0x00, 0x4b, 0x43, 0x09, 0x00, 0xc8, 0x43, + 0x09, 0x00, 0xc9, 0x43, 0x09, 0x00, 0xcb, 0x43, 0x09, 0x00, 0xf0, 0x43, + 0x09, 0x00, 0xf1, 0x43, 0x09, 0x00, 0xf9, 0x43, 0x09, 0x00, 0xfd, 0x43, + 0x09, 0x00, 0xbe, 0x45, 0x09, 0x00, 0xbf, 0x45, 0x09, 0x00, 0xb0, 0x47, + 0x09, 0x00, 0xb6, 0x47, 0x09, 0x00, 0xb7, 0x47, 0x09, 0x00, 0xbd, 0x47, + 0x09, 0x00, 0xbe, 0x47, 0x09, 0x00, 0xbf, 0x47, 0x09, 0x00, 0x30, 0x48, + 0x09, 0x00, 0x37, 0x48, 0x09, 0x00, 0x3d, 0x48, 0x09, 0x00, 0x3e, 0x48, + 0x09, 0x00, 0x3f, 0x48, 0x09, 0x00, 0xb1, 0x48, 0x09, 0x00, 0xb8, 0x48, + 0x09, 0x00, 0x30, 0x49, 0x09, 0x00, 0x37, 0x49, 0x09, 0x00, 0x3d, 0x49, + 0x09, 0x00, 0x3e, 0x49, 0x09, 0x00, 0x3f, 0x49, 0x09, 0x00, 0x50, 0x49, + 0x09, 0x00, 0x59, 0x49, 0x09, 0x00, 0x5d, 0x49, 0x09, 0x00, 0xbe, 0x49, + 0x09, 0x00, 0xbf, 0x49, 0x09, 0x00, 0xf7, 0x49, 0x09, 0x00, 0xf8, 0x49, + 0x09, 0x00, 0xfc, 0x49, 0x09, 0x00, 0xfe, 0x49, 0x09, 0x00, 0xff, 0x49, + 0x09, 0x00, 0xb0, 0x4a, 0x09, 0x00, 0xb7, 0x4a, 0x09, 0x00, 0xbd, 0x4a, + 0x09, 0x00, 0xbe, 0x4a, 0x09, 0x00, 0xbf, 0x4a, 0x09, 0x00, 0xb0, 0x4b, + 0x09, 0x00, 0xb6, 0x4b, 0x09, 0x00, 0xb7, 0x4b, 0x09, 0x00, 0xbd, 0x4b, + 0x09, 0x00, 0xbe, 0x4b, 0x09, 0x00, 0xbf, 0x4b, 0x09, 0x00, 0xbe, 0x4c, + 0x09, 0x00, 0xbf, 0x4c, 0x09, 0x00, 0x30, 0x4d, 0x09, 0x00, 0x37, 0x4d, + 0x09, 0x00, 0x3d, 0x4d, 0x09, 0x00, 0x3e, 0x4d, 0x09, 0x00, 0x3f, 0x4d, + 0x09, 0x00, 0x50, 0x4d, 0x09, 0x00, 0x58, 0x4d, 0x09, 0x00, 0xbe, 0x4d, + 0x09, 0x00, 0xbf, 0x4d, 0x09, 0x00, 0xf0, 0x4d, 0x09, 0x00, 0xf7, 0x4d, + 0x09, 0x00, 0xfd, 0x4d, 0x09, 0x00, 0xfe, 0x4d, 0x09, 0x00, 0xff, 0x4d, + 0x09, 0x00, 0xbe, 0x4e, 0x09, 0x00, 0xbf, 0x4e, 0x09, 0x00, 0xbe, 0x4f, + 0x09, 0x00, 0xbf, 0x4f, 0x09, 0x00, 0xc6, 0x4f, 0x09, 0x00, 0xc7, 0x4f, + 0x09, 0x00, 0xc8, 0x4f, 0x09, 0x00, 0xc9, 0x4f, 0x09, 0x00, 0xcb, 0x4f, + 0x09, 0x00, 0xe6, 0x4f, 0x09, 0x00, 0xe7, 0x4f, 0x09, 0x00, 0xe8, 0x4f, + 0x09, 0x00, 0xe9, 0x4f, 0x09, 0x00, 0xeb, 0x4f, 0x09, 0x00, 0xf6, 0x4f, + 0x09, 0x00, 0xf7, 0x4f, 0x09, 0x00, 0xf8, 0x4f, 0x09, 0x00, 0xfc, 0x4f, + 0x09, 0x00, 0xfe, 0x4f, 0x09, 0x00, 0xff, 0x4f, 0x09, 0x00, 0x48, 0x52, + 0x09, 0x00, 0x4b, 0x52, 0x09, 0x00, 0xb8, 0x52, 0x09, 0x00, 0x30, 0x53, + 0x09, 0x00, 0x36, 0x53, 0x09, 0x00, 0x37, 0x53, 0x09, 0x00, 0x3d, 0x53, + 0x09, 0x00, 0x3e, 0x53, 0x09, 0x00, 0x3f, 0x53, 0x09, 0x00, 0xbe, 0x53, + 0x09, 0x00, 0xbf, 0x53, 0x09, 0x00, 0xc8, 0x53, 0x09, 0x00, 0xc9, 0x53, + 0x09, 0x00, 0xcb, 0x53, 0x09, 0x00, 0xf0, 0x53, 0x09, 0x00, 0xf1, 0x53, + 0x09, 0x00, 0xf9, 0x53, 0x09, 0x00, 0xfd, 0x53, 0x09, 0x00, 0x31, 0x59, + 0x09, 0x00, 0x38, 0x59, 0x09, 0x00, 0xc6, 0x59, 0x09, 0x00, 0xc7, 0x59, + 0x09, 0x00, 0xf6, 0x59, 0x09, 0x00, 0xf7, 0x59, 0x09, 0x00, 0xf8, 0x59, + 0x09, 0x00, 0xfc, 0x59, 0x09, 0x00, 0xfe, 0x59, 0x09, 0x00, 0xff, 0x59, + 0x09, 0x00, 0x31, 0x5d, 0x09, 0x00, 0x38, 0x5d, 0x09, 0x00, 0xc6, 0x5d, + 0x09, 0x00, 0xc7, 0x5d, 0x09, 0x00, 0xf6, 0x5d, 0x09, 0x00, 0xf7, 0x5d, + 0x09, 0x00, 0xf8, 0x5d, 0x09, 0x00, 0xfc, 0x5d, 0x09, 0x00, 0xfe, 0x5d, + 0x09, 0x00, 0xff, 0x5d, 0x09, 0x00, 0x30, 0x5f, 0x09, 0x00, 0x36, 0x5f, + 0x09, 0x00, 0x37, 0x5f, 0x09, 0x00, 0x3d, 0x5f, 0x09, 0x00, 0x3e, 0x5f, + 0x09, 0x00, 0x3f, 0x5f, 0x09, 0x00, 0xbe, 0x5f, 0x09, 0x00, 0xbf, 0x5f, + 0x09, 0x00, 0xc8, 0x5f, 0x09, 0x00, 0xc9, 0x5f, 0x09, 0x00, 0xcb, 0x5f, + 0x09, 0x00, 0xf0, 0x5f, 0x09, 0x00, 0xf1, 0x5f, 0x09, 0x00, 0xf9, 0x5f, + 0x09, 0x00, 0xfd, 0x5f, 0x09, 0x00, 0x3e, 0x60, 0x09, 0x00, 0x3f, 0x60, + 0x09, 0x00, 0x45, 0x60, 0x09, 0x00, 0x4f, 0x60, 0x09, 0x00, 0xbe, 0x60, + 0x09, 0x00, 0xbf, 0x60, 0x09, 0x00, 0x38, 0x61, 0x09, 0x00, 0x4e, 0x61, + 0x09, 0x00, 0x4f, 0x61, 0x09, 0x00, 0xb8, 0x61, 0x09, 0x00, 0xf3, 0x61, + 0x09, 0x00, 0xfb, 0x61, 0x09, 0x00, 0x38, 0x63, 0x09, 0x00, 0xc5, 0x63, + 0x09, 0x00, 0xcf, 0x63, 0x09, 0x00, 0xf8, 0x63, 0x09, 0x00, 0x3e, 0x64, + 0x09, 0x00, 0x3f, 0x64, 0x09, 0x00, 0xe8, 0x64, 0x09, 0x00, 0xeb, 0x64, + 0x09, 0x00, 0xf8, 0x64, 0x09, 0x00, 0xfc, 0x64, 0x09, 0x00, 0xfe, 0x64, + 0x09, 0x00, 0xff, 0x64, 0x09, 0x00, 0x3e, 0x66, 0x09, 0x00, 0x3f, 0x66, + 0x09, 0x00, 0xeb, 0x66, 0x09, 0x00, 0xf8, 0x66, 0x09, 0x00, 0xfc, 0x66, + 0x09, 0x00, 0xfe, 0x66, 0x09, 0x00, 0xff, 0x66, 0x09, 0x00, 0x3e, 0x67, + 0x09, 0x00, 0x3f, 0x67, 0x09, 0x00, 0x88, 0x67, 0x09, 0x00, 0x3e, 0x68, + 0x09, 0x00, 0x3f, 0x68, 0x09, 0x00, 0x45, 0x68, 0x09, 0x00, 0x4f, 0x68, + 0x09, 0x00, 0xbe, 0x68, 0x09, 0x00, 0xbf, 0x68, 0x09, 0x00, 0x3e, 0x69, + 0x09, 0x00, 0x3f, 0x69, 0x09, 0x00, 0xf4, 0x69, 0x09, 0x00, 0xf5, 0x69, + 0x09, 0x00, 0xf8, 0x69, 0x09, 0x00, 0xfc, 0x69, 0x09, 0x00, 0xfe, 0x69, + 0x09, 0x00, 0xff, 0x69, 0x09, 0x00, 0x38, 0x6a, 0x09, 0x00, 0xb8, 0x6a, + 0x09, 0x00, 0xbe, 0x6b, 0x09, 0x00, 0xbf, 0x6b, 0x09, 0x00, 0x3e, 0x6d, + 0x09, 0x00, 0x3f, 0x6d, 0x09, 0x00, 0xfe, 0x6d, 0x09, 0x00, 0xff, 0x6d, + 0x09, 0x00, 0xf3, 0x6f, 0x09, 0x00, 0xfb, 0x6f, 0x09, 0x00, 0x38, 0x70, + 0x09, 0x00, 0x44, 0x70, 0x09, 0x00, 0xbe, 0x70, 0x09, 0x00, 0xbf, 0x70, + 0x09, 0x00, 0x34, 0x71, 0x09, 0x00, 0x3e, 0x71, 0x09, 0x00, 0x3f, 0x71, + 0x09, 0x00, 0x58, 0x71, 0x09, 0x00, 0x5c, 0x71, 0x09, 0x00, 0x5e, 0x71, + 0x09, 0x00, 0x5f, 0x71, 0x09, 0x00, 0xb4, 0x71, 0x09, 0x00, 0xbe, 0x71, + 0x09, 0x00, 0xbf, 0x71, 0x09, 0x00, 0xf8, 0x71, 0x09, 0x00, 0xfc, 0x71, + 0x09, 0x00, 0xfe, 0x71, 0x09, 0x00, 0xff, 0x71, 0x09, 0x00, 0x38, 0x72, + 0x09, 0x00, 0xbe, 0x74, 0x09, 0x00, 0xbf, 0x74, 0x09, 0x00, 0x38, 0x75, + 0x09, 0x00, 0x58, 0x75, 0x09, 0x00, 0xf8, 0x75, 0x09, 0x00, 0xb4, 0x76, + 0x09, 0x00, 0xbe, 0x76, 0x09, 0x00, 0xbf, 0x76, 0x09, 0x00, 0xbe, 0x77, + 0x09, 0x00, 0xbf, 0x77, 0x09, 0x00, 0xc4, 0x77, 0x09, 0x00, 0xc8, 0x77, + 0x09, 0x00, 0xe4, 0x77, 0x09, 0x00, 0xe8, 0x77, 0x09, 0x00, 0xf4, 0x77, + 0x09, 0x00, 0xf5, 0x77, 0x09, 0x00, 0xf8, 0x77, 0x09, 0x00, 0xfc, 0x77, + 0x09, 0x00, 0xfe, 0x77, 0x09, 0x00, 0xff, 0x77, 0x09, 0x00, 0xe8, 0x78, + 0x09, 0x00, 0xeb, 0x78, 0x09, 0x00, 0xfe, 0x78, 0x09, 0x00, 0xff, 0x78, + 0x09, 0x00, 0x3e, 0x7a, 0x09, 0x00, 0x3f, 0x7a, 0x09, 0x00, 0xb4, 0x7a, + 0x09, 0x00, 0xbe, 0x7a, 0x09, 0x00, 0xbf, 0x7a, 0x09, 0x00, 0xcb, 0x7a, + 0x09, 0x00, 0xeb, 0x7a, 0x09, 0x00, 0xf8, 0x7a, 0x09, 0x00, 0xfc, 0x7a, + 0x09, 0x00, 0xfe, 0x7a, 0x09, 0x00, 0xff, 0x7a, 0x09, 0x00, 0xbe, 0x7b, + 0x09, 0x00, 0xbf, 0x7b, 0x09, 0x00, 0x38, 0x7c, 0x09, 0x00, 0x38, 0x7e, + 0x09, 0x00, 0x38, 0x7f, 0x09, 0x00, 0x83, 0x83, 0x09, 0x00, 0xe3, 0x83, + 0x09, 0x00, 0xed, 0x83, 0x09, 0x00, 0xf1, 0x83, 0x09, 0x00, 0xf3, 0x83, + 0x09, 0x00, 0xf9, 0x83, 0x09, 0x00, 0xfb, 0x83, 0x09, 0x00, 0xfd, 0x83, + 0x09, 0x00, 0x32, 0x85, 0x09, 0x00, 0x37, 0x85, 0x09, 0x00, 0x38, 0x85, + 0x09, 0x00, 0x3a, 0x85, 0x09, 0x00, 0x3c, 0x85, 0x09, 0x00, 0x3e, 0x85, + 0x09, 0x00, 0x3f, 0x85, 0x09, 0x00, 0x5f, 0x85, 0x09, 0x00, 0xb8, 0x85, + 0x09, 0x00, 0xbc, 0x85, 0x09, 0x00, 0xbe, 0x85, 0x09, 0x00, 0xbf, 0x85, + 0x09, 0x00, 0x30, 0x86, 0x09, 0x00, 0x31, 0x86, 0x09, 0x00, 0x39, 0x86, + 0x09, 0x00, 0x3d, 0x86, 0x09, 0x00, 0x31, 0x87, 0x09, 0x00, 0x33, 0x87, + 0x09, 0x00, 0x39, 0x87, 0x09, 0x00, 0x3b, 0x87, 0x09, 0x00, 0x3d, 0x87, + 0x09, 0x00, 0x83, 0x87, 0x09, 0x00, 0x87, 0x87, 0x09, 0x00, 0x8d, 0x87, + 0x09, 0x00, 0xe1, 0x87, 0x09, 0x00, 0xe2, 0x87, 0x09, 0x00, 0xe7, 0x87, + 0x09, 0x00, 0xeb, 0x87, 0x09, 0x00, 0xee, 0x87, 0x09, 0x00, 0xef, 0x87, + 0x09, 0x00, 0xf2, 0x87, 0x09, 0x00, 0xf7, 0x87, 0x09, 0x00, 0xf8, 0x87, + 0x09, 0x00, 0xfa, 0x87, 0x09, 0x00, 0xfc, 0x87, 0x09, 0x00, 0xfe, 0x87, + 0x09, 0x00, 0xff, 0x87, 0x09, 0x00, 0x37, 0x8a, 0x09, 0x00, 0x31, 0x8b, + 0x09, 0x00, 0x33, 0x8b, 0x09, 0x00, 0x37, 0x8b, 0x09, 0x00, 0x39, 0x8b, + 0x09, 0x00, 0x3b, 0x8b, 0x09, 0x00, 0x3d, 0x8b, 0x09, 0x00, 0x8b, 0x8b, + 0x09, 0x00, 0x8d, 0x8b, 0x09, 0x00, 0xe1, 0x8b, 0x09, 0x00, 0xe2, 0x8b, + 0x09, 0x00, 0xee, 0x8b, 0x09, 0x00, 0xef, 0x8b, 0x09, 0x00, 0xf2, 0x8b, + 0x09, 0x00, 0xf8, 0x8b, 0x09, 0x00, 0xfa, 0x8b, 0x09, 0x00, 0xfc, 0x8b, + 0x09, 0x00, 0xfe, 0x8b, 0x09, 0x00, 0xff, 0x8b, 0x09, 0x00, 0x8b, 0x8f, + 0x09, 0x00, 0xe3, 0x8f, 0x09, 0x00, 0xe7, 0x8f, 0x09, 0x00, 0xeb, 0x8f, + 0x09, 0x00, 0xed, 0x8f, 0x09, 0x00, 0xf1, 0x8f, 0x09, 0x00, 0xf3, 0x8f, + 0x09, 0x00, 0xf7, 0x8f, 0x09, 0x00, 0xf9, 0x8f, 0x09, 0x00, 0xfb, 0x8f, + 0x09, 0x00, 0xfd, 0x8f, 0x09, 0x00, 0x3e, 0x92, 0x09, 0x00, 0x3f, 0x92, + 0x09, 0x00, 0xff, 0x95, 0x09, 0x00, 0xf3, 0x99, 0x09, 0x00, 0xfb, 0x99, + 0x09, 0x00, 0xf3, 0x9d, 0x09, 0x00, 0xfb, 0x9d, 0x09, 0x00, 0x38, 0x9e, + 0x09, 0x00, 0x3c, 0x9e, 0x09, 0x00, 0x3e, 0x9e, 0x09, 0x00, 0x3f, 0x9e, + 0x09, 0x00, 0x38, 0x9f, 0x09, 0x00, 0x3c, 0x9f, 0x09, 0x00, 0x3e, 0x9f, + 0x09, 0x00, 0x3f, 0x9f, 0x09, 0x00, 0xeb, 0xa3, 0x09, 0x00, 0xf8, 0xa3, + 0x09, 0x00, 0xfc, 0xa3, 0x09, 0x00, 0xfe, 0xa3, 0x09, 0x00, 0xff, 0xa3, + 0x09, 0x00, 0xf8, 0xa7, 0x09, 0x00, 0xfc, 0xa7, 0x09, 0x00, 0xfe, 0xa7, + 0x09, 0x00, 0xff, 0xa7, 0x09, 0x00, 0xb8, 0xaa, 0x09, 0x00, 0xbc, 0xaa, + 0x09, 0x00, 0xbe, 0xaa, 0x09, 0x00, 0xbf, 0xaa, 0x09, 0x00, 0x3e, 0xab, + 0x09, 0x00, 0x3f, 0xab, 0x09, 0x00, 0x8b, 0xab, 0x09, 0x00, 0xeb, 0xab, + 0x09, 0x00, 0x30, 0xb3, 0x09, 0x00, 0x31, 0xb3, 0x09, 0x00, 0x37, 0xb3, + 0x09, 0x00, 0x39, 0xb3, 0x09, 0x00, 0x3d, 0xb3, 0x09, 0x00, 0xf8, 0xb3, + 0x09, 0x00, 0xfc, 0xb3, 0x09, 0x00, 0xfe, 0xb3, 0x09, 0x00, 0xff, 0xb3, + 0x09, 0x00, 0x8b, 0xb7, 0x09, 0x00, 0xf8, 0xb7, 0x09, 0x00, 0xfc, 0xb7, + 0x09, 0x00, 0xfe, 0xb7, 0x09, 0x00, 0xff, 0xb7, 0x09, 0x00, 0x3f, 0xb9, + 0x09, 0x00, 0xbf, 0xb9, 0x09, 0x00, 0x30, 0xbb, 0x09, 0x00, 0x31, 0xbb, + 0x09, 0x00, 0x37, 0xbb, 0x09, 0x00, 0x39, 0xbb, 0x09, 0x00, 0x3d, 0xbb, + 0x09, 0x00, 0x8b, 0xbb, 0x09, 0x00, 0xf8, 0xbb, 0x09, 0x00, 0xfc, 0xbb, + 0x09, 0x00, 0xfe, 0xbb, 0x09, 0x00, 0xff, 0xbb, 0x09, 0x00, 0x37, 0xbd, + 0x09, 0x00, 0x38, 0xbf, 0x09, 0x00, 0x3c, 0xbf, 0x09, 0x00, 0x3e, 0xbf, + 0x09, 0x00, 0x3f, 0xbf, 0x09, 0x00, 0x8b, 0xbf, 0x09, 0x00, 0xe7, 0xbf, + 0x09, 0x00, 0xeb, 0xbf, 0x09, 0x00, 0xf0, 0xbf, 0x09, 0x00, 0xf1, 0xbf, + 0x09, 0x00, 0xf7, 0xbf, 0x09, 0x00, 0xf9, 0xbf, 0x09, 0x00, 0xfd, 0xbf, + 0x09, 0x00, 0xb8, 0xc2, 0x09, 0x00, 0xbc, 0xc2, 0x09, 0x00, 0xbe, 0xc2, + 0x09, 0x00, 0xbf, 0xc2, 0x09, 0x00, 0x8b, 0xc3, 0x09, 0x00, 0x8e, 0xc3, + 0x09, 0x00, 0x8f, 0xc3, 0x09, 0x00, 0xb3, 0xc5, 0x09, 0x00, 0xbb, 0xc5, + 0x09, 0x00, 0xc3, 0xc5, 0x09, 0x00, 0xf2, 0xc5, 0x09, 0x00, 0xf7, 0xc5, + 0x09, 0x00, 0xf8, 0xc5, 0x09, 0x00, 0xfa, 0xc5, 0x09, 0x00, 0xfc, 0xc5, + 0x09, 0x00, 0xfe, 0xc5, 0x09, 0x00, 0xff, 0xc5, 0x09, 0x00, 0xff, 0xc9, + 0x09, 0x00, 0xff, 0xcd, 0x09, 0x00, 0xf3, 0xd5, 0x09, 0x00, 0xfb, 0xd5, + 0x09, 0x00, 0xf3, 0xd9, 0x09, 0x00, 0xfb, 0xd9, 0x09, 0x00, 0xc3, 0xdd, + 0x09, 0x00, 0xcf, 0xdd, 0x09, 0x00, 0xf8, 0xdd, 0x09, 0x00, 0xfc, 0xdd, + 0x09, 0x00, 0xfe, 0xdd, 0x09, 0x00, 0xff, 0xdd, 0x09, 0x00, 0x84, 0xe3, + 0x09, 0x00, 0xff, 0xe5, 0x09, 0x00, 0xf1, 0xe9, 0x09, 0x00, 0xf3, 0xe9, + 0x09, 0x00, 0xf9, 0xe9, 0x09, 0x00, 0xfb, 0xe9, 0x09, 0x00, 0xfd, 0xe9, + 0x09, 0x00, 0xf1, 0xed, 0x09, 0x00, 0xf3, 0xed, 0x09, 0x00, 0xf9, 0xed, + 0x09, 0x00, 0xfb, 0xed, 0x09, 0x00, 0xfd, 0xed, 0x09, 0x00, 0x37, 0xf2, + 0x09, 0x00, 0xff, 0xf2, 0x09, 0x00, 0x84, 0xf3, 0x09, 0x00, 0x8e, 0xf3, + 0x09, 0x00, 0x8f, 0xf3, 0x09, 0x00, 0xff, 0xf5, 0x09, 0x00, 0xb3, 0xf9, + 0x09, 0x00, 0xbb, 0xf9, 0x09, 0x00, 0xff, 0xf9, 0x09, 0x00, 0xf8, 0xfc, + 0x09, 0x00, 0xfc, 0xfc, 0x09, 0x00, 0xfe, 0xfc, 0x09, 0x00, 0xff, 0xfc, + 0x09, 0x00, 0xb4, 0xfd, 0x09, 0x00, 0xff, 0xfd, 0x09, 0x00, 0x37, 0xfe, + 0x09, 0x00, 0xff, 0xfe, 0x09, 0x00, 0x31, 0xff, 0x09, 0x00, 0x33, 0xff, + 0x09, 0x00, 0x37, 0xff, 0x09, 0x00, 0x39, 0xff, 0x09, 0x00, 0x3b, 0xff, + 0x09, 0x00, 0x3d, 0xff, 0x09, 0x00, 0xb3, 0xff, 0x09, 0x00, 0xbb, 0xff, + 0x09, 0x00, 0x38, 0x00, 0x0a, 0x00, 0x3c, 0x00, 0x0a, 0x00, 0x3e, 0x00, + 0x0a, 0x00, 0x3f, 0x00, 0x0a, 0x00, 0xe8, 0x00, 0x0a, 0x00, 0xeb, 0x00, + 0x0a, 0x00, 0xf8, 0x00, 0x0a, 0x00, 0xfc, 0x00, 0x0a, 0x00, 0xfe, 0x00, + 0x0a, 0x00, 0xff, 0x00, 0x0a, 0x00, 0x38, 0x03, 0x0a, 0x00, 0x3c, 0x03, + 0x0a, 0x00, 0x3e, 0x03, 0x0a, 0x00, 0x3f, 0x03, 0x0a, 0x00, 0x88, 0x07, + 0x0a, 0x00, 0x8b, 0x07, 0x0a, 0x00, 0x4b, 0x08, 0x0a, 0x00, 0x38, 0x10, + 0x0a, 0x00, 0xbe, 0x10, 0x0a, 0x00, 0xbf, 0x10, 0x0a, 0x00, 0xe8, 0x10, + 0x0a, 0x00, 0xeb, 0x10, 0x0a, 0x00, 0xb8, 0x14, 0x0a, 0x00, 0xbc, 0x14, + 0x0a, 0x00, 0xbe, 0x14, 0x0a, 0x00, 0xbf, 0x14, 0x0a, 0x00, 0x38, 0x15, + 0x0a, 0x00, 0xf8, 0x15, 0x0a, 0x00, 0xfc, 0x15, 0x0a, 0x00, 0xfe, 0x15, + 0x0a, 0x00, 0xff, 0x15, 0x0a, 0x00, 0xb8, 0x16, 0x0a, 0x00, 0xbc, 0x16, + 0x0a, 0x00, 0xbe, 0x16, 0x0a, 0x00, 0xbf, 0x16, 0x0a, 0x00, 0xb8, 0x17, + 0x0a, 0x00, 0xbc, 0x17, 0x0a, 0x00, 0xbe, 0x17, 0x0a, 0x00, 0xbf, 0x17, + 0x0a, 0x00, 0xf8, 0x19, 0x0a, 0x00, 0xfc, 0x19, 0x0a, 0x00, 0xfe, 0x19, + 0x0a, 0x00, 0xff, 0x19, 0x0a, 0x00, 0x38, 0x1d, 0x0a, 0x00, 0xf8, 0x1d, + 0x0a, 0x00, 0xfc, 0x1d, 0x0a, 0x00, 0xfe, 0x1d, 0x0a, 0x00, 0xff, 0x1d, + 0x0a, 0x00, 0x38, 0x22, 0x0a, 0x00, 0x3c, 0x22, 0x0a, 0x00, 0x3e, 0x22, + 0x0a, 0x00, 0x3f, 0x22, 0x0a, 0x00, 0xc8, 0x22, 0x0a, 0x00, 0xcb, 0x22, + 0x0a, 0x00, 0xe8, 0x22, 0x0a, 0x00, 0xeb, 0x22, 0x0a, 0x00, 0xf8, 0x22, + 0x0a, 0x00, 0xfc, 0x22, 0x0a, 0x00, 0xfe, 0x22, 0x0a, 0x00, 0xff, 0x22, + 0x0a, 0x00, 0x38, 0x25, 0x0a, 0x00, 0x3c, 0x25, 0x0a, 0x00, 0x3e, 0x25, + 0x0a, 0x00, 0x3f, 0x25, 0x0a, 0x00, 0x58, 0x29, 0x0a, 0x00, 0x5c, 0x29, + 0x0a, 0x00, 0x5e, 0x29, 0x0a, 0x00, 0x5f, 0x29, 0x0a, 0x00, 0xf8, 0x29, + 0x0a, 0x00, 0xfc, 0x29, 0x0a, 0x00, 0xfe, 0x29, 0x0a, 0x00, 0xff, 0x29, + 0x0a, 0x00, 0x38, 0x2c, 0x0a, 0x00, 0x38, 0x2d, 0x0a, 0x00, 0x58, 0x2d, + 0x0a, 0x00, 0x5c, 0x2d, 0x0a, 0x00, 0x5e, 0x2d, 0x0a, 0x00, 0x5f, 0x2d, + 0x0a, 0x00, 0xf8, 0x2d, 0x0a, 0x00, 0xfc, 0x2d, 0x0a, 0x00, 0xfe, 0x2d, + 0x0a, 0x00, 0xff, 0x2d, 0x0a, 0x00, 0xe8, 0x2e, 0x0a, 0x00, 0xeb, 0x2e, + 0x0a, 0x00, 0xf8, 0x2e, 0x0a, 0x00, 0xfc, 0x2e, 0x0a, 0x00, 0xfe, 0x2e, + 0x0a, 0x00, 0xff, 0x2e, 0x0a, 0x00, 0x36, 0x33, 0x0a, 0x00, 0x37, 0x33, + 0x0a, 0x00, 0x38, 0x33, 0x0a, 0x00, 0x3c, 0x33, 0x0a, 0x00, 0x3e, 0x33, + 0x0a, 0x00, 0x3f, 0x33, 0x0a, 0x00, 0xb8, 0x33, 0x0a, 0x00, 0xbc, 0x33, + 0x0a, 0x00, 0xbe, 0x33, 0x0a, 0x00, 0xbf, 0x33, 0x0a, 0x00, 0xe9, 0x33, + 0x0a, 0x00, 0xea, 0x33, 0x0a, 0x00, 0xf0, 0x33, 0x0a, 0x00, 0xf1, 0x33, + 0x0a, 0x00, 0xf9, 0x33, 0x0a, 0x00, 0xfd, 0x33, 0x0a, 0x00, 0x30, 0x3f, + 0x0a, 0x00, 0x31, 0x3f, 0x0a, 0x00, 0x39, 0x3f, 0x0a, 0x00, 0x3d, 0x3f, + 0x0a, 0x00, 0xf0, 0x41, 0x0a, 0x00, 0xf1, 0x41, 0x0a, 0x00, 0xf9, 0x41, + 0x0a, 0x00, 0xfd, 0x41, 0x0a, 0x00, 0xcb, 0x43, 0x0a, 0x00, 0xf7, 0x43, + 0x0a, 0x00, 0xf8, 0x43, 0x0a, 0x00, 0xfc, 0x43, 0x0a, 0x00, 0xfe, 0x43, + 0x0a, 0x00, 0xff, 0x43, 0x0a, 0x00, 0x37, 0x45, 0x0a, 0x00, 0x38, 0x45, + 0x0a, 0x00, 0x3c, 0x45, 0x0a, 0x00, 0x3e, 0x45, 0x0a, 0x00, 0x3f, 0x45, + 0x0a, 0x00, 0xb8, 0x45, 0x0a, 0x00, 0xbc, 0x45, 0x0a, 0x00, 0xbe, 0x45, + 0x0a, 0x00, 0xbf, 0x45, 0x0a, 0x00, 0xb7, 0x47, 0x0a, 0x00, 0xb8, 0x47, + 0x0a, 0x00, 0xbc, 0x47, 0x0a, 0x00, 0xbe, 0x47, 0x0a, 0x00, 0xbf, 0x47, + 0x0a, 0x00, 0xf7, 0x47, 0x0a, 0x00, 0xf8, 0x47, 0x0a, 0x00, 0xfc, 0x47, + 0x0a, 0x00, 0xfe, 0x47, 0x0a, 0x00, 0xff, 0x47, 0x0a, 0x00, 0xff, 0x49, + 0x0a, 0x00, 0x30, 0x4b, 0x0a, 0x00, 0x3d, 0x4b, 0x0a, 0x00, 0x3e, 0x4b, + 0x0a, 0x00, 0x3f, 0x4b, 0x0a, 0x00, 0xb1, 0x4b, 0x0a, 0x00, 0xb7, 0x4b, + 0x0a, 0x00, 0xb8, 0x4b, 0x0a, 0x00, 0xe7, 0x4b, 0x0a, 0x00, 0xf0, 0x4b, + 0x0a, 0x00, 0xf1, 0x4b, 0x0a, 0x00, 0xf7, 0x4b, 0x0a, 0x00, 0xf9, 0x4b, + 0x0a, 0x00, 0xfd, 0x4b, 0x0a, 0x00, 0xff, 0x4d, 0x0a, 0x00, 0xb8, 0x52, + 0x0a, 0x00, 0xbc, 0x52, 0x0a, 0x00, 0xbe, 0x52, 0x0a, 0x00, 0xbf, 0x52, + 0x0a, 0x00, 0xff, 0x55, 0x0a, 0x00, 0x37, 0x59, 0x0a, 0x00, 0x38, 0x59, + 0x0a, 0x00, 0x3c, 0x59, 0x0a, 0x00, 0x3e, 0x59, 0x0a, 0x00, 0x3f, 0x59, + 0x0a, 0x00, 0xb8, 0x5c, 0x0a, 0x00, 0xbc, 0x5c, 0x0a, 0x00, 0xbe, 0x5c, + 0x0a, 0x00, 0xbf, 0x5c, 0x0a, 0x00, 0x30, 0x5d, 0x0a, 0x00, 0x31, 0x5d, + 0x0a, 0x00, 0x39, 0x5d, 0x0a, 0x00, 0x3d, 0x5d, 0x0a, 0x00, 0xb8, 0x5e, + 0x0a, 0x00, 0xbc, 0x5e, 0x0a, 0x00, 0xbe, 0x5e, 0x0a, 0x00, 0xbf, 0x5e, + 0x0a, 0x00, 0xf0, 0x5f, 0x0a, 0x00, 0xf1, 0x5f, 0x0a, 0x00, 0xf9, 0x5f, + 0x0a, 0x00, 0xfd, 0x5f, 0x0a, 0x00, 0xf3, 0x61, 0x0a, 0x00, 0xfb, 0x61, + 0x0a, 0x00, 0xcf, 0x63, 0x0a, 0x00, 0xf8, 0x63, 0x0a, 0x00, 0xfc, 0x63, + 0x0a, 0x00, 0xfe, 0x63, 0x0a, 0x00, 0xff, 0x63, 0x0a, 0x00, 0x33, 0x65, + 0x0a, 0x00, 0x3b, 0x65, 0x0a, 0x00, 0x3f, 0x65, 0x0a, 0x00, 0xff, 0x66, + 0x0a, 0x00, 0xb3, 0x67, 0x0a, 0x00, 0xbb, 0x67, 0x0a, 0x00, 0xce, 0x67, + 0x0a, 0x00, 0xcf, 0x67, 0x0a, 0x00, 0xee, 0x67, 0x0a, 0x00, 0xef, 0x67, + 0x0a, 0x00, 0xf8, 0x67, 0x0a, 0x00, 0xfc, 0x67, 0x0a, 0x00, 0xfe, 0x67, + 0x0a, 0x00, 0xff, 0x67, 0x0a, 0x00, 0xf8, 0x69, 0x0a, 0x00, 0xfc, 0x69, + 0x0a, 0x00, 0xfe, 0x69, 0x0a, 0x00, 0xff, 0x69, 0x0a, 0x00, 0x34, 0x6b, + 0x0a, 0x00, 0x3e, 0x6b, 0x0a, 0x00, 0x3f, 0x6b, 0x0a, 0x00, 0xb4, 0x6b, + 0x0a, 0x00, 0xbe, 0x6b, 0x0a, 0x00, 0xbf, 0x6b, 0x0a, 0x00, 0xf3, 0x6b, + 0x0a, 0x00, 0xfb, 0x6b, 0x0a, 0x00, 0xf8, 0x6d, 0x0a, 0x00, 0xfc, 0x6d, + 0x0a, 0x00, 0xfe, 0x6d, 0x0a, 0x00, 0xff, 0x6d, 0x0a, 0x00, 0xff, 0x71, + 0x0a, 0x00, 0x3e, 0x73, 0x0a, 0x00, 0x3f, 0x73, 0x0a, 0x00, 0xf3, 0x73, + 0x0a, 0x00, 0xfb, 0x73, 0x0a, 0x00, 0xce, 0x77, 0x0a, 0x00, 0xcf, 0x77, + 0x0a, 0x00, 0xee, 0x77, 0x0a, 0x00, 0xef, 0x77, 0x0a, 0x00, 0xf8, 0x77, + 0x0a, 0x00, 0xfc, 0x77, 0x0a, 0x00, 0xfe, 0x77, 0x0a, 0x00, 0xff, 0x77, + 0x0a, 0x00, 0xf3, 0x79, 0x0a, 0x00, 0xfb, 0x79, 0x0a, 0x00, 0x34, 0x7b, + 0x0a, 0x00, 0x38, 0x7b, 0x0a, 0x00, 0xb4, 0x7b, 0x0a, 0x00, 0xb8, 0x7b, + 0x0a, 0x00, 0xee, 0x7b, 0x0a, 0x00, 0xef, 0x7b, 0x0a, 0x00, 0xf8, 0x7b, + 0x0a, 0x00, 0xfc, 0x7b, 0x0a, 0x00, 0xfe, 0x7b, 0x0a, 0x00, 0xff, 0x7b, + 0x0a, 0x00, 0x3f, 0x7c, 0x0a, 0x00, 0xf3, 0x7d, 0x0a, 0x00, 0xfb, 0x7d, + 0x0a, 0x00, 0x3f, 0x7e, 0x0a, 0x00, 0x38, 0x7f, 0x0a, 0x00, 0x3c, 0x7f, + 0x0a, 0x00, 0x3e, 0x7f, 0x0a, 0x00, 0x3f, 0x7f, 0x0a, 0x00, 0x31, 0x80, + 0x0a, 0x00, 0x33, 0x80, 0x0a, 0x00, 0x39, 0x80, 0x0a, 0x00, 0x3b, 0x80, + 0x0a, 0x00, 0x3d, 0x80, 0x0a, 0x00, 0x43, 0x80, 0x0a, 0x00, 0xb1, 0x80, + 0x0a, 0x00, 0xb3, 0x80, 0x0a, 0x00, 0xb9, 0x80, 0x0a, 0x00, 0xbb, 0x80, + 0x0a, 0x00, 0xbd, 0x80, 0x0a, 0x00, 0xe1, 0x80, 0x0a, 0x00, 0xe2, 0x80, + 0x0a, 0x00, 0xe7, 0x80, 0x0a, 0x00, 0xeb, 0x80, 0x0a, 0x00, 0xee, 0x80, + 0x0a, 0x00, 0xef, 0x80, 0x0a, 0x00, 0xf2, 0x80, 0x0a, 0x00, 0xf7, 0x80, + 0x0a, 0x00, 0xf8, 0x80, 0x0a, 0x00, 0xfa, 0x80, 0x0a, 0x00, 0xfc, 0x80, + 0x0a, 0x00, 0xfe, 0x80, 0x0a, 0x00, 0xff, 0x80, 0x0a, 0x00, 0xc3, 0x81, + 0x0a, 0x00, 0xf2, 0x81, 0x0a, 0x00, 0xf7, 0x81, 0x0a, 0x00, 0xf8, 0x81, + 0x0a, 0x00, 0xfa, 0x81, 0x0a, 0x00, 0xfc, 0x81, 0x0a, 0x00, 0xfe, 0x81, + 0x0a, 0x00, 0xff, 0x81, 0x0a, 0x00, 0xb3, 0x82, 0x0a, 0x00, 0xbb, 0x82, + 0x0a, 0x00, 0xe3, 0x82, 0x0a, 0x00, 0xed, 0x82, 0x0a, 0x00, 0xf1, 0x82, + 0x0a, 0x00, 0xf3, 0x82, 0x0a, 0x00, 0xf9, 0x82, 0x0a, 0x00, 0xfb, 0x82, + 0x0a, 0x00, 0xfd, 0x82, 0x0a, 0x00, 0x32, 0x83, 0x0a, 0x00, 0x37, 0x83, + 0x0a, 0x00, 0x38, 0x83, 0x0a, 0x00, 0x3a, 0x83, 0x0a, 0x00, 0x3c, 0x83, + 0x0a, 0x00, 0x3e, 0x83, 0x0a, 0x00, 0x3f, 0x83, 0x0a, 0x00, 0x43, 0x83, + 0x0a, 0x00, 0x4f, 0x83, 0x0a, 0x00, 0xb8, 0x83, 0x0a, 0x00, 0xbc, 0x83, + 0x0a, 0x00, 0xbe, 0x83, 0x0a, 0x00, 0xbf, 0x83, 0x0a, 0x00, 0xe3, 0x83, + 0x0a, 0x00, 0xed, 0x83, 0x0a, 0x00, 0xf1, 0x83, 0x0a, 0x00, 0xf3, 0x83, + 0x0a, 0x00, 0xf9, 0x83, 0x0a, 0x00, 0xfb, 0x83, 0x0a, 0x00, 0xfd, 0x83, + 0x0a, 0x00, 0x37, 0x84, 0x0a, 0x00, 0x38, 0x84, 0x0a, 0x00, 0x3c, 0x84, + 0x0a, 0x00, 0x3e, 0x84, 0x0a, 0x00, 0x3f, 0x84, 0x0a, 0x00, 0xe7, 0x84, + 0x0a, 0x00, 0xeb, 0x84, 0x0a, 0x00, 0xf7, 0x84, 0x0a, 0x00, 0xf8, 0x84, + 0x0a, 0x00, 0xfc, 0x84, 0x0a, 0x00, 0xfe, 0x84, 0x0a, 0x00, 0xff, 0x84, + 0x0a, 0x00, 0xb8, 0x85, 0x0a, 0x00, 0xbc, 0x85, 0x0a, 0x00, 0xbe, 0x85, + 0x0a, 0x00, 0xbf, 0x85, 0x0a, 0x00, 0xcd, 0x85, 0x0a, 0x00, 0xf1, 0x85, + 0x0a, 0x00, 0xf3, 0x85, 0x0a, 0x00, 0xf9, 0x85, 0x0a, 0x00, 0xfb, 0x85, + 0x0a, 0x00, 0xfd, 0x85, 0x0a, 0x00, 0x30, 0x86, 0x0a, 0x00, 0x31, 0x86, + 0x0a, 0x00, 0x39, 0x86, 0x0a, 0x00, 0x3d, 0x86, 0x0a, 0x00, 0x31, 0x87, + 0x0a, 0x00, 0x33, 0x87, 0x0a, 0x00, 0x39, 0x87, 0x0a, 0x00, 0x3b, 0x87, + 0x0a, 0x00, 0x3d, 0x87, 0x0a, 0x00, 0x83, 0x87, 0x0a, 0x00, 0x87, 0x87, + 0x0a, 0x00, 0x8d, 0x87, 0x0a, 0x00, 0xe1, 0x87, 0x0a, 0x00, 0xe2, 0x87, + 0x0a, 0x00, 0xe7, 0x87, 0x0a, 0x00, 0xeb, 0x87, 0x0a, 0x00, 0xee, 0x87, + 0x0a, 0x00, 0xef, 0x87, 0x0a, 0x00, 0xf2, 0x87, 0x0a, 0x00, 0xf7, 0x87, + 0x0a, 0x00, 0xf8, 0x87, 0x0a, 0x00, 0xfa, 0x87, 0x0a, 0x00, 0xfc, 0x87, + 0x0a, 0x00, 0xfe, 0x87, 0x0a, 0x00, 0xff, 0x87, 0x0a, 0x00, 0xb2, 0x88, + 0x0a, 0x00, 0xb8, 0x88, 0x0a, 0x00, 0xba, 0x88, 0x0a, 0x00, 0xbc, 0x88, + 0x0a, 0x00, 0xbe, 0x88, 0x0a, 0x00, 0xbf, 0x88, 0x0a, 0x00, 0xf3, 0x89, + 0x0a, 0x00, 0xf7, 0x89, 0x0a, 0x00, 0xfb, 0x89, 0x0a, 0x00, 0x37, 0x8a, + 0x0a, 0x00, 0x8b, 0x8b, 0x0a, 0x00, 0x8d, 0x8b, 0x0a, 0x00, 0x4f, 0x8c, + 0x0a, 0x00, 0xb8, 0x8c, 0x0a, 0x00, 0xbc, 0x8c, 0x0a, 0x00, 0xbe, 0x8c, + 0x0a, 0x00, 0xbf, 0x8c, 0x0a, 0x00, 0xff, 0x8d, 0x0a, 0x00, 0x33, 0x8e, + 0x0a, 0x00, 0x37, 0x8e, 0x0a, 0x00, 0x3b, 0x8e, 0x0a, 0x00, 0x43, 0x8e, + 0x0a, 0x00, 0xbf, 0x8e, 0x0a, 0x00, 0x32, 0x8f, 0x0a, 0x00, 0x38, 0x8f, + 0x0a, 0x00, 0x3a, 0x8f, 0x0a, 0x00, 0x3c, 0x8f, 0x0a, 0x00, 0x3e, 0x8f, + 0x0a, 0x00, 0x3f, 0x8f, 0x0a, 0x00, 0x4f, 0x8f, 0x0a, 0x00, 0xb8, 0x8f, + 0x0a, 0x00, 0xbc, 0x8f, 0x0a, 0x00, 0xbe, 0x8f, 0x0a, 0x00, 0xbf, 0x8f, + 0x0a, 0x00, 0xe3, 0x8f, 0x0a, 0x00, 0xe7, 0x8f, 0x0a, 0x00, 0xeb, 0x8f, + 0x0a, 0x00, 0xed, 0x8f, 0x0a, 0x00, 0xf1, 0x8f, 0x0a, 0x00, 0xf3, 0x8f, + 0x0a, 0x00, 0xf7, 0x8f, 0x0a, 0x00, 0xf9, 0x8f, 0x0a, 0x00, 0xfb, 0x8f, + 0x0a, 0x00, 0xfd, 0x8f, 0x0a, 0x00, 0x3e, 0x92, 0x0a, 0x00, 0x3f, 0x92, + 0x0a, 0x00, 0x34, 0x93, 0x0a, 0x00, 0x3e, 0x93, 0x0a, 0x00, 0x3f, 0x93, + 0x0a, 0x00, 0xf3, 0x93, 0x0a, 0x00, 0xfb, 0x93, 0x0a, 0x00, 0xff, 0x95, + 0x0a, 0x00, 0xf3, 0x99, 0x0a, 0x00, 0xfb, 0x99, 0x0a, 0x00, 0x3e, 0x9c, + 0x0a, 0x00, 0x3f, 0x9c, 0x0a, 0x00, 0xf3, 0x9d, 0x0a, 0x00, 0xfb, 0x9d, + 0x0a, 0x00, 0xe3, 0x9f, 0x0a, 0x00, 0xf3, 0x9f, 0x0a, 0x00, 0xfb, 0x9f, + 0x0a, 0x00, 0x3f, 0xa4, 0x0a, 0x00, 0xf8, 0xa4, 0x0a, 0x00, 0xfc, 0xa4, + 0x0a, 0x00, 0xfe, 0xa4, 0x0a, 0x00, 0xff, 0xa4, 0x0a, 0x00, 0xcf, 0xa5, + 0x0a, 0x00, 0xff, 0xa5, 0x0a, 0x00, 0x33, 0xa7, 0x0a, 0x00, 0x3b, 0xa7, + 0x0a, 0x00, 0x83, 0xa7, 0x0a, 0x00, 0x8e, 0xa7, 0x0a, 0x00, 0x8f, 0xa7, + 0x0a, 0x00, 0xee, 0xa7, 0x0a, 0x00, 0xef, 0xa7, 0x0a, 0x00, 0xf8, 0xa7, + 0x0a, 0x00, 0xfc, 0xa7, 0x0a, 0x00, 0xfe, 0xa7, 0x0a, 0x00, 0xff, 0xa7, + 0x0a, 0x00, 0xb8, 0xaa, 0x0a, 0x00, 0xbc, 0xaa, 0x0a, 0x00, 0xbe, 0xaa, + 0x0a, 0x00, 0xbf, 0xaa, 0x0a, 0x00, 0x84, 0xab, 0x0a, 0x00, 0x37, 0xb2, + 0x0a, 0x00, 0x83, 0xb3, 0x0a, 0x00, 0x8e, 0xb3, 0x0a, 0x00, 0x8f, 0xb3, + 0x0a, 0x00, 0xff, 0xb5, 0x0a, 0x00, 0x83, 0xb7, 0x0a, 0x00, 0x87, 0xb7, + 0x0a, 0x00, 0x8e, 0xb7, 0x0a, 0x00, 0x8f, 0xb7, 0x0a, 0x00, 0xe3, 0xb7, + 0x0a, 0x00, 0xe7, 0xb7, 0x0a, 0x00, 0xeb, 0xb7, 0x0a, 0x00, 0xed, 0xb7, + 0x0a, 0x00, 0xf1, 0xb7, 0x0a, 0x00, 0xf3, 0xb7, 0x0a, 0x00, 0xf7, 0xb7, + 0x0a, 0x00, 0xf9, 0xb7, 0x0a, 0x00, 0xfb, 0xb7, 0x0a, 0x00, 0xfd, 0xb7, + 0x0a, 0x00, 0x37, 0xb8, 0x0a, 0x00, 0xf8, 0xb8, 0x0a, 0x00, 0xfc, 0xb8, + 0x0a, 0x00, 0xfe, 0xb8, 0x0a, 0x00, 0xff, 0xb8, 0x0a, 0x00, 0x3f, 0xb9, + 0x0a, 0x00, 0xbf, 0xb9, 0x0a, 0x00, 0x37, 0xba, 0x0a, 0x00, 0x8b, 0xbb, + 0x0a, 0x00, 0x8d, 0xbb, 0x0a, 0x00, 0x37, 0xbc, 0x0a, 0x00, 0xe7, 0xbc, + 0x0a, 0x00, 0xeb, 0xbc, 0x0a, 0x00, 0xf0, 0xbc, 0x0a, 0x00, 0xf1, 0xbc, + 0x0a, 0x00, 0xf7, 0xbc, 0x0a, 0x00, 0xf9, 0xbc, 0x0a, 0x00, 0xfd, 0xbc, + 0x0a, 0x00, 0x33, 0xbd, 0x0a, 0x00, 0x37, 0xbd, 0x0a, 0x00, 0x3b, 0xbd, + 0x0a, 0x00, 0x50, 0xbd, 0x0a, 0x00, 0x51, 0xbd, 0x0a, 0x00, 0x56, 0xbd, + 0x0a, 0x00, 0x57, 0xbd, 0x0a, 0x00, 0x5f, 0xbd, 0x0a, 0x00, 0xb3, 0xbd, + 0x0a, 0x00, 0xbb, 0xbd, 0x0a, 0x00, 0xe7, 0xbe, 0x0a, 0x00, 0xeb, 0xbe, + 0x0a, 0x00, 0xf7, 0xbe, 0x0a, 0x00, 0x8b, 0xbf, 0x0a, 0x00, 0x36, 0xc2, + 0x0a, 0x00, 0x37, 0xc2, 0x0a, 0x00, 0x38, 0xc2, 0x0a, 0x00, 0x3c, 0xc2, + 0x0a, 0x00, 0x3e, 0xc2, 0x0a, 0x00, 0x3f, 0xc2, 0x0a, 0x00, 0x88, 0xc3, + 0x0a, 0x00, 0x8b, 0xc3, 0x0a, 0x00, 0x30, 0xc5, 0x0a, 0x00, 0x31, 0xc5, + 0x0a, 0x00, 0x39, 0xc5, 0x0a, 0x00, 0x3d, 0xc5, 0x0a, 0x00, 0x37, 0xc9, + 0x0a, 0x00, 0x38, 0xc9, 0x0a, 0x00, 0x3c, 0xc9, 0x0a, 0x00, 0x3e, 0xc9, + 0x0a, 0x00, 0x3f, 0xc9, 0x0a, 0x00, 0x58, 0xc9, 0x0a, 0x00, 0x5c, 0xc9, + 0x0a, 0x00, 0x5e, 0xc9, 0x0a, 0x00, 0x5f, 0xc9, 0x0a, 0x00, 0xe9, 0xcc, + 0x0a, 0x00, 0xea, 0xcc, 0x0a, 0x00, 0xf0, 0xcc, 0x0a, 0x00, 0xf1, 0xcc, + 0x0a, 0x00, 0xf9, 0xcc, 0x0a, 0x00, 0xfd, 0xcc, 0x0a, 0x00, 0x30, 0xcd, + 0x0a, 0x00, 0x37, 0xcd, 0x0a, 0x00, 0x3d, 0xcd, 0x0a, 0x00, 0x3e, 0xcd, + 0x0a, 0x00, 0x3f, 0xcd, 0x0a, 0x00, 0x50, 0xcd, 0x0a, 0x00, 0x58, 0xcd, + 0x0a, 0x00, 0x5c, 0xcd, 0x0a, 0x00, 0x5e, 0xcd, 0x0a, 0x00, 0x5f, 0xcd, + 0x0a, 0x00, 0x37, 0xce, 0x0a, 0x00, 0x38, 0xce, 0x0a, 0x00, 0x3c, 0xce, + 0x0a, 0x00, 0x3e, 0xce, 0x0a, 0x00, 0x3f, 0xce, 0x0a, 0x00, 0xf0, 0xce, + 0x0a, 0x00, 0xf1, 0xce, 0x0a, 0x00, 0xf9, 0xce, 0x0a, 0x00, 0xfd, 0xce, + 0x0a, 0x00, 0x36, 0xcf, 0x0a, 0x00, 0x37, 0xcf, 0x0a, 0x00, 0x38, 0xcf, + 0x0a, 0x00, 0x3c, 0xcf, 0x0a, 0x00, 0x3e, 0xcf, 0x0a, 0x00, 0x3f, 0xcf, + 0x0a, 0x00, 0xb8, 0xcf, 0x0a, 0x00, 0xbc, 0xcf, 0x0a, 0x00, 0xbe, 0xcf, + 0x0a, 0x00, 0xbf, 0xcf, 0x0a, 0x00, 0x38, 0xd3, 0x0a, 0x00, 0x3c, 0xd3, + 0x0a, 0x00, 0x3e, 0xd3, 0x0a, 0x00, 0x3f, 0xd3, 0x0a, 0x00, 0xcb, 0xd5, + 0x0a, 0x00, 0xf8, 0xd5, 0x0a, 0x00, 0xfc, 0xd5, 0x0a, 0x00, 0xfe, 0xd5, + 0x0a, 0x00, 0xff, 0xd5, 0x0a, 0x00, 0xc8, 0xdd, 0x0a, 0x00, 0xcb, 0xdd, + 0x0a, 0x00, 0xf8, 0xdd, 0x0a, 0x00, 0xfc, 0xdd, 0x0a, 0x00, 0xfe, 0xdd, + 0x0a, 0x00, 0xff, 0xdd, 0x0a, 0x00, 0xe8, 0xdf, 0x0a, 0x00, 0xeb, 0xdf, + 0x0a, 0x00, 0xf8, 0xdf, 0x0a, 0x00, 0xfc, 0xdf, 0x0a, 0x00, 0xfe, 0xdf, + 0x0a, 0x00, 0xff, 0xdf, 0x0a, 0x00, 0x88, 0xe3, 0x0a, 0x00, 0x8b, 0xe3, + 0x0a, 0x00, 0x31, 0xe5, 0x0a, 0x00, 0x38, 0xe5, 0x0a, 0x00, 0xb8, 0xe5, + 0x0a, 0x00, 0x30, 0xe9, 0x0a, 0x00, 0x31, 0xe9, 0x0a, 0x00, 0x39, 0xe9, + 0x0a, 0x00, 0x3d, 0xe9, 0x0a, 0x00, 0x58, 0xe9, 0x0a, 0x00, 0x5c, 0xe9, + 0x0a, 0x00, 0x5e, 0xe9, 0x0a, 0x00, 0x5f, 0xe9, 0x0a, 0x00, 0xe9, 0xec, + 0x0a, 0x00, 0xea, 0xec, 0x0a, 0x00, 0xf0, 0xec, 0x0a, 0x00, 0xf1, 0xec, + 0x0a, 0x00, 0xf9, 0xec, 0x0a, 0x00, 0xfd, 0xec, 0x0a, 0x00, 0x31, 0xed, + 0x0a, 0x00, 0x38, 0xed, 0x0a, 0x00, 0x50, 0xed, 0x0a, 0x00, 0x58, 0xed, + 0x0a, 0x00, 0x5c, 0xed, 0x0a, 0x00, 0x5e, 0xed, 0x0a, 0x00, 0x5f, 0xed, + 0x0a, 0x00, 0x30, 0xee, 0x0a, 0x00, 0x31, 0xee, 0x0a, 0x00, 0x39, 0xee, + 0x0a, 0x00, 0x3d, 0xee, 0x0a, 0x00, 0xe6, 0xee, 0x0a, 0x00, 0xe7, 0xee, + 0x0a, 0x00, 0xe8, 0xee, 0x0a, 0x00, 0xeb, 0xee, 0x0a, 0x00, 0xf6, 0xee, + 0x0a, 0x00, 0xf7, 0xee, 0x0a, 0x00, 0xf8, 0xee, 0x0a, 0x00, 0xfc, 0xee, + 0x0a, 0x00, 0xfe, 0xee, 0x0a, 0x00, 0xff, 0xee, 0x0a, 0x00, 0x36, 0xef, + 0x0a, 0x00, 0x37, 0xef, 0x0a, 0x00, 0x38, 0xef, 0x0a, 0x00, 0x3c, 0xef, + 0x0a, 0x00, 0x3e, 0xef, 0x0a, 0x00, 0x3f, 0xef, 0x0a, 0x00, 0xb8, 0xef, + 0x0a, 0x00, 0xbc, 0xef, 0x0a, 0x00, 0xbe, 0xef, 0x0a, 0x00, 0xbf, 0xef, + 0x0a, 0x00, 0x31, 0xf3, 0x0a, 0x00, 0x38, 0xf3, 0x0a, 0x00, 0xb8, 0xf3, + 0x0a, 0x00, 0xe6, 0xf3, 0x0a, 0x00, 0xe7, 0xf3, 0x0a, 0x00, 0xf6, 0xf3, + 0x0a, 0x00, 0xf7, 0xf3, 0x0a, 0x00, 0xf8, 0xf3, 0x0a, 0x00, 0xfc, 0xf3, + 0x0a, 0x00, 0xfe, 0xf3, 0x0a, 0x00, 0xff, 0xf3, 0x0a, 0x00, 0xf0, 0xf5, + 0x0a, 0x00, 0xf1, 0xf5, 0x0a, 0x00, 0xf9, 0xf5, 0x0a, 0x00, 0xfd, 0xf5, + 0x0a, 0x00, 0xf7, 0xf9, 0x0a, 0x00, 0xf8, 0xf9, 0x0a, 0x00, 0xfc, 0xf9, + 0x0a, 0x00, 0xfe, 0xf9, 0x0a, 0x00, 0xff, 0xf9, 0x0a, 0x00, 0xb8, 0xfd, + 0x0a, 0x00, 0xf7, 0xfd, 0x0a, 0x00, 0xf8, 0xfd, 0x0a, 0x00, 0xfc, 0xfd, + 0x0a, 0x00, 0xfe, 0xfd, 0x0a, 0x00, 0xff, 0xfd, 0x0a, 0x00, 0x88, 0xff, + 0x0a, 0x00, 0x8b, 0xff, 0x0a, 0x00, 0xc6, 0xff, 0x0a, 0x00, 0xc7, 0xff, + 0x0a, 0x00, 0xc8, 0xff, 0x0a, 0x00, 0xcb, 0xff, 0x0a, 0x00, 0xe6, 0xff, + 0x0a, 0x00, 0xe7, 0xff, 0x0a, 0x00, 0xe8, 0xff, 0x0a, 0x00, 0xeb, 0xff, + 0x0a, 0x00, 0xf6, 0xff, 0x0a, 0x00, 0xf7, 0xff, 0x0a, 0x00, 0xf8, 0xff, + 0x0a, 0x00, 0xfc, 0xff, 0x0a, 0x00, 0xfe, 0xff, 0x0a, 0x00, 0xff, 0xff, + 0x0a, 0x00, 0x3e, 0x00, 0x0b, 0x00, 0x3f, 0x00, 0x0b, 0x00, 0x44, 0x00, + 0x0b, 0x00, 0x45, 0x00, 0x0b, 0x00, 0x4e, 0x00, 0x0b, 0x00, 0x4f, 0x00, + 0x0b, 0x00, 0x73, 0x00, 0x0b, 0x00, 0x7b, 0x00, 0x0b, 0x00, 0xbe, 0x00, + 0x0b, 0x00, 0xbf, 0x00, 0x0b, 0x00, 0x38, 0x01, 0x0b, 0x00, 0x44, 0x01, + 0x0b, 0x00, 0x45, 0x01, 0x0b, 0x00, 0x4e, 0x01, 0x0b, 0x00, 0x4f, 0x01, + 0x0b, 0x00, 0x73, 0x01, 0x0b, 0x00, 0x7b, 0x01, 0x0b, 0x00, 0x3e, 0x03, + 0x0b, 0x00, 0x3f, 0x03, 0x0b, 0x00, 0xc8, 0x03, 0x0b, 0x00, 0xf3, 0x03, + 0x0b, 0x00, 0xfb, 0x03, 0x0b, 0x00, 0x38, 0x04, 0x0b, 0x00, 0x73, 0x04, + 0x0b, 0x00, 0x7b, 0x04, 0x0b, 0x00, 0xf4, 0x05, 0x0b, 0x00, 0xf5, 0x05, + 0x0b, 0x00, 0xf8, 0x05, 0x0b, 0x00, 0xfc, 0x05, 0x0b, 0x00, 0xfe, 0x05, + 0x0b, 0x00, 0xff, 0x05, 0x0b, 0x00, 0x74, 0x06, 0x0b, 0x00, 0x75, 0x06, + 0x0b, 0x00, 0x78, 0x06, 0x0b, 0x00, 0x7c, 0x06, 0x0b, 0x00, 0x7e, 0x06, + 0x0b, 0x00, 0x7f, 0x06, 0x0b, 0x00, 0xf8, 0x06, 0x0b, 0x00, 0xfc, 0x06, + 0x0b, 0x00, 0xfe, 0x06, 0x0b, 0x00, 0xff, 0x06, 0x0b, 0x00, 0x78, 0x07, + 0x0b, 0x00, 0x7c, 0x07, 0x0b, 0x00, 0x7e, 0x07, 0x0b, 0x00, 0x7f, 0x07, + 0x0b, 0x00, 0xbe, 0x07, 0x0b, 0x00, 0xbf, 0x07, 0x0b, 0x00, 0xf3, 0x07, + 0x0b, 0x00, 0xfb, 0x07, 0x0b, 0x00, 0x78, 0x08, 0x0b, 0x00, 0x7c, 0x08, + 0x0b, 0x00, 0x7e, 0x08, 0x0b, 0x00, 0x7f, 0x08, 0x0b, 0x00, 0xbe, 0x08, + 0x0b, 0x00, 0xbf, 0x08, 0x0b, 0x00, 0xd5, 0x08, 0x0b, 0x00, 0xd8, 0x08, + 0x0b, 0x00, 0xdc, 0x08, 0x0b, 0x00, 0xde, 0x08, 0x0b, 0x00, 0xdf, 0x08, + 0x0b, 0x00, 0xe4, 0x08, 0x0b, 0x00, 0xee, 0x08, 0x0b, 0x00, 0xef, 0x08, + 0x0b, 0x00, 0xf4, 0x08, 0x0b, 0x00, 0xf5, 0x08, 0x0b, 0x00, 0xf8, 0x08, + 0x0b, 0x00, 0xfc, 0x08, 0x0b, 0x00, 0xfe, 0x08, 0x0b, 0x00, 0xff, 0x08, + 0x0b, 0x00, 0xf3, 0x09, 0x0b, 0x00, 0xfb, 0x09, 0x0b, 0x00, 0x74, 0x0a, + 0x0b, 0x00, 0x75, 0x0a, 0x0b, 0x00, 0x78, 0x0a, 0x0b, 0x00, 0x7c, 0x0a, + 0x0b, 0x00, 0x7e, 0x0a, 0x0b, 0x00, 0x7f, 0x0a, 0x0b, 0x00, 0x3e, 0x0b, + 0x0b, 0x00, 0x3f, 0x0b, 0x0b, 0x00, 0xbe, 0x0b, 0x0b, 0x00, 0xbf, 0x0b, + 0x0b, 0x00, 0xe8, 0x0b, 0x0b, 0x00, 0xf3, 0x0b, 0x0b, 0x00, 0xfb, 0x0b, + 0x0b, 0x00, 0x38, 0x0c, 0x0b, 0x00, 0xf3, 0x0d, 0x0b, 0x00, 0xfb, 0x0d, + 0x0b, 0x00, 0x38, 0x0e, 0x0b, 0x00, 0x3e, 0x0f, 0x0b, 0x00, 0x3f, 0x0f, + 0x0b, 0x00, 0x3e, 0x10, 0x0b, 0x00, 0x3f, 0x10, 0x0b, 0x00, 0x45, 0x10, + 0x0b, 0x00, 0x4f, 0x10, 0x0b, 0x00, 0x7e, 0x10, 0x0b, 0x00, 0x7f, 0x10, + 0x0b, 0x00, 0xbe, 0x10, 0x0b, 0x00, 0xbf, 0x10, 0x0b, 0x00, 0x38, 0x11, + 0x0b, 0x00, 0x4e, 0x11, 0x0b, 0x00, 0x4f, 0x11, 0x0b, 0x00, 0x74, 0x11, + 0x0b, 0x00, 0x75, 0x11, 0x0b, 0x00, 0x78, 0x11, 0x0b, 0x00, 0x7c, 0x11, + 0x0b, 0x00, 0x7e, 0x11, 0x0b, 0x00, 0x7f, 0x11, 0x0b, 0x00, 0x38, 0x12, + 0x0b, 0x00, 0xbe, 0x14, 0x0b, 0x00, 0xbf, 0x14, 0x0b, 0x00, 0xd5, 0x14, + 0x0b, 0x00, 0xee, 0x14, 0x0b, 0x00, 0xef, 0x14, 0x0b, 0x00, 0xf3, 0x14, + 0x0b, 0x00, 0xfb, 0x14, 0x0b, 0x00, 0x34, 0x15, 0x0b, 0x00, 0x3e, 0x15, + 0x0b, 0x00, 0x3f, 0x15, 0x0b, 0x00, 0x5e, 0x15, 0x0b, 0x00, 0x5f, 0x15, + 0x0b, 0x00, 0x04, 0x16, 0x0b, 0x00, 0x15, 0x16, 0x0b, 0x00, 0x38, 0x16, + 0x0b, 0x00, 0xb4, 0x16, 0x0b, 0x00, 0xbe, 0x16, 0x0b, 0x00, 0xbf, 0x16, + 0x0b, 0x00, 0x3e, 0x17, 0x0b, 0x00, 0x3f, 0x17, 0x0b, 0x00, 0x88, 0x17, + 0x0b, 0x00, 0x98, 0x17, 0x0b, 0x00, 0x9c, 0x17, 0x0b, 0x00, 0x9e, 0x17, + 0x0b, 0x00, 0x9f, 0x17, 0x0b, 0x00, 0xa3, 0x17, 0x0b, 0x00, 0xa8, 0x17, + 0x0b, 0x00, 0xab, 0x17, 0x0b, 0x00, 0xac, 0x17, 0x0b, 0x00, 0xae, 0x17, + 0x0b, 0x00, 0xaf, 0x17, 0x0b, 0x00, 0xd8, 0x17, 0x0b, 0x00, 0xdc, 0x17, + 0x0b, 0x00, 0xde, 0x17, 0x0b, 0x00, 0xdf, 0x17, 0x0b, 0x00, 0x38, 0x18, + 0x0b, 0x00, 0x38, 0x19, 0x0b, 0x00, 0x78, 0x1a, 0x0b, 0x00, 0x3e, 0x1b, + 0x0b, 0x00, 0x3f, 0x1b, 0x0b, 0x00, 0xbe, 0x1b, 0x0b, 0x00, 0xbf, 0x1b, + 0x0b, 0x00, 0xc8, 0x1b, 0x0b, 0x00, 0xfe, 0x1b, 0x0b, 0x00, 0xff, 0x1b, + 0x0b, 0x00, 0xc8, 0x1c, 0x0b, 0x00, 0xcb, 0x1c, 0x0b, 0x00, 0xf8, 0x1c, + 0x0b, 0x00, 0xfc, 0x1c, 0x0b, 0x00, 0xfe, 0x1c, 0x0b, 0x00, 0xff, 0x1c, + 0x0b, 0x00, 0x38, 0x1d, 0x0b, 0x00, 0xf4, 0x1f, 0x0b, 0x00, 0xf5, 0x1f, + 0x0b, 0x00, 0xf8, 0x1f, 0x0b, 0x00, 0xfc, 0x1f, 0x0b, 0x00, 0xfe, 0x1f, + 0x0b, 0x00, 0xff, 0x1f, 0x0b, 0x00, 0xbe, 0x20, 0x0b, 0x00, 0xbf, 0x20, + 0x0b, 0x00, 0xb8, 0x24, 0x0b, 0x00, 0xb8, 0x26, 0x0b, 0x00, 0x38, 0x27, + 0x0b, 0x00, 0xbe, 0x28, 0x0b, 0x00, 0xbf, 0x28, 0x0b, 0x00, 0xbe, 0x2a, + 0x0b, 0x00, 0xbf, 0x2a, 0x0b, 0x00, 0xb0, 0x30, 0x0b, 0x00, 0xb6, 0x30, + 0x0b, 0x00, 0xb7, 0x30, 0x0b, 0x00, 0xbd, 0x30, 0x0b, 0x00, 0xbe, 0x30, + 0x0b, 0x00, 0xbf, 0x30, 0x0b, 0x00, 0xbe, 0x32, 0x0b, 0x00, 0xbf, 0x32, + 0x0b, 0x00, 0x88, 0x33, 0x0b, 0x00, 0x8b, 0x33, 0x0b, 0x00, 0x91, 0x33, + 0x0b, 0x00, 0x96, 0x33, 0x0b, 0x00, 0x97, 0x33, 0x0b, 0x00, 0x99, 0x33, + 0x0b, 0x00, 0x9d, 0x33, 0x0b, 0x00, 0xb0, 0x34, 0x0b, 0x00, 0xb6, 0x34, + 0x0b, 0x00, 0xb7, 0x34, 0x0b, 0x00, 0xbd, 0x34, 0x0b, 0x00, 0xbe, 0x34, + 0x0b, 0x00, 0xbf, 0x34, 0x0b, 0x00, 0x1f, 0x35, 0x0b, 0x00, 0x68, 0x35, + 0x0b, 0x00, 0x6b, 0x35, 0x0b, 0x00, 0xf7, 0x35, 0x0b, 0x00, 0xf8, 0x35, + 0x0b, 0x00, 0xfc, 0x35, 0x0b, 0x00, 0xfe, 0x35, 0x0b, 0x00, 0xff, 0x35, + 0x0b, 0x00, 0xb0, 0x36, 0x0b, 0x00, 0xb7, 0x36, 0x0b, 0x00, 0xbd, 0x36, + 0x0b, 0x00, 0xbe, 0x36, 0x0b, 0x00, 0xbf, 0x36, 0x0b, 0x00, 0x86, 0x37, + 0x0b, 0x00, 0x87, 0x37, 0x0b, 0x00, 0x88, 0x37, 0x0b, 0x00, 0x89, 0x37, + 0x0b, 0x00, 0x8b, 0x37, 0x0b, 0x00, 0xb1, 0x38, 0x0b, 0x00, 0xb8, 0x38, + 0x0b, 0x00, 0x30, 0x39, 0x0b, 0x00, 0x37, 0x39, 0x0b, 0x00, 0x3d, 0x39, + 0x0b, 0x00, 0x3e, 0x39, 0x0b, 0x00, 0x3f, 0x39, 0x0b, 0x00, 0xb1, 0x3a, + 0x0b, 0x00, 0xb8, 0x3a, 0x0b, 0x00, 0xbe, 0x3c, 0x0b, 0x00, 0xbf, 0x3c, + 0x0b, 0x00, 0x30, 0x3d, 0x0b, 0x00, 0x37, 0x3d, 0x0b, 0x00, 0x3d, 0x3d, + 0x0b, 0x00, 0x3e, 0x3d, 0x0b, 0x00, 0x3f, 0x3d, 0x0b, 0x00, 0xbe, 0x3e, + 0x0b, 0x00, 0xbf, 0x3e, 0x0b, 0x00, 0x26, 0x3f, 0x0b, 0x00, 0x27, 0x3f, + 0x0b, 0x00, 0x29, 0x3f, 0x0b, 0x00, 0x2a, 0x3f, 0x0b, 0x00, 0x88, 0x3f, + 0x0b, 0x00, 0x8b, 0x3f, 0x0b, 0x00, 0xc8, 0x3f, 0x0b, 0x00, 0xc9, 0x3f, + 0x0b, 0x00, 0xcb, 0x3f, 0x0b, 0x00, 0xe8, 0x3f, 0x0b, 0x00, 0xe9, 0x3f, + 0x0b, 0x00, 0xeb, 0x3f, 0x0b, 0x00, 0xf0, 0x3f, 0x0b, 0x00, 0xf1, 0x3f, + 0x0b, 0x00, 0xf9, 0x3f, 0x0b, 0x00, 0xfd, 0x3f, 0x0b, 0x00, 0x31, 0x40, + 0x0b, 0x00, 0x38, 0x40, 0x0b, 0x00, 0x4b, 0x40, 0x0b, 0x00, 0x77, 0x40, + 0x0b, 0x00, 0x78, 0x40, 0x0b, 0x00, 0x7c, 0x40, 0x0b, 0x00, 0x7e, 0x40, + 0x0b, 0x00, 0x7f, 0x40, 0x0b, 0x00, 0xb0, 0x40, 0x0b, 0x00, 0xb7, 0x40, + 0x0b, 0x00, 0xbd, 0x40, 0x0b, 0x00, 0xbe, 0x40, 0x0b, 0x00, 0xbf, 0x40, + 0x0b, 0x00, 0x31, 0x41, 0x0b, 0x00, 0x38, 0x41, 0x0b, 0x00, 0x4b, 0x41, + 0x0b, 0x00, 0x77, 0x41, 0x0b, 0x00, 0x78, 0x41, 0x0b, 0x00, 0x7c, 0x41, + 0x0b, 0x00, 0x7e, 0x41, 0x0b, 0x00, 0x7f, 0x41, 0x0b, 0x00, 0x78, 0x42, + 0x0b, 0x00, 0x7c, 0x42, 0x0b, 0x00, 0x7e, 0x42, 0x0b, 0x00, 0x7f, 0x42, + 0x0b, 0x00, 0x30, 0x43, 0x0b, 0x00, 0x37, 0x43, 0x0b, 0x00, 0x3d, 0x43, + 0x0b, 0x00, 0x3e, 0x43, 0x0b, 0x00, 0x3f, 0x43, 0x0b, 0x00, 0xbe, 0x43, + 0x0b, 0x00, 0xbf, 0x43, 0x0b, 0x00, 0xcb, 0x43, 0x0b, 0x00, 0xf0, 0x43, + 0x0b, 0x00, 0xf1, 0x43, 0x0b, 0x00, 0xf9, 0x43, 0x0b, 0x00, 0xfd, 0x43, + 0x0b, 0x00, 0x70, 0x44, 0x0b, 0x00, 0x71, 0x44, 0x0b, 0x00, 0x79, 0x44, + 0x0b, 0x00, 0x7d, 0x44, 0x0b, 0x00, 0xf7, 0x45, 0x0b, 0x00, 0xf8, 0x45, + 0x0b, 0x00, 0xfc, 0x45, 0x0b, 0x00, 0xfe, 0x45, 0x0b, 0x00, 0xff, 0x45, + 0x0b, 0x00, 0x70, 0x46, 0x0b, 0x00, 0x71, 0x46, 0x0b, 0x00, 0x79, 0x46, + 0x0b, 0x00, 0x7d, 0x46, 0x0b, 0x00, 0xb1, 0x47, 0x0b, 0x00, 0xb8, 0x47, + 0x0b, 0x00, 0xf0, 0x47, 0x0b, 0x00, 0xf1, 0x47, 0x0b, 0x00, 0xf9, 0x47, + 0x0b, 0x00, 0xfd, 0x47, 0x0b, 0x00, 0x4b, 0x48, 0x0b, 0x00, 0x7f, 0x48, + 0x0b, 0x00, 0xb1, 0x48, 0x0b, 0x00, 0xb7, 0x48, 0x0b, 0x00, 0xb8, 0x48, + 0x0b, 0x00, 0xd1, 0x48, 0x0b, 0x00, 0xd6, 0x48, 0x0b, 0x00, 0xd7, 0x48, + 0x0b, 0x00, 0xf0, 0x48, 0x0b, 0x00, 0xfd, 0x48, 0x0b, 0x00, 0xfe, 0x48, + 0x0b, 0x00, 0xff, 0x48, 0x0b, 0x00, 0xf7, 0x49, 0x0b, 0x00, 0x71, 0x4a, + 0x0b, 0x00, 0x77, 0x4a, 0x0b, 0x00, 0x78, 0x4a, 0x0b, 0x00, 0x31, 0x4b, + 0x0b, 0x00, 0x37, 0x4b, 0x0b, 0x00, 0x38, 0x4b, 0x0b, 0x00, 0xb0, 0x4b, + 0x0b, 0x00, 0xbd, 0x4b, 0x0b, 0x00, 0xbe, 0x4b, 0x0b, 0x00, 0xbf, 0x4b, + 0x0b, 0x00, 0xd0, 0x4b, 0x0b, 0x00, 0xdf, 0x4b, 0x0b, 0x00, 0xe7, 0x4b, + 0x0b, 0x00, 0xeb, 0x4b, 0x0b, 0x00, 0xf1, 0x4b, 0x0b, 0x00, 0xf7, 0x4b, + 0x0b, 0x00, 0xf8, 0x4b, 0x0b, 0x00, 0x37, 0x4c, 0x0b, 0x00, 0x7f, 0x4c, + 0x0b, 0x00, 0xf7, 0x4d, 0x0b, 0x00, 0x37, 0x4e, 0x0b, 0x00, 0x78, 0x4e, + 0x0b, 0x00, 0x7c, 0x4e, 0x0b, 0x00, 0x7e, 0x4e, 0x0b, 0x00, 0x7f, 0x4e, + 0x0b, 0x00, 0x1f, 0x4f, 0x0b, 0x00, 0x31, 0x4f, 0x0b, 0x00, 0x37, 0x4f, + 0x0b, 0x00, 0x38, 0x4f, 0x0b, 0x00, 0x78, 0x4f, 0x0b, 0x00, 0x7c, 0x4f, + 0x0b, 0x00, 0x7e, 0x4f, 0x0b, 0x00, 0x7f, 0x4f, 0x0b, 0x00, 0x90, 0x4f, + 0x0b, 0x00, 0x9f, 0x4f, 0x0b, 0x00, 0xb8, 0x4f, 0x0b, 0x00, 0xd0, 0x4f, + 0x0b, 0x00, 0xdf, 0x4f, 0x0b, 0x00, 0xcb, 0x50, 0x0b, 0x00, 0xf0, 0x50, + 0x0b, 0x00, 0xf1, 0x50, 0x0b, 0x00, 0xf9, 0x50, 0x0b, 0x00, 0xfd, 0x50, + 0x0b, 0x00, 0xb1, 0x51, 0x0b, 0x00, 0xb8, 0x51, 0x0b, 0x00, 0xf0, 0x51, + 0x0b, 0x00, 0xf1, 0x51, 0x0b, 0x00, 0xf9, 0x51, 0x0b, 0x00, 0xfd, 0x51, + 0x0b, 0x00, 0xb8, 0x52, 0x0b, 0x00, 0x37, 0x54, 0x0b, 0x00, 0x37, 0x55, + 0x0b, 0x00, 0x51, 0x55, 0x0b, 0x00, 0x56, 0x55, 0x0b, 0x00, 0x57, 0x55, + 0x0b, 0x00, 0x5f, 0x55, 0x0b, 0x00, 0xeb, 0x56, 0x0b, 0x00, 0xff, 0x56, + 0x0b, 0x00, 0xb0, 0x57, 0x0b, 0x00, 0xbd, 0x57, 0x0b, 0x00, 0xbe, 0x57, + 0x0b, 0x00, 0xbf, 0x57, 0x0b, 0x00, 0xcb, 0x57, 0x0b, 0x00, 0xeb, 0x57, + 0x0b, 0x00, 0xf8, 0x57, 0x0b, 0x00, 0xfc, 0x57, 0x0b, 0x00, 0xfe, 0x57, + 0x0b, 0x00, 0xff, 0x57, 0x0b, 0x00, 0x4b, 0x58, 0x0b, 0x00, 0xb0, 0x58, + 0x0b, 0x00, 0xb7, 0x58, 0x0b, 0x00, 0xbd, 0x58, 0x0b, 0x00, 0xbe, 0x58, + 0x0b, 0x00, 0xbf, 0x58, 0x0b, 0x00, 0x31, 0x59, 0x0b, 0x00, 0x38, 0x59, + 0x0b, 0x00, 0xb0, 0x5a, 0x0b, 0x00, 0xb7, 0x5a, 0x0b, 0x00, 0xbd, 0x5a, + 0x0b, 0x00, 0xbe, 0x5a, 0x0b, 0x00, 0xbf, 0x5a, 0x0b, 0x00, 0xb8, 0x5c, + 0x0b, 0x00, 0x31, 0x5d, 0x0b, 0x00, 0x38, 0x5d, 0x0b, 0x00, 0xb8, 0x5e, + 0x0b, 0x00, 0xf7, 0x5f, 0x0b, 0x00, 0xf8, 0x5f, 0x0b, 0x00, 0xfc, 0x5f, + 0x0b, 0x00, 0xfe, 0x5f, 0x0b, 0x00, 0xff, 0x5f, 0x0b, 0x00, 0x34, 0x60, + 0x0b, 0x00, 0x3e, 0x60, 0x0b, 0x00, 0x3f, 0x60, 0x0b, 0x00, 0x4e, 0x60, + 0x0b, 0x00, 0x4f, 0x60, 0x0b, 0x00, 0x74, 0x60, 0x0b, 0x00, 0x7e, 0x60, + 0x0b, 0x00, 0x7f, 0x60, 0x0b, 0x00, 0xb8, 0x60, 0x0b, 0x00, 0x38, 0x61, + 0x0b, 0x00, 0x73, 0x61, 0x0b, 0x00, 0x7b, 0x61, 0x0b, 0x00, 0x38, 0x63, + 0x0b, 0x00, 0xce, 0x63, 0x0b, 0x00, 0xcf, 0x63, 0x0b, 0x00, 0xf8, 0x63, + 0x0b, 0x00, 0x3f, 0x64, 0x0b, 0x00, 0x74, 0x64, 0x0b, 0x00, 0xf3, 0x65, + 0x0b, 0x00, 0xfb, 0x65, 0x0b, 0x00, 0xff, 0x65, 0x0b, 0x00, 0x73, 0x66, + 0x0b, 0x00, 0x7b, 0x66, 0x0b, 0x00, 0xff, 0x66, 0x0b, 0x00, 0x0b, 0x67, + 0x0b, 0x00, 0x23, 0x67, 0x0b, 0x00, 0x2e, 0x67, 0x0b, 0x00, 0x2f, 0x67, + 0x0b, 0x00, 0xbe, 0x67, 0x0b, 0x00, 0xbf, 0x67, 0x0b, 0x00, 0xf8, 0x67, + 0x0b, 0x00, 0xfc, 0x67, 0x0b, 0x00, 0xfe, 0x67, 0x0b, 0x00, 0xff, 0x67, + 0x0b, 0x00, 0x4e, 0x68, 0x0b, 0x00, 0x4f, 0x68, 0x0b, 0x00, 0x74, 0x68, + 0x0b, 0x00, 0x7e, 0x68, 0x0b, 0x00, 0x7f, 0x68, 0x0b, 0x00, 0xb8, 0x68, + 0x0b, 0x00, 0xc4, 0x68, 0x0b, 0x00, 0xf4, 0x68, 0x0b, 0x00, 0xfe, 0x68, + 0x0b, 0x00, 0xff, 0x68, 0x0b, 0x00, 0xf3, 0x69, 0x0b, 0x00, 0xfb, 0x69, + 0x0b, 0x00, 0x74, 0x6a, 0x0b, 0x00, 0x7e, 0x6a, 0x0b, 0x00, 0x7f, 0x6a, + 0x0b, 0x00, 0x38, 0x6b, 0x0b, 0x00, 0xb8, 0x6b, 0x0b, 0x00, 0xce, 0x6b, + 0x0b, 0x00, 0xcf, 0x6b, 0x0b, 0x00, 0xf8, 0x6b, 0x0b, 0x00, 0x34, 0x6c, + 0x0b, 0x00, 0x3e, 0x6c, 0x0b, 0x00, 0x3f, 0x6c, 0x0b, 0x00, 0xf8, 0x6d, + 0x0b, 0x00, 0x34, 0x6e, 0x0b, 0x00, 0x3e, 0x6e, 0x0b, 0x00, 0x3f, 0x6e, + 0x0b, 0x00, 0x38, 0x6f, 0x0b, 0x00, 0x34, 0x70, 0x0b, 0x00, 0x43, 0x70, + 0x0b, 0x00, 0x74, 0x70, 0x0b, 0x00, 0xbe, 0x70, 0x0b, 0x00, 0xbf, 0x70, + 0x0b, 0x00, 0x13, 0x71, 0x0b, 0x00, 0x1f, 0x71, 0x0b, 0x00, 0x33, 0x71, + 0x0b, 0x00, 0x3b, 0x71, 0x0b, 0x00, 0x3f, 0x71, 0x0b, 0x00, 0x78, 0x71, + 0x0b, 0x00, 0x7c, 0x71, 0x0b, 0x00, 0x7e, 0x71, 0x0b, 0x00, 0x7f, 0x71, + 0x0b, 0x00, 0x3f, 0x72, 0x0b, 0x00, 0xff, 0x72, 0x0b, 0x00, 0xbe, 0x74, + 0x0b, 0x00, 0xbf, 0x74, 0x0b, 0x00, 0xd5, 0x74, 0x0b, 0x00, 0xdf, 0x74, + 0x0b, 0x00, 0xee, 0x74, 0x0b, 0x00, 0xef, 0x74, 0x0b, 0x00, 0xf3, 0x74, + 0x0b, 0x00, 0xfb, 0x74, 0x0b, 0x00, 0x33, 0x75, 0x0b, 0x00, 0x3b, 0x75, + 0x0b, 0x00, 0x3f, 0x75, 0x0b, 0x00, 0x03, 0x76, 0x0b, 0x00, 0x13, 0x76, + 0x0b, 0x00, 0x1f, 0x76, 0x0b, 0x00, 0x34, 0x76, 0x0b, 0x00, 0xb3, 0x76, + 0x0b, 0x00, 0xbb, 0x76, 0x0b, 0x00, 0xbf, 0x76, 0x0b, 0x00, 0x3e, 0x77, + 0x0b, 0x00, 0x3f, 0x77, 0x0b, 0x00, 0xa3, 0x77, 0x0b, 0x00, 0xae, 0x77, + 0x0b, 0x00, 0xaf, 0x77, 0x0b, 0x00, 0x3f, 0x78, 0x0b, 0x00, 0x33, 0x79, + 0x0b, 0x00, 0x3b, 0x79, 0x0b, 0x00, 0x3f, 0x79, 0x0b, 0x00, 0x5f, 0x79, + 0x0b, 0x00, 0x2b, 0x7a, 0x0b, 0x00, 0x74, 0x7a, 0x0b, 0x00, 0x78, 0x7a, + 0x0b, 0x00, 0x0b, 0x7b, 0x0b, 0x00, 0x3e, 0x7b, 0x0b, 0x00, 0x3f, 0x7b, + 0x0b, 0x00, 0xbe, 0x7b, 0x0b, 0x00, 0xbf, 0x7b, 0x0b, 0x00, 0xfe, 0x7b, + 0x0b, 0x00, 0xff, 0x7b, 0x0b, 0x00, 0xf8, 0x7c, 0x0b, 0x00, 0xfc, 0x7c, + 0x0b, 0x00, 0xfe, 0x7c, 0x0b, 0x00, 0xff, 0x7c, 0x0b, 0x00, 0x33, 0x7d, + 0x0b, 0x00, 0x3b, 0x7d, 0x0b, 0x00, 0x3f, 0x7d, 0x0b, 0x00, 0x5f, 0x7d, + 0x0b, 0x00, 0xff, 0x7e, 0x0b, 0x00, 0x23, 0x7f, 0x0b, 0x00, 0x2e, 0x7f, + 0x0b, 0x00, 0x2f, 0x7f, 0x0b, 0x00, 0xf8, 0x7f, 0x0b, 0x00, 0xfc, 0x7f, + 0x0b, 0x00, 0xfe, 0x7f, 0x0b, 0x00, 0xff, 0x7f, 0x0b, 0x00, 0xf0, 0x81, + 0x0b, 0x00, 0xf1, 0x81, 0x0b, 0x00, 0xf3, 0x81, 0x0b, 0x00, 0xf9, 0x81, + 0x0b, 0x00, 0xfb, 0x81, 0x0b, 0x00, 0xfd, 0x81, 0x0b, 0x00, 0xb8, 0x82, + 0x0b, 0x00, 0x73, 0x83, 0x0b, 0x00, 0x7b, 0x83, 0x0b, 0x00, 0x30, 0x84, + 0x0b, 0x00, 0x36, 0x84, 0x0b, 0x00, 0x37, 0x84, 0x0b, 0x00, 0x3d, 0x84, + 0x0b, 0x00, 0x3e, 0x84, 0x0b, 0x00, 0x3f, 0x84, 0x0b, 0x00, 0x70, 0x84, + 0x0b, 0x00, 0x71, 0x84, 0x0b, 0x00, 0x73, 0x84, 0x0b, 0x00, 0x79, 0x84, + 0x0b, 0x00, 0x7b, 0x84, 0x0b, 0x00, 0x7d, 0x84, 0x0b, 0x00, 0x48, 0x85, + 0x0b, 0x00, 0x4b, 0x85, 0x0b, 0x00, 0x78, 0x85, 0x0b, 0x00, 0x7c, 0x85, + 0x0b, 0x00, 0x7e, 0x85, 0x0b, 0x00, 0x7f, 0x85, 0x0b, 0x00, 0xf2, 0x85, + 0x0b, 0x00, 0xf4, 0x85, 0x0b, 0x00, 0xf5, 0x85, 0x0b, 0x00, 0xf6, 0x85, + 0x0b, 0x00, 0xf7, 0x85, 0x0b, 0x00, 0xf8, 0x85, 0x0b, 0x00, 0xfa, 0x85, + 0x0b, 0x00, 0xfc, 0x85, 0x0b, 0x00, 0xfe, 0x85, 0x0b, 0x00, 0xff, 0x85, + 0x0b, 0x00, 0x72, 0x86, 0x0b, 0x00, 0x74, 0x86, 0x0b, 0x00, 0x75, 0x86, + 0x0b, 0x00, 0x76, 0x86, 0x0b, 0x00, 0x77, 0x86, 0x0b, 0x00, 0x78, 0x86, + 0x0b, 0x00, 0x7a, 0x86, 0x0b, 0x00, 0x7c, 0x86, 0x0b, 0x00, 0x7e, 0x86, + 0x0b, 0x00, 0x7f, 0x86, 0x0b, 0x00, 0xc8, 0x86, 0x0b, 0x00, 0xc9, 0x86, + 0x0b, 0x00, 0xcb, 0x86, 0x0b, 0x00, 0xf0, 0x86, 0x0b, 0x00, 0xf1, 0x86, + 0x0b, 0x00, 0xf9, 0x86, 0x0b, 0x00, 0xfd, 0x86, 0x0b, 0x00, 0x76, 0x87, + 0x0b, 0x00, 0x77, 0x87, 0x0b, 0x00, 0x78, 0x87, 0x0b, 0x00, 0x7c, 0x87, + 0x0b, 0x00, 0x7e, 0x87, 0x0b, 0x00, 0x7f, 0x87, 0x0b, 0x00, 0xb0, 0x87, + 0x0b, 0x00, 0xb6, 0x87, 0x0b, 0x00, 0xbe, 0x87, 0x0b, 0x00, 0xf2, 0x87, + 0x0b, 0x00, 0xf4, 0x87, 0x0b, 0x00, 0xf5, 0x87, 0x0b, 0x00, 0xf6, 0x87, + 0x0b, 0x00, 0xf7, 0x87, 0x0b, 0x00, 0xf8, 0x87, 0x0b, 0x00, 0xfa, 0x87, + 0x0b, 0x00, 0xfc, 0x87, 0x0b, 0x00, 0xfe, 0x87, 0x0b, 0x00, 0xff, 0x87, + 0x0b, 0x00, 0x15, 0x89, 0x0b, 0x00, 0x1f, 0x89, 0x0b, 0x00, 0x68, 0x89, + 0x0b, 0x00, 0x73, 0x89, 0x0b, 0x00, 0x7b, 0x89, 0x0b, 0x00, 0x2b, 0x8a, + 0x0b, 0x00, 0x72, 0x8a, 0x0b, 0x00, 0x74, 0x8a, 0x0b, 0x00, 0x75, 0x8a, + 0x0b, 0x00, 0x76, 0x8a, 0x0b, 0x00, 0x77, 0x8a, 0x0b, 0x00, 0x78, 0x8a, + 0x0b, 0x00, 0x7a, 0x8a, 0x0b, 0x00, 0x7c, 0x8a, 0x0b, 0x00, 0x7e, 0x8a, + 0x0b, 0x00, 0x7f, 0x8a, 0x0b, 0x00, 0xd0, 0x8a, 0x0b, 0x00, 0xdf, 0x8a, + 0x0b, 0x00, 0x38, 0x8b, 0x0b, 0x00, 0xb0, 0x8b, 0x0b, 0x00, 0xb6, 0x8b, + 0x0b, 0x00, 0xbe, 0x8b, 0x0b, 0x00, 0xd0, 0x8b, 0x0b, 0x00, 0xd8, 0x8b, + 0x0b, 0x00, 0xda, 0x8b, 0x0b, 0x00, 0xdc, 0x8b, 0x0b, 0x00, 0xde, 0x8b, + 0x0b, 0x00, 0xdf, 0x8b, 0x0b, 0x00, 0xe0, 0x8b, 0x0b, 0x00, 0xe1, 0x8b, + 0x0b, 0x00, 0xe2, 0x8b, 0x0b, 0x00, 0xe4, 0x8b, 0x0b, 0x00, 0xe6, 0x8b, + 0x0b, 0x00, 0xe7, 0x8b, 0x0b, 0x00, 0xee, 0x8b, 0x0b, 0x00, 0xf2, 0x8b, + 0x0b, 0x00, 0xf4, 0x8b, 0x0b, 0x00, 0xf5, 0x8b, 0x0b, 0x00, 0xf6, 0x8b, + 0x0b, 0x00, 0xf7, 0x8b, 0x0b, 0x00, 0xf8, 0x8b, 0x0b, 0x00, 0xfa, 0x8b, + 0x0b, 0x00, 0xfc, 0x8b, 0x0b, 0x00, 0xfe, 0x8b, 0x0b, 0x00, 0xff, 0x8b, + 0x0b, 0x00, 0xbe, 0x8c, 0x0b, 0x00, 0xbf, 0x8c, 0x0b, 0x00, 0x15, 0x8d, + 0x0b, 0x00, 0x1f, 0x8d, 0x0b, 0x00, 0x68, 0x8d, 0x0b, 0x00, 0x73, 0x8d, + 0x0b, 0x00, 0x7b, 0x8d, 0x0b, 0x00, 0xb4, 0x8e, 0x0b, 0x00, 0xbe, 0x8e, + 0x0b, 0x00, 0xbf, 0x8e, 0x0b, 0x00, 0x88, 0x8f, 0x0b, 0x00, 0xc0, 0x8f, + 0x0b, 0x00, 0xc1, 0x8f, 0x0b, 0x00, 0xc2, 0x8f, 0x0b, 0x00, 0xc8, 0x8f, + 0x0b, 0x00, 0xe8, 0x8f, 0x0b, 0x00, 0xf0, 0x8f, 0x0b, 0x00, 0xf1, 0x8f, + 0x0b, 0x00, 0xf3, 0x8f, 0x0b, 0x00, 0xf9, 0x8f, 0x0b, 0x00, 0xfb, 0x8f, + 0x0b, 0x00, 0xfd, 0x8f, 0x0b, 0x00, 0xb8, 0x90, 0x0b, 0x00, 0x38, 0x92, + 0x0b, 0x00, 0xb8, 0x94, 0x0b, 0x00, 0xf4, 0x95, 0x0b, 0x00, 0xfe, 0x95, + 0x0b, 0x00, 0xff, 0x95, 0x0b, 0x00, 0xb8, 0x96, 0x0b, 0x00, 0x8e, 0x97, + 0x0b, 0x00, 0x8f, 0x97, 0x0b, 0x00, 0x48, 0x98, 0x0b, 0x00, 0xb8, 0x98, + 0x0b, 0x00, 0xf8, 0x98, 0x0b, 0x00, 0x38, 0x99, 0x0b, 0x00, 0x3e, 0x9a, + 0x0b, 0x00, 0x3f, 0x9a, 0x0b, 0x00, 0xbe, 0x9a, 0x0b, 0x00, 0xbf, 0x9a, + 0x0b, 0x00, 0xf8, 0x9a, 0x0b, 0x00, 0xfc, 0x9a, 0x0b, 0x00, 0xfe, 0x9a, + 0x0b, 0x00, 0xff, 0x9a, 0x0b, 0x00, 0xc8, 0x9c, 0x0b, 0x00, 0xcb, 0x9c, + 0x0b, 0x00, 0xf8, 0x9c, 0x0b, 0x00, 0xfc, 0x9c, 0x0b, 0x00, 0xfe, 0x9c, + 0x0b, 0x00, 0xff, 0x9c, 0x0b, 0x00, 0x38, 0x9d, 0x0b, 0x00, 0xf4, 0x9f, + 0x0b, 0x00, 0xf5, 0x9f, 0x0b, 0x00, 0xf8, 0x9f, 0x0b, 0x00, 0xfc, 0x9f, + 0x0b, 0x00, 0xfe, 0x9f, 0x0b, 0x00, 0xff, 0x9f, 0x0b, 0x00, 0x78, 0xa4, + 0x0b, 0x00, 0x7c, 0xa4, 0x0b, 0x00, 0x7e, 0xa4, 0x0b, 0x00, 0x7f, 0xa4, + 0x0b, 0x00, 0x78, 0xa6, 0x0b, 0x00, 0x7c, 0xa6, 0x0b, 0x00, 0x7e, 0xa6, + 0x0b, 0x00, 0x7f, 0xa6, 0x0b, 0x00, 0xbe, 0xa7, 0x0b, 0x00, 0xbf, 0xa7, + 0x0b, 0x00, 0xc8, 0xa7, 0x0b, 0x00, 0xcb, 0xa7, 0x0b, 0x00, 0xe8, 0xa7, + 0x0b, 0x00, 0xeb, 0xa7, 0x0b, 0x00, 0x78, 0xaa, 0x0b, 0x00, 0x3e, 0xab, + 0x0b, 0x00, 0x3f, 0xab, 0x0b, 0x00, 0xbe, 0xab, 0x0b, 0x00, 0xbf, 0xab, + 0x0b, 0x00, 0xc8, 0xab, 0x0b, 0x00, 0xcb, 0xab, 0x0b, 0x00, 0xfe, 0xab, + 0x0b, 0x00, 0xff, 0xab, 0x0b, 0x00, 0x07, 0xb1, 0x0b, 0x00, 0x0b, 0xb1, + 0x0b, 0x00, 0xf0, 0xb1, 0x0b, 0x00, 0xf1, 0xb1, 0x0b, 0x00, 0xf9, 0xb1, + 0x0b, 0x00, 0xfd, 0xb1, 0x0b, 0x00, 0xbe, 0xb2, 0x0b, 0x00, 0xbf, 0xb2, + 0x0b, 0x00, 0x88, 0xb3, 0x0b, 0x00, 0x8b, 0xb3, 0x0b, 0x00, 0x91, 0xb3, + 0x0b, 0x00, 0x96, 0xb3, 0x0b, 0x00, 0x97, 0xb3, 0x0b, 0x00, 0x99, 0xb3, + 0x0b, 0x00, 0x9d, 0xb3, 0x0b, 0x00, 0x70, 0xb4, 0x0b, 0x00, 0x71, 0xb4, + 0x0b, 0x00, 0x79, 0xb4, 0x0b, 0x00, 0x7d, 0xb4, 0x0b, 0x00, 0x1f, 0xb5, + 0x0b, 0x00, 0x68, 0xb5, 0x0b, 0x00, 0x6b, 0xb5, 0x0b, 0x00, 0xf7, 0xb5, + 0x0b, 0x00, 0xf8, 0xb5, 0x0b, 0x00, 0xfc, 0xb5, 0x0b, 0x00, 0xfe, 0xb5, + 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0x70, 0xb6, 0x0b, 0x00, 0x71, 0xb6, + 0x0b, 0x00, 0x79, 0xb6, 0x0b, 0x00, 0x7d, 0xb6, 0x0b, 0x00, 0x06, 0xb7, + 0x0b, 0x00, 0x07, 0xb7, 0x0b, 0x00, 0x08, 0xb7, 0x0b, 0x00, 0x09, 0xb7, + 0x0b, 0x00, 0x0b, 0xb7, 0x0b, 0x00, 0x10, 0xb7, 0x0b, 0x00, 0x18, 0xb7, + 0x0b, 0x00, 0x1c, 0xb7, 0x0b, 0x00, 0x1e, 0xb7, 0x0b, 0x00, 0x1f, 0xb7, + 0x0b, 0x00, 0x70, 0xb7, 0x0b, 0x00, 0x71, 0xb7, 0x0b, 0x00, 0x79, 0xb7, + 0x0b, 0x00, 0x7d, 0xb7, 0x0b, 0x00, 0xc8, 0xb7, 0x0b, 0x00, 0xc9, 0xb7, + 0x0b, 0x00, 0xcb, 0xb7, 0x0b, 0x00, 0xe8, 0xb7, 0x0b, 0x00, 0xe9, 0xb7, + 0x0b, 0x00, 0xeb, 0xb7, 0x0b, 0x00, 0xf0, 0xb7, 0x0b, 0x00, 0xf1, 0xb7, + 0x0b, 0x00, 0xf9, 0xb7, 0x0b, 0x00, 0xfd, 0xb7, 0x0b, 0x00, 0x30, 0xb9, + 0x0b, 0x00, 0x37, 0xb9, 0x0b, 0x00, 0x3d, 0xb9, 0x0b, 0x00, 0x3e, 0xb9, + 0x0b, 0x00, 0x3f, 0xb9, 0x0b, 0x00, 0x76, 0xba, 0x0b, 0x00, 0x77, 0xba, + 0x0b, 0x00, 0x78, 0xba, 0x0b, 0x00, 0x7c, 0xba, 0x0b, 0x00, 0x7e, 0xba, + 0x0b, 0x00, 0x7f, 0xba, 0x0b, 0x00, 0x31, 0xbb, 0x0b, 0x00, 0x38, 0xbb, + 0x0b, 0x00, 0xb0, 0xbb, 0x0b, 0x00, 0xb6, 0xbb, 0x0b, 0x00, 0xb7, 0xbb, + 0x0b, 0x00, 0xbd, 0xbb, 0x0b, 0x00, 0xbe, 0xbb, 0x0b, 0x00, 0xbf, 0xbb, + 0x0b, 0x00, 0xd0, 0xbb, 0x0b, 0x00, 0xd8, 0xbb, 0x0b, 0x00, 0xdc, 0xbb, + 0x0b, 0x00, 0xde, 0xbb, 0x0b, 0x00, 0xdf, 0xbb, 0x0b, 0x00, 0xe6, 0xbb, + 0x0b, 0x00, 0xe7, 0xbb, 0x0b, 0x00, 0xf6, 0xbb, 0x0b, 0x00, 0xf7, 0xbb, + 0x0b, 0x00, 0xf8, 0xbb, 0x0b, 0x00, 0xfc, 0xbb, 0x0b, 0x00, 0xfe, 0xbb, + 0x0b, 0x00, 0xff, 0xbb, 0x0b, 0x00, 0xbe, 0xbc, 0x0b, 0x00, 0xbf, 0xbc, + 0x0b, 0x00, 0x30, 0xbd, 0x0b, 0x00, 0x37, 0xbd, 0x0b, 0x00, 0x3d, 0xbd, + 0x0b, 0x00, 0x3e, 0xbd, 0x0b, 0x00, 0x3f, 0xbd, 0x0b, 0x00, 0xbe, 0xbe, + 0x0b, 0x00, 0xbf, 0xbe, 0x0b, 0x00, 0x26, 0xbf, 0x0b, 0x00, 0x27, 0xbf, + 0x0b, 0x00, 0x29, 0xbf, 0x0b, 0x00, 0x2a, 0xbf, 0x0b, 0x00, 0x88, 0xbf, + 0x0b, 0x00, 0x8b, 0xbf, 0x0b, 0x00, 0xc8, 0xbf, 0x0b, 0x00, 0xc9, 0xbf, + 0x0b, 0x00, 0xcb, 0xbf, 0x0b, 0x00, 0xe8, 0xbf, 0x0b, 0x00, 0xe9, 0xbf, + 0x0b, 0x00, 0xeb, 0xbf, 0x0b, 0x00, 0xf0, 0xbf, 0x0b, 0x00, 0xf1, 0xbf, + 0x0b, 0x00, 0xf9, 0xbf, 0x0b, 0x00, 0xfd, 0xbf, 0x0b, 0x00, 0xb8, 0xc0, + 0x0b, 0x00, 0xb8, 0xc2, 0x0b, 0x00, 0x73, 0xc3, 0x0b, 0x00, 0x7b, 0xc3, + 0x0b, 0x00, 0xb8, 0xc4, 0x0b, 0x00, 0xc8, 0xc4, 0x0b, 0x00, 0xc9, 0xc4, + 0x0b, 0x00, 0xcb, 0xc4, 0x0b, 0x00, 0xf0, 0xc4, 0x0b, 0x00, 0xf1, 0xc4, + 0x0b, 0x00, 0xf9, 0xc4, 0x0b, 0x00, 0xfd, 0xc4, 0x0b, 0x00, 0x48, 0xc5, + 0x0b, 0x00, 0x4b, 0xc5, 0x0b, 0x00, 0x78, 0xc5, 0x0b, 0x00, 0x7c, 0xc5, + 0x0b, 0x00, 0x7e, 0xc5, 0x0b, 0x00, 0x7f, 0xc5, 0x0b, 0x00, 0xf2, 0xc5, + 0x0b, 0x00, 0xf4, 0xc5, 0x0b, 0x00, 0xf5, 0xc5, 0x0b, 0x00, 0xf6, 0xc5, + 0x0b, 0x00, 0xf7, 0xc5, 0x0b, 0x00, 0xf8, 0xc5, 0x0b, 0x00, 0xfa, 0xc5, + 0x0b, 0x00, 0xfc, 0xc5, 0x0b, 0x00, 0xfe, 0xc5, 0x0b, 0x00, 0xff, 0xc5, + 0x0b, 0x00, 0x31, 0xc6, 0x0b, 0x00, 0x38, 0xc6, 0x0b, 0x00, 0xb0, 0xc6, + 0x0b, 0x00, 0xb6, 0xc6, 0x0b, 0x00, 0xbe, 0xc6, 0x0b, 0x00, 0x30, 0xc7, + 0x0b, 0x00, 0x36, 0xc7, 0x0b, 0x00, 0x3e, 0xc7, 0x0b, 0x00, 0xb8, 0xc8, + 0x0b, 0x00, 0x15, 0xc9, 0x0b, 0x00, 0x64, 0xc9, 0x0b, 0x00, 0x68, 0xc9, + 0x0b, 0x00, 0x74, 0xc9, 0x0b, 0x00, 0x75, 0xc9, 0x0b, 0x00, 0x78, 0xc9, + 0x0b, 0x00, 0x7c, 0xc9, 0x0b, 0x00, 0x7e, 0xc9, 0x0b, 0x00, 0x7f, 0xc9, + 0x0b, 0x00, 0x30, 0xca, 0x0b, 0x00, 0x37, 0xca, 0x0b, 0x00, 0x3d, 0xca, + 0x0b, 0x00, 0x3e, 0xca, 0x0b, 0x00, 0x3f, 0xca, 0x0b, 0x00, 0xb1, 0xca, + 0x0b, 0x00, 0xb8, 0xca, 0x0b, 0x00, 0xc7, 0xca, 0x0b, 0x00, 0xcb, 0xca, + 0x0b, 0x00, 0xe7, 0xca, 0x0b, 0x00, 0xeb, 0xca, 0x0b, 0x00, 0xf7, 0xca, + 0x0b, 0x00, 0xf8, 0xca, 0x0b, 0x00, 0xfc, 0xca, 0x0b, 0x00, 0xfe, 0xca, + 0x0b, 0x00, 0xff, 0xca, 0x0b, 0x00, 0x8e, 0xcb, 0x0b, 0x00, 0xbe, 0xcc, + 0x0b, 0x00, 0xbf, 0xcc, 0x0b, 0x00, 0x15, 0xcd, 0x0b, 0x00, 0x68, 0xcd, + 0x0b, 0x00, 0x7e, 0xcd, 0x0b, 0x00, 0x7f, 0xcd, 0x0b, 0x00, 0xb4, 0xce, + 0x0b, 0x00, 0xbe, 0xce, 0x0b, 0x00, 0xbf, 0xce, 0x0b, 0x00, 0x88, 0xcf, + 0x0b, 0x00, 0xc4, 0xcf, 0x0b, 0x00, 0xc6, 0xcf, 0x0b, 0x00, 0xc7, 0xcf, + 0x0b, 0x00, 0xc8, 0xcf, 0x0b, 0x00, 0xe0, 0xcf, 0x0b, 0x00, 0xe1, 0xcf, + 0x0b, 0x00, 0xe2, 0xcf, 0x0b, 0x00, 0xe4, 0xcf, 0x0b, 0x00, 0xe6, 0xcf, + 0x0b, 0x00, 0xe7, 0xcf, 0x0b, 0x00, 0xe8, 0xcf, 0x0b, 0x00, 0xf2, 0xcf, + 0x0b, 0x00, 0xf4, 0xcf, 0x0b, 0x00, 0xf5, 0xcf, 0x0b, 0x00, 0xf6, 0xcf, + 0x0b, 0x00, 0xf7, 0xcf, 0x0b, 0x00, 0xf8, 0xcf, 0x0b, 0x00, 0xfa, 0xcf, + 0x0b, 0x00, 0xfc, 0xcf, 0x0b, 0x00, 0xfe, 0xcf, 0x0b, 0x00, 0xff, 0xcf, + 0x0b, 0x00, 0xb8, 0xd0, 0x0b, 0x00, 0x38, 0xd2, 0x0b, 0x00, 0xf8, 0xd2, + 0x0b, 0x00, 0xfc, 0xd2, 0x0b, 0x00, 0xfe, 0xd2, 0x0b, 0x00, 0xff, 0xd2, + 0x0b, 0x00, 0xb8, 0xd4, 0x0b, 0x00, 0xf3, 0xd5, 0x0b, 0x00, 0xfb, 0xd5, + 0x0b, 0x00, 0xb8, 0xd6, 0x0b, 0x00, 0x8e, 0xd7, 0x0b, 0x00, 0x8f, 0xd7, + 0x0b, 0x00, 0x48, 0xd8, 0x0b, 0x00, 0xb8, 0xd8, 0x0b, 0x00, 0xf8, 0xd8, + 0x0b, 0x00, 0xfc, 0xd8, 0x0b, 0x00, 0xfe, 0xd8, 0x0b, 0x00, 0xff, 0xd8, + 0x0b, 0x00, 0x38, 0xd9, 0x0b, 0x00, 0x3e, 0xda, 0x0b, 0x00, 0x3f, 0xda, + 0x0b, 0x00, 0xbe, 0xda, 0x0b, 0x00, 0xbf, 0xda, 0x0b, 0x00, 0xc8, 0xdc, + 0x0b, 0x00, 0xcb, 0xdc, 0x0b, 0x00, 0x38, 0xdd, 0x0b, 0x00, 0xf8, 0xde, + 0x0b, 0x00, 0xfc, 0xde, 0x0b, 0x00, 0xfe, 0xde, 0x0b, 0x00, 0xff, 0xde, + 0x0b, 0x00, 0xf3, 0xdf, 0x0b, 0x00, 0xfb, 0xdf, 0x0b, 0x00, 0xb8, 0xe0, + 0x0b, 0x00, 0xb8, 0xe2, 0x0b, 0x00, 0x7e, 0xe3, 0x0b, 0x00, 0x7f, 0xe3, + 0x0b, 0x00, 0xb8, 0xe4, 0x0b, 0x00, 0xe6, 0xe4, 0x0b, 0x00, 0xe7, 0xe4, + 0x0b, 0x00, 0xe8, 0xe4, 0x0b, 0x00, 0xe9, 0xe4, 0x0b, 0x00, 0xeb, 0xe4, + 0x0b, 0x00, 0xf6, 0xe4, 0x0b, 0x00, 0xf7, 0xe4, 0x0b, 0x00, 0xf8, 0xe4, + 0x0b, 0x00, 0xfc, 0xe4, 0x0b, 0x00, 0xfe, 0xe4, 0x0b, 0x00, 0xff, 0xe4, + 0x0b, 0x00, 0x1f, 0xe5, 0x0b, 0x00, 0x78, 0xe5, 0x0b, 0x00, 0xf0, 0xe5, + 0x0b, 0x00, 0xfe, 0xe5, 0x0b, 0x00, 0x30, 0xe6, 0x0b, 0x00, 0x37, 0xe6, + 0x0b, 0x00, 0x3d, 0xe6, 0x0b, 0x00, 0x3e, 0xe6, 0x0b, 0x00, 0x3f, 0xe6, + 0x0b, 0x00, 0xb1, 0xe6, 0x0b, 0x00, 0xb8, 0xe6, 0x0b, 0x00, 0x30, 0xe7, + 0x0b, 0x00, 0x36, 0xe7, 0x0b, 0x00, 0x3e, 0xe7, 0x0b, 0x00, 0x8e, 0xe7, + 0x0b, 0x00, 0xb8, 0xe8, 0x0b, 0x00, 0x74, 0xe9, 0x0b, 0x00, 0x75, 0xe9, + 0x0b, 0x00, 0x78, 0xe9, 0x0b, 0x00, 0x7c, 0xe9, 0x0b, 0x00, 0x7e, 0xe9, + 0x0b, 0x00, 0x7f, 0xe9, 0x0b, 0x00, 0x31, 0xea, 0x0b, 0x00, 0x38, 0xea, + 0x0b, 0x00, 0xb0, 0xea, 0x0b, 0x00, 0xb6, 0xea, 0x0b, 0x00, 0xbe, 0xea, + 0x0b, 0x00, 0xf0, 0xea, 0x0b, 0x00, 0xf1, 0xea, 0x0b, 0x00, 0xf9, 0xea, + 0x0b, 0x00, 0xfd, 0xea, 0x0b, 0x00, 0xbe, 0xec, 0x0b, 0x00, 0xbf, 0xec, + 0x0b, 0x00, 0x7e, 0xed, 0x0b, 0x00, 0x7f, 0xed, 0x0b, 0x00, 0xb8, 0xee, + 0x0b, 0x00, 0xf2, 0xef, 0x0b, 0x00, 0xf4, 0xef, 0x0b, 0x00, 0xf5, 0xef, + 0x0b, 0x00, 0xf6, 0xef, 0x0b, 0x00, 0xf7, 0xef, 0x0b, 0x00, 0xf8, 0xef, + 0x0b, 0x00, 0xfa, 0xef, 0x0b, 0x00, 0xfc, 0xef, 0x0b, 0x00, 0xfe, 0xef, + 0x0b, 0x00, 0xff, 0xef, 0x0b, 0x00, 0xb8, 0xf0, 0x0b, 0x00, 0x1f, 0xf2, + 0x0b, 0x00, 0x30, 0xf2, 0x0b, 0x00, 0x37, 0xf2, 0x0b, 0x00, 0x3d, 0xf2, + 0x0b, 0x00, 0x3e, 0xf2, 0x0b, 0x00, 0x3f, 0xf2, 0x0b, 0x00, 0xb4, 0xf2, + 0x0b, 0x00, 0xbe, 0xf2, 0x0b, 0x00, 0xbf, 0xf2, 0x0b, 0x00, 0xc7, 0xf2, + 0x0b, 0x00, 0xcb, 0xf2, 0x0b, 0x00, 0xe7, 0xf2, 0x0b, 0x00, 0xeb, 0xf2, + 0x0b, 0x00, 0xf7, 0xf2, 0x0b, 0x00, 0xf8, 0xf2, 0x0b, 0x00, 0xfc, 0xf2, + 0x0b, 0x00, 0xfe, 0xf2, 0x0b, 0x00, 0xff, 0xf2, 0x0b, 0x00, 0x1e, 0xf3, + 0x0b, 0x00, 0x1f, 0xf3, 0x0b, 0x00, 0x48, 0xf3, 0x0b, 0x00, 0x4b, 0xf3, + 0x0b, 0x00, 0x78, 0xf3, 0x0b, 0x00, 0x88, 0xf3, 0x0b, 0x00, 0x96, 0xf3, + 0x0b, 0x00, 0x9e, 0xf3, 0x0b, 0x00, 0xb8, 0xf4, 0x0b, 0x00, 0x15, 0xf5, + 0x0b, 0x00, 0x68, 0xf5, 0x0b, 0x00, 0x7e, 0xf5, 0x0b, 0x00, 0x7f, 0xf5, + 0x0b, 0x00, 0xf0, 0xf5, 0x0b, 0x00, 0xfe, 0xf5, 0x0b, 0x00, 0xb1, 0xf6, + 0x0b, 0x00, 0xb8, 0xf6, 0x0b, 0x00, 0x8e, 0xf7, 0x0b, 0x00, 0x4d, 0xf8, + 0x0b, 0x00, 0xb8, 0xf8, 0x0b, 0x00, 0xe6, 0xf8, 0x0b, 0x00, 0xe7, 0xf8, + 0x0b, 0x00, 0xe8, 0xf8, 0x0b, 0x00, 0xe9, 0xf8, 0x0b, 0x00, 0xeb, 0xf8, + 0x0b, 0x00, 0xf0, 0xf8, 0x0b, 0x00, 0xf6, 0xf8, 0x0b, 0x00, 0xf7, 0xf8, + 0x0b, 0x00, 0xfd, 0xf8, 0x0b, 0x00, 0xfe, 0xf8, 0x0b, 0x00, 0xff, 0xf8, + 0x0b, 0x00, 0x1f, 0xf9, 0x0b, 0x00, 0x30, 0xf9, 0x0b, 0x00, 0x3e, 0xf9, + 0x0b, 0x00, 0x50, 0xf9, 0x0b, 0x00, 0x59, 0xf9, 0x0b, 0x00, 0x5d, 0xf9, + 0x0b, 0x00, 0x30, 0xfa, 0x0b, 0x00, 0x37, 0xfa, 0x0b, 0x00, 0x3d, 0xfa, + 0x0b, 0x00, 0x3e, 0xfa, 0x0b, 0x00, 0x3f, 0xfa, 0x0b, 0x00, 0xb1, 0xfa, + 0x0b, 0x00, 0xb8, 0xfa, 0x0b, 0x00, 0xc7, 0xfa, 0x0b, 0x00, 0xcb, 0xfa, + 0x0b, 0x00, 0xe7, 0xfa, 0x0b, 0x00, 0xeb, 0xfa, 0x0b, 0x00, 0xf7, 0xfa, + 0x0b, 0x00, 0xf8, 0xfa, 0x0b, 0x00, 0xfc, 0xfa, 0x0b, 0x00, 0xfe, 0xfa, + 0x0b, 0x00, 0xff, 0xfa, 0x0b, 0x00, 0x8e, 0xfb, 0x0b, 0x00, 0xbe, 0xfc, + 0x0b, 0x00, 0xbf, 0xfc, 0x0b, 0x00, 0xd1, 0xfc, 0x0b, 0x00, 0xd6, 0xfc, + 0x0b, 0x00, 0xd7, 0xfc, 0x0b, 0x00, 0xd8, 0xfc, 0x0b, 0x00, 0xdc, 0xfc, + 0x0b, 0x00, 0xde, 0xfc, 0x0b, 0x00, 0xdf, 0xfc, 0x0b, 0x00, 0xe6, 0xfc, + 0x0b, 0x00, 0xe7, 0xfc, 0x0b, 0x00, 0xe8, 0xfc, 0x0b, 0x00, 0xe9, 0xfc, + 0x0b, 0x00, 0xeb, 0xfc, 0x0b, 0x00, 0xf6, 0xfc, 0x0b, 0x00, 0xf7, 0xfc, + 0x0b, 0x00, 0xf8, 0xfc, 0x0b, 0x00, 0xfc, 0xfc, 0x0b, 0x00, 0xfe, 0xfc, + 0x0b, 0x00, 0xff, 0xfc, 0x0b, 0x00, 0x1f, 0xfd, 0x0b, 0x00, 0x30, 0xfd, + 0x0b, 0x00, 0x3e, 0xfd, 0x0b, 0x00, 0x50, 0xfd, 0x0b, 0x00, 0x58, 0xfd, + 0x0b, 0x00, 0x78, 0xfd, 0x0b, 0x00, 0x1f, 0xfe, 0x0b, 0x00, 0x2b, 0xfe, + 0x0b, 0x00, 0xb4, 0xfe, 0x0b, 0x00, 0xbe, 0xfe, 0x0b, 0x00, 0xbf, 0xfe, + 0x0b, 0x00, 0xd1, 0xfe, 0x0b, 0x00, 0xd6, 0xfe, 0x0b, 0x00, 0xd7, 0xfe, + 0x0b, 0x00, 0xdf, 0xfe, 0x0b, 0x00, 0xe7, 0xfe, 0x0b, 0x00, 0xeb, 0xfe, + 0x0b, 0x00, 0xf7, 0xfe, 0x0b, 0x00, 0xf8, 0xfe, 0x0b, 0x00, 0xfc, 0xfe, + 0x0b, 0x00, 0xfe, 0xfe, 0x0b, 0x00, 0xff, 0xfe, 0x0b, 0x00, 0x23, 0xff, + 0x0b, 0x00, 0x28, 0xff, 0x0b, 0x00, 0x2b, 0xff, 0x0b, 0x00, 0x2c, 0xff, + 0x0b, 0x00, 0x2e, 0xff, 0x0b, 0x00, 0x2f, 0xff, 0x0b, 0x00, 0x88, 0xff, + 0x0b, 0x00, 0xa3, 0xff, 0x0b, 0x00, 0xa8, 0xff, 0x0b, 0x00, 0xab, 0xff, + 0x0b, 0x00, 0xac, 0xff, 0x0b, 0x00, 0xae, 0xff, 0x0b, 0x00, 0xaf, 0xff, + 0x0b, 0x00, 0xc4, 0xff, 0x0b, 0x00, 0xc6, 0xff, 0x0b, 0x00, 0xc7, 0xff, + 0x0b, 0x00, 0xc8, 0xff, 0x0b, 0x00, 0xe0, 0xff, 0x0b, 0x00, 0xe1, 0xff, + 0x0b, 0x00, 0xe2, 0xff, 0x0b, 0x00, 0xe4, 0xff, 0x0b, 0x00, 0xe6, 0xff, + 0x0b, 0x00, 0xe7, 0xff, 0x0b, 0x00, 0xe8, 0xff, 0x0b, 0x00, 0xf2, 0xff, + 0x0b, 0x00, 0xf4, 0xff, 0x0b, 0x00, 0xf5, 0xff, 0x0b, 0x00, 0xf6, 0xff, + 0x0b, 0x00, 0xf7, 0xff, 0x0b, 0x00, 0xf8, 0xff, 0x0b, 0x00, 0xfa, 0xff, + 0x0b, 0x00, 0xfc, 0xff, 0x0b, 0x00, 0xfe, 0xff, 0x0b, 0x00, 0xff, 0xff, + 0x0b, 0x00, 0x6b, 0x00, 0x0c, 0x00, 0x78, 0x00, 0x0c, 0x00, 0x7c, 0x00, + 0x0c, 0x00, 0x7e, 0x00, 0x0c, 0x00, 0x7f, 0x00, 0x0c, 0x00, 0xb8, 0x00, + 0x0c, 0x00, 0xbc, 0x00, 0x0c, 0x00, 0xbe, 0x00, 0x0c, 0x00, 0xbf, 0x00, + 0x0c, 0x00, 0x8b, 0x01, 0x0c, 0x00, 0x9f, 0x01, 0x0c, 0x00, 0xdf, 0x01, + 0x0c, 0x00, 0xb8, 0x04, 0x0c, 0x00, 0xbc, 0x04, 0x0c, 0x00, 0xbe, 0x04, + 0x0c, 0x00, 0xbf, 0x04, 0x0c, 0x00, 0xcb, 0x05, 0x0c, 0x00, 0xeb, 0x05, + 0x0c, 0x00, 0xf8, 0x05, 0x0c, 0x00, 0xfc, 0x05, 0x0c, 0x00, 0xfe, 0x05, + 0x0c, 0x00, 0xff, 0x05, 0x0c, 0x00, 0xb8, 0x06, 0x0c, 0x00, 0xbc, 0x06, + 0x0c, 0x00, 0xbe, 0x06, 0x0c, 0x00, 0xbf, 0x06, 0x0c, 0x00, 0x9f, 0x09, + 0x0c, 0x00, 0xdf, 0x09, 0x0c, 0x00, 0x78, 0x0a, 0x0c, 0x00, 0x7c, 0x0a, + 0x0c, 0x00, 0x7e, 0x0a, 0x0c, 0x00, 0x7f, 0x0a, 0x0c, 0x00, 0x8b, 0x0b, + 0x0c, 0x00, 0xdf, 0x0b, 0x0c, 0x00, 0xeb, 0x0b, 0x0c, 0x00, 0xcb, 0x0f, + 0x0c, 0x00, 0xeb, 0x0f, 0x0c, 0x00, 0x6b, 0x10, 0x0c, 0x00, 0xb8, 0x10, + 0x0c, 0x00, 0x8b, 0x11, 0x0c, 0x00, 0x9f, 0x11, 0x0c, 0x00, 0xdf, 0x11, + 0x0c, 0x00, 0xeb, 0x13, 0x0c, 0x00, 0x6b, 0x14, 0x0c, 0x00, 0x7f, 0x14, + 0x0c, 0x00, 0x9f, 0x14, 0x0c, 0x00, 0x9f, 0x15, 0x0c, 0x00, 0xdf, 0x15, + 0x0c, 0x00, 0x78, 0x16, 0x0c, 0x00, 0x7c, 0x16, 0x0c, 0x00, 0x7e, 0x16, + 0x0c, 0x00, 0x7f, 0x16, 0x0c, 0x00, 0x9f, 0x16, 0x0c, 0x00, 0x78, 0x17, + 0x0c, 0x00, 0x7c, 0x17, 0x0c, 0x00, 0x7e, 0x17, 0x0c, 0x00, 0x7f, 0x17, + 0x0c, 0x00, 0x8b, 0x17, 0x0c, 0x00, 0x9f, 0x17, 0x0c, 0x00, 0xdf, 0x17, + 0x0c, 0x00, 0x78, 0x18, 0x0c, 0x00, 0x7c, 0x18, 0x0c, 0x00, 0x7e, 0x18, + 0x0c, 0x00, 0x7f, 0x18, 0x0c, 0x00, 0xbe, 0x18, 0x0c, 0x00, 0xbf, 0x18, + 0x0c, 0x00, 0xb8, 0x1a, 0x0c, 0x00, 0xbc, 0x1a, 0x0c, 0x00, 0xbe, 0x1a, + 0x0c, 0x00, 0xbf, 0x1a, 0x0c, 0x00, 0xcb, 0x1d, 0x0c, 0x00, 0xeb, 0x1d, + 0x0c, 0x00, 0x9f, 0x25, 0x0c, 0x00, 0xdf, 0x25, 0x0c, 0x00, 0xbf, 0x26, + 0x0c, 0x00, 0xcb, 0x27, 0x0c, 0x00, 0xeb, 0x27, 0x0c, 0x00, 0x8b, 0x28, + 0x0c, 0x00, 0xbe, 0x28, 0x0c, 0x00, 0xbf, 0x28, 0x0c, 0x00, 0xcb, 0x29, + 0x0c, 0x00, 0xeb, 0x29, 0x0c, 0x00, 0xf8, 0x29, 0x0c, 0x00, 0xfc, 0x29, + 0x0c, 0x00, 0xfe, 0x29, 0x0c, 0x00, 0xff, 0x29, 0x0c, 0x00, 0xf8, 0x2b, + 0x0c, 0x00, 0xfc, 0x2b, 0x0c, 0x00, 0xfe, 0x2b, 0x0c, 0x00, 0xff, 0x2b, + 0x0c, 0x00, 0x9f, 0x2c, 0x0c, 0x00, 0xf8, 0x2d, 0x0c, 0x00, 0xfc, 0x2d, + 0x0c, 0x00, 0xfe, 0x2d, 0x0c, 0x00, 0xff, 0x2d, 0x0c, 0x00, 0x9f, 0x2e, + 0x0c, 0x00, 0x9f, 0x2f, 0x0c, 0x00, 0xdf, 0x2f, 0x0c, 0x00, 0x8b, 0x30, + 0x0c, 0x00, 0xb8, 0x30, 0x0c, 0x00, 0xbc, 0x30, 0x0c, 0x00, 0xbe, 0x30, + 0x0c, 0x00, 0xbf, 0x30, 0x0c, 0x00, 0x87, 0x31, 0x0c, 0x00, 0x8b, 0x33, + 0x0c, 0x00, 0x90, 0x33, 0x0c, 0x00, 0x91, 0x33, 0x0c, 0x00, 0x96, 0x33, + 0x0c, 0x00, 0x97, 0x33, 0x0c, 0x00, 0x9f, 0x33, 0x0c, 0x00, 0x6b, 0x35, + 0x0c, 0x00, 0x87, 0x36, 0x0c, 0x00, 0xb7, 0x36, 0x0c, 0x00, 0xc7, 0x37, + 0x0c, 0x00, 0xcb, 0x37, 0x0c, 0x00, 0xe7, 0x37, 0x0c, 0x00, 0xeb, 0x37, + 0x0c, 0x00, 0xf0, 0x37, 0x0c, 0x00, 0xf1, 0x37, 0x0c, 0x00, 0xf7, 0x37, + 0x0c, 0x00, 0xf9, 0x37, 0x0c, 0x00, 0xfd, 0x37, 0x0c, 0x00, 0xbf, 0x3a, + 0x0c, 0x00, 0x87, 0x3b, 0x0c, 0x00, 0x7f, 0x3c, 0x0c, 0x00, 0x8b, 0x3d, + 0x0c, 0x00, 0x97, 0x3d, 0x0c, 0x00, 0x9f, 0x3d, 0x0c, 0x00, 0xd7, 0x3d, + 0x0c, 0x00, 0xdf, 0x3d, 0x0c, 0x00, 0x6b, 0x3e, 0x0c, 0x00, 0xf8, 0x3f, + 0x0c, 0x00, 0xfc, 0x3f, 0x0c, 0x00, 0xfe, 0x3f, 0x0c, 0x00, 0xff, 0x3f, + 0x0c, 0x00, 0x70, 0x44, 0x0c, 0x00, 0x71, 0x44, 0x0c, 0x00, 0x79, 0x44, + 0x0c, 0x00, 0x7d, 0x44, 0x0c, 0x00, 0x8b, 0x45, 0x0c, 0x00, 0x9f, 0x45, + 0x0c, 0x00, 0xdf, 0x45, 0x0c, 0x00, 0x67, 0x46, 0x0c, 0x00, 0x6b, 0x46, + 0x0c, 0x00, 0x77, 0x46, 0x0c, 0x00, 0x78, 0x46, 0x0c, 0x00, 0x7c, 0x46, + 0x0c, 0x00, 0x7e, 0x46, 0x0c, 0x00, 0x7f, 0x46, 0x0c, 0x00, 0x87, 0x47, + 0x0c, 0x00, 0x9f, 0x47, 0x0c, 0x00, 0xdf, 0x47, 0x0c, 0x00, 0xb7, 0x4a, + 0x0c, 0x00, 0x91, 0x4b, 0x0c, 0x00, 0x96, 0x4b, 0x0c, 0x00, 0x97, 0x4b, + 0x0c, 0x00, 0x9f, 0x4b, 0x0c, 0x00, 0xb8, 0x52, 0x0c, 0x00, 0xbc, 0x52, + 0x0c, 0x00, 0xbe, 0x52, 0x0c, 0x00, 0xbf, 0x52, 0x0c, 0x00, 0x8b, 0x53, + 0x0c, 0x00, 0x9f, 0x53, 0x0c, 0x00, 0x90, 0x59, 0x0c, 0x00, 0x91, 0x59, + 0x0c, 0x00, 0x96, 0x59, 0x0c, 0x00, 0x97, 0x59, 0x0c, 0x00, 0xd0, 0x59, + 0x0c, 0x00, 0xd1, 0x59, 0x0c, 0x00, 0xd6, 0x59, 0x0c, 0x00, 0xd7, 0x59, + 0x0c, 0x00, 0xb0, 0x5a, 0x0c, 0x00, 0xb1, 0x5a, 0x0c, 0x00, 0xb9, 0x5a, + 0x0c, 0x00, 0xbd, 0x5a, 0x0c, 0x00, 0x87, 0x5b, 0x0c, 0x00, 0x8b, 0x5d, + 0x0c, 0x00, 0x9f, 0x5d, 0x0c, 0x00, 0xdf, 0x5d, 0x0c, 0x00, 0x6b, 0x5e, + 0x0c, 0x00, 0x78, 0x5e, 0x0c, 0x00, 0x7c, 0x5e, 0x0c, 0x00, 0x7e, 0x5e, + 0x0c, 0x00, 0x7f, 0x5e, 0x0c, 0x00, 0xf0, 0x5f, 0x0c, 0x00, 0xf1, 0x5f, + 0x0c, 0x00, 0xf9, 0x5f, 0x0c, 0x00, 0xfd, 0x5f, 0x0c, 0x00, 0xb3, 0x64, + 0x0c, 0x00, 0xbb, 0x64, 0x0c, 0x00, 0xcb, 0x65, 0x0c, 0x00, 0xcf, 0x65, + 0x0c, 0x00, 0xeb, 0x65, 0x0c, 0x00, 0xef, 0x65, 0x0c, 0x00, 0xff, 0x65, + 0x0c, 0x00, 0xb3, 0x66, 0x0c, 0x00, 0xbb, 0x66, 0x0c, 0x00, 0x0b, 0x67, + 0x0c, 0x00, 0xce, 0x67, 0x0c, 0x00, 0xcf, 0x67, 0x0c, 0x00, 0xee, 0x67, + 0x0c, 0x00, 0xef, 0x67, 0x0c, 0x00, 0xf8, 0x67, 0x0c, 0x00, 0xfc, 0x67, + 0x0c, 0x00, 0xfe, 0x67, 0x0c, 0x00, 0xff, 0x67, 0x0c, 0x00, 0x6e, 0x6a, + 0x0c, 0x00, 0x6f, 0x6a, 0x0c, 0x00, 0x78, 0x6a, 0x0c, 0x00, 0x7c, 0x6a, + 0x0c, 0x00, 0x7e, 0x6a, 0x0c, 0x00, 0x7f, 0x6a, 0x0c, 0x00, 0x84, 0x6b, + 0x0c, 0x00, 0xf3, 0x6b, 0x0c, 0x00, 0xfb, 0x6b, 0x0c, 0x00, 0xd5, 0x73, + 0x0c, 0x00, 0xee, 0x73, 0x0c, 0x00, 0xef, 0x73, 0x0c, 0x00, 0xf8, 0x73, + 0x0c, 0x00, 0xfc, 0x73, 0x0c, 0x00, 0xfe, 0x73, 0x0c, 0x00, 0xff, 0x73, + 0x0c, 0x00, 0x63, 0x78, 0x0c, 0x00, 0x73, 0x78, 0x0c, 0x00, 0x7b, 0x78, + 0x0c, 0x00, 0x8b, 0x78, 0x0c, 0x00, 0xb4, 0x78, 0x0c, 0x00, 0xb8, 0x78, + 0x0c, 0x00, 0xcf, 0x79, 0x0c, 0x00, 0xef, 0x79, 0x0c, 0x00, 0xff, 0x79, + 0x0c, 0x00, 0xb3, 0x7a, 0x0c, 0x00, 0xbb, 0x7a, 0x0c, 0x00, 0x95, 0x7b, + 0x0c, 0x00, 0xcb, 0x7d, 0x0c, 0x00, 0xcf, 0x7d, 0x0c, 0x00, 0xeb, 0x7d, + 0x0c, 0x00, 0xef, 0x7d, 0x0c, 0x00, 0xff, 0x7d, 0x0c, 0x00, 0x9b, 0x7f, + 0x0c, 0x00, 0xdb, 0x7f, 0x0c, 0x00, 0x16, 0x81, 0x0c, 0x00, 0x61, 0x81, + 0x0c, 0x00, 0x62, 0x81, 0x0c, 0x00, 0x67, 0x81, 0x0c, 0x00, 0x6d, 0x81, + 0x0c, 0x00, 0x6e, 0x81, 0x0c, 0x00, 0x6f, 0x81, 0x0c, 0x00, 0x72, 0x81, + 0x0c, 0x00, 0x77, 0x81, 0x0c, 0x00, 0x78, 0x81, 0x0c, 0x00, 0x7a, 0x81, + 0x0c, 0x00, 0x7c, 0x81, 0x0c, 0x00, 0x7e, 0x81, 0x0c, 0x00, 0x7f, 0x81, + 0x0c, 0x00, 0x73, 0x82, 0x0c, 0x00, 0x7b, 0x82, 0x0c, 0x00, 0xb8, 0x82, + 0x0c, 0x00, 0x0e, 0x83, 0x0c, 0x00, 0x0f, 0x83, 0x0c, 0x00, 0x78, 0x83, + 0x0c, 0x00, 0x7c, 0x83, 0x0c, 0x00, 0x7e, 0x83, 0x0c, 0x00, 0x7f, 0x83, + 0x0c, 0x00, 0x90, 0x83, 0x0c, 0x00, 0x9f, 0x83, 0x0c, 0x00, 0x0b, 0x85, + 0x0c, 0x00, 0xcd, 0x85, 0x0c, 0x00, 0xf2, 0x85, 0x0c, 0x00, 0xf7, 0x85, + 0x0c, 0x00, 0xf8, 0x85, 0x0c, 0x00, 0xfa, 0x85, 0x0c, 0x00, 0xfc, 0x85, + 0x0c, 0x00, 0xfe, 0x85, 0x0c, 0x00, 0xff, 0x85, 0x0c, 0x00, 0x10, 0x87, + 0x0c, 0x00, 0x1f, 0x87, 0x0c, 0x00, 0x8d, 0x87, 0x0c, 0x00, 0x8e, 0x87, + 0x0c, 0x00, 0x8f, 0x87, 0x0c, 0x00, 0xd6, 0x87, 0x0c, 0x00, 0xf1, 0x87, + 0x0c, 0x00, 0xf3, 0x87, 0x0c, 0x00, 0xf9, 0x87, 0x0c, 0x00, 0xfb, 0x87, + 0x0c, 0x00, 0xfd, 0x87, 0x0c, 0x00, 0x96, 0x88, 0x0c, 0x00, 0x9f, 0x88, + 0x0c, 0x00, 0x03, 0x89, 0x0c, 0x00, 0x83, 0x89, 0x0c, 0x00, 0xd7, 0x89, + 0x0c, 0x00, 0xdf, 0x89, 0x0c, 0x00, 0xe3, 0x89, 0x0c, 0x00, 0xe7, 0x89, + 0x0c, 0x00, 0xf3, 0x89, 0x0c, 0x00, 0xf7, 0x89, 0x0c, 0x00, 0xfb, 0x89, + 0x0c, 0x00, 0x11, 0x8b, 0x0c, 0x00, 0x16, 0x8b, 0x0c, 0x00, 0x17, 0x8b, + 0x0c, 0x00, 0x1f, 0x8b, 0x0c, 0x00, 0xd0, 0x8b, 0x0c, 0x00, 0xe1, 0x8b, + 0x0c, 0x00, 0xe2, 0x8b, 0x0c, 0x00, 0xed, 0x8b, 0x0c, 0x00, 0xee, 0x8b, + 0x0c, 0x00, 0xef, 0x8b, 0x0c, 0x00, 0xf2, 0x8b, 0x0c, 0x00, 0xf8, 0x8b, + 0x0c, 0x00, 0xfa, 0x8b, 0x0c, 0x00, 0xfc, 0x8b, 0x0c, 0x00, 0xfe, 0x8b, + 0x0c, 0x00, 0xff, 0x8b, 0x0c, 0x00, 0x6b, 0x8c, 0x0c, 0x00, 0x6f, 0x8c, + 0x0c, 0x00, 0x7f, 0x8c, 0x0c, 0x00, 0x84, 0x8c, 0x0c, 0x00, 0x8e, 0x8c, + 0x0c, 0x00, 0x8f, 0x8c, 0x0c, 0x00, 0xbe, 0x8c, 0x0c, 0x00, 0xbf, 0x8c, + 0x0c, 0x00, 0x03, 0x8d, 0x0c, 0x00, 0x83, 0x8d, 0x0c, 0x00, 0xd7, 0x8d, + 0x0c, 0x00, 0xdf, 0x8d, 0x0c, 0x00, 0xe3, 0x8d, 0x0c, 0x00, 0xe7, 0x8d, + 0x0c, 0x00, 0xf3, 0x8d, 0x0c, 0x00, 0xf7, 0x8d, 0x0c, 0x00, 0xfb, 0x8d, + 0x0c, 0x00, 0x6e, 0x8e, 0x0c, 0x00, 0x6f, 0x8e, 0x0c, 0x00, 0x78, 0x8e, + 0x0c, 0x00, 0x7c, 0x8e, 0x0c, 0x00, 0x7e, 0x8e, 0x0c, 0x00, 0x7f, 0x8e, + 0x0c, 0x00, 0x84, 0x8e, 0x0c, 0x00, 0x8b, 0x8e, 0x0c, 0x00, 0x8f, 0x8e, + 0x0c, 0x00, 0xb3, 0x8e, 0x0c, 0x00, 0xbb, 0x8e, 0x0c, 0x00, 0xbf, 0x8e, + 0x0c, 0x00, 0x73, 0x8f, 0x0c, 0x00, 0x7b, 0x8f, 0x0c, 0x00, 0x96, 0x8f, + 0x0c, 0x00, 0x9f, 0x8f, 0x0c, 0x00, 0xb4, 0x90, 0x0c, 0x00, 0xbe, 0x90, + 0x0c, 0x00, 0xbf, 0x90, 0x0c, 0x00, 0xf8, 0x91, 0x0c, 0x00, 0xfc, 0x91, + 0x0c, 0x00, 0xfe, 0x91, 0x0c, 0x00, 0xff, 0x91, 0x0c, 0x00, 0x95, 0x93, + 0x0c, 0x00, 0xc3, 0x95, 0x0c, 0x00, 0xe3, 0x95, 0x0c, 0x00, 0xf3, 0x95, + 0x0c, 0x00, 0xfb, 0x95, 0x0c, 0x00, 0xff, 0x95, 0x0c, 0x00, 0x83, 0x96, + 0x0c, 0x00, 0xb4, 0x96, 0x0c, 0x00, 0x84, 0x97, 0x0c, 0x00, 0x8e, 0x97, + 0x0c, 0x00, 0x8f, 0x97, 0x0c, 0x00, 0xf3, 0x99, 0x0c, 0x00, 0xfb, 0x99, + 0x0c, 0x00, 0x84, 0x9b, 0x0c, 0x00, 0xf8, 0x9d, 0x0c, 0x00, 0x95, 0x9f, + 0x0c, 0x00, 0xd5, 0x9f, 0x0c, 0x00, 0x6b, 0xa4, 0x0c, 0x00, 0x6f, 0xa4, + 0x0c, 0x00, 0x7f, 0xa4, 0x0c, 0x00, 0xbe, 0xa4, 0x0c, 0x00, 0xbf, 0xa4, + 0x0c, 0x00, 0x94, 0xa5, 0x0c, 0x00, 0x9f, 0xa5, 0x0c, 0x00, 0x6e, 0xa6, + 0x0c, 0x00, 0x6f, 0xa6, 0x0c, 0x00, 0x78, 0xa6, 0x0c, 0x00, 0x7c, 0xa6, + 0x0c, 0x00, 0x7e, 0xa6, 0x0c, 0x00, 0x7f, 0xa6, 0x0c, 0x00, 0xb3, 0xa6, + 0x0c, 0x00, 0xbb, 0xa6, 0x0c, 0x00, 0xbf, 0xa6, 0x0c, 0x00, 0x0b, 0xa7, + 0x0c, 0x00, 0x6b, 0xa7, 0x0c, 0x00, 0x78, 0xa7, 0x0c, 0x00, 0x7c, 0xa7, + 0x0c, 0x00, 0x7e, 0xa7, 0x0c, 0x00, 0x7f, 0xa7, 0x0c, 0x00, 0x9f, 0xa7, + 0x0c, 0x00, 0x74, 0xaa, 0x0c, 0x00, 0x7e, 0xaa, 0x0c, 0x00, 0x7f, 0xaa, + 0x0c, 0x00, 0x0b, 0xab, 0x0c, 0x00, 0x7e, 0xab, 0x0c, 0x00, 0x7f, 0xab, + 0x0c, 0x00, 0x95, 0xab, 0x0c, 0x00, 0x97, 0xb2, 0x0c, 0x00, 0x9f, 0xb2, + 0x0c, 0x00, 0x1f, 0xb3, 0x0c, 0x00, 0xd6, 0xb3, 0x0c, 0x00, 0xdf, 0xb3, + 0x0c, 0x00, 0xe7, 0xb3, 0x0c, 0x00, 0xf1, 0xb3, 0x0c, 0x00, 0xf3, 0xb3, + 0x0c, 0x00, 0xf7, 0xb3, 0x0c, 0x00, 0xf9, 0xb3, 0x0c, 0x00, 0xfb, 0xb3, + 0x0c, 0x00, 0xfd, 0xb3, 0x0c, 0x00, 0x6b, 0xb8, 0x0c, 0x00, 0x6f, 0xb8, + 0x0c, 0x00, 0x7f, 0xb8, 0x0c, 0x00, 0xb0, 0xb8, 0x0c, 0x00, 0xbe, 0xb8, + 0x0c, 0x00, 0x1f, 0xb9, 0x0c, 0x00, 0x6b, 0xb9, 0x0c, 0x00, 0x78, 0xb9, + 0x0c, 0x00, 0x7c, 0xb9, 0x0c, 0x00, 0x7e, 0xb9, 0x0c, 0x00, 0x7f, 0xb9, + 0x0c, 0x00, 0x97, 0xb9, 0x0c, 0x00, 0x9f, 0xb9, 0x0c, 0x00, 0x61, 0xba, + 0x0c, 0x00, 0x62, 0xba, 0x0c, 0x00, 0x6d, 0xba, 0x0c, 0x00, 0x6e, 0xba, + 0x0c, 0x00, 0x6f, 0xba, 0x0c, 0x00, 0x72, 0xba, 0x0c, 0x00, 0x78, 0xba, + 0x0c, 0x00, 0x7a, 0xba, 0x0c, 0x00, 0x7c, 0xba, 0x0c, 0x00, 0x7e, 0xba, + 0x0c, 0x00, 0x7f, 0xba, 0x0c, 0x00, 0xb3, 0xba, 0x0c, 0x00, 0xbb, 0xba, + 0x0c, 0x00, 0xbf, 0xba, 0x0c, 0x00, 0x07, 0xbb, 0x0c, 0x00, 0x0b, 0xbb, + 0x0c, 0x00, 0x6b, 0xbb, 0x0c, 0x00, 0x78, 0xbb, 0x0c, 0x00, 0x7c, 0xbb, + 0x0c, 0x00, 0x7e, 0xbb, 0x0c, 0x00, 0x7f, 0xbb, 0x0c, 0x00, 0x90, 0xbb, + 0x0c, 0x00, 0x91, 0xbc, 0x0c, 0x00, 0x96, 0xbc, 0x0c, 0x00, 0x97, 0xbc, + 0x0c, 0x00, 0x9f, 0xbc, 0x0c, 0x00, 0x1f, 0xbd, 0x0c, 0x00, 0x6b, 0xbd, + 0x0c, 0x00, 0x78, 0xbd, 0x0c, 0x00, 0x7c, 0xbd, 0x0c, 0x00, 0x7e, 0xbd, + 0x0c, 0x00, 0x7f, 0xbd, 0x0c, 0x00, 0x97, 0xbd, 0x0c, 0x00, 0x9f, 0xbd, + 0x0c, 0x00, 0x97, 0xbe, 0x0c, 0x00, 0x9f, 0xbe, 0x0c, 0x00, 0x1f, 0xbf, + 0x0c, 0x00, 0xd6, 0xbf, 0x0c, 0x00, 0xdf, 0xbf, 0x0c, 0x00, 0xe7, 0xbf, + 0x0c, 0x00, 0xf1, 0xbf, 0x0c, 0x00, 0xf3, 0xbf, 0x0c, 0x00, 0xf7, 0xbf, + 0x0c, 0x00, 0xf9, 0xbf, 0x0c, 0x00, 0xfb, 0xbf, 0x0c, 0x00, 0xfd, 0xbf, + 0x0c, 0x00, 0xb0, 0xc0, 0x0c, 0x00, 0xb6, 0xc0, 0x0c, 0x00, 0xb7, 0xc0, + 0x0c, 0x00, 0xbd, 0xc0, 0x0c, 0x00, 0xbe, 0xc0, 0x0c, 0x00, 0xbf, 0xc0, + 0x0c, 0x00, 0xc8, 0xc1, 0x0c, 0x00, 0xc9, 0xc1, 0x0c, 0x00, 0xcb, 0xc1, + 0x0c, 0x00, 0xf0, 0xc1, 0x0c, 0x00, 0xf1, 0xc1, 0x0c, 0x00, 0xf9, 0xc1, + 0x0c, 0x00, 0xfd, 0xc1, 0x0c, 0x00, 0xbe, 0xc2, 0x0c, 0x00, 0xbf, 0xc2, + 0x0c, 0x00, 0x18, 0xc3, 0x0c, 0x00, 0x1c, 0xc3, 0x0c, 0x00, 0x1e, 0xc3, + 0x0c, 0x00, 0x1f, 0xc3, 0x0c, 0x00, 0x90, 0xc3, 0x0c, 0x00, 0x98, 0xc3, + 0x0c, 0x00, 0x9c, 0xc3, 0x0c, 0x00, 0x9e, 0xc3, 0x0c, 0x00, 0x9f, 0xc3, + 0x0c, 0x00, 0xc6, 0xc5, 0x0c, 0x00, 0xc7, 0xc5, 0x0c, 0x00, 0xf6, 0xc5, + 0x0c, 0x00, 0xf7, 0xc5, 0x0c, 0x00, 0xf8, 0xc5, 0x0c, 0x00, 0xfc, 0xc5, + 0x0c, 0x00, 0xfe, 0xc5, 0x0c, 0x00, 0xff, 0xc5, 0x0c, 0x00, 0xb0, 0xc6, + 0x0c, 0x00, 0xb6, 0xc6, 0x0c, 0x00, 0xb7, 0xc6, 0x0c, 0x00, 0xbd, 0xc6, + 0x0c, 0x00, 0xbe, 0xc6, 0x0c, 0x00, 0xbf, 0xc6, 0x0c, 0x00, 0x0b, 0xc9, + 0x0c, 0x00, 0xf0, 0xc9, 0x0c, 0x00, 0xf1, 0xc9, 0x0c, 0x00, 0xf9, 0xc9, + 0x0c, 0x00, 0xfd, 0xc9, 0x0c, 0x00, 0x0b, 0xcd, 0x0c, 0x00, 0xf1, 0xcd, + 0x0c, 0x00, 0xf8, 0xcd, 0x0c, 0x00, 0x08, 0xcf, 0x0c, 0x00, 0x0b, 0xcf, + 0x0c, 0x00, 0x90, 0xcf, 0x0c, 0x00, 0x99, 0xcf, 0x0c, 0x00, 0x9d, 0xcf, + 0x0c, 0x00, 0xd0, 0xcf, 0x0c, 0x00, 0xd9, 0xcf, 0x0c, 0x00, 0xdd, 0xcf, + 0x0c, 0x00, 0xbe, 0xd0, 0x0c, 0x00, 0xbf, 0xd0, 0x0c, 0x00, 0xf8, 0xd1, + 0x0c, 0x00, 0xfc, 0xd1, 0x0c, 0x00, 0xfe, 0xd1, 0x0c, 0x00, 0xff, 0xd1, + 0x0c, 0x00, 0xdf, 0xd5, 0x0c, 0x00, 0xf8, 0xd5, 0x0c, 0x00, 0xfc, 0xd5, + 0x0c, 0x00, 0xfe, 0xd5, 0x0c, 0x00, 0xff, 0xd5, 0x0c, 0x00, 0x8b, 0xd6, + 0x0c, 0x00, 0xbe, 0xd6, 0x0c, 0x00, 0xbf, 0xd6, 0x0c, 0x00, 0xf8, 0xd9, + 0x0c, 0x00, 0xfc, 0xd9, 0x0c, 0x00, 0xfe, 0xd9, 0x0c, 0x00, 0xff, 0xd9, + 0x0c, 0x00, 0xbe, 0xda, 0x0c, 0x00, 0xbf, 0xda, 0x0c, 0x00, 0xf8, 0xdd, + 0x0c, 0x00, 0xfc, 0xdd, 0x0c, 0x00, 0xfe, 0xdd, 0x0c, 0x00, 0xff, 0xdd, + 0x0c, 0x00, 0xb0, 0xe0, 0x0c, 0x00, 0xb6, 0xe0, 0x0c, 0x00, 0xb7, 0xe0, + 0x0c, 0x00, 0xbd, 0xe0, 0x0c, 0x00, 0xbe, 0xe0, 0x0c, 0x00, 0xbf, 0xe0, + 0x0c, 0x00, 0xf6, 0xe1, 0x0c, 0x00, 0xf7, 0xe1, 0x0c, 0x00, 0xf8, 0xe1, + 0x0c, 0x00, 0xfc, 0xe1, 0x0c, 0x00, 0xfe, 0xe1, 0x0c, 0x00, 0xff, 0xe1, + 0x0c, 0x00, 0x7e, 0xe2, 0x0c, 0x00, 0x7f, 0xe2, 0x0c, 0x00, 0x18, 0xe3, + 0x0c, 0x00, 0x90, 0xe3, 0x0c, 0x00, 0x98, 0xe3, 0x0c, 0x00, 0x8b, 0xe5, + 0x0c, 0x00, 0xc7, 0xe5, 0x0c, 0x00, 0xcb, 0xe5, 0x0c, 0x00, 0xe7, 0xe5, + 0x0c, 0x00, 0xeb, 0xe5, 0x0c, 0x00, 0xf0, 0xe5, 0x0c, 0x00, 0xf7, 0xe5, + 0x0c, 0x00, 0xfd, 0xe5, 0x0c, 0x00, 0xfe, 0xe5, 0x0c, 0x00, 0xff, 0xe5, + 0x0c, 0x00, 0xb1, 0xe6, 0x0c, 0x00, 0xb8, 0xe6, 0x0c, 0x00, 0xf6, 0xe9, + 0x0c, 0x00, 0xf7, 0xe9, 0x0c, 0x00, 0xf8, 0xe9, 0x0c, 0x00, 0xfc, 0xe9, + 0x0c, 0x00, 0xfe, 0xe9, 0x0c, 0x00, 0xff, 0xe9, 0x0c, 0x00, 0xf0, 0xed, + 0x0c, 0x00, 0xf6, 0xed, 0x0c, 0x00, 0xf7, 0xed, 0x0c, 0x00, 0xfd, 0xed, + 0x0c, 0x00, 0xfe, 0xed, 0x0c, 0x00, 0xff, 0xed, 0x0c, 0x00, 0x08, 0xef, + 0x0c, 0x00, 0x0b, 0xef, 0x0c, 0x00, 0x90, 0xef, 0x0c, 0x00, 0x99, 0xef, + 0x0c, 0x00, 0x9d, 0xef, 0x0c, 0x00, 0xd0, 0xef, 0x0c, 0x00, 0xd9, 0xef, + 0x0c, 0x00, 0xdd, 0xef, 0x0c, 0x00, 0x86, 0xf0, 0x0c, 0x00, 0x87, 0xf0, + 0x0c, 0x00, 0x88, 0xf0, 0x0c, 0x00, 0x89, 0xf0, 0x0c, 0x00, 0x8b, 0xf0, + 0x0c, 0x00, 0xb0, 0xf0, 0x0c, 0x00, 0xb6, 0xf0, 0x0c, 0x00, 0xb7, 0xf0, + 0x0c, 0x00, 0xbd, 0xf0, 0x0c, 0x00, 0xbe, 0xf0, 0x0c, 0x00, 0xbf, 0xf0, + 0x0c, 0x00, 0xf0, 0xf1, 0x0c, 0x00, 0xf1, 0xf1, 0x0c, 0x00, 0xf9, 0xf1, + 0x0c, 0x00, 0xfd, 0xf1, 0x0c, 0x00, 0x78, 0xf2, 0x0c, 0x00, 0xab, 0xf2, + 0x0c, 0x00, 0x88, 0xf3, 0x0c, 0x00, 0x8b, 0xf3, 0x0c, 0x00, 0x91, 0xf3, + 0x0c, 0x00, 0x96, 0xf3, 0x0c, 0x00, 0x97, 0xf3, 0x0c, 0x00, 0x9d, 0xf3, + 0x0c, 0x00, 0x9e, 0xf3, 0x0c, 0x00, 0x9f, 0xf3, 0x0c, 0x00, 0x68, 0xf5, + 0x0c, 0x00, 0x6b, 0xf5, 0x0c, 0x00, 0x7e, 0xf5, 0x0c, 0x00, 0x7f, 0xf5, + 0x0c, 0x00, 0xf1, 0xf5, 0x0c, 0x00, 0xf8, 0xf5, 0x0c, 0x00, 0x87, 0xf6, + 0x0c, 0x00, 0x8b, 0xf6, 0x0c, 0x00, 0xb0, 0xf6, 0x0c, 0x00, 0xb7, 0xf6, + 0x0c, 0x00, 0xbd, 0xf6, 0x0c, 0x00, 0xbe, 0xf6, 0x0c, 0x00, 0xbf, 0xf6, + 0x0c, 0x00, 0x86, 0xf7, 0x0c, 0x00, 0x87, 0xf7, 0x0c, 0x00, 0x88, 0xf7, + 0x0c, 0x00, 0x89, 0xf7, 0x0c, 0x00, 0x8b, 0xf7, 0x0c, 0x00, 0xc7, 0xf9, + 0x0c, 0x00, 0xcb, 0xf9, 0x0c, 0x00, 0xe7, 0xf9, 0x0c, 0x00, 0xeb, 0xf9, + 0x0c, 0x00, 0xf7, 0xf9, 0x0c, 0x00, 0xf8, 0xf9, 0x0c, 0x00, 0xfc, 0xf9, + 0x0c, 0x00, 0xfe, 0xf9, 0x0c, 0x00, 0xff, 0xf9, 0x0c, 0x00, 0xc7, 0xfd, + 0x0c, 0x00, 0xcb, 0xfd, 0x0c, 0x00, 0xe7, 0xfd, 0x0c, 0x00, 0xeb, 0xfd, + 0x0c, 0x00, 0xf0, 0xfd, 0x0c, 0x00, 0xf7, 0xfd, 0x0c, 0x00, 0xfd, 0xfd, + 0x0c, 0x00, 0xfe, 0xfd, 0x0c, 0x00, 0xff, 0xfd, 0x0c, 0x00, 0x91, 0xff, + 0x0c, 0x00, 0x96, 0xff, 0x0c, 0x00, 0x97, 0xff, 0x0c, 0x00, 0x98, 0xff, + 0x0c, 0x00, 0x9c, 0xff, 0x0c, 0x00, 0x9e, 0xff, 0x0c, 0x00, 0x9f, 0xff, + 0x0c, 0x00, 0xd1, 0xff, 0x0c, 0x00, 0xd6, 0xff, 0x0c, 0x00, 0xd7, 0xff, + 0x0c, 0x00, 0xd8, 0xff, 0x0c, 0x00, 0xdc, 0xff, 0x0c, 0x00, 0xde, 0xff, + 0x0c, 0x00, 0xdf, 0xff, 0x0c, 0x00, 0x8e, 0x00, 0x0d, 0x00, 0x8f, 0x00, + 0x0d, 0x00, 0xbe, 0x00, 0x0d, 0x00, 0xbf, 0x00, 0x0d, 0x00, 0x8e, 0x01, + 0x0d, 0x00, 0x8f, 0x01, 0x0d, 0x00, 0x88, 0x04, 0x0d, 0x00, 0x8b, 0x04, + 0x0d, 0x00, 0xbe, 0x04, 0x0d, 0x00, 0xbf, 0x04, 0x0d, 0x00, 0xb8, 0x06, + 0x0d, 0x00, 0xc8, 0x07, 0x0d, 0x00, 0xe8, 0x07, 0x0d, 0x00, 0xf3, 0x07, + 0x0d, 0x00, 0xfb, 0x07, 0x0d, 0x00, 0xce, 0x09, 0x0d, 0x00, 0xcf, 0x09, + 0x0d, 0x00, 0xee, 0x09, 0x0d, 0x00, 0xef, 0x09, 0x0d, 0x00, 0xf8, 0x09, + 0x0d, 0x00, 0xfc, 0x09, 0x0d, 0x00, 0xfe, 0x09, 0x0d, 0x00, 0xff, 0x09, + 0x0d, 0x00, 0x88, 0x0b, 0x0d, 0x00, 0xe8, 0x0b, 0x0d, 0x00, 0xf3, 0x0b, + 0x0d, 0x00, 0xfb, 0x0b, 0x0d, 0x00, 0xce, 0x0d, 0x0d, 0x00, 0xcf, 0x0d, + 0x0d, 0x00, 0xee, 0x0d, 0x0d, 0x00, 0xef, 0x0d, 0x0d, 0x00, 0xf8, 0x0d, + 0x0d, 0x00, 0xfc, 0x0d, 0x0d, 0x00, 0xfe, 0x0d, 0x0d, 0x00, 0xff, 0x0d, + 0x0d, 0x00, 0x8e, 0x10, 0x0d, 0x00, 0x8f, 0x10, 0x0d, 0x00, 0xbe, 0x10, + 0x0d, 0x00, 0xbf, 0x10, 0x0d, 0x00, 0x8e, 0x11, 0x0d, 0x00, 0x8f, 0x11, + 0x0d, 0x00, 0xce, 0x15, 0x0d, 0x00, 0xcf, 0x15, 0x0d, 0x00, 0xee, 0x15, + 0x0d, 0x00, 0xef, 0x15, 0x0d, 0x00, 0xf8, 0x15, 0x0d, 0x00, 0x88, 0x17, + 0x0d, 0x00, 0x88, 0x18, 0x0d, 0x00, 0x8b, 0x18, 0x0d, 0x00, 0xbe, 0x18, + 0x0d, 0x00, 0xbf, 0x18, 0x0d, 0x00, 0xb8, 0x1a, 0x0d, 0x00, 0xce, 0x1f, + 0x0d, 0x00, 0xcf, 0x1f, 0x0d, 0x00, 0xee, 0x1f, 0x0d, 0x00, 0xef, 0x1f, + 0x0d, 0x00, 0xf3, 0x1f, 0x0d, 0x00, 0xfb, 0x1f, 0x0d, 0x00, 0xcb, 0x25, + 0x0d, 0x00, 0xeb, 0x25, 0x0d, 0x00, 0xe8, 0x33, 0x0d, 0x00, 0xe9, 0x33, + 0x0d, 0x00, 0xeb, 0x33, 0x0d, 0x00, 0xf0, 0x33, 0x0d, 0x00, 0xf1, 0x33, + 0x0d, 0x00, 0xf9, 0x33, 0x0d, 0x00, 0xfd, 0x33, 0x0d, 0x00, 0xcb, 0x39, + 0x0d, 0x00, 0xeb, 0x39, 0x0d, 0x00, 0xf0, 0x39, 0x0d, 0x00, 0xf1, 0x39, + 0x0d, 0x00, 0xf9, 0x39, 0x0d, 0x00, 0xfd, 0x39, 0x0d, 0x00, 0xbe, 0x3c, + 0x0d, 0x00, 0xbf, 0x3c, 0x0d, 0x00, 0xcb, 0x3d, 0x0d, 0x00, 0xeb, 0x3d, + 0x0d, 0x00, 0xf0, 0x3d, 0x0d, 0x00, 0xf1, 0x3d, 0x0d, 0x00, 0xf9, 0x3d, + 0x0d, 0x00, 0xfd, 0x3d, 0x0d, 0x00, 0xbe, 0x3e, 0x0d, 0x00, 0xbf, 0x3e, + 0x0d, 0x00, 0xf6, 0x41, 0x0d, 0x00, 0xf7, 0x41, 0x0d, 0x00, 0xf8, 0x41, + 0x0d, 0x00, 0xfc, 0x41, 0x0d, 0x00, 0xfe, 0x41, 0x0d, 0x00, 0xff, 0x41, + 0x0d, 0x00, 0x88, 0x43, 0x0d, 0x00, 0x8b, 0x43, 0x0d, 0x00, 0xe8, 0x43, + 0x0d, 0x00, 0xe9, 0x43, 0x0d, 0x00, 0xeb, 0x43, 0x0d, 0x00, 0xf0, 0x43, + 0x0d, 0x00, 0xf1, 0x43, 0x0d, 0x00, 0xf9, 0x43, 0x0d, 0x00, 0xfd, 0x43, + 0x0d, 0x00, 0xf0, 0x45, 0x0d, 0x00, 0xf1, 0x45, 0x0d, 0x00, 0xf9, 0x45, + 0x0d, 0x00, 0xfd, 0x45, 0x0d, 0x00, 0x86, 0x47, 0x0d, 0x00, 0x87, 0x47, + 0x0d, 0x00, 0x88, 0x47, 0x0d, 0x00, 0x89, 0x47, 0x0d, 0x00, 0x8b, 0x47, + 0x0d, 0x00, 0xc7, 0x49, 0x0d, 0x00, 0xcb, 0x49, 0x0d, 0x00, 0xe7, 0x49, + 0x0d, 0x00, 0xeb, 0x49, 0x0d, 0x00, 0xf7, 0x49, 0x0d, 0x00, 0xf8, 0x49, + 0x0d, 0x00, 0xfc, 0x49, 0x0d, 0x00, 0xfe, 0x49, 0x0d, 0x00, 0xff, 0x49, + 0x0d, 0x00, 0x86, 0x4b, 0x0d, 0x00, 0x87, 0x4b, 0x0d, 0x00, 0x88, 0x4b, + 0x0d, 0x00, 0x89, 0x4b, 0x0d, 0x00, 0x8b, 0x4b, 0x0d, 0x00, 0xf1, 0x4b, + 0x0d, 0x00, 0xf8, 0x4b, 0x0d, 0x00, 0xc7, 0x4d, 0x0d, 0x00, 0xcb, 0x4d, + 0x0d, 0x00, 0xe7, 0x4d, 0x0d, 0x00, 0xeb, 0x4d, 0x0d, 0x00, 0xf0, 0x4d, + 0x0d, 0x00, 0xf7, 0x4d, 0x0d, 0x00, 0xfd, 0x4d, 0x0d, 0x00, 0xfe, 0x4d, + 0x0d, 0x00, 0xff, 0x4d, 0x0d, 0x00, 0x88, 0x4f, 0x0d, 0x00, 0x8b, 0x4f, + 0x0d, 0x00, 0xb8, 0x52, 0x0d, 0x00, 0x88, 0x53, 0x0d, 0x00, 0x8b, 0x53, + 0x0d, 0x00, 0x88, 0x5f, 0x0d, 0x00, 0x8b, 0x5f, 0x0d, 0x00, 0xc8, 0x5f, + 0x0d, 0x00, 0xc9, 0x5f, 0x0d, 0x00, 0xcb, 0x5f, 0x0d, 0x00, 0xe8, 0x5f, + 0x0d, 0x00, 0xe9, 0x5f, 0x0d, 0x00, 0xeb, 0x5f, 0x0d, 0x00, 0xf0, 0x5f, + 0x0d, 0x00, 0xf1, 0x5f, 0x0d, 0x00, 0xf9, 0x5f, 0x0d, 0x00, 0xfd, 0x5f, + 0x0d, 0x00, 0xf3, 0x61, 0x0d, 0x00, 0xfb, 0x61, 0x0d, 0x00, 0xee, 0x63, + 0x0d, 0x00, 0xef, 0x63, 0x0d, 0x00, 0xf8, 0x63, 0x0d, 0x00, 0xce, 0x65, + 0x0d, 0x00, 0xcf, 0x65, 0x0d, 0x00, 0xee, 0x65, 0x0d, 0x00, 0xef, 0x65, + 0x0d, 0x00, 0xf8, 0x65, 0x0d, 0x00, 0x88, 0x67, 0x0d, 0x00, 0xf4, 0x69, + 0x0d, 0x00, 0xf5, 0x69, 0x0d, 0x00, 0xf8, 0x69, 0x0d, 0x00, 0xfc, 0x69, + 0x0d, 0x00, 0xfe, 0x69, 0x0d, 0x00, 0xff, 0x69, 0x0d, 0x00, 0x88, 0x6b, + 0x0d, 0x00, 0xe8, 0x6b, 0x0d, 0x00, 0xfe, 0x6b, 0x0d, 0x00, 0xff, 0x6b, + 0x0d, 0x00, 0xfe, 0x6d, 0x0d, 0x00, 0xff, 0x6d, 0x0d, 0x00, 0xf8, 0x71, + 0x0d, 0x00, 0xfc, 0x71, 0x0d, 0x00, 0xfe, 0x71, 0x0d, 0x00, 0xff, 0x71, + 0x0d, 0x00, 0xee, 0x73, 0x0d, 0x00, 0xef, 0x73, 0x0d, 0x00, 0xf8, 0x73, + 0x0d, 0x00, 0xce, 0x75, 0x0d, 0x00, 0xcf, 0x75, 0x0d, 0x00, 0xee, 0x75, + 0x0d, 0x00, 0xef, 0x75, 0x0d, 0x00, 0xf8, 0x75, 0x0d, 0x00, 0x88, 0x77, + 0x0d, 0x00, 0xce, 0x79, 0x0d, 0x00, 0xcf, 0x79, 0x0d, 0x00, 0xee, 0x79, + 0x0d, 0x00, 0xef, 0x79, 0x0d, 0x00, 0xf3, 0x79, 0x0d, 0x00, 0xfb, 0x79, + 0x0d, 0x00, 0x88, 0x7b, 0x0d, 0x00, 0xe8, 0x7b, 0x0d, 0x00, 0xfe, 0x7b, + 0x0d, 0x00, 0xff, 0x7b, 0x0d, 0x00, 0xce, 0x7d, 0x0d, 0x00, 0xcf, 0x7d, + 0x0d, 0x00, 0xee, 0x7d, 0x0d, 0x00, 0xef, 0x7d, 0x0d, 0x00, 0xf8, 0x7d, + 0x0d, 0x00, 0xcd, 0x85, 0x0d, 0x00, 0xe3, 0x85, 0x0d, 0x00, 0xed, 0x85, + 0x0d, 0x00, 0xf1, 0x85, 0x0d, 0x00, 0xf3, 0x85, 0x0d, 0x00, 0xf9, 0x85, + 0x0d, 0x00, 0xfb, 0x85, 0x0d, 0x00, 0xfd, 0x85, 0x0d, 0x00, 0x83, 0x87, + 0x0d, 0x00, 0x87, 0x87, 0x0d, 0x00, 0x8d, 0x87, 0x0d, 0x00, 0x87, 0x8a, + 0x0d, 0x00, 0xb3, 0x8a, 0x0d, 0x00, 0xb7, 0x8a, 0x0d, 0x00, 0xbb, 0x8a, + 0x0d, 0x00, 0xe3, 0x9f, 0x0d, 0x00, 0xf3, 0x9f, 0x0d, 0x00, 0xfb, 0x9f, + 0x0d, 0x00, 0xf8, 0xa7, 0x0d, 0x00, 0xfc, 0xa7, 0x0d, 0x00, 0xfe, 0xa7, + 0x0d, 0x00, 0xff, 0xa7, 0x0d, 0x00, 0x8b, 0xab, 0x0d, 0x00, 0xeb, 0xab, + 0x0d, 0x00, 0xbf, 0xb2, 0x0d, 0x00, 0xb8, 0xb8, 0x0d, 0x00, 0xbc, 0xb8, + 0x0d, 0x00, 0xbe, 0xb8, 0x0d, 0x00, 0xbf, 0xb8, 0x0d, 0x00, 0x8b, 0xb9, + 0x0d, 0x00, 0xb7, 0xba, 0x0d, 0x00, 0xb8, 0xbc, 0x0d, 0x00, 0xbc, 0xbc, + 0x0d, 0x00, 0xbe, 0xbc, 0x0d, 0x00, 0xbf, 0xbc, 0x0d, 0x00, 0xbf, 0xbe, + 0x0d, 0x00, 0xc7, 0xbf, 0x0d, 0x00, 0xcb, 0xbf, 0x0d, 0x00, 0xe7, 0xbf, + 0x0d, 0x00, 0xeb, 0xbf, 0x0d, 0x00, 0xf0, 0xbf, 0x0d, 0x00, 0xf1, 0xbf, + 0x0d, 0x00, 0xf7, 0xbf, 0x0d, 0x00, 0xf9, 0xbf, 0x0d, 0x00, 0xfd, 0xbf, + 0x0d, 0x00, 0xe3, 0xdf, 0x0d, 0x00, 0xf3, 0xdf, 0x0d, 0x00, 0xfb, 0xdf, + 0x0d, 0x00, 0x84, 0xe5, 0x0d, 0x00, 0x8b, 0xe5, 0x0d, 0x00, 0x8f, 0xe5, + 0x0d, 0x00, 0xcb, 0xe5, 0x0d, 0x00, 0xcf, 0xe5, 0x0d, 0x00, 0xeb, 0xe5, + 0x0d, 0x00, 0xef, 0xe5, 0x0d, 0x00, 0xff, 0xe5, 0x0d, 0x00, 0xe1, 0xf3, + 0x0d, 0x00, 0xe2, 0xf3, 0x0d, 0x00, 0xed, 0xf3, 0x0d, 0x00, 0xee, 0xf3, + 0x0d, 0x00, 0xef, 0xf3, 0x0d, 0x00, 0xf2, 0xf3, 0x0d, 0x00, 0xf8, 0xf3, + 0x0d, 0x00, 0xfa, 0xf3, 0x0d, 0x00, 0xfc, 0xf3, 0x0d, 0x00, 0xfe, 0xf3, + 0x0d, 0x00, 0xff, 0xf3, 0x0d, 0x00, 0xcf, 0xf9, 0x0d, 0x00, 0xef, 0xf9, + 0x0d, 0x00, 0xff, 0xf9, 0x0d, 0x00, 0xb3, 0xfc, 0x0d, 0x00, 0xbb, 0xfc, + 0x0d, 0x00, 0xcb, 0xfd, 0x0d, 0x00, 0xcf, 0xfd, 0x0d, 0x00, 0xeb, 0xfd, + 0x0d, 0x00, 0xef, 0xfd, 0x0d, 0x00, 0xff, 0xfd, 0x0d, 0x00, 0xb3, 0xfe, + 0x0d, 0x00, 0xbb, 0xfe, 0x0d, 0x00, 0x68, 0x00, 0x0e, 0x00, 0x6b, 0x00, + 0x0e, 0x00, 0x78, 0x00, 0x0e, 0x00, 0x7c, 0x00, 0x0e, 0x00, 0x7e, 0x00, + 0x0e, 0x00, 0x7f, 0x00, 0x0e, 0x00, 0x88, 0x00, 0x0e, 0x00, 0x8b, 0x00, + 0x0e, 0x00, 0x88, 0x01, 0x0e, 0x00, 0x8b, 0x01, 0x0e, 0x00, 0xd8, 0x01, + 0x0e, 0x00, 0xdc, 0x01, 0x0e, 0x00, 0xde, 0x01, 0x0e, 0x00, 0xdf, 0x01, + 0x0e, 0x00, 0xe8, 0x01, 0x0e, 0x00, 0xeb, 0x01, 0x0e, 0x00, 0xf8, 0x01, + 0x0e, 0x00, 0xfc, 0x01, 0x0e, 0x00, 0xfe, 0x01, 0x0e, 0x00, 0xff, 0x01, + 0x0e, 0x00, 0x98, 0x02, 0x0e, 0x00, 0x9c, 0x02, 0x0e, 0x00, 0x9e, 0x02, + 0x0e, 0x00, 0x9f, 0x02, 0x0e, 0x00, 0xd8, 0x03, 0x0e, 0x00, 0xdc, 0x03, + 0x0e, 0x00, 0xde, 0x03, 0x0e, 0x00, 0xdf, 0x03, 0x0e, 0x00, 0xe8, 0x03, + 0x0e, 0x00, 0xeb, 0x03, 0x0e, 0x00, 0xf8, 0x03, 0x0e, 0x00, 0xfc, 0x03, + 0x0e, 0x00, 0xfe, 0x03, 0x0e, 0x00, 0xff, 0x03, 0x0e, 0x00, 0x98, 0x05, + 0x0e, 0x00, 0x9c, 0x05, 0x0e, 0x00, 0x9e, 0x05, 0x0e, 0x00, 0x9f, 0x05, + 0x0e, 0x00, 0xb8, 0x06, 0x0e, 0x00, 0xbc, 0x06, 0x0e, 0x00, 0xbe, 0x06, + 0x0e, 0x00, 0xbf, 0x06, 0x0e, 0x00, 0x98, 0x07, 0x0e, 0x00, 0x9c, 0x07, + 0x0e, 0x00, 0x9e, 0x07, 0x0e, 0x00, 0x9f, 0x07, 0x0e, 0x00, 0x98, 0x08, + 0x0e, 0x00, 0x9c, 0x08, 0x0e, 0x00, 0x9e, 0x08, 0x0e, 0x00, 0x9f, 0x08, + 0x0e, 0x00, 0xdf, 0x0d, 0x0e, 0x00, 0xeb, 0x0d, 0x0e, 0x00, 0xf8, 0x0d, + 0x0e, 0x00, 0xfc, 0x0d, 0x0e, 0x00, 0xfe, 0x0d, 0x0e, 0x00, 0xff, 0x0d, + 0x0e, 0x00, 0x68, 0x10, 0x0e, 0x00, 0x6b, 0x10, 0x0e, 0x00, 0x88, 0x10, + 0x0e, 0x00, 0x8b, 0x10, 0x0e, 0x00, 0xbe, 0x10, 0x0e, 0x00, 0xbf, 0x10, + 0x0e, 0x00, 0xc8, 0x11, 0x0e, 0x00, 0xcb, 0x11, 0x0e, 0x00, 0xe8, 0x11, + 0x0e, 0x00, 0xeb, 0x11, 0x0e, 0x00, 0xf8, 0x11, 0x0e, 0x00, 0xfc, 0x11, + 0x0e, 0x00, 0xfe, 0x11, 0x0e, 0x00, 0xff, 0x11, 0x0e, 0x00, 0xd8, 0x13, + 0x0e, 0x00, 0xdc, 0x13, 0x0e, 0x00, 0xde, 0x13, 0x0e, 0x00, 0xdf, 0x13, + 0x0e, 0x00, 0xf8, 0x13, 0x0e, 0x00, 0xfc, 0x13, 0x0e, 0x00, 0xfe, 0x13, + 0x0e, 0x00, 0xff, 0x13, 0x0e, 0x00, 0xcb, 0x15, 0x0e, 0x00, 0xeb, 0x15, + 0x0e, 0x00, 0x08, 0x17, 0x0e, 0x00, 0x0b, 0x17, 0x0e, 0x00, 0x78, 0x18, + 0x0e, 0x00, 0x7c, 0x18, 0x0e, 0x00, 0x7e, 0x18, 0x0e, 0x00, 0x7f, 0x18, + 0x0e, 0x00, 0xb8, 0x18, 0x0e, 0x00, 0x68, 0x1a, 0x0e, 0x00, 0x6b, 0x1a, + 0x0e, 0x00, 0x98, 0x1b, 0x0e, 0x00, 0x9c, 0x1b, 0x0e, 0x00, 0x9e, 0x1b, + 0x0e, 0x00, 0x9f, 0x1b, 0x0e, 0x00, 0xc8, 0x1f, 0x0e, 0x00, 0xcb, 0x1f, + 0x0e, 0x00, 0xe8, 0x1f, 0x0e, 0x00, 0xeb, 0x1f, 0x0e, 0x00, 0xf8, 0x1f, + 0x0e, 0x00, 0xfc, 0x1f, 0x0e, 0x00, 0xfe, 0x1f, 0x0e, 0x00, 0xff, 0x1f, + 0x0e, 0x00, 0x98, 0x22, 0x0e, 0x00, 0x9c, 0x22, 0x0e, 0x00, 0x9e, 0x22, + 0x0e, 0x00, 0x9f, 0x22, 0x0e, 0x00, 0xd8, 0x23, 0x0e, 0x00, 0xdc, 0x23, + 0x0e, 0x00, 0xde, 0x23, 0x0e, 0x00, 0xdf, 0x23, 0x0e, 0x00, 0xe8, 0x23, + 0x0e, 0x00, 0xeb, 0x23, 0x0e, 0x00, 0xf8, 0x23, 0x0e, 0x00, 0xfc, 0x23, + 0x0e, 0x00, 0xfe, 0x23, 0x0e, 0x00, 0xff, 0x23, 0x0e, 0x00, 0xb8, 0x26, + 0x0e, 0x00, 0xbc, 0x26, 0x0e, 0x00, 0xbe, 0x26, 0x0e, 0x00, 0xbf, 0x26, + 0x0e, 0x00, 0xb8, 0x28, 0x0e, 0x00, 0x98, 0x29, 0x0e, 0x00, 0x9c, 0x29, + 0x0e, 0x00, 0x9e, 0x29, 0x0e, 0x00, 0x9f, 0x29, 0x0e, 0x00, 0xd8, 0x29, + 0x0e, 0x00, 0xdc, 0x29, 0x0e, 0x00, 0xde, 0x29, 0x0e, 0x00, 0xdf, 0x29, + 0x0e, 0x00, 0xe8, 0x2b, 0x0e, 0x00, 0xeb, 0x2b, 0x0e, 0x00, 0x98, 0x2d, + 0x0e, 0x00, 0x9c, 0x2d, 0x0e, 0x00, 0x9e, 0x2d, 0x0e, 0x00, 0x9f, 0x2d, + 0x0e, 0x00, 0xd8, 0x2d, 0x0e, 0x00, 0xdc, 0x2d, 0x0e, 0x00, 0xde, 0x2d, + 0x0e, 0x00, 0xdf, 0x2d, 0x0e, 0x00, 0x98, 0x2e, 0x0e, 0x00, 0x9c, 0x2e, + 0x0e, 0x00, 0x9e, 0x2e, 0x0e, 0x00, 0x9f, 0x2e, 0x0e, 0x00, 0x86, 0x30, + 0x0e, 0x00, 0x87, 0x30, 0x0e, 0x00, 0x89, 0x30, 0x0e, 0x00, 0x8a, 0x30, + 0x0e, 0x00, 0xb6, 0x30, 0x0e, 0x00, 0xb7, 0x30, 0x0e, 0x00, 0xb8, 0x30, + 0x0e, 0x00, 0xbc, 0x30, 0x0e, 0x00, 0xbe, 0x30, 0x0e, 0x00, 0xbf, 0x30, + 0x0e, 0x00, 0x8b, 0x31, 0x0e, 0x00, 0xf0, 0x31, 0x0e, 0x00, 0xf1, 0x31, + 0x0e, 0x00, 0xf9, 0x31, 0x0e, 0x00, 0xfd, 0x31, 0x0e, 0x00, 0x68, 0x32, + 0x0e, 0x00, 0x6b, 0x32, 0x0e, 0x00, 0x78, 0x32, 0x0e, 0x00, 0x7c, 0x32, + 0x0e, 0x00, 0x7e, 0x32, 0x0e, 0x00, 0x7f, 0x32, 0x0e, 0x00, 0x90, 0x33, + 0x0e, 0x00, 0x91, 0x33, 0x0e, 0x00, 0x96, 0x33, 0x0e, 0x00, 0x97, 0x33, + 0x0e, 0x00, 0x99, 0x33, 0x0e, 0x00, 0x9d, 0x33, 0x0e, 0x00, 0x1f, 0x35, + 0x0e, 0x00, 0xdf, 0x35, 0x0e, 0x00, 0xe7, 0x35, 0x0e, 0x00, 0xeb, 0x35, + 0x0e, 0x00, 0xf7, 0x35, 0x0e, 0x00, 0xf8, 0x35, 0x0e, 0x00, 0xfc, 0x35, + 0x0e, 0x00, 0xfe, 0x35, 0x0e, 0x00, 0xff, 0x35, 0x0e, 0x00, 0x8b, 0x36, + 0x0e, 0x00, 0xb0, 0x36, 0x0e, 0x00, 0xb1, 0x36, 0x0e, 0x00, 0xb9, 0x36, + 0x0e, 0x00, 0xbd, 0x36, 0x0e, 0x00, 0x8b, 0x39, 0x0e, 0x00, 0xdf, 0x39, + 0x0e, 0x00, 0xe7, 0x39, 0x0e, 0x00, 0xeb, 0x39, 0x0e, 0x00, 0xf7, 0x39, + 0x0e, 0x00, 0xf8, 0x39, 0x0e, 0x00, 0xfc, 0x39, 0x0e, 0x00, 0xfe, 0x39, + 0x0e, 0x00, 0xff, 0x39, 0x0e, 0x00, 0xb7, 0x3a, 0x0e, 0x00, 0xb8, 0x3a, + 0x0e, 0x00, 0xbc, 0x3a, 0x0e, 0x00, 0xbe, 0x3a, 0x0e, 0x00, 0xbf, 0x3a, + 0x0e, 0x00, 0x88, 0x3b, 0x0e, 0x00, 0x8b, 0x3b, 0x0e, 0x00, 0xd0, 0x3d, + 0x0e, 0x00, 0xd1, 0x3d, 0x0e, 0x00, 0xd6, 0x3d, 0x0e, 0x00, 0xd7, 0x3d, + 0x0e, 0x00, 0xf0, 0x3d, 0x0e, 0x00, 0xf1, 0x3d, 0x0e, 0x00, 0xf9, 0x3d, + 0x0e, 0x00, 0xfd, 0x3d, 0x0e, 0x00, 0x88, 0x3f, 0x0e, 0x00, 0x8b, 0x3f, + 0x0e, 0x00, 0x98, 0x3f, 0x0e, 0x00, 0x9c, 0x3f, 0x0e, 0x00, 0x9e, 0x3f, + 0x0e, 0x00, 0x9f, 0x3f, 0x0e, 0x00, 0x70, 0x44, 0x0e, 0x00, 0x71, 0x44, + 0x0e, 0x00, 0x79, 0x44, 0x0e, 0x00, 0x7d, 0x44, 0x0e, 0x00, 0xb7, 0x44, + 0x0e, 0x00, 0xb8, 0x44, 0x0e, 0x00, 0xbc, 0x44, 0x0e, 0x00, 0xbe, 0x44, + 0x0e, 0x00, 0xbf, 0x44, 0x0e, 0x00, 0x77, 0x46, 0x0e, 0x00, 0x78, 0x46, + 0x0e, 0x00, 0x7c, 0x46, 0x0e, 0x00, 0x7e, 0x46, 0x0e, 0x00, 0x7f, 0x46, + 0x0e, 0x00, 0xb7, 0x46, 0x0e, 0x00, 0xb8, 0x46, 0x0e, 0x00, 0xbc, 0x46, + 0x0e, 0x00, 0xbe, 0x46, 0x0e, 0x00, 0xbf, 0x46, 0x0e, 0x00, 0x9f, 0x47, + 0x0e, 0x00, 0x67, 0x4a, 0x0e, 0x00, 0x70, 0x4a, 0x0e, 0x00, 0x71, 0x4a, + 0x0e, 0x00, 0x77, 0x4a, 0x0e, 0x00, 0x79, 0x4a, 0x0e, 0x00, 0x7d, 0x4a, + 0x0e, 0x00, 0xa7, 0x4a, 0x0e, 0x00, 0x91, 0x4b, 0x0e, 0x00, 0x96, 0x4b, + 0x0e, 0x00, 0x97, 0x4b, 0x0e, 0x00, 0x9f, 0x4b, 0x0e, 0x00, 0xdf, 0x53, + 0x0e, 0x00, 0xe7, 0x53, 0x0e, 0x00, 0xeb, 0x53, 0x0e, 0x00, 0xf7, 0x53, + 0x0e, 0x00, 0xf8, 0x53, 0x0e, 0x00, 0xfc, 0x53, 0x0e, 0x00, 0xfe, 0x53, + 0x0e, 0x00, 0xff, 0x53, 0x0e, 0x00, 0xb7, 0x58, 0x0e, 0x00, 0xb8, 0x58, + 0x0e, 0x00, 0xbc, 0x58, 0x0e, 0x00, 0xbe, 0x58, 0x0e, 0x00, 0xbf, 0x58, + 0x0e, 0x00, 0xe7, 0x5b, 0x0e, 0x00, 0xeb, 0x5b, 0x0e, 0x00, 0xf7, 0x5b, + 0x0e, 0x00, 0xf8, 0x5b, 0x0e, 0x00, 0xfc, 0x5b, 0x0e, 0x00, 0xfe, 0x5b, + 0x0e, 0x00, 0xff, 0x5b, 0x0e, 0x00, 0xb8, 0x5c, 0x0e, 0x00, 0xbc, 0x5c, + 0x0e, 0x00, 0xbe, 0x5c, 0x0e, 0x00, 0xbf, 0x5c, 0x0e, 0x00, 0x78, 0x5e, + 0x0e, 0x00, 0x7c, 0x5e, 0x0e, 0x00, 0x7e, 0x5e, 0x0e, 0x00, 0x7f, 0x5e, + 0x0e, 0x00, 0xb8, 0x5e, 0x0e, 0x00, 0xbc, 0x5e, 0x0e, 0x00, 0xbe, 0x5e, + 0x0e, 0x00, 0xbf, 0x5e, 0x0e, 0x00, 0xd0, 0x5f, 0x0e, 0x00, 0xd1, 0x5f, + 0x0e, 0x00, 0xd6, 0x5f, 0x0e, 0x00, 0xd7, 0x5f, 0x0e, 0x00, 0xf0, 0x5f, + 0x0e, 0x00, 0xf1, 0x5f, 0x0e, 0x00, 0xf9, 0x5f, 0x0e, 0x00, 0xfd, 0x5f, + 0x0e, 0x00, 0x63, 0x64, 0x0e, 0x00, 0x73, 0x64, 0x0e, 0x00, 0x7b, 0x64, + 0x0e, 0x00, 0xb3, 0x64, 0x0e, 0x00, 0xbb, 0x64, 0x0e, 0x00, 0x93, 0x65, + 0x0e, 0x00, 0x9b, 0x65, 0x0e, 0x00, 0xd3, 0x65, 0x0e, 0x00, 0xdb, 0x65, + 0x0e, 0x00, 0x63, 0x66, 0x0e, 0x00, 0x6b, 0x66, 0x0e, 0x00, 0x73, 0x66, + 0x0e, 0x00, 0x7b, 0x66, 0x0e, 0x00, 0xb3, 0x66, 0x0e, 0x00, 0xbb, 0x66, + 0x0e, 0x00, 0x6b, 0x67, 0x0e, 0x00, 0x83, 0x67, 0x0e, 0x00, 0x8e, 0x67, + 0x0e, 0x00, 0x8f, 0x67, 0x0e, 0x00, 0x9b, 0x67, 0x0e, 0x00, 0xdb, 0x67, + 0x0e, 0x00, 0x78, 0x6a, 0x0e, 0x00, 0x7c, 0x6a, 0x0e, 0x00, 0x7e, 0x6a, + 0x0e, 0x00, 0x7f, 0x6a, 0x0e, 0x00, 0x78, 0x6b, 0x0e, 0x00, 0x7c, 0x6b, + 0x0e, 0x00, 0x7e, 0x6b, 0x0e, 0x00, 0x7f, 0x6b, 0x0e, 0x00, 0xd5, 0x73, + 0x0e, 0x00, 0xee, 0x73, 0x0e, 0x00, 0xef, 0x73, 0x0e, 0x00, 0xf8, 0x73, + 0x0e, 0x00, 0xfc, 0x73, 0x0e, 0x00, 0xfe, 0x73, 0x0e, 0x00, 0xff, 0x73, + 0x0e, 0x00, 0x63, 0x78, 0x0e, 0x00, 0x73, 0x78, 0x0e, 0x00, 0x7b, 0x78, + 0x0e, 0x00, 0x8b, 0x78, 0x0e, 0x00, 0xb4, 0x78, 0x0e, 0x00, 0xb8, 0x78, + 0x0e, 0x00, 0x9b, 0x79, 0x0e, 0x00, 0xdb, 0x79, 0x0e, 0x00, 0x73, 0x7a, + 0x0e, 0x00, 0x7b, 0x7a, 0x0e, 0x00, 0xa3, 0x7a, 0x0e, 0x00, 0xaf, 0x7a, + 0x0e, 0x00, 0x95, 0x7b, 0x0e, 0x00, 0x93, 0x7d, 0x0e, 0x00, 0x9b, 0x7d, + 0x0e, 0x00, 0xd3, 0x7d, 0x0e, 0x00, 0xdb, 0x7d, 0x0e, 0x00, 0xce, 0x7f, + 0x0e, 0x00, 0xcf, 0x7f, 0x0e, 0x00, 0xee, 0x7f, 0x0e, 0x00, 0xef, 0x7f, + 0x0e, 0x00, 0xf8, 0x7f, 0x0e, 0x00, 0xfc, 0x7f, 0x0e, 0x00, 0xfe, 0x7f, + 0x0e, 0x00, 0xff, 0x7f, 0x0e, 0x00, 0x71, 0x80, 0x0e, 0x00, 0x73, 0x80, + 0x0e, 0x00, 0x79, 0x80, 0x0e, 0x00, 0x7b, 0x80, 0x0e, 0x00, 0x7d, 0x80, + 0x0e, 0x00, 0x87, 0x80, 0x0e, 0x00, 0xb1, 0x80, 0x0e, 0x00, 0xb8, 0x80, + 0x0e, 0x00, 0x0d, 0x81, 0x0e, 0x00, 0x0e, 0x81, 0x0e, 0x00, 0x0f, 0x81, + 0x0e, 0x00, 0x8d, 0x81, 0x0e, 0x00, 0x8e, 0x81, 0x0e, 0x00, 0x8f, 0x81, + 0x0e, 0x00, 0xd6, 0x81, 0x0e, 0x00, 0xf1, 0x81, 0x0e, 0x00, 0xf3, 0x81, + 0x0e, 0x00, 0xf9, 0x81, 0x0e, 0x00, 0xfb, 0x81, 0x0e, 0x00, 0xfd, 0x81, + 0x0e, 0x00, 0x96, 0x82, 0x0e, 0x00, 0x8e, 0x83, 0x0e, 0x00, 0x8f, 0x83, + 0x0e, 0x00, 0xd0, 0x83, 0x0e, 0x00, 0xdf, 0x83, 0x0e, 0x00, 0xe1, 0x83, + 0x0e, 0x00, 0xe2, 0x83, 0x0e, 0x00, 0xe7, 0x83, 0x0e, 0x00, 0xed, 0x83, + 0x0e, 0x00, 0xee, 0x83, 0x0e, 0x00, 0xef, 0x83, 0x0e, 0x00, 0xf2, 0x83, + 0x0e, 0x00, 0xf7, 0x83, 0x0e, 0x00, 0xf8, 0x83, 0x0e, 0x00, 0xfa, 0x83, + 0x0e, 0x00, 0xfc, 0x83, 0x0e, 0x00, 0xfe, 0x83, 0x0e, 0x00, 0xff, 0x83, + 0x0e, 0x00, 0x71, 0x84, 0x0e, 0x00, 0x73, 0x84, 0x0e, 0x00, 0x79, 0x84, + 0x0e, 0x00, 0x7b, 0x84, 0x0e, 0x00, 0x7d, 0x84, 0x0e, 0x00, 0xb1, 0x84, + 0x0e, 0x00, 0xb8, 0x84, 0x0e, 0x00, 0x1f, 0x85, 0x0e, 0x00, 0x6b, 0x85, + 0x0e, 0x00, 0x90, 0x85, 0x0e, 0x00, 0x9f, 0x85, 0x0e, 0x00, 0x71, 0x86, + 0x0e, 0x00, 0x73, 0x86, 0x0e, 0x00, 0x79, 0x86, 0x0e, 0x00, 0x7b, 0x86, + 0x0e, 0x00, 0x7d, 0x86, 0x0e, 0x00, 0xb1, 0x86, 0x0e, 0x00, 0xb8, 0x86, + 0x0e, 0x00, 0x07, 0x87, 0x0e, 0x00, 0x0b, 0x87, 0x0e, 0x00, 0x6b, 0x87, + 0x0e, 0x00, 0x70, 0x87, 0x0e, 0x00, 0x71, 0x87, 0x0e, 0x00, 0x79, 0x87, + 0x0e, 0x00, 0x7d, 0x87, 0x0e, 0x00, 0x96, 0x87, 0x0e, 0x00, 0x96, 0x88, + 0x0e, 0x00, 0x9f, 0x88, 0x0e, 0x00, 0x03, 0x89, 0x0e, 0x00, 0x83, 0x89, + 0x0e, 0x00, 0xd7, 0x89, 0x0e, 0x00, 0xdf, 0x89, 0x0e, 0x00, 0xe3, 0x89, + 0x0e, 0x00, 0xe7, 0x89, 0x0e, 0x00, 0xf3, 0x89, 0x0e, 0x00, 0xf7, 0x89, + 0x0e, 0x00, 0xfb, 0x89, 0x0e, 0x00, 0x11, 0x8b, 0x0e, 0x00, 0x16, 0x8b, + 0x0e, 0x00, 0x17, 0x8b, 0x0e, 0x00, 0x1f, 0x8b, 0x0e, 0x00, 0xd0, 0x8b, + 0x0e, 0x00, 0xe1, 0x8b, 0x0e, 0x00, 0xe2, 0x8b, 0x0e, 0x00, 0xed, 0x8b, + 0x0e, 0x00, 0xee, 0x8b, 0x0e, 0x00, 0xef, 0x8b, 0x0e, 0x00, 0xf2, 0x8b, + 0x0e, 0x00, 0xf8, 0x8b, 0x0e, 0x00, 0xfa, 0x8b, 0x0e, 0x00, 0xfc, 0x8b, + 0x0e, 0x00, 0xfe, 0x8b, 0x0e, 0x00, 0xff, 0x8b, 0x0e, 0x00, 0x6b, 0x8c, + 0x0e, 0x00, 0x6f, 0x8c, 0x0e, 0x00, 0x7f, 0x8c, 0x0e, 0x00, 0x84, 0x8c, + 0x0e, 0x00, 0x8e, 0x8c, 0x0e, 0x00, 0x8f, 0x8c, 0x0e, 0x00, 0xbe, 0x8c, + 0x0e, 0x00, 0xbf, 0x8c, 0x0e, 0x00, 0x03, 0x8d, 0x0e, 0x00, 0x83, 0x8d, + 0x0e, 0x00, 0xd7, 0x8d, 0x0e, 0x00, 0xdf, 0x8d, 0x0e, 0x00, 0xe3, 0x8d, + 0x0e, 0x00, 0xe7, 0x8d, 0x0e, 0x00, 0xf3, 0x8d, 0x0e, 0x00, 0xf7, 0x8d, + 0x0e, 0x00, 0xfb, 0x8d, 0x0e, 0x00, 0x6e, 0x8e, 0x0e, 0x00, 0x6f, 0x8e, + 0x0e, 0x00, 0x78, 0x8e, 0x0e, 0x00, 0x7c, 0x8e, 0x0e, 0x00, 0x7e, 0x8e, + 0x0e, 0x00, 0x7f, 0x8e, 0x0e, 0x00, 0x84, 0x8e, 0x0e, 0x00, 0x8b, 0x8e, + 0x0e, 0x00, 0x8f, 0x8e, 0x0e, 0x00, 0xb3, 0x8e, 0x0e, 0x00, 0xbb, 0x8e, + 0x0e, 0x00, 0xbf, 0x8e, 0x0e, 0x00, 0x73, 0x8f, 0x0e, 0x00, 0x7b, 0x8f, + 0x0e, 0x00, 0x96, 0x8f, 0x0e, 0x00, 0x9f, 0x8f, 0x0e, 0x00, 0x84, 0x91, + 0x0e, 0x00, 0xd5, 0x93, 0x0e, 0x00, 0xee, 0x93, 0x0e, 0x00, 0xef, 0x93, + 0x0e, 0x00, 0xf8, 0x93, 0x0e, 0x00, 0xc3, 0x95, 0x0e, 0x00, 0xe3, 0x95, + 0x0e, 0x00, 0xf3, 0x95, 0x0e, 0x00, 0xfb, 0x95, 0x0e, 0x00, 0xff, 0x95, + 0x0e, 0x00, 0x83, 0x96, 0x0e, 0x00, 0xb4, 0x96, 0x0e, 0x00, 0x84, 0x97, + 0x0e, 0x00, 0x8e, 0x97, 0x0e, 0x00, 0x8f, 0x97, 0x0e, 0x00, 0x8b, 0x98, + 0x0e, 0x00, 0xb4, 0x98, 0x0e, 0x00, 0xbe, 0x98, 0x0e, 0x00, 0xbf, 0x98, + 0x0e, 0x00, 0x95, 0x99, 0x0e, 0x00, 0xd5, 0x99, 0x0e, 0x00, 0x8b, 0x9a, + 0x0e, 0x00, 0xb4, 0x9a, 0x0e, 0x00, 0xbe, 0x9a, 0x0e, 0x00, 0xbf, 0x9a, + 0x0e, 0x00, 0xe4, 0x9b, 0x0e, 0x00, 0xf4, 0x9b, 0x0e, 0x00, 0xfe, 0x9b, + 0x0e, 0x00, 0xff, 0x9b, 0x0e, 0x00, 0x95, 0x9d, 0x0e, 0x00, 0xd5, 0x9d, + 0x0e, 0x00, 0xce, 0x9f, 0x0e, 0x00, 0xcf, 0x9f, 0x0e, 0x00, 0xee, 0x9f, + 0x0e, 0x00, 0xef, 0x9f, 0x0e, 0x00, 0xf3, 0x9f, 0x0e, 0x00, 0xfb, 0x9f, + 0x0e, 0x00, 0x6b, 0xa4, 0x0e, 0x00, 0x6f, 0xa4, 0x0e, 0x00, 0x7f, 0xa4, + 0x0e, 0x00, 0xbe, 0xa4, 0x0e, 0x00, 0xbf, 0xa4, 0x0e, 0x00, 0x94, 0xa5, + 0x0e, 0x00, 0x9f, 0xa5, 0x0e, 0x00, 0x6e, 0xa6, 0x0e, 0x00, 0x6f, 0xa6, + 0x0e, 0x00, 0x78, 0xa6, 0x0e, 0x00, 0x7c, 0xa6, 0x0e, 0x00, 0x7e, 0xa6, + 0x0e, 0x00, 0x7f, 0xa6, 0x0e, 0x00, 0xb3, 0xa6, 0x0e, 0x00, 0xbb, 0xa6, + 0x0e, 0x00, 0xbf, 0xa6, 0x0e, 0x00, 0x0b, 0xa7, 0x0e, 0x00, 0x6b, 0xa7, + 0x0e, 0x00, 0x78, 0xa7, 0x0e, 0x00, 0x7c, 0xa7, 0x0e, 0x00, 0x7e, 0xa7, + 0x0e, 0x00, 0x7f, 0xa7, 0x0e, 0x00, 0x9f, 0xa7, 0x0e, 0x00, 0xb8, 0xaa, + 0x0e, 0x00, 0x8e, 0xab, 0x0e, 0x00, 0x8f, 0xab, 0x0e, 0x00, 0xd5, 0xab, + 0x0e, 0x00, 0xee, 0xab, 0x0e, 0x00, 0xef, 0xab, 0x0e, 0x00, 0xf8, 0xab, + 0x0e, 0x00, 0x97, 0xb2, 0x0e, 0x00, 0x9f, 0xb2, 0x0e, 0x00, 0x1f, 0xb3, + 0x0e, 0x00, 0xd6, 0xb3, 0x0e, 0x00, 0xdf, 0xb3, 0x0e, 0x00, 0xe7, 0xb3, + 0x0e, 0x00, 0xf1, 0xb3, 0x0e, 0x00, 0xf3, 0xb3, 0x0e, 0x00, 0xf7, 0xb3, + 0x0e, 0x00, 0xf9, 0xb3, 0x0e, 0x00, 0xfb, 0xb3, 0x0e, 0x00, 0xfd, 0xb3, + 0x0e, 0x00, 0x6b, 0xb8, 0x0e, 0x00, 0x6f, 0xb8, 0x0e, 0x00, 0x7f, 0xb8, + 0x0e, 0x00, 0xb0, 0xb8, 0x0e, 0x00, 0xbe, 0xb8, 0x0e, 0x00, 0x1f, 0xb9, + 0x0e, 0x00, 0x6b, 0xb9, 0x0e, 0x00, 0x78, 0xb9, 0x0e, 0x00, 0x7c, 0xb9, + 0x0e, 0x00, 0x7e, 0xb9, 0x0e, 0x00, 0x7f, 0xb9, 0x0e, 0x00, 0x97, 0xb9, + 0x0e, 0x00, 0x9f, 0xb9, 0x0e, 0x00, 0x61, 0xba, 0x0e, 0x00, 0x62, 0xba, + 0x0e, 0x00, 0x6d, 0xba, 0x0e, 0x00, 0x6e, 0xba, 0x0e, 0x00, 0x6f, 0xba, + 0x0e, 0x00, 0x72, 0xba, 0x0e, 0x00, 0x78, 0xba, 0x0e, 0x00, 0x7a, 0xba, + 0x0e, 0x00, 0x7c, 0xba, 0x0e, 0x00, 0x7e, 0xba, 0x0e, 0x00, 0x7f, 0xba, + 0x0e, 0x00, 0xb3, 0xba, 0x0e, 0x00, 0xbb, 0xba, 0x0e, 0x00, 0xbf, 0xba, + 0x0e, 0x00, 0x07, 0xbb, 0x0e, 0x00, 0x0b, 0xbb, 0x0e, 0x00, 0x6b, 0xbb, + 0x0e, 0x00, 0x78, 0xbb, 0x0e, 0x00, 0x7c, 0xbb, 0x0e, 0x00, 0x7e, 0xbb, + 0x0e, 0x00, 0x7f, 0xbb, 0x0e, 0x00, 0x90, 0xbb, 0x0e, 0x00, 0x91, 0xbc, + 0x0e, 0x00, 0x96, 0xbc, 0x0e, 0x00, 0x97, 0xbc, 0x0e, 0x00, 0x9f, 0xbc, + 0x0e, 0x00, 0x1f, 0xbd, 0x0e, 0x00, 0x6b, 0xbd, 0x0e, 0x00, 0x78, 0xbd, + 0x0e, 0x00, 0x7c, 0xbd, 0x0e, 0x00, 0x7e, 0xbd, 0x0e, 0x00, 0x7f, 0xbd, + 0x0e, 0x00, 0x97, 0xbd, 0x0e, 0x00, 0x9f, 0xbd, 0x0e, 0x00, 0x97, 0xbe, + 0x0e, 0x00, 0x9f, 0xbe, 0x0e, 0x00, 0x1f, 0xbf, 0x0e, 0x00, 0xd6, 0xbf, + 0x0e, 0x00, 0xdf, 0xbf, 0x0e, 0x00, 0xe7, 0xbf, 0x0e, 0x00, 0xf1, 0xbf, + 0x0e, 0x00, 0xf3, 0xbf, 0x0e, 0x00, 0xf7, 0xbf, 0x0e, 0x00, 0xf9, 0xbf, + 0x0e, 0x00, 0xfb, 0xbf, 0x0e, 0x00, 0xfd, 0xbf, 0x0e, 0x00, 0x91, 0xc2, + 0x0e, 0x00, 0x96, 0xc2, 0x0e, 0x00, 0x97, 0xc2, 0x0e, 0x00, 0x99, 0xc2, + 0x0e, 0x00, 0x9d, 0xc2, 0x0e, 0x00, 0x08, 0xc3, 0x0e, 0x00, 0x0b, 0xc3, + 0x0e, 0x00, 0x68, 0xc3, 0x0e, 0x00, 0x6b, 0xc3, 0x0e, 0x00, 0xd0, 0xc3, + 0x0e, 0x00, 0xd8, 0xc3, 0x0e, 0x00, 0xdc, 0xc3, 0x0e, 0x00, 0xde, 0xc3, + 0x0e, 0x00, 0xdf, 0xc3, 0x0e, 0x00, 0xe6, 0xc3, 0x0e, 0x00, 0xe7, 0xc3, + 0x0e, 0x00, 0xf6, 0xc3, 0x0e, 0x00, 0xf7, 0xc3, 0x0e, 0x00, 0xf8, 0xc3, + 0x0e, 0x00, 0xfc, 0xc3, 0x0e, 0x00, 0xfe, 0xc3, 0x0e, 0x00, 0xff, 0xc3, + 0x0e, 0x00, 0xb1, 0xc4, 0x0e, 0x00, 0xb8, 0xc4, 0x0e, 0x00, 0x90, 0xc5, + 0x0e, 0x00, 0x98, 0xc5, 0x0e, 0x00, 0x9c, 0xc5, 0x0e, 0x00, 0x9e, 0xc5, + 0x0e, 0x00, 0x9f, 0xc5, 0x0e, 0x00, 0xe8, 0xc7, 0x0e, 0x00, 0xe9, 0xc7, + 0x0e, 0x00, 0xeb, 0xc7, 0x0e, 0x00, 0xf0, 0xc7, 0x0e, 0x00, 0xf1, 0xc7, + 0x0e, 0x00, 0xf9, 0xc7, 0x0e, 0x00, 0xfd, 0xc7, 0x0e, 0x00, 0x0b, 0xc9, + 0x0e, 0x00, 0xf0, 0xc9, 0x0e, 0x00, 0xf1, 0xc9, 0x0e, 0x00, 0xf9, 0xc9, + 0x0e, 0x00, 0xfd, 0xc9, 0x0e, 0x00, 0x0b, 0xcd, 0x0e, 0x00, 0xf1, 0xcd, + 0x0e, 0x00, 0xf8, 0xcd, 0x0e, 0x00, 0x08, 0xcf, 0x0e, 0x00, 0x0b, 0xcf, + 0x0e, 0x00, 0x90, 0xcf, 0x0e, 0x00, 0x99, 0xcf, 0x0e, 0x00, 0x9d, 0xcf, + 0x0e, 0x00, 0xd0, 0xcf, 0x0e, 0x00, 0xd9, 0xcf, 0x0e, 0x00, 0xdd, 0xcf, + 0x0e, 0x00, 0xe8, 0xd3, 0x0e, 0x00, 0xeb, 0xd3, 0x0e, 0x00, 0xdf, 0xd5, + 0x0e, 0x00, 0xf8, 0xd5, 0x0e, 0x00, 0xfc, 0xd5, 0x0e, 0x00, 0xfe, 0xd5, + 0x0e, 0x00, 0xff, 0xd5, 0x0e, 0x00, 0x8b, 0xd6, 0x0e, 0x00, 0xbe, 0xd6, + 0x0e, 0x00, 0xbf, 0xd6, 0x0e, 0x00, 0xb8, 0xd8, 0x0e, 0x00, 0x98, 0xd9, + 0x0e, 0x00, 0x9c, 0xd9, 0x0e, 0x00, 0x9e, 0xd9, 0x0e, 0x00, 0x9f, 0xd9, + 0x0e, 0x00, 0xf8, 0xdb, 0x0e, 0x00, 0xfc, 0xdb, 0x0e, 0x00, 0xfe, 0xdb, + 0x0e, 0x00, 0xff, 0xdb, 0x0e, 0x00, 0x98, 0xdd, 0x0e, 0x00, 0x9c, 0xdd, + 0x0e, 0x00, 0x9e, 0xdd, 0x0e, 0x00, 0x9f, 0xdd, 0x0e, 0x00, 0xe8, 0xdf, + 0x0e, 0x00, 0xeb, 0xdf, 0x0e, 0x00, 0x88, 0xe2, 0x0e, 0x00, 0x8b, 0xe2, + 0x0e, 0x00, 0x91, 0xe2, 0x0e, 0x00, 0x96, 0xe2, 0x0e, 0x00, 0x97, 0xe2, + 0x0e, 0x00, 0x98, 0xe2, 0x0e, 0x00, 0x9c, 0xe2, 0x0e, 0x00, 0x9e, 0xe2, + 0x0e, 0x00, 0x9f, 0xe2, 0x0e, 0x00, 0xbe, 0xe2, 0x0e, 0x00, 0xbf, 0xe2, + 0x0e, 0x00, 0x08, 0xe3, 0x0e, 0x00, 0x0b, 0xe3, 0x0e, 0x00, 0x68, 0xe3, + 0x0e, 0x00, 0x6b, 0xe3, 0x0e, 0x00, 0x7e, 0xe3, 0x0e, 0x00, 0x7f, 0xe3, + 0x0e, 0x00, 0xd0, 0xe3, 0x0e, 0x00, 0xd8, 0xe3, 0x0e, 0x00, 0xf1, 0xe3, + 0x0e, 0x00, 0xf8, 0xe3, 0x0e, 0x00, 0x8b, 0xe5, 0x0e, 0x00, 0xc7, 0xe5, + 0x0e, 0x00, 0xcb, 0xe5, 0x0e, 0x00, 0xe7, 0xe5, 0x0e, 0x00, 0xeb, 0xe5, + 0x0e, 0x00, 0xf0, 0xe5, 0x0e, 0x00, 0xf7, 0xe5, 0x0e, 0x00, 0xfd, 0xe5, + 0x0e, 0x00, 0xfe, 0xe5, 0x0e, 0x00, 0xff, 0xe5, 0x0e, 0x00, 0xb1, 0xe6, + 0x0e, 0x00, 0xb8, 0xe6, 0x0e, 0x00, 0x86, 0xe8, 0x0e, 0x00, 0x87, 0xe8, + 0x0e, 0x00, 0x88, 0xe8, 0x0e, 0x00, 0x89, 0xe8, 0x0e, 0x00, 0x8b, 0xe8, + 0x0e, 0x00, 0xb0, 0xe8, 0x0e, 0x00, 0xb6, 0xe8, 0x0e, 0x00, 0xb7, 0xe8, + 0x0e, 0x00, 0xbd, 0xe8, 0x0e, 0x00, 0xbe, 0xe8, 0x0e, 0x00, 0xbf, 0xe8, + 0x0e, 0x00, 0x18, 0xe9, 0x0e, 0x00, 0x1c, 0xe9, 0x0e, 0x00, 0x1e, 0xe9, + 0x0e, 0x00, 0x1f, 0xe9, 0x0e, 0x00, 0x68, 0xe9, 0x0e, 0x00, 0x6b, 0xe9, + 0x0e, 0x00, 0x78, 0xe9, 0x0e, 0x00, 0x7c, 0xe9, 0x0e, 0x00, 0x7e, 0xe9, + 0x0e, 0x00, 0x7f, 0xe9, 0x0e, 0x00, 0x88, 0xe9, 0x0e, 0x00, 0x8b, 0xe9, + 0x0e, 0x00, 0x91, 0xe9, 0x0e, 0x00, 0x96, 0xe9, 0x0e, 0x00, 0x97, 0xe9, + 0x0e, 0x00, 0x98, 0xe9, 0x0e, 0x00, 0x9c, 0xe9, 0x0e, 0x00, 0x9e, 0xe9, + 0x0e, 0x00, 0x9f, 0xe9, 0x0e, 0x00, 0xd1, 0xe9, 0x0e, 0x00, 0xd6, 0xe9, + 0x0e, 0x00, 0xd7, 0xe9, 0x0e, 0x00, 0xd8, 0xe9, 0x0e, 0x00, 0xdc, 0xe9, + 0x0e, 0x00, 0xde, 0xe9, 0x0e, 0x00, 0xdf, 0xe9, 0x0e, 0x00, 0xb0, 0xea, + 0x0e, 0x00, 0xb6, 0xea, 0x0e, 0x00, 0xb7, 0xea, 0x0e, 0x00, 0xbd, 0xea, + 0x0e, 0x00, 0xbe, 0xea, 0x0e, 0x00, 0xbf, 0xea, 0x0e, 0x00, 0xe6, 0xeb, + 0x0e, 0x00, 0xe7, 0xeb, 0x0e, 0x00, 0xe8, 0xeb, 0x0e, 0x00, 0xe9, 0xeb, + 0x0e, 0x00, 0xeb, 0xeb, 0x0e, 0x00, 0xf0, 0xeb, 0x0e, 0x00, 0xf6, 0xeb, + 0x0e, 0x00, 0xf7, 0xeb, 0x0e, 0x00, 0xfd, 0xeb, 0x0e, 0x00, 0xfe, 0xeb, + 0x0e, 0x00, 0xff, 0xeb, 0x0e, 0x00, 0x78, 0xec, 0x0e, 0x00, 0x90, 0xec, + 0x0e, 0x00, 0x99, 0xec, 0x0e, 0x00, 0x9d, 0xec, 0x0e, 0x00, 0xb8, 0xec, + 0x0e, 0x00, 0x1e, 0xed, 0x0e, 0x00, 0x1f, 0xed, 0x0e, 0x00, 0x68, 0xed, + 0x0e, 0x00, 0x6b, 0xed, 0x0e, 0x00, 0x7e, 0xed, 0x0e, 0x00, 0x7f, 0xed, + 0x0e, 0x00, 0x88, 0xed, 0x0e, 0x00, 0x8b, 0xed, 0x0e, 0x00, 0x91, 0xed, + 0x0e, 0x00, 0x96, 0xed, 0x0e, 0x00, 0x97, 0xed, 0x0e, 0x00, 0x9d, 0xed, + 0x0e, 0x00, 0x9e, 0xed, 0x0e, 0x00, 0x9f, 0xed, 0x0e, 0x00, 0xd1, 0xed, + 0x0e, 0x00, 0xd6, 0xed, 0x0e, 0x00, 0xd7, 0xed, 0x0e, 0x00, 0xdd, 0xed, + 0x0e, 0x00, 0xde, 0xed, 0x0e, 0x00, 0xdf, 0xed, 0x0e, 0x00, 0x68, 0xee, + 0x0e, 0x00, 0x6b, 0xee, 0x0e, 0x00, 0x78, 0xee, 0x0e, 0x00, 0x7c, 0xee, + 0x0e, 0x00, 0x7e, 0xee, 0x0e, 0x00, 0x7f, 0xee, 0x0e, 0x00, 0x88, 0xee, + 0x0e, 0x00, 0x8b, 0xee, 0x0e, 0x00, 0x91, 0xee, 0x0e, 0x00, 0x96, 0xee, + 0x0e, 0x00, 0x97, 0xee, 0x0e, 0x00, 0x98, 0xee, 0x0e, 0x00, 0x9c, 0xee, + 0x0e, 0x00, 0x9e, 0xee, 0x0e, 0x00, 0x9f, 0xee, 0x0e, 0x00, 0xbe, 0xee, + 0x0e, 0x00, 0xbf, 0xee, 0x0e, 0x00, 0x68, 0xef, 0x0e, 0x00, 0x6b, 0xef, + 0x0e, 0x00, 0x78, 0xef, 0x0e, 0x00, 0x7c, 0xef, 0x0e, 0x00, 0x7e, 0xef, + 0x0e, 0x00, 0x7f, 0xef, 0x0e, 0x00, 0xf0, 0xef, 0x0e, 0x00, 0xf1, 0xef, + 0x0e, 0x00, 0xf9, 0xef, 0x0e, 0x00, 0xfd, 0xef, 0x0e, 0x00, 0x86, 0xf0, + 0x0e, 0x00, 0x87, 0xf0, 0x0e, 0x00, 0x88, 0xf0, 0x0e, 0x00, 0x89, 0xf0, + 0x0e, 0x00, 0x8b, 0xf0, 0x0e, 0x00, 0xb0, 0xf0, 0x0e, 0x00, 0xb6, 0xf0, + 0x0e, 0x00, 0xb7, 0xf0, 0x0e, 0x00, 0xbd, 0xf0, 0x0e, 0x00, 0xbe, 0xf0, + 0x0e, 0x00, 0xbf, 0xf0, 0x0e, 0x00, 0xf0, 0xf1, 0x0e, 0x00, 0xf1, 0xf1, + 0x0e, 0x00, 0xf9, 0xf1, 0x0e, 0x00, 0xfd, 0xf1, 0x0e, 0x00, 0x78, 0xf2, + 0x0e, 0x00, 0xab, 0xf2, 0x0e, 0x00, 0x88, 0xf3, 0x0e, 0x00, 0x8b, 0xf3, + 0x0e, 0x00, 0x91, 0xf3, 0x0e, 0x00, 0x96, 0xf3, 0x0e, 0x00, 0x97, 0xf3, + 0x0e, 0x00, 0x9d, 0xf3, 0x0e, 0x00, 0x9e, 0xf3, 0x0e, 0x00, 0x9f, 0xf3, + 0x0e, 0x00, 0x68, 0xf5, 0x0e, 0x00, 0x6b, 0xf5, 0x0e, 0x00, 0x7e, 0xf5, + 0x0e, 0x00, 0x7f, 0xf5, 0x0e, 0x00, 0xf1, 0xf5, 0x0e, 0x00, 0xf8, 0xf5, + 0x0e, 0x00, 0x87, 0xf6, 0x0e, 0x00, 0x8b, 0xf6, 0x0e, 0x00, 0xb0, 0xf6, + 0x0e, 0x00, 0xb7, 0xf6, 0x0e, 0x00, 0xbd, 0xf6, 0x0e, 0x00, 0xbe, 0xf6, + 0x0e, 0x00, 0xbf, 0xf6, 0x0e, 0x00, 0x86, 0xf7, 0x0e, 0x00, 0x87, 0xf7, + 0x0e, 0x00, 0x88, 0xf7, 0x0e, 0x00, 0x89, 0xf7, 0x0e, 0x00, 0x8b, 0xf7, + 0x0e, 0x00, 0xc7, 0xf9, 0x0e, 0x00, 0xcb, 0xf9, 0x0e, 0x00, 0xe7, 0xf9, + 0x0e, 0x00, 0xeb, 0xf9, 0x0e, 0x00, 0xf7, 0xf9, 0x0e, 0x00, 0xf8, 0xf9, + 0x0e, 0x00, 0xfc, 0xf9, 0x0e, 0x00, 0xfe, 0xf9, 0x0e, 0x00, 0xff, 0xf9, + 0x0e, 0x00, 0xc7, 0xfd, 0x0e, 0x00, 0xcb, 0xfd, 0x0e, 0x00, 0xe7, 0xfd, + 0x0e, 0x00, 0xeb, 0xfd, 0x0e, 0x00, 0xf0, 0xfd, 0x0e, 0x00, 0xf7, 0xfd, + 0x0e, 0x00, 0xfd, 0xfd, 0x0e, 0x00, 0xfe, 0xfd, 0x0e, 0x00, 0xff, 0xfd, + 0x0e, 0x00, 0x91, 0xff, 0x0e, 0x00, 0x96, 0xff, 0x0e, 0x00, 0x97, 0xff, + 0x0e, 0x00, 0x98, 0xff, 0x0e, 0x00, 0x9c, 0xff, 0x0e, 0x00, 0x9e, 0xff, + 0x0e, 0x00, 0x9f, 0xff, 0x0e, 0x00, 0xd1, 0xff, 0x0e, 0x00, 0xd6, 0xff, + 0x0e, 0x00, 0xd7, 0xff, 0x0e, 0x00, 0xd8, 0xff, 0x0e, 0x00, 0xdc, 0xff, + 0x0e, 0x00, 0xde, 0xff, 0x0e, 0x00, 0xdf, 0xff, 0x0e, 0x00, 0x18, 0x01, + 0x0f, 0x00, 0x1c, 0x01, 0x0f, 0x00, 0x1e, 0x01, 0x0f, 0x00, 0x1f, 0x01, + 0x0f, 0x00, 0x64, 0x01, 0x0f, 0x00, 0x65, 0x01, 0x0f, 0x00, 0x68, 0x01, + 0x0f, 0x00, 0x6b, 0x01, 0x0f, 0x00, 0x6c, 0x01, 0x0f, 0x00, 0x6e, 0x01, + 0x0f, 0x00, 0x6f, 0x01, 0x0f, 0x00, 0x74, 0x01, 0x0f, 0x00, 0x75, 0x01, + 0x0f, 0x00, 0x78, 0x01, 0x0f, 0x00, 0x7c, 0x01, 0x0f, 0x00, 0x7e, 0x01, + 0x0f, 0x00, 0x7f, 0x01, 0x0f, 0x00, 0x93, 0x03, 0x0f, 0x00, 0x94, 0x03, + 0x0f, 0x00, 0x95, 0x03, 0x0f, 0x00, 0x9b, 0x03, 0x0f, 0x00, 0xc3, 0x05, + 0x0f, 0x00, 0xc4, 0x05, 0x0f, 0x00, 0xc5, 0x05, 0x0f, 0x00, 0xc8, 0x05, + 0x0f, 0x00, 0xcb, 0x05, 0x0f, 0x00, 0xcc, 0x05, 0x0f, 0x00, 0xce, 0x05, + 0x0f, 0x00, 0xcf, 0x05, 0x0f, 0x00, 0xf4, 0x05, 0x0f, 0x00, 0xf5, 0x05, + 0x0f, 0x00, 0xf8, 0x05, 0x0f, 0x00, 0xfc, 0x05, 0x0f, 0x00, 0xfe, 0x05, + 0x0f, 0x00, 0xff, 0x05, 0x0f, 0x00, 0x18, 0x07, 0x0f, 0x00, 0x1c, 0x07, + 0x0f, 0x00, 0x1e, 0x07, 0x0f, 0x00, 0x1f, 0x07, 0x0f, 0x00, 0x88, 0x07, + 0x0f, 0x00, 0x8b, 0x07, 0x0f, 0x00, 0x8c, 0x07, 0x0f, 0x00, 0x8e, 0x07, + 0x0f, 0x00, 0x8f, 0x07, 0x0f, 0x00, 0xd8, 0x07, 0x0f, 0x00, 0xdc, 0x07, + 0x0f, 0x00, 0xde, 0x07, 0x0f, 0x00, 0xdf, 0x07, 0x0f, 0x00, 0xe4, 0x07, + 0x0f, 0x00, 0xe5, 0x07, 0x0f, 0x00, 0xe8, 0x07, 0x0f, 0x00, 0xeb, 0x07, + 0x0f, 0x00, 0xec, 0x07, 0x0f, 0x00, 0xee, 0x07, 0x0f, 0x00, 0xef, 0x07, + 0x0f, 0x00, 0xf4, 0x07, 0x0f, 0x00, 0xf5, 0x07, 0x0f, 0x00, 0xf8, 0x07, + 0x0f, 0x00, 0xfc, 0x07, 0x0f, 0x00, 0xfe, 0x07, 0x0f, 0x00, 0xff, 0x07, + 0x0f, 0x00, 0x98, 0x08, 0x0f, 0x00, 0x9c, 0x08, 0x0f, 0x00, 0x9e, 0x08, + 0x0f, 0x00, 0x9f, 0x08, 0x0f, 0x00, 0xdf, 0x09, 0x0f, 0x00, 0xeb, 0x09, + 0x0f, 0x00, 0xee, 0x09, 0x0f, 0x00, 0xef, 0x09, 0x0f, 0x00, 0xf8, 0x09, + 0x0f, 0x00, 0xfc, 0x09, 0x0f, 0x00, 0xfe, 0x09, 0x0f, 0x00, 0xff, 0x09, + 0x0f, 0x00, 0x9f, 0x0a, 0x0f, 0x00, 0x83, 0x0b, 0x0f, 0x00, 0x84, 0x0b, + 0x0f, 0x00, 0x85, 0x0b, 0x0f, 0x00, 0xd3, 0x0b, 0x0f, 0x00, 0xd4, 0x0b, + 0x0f, 0x00, 0xd5, 0x0b, 0x0f, 0x00, 0xdb, 0x0b, 0x0f, 0x00, 0xe3, 0x0b, + 0x0f, 0x00, 0xf3, 0x0b, 0x0f, 0x00, 0xfb, 0x0b, 0x0f, 0x00, 0xd3, 0x0d, + 0x0f, 0x00, 0xd4, 0x0d, 0x0f, 0x00, 0xd5, 0x0d, 0x0f, 0x00, 0xdb, 0x0d, + 0x0f, 0x00, 0xe3, 0x0d, 0x0f, 0x00, 0xf3, 0x0d, 0x0f, 0x00, 0xfb, 0x0d, + 0x0f, 0x00, 0x98, 0x0f, 0x0f, 0x00, 0x9c, 0x0f, 0x0f, 0x00, 0x9e, 0x0f, + 0x0f, 0x00, 0x9f, 0x0f, 0x0f, 0x00, 0x18, 0x11, 0x0f, 0x00, 0x1c, 0x11, + 0x0f, 0x00, 0x1e, 0x11, 0x0f, 0x00, 0x1f, 0x11, 0x0f, 0x00, 0x64, 0x11, + 0x0f, 0x00, 0x65, 0x11, 0x0f, 0x00, 0x68, 0x11, 0x0f, 0x00, 0x6b, 0x11, + 0x0f, 0x00, 0x6c, 0x11, 0x0f, 0x00, 0x6e, 0x11, 0x0f, 0x00, 0x6f, 0x11, + 0x0f, 0x00, 0x74, 0x11, 0x0f, 0x00, 0x75, 0x11, 0x0f, 0x00, 0x78, 0x11, + 0x0f, 0x00, 0x7c, 0x11, 0x0f, 0x00, 0x7e, 0x11, 0x0f, 0x00, 0x7f, 0x11, + 0x0f, 0x00, 0x95, 0x13, 0x0f, 0x00, 0x98, 0x13, 0x0f, 0x00, 0x9c, 0x13, + 0x0f, 0x00, 0x9e, 0x13, 0x0f, 0x00, 0x9f, 0x13, 0x0f, 0x00, 0x93, 0x14, + 0x0f, 0x00, 0x94, 0x14, 0x0f, 0x00, 0x95, 0x14, 0x0f, 0x00, 0x9b, 0x14, + 0x0f, 0x00, 0xce, 0x15, 0x0f, 0x00, 0xcf, 0x15, 0x0f, 0x00, 0xee, 0x15, + 0x0f, 0x00, 0xef, 0x15, 0x0f, 0x00, 0xf8, 0x15, 0x0f, 0x00, 0xfc, 0x15, + 0x0f, 0x00, 0xfe, 0x15, 0x0f, 0x00, 0xff, 0x15, 0x0f, 0x00, 0x93, 0x16, + 0x0f, 0x00, 0x94, 0x16, 0x0f, 0x00, 0x95, 0x16, 0x0f, 0x00, 0x9b, 0x16, + 0x0f, 0x00, 0x08, 0x17, 0x0f, 0x00, 0x0b, 0x17, 0x0f, 0x00, 0x0c, 0x17, + 0x0f, 0x00, 0x0e, 0x17, 0x0f, 0x00, 0x0f, 0x17, 0x0f, 0x00, 0x13, 0x17, + 0x0f, 0x00, 0x14, 0x17, 0x0f, 0x00, 0x15, 0x17, 0x0f, 0x00, 0x1b, 0x17, + 0x0f, 0x00, 0xc3, 0x17, 0x0f, 0x00, 0xc4, 0x17, 0x0f, 0x00, 0xc5, 0x17, + 0x0f, 0x00, 0xc8, 0x17, 0x0f, 0x00, 0xcb, 0x17, 0x0f, 0x00, 0xcc, 0x17, + 0x0f, 0x00, 0xce, 0x17, 0x0f, 0x00, 0xcf, 0x17, 0x0f, 0x00, 0xe4, 0x17, + 0x0f, 0x00, 0xe5, 0x17, 0x0f, 0x00, 0xe8, 0x17, 0x0f, 0x00, 0xeb, 0x17, + 0x0f, 0x00, 0xec, 0x17, 0x0f, 0x00, 0xee, 0x17, 0x0f, 0x00, 0xef, 0x17, + 0x0f, 0x00, 0xf4, 0x17, 0x0f, 0x00, 0xf5, 0x17, 0x0f, 0x00, 0xf8, 0x17, + 0x0f, 0x00, 0xfc, 0x17, 0x0f, 0x00, 0xfe, 0x17, 0x0f, 0x00, 0xff, 0x17, + 0x0f, 0x00, 0xf3, 0x19, 0x0f, 0x00, 0xfb, 0x19, 0x0f, 0x00, 0xb4, 0x1a, + 0x0f, 0x00, 0xb5, 0x1a, 0x0f, 0x00, 0xb8, 0x1a, 0x0f, 0x00, 0xbc, 0x1a, + 0x0f, 0x00, 0xbe, 0x1a, 0x0f, 0x00, 0xbf, 0x1a, 0x0f, 0x00, 0x18, 0x1b, + 0x0f, 0x00, 0x1c, 0x1b, 0x0f, 0x00, 0x1e, 0x1b, 0x0f, 0x00, 0x1f, 0x1b, + 0x0f, 0x00, 0x8e, 0x1b, 0x0f, 0x00, 0x8f, 0x1b, 0x0f, 0x00, 0xd5, 0x1b, + 0x0f, 0x00, 0xd8, 0x1b, 0x0f, 0x00, 0xdc, 0x1b, 0x0f, 0x00, 0xde, 0x1b, + 0x0f, 0x00, 0xdf, 0x1b, 0x0f, 0x00, 0xe4, 0x1b, 0x0f, 0x00, 0xee, 0x1b, + 0x0f, 0x00, 0xef, 0x1b, 0x0f, 0x00, 0xf4, 0x1b, 0x0f, 0x00, 0xf5, 0x1b, + 0x0f, 0x00, 0xf8, 0x1b, 0x0f, 0x00, 0xfc, 0x1b, 0x0f, 0x00, 0xfe, 0x1b, + 0x0f, 0x00, 0xff, 0x1b, 0x0f, 0x00, 0xf3, 0x1d, 0x0f, 0x00, 0xfb, 0x1d, + 0x0f, 0x00, 0x98, 0x1f, 0x0f, 0x00, 0x9c, 0x1f, 0x0f, 0x00, 0x9e, 0x1f, + 0x0f, 0x00, 0x9f, 0x1f, 0x0f, 0x00, 0xd8, 0x1f, 0x0f, 0x00, 0xdc, 0x1f, + 0x0f, 0x00, 0xde, 0x1f, 0x0f, 0x00, 0xdf, 0x1f, 0x0f, 0x00, 0xb8, 0x24, + 0x0f, 0x00, 0xbc, 0x24, 0x0f, 0x00, 0xbe, 0x24, 0x0f, 0x00, 0xbf, 0x24, + 0x0f, 0x00, 0xe8, 0x2b, 0x0f, 0x00, 0xeb, 0x2b, 0x0f, 0x00, 0xd0, 0x33, + 0x0f, 0x00, 0xd1, 0x33, 0x0f, 0x00, 0xd6, 0x33, 0x0f, 0x00, 0xd7, 0x33, + 0x0f, 0x00, 0xd9, 0x33, 0x0f, 0x00, 0xdd, 0x33, 0x0f, 0x00, 0xe9, 0x33, + 0x0f, 0x00, 0xea, 0x33, 0x0f, 0x00, 0xf0, 0x33, 0x0f, 0x00, 0xf1, 0x33, + 0x0f, 0x00, 0xf9, 0x33, 0x0f, 0x00, 0xfd, 0x33, 0x0f, 0x00, 0xb0, 0x38, + 0x0f, 0x00, 0xb1, 0x38, 0x0f, 0x00, 0xb9, 0x38, 0x0f, 0x00, 0xbd, 0x38, + 0x0f, 0x00, 0x9f, 0x39, 0x0f, 0x00, 0xe9, 0x3b, 0x0f, 0x00, 0xea, 0x3b, + 0x0f, 0x00, 0xf0, 0x3b, 0x0f, 0x00, 0xf1, 0x3b, 0x0f, 0x00, 0xf9, 0x3b, + 0x0f, 0x00, 0xfd, 0x3b, 0x0f, 0x00, 0x6b, 0x3c, 0x0f, 0x00, 0x78, 0x3c, + 0x0f, 0x00, 0x7c, 0x3c, 0x0f, 0x00, 0x7e, 0x3c, 0x0f, 0x00, 0x7f, 0x3c, + 0x0f, 0x00, 0x90, 0x3d, 0x0f, 0x00, 0x91, 0x3d, 0x0f, 0x00, 0x96, 0x3d, + 0x0f, 0x00, 0x97, 0x3d, 0x0f, 0x00, 0xd8, 0x3f, 0x0f, 0x00, 0xdc, 0x3f, + 0x0f, 0x00, 0xde, 0x3f, 0x0f, 0x00, 0xdf, 0x3f, 0x0f, 0x00, 0xe6, 0x3f, + 0x0f, 0x00, 0xe7, 0x3f, 0x0f, 0x00, 0xe8, 0x3f, 0x0f, 0x00, 0xeb, 0x3f, + 0x0f, 0x00, 0xf6, 0x3f, 0x0f, 0x00, 0xf7, 0x3f, 0x0f, 0x00, 0xf8, 0x3f, + 0x0f, 0x00, 0xfc, 0x3f, 0x0f, 0x00, 0xfe, 0x3f, 0x0f, 0x00, 0xff, 0x3f, + 0x0f, 0x00, 0x1f, 0x41, 0x0f, 0x00, 0x70, 0x41, 0x0f, 0x00, 0x71, 0x41, + 0x0f, 0x00, 0x79, 0x41, 0x0f, 0x00, 0x7d, 0x41, 0x0f, 0x00, 0x78, 0x42, + 0x0f, 0x00, 0x7c, 0x42, 0x0f, 0x00, 0x7e, 0x42, 0x0f, 0x00, 0x7f, 0x42, + 0x0f, 0x00, 0x0b, 0x43, 0x0f, 0x00, 0x78, 0x43, 0x0f, 0x00, 0x7c, 0x43, + 0x0f, 0x00, 0x7e, 0x43, 0x0f, 0x00, 0x7f, 0x43, 0x0f, 0x00, 0x90, 0x43, + 0x0f, 0x00, 0x91, 0x43, 0x0f, 0x00, 0x96, 0x43, 0x0f, 0x00, 0x97, 0x43, + 0x0f, 0x00, 0xcb, 0x45, 0x0f, 0x00, 0xf7, 0x45, 0x0f, 0x00, 0xf8, 0x45, + 0x0f, 0x00, 0xfc, 0x45, 0x0f, 0x00, 0xfe, 0x45, 0x0f, 0x00, 0xff, 0x45, + 0x0f, 0x00, 0x87, 0x47, 0x0f, 0x00, 0xdf, 0x47, 0x0f, 0x00, 0xe7, 0x47, + 0x0f, 0x00, 0xeb, 0x47, 0x0f, 0x00, 0xf7, 0x47, 0x0f, 0x00, 0xf8, 0x47, + 0x0f, 0x00, 0xfc, 0x47, 0x0f, 0x00, 0xfe, 0x47, 0x0f, 0x00, 0xff, 0x47, + 0x0f, 0x00, 0x90, 0x48, 0x0f, 0x00, 0xc7, 0x49, 0x0f, 0x00, 0xcb, 0x49, + 0x0f, 0x00, 0xe7, 0x49, 0x0f, 0x00, 0xeb, 0x49, 0x0f, 0x00, 0xf7, 0x49, + 0x0f, 0x00, 0xb7, 0x4a, 0x0f, 0x00, 0x87, 0x4b, 0x0f, 0x00, 0x8b, 0x4b, + 0x0f, 0x00, 0xd1, 0x4b, 0x0f, 0x00, 0xd6, 0x4b, 0x0f, 0x00, 0xd7, 0x4b, + 0x0f, 0x00, 0xdf, 0x4b, 0x0f, 0x00, 0xe7, 0x4b, 0x0f, 0x00, 0xf0, 0x4b, + 0x0f, 0x00, 0xf1, 0x4b, 0x0f, 0x00, 0xf7, 0x4b, 0x0f, 0x00, 0xf9, 0x4b, + 0x0f, 0x00, 0xfd, 0x4b, 0x0f, 0x00, 0x6b, 0x4c, 0x0f, 0x00, 0x7f, 0x4c, + 0x0f, 0x00, 0x8b, 0x4c, 0x0f, 0x00, 0xb8, 0x4c, 0x0f, 0x00, 0xbc, 0x4c, + 0x0f, 0x00, 0xbe, 0x4c, 0x0f, 0x00, 0xbf, 0x4c, 0x0f, 0x00, 0x0b, 0x4d, + 0x0f, 0x00, 0xc7, 0x4d, 0x0f, 0x00, 0xe7, 0x4d, 0x0f, 0x00, 0xf7, 0x4d, + 0x0f, 0x00, 0x78, 0x4e, 0x0f, 0x00, 0x7c, 0x4e, 0x0f, 0x00, 0x7e, 0x4e, + 0x0f, 0x00, 0x7f, 0x4e, 0x0f, 0x00, 0x8b, 0x4e, 0x0f, 0x00, 0xbf, 0x4e, + 0x0f, 0x00, 0x78, 0x4f, 0x0f, 0x00, 0x7c, 0x4f, 0x0f, 0x00, 0x7e, 0x4f, + 0x0f, 0x00, 0x7f, 0x4f, 0x0f, 0x00, 0x8b, 0x4f, 0x0f, 0x00, 0x90, 0x4f, + 0x0f, 0x00, 0x91, 0x4f, 0x0f, 0x00, 0x96, 0x4f, 0x0f, 0x00, 0x97, 0x4f, + 0x0f, 0x00, 0x9f, 0x4f, 0x0f, 0x00, 0xd0, 0x4f, 0x0f, 0x00, 0xd1, 0x4f, + 0x0f, 0x00, 0xd6, 0x4f, 0x0f, 0x00, 0xd7, 0x4f, 0x0f, 0x00, 0xdf, 0x4f, + 0x0f, 0x00, 0xb0, 0x50, 0x0f, 0x00, 0xb1, 0x50, 0x0f, 0x00, 0xb9, 0x50, + 0x0f, 0x00, 0xbd, 0x50, 0x0f, 0x00, 0xcb, 0x51, 0x0f, 0x00, 0xf7, 0x51, + 0x0f, 0x00, 0xf8, 0x51, 0x0f, 0x00, 0xfc, 0x51, 0x0f, 0x00, 0xfe, 0x51, + 0x0f, 0x00, 0xff, 0x51, 0x0f, 0x00, 0xb8, 0x52, 0x0f, 0x00, 0xbc, 0x52, + 0x0f, 0x00, 0xbe, 0x52, 0x0f, 0x00, 0xbf, 0x52, 0x0f, 0x00, 0x8b, 0x53, + 0x0f, 0x00, 0x9f, 0x53, 0x0f, 0x00, 0x6b, 0x55, 0x0f, 0x00, 0xff, 0x55, + 0x0f, 0x00, 0x87, 0x56, 0x0f, 0x00, 0xb7, 0x56, 0x0f, 0x00, 0xf0, 0x59, + 0x0f, 0x00, 0xf1, 0x59, 0x0f, 0x00, 0xf9, 0x59, 0x0f, 0x00, 0xfd, 0x59, + 0x0f, 0x00, 0xb0, 0x5a, 0x0f, 0x00, 0xb1, 0x5a, 0x0f, 0x00, 0xb9, 0x5a, + 0x0f, 0x00, 0xbd, 0x5a, 0x0f, 0x00, 0x87, 0x5b, 0x0f, 0x00, 0xcb, 0x5d, + 0x0f, 0x00, 0xf7, 0x5d, 0x0f, 0x00, 0xf8, 0x5d, 0x0f, 0x00, 0xfc, 0x5d, + 0x0f, 0x00, 0xfe, 0x5d, 0x0f, 0x00, 0xff, 0x5d, 0x0f, 0x00, 0x90, 0x5f, + 0x0f, 0x00, 0x91, 0x5f, 0x0f, 0x00, 0x96, 0x5f, 0x0f, 0x00, 0x97, 0x5f, + 0x0f, 0x00, 0x1f, 0x61, 0x0f, 0x00, 0x63, 0x61, 0x0f, 0x00, 0x73, 0x61, + 0x0f, 0x00, 0x7b, 0x61, 0x0f, 0x00, 0xcb, 0x65, 0x0f, 0x00, 0xcf, 0x65, + 0x0f, 0x00, 0xeb, 0x65, 0x0f, 0x00, 0xef, 0x65, 0x0f, 0x00, 0xff, 0x65, + 0x0f, 0x00, 0x0b, 0x67, 0x0f, 0x00, 0xce, 0x67, 0x0f, 0x00, 0xcf, 0x67, + 0x0f, 0x00, 0xee, 0x67, 0x0f, 0x00, 0xef, 0x67, 0x0f, 0x00, 0xf8, 0x67, + 0x0f, 0x00, 0xfc, 0x67, 0x0f, 0x00, 0xfe, 0x67, 0x0f, 0x00, 0xff, 0x67, + 0x0f, 0x00, 0xf3, 0x69, 0x0f, 0x00, 0xfb, 0x69, 0x0f, 0x00, 0xb8, 0x6a, + 0x0f, 0x00, 0xbc, 0x6a, 0x0f, 0x00, 0xbe, 0x6a, 0x0f, 0x00, 0xbf, 0x6a, + 0x0f, 0x00, 0x84, 0x6b, 0x0f, 0x00, 0xf3, 0x6b, 0x0f, 0x00, 0xfb, 0x6b, + 0x0f, 0x00, 0xf3, 0x6d, 0x0f, 0x00, 0xfb, 0x6d, 0x0f, 0x00, 0x93, 0x6f, + 0x0f, 0x00, 0x94, 0x6f, 0x0f, 0x00, 0x95, 0x6f, 0x0f, 0x00, 0x9b, 0x6f, + 0x0f, 0x00, 0xd3, 0x6f, 0x0f, 0x00, 0xd4, 0x6f, 0x0f, 0x00, 0xd5, 0x6f, + 0x0f, 0x00, 0xdb, 0x6f, 0x0f, 0x00, 0x9f, 0x70, 0x0f, 0x00, 0x13, 0x71, + 0x0f, 0x00, 0x1f, 0x71, 0x0f, 0x00, 0x6e, 0x71, 0x0f, 0x00, 0x6f, 0x71, + 0x0f, 0x00, 0x78, 0x71, 0x0f, 0x00, 0x7c, 0x71, 0x0f, 0x00, 0x7e, 0x71, + 0x0f, 0x00, 0x7f, 0x71, 0x0f, 0x00, 0x83, 0x71, 0x0f, 0x00, 0x8f, 0x71, + 0x0f, 0x00, 0x9b, 0x71, 0x0f, 0x00, 0xdb, 0x71, 0x0f, 0x00, 0x95, 0x73, + 0x0f, 0x00, 0x93, 0x74, 0x0f, 0x00, 0x94, 0x74, 0x0f, 0x00, 0x95, 0x74, + 0x0f, 0x00, 0x9f, 0x74, 0x0f, 0x00, 0xcb, 0x75, 0x0f, 0x00, 0xcf, 0x75, + 0x0f, 0x00, 0xeb, 0x75, 0x0f, 0x00, 0xef, 0x75, 0x0f, 0x00, 0xff, 0x75, + 0x0f, 0x00, 0x93, 0x76, 0x0f, 0x00, 0x9f, 0x76, 0x0f, 0x00, 0x03, 0x77, + 0x0f, 0x00, 0x0e, 0x77, 0x0f, 0x00, 0x0f, 0x77, 0x0f, 0x00, 0x13, 0x77, + 0x0f, 0x00, 0x14, 0x77, 0x0f, 0x00, 0x15, 0x77, 0x0f, 0x00, 0x1f, 0x77, + 0x0f, 0x00, 0xce, 0x77, 0x0f, 0x00, 0xcf, 0x77, 0x0f, 0x00, 0xee, 0x77, + 0x0f, 0x00, 0xef, 0x77, 0x0f, 0x00, 0xf8, 0x77, 0x0f, 0x00, 0xfc, 0x77, + 0x0f, 0x00, 0xfe, 0x77, 0x0f, 0x00, 0xff, 0x77, 0x0f, 0x00, 0xcf, 0x79, + 0x0f, 0x00, 0xef, 0x79, 0x0f, 0x00, 0xff, 0x79, 0x0f, 0x00, 0xb3, 0x7a, + 0x0f, 0x00, 0xbb, 0x7a, 0x0f, 0x00, 0x84, 0x7b, 0x0f, 0x00, 0x8e, 0x7b, + 0x0f, 0x00, 0x8f, 0x7b, 0x0f, 0x00, 0xd5, 0x7b, 0x0f, 0x00, 0xee, 0x7b, + 0x0f, 0x00, 0xef, 0x7b, 0x0f, 0x00, 0xf8, 0x7b, 0x0f, 0x00, 0xfc, 0x7b, + 0x0f, 0x00, 0xfe, 0x7b, 0x0f, 0x00, 0xff, 0x7b, 0x0f, 0x00, 0xcb, 0x7d, + 0x0f, 0x00, 0xcf, 0x7d, 0x0f, 0x00, 0xeb, 0x7d, 0x0f, 0x00, 0xef, 0x7d, + 0x0f, 0x00, 0xff, 0x7d, 0x0f, 0x00, 0x9b, 0x7f, 0x0f, 0x00, 0xdb, 0x7f, + 0x0f, 0x00, 0x70, 0x84, 0x0f, 0x00, 0x71, 0x84, 0x0f, 0x00, 0x73, 0x84, + 0x0f, 0x00, 0x79, 0x84, 0x0f, 0x00, 0x7b, 0x84, 0x0f, 0x00, 0x7d, 0x84, + 0x0f, 0x00, 0xb0, 0x84, 0x0f, 0x00, 0xb1, 0x84, 0x0f, 0x00, 0xb3, 0x84, + 0x0f, 0x00, 0xb9, 0x84, 0x0f, 0x00, 0xbb, 0x84, 0x0f, 0x00, 0xbd, 0x84, + 0x0f, 0x00, 0x18, 0x85, 0x0f, 0x00, 0x1c, 0x85, 0x0f, 0x00, 0x1e, 0x85, + 0x0f, 0x00, 0x1f, 0x85, 0x0f, 0x00, 0x68, 0x85, 0x0f, 0x00, 0x6b, 0x85, + 0x0f, 0x00, 0x78, 0x85, 0x0f, 0x00, 0x7c, 0x85, 0x0f, 0x00, 0x7e, 0x85, + 0x0f, 0x00, 0x7f, 0x85, 0x0f, 0x00, 0x70, 0x86, 0x0f, 0x00, 0x71, 0x86, + 0x0f, 0x00, 0x73, 0x86, 0x0f, 0x00, 0x79, 0x86, 0x0f, 0x00, 0x7b, 0x86, + 0x0f, 0x00, 0x7d, 0x86, 0x0f, 0x00, 0xb2, 0x86, 0x0f, 0x00, 0xb4, 0x86, + 0x0f, 0x00, 0xb5, 0x86, 0x0f, 0x00, 0xb6, 0x86, 0x0f, 0x00, 0xb7, 0x86, + 0x0f, 0x00, 0xb8, 0x86, 0x0f, 0x00, 0xba, 0x86, 0x0f, 0x00, 0xbc, 0x86, + 0x0f, 0x00, 0xbe, 0x86, 0x0f, 0x00, 0xbf, 0x86, 0x0f, 0x00, 0x06, 0x87, + 0x0f, 0x00, 0x07, 0x87, 0x0f, 0x00, 0x09, 0x87, 0x0f, 0x00, 0x0a, 0x87, + 0x0f, 0x00, 0x70, 0x87, 0x0f, 0x00, 0x71, 0x87, 0x0f, 0x00, 0x79, 0x87, + 0x0f, 0x00, 0x7d, 0x87, 0x0f, 0x00, 0x90, 0x87, 0x0f, 0x00, 0x91, 0x87, + 0x0f, 0x00, 0x93, 0x87, 0x0f, 0x00, 0x94, 0x87, 0x0f, 0x00, 0x95, 0x87, + 0x0f, 0x00, 0x96, 0x87, 0x0f, 0x00, 0x97, 0x87, 0x0f, 0x00, 0x99, 0x87, + 0x0f, 0x00, 0x9b, 0x87, 0x0f, 0x00, 0x9d, 0x87, 0x0f, 0x00, 0x60, 0x8a, + 0x0f, 0x00, 0x61, 0x8a, 0x0f, 0x00, 0x62, 0x8a, 0x0f, 0x00, 0x64, 0x8a, + 0x0f, 0x00, 0x65, 0x8a, 0x0f, 0x00, 0x66, 0x8a, 0x0f, 0x00, 0x67, 0x8a, + 0x0f, 0x00, 0x68, 0x8a, 0x0f, 0x00, 0x6b, 0x8a, 0x0f, 0x00, 0x6c, 0x8a, + 0x0f, 0x00, 0x6e, 0x8a, 0x0f, 0x00, 0x6f, 0x8a, 0x0f, 0x00, 0x72, 0x8a, + 0x0f, 0x00, 0x74, 0x8a, 0x0f, 0x00, 0x75, 0x8a, 0x0f, 0x00, 0x76, 0x8a, + 0x0f, 0x00, 0x77, 0x8a, 0x0f, 0x00, 0x78, 0x8a, 0x0f, 0x00, 0x7a, 0x8a, + 0x0f, 0x00, 0x7c, 0x8a, 0x0f, 0x00, 0x7e, 0x8a, 0x0f, 0x00, 0x7f, 0x8a, + 0x0f, 0x00, 0x8b, 0x8a, 0x0f, 0x00, 0xb1, 0x8a, 0x0f, 0x00, 0xb3, 0x8a, + 0x0f, 0x00, 0xb9, 0x8a, 0x0f, 0x00, 0xbb, 0x8a, 0x0f, 0x00, 0xbd, 0x8a, + 0x0f, 0x00, 0x08, 0x8b, 0x0f, 0x00, 0x0b, 0x8b, 0x0f, 0x00, 0x66, 0x8b, + 0x0f, 0x00, 0x67, 0x8b, 0x0f, 0x00, 0x68, 0x8b, 0x0f, 0x00, 0x6b, 0x8b, + 0x0f, 0x00, 0x76, 0x8b, 0x0f, 0x00, 0x77, 0x8b, 0x0f, 0x00, 0x78, 0x8b, + 0x0f, 0x00, 0x7c, 0x8b, 0x0f, 0x00, 0x7e, 0x8b, 0x0f, 0x00, 0x7f, 0x8b, + 0x0f, 0x00, 0x92, 0x8b, 0x0f, 0x00, 0x98, 0x8b, 0x0f, 0x00, 0x9a, 0x8b, + 0x0f, 0x00, 0x9c, 0x8b, 0x0f, 0x00, 0x9e, 0x8b, 0x0f, 0x00, 0x9f, 0x8b, + 0x0f, 0x00, 0xd5, 0x93, 0x0f, 0x00, 0xd8, 0x93, 0x0f, 0x00, 0xdc, 0x93, + 0x0f, 0x00, 0xde, 0x93, 0x0f, 0x00, 0xdf, 0x93, 0x0f, 0x00, 0xe4, 0x93, + 0x0f, 0x00, 0xee, 0x93, 0x0f, 0x00, 0xef, 0x93, 0x0f, 0x00, 0xf4, 0x93, + 0x0f, 0x00, 0xf5, 0x93, 0x0f, 0x00, 0xf8, 0x93, 0x0f, 0x00, 0xfc, 0x93, + 0x0f, 0x00, 0xfe, 0x93, 0x0f, 0x00, 0xff, 0x93, 0x0f, 0x00, 0xbe, 0x98, + 0x0f, 0x00, 0xbf, 0x98, 0x0f, 0x00, 0xb3, 0x9a, 0x0f, 0x00, 0xbb, 0x9a, + 0x0f, 0x00, 0xe8, 0x9b, 0x0f, 0x00, 0xf3, 0x9b, 0x0f, 0x00, 0xfb, 0x9b, + 0x0f, 0x00, 0xc3, 0x9f, 0x0f, 0x00, 0xc4, 0x9f, 0x0f, 0x00, 0xc5, 0x9f, + 0x0f, 0x00, 0xc8, 0x9f, 0x0f, 0x00, 0xcb, 0x9f, 0x0f, 0x00, 0xcc, 0x9f, + 0x0f, 0x00, 0xce, 0x9f, 0x0f, 0x00, 0xcf, 0x9f, 0x0f, 0x00, 0xe4, 0x9f, + 0x0f, 0x00, 0xe5, 0x9f, 0x0f, 0x00, 0xe8, 0x9f, 0x0f, 0x00, 0xeb, 0x9f, + 0x0f, 0x00, 0xec, 0x9f, 0x0f, 0x00, 0xee, 0x9f, 0x0f, 0x00, 0xef, 0x9f, + 0x0f, 0x00, 0xf4, 0x9f, 0x0f, 0x00, 0xf5, 0x9f, 0x0f, 0x00, 0xf8, 0x9f, + 0x0f, 0x00, 0xfc, 0x9f, 0x0f, 0x00, 0xfe, 0x9f, 0x0f, 0x00, 0xff, 0x9f, + 0x0f, 0x00, 0x6b, 0xa4, 0x0f, 0x00, 0x78, 0xa4, 0x0f, 0x00, 0x7c, 0xa4, + 0x0f, 0x00, 0x7e, 0xa4, 0x0f, 0x00, 0x7f, 0xa4, 0x0f, 0x00, 0x98, 0xa7, + 0x0f, 0x00, 0x9c, 0xa7, 0x0f, 0x00, 0x9e, 0xa7, 0x0f, 0x00, 0x9f, 0xa7, + 0x0f, 0x00, 0x98, 0xab, 0x0f, 0x00, 0x9c, 0xab, 0x0f, 0x00, 0x9e, 0xab, + 0x0f, 0x00, 0x9f, 0xab, 0x0f, 0x00, 0xd0, 0xb3, 0x0f, 0x00, 0xd1, 0xb3, + 0x0f, 0x00, 0xd6, 0xb3, 0x0f, 0x00, 0xd7, 0xb3, 0x0f, 0x00, 0xd9, 0xb3, + 0x0f, 0x00, 0xdd, 0xb3, 0x0f, 0x00, 0xe9, 0xb3, 0x0f, 0x00, 0xea, 0xb3, + 0x0f, 0x00, 0xf0, 0xb3, 0x0f, 0x00, 0xf1, 0xb3, 0x0f, 0x00, 0xf9, 0xb3, + 0x0f, 0x00, 0xfd, 0xb3, 0x0f, 0x00, 0x67, 0xb8, 0x0f, 0x00, 0x6b, 0xb8, + 0x0f, 0x00, 0x77, 0xb8, 0x0f, 0x00, 0x78, 0xb8, 0x0f, 0x00, 0x7c, 0xb8, + 0x0f, 0x00, 0x7e, 0xb8, 0x0f, 0x00, 0x7f, 0xb8, 0x0f, 0x00, 0xb6, 0xb8, + 0x0f, 0x00, 0xb7, 0xb8, 0x0f, 0x00, 0xb8, 0xb8, 0x0f, 0x00, 0xbc, 0xb8, + 0x0f, 0x00, 0xbe, 0xb8, 0x0f, 0x00, 0xbf, 0xb8, 0x0f, 0x00, 0x9f, 0xb9, + 0x0f, 0x00, 0x66, 0xba, 0x0f, 0x00, 0x67, 0xba, 0x0f, 0x00, 0x68, 0xba, + 0x0f, 0x00, 0x6b, 0xba, 0x0f, 0x00, 0x76, 0xba, 0x0f, 0x00, 0x77, 0xba, + 0x0f, 0x00, 0x78, 0xba, 0x0f, 0x00, 0x7c, 0xba, 0x0f, 0x00, 0x7e, 0xba, + 0x0f, 0x00, 0x7f, 0xba, 0x0f, 0x00, 0xb0, 0xba, 0x0f, 0x00, 0xb1, 0xba, + 0x0f, 0x00, 0xb9, 0xba, 0x0f, 0x00, 0xbd, 0xba, 0x0f, 0x00, 0x98, 0xbb, + 0x0f, 0x00, 0x9c, 0xbb, 0x0f, 0x00, 0x9e, 0xbb, 0x0f, 0x00, 0x9f, 0xbb, + 0x0f, 0x00, 0x90, 0xbd, 0x0f, 0x00, 0x91, 0xbd, 0x0f, 0x00, 0x96, 0xbd, + 0x0f, 0x00, 0x97, 0xbd, 0x0f, 0x00, 0x88, 0xbf, 0x0f, 0x00, 0x8b, 0xbf, + 0x0f, 0x00, 0xd8, 0xbf, 0x0f, 0x00, 0xdc, 0xbf, 0x0f, 0x00, 0xde, 0xbf, + 0x0f, 0x00, 0xdf, 0xbf, 0x0f, 0x00, 0xe6, 0xbf, 0x0f, 0x00, 0xe7, 0xbf, + 0x0f, 0x00, 0xe8, 0xbf, 0x0f, 0x00, 0xeb, 0xbf, 0x0f, 0x00, 0xf6, 0xbf, + 0x0f, 0x00, 0xf7, 0xbf, 0x0f, 0x00, 0xf8, 0xbf, 0x0f, 0x00, 0xfc, 0xbf, + 0x0f, 0x00, 0xfe, 0xbf, 0x0f, 0x00, 0xff, 0xbf, 0x0f, 0x00, 0xb2, 0xc4, + 0x0f, 0x00, 0xb4, 0xc4, 0x0f, 0x00, 0xb5, 0xc4, 0x0f, 0x00, 0xb6, 0xc4, + 0x0f, 0x00, 0xb7, 0xc4, 0x0f, 0x00, 0xb8, 0xc4, 0x0f, 0x00, 0xba, 0xc4, + 0x0f, 0x00, 0xbc, 0xc4, 0x0f, 0x00, 0xbe, 0xc4, 0x0f, 0x00, 0xbf, 0xc4, + 0x0f, 0x00, 0x83, 0xc7, 0x0f, 0x00, 0x84, 0xc7, 0x0f, 0x00, 0x85, 0xc7, + 0x0f, 0x00, 0x86, 0xc7, 0x0f, 0x00, 0x87, 0xc7, 0x0f, 0x00, 0x89, 0xc7, + 0x0f, 0x00, 0x8a, 0xc7, 0x0f, 0x00, 0x8d, 0xc7, 0x0f, 0x00, 0xe0, 0xc7, + 0x0f, 0x00, 0xe1, 0xc7, 0x0f, 0x00, 0xe2, 0xc7, 0x0f, 0x00, 0xe4, 0xc7, + 0x0f, 0x00, 0xe5, 0xc7, 0x0f, 0x00, 0xe6, 0xc7, 0x0f, 0x00, 0xe7, 0xc7, + 0x0f, 0x00, 0xe8, 0xc7, 0x0f, 0x00, 0xeb, 0xc7, 0x0f, 0x00, 0xec, 0xc7, + 0x0f, 0x00, 0xee, 0xc7, 0x0f, 0x00, 0xef, 0xc7, 0x0f, 0x00, 0xf2, 0xc7, + 0x0f, 0x00, 0xf4, 0xc7, 0x0f, 0x00, 0xf5, 0xc7, 0x0f, 0x00, 0xf6, 0xc7, + 0x0f, 0x00, 0xf7, 0xc7, 0x0f, 0x00, 0xf8, 0xc7, 0x0f, 0x00, 0xfa, 0xc7, + 0x0f, 0x00, 0xfc, 0xc7, 0x0f, 0x00, 0xfe, 0xc7, 0x0f, 0x00, 0xff, 0xc7, + 0x0f, 0x00, 0x87, 0xca, 0x0f, 0x00, 0xb2, 0xca, 0x0f, 0x00, 0xb7, 0xca, + 0x0f, 0x00, 0xb8, 0xca, 0x0f, 0x00, 0xba, 0xca, 0x0f, 0x00, 0xbc, 0xca, + 0x0f, 0x00, 0xbe, 0xca, 0x0f, 0x00, 0xbf, 0xca, 0x0f, 0x00, 0xe0, 0xcb, + 0x0f, 0x00, 0xe1, 0xcb, 0x0f, 0x00, 0xe2, 0xcb, 0x0f, 0x00, 0xe4, 0xcb, + 0x0f, 0x00, 0xe6, 0xcb, 0x0f, 0x00, 0xe7, 0xcb, 0x0f, 0x00, 0xee, 0xcb, + 0x0f, 0x00, 0xf2, 0xcb, 0x0f, 0x00, 0xf4, 0xcb, 0x0f, 0x00, 0xf5, 0xcb, + 0x0f, 0x00, 0xf6, 0xcb, 0x0f, 0x00, 0xf7, 0xcb, 0x0f, 0x00, 0xf8, 0xcb, + 0x0f, 0x00, 0xfa, 0xcb, 0x0f, 0x00, 0xfc, 0xcb, 0x0f, 0x00, 0xfe, 0xcb, + 0x0f, 0x00, 0xff, 0xcb, 0x0f, 0x00, 0xd3, 0xd3, 0x0f, 0x00, 0xd4, 0xd3, + 0x0f, 0x00 }; unsigned int client_resources_hardnested_bf_bench_data_bin_len = 80102; diff --git a/software/src/HardnestedRecovery/hardnested/hardnested_bf_core.c b/software/src/HardnestedRecovery/hardnested/hardnested_bf_core.c index a68d276..4ec12df 100755 --- a/software/src/HardnestedRecovery/hardnested/hardnested_bf_core.c +++ b/software/src/HardnestedRecovery/hardnested/hardnested_bf_core.c @@ -84,14 +84,14 @@ THE SOFTWARE. #define VECTOR_SIZE (MAX_BITSLICES/8) #ifdef _MSC_VER - #include - #define atomic_add(num, val) (InterlockedExchangeAdd(num, val) + val) - #pragma pack(push, VECTOR_SIZE) - typedef uint32_t bitslice_value_t; - #pragma pack(pop) +#include +#define atomic_add(num, val) (InterlockedExchangeAdd(num, val) + val) +#pragma pack(push, VECTOR_SIZE) +typedef uint32_t bitslice_value_t; +#pragma pack(pop) #else - #define atomic_add __sync_fetch_and_add - typedef uint32_t __attribute__((aligned(VECTOR_SIZE))) __attribute__((vector_size(VECTOR_SIZE))) bitslice_value_t; +#define atomic_add __sync_fetch_and_add +typedef uint32_t __attribute__((aligned(VECTOR_SIZE))) __attribute__((vector_size(VECTOR_SIZE))) bitslice_value_t; #endif @@ -314,8 +314,8 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel bitsliced_even_states[bitsliced_blocks] = lstate_p; // bitsliced_even_feedback[bitsliced_blocks] = bs_ones; bitsliced_even_feedback[bitsliced_blocks] = lstate_p[(47 - 0) / 2].value ^ - lstate_p[(47 - 10) / 2].value ^ lstate_p[(47 - 12) / 2].value ^ lstate_p[(47 - 14) / 2].value ^ - lstate_p[(47 - 24) / 2].value ^ lstate_p[(47 - 42) / 2].value; + lstate_p[(47 - 10) / 2].value ^ lstate_p[(47 - 12) / 2].value ^ lstate_p[(47 - 14) / 2].value ^ + lstate_p[(47 - 24) / 2].value ^ lstate_p[(47 - 42) / 2].value; bitsliced_blocks++; } // bitslice every odd state to every block of even states @@ -629,9 +629,9 @@ SIMDExecInstr GetSIMDInstrAuto(void) { // determine the available instruction set at runtime and call the correct function uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, - uint32_t *keys_found, uint64_t *num_keys_tested, - uint32_t nonces_to_bruteforce, const uint8_t *bf_test_nonce_2nd_byte, - noncelist_t *nonces) { + uint32_t *keys_found, uint64_t *num_keys_tested, + uint32_t nonces_to_bruteforce, const uint8_t *bf_test_nonce_2nd_byte, + noncelist_t *nonces) { // switch (GetSIMDInstrAuto()) { //#if defined(COMPILER_HAS_SIMD_AVX512) // case SIMD_AVX512: diff --git a/software/src/HardnestedRecovery/hardnested/hardnested_bitarray_core.c b/software/src/HardnestedRecovery/hardnested/hardnested_bitarray_core.c index 6572a39..23d38aa 100755 --- a/software/src/HardnestedRecovery/hardnested/hardnested_bitarray_core.c +++ b/software/src/HardnestedRecovery/hardnested/hardnested_bitarray_core.c @@ -142,10 +142,10 @@ unsigned int __builtin_popcountl(unsigned long long x) { #endif #ifdef _MSC_VER - #include - #define atomic_add(num, val) (InterlockedExchangeAdd(num, val) + val) +#include +#define atomic_add(num, val) (InterlockedExchangeAdd(num, val) + val) #else - #define atomic_add __sync_fetch_and_add +#define atomic_add __sync_fetch_and_add #endif #define MALLOC_BITARRAY malloc_bitarray_NOSIMD diff --git a/software/src/HardnestedRecovery/hardnested/hardnested_bruteforce.c b/software/src/HardnestedRecovery/hardnested/hardnested_bruteforce.c index 9bba41c..12edbe2 100755 --- a/software/src/HardnestedRecovery/hardnested/hardnested_bruteforce.c +++ b/software/src/HardnestedRecovery/hardnested/hardnested_bruteforce.c @@ -65,53 +65,52 @@ THE SOFTWARE. #define NUM_BRUTE_FORCE_THREADS (num_CPUs()) #ifdef _WIN32 - #define NUM_BRUTE_FORCE_THREADS_ALLOC 128 +#define NUM_BRUTE_FORCE_THREADS_ALLOC 128 #else - #define NUM_BRUTE_FORCE_THREADS_ALLOC (num_CPUs()) +#define NUM_BRUTE_FORCE_THREADS_ALLOC (num_CPUs()) #endif #define DEFAULT_BRUTE_FORCE_RATE (120000000.0) // if benchmark doesn't succeed #define TEST_BENCH_SIZE (6000) // number of odd and even states for brute force benchmark #ifdef _MSC_VER - #include - #include - #include - #include - #include - #define atomic_add(num, val) (InterlockedExchangeAdd64(num, val) + val) - FILE *fmemopen(void *buf, size_t len, const char *type) - { - int fd; - FILE *fp; - char tp[MAX_PATH - 13]; - char fn[MAX_PATH + 1]; - int * pfd = &fd; - int retner = -1; - char tfname[] = "MemTF_"; - if (!GetTempPathA(sizeof(tp), tp)) - return NULL; - if (!GetTempFileNameA(tp, tfname, 0, fn)) - return NULL; - retner = _sopen_s(pfd, fn, _O_CREAT | _O_SHORT_LIVED | _O_TEMPORARY | _O_RDWR | _O_BINARY | _O_NOINHERIT, _SH_DENYRW, _S_IREAD | _S_IWRITE); - if (retner != 0) - return NULL; - if (fd == -1) - return NULL; - fp = _fdopen(fd, "wb+"); - if (!fp) { - _close(fd); - return NULL; - } - /*File descriptors passed into _fdopen are owned by the returned FILE * stream.If _fdopen is successful, do not call _close on the file descriptor.Calling fclose on the returned FILE * also closes the file descriptor.*/ - fwrite(buf, len, 1, fp); - rewind(fp); - return fp; - } +#include +#include +#include +#include +#include +#define atomic_add(num, val) (InterlockedExchangeAdd64(num, val) + val) +FILE *fmemopen(void *buf, size_t len, const char *type) { + int fd; + FILE *fp; + char tp[MAX_PATH - 13]; + char fn[MAX_PATH + 1]; + int *pfd = &fd; + int retner = -1; + char tfname[] = "MemTF_"; + if (!GetTempPathA(sizeof(tp), tp)) + return NULL; + if (!GetTempFileNameA(tp, tfname, 0, fn)) + return NULL; + retner = _sopen_s(pfd, fn, _O_CREAT | _O_SHORT_LIVED | _O_TEMPORARY | _O_RDWR | _O_BINARY | _O_NOINHERIT, _SH_DENYRW, _S_IREAD | _S_IWRITE); + if (retner != 0) + return NULL; + if (fd == -1) + return NULL; + fp = _fdopen(fd, "wb+"); + if (!fp) { + _close(fd); + return NULL; + } + /*File descriptors passed into _fdopen are owned by the returned FILE * stream.If _fdopen is successful, do not call _close on the file descriptor.Calling fclose on the returned FILE * also closes the file descriptor.*/ + fwrite(buf, len, 1, fp); + rewind(fp); + return fp; +} #else - #define atomic_add __sync_fetch_and_add - #ifdef _WIN32 // Non-MSVC Windows (MinGW, etc.) - // Include the compatibility header provided via CMake - #include "../../compat/fmemopen/libfmemopen.h" +#define atomic_add __sync_fetch_and_add +#ifdef _WIN32 // Non-MSVC Windows (MinGW, etc.) +// Include the compatibility header provided via CMake +#include "../../compat/fmemopen/libfmemopen.h" #endif // _WIN32 (Non-MSVC) #endif @@ -212,8 +211,8 @@ crack_states_thread(void *x) { #endif const uint64_t key = crack_states_bitsliced(thread_arg->cuid, thread_arg->best_first_bytes, bucket, &keys_found, &num_keys_tested, nonces_to_bruteforce, bf_test_nonce_2nd_byte, thread_arg->nonces); if (key != -1) { - atomic_add(&keys_found, 1); - atomic_add(&found_bs_key, key); + atomic_add(&keys_found, 1); + atomic_add(&found_bs_key, key); char progress_text[80]; char keystr[19]; diff --git a/software/src/HardnestedRecovery/hardnested/tables.c b/software/src/HardnestedRecovery/hardnested/tables.c index 0db59dc..5e63101 100755 --- a/software/src/HardnestedRecovery/hardnested/tables.c +++ b/software/src/HardnestedRecovery/hardnested/tables.c @@ -67144,7 +67144,7 @@ void lzma_init_decoder(lzma_stream *strm) { // /usr/include/lzma/container.h depending on the install prefix) // for details. lzma_ret ret = lzma_stream_decoder( - strm, UINT64_MAX, LZMA_CONCATENATED); + strm, UINT64_MAX, LZMA_CONCATENATED); // Return successfully if the initialization went fine. if (ret == LZMA_OK) @@ -67268,7 +67268,7 @@ decompress(lzma_stream *strm) { // If you prefer, you can use the same error // message for this as for LZMA_DATA_ERROR. msg = "Compressed file is truncated or " - "otherwise corrupt"; + "otherwise corrupt"; break; default: @@ -67278,7 +67278,7 @@ decompress(lzma_stream *strm) { } fprintf(stderr, "Decoder error: " - "%s (error code %u)\n", + "%s (error code %u)\n", msg, ret); return false; } @@ -67312,4 +67312,4 @@ bitflip_info get_bitflip(odd_even_t odd_num, uint16_t id) { } return t; -} \ No newline at end of file +} diff --git a/software/src/HardnestedRecovery/hardnested/tables.h b/software/src/HardnestedRecovery/hardnested/tables.h index 9c701ec..70116bb 100755 --- a/software/src/HardnestedRecovery/hardnested/tables.h +++ b/software/src/HardnestedRecovery/hardnested/tables.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: tables.h * Author: vk496 * @@ -21,7 +21,7 @@ #include #include #include -#include <../../xz/src/liblzma/api/lzma.h> +#include #include "../cmdhfmfhard.h" typedef struct bitflip_info { diff --git a/software/src/HardnestedRecovery/hardnested_main.c b/software/src/HardnestedRecovery/hardnested_main.c index 43f422a..b280df8 100644 --- a/software/src/HardnestedRecovery/hardnested_main.c +++ b/software/src/HardnestedRecovery/hardnested_main.c @@ -138,21 +138,30 @@ int main(int argc, char *argv[]) { if (!read_uint32_be(bin_fp, &nt_enc1)) { if (feof(bin_fp)) break; // Expected EOF after last full chunk fprintf(stderr, "Error reading nt_enc1 (BE) from binary file body.\n"); - fclose(bin_fp); fclose(temp_fp); remove(temp_file); return 1; + fclose(bin_fp); + fclose(temp_fp); + remove(temp_file); + return 1; } // *** Use Big-Endian reader for nonces *** if (!read_uint32_be(bin_fp, &nt_enc2)) { // Should not happen if nt_enc1 read succeeded, unless file is truncated fprintf(stderr, "Error reading nt_enc2 (BE) from binary file body (truncated file?).\n"); - fclose(bin_fp); fclose(temp_fp); remove(temp_file); return 1; + fclose(bin_fp); + fclose(temp_fp); + remove(temp_file); + return 1; } // Read packed parity byte (single byte, no endianness issue) if (!read_uint8(bin_fp, &par_packed)) { // Should not happen if nt_enc2 read succeeded, unless file is truncated fprintf(stderr, "Error reading packed parity from binary file body (truncated file?).\n"); - fclose(bin_fp); fclose(temp_fp); remove(temp_file); return 1; + fclose(bin_fp); + fclose(temp_fp); + remove(temp_file); + return 1; } // Extract individual parities @@ -162,11 +171,17 @@ int main(int argc, char *argv[]) { // Write both nonce/parity pairs to temp file in expected text format if (fprintf(temp_fp, "%u|%u\n", nt_enc1, par_enc1) < 0) { perror("Error writing nt_enc1 pair to temporary file"); - fclose(bin_fp); fclose(temp_fp); remove(temp_file); return 1; + fclose(bin_fp); + fclose(temp_fp); + remove(temp_file); + return 1; } if (fprintf(temp_fp, "%u|%u\n", nt_enc2, par_enc2) < 0) { perror("Error writing nt_enc2 pair to temporary file"); - fclose(bin_fp); fclose(temp_fp); remove(temp_file); return 1; + fclose(bin_fp); + fclose(temp_fp); + remove(temp_file); + return 1; } nonces_processed++; diff --git a/software/src/HardnestedRecovery/parity.h b/software/src/HardnestedRecovery/parity.h index 23f61d4..9f63017 100755 --- a/software/src/HardnestedRecovery/parity.h +++ b/software/src/HardnestedRecovery/parity.h @@ -109,4 +109,4 @@ static inline uint8_t oddparity32(uint32_t x) { #endif } -#endif /* __PARITY_H */ \ No newline at end of file +#endif /* __PARITY_H */ diff --git a/software/src/HardnestedRecovery/pm3/commonutil.c b/software/src/HardnestedRecovery/pm3/commonutil.c index 1d9449e..c8139b8 100755 --- a/software/src/HardnestedRecovery/pm3/commonutil.c +++ b/software/src/HardnestedRecovery/pm3/commonutil.c @@ -24,4 +24,4 @@ uint64_t bytes_to_num(uint8_t *src, size_t len) { src++; } return num; -} \ No newline at end of file +} diff --git a/software/src/HardnestedRecovery/pm3/ui.c b/software/src/HardnestedRecovery/pm3/ui.c index 8050988..5e2e15e 100755 --- a/software/src/HardnestedRecovery/pm3/ui.c +++ b/software/src/HardnestedRecovery/pm3/ui.c @@ -19,491 +19,492 @@ /* Ensure strtok_r is available even with -std=c99; must be included before */ - #include "ui.h" - #include "commonutil.h" // ARRAYLEN - #include // for Mingw readline - #include - #include - - #if defined(HAVE_READLINE) - //Load readline after stdio.h - #include - #endif - - #include "util.h" - - #ifdef _WIN32 - # include // _mkdir - #endif - - #include "emojis.h" - #include "emojis_alt.h" - #include - - session_arg_t g_session; - - static bool flushAfterWrite = false; - static void fPrintAndLog(FILE *stream, const char *fmt, ...); - - #ifdef _WIN32 - #define MKDIR_CHK _mkdir(path) - // STRTOK macro removed - replaced with conditional calls below - #else - #define MKDIR_CHK mkdir(path, 0700) - // STRTOK macro removed - replaced with conditional calls below - #endif - - static uint8_t PrintAndLogEx_spinidx = 0; - - void PrintAndLogEx(logLevel_t level, const char *fmt, ...) { - - // skip debug messages if client debugging is turned off i.e. 'DATA SETDEBUG -0' - if (g_debugMode == 0 && level == DEBUG) - return; - - // skip HINT messages if client has hints turned off i.e. 'HINT 0' - if (g_session.show_hints == false && level == HINT) - return; - - char prefix[40] = {0}; - char buffer[MAX_PRINT_BUFFER] = {0}; - char buffer2[MAX_PRINT_BUFFER + sizeof(prefix)] = {0}; - char *token = NULL; - char *tmp_ptr = NULL; // Save pointer for strtok_r/strtok_s - FILE *stream = stdout; - const char *spinner[] = {_YELLOW_("[\\]"), _YELLOW_("[|]"), _YELLOW_("[/]"), _YELLOW_("[-]")}; - const char *spinner_emoji[] = {" :clock1: ", " :clock2: ", " :clock3: ", " :clock4: ", " :clock5: ", " :clock6: ", - " :clock7: ", " :clock8: ", " :clock9: ", " :clock10: ", " :clock11: ", - " :clock12: "}; - switch (level) { - case ERR: - if (g_session.emoji_mode == EMO_EMOJI) - strncpy(prefix, "[" _RED_("!!") "] :rotating_light: ", sizeof(prefix) - 1); - else - strncpy(prefix, "[" _RED_("!!") "] ", sizeof(prefix) - 1); - stream = stderr; - break; - case FAILED: - if (g_session.emoji_mode == EMO_EMOJI) - strncpy(prefix, "[" _RED_("-") "] :no_entry: ", sizeof(prefix) - 1); - else - strncpy(prefix, "[" _RED_("-") "] ", sizeof(prefix) - 1); - break; - case DEBUG: - strncpy(prefix, "[" _BLUE_("#") "] ", sizeof(prefix) - 1); - break; - case HINT: - strncpy(prefix, "[" _YELLOW_("?") "] ", sizeof(prefix) - 1); - break; - case SUCCESS: - strncpy(prefix, "[" _GREEN_("+") "] ", sizeof(prefix) - 1); - break; - case WARNING: - if (g_session.emoji_mode == EMO_EMOJI) - strncpy(prefix, "[" _CYAN_("!") "] :warning: ", sizeof(prefix) - 1); - else - strncpy(prefix, "[" _CYAN_("!") "] ", sizeof(prefix) - 1); - break; - case INFO: - strncpy(prefix, "[" _YELLOW_("=") "] ", sizeof(prefix) - 1); - break; - case INPLACE: - if (g_session.emoji_mode == EMO_EMOJI) { - strncpy(prefix, spinner_emoji[PrintAndLogEx_spinidx], sizeof(prefix) - 1); - PrintAndLogEx_spinidx++; - if (PrintAndLogEx_spinidx >= ARRAYLEN(spinner_emoji)) - PrintAndLogEx_spinidx = 0; - } else { - strncpy(prefix, spinner[PrintAndLogEx_spinidx], sizeof(prefix) - 1); - PrintAndLogEx_spinidx++; - if (PrintAndLogEx_spinidx >= ARRAYLEN(spinner)) - PrintAndLogEx_spinidx = 0; - } - break; - case NORMAL: - // no prefixes for normal - break; - } - - va_list args; - va_start(args, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, args); - va_end(args); - - // no prefixes for normal & inplace - if (level == NORMAL) { - fPrintAndLog(stream, "%s", buffer); - return; - } - - if (strchr(buffer, '\n')) { - - const char delim[2] = "\n"; - - // line starts with newline - if (buffer[0] == '\n') - fPrintAndLog(stream, ""); - - // Use platform-specific strtok - #if defined(_WIN32) && defined(_MSC_VER) - token = strtok_s(buffer, delim, &tmp_ptr); // Use strtok_s for MSVC - #else - token = strtok_r(buffer, delim, &tmp_ptr); // Use strtok_r for POSIX - #endif - - while (token != NULL) { - - size_t size = strlen(buffer2); - - if (strlen(token)) - snprintf(buffer2 + size, sizeof(buffer2) - size, "%s%s\n", prefix, token); - else - snprintf(buffer2 + size, sizeof(buffer2) - size, "\n"); - - // Use platform-specific strtok for subsequent calls - #if defined(_WIN32) && defined(_MSC_VER) - token = strtok_s(NULL, delim, &tmp_ptr); // Use strtok_s for MSVC - #else - token = strtok_r(NULL, delim, &tmp_ptr); // Use strtok_r for POSIX - #endif - } - fPrintAndLog(stream, "%s", buffer2); - } else { - snprintf(buffer2, sizeof(buffer2), "%s%s", prefix, buffer); - if (level == INPLACE) { - char buffer3[sizeof(buffer2)] = {0}; - char buffer4[sizeof(buffer2)] = {0}; - memcpy_filter_ansi(buffer3, buffer2, sizeof(buffer2), !g_session.supports_colors); - memcpy_filter_emoji(buffer4, buffer3, sizeof(buffer3), g_session.emoji_mode); - fprintf(stream, "\r%s", buffer4); - fflush(stream); - } else { - fPrintAndLog(stream, "%s", buffer2); - } - } - } - - static void fPrintAndLog(FILE *stream, const char *fmt, ...) { - va_list argptr; - static FILE *logfile = NULL; - static int logging = 1; // TODO: This is immediately set to 0 below, review logging logic - char buffer[MAX_PRINT_BUFFER] = {0}; - char buffer2[MAX_PRINT_BUFFER] = {0}; - char buffer3[MAX_PRINT_BUFFER] = {0}; - // lock this section to avoid interlacing prints from different threads - bool linefeed = true; - - logging = 0; // TODO: This disables file logging. Is this intended? - - - // If there is an incoming message from the hardware (eg: lf hid read) in - // the background (while the prompt is displayed and accepting user input), - // stash the prompt and bring it back later. - #ifdef RL_STATE_READCMD - // We are using GNU readline. libedit (OSX) doesn't support this flag. - int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0; - char *saved_line = NULL; // Initialize to NULL - int saved_point = 0; // Initialize to 0 - - if (need_hack) { - saved_point = rl_point; - saved_line = rl_copy_text(0, rl_end); - rl_save_prompt(); - rl_replace_line("", 0); - rl_redisplay(); - } - #endif - - va_start(argptr, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, argptr); - va_end(argptr); - if (strlen(buffer) > 0 && buffer[strlen(buffer) - 1] == NOLF[0]) { - linefeed = false; - buffer[strlen(buffer) - 1] = 0; - } - bool filter_ansi = !g_session.supports_colors; - memcpy_filter_ansi(buffer2, buffer, sizeof(buffer), filter_ansi); - if (g_printAndLog & PRINTANDLOG_PRINT) { - memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), g_session.emoji_mode); - fprintf(stream, "%s", buffer3); - if (linefeed) - fprintf(stream, "\n"); - } - - #ifdef RL_STATE_READCMD - // We are using GNU readline. libedit (OSX) doesn't support this flag. - if (need_hack) { - rl_restore_prompt(); - rl_replace_line(saved_line, 0); - rl_point = saved_point; - rl_redisplay(); - free(saved_line); // Free the copied text - } - #endif - - // TODO: Review logging logic. 'logging' is always 0 here. - if ((g_printAndLog & PRINTANDLOG_LOG) && logging && logfile) { - memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), EMO_ALTTEXT); - if (filter_ansi) { // already done - fprintf(logfile, "%s", buffer3); - } else { - memcpy_filter_ansi(buffer, buffer3, sizeof(buffer3), true); - fprintf(logfile, "%s", buffer); - } - if (linefeed) - fprintf(logfile, "\n"); - fflush(logfile); - } - - if (flushAfterWrite) - fflush(stdout); - } - - void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { - if (!dest || !src) return; // Basic null check - - if (filter) { - // Filter out ANSI sequences on these OS - uint8_t *rdest = (uint8_t *) dest; - const uint8_t *rsrc = (const uint8_t *) src; // Use const for source - size_t si = 0; // Use size_t for index - size_t i = 0; - - // Ensure we don't write past the destination buffer boundary 'n' - while (i < n && si < n) { - // Check for ESC character '\x1b' - if (rsrc[i] == '\x1b') { - // Check for Control Sequence Introducer (CSI) '[', or other single-char sequences - if (i + 1 < n) { - if (rsrc[i + 1] == '[') { // CSI sequence - i += 2; // Skip ESC and '[' - // Skip parameter bytes (0x30-0x3F) - while (i < n && rsrc[i] >= 0x30 && rsrc[i] <= 0x3F) { - i++; - } - // Skip intermediate bytes (0x20-0x2F) - while (i < n && rsrc[i] >= 0x20 && rsrc[i] <= 0x2F) { - i++; - } - // Check for final byte (0x40-0x7E) - if (i < n && rsrc[i] >= 0x40 && rsrc[i] <= 0x7E) { - i++; // Skip the final byte - continue; // Continue to next character after sequence - } - // If sequence is incomplete or invalid, backtrack 'i' to avoid skipping valid chars - // This part is tricky; for simplicity, we might just copy the partial sequence - // if it doesn't end correctly. A more robust parser might be needed. - // For now, let's assume sequences are well-formed or we just skip ESC+[ - // and let the rest be copied if it doesn't match the pattern. - // If we reached here, the sequence was malformed after '['. - // We already skipped ESC and '[', so just continue processing from current 'i'. - - } else if (rsrc[i + 1] >= 0x40 && rsrc[i + 1] <= 0x5F) { // Single char sequence after ESC - i += 2; // Skip ESC and the command character - continue; // Continue to next character - } else { - // Not a recognized sequence start after ESC, copy ESC and continue - if (si < n) rdest[si++] = rsrc[i]; - i++; - } - } else { - // ESC at the very end of the buffer, copy it - if (si < n) rdest[si++] = rsrc[i]; - i++; - } - } else { - // Not an ESC character, copy normally - if (si < n) rdest[si++] = rsrc[i]; - i++; - } - } - // Null-terminate if there's space, assuming dest is a string buffer - if (si < n) { - rdest[si] = '\0'; - } else if (n > 0) { - rdest[n - 1] = '\0'; // Ensure null termination even if truncated - } - - } else { - memcpy(dest, src, n); - } - } - - - static bool - emojify_token(const char *token, uint8_t token_length, const char **emojified_token, uint8_t *emojified_token_length, - emojiMode_t mode) { - // Basic null checks - if (!token || !emojified_token || !emojified_token_length) return false; - - // Iterate through the EmojiTable - for (int i = 0; EmojiTable[i].alias != NULL; ++i) { // Check alias for NULL - // Check if alias length matches and content is the same - if ((strlen(EmojiTable[i].alias) == token_length) && - (memcmp(EmojiTable[i].alias, token, token_length) == 0)) { - - switch (mode) { - case EMO_EMOJI: { - if (EmojiTable[i].emoji) { // Check emoji for NULL - *emojified_token = EmojiTable[i].emoji; - *emojified_token_length = strlen(EmojiTable[i].emoji); - return true; - } - break; // Should not happen if table is well-formed, but good practice - } - case EMO_ALTTEXT: { - *emojified_token_length = 0; // Default to 0 if not found in AltTable - // Search in EmojiAltTable - for (int j = 0; EmojiAltTable[j].alias != NULL; ++j) { // Check alias for NULL - if ((strlen(EmojiAltTable[j].alias) == token_length) && - (memcmp(EmojiAltTable[j].alias, token, token_length) == 0)) { - if (EmojiAltTable[j].alttext) { // Check alttext for NULL - *emojified_token = EmojiAltTable[j].alttext; - *emojified_token_length = strlen(EmojiAltTable[j].alttext); - } - return true; // Found alias, return even if alttext is NULL (length will be 0) - } - } - // Alias found in EmojiTable but not EmojiAltTable, return true with length 0 - return true; - } - case EMO_NONE: { - *emojified_token_length = 0; - return true; // Alias found, but mode is NONE - } - case EMO_ALIAS: { // This mode means "do nothing", should not be handled here - return false; // Indicate no replacement happened - } - } - // If we fall through the switch (e.g., EMO_EMOJI but emoji is NULL), return false - return false; - } - } - // Token not found in EmojiTable - return false; - } - - - static bool token_charset(uint8_t c) { - if ((c >= '0') && (c <= '9')) return true; - if ((c >= 'a') && (c <= 'z')) return true; - if ((c >= 'A') && (c <= 'Z')) return true; - if ((c == '_') || (c == '+') || (c == '-')) return true; - return false; - } - - void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode) { - if (!dest || !src) return; // Basic null check - - if (mode == EMO_ALIAS) { - // If mode is ALIAS, just copy the source to destination - memcpy(dest, src, n); - // Ensure null termination if possible and if dest is treated as string - if (n > 0) { - ((char *)dest)[n - 1] = '\0'; - } - return; - } - - // tokenize emoji - const char *emojified_token = NULL; - uint8_t emojified_token_length = 0; - const char *current_token_start = NULL; // Use const char* for source pointers - uint8_t current_token_length = 0; - char *rdest = (char *) dest; - const char *rsrc = (const char *) src; // Use const char* for source pointers - size_t si = 0; // Use size_t for destination index - - for (size_t i = 0; i < n && si < n; /* i incremented inside loop */) { - char current_char = rsrc[i]; - - if (current_token_length == 0) { - // Not currently inside a potential emoji token - if (current_char == ':') { - // Start of a potential token - current_token_start = rsrc + i; - current_token_length = 1; - i++; - } else { - // Regular character, copy to destination - if (si < n) rdest[si++] = current_char; - i++; - } - } else { - // Currently inside a potential emoji token (started with ':') - if (current_char == ':') { - // End of a potential token - current_token_length++; // Include the closing ':' - if (emojify_token(current_token_start, current_token_length, &emojified_token, &emojified_token_length, mode)) { - // Valid emoji token found, copy replacement (or nothing if length is 0) - if (si + emojified_token_length <= n) { // Check bounds before copying - memcpy(rdest + si, emojified_token, emojified_token_length); - si += emojified_token_length; - } else { - // Not enough space for the replacement, copy what fits - size_t fits = n - si; - memcpy(rdest + si, emojified_token, fits); - si += fits; - // Buffer full, break loop - break; - } - } else { - // Not a valid emoji token (e.g., "::" or ":invalid:"), copy original token - if (si + current_token_length <= n) { // Check bounds - memcpy(rdest + si, current_token_start, current_token_length); - si += current_token_length; - } else { - size_t fits = n - si; - memcpy(rdest + si, current_token_start, fits); - si += fits; - break; // Buffer full - } - } - // Reset token state - current_token_length = 0; - current_token_start = NULL; - i++; // Move past the closing ':' - } else if (token_charset(current_char)) { - // Character is valid within an emoji token, extend current token - current_token_length++; - i++; - } else { - // Invalid character within a potential token (e.g., ":abc def:") - // Copy the token so far (including the starting ':') and the invalid char - if (si + current_token_length + 1 <= n) { // Check bounds - memcpy(rdest + si, current_token_start, current_token_length); - si += current_token_length; - rdest[si++] = current_char; // Copy the invalid character - } else { - // Not enough space, copy what fits from token and potentially the char - size_t fits_token = (n - si > current_token_length) ? current_token_length : n - si; - memcpy(rdest + si, current_token_start, fits_token); - si += fits_token; - if (si < n) { // If there's still space for the invalid char - rdest[si++] = current_char; - } - break; // Buffer full - } - // Reset token state - current_token_length = 0; - current_token_start = NULL; - i++; // Move past the invalid character - } - } - } - - // If loop finished while inside a potential token (e.g., source ends with ":abc") - if (current_token_length > 0 && si < n) { - size_t fits = (n - si > current_token_length) ? current_token_length : n - si; - memcpy(rdest + si, current_token_start, fits); - si += fits; - } - - // Null-terminate the destination buffer if there's space - if (si < n) { - rdest[si] = '\0'; - } else if (n > 0) { - rdest[n - 1] = '\0'; // Ensure null termination even if truncated - } - } - \ No newline at end of file +#include "ui.h" +#include "commonutil.h" // ARRAYLEN +#include // for Mingw readline +#include +#include + +#if defined(HAVE_READLINE) +//Load readline after stdio.h +#include +#endif + +#include "util.h" + +#ifdef _WIN32 +# include // _mkdir +#endif + +#include "emojis.h" +#include "emojis_alt.h" +#include + +session_arg_t g_session; + +static bool flushAfterWrite = false; +static void fPrintAndLog(FILE *stream, const char *fmt, ...); + +#ifdef _WIN32 +#define MKDIR_CHK _mkdir(path) +// STRTOK macro removed - replaced with conditional calls below +#else +#define MKDIR_CHK mkdir(path, 0700) +// STRTOK macro removed - replaced with conditional calls below +#endif + +static uint8_t PrintAndLogEx_spinidx = 0; + +void PrintAndLogEx(logLevel_t level, const char *fmt, ...) { + + // skip debug messages if client debugging is turned off i.e. 'DATA SETDEBUG -0' + if (g_debugMode == 0 && level == DEBUG) + return; + + // skip HINT messages if client has hints turned off i.e. 'HINT 0' + if (g_session.show_hints == false && level == HINT) + return; + + char prefix[40] = {0}; + char buffer[MAX_PRINT_BUFFER] = {0}; + char buffer2[MAX_PRINT_BUFFER + sizeof(prefix)] = {0}; + char *token = NULL; + char *tmp_ptr = NULL; // Save pointer for strtok_r/strtok_s + FILE *stream = stdout; + const char *spinner[] = {_YELLOW_("[\\]"), _YELLOW_("[|]"), _YELLOW_("[/]"), _YELLOW_("[-]")}; + const char *spinner_emoji[] = {" :clock1: ", " :clock2: ", " :clock3: ", " :clock4: ", " :clock5: ", " :clock6: ", + " :clock7: ", " :clock8: ", " :clock9: ", " :clock10: ", " :clock11: ", + " :clock12: " + }; + switch (level) { + case ERR: + if (g_session.emoji_mode == EMO_EMOJI) + strncpy(prefix, "[" _RED_("!!") "] :rotating_light: ", sizeof(prefix) - 1); + else + strncpy(prefix, "[" _RED_("!!") "] ", sizeof(prefix) - 1); + stream = stderr; + break; + case FAILED: + if (g_session.emoji_mode == EMO_EMOJI) + strncpy(prefix, "[" _RED_("-") "] :no_entry: ", sizeof(prefix) - 1); + else + strncpy(prefix, "[" _RED_("-") "] ", sizeof(prefix) - 1); + break; + case DEBUG: + strncpy(prefix, "[" _BLUE_("#") "] ", sizeof(prefix) - 1); + break; + case HINT: + strncpy(prefix, "[" _YELLOW_("?") "] ", sizeof(prefix) - 1); + break; + case SUCCESS: + strncpy(prefix, "[" _GREEN_("+") "] ", sizeof(prefix) - 1); + break; + case WARNING: + if (g_session.emoji_mode == EMO_EMOJI) + strncpy(prefix, "[" _CYAN_("!") "] :warning: ", sizeof(prefix) - 1); + else + strncpy(prefix, "[" _CYAN_("!") "] ", sizeof(prefix) - 1); + break; + case INFO: + strncpy(prefix, "[" _YELLOW_("=") "] ", sizeof(prefix) - 1); + break; + case INPLACE: + if (g_session.emoji_mode == EMO_EMOJI) { + strncpy(prefix, spinner_emoji[PrintAndLogEx_spinidx], sizeof(prefix) - 1); + PrintAndLogEx_spinidx++; + if (PrintAndLogEx_spinidx >= ARRAYLEN(spinner_emoji)) + PrintAndLogEx_spinidx = 0; + } else { + strncpy(prefix, spinner[PrintAndLogEx_spinidx], sizeof(prefix) - 1); + PrintAndLogEx_spinidx++; + if (PrintAndLogEx_spinidx >= ARRAYLEN(spinner)) + PrintAndLogEx_spinidx = 0; + } + break; + case NORMAL: + // no prefixes for normal + break; + } + + va_list args; + va_start(args, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, args); + va_end(args); + + // no prefixes for normal & inplace + if (level == NORMAL) { + fPrintAndLog(stream, "%s", buffer); + return; + } + + if (strchr(buffer, '\n')) { + + const char delim[2] = "\n"; + + // line starts with newline + if (buffer[0] == '\n') + fPrintAndLog(stream, ""); + + // Use platform-specific strtok +#if defined(_WIN32) && defined(_MSC_VER) + token = strtok_s(buffer, delim, &tmp_ptr); // Use strtok_s for MSVC +#else + token = strtok_r(buffer, delim, &tmp_ptr); // Use strtok_r for POSIX +#endif + + while (token != NULL) { + + size_t size = strlen(buffer2); + + if (strlen(token)) + snprintf(buffer2 + size, sizeof(buffer2) - size, "%s%s\n", prefix, token); + else + snprintf(buffer2 + size, sizeof(buffer2) - size, "\n"); + + // Use platform-specific strtok for subsequent calls +#if defined(_WIN32) && defined(_MSC_VER) + token = strtok_s(NULL, delim, &tmp_ptr); // Use strtok_s for MSVC +#else + token = strtok_r(NULL, delim, &tmp_ptr); // Use strtok_r for POSIX +#endif + } + fPrintAndLog(stream, "%s", buffer2); + } else { + snprintf(buffer2, sizeof(buffer2), "%s%s", prefix, buffer); + if (level == INPLACE) { + char buffer3[sizeof(buffer2)] = {0}; + char buffer4[sizeof(buffer2)] = {0}; + memcpy_filter_ansi(buffer3, buffer2, sizeof(buffer2), !g_session.supports_colors); + memcpy_filter_emoji(buffer4, buffer3, sizeof(buffer3), g_session.emoji_mode); + fprintf(stream, "\r%s", buffer4); + fflush(stream); + } else { + fPrintAndLog(stream, "%s", buffer2); + } + } +} + +static void fPrintAndLog(FILE *stream, const char *fmt, ...) { + va_list argptr; + static FILE *logfile = NULL; + static int logging = 1; // TODO: This is immediately set to 0 below, review logging logic + char buffer[MAX_PRINT_BUFFER] = {0}; + char buffer2[MAX_PRINT_BUFFER] = {0}; + char buffer3[MAX_PRINT_BUFFER] = {0}; + // lock this section to avoid interlacing prints from different threads + bool linefeed = true; + + logging = 0; // TODO: This disables file logging. Is this intended? + + +// If there is an incoming message from the hardware (eg: lf hid read) in +// the background (while the prompt is displayed and accepting user input), +// stash the prompt and bring it back later. +#ifdef RL_STATE_READCMD + // We are using GNU readline. libedit (OSX) doesn't support this flag. + int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0; + char *saved_line = NULL; // Initialize to NULL + int saved_point = 0; // Initialize to 0 + + if (need_hack) { + saved_point = rl_point; + saved_line = rl_copy_text(0, rl_end); + rl_save_prompt(); + rl_replace_line("", 0); + rl_redisplay(); + } +#endif + + va_start(argptr, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, argptr); + va_end(argptr); + if (strlen(buffer) > 0 && buffer[strlen(buffer) - 1] == NOLF[0]) { + linefeed = false; + buffer[strlen(buffer) - 1] = 0; + } + bool filter_ansi = !g_session.supports_colors; + memcpy_filter_ansi(buffer2, buffer, sizeof(buffer), filter_ansi); + if (g_printAndLog & PRINTANDLOG_PRINT) { + memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), g_session.emoji_mode); + fprintf(stream, "%s", buffer3); + if (linefeed) + fprintf(stream, "\n"); + } + +#ifdef RL_STATE_READCMD + // We are using GNU readline. libedit (OSX) doesn't support this flag. + if (need_hack) { + rl_restore_prompt(); + rl_replace_line(saved_line, 0); + rl_point = saved_point; + rl_redisplay(); + free(saved_line); // Free the copied text + } +#endif + + // TODO: Review logging logic. 'logging' is always 0 here. + if ((g_printAndLog & PRINTANDLOG_LOG) && logging && logfile) { + memcpy_filter_emoji(buffer3, buffer2, sizeof(buffer2), EMO_ALTTEXT); + if (filter_ansi) { // already done + fprintf(logfile, "%s", buffer3); + } else { + memcpy_filter_ansi(buffer, buffer3, sizeof(buffer3), true); + fprintf(logfile, "%s", buffer); + } + if (linefeed) + fprintf(logfile, "\n"); + fflush(logfile); + } + + if (flushAfterWrite) + fflush(stdout); +} + +void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) { + if (!dest || !src) return; // Basic null check + + if (filter) { + // Filter out ANSI sequences on these OS + uint8_t *rdest = (uint8_t *) dest; + const uint8_t *rsrc = (const uint8_t *) src; // Use const for source + size_t si = 0; // Use size_t for index + size_t i = 0; + + // Ensure we don't write past the destination buffer boundary 'n' + while (i < n && si < n) { + // Check for ESC character '\x1b' + if (rsrc[i] == '\x1b') { + // Check for Control Sequence Introducer (CSI) '[', or other single-char sequences + if (i + 1 < n) { + if (rsrc[i + 1] == '[') { // CSI sequence + i += 2; // Skip ESC and '[' + // Skip parameter bytes (0x30-0x3F) + while (i < n && rsrc[i] >= 0x30 && rsrc[i] <= 0x3F) { + i++; + } + // Skip intermediate bytes (0x20-0x2F) + while (i < n && rsrc[i] >= 0x20 && rsrc[i] <= 0x2F) { + i++; + } + // Check for final byte (0x40-0x7E) + if (i < n && rsrc[i] >= 0x40 && rsrc[i] <= 0x7E) { + i++; // Skip the final byte + continue; // Continue to next character after sequence + } + // If sequence is incomplete or invalid, backtrack 'i' to avoid skipping valid chars + // This part is tricky; for simplicity, we might just copy the partial sequence + // if it doesn't end correctly. A more robust parser might be needed. + // For now, let's assume sequences are well-formed or we just skip ESC+[ + // and let the rest be copied if it doesn't match the pattern. + // If we reached here, the sequence was malformed after '['. + // We already skipped ESC and '[', so just continue processing from current 'i'. + + } else if (rsrc[i + 1] >= 0x40 && rsrc[i + 1] <= 0x5F) { // Single char sequence after ESC + i += 2; // Skip ESC and the command character + continue; // Continue to next character + } else { + // Not a recognized sequence start after ESC, copy ESC and continue + if (si < n) rdest[si++] = rsrc[i]; + i++; + } + } else { + // ESC at the very end of the buffer, copy it + if (si < n) rdest[si++] = rsrc[i]; + i++; + } + } else { + // Not an ESC character, copy normally + if (si < n) rdest[si++] = rsrc[i]; + i++; + } + } + // Null-terminate if there's space, assuming dest is a string buffer + if (si < n) { + rdest[si] = '\0'; + } else if (n > 0) { + rdest[n - 1] = '\0'; // Ensure null termination even if truncated + } + + } else { + memcpy(dest, src, n); + } +} + + +static bool +emojify_token(const char *token, uint8_t token_length, const char **emojified_token, uint8_t *emojified_token_length, + emojiMode_t mode) { + // Basic null checks + if (!token || !emojified_token || !emojified_token_length) return false; + + // Iterate through the EmojiTable + for (int i = 0; EmojiTable[i].alias != NULL; ++i) { // Check alias for NULL + // Check if alias length matches and content is the same + if ((strlen(EmojiTable[i].alias) == token_length) && + (memcmp(EmojiTable[i].alias, token, token_length) == 0)) { + + switch (mode) { + case EMO_EMOJI: { + if (EmojiTable[i].emoji) { // Check emoji for NULL + *emojified_token = EmojiTable[i].emoji; + *emojified_token_length = strlen(EmojiTable[i].emoji); + return true; + } + break; // Should not happen if table is well-formed, but good practice + } + case EMO_ALTTEXT: { + *emojified_token_length = 0; // Default to 0 if not found in AltTable + // Search in EmojiAltTable + for (int j = 0; EmojiAltTable[j].alias != NULL; ++j) { // Check alias for NULL + if ((strlen(EmojiAltTable[j].alias) == token_length) && + (memcmp(EmojiAltTable[j].alias, token, token_length) == 0)) { + if (EmojiAltTable[j].alttext) { // Check alttext for NULL + *emojified_token = EmojiAltTable[j].alttext; + *emojified_token_length = strlen(EmojiAltTable[j].alttext); + } + return true; // Found alias, return even if alttext is NULL (length will be 0) + } + } + // Alias found in EmojiTable but not EmojiAltTable, return true with length 0 + return true; + } + case EMO_NONE: { + *emojified_token_length = 0; + return true; // Alias found, but mode is NONE + } + case EMO_ALIAS: { // This mode means "do nothing", should not be handled here + return false; // Indicate no replacement happened + } + } + // If we fall through the switch (e.g., EMO_EMOJI but emoji is NULL), return false + return false; + } + } + // Token not found in EmojiTable + return false; +} + + +static bool token_charset(uint8_t c) { + if ((c >= '0') && (c <= '9')) return true; + if ((c >= 'a') && (c <= 'z')) return true; + if ((c >= 'A') && (c <= 'Z')) return true; + if ((c == '_') || (c == '+') || (c == '-')) return true; + return false; +} + +void memcpy_filter_emoji(void *dest, const void *src, size_t n, emojiMode_t mode) { + if (!dest || !src) return; // Basic null check + + if (mode == EMO_ALIAS) { + // If mode is ALIAS, just copy the source to destination + memcpy(dest, src, n); + // Ensure null termination if possible and if dest is treated as string + if (n > 0) { + ((char *)dest)[n - 1] = '\0'; + } + return; + } + + // tokenize emoji + const char *emojified_token = NULL; + uint8_t emojified_token_length = 0; + const char *current_token_start = NULL; // Use const char* for source pointers + uint8_t current_token_length = 0; + char *rdest = (char *) dest; + const char *rsrc = (const char *) src; // Use const char* for source pointers + size_t si = 0; // Use size_t for destination index + + for (size_t i = 0; i < n && si < n; /* i incremented inside loop */) { + char current_char = rsrc[i]; + + if (current_token_length == 0) { + // Not currently inside a potential emoji token + if (current_char == ':') { + // Start of a potential token + current_token_start = rsrc + i; + current_token_length = 1; + i++; + } else { + // Regular character, copy to destination + if (si < n) rdest[si++] = current_char; + i++; + } + } else { + // Currently inside a potential emoji token (started with ':') + if (current_char == ':') { + // End of a potential token + current_token_length++; // Include the closing ':' + if (emojify_token(current_token_start, current_token_length, &emojified_token, &emojified_token_length, mode)) { + // Valid emoji token found, copy replacement (or nothing if length is 0) + if (si + emojified_token_length <= n) { // Check bounds before copying + memcpy(rdest + si, emojified_token, emojified_token_length); + si += emojified_token_length; + } else { + // Not enough space for the replacement, copy what fits + size_t fits = n - si; + memcpy(rdest + si, emojified_token, fits); + si += fits; + // Buffer full, break loop + break; + } + } else { + // Not a valid emoji token (e.g., "::" or ":invalid:"), copy original token + if (si + current_token_length <= n) { // Check bounds + memcpy(rdest + si, current_token_start, current_token_length); + si += current_token_length; + } else { + size_t fits = n - si; + memcpy(rdest + si, current_token_start, fits); + si += fits; + break; // Buffer full + } + } + // Reset token state + current_token_length = 0; + current_token_start = NULL; + i++; // Move past the closing ':' + } else if (token_charset(current_char)) { + // Character is valid within an emoji token, extend current token + current_token_length++; + i++; + } else { + // Invalid character within a potential token (e.g., ":abc def:") + // Copy the token so far (including the starting ':') and the invalid char + if (si + current_token_length + 1 <= n) { // Check bounds + memcpy(rdest + si, current_token_start, current_token_length); + si += current_token_length; + rdest[si++] = current_char; // Copy the invalid character + } else { + // Not enough space, copy what fits from token and potentially the char + size_t fits_token = (n - si > current_token_length) ? current_token_length : n - si; + memcpy(rdest + si, current_token_start, fits_token); + si += fits_token; + if (si < n) { // If there's still space for the invalid char + rdest[si++] = current_char; + } + break; // Buffer full + } + // Reset token state + current_token_length = 0; + current_token_start = NULL; + i++; // Move past the invalid character + } + } + } + + // If loop finished while inside a potential token (e.g., source ends with ":abc") + if (current_token_length > 0 && si < n) { + size_t fits = (n - si > current_token_length) ? current_token_length : n - si; + memcpy(rdest + si, current_token_start, fits); + si += fits; + } + + // Null-terminate the destination buffer if there's space + if (si < n) { + rdest[si] = '\0'; + } else if (n > 0) { + rdest[n - 1] = '\0'; // Ensure null termination even if truncated + } +} + diff --git a/software/src/compat/fmemopen/libfmemopen.c b/software/src/compat/fmemopen/libfmemopen.c index 0fb233b..792656f 100644 --- a/software/src/compat/fmemopen/libfmemopen.c +++ b/software/src/compat/fmemopen/libfmemopen.c @@ -6,31 +6,30 @@ #include "libfmemopen.h" /* https://github.com/Arryboom/fmemopen_windows */ -FILE *fmemopen(void *buf, size_t len, const char *type) -{ - int fd; - FILE *fp; - char tp[MAX_PATH - 13]; - char fn[MAX_PATH + 1]; - int * pfd = &fd; - int retner = -1; - char tfname[] = "MemTF_"; - if (!GetTempPathA(sizeof(tp), tp)) - return NULL; - if (!GetTempFileNameA(tp, tfname, 0, fn)) - return NULL; - retner = _sopen_s(pfd, fn, _O_CREAT | _O_SHORT_LIVED | _O_TEMPORARY | _O_RDWR | _O_BINARY | _O_NOINHERIT, _SH_DENYRW, _S_IREAD | _S_IWRITE); - if (retner != 0) - return NULL; - if (fd == -1) - return NULL; - fp = _fdopen(fd, "wb+"); - if (!fp) { - _close(fd); - return NULL; - } - /*File descriptors passed into _fdopen are owned by the returned FILE * stream.If _fdopen is successful, do not call _close on the file descriptor.Calling fclose on the returned FILE * also closes the file descriptor.*/ - fwrite(buf, len, 1, fp); - rewind(fp); - return fp; +FILE *fmemopen(void *buf, size_t len, const char *type) { + int fd; + FILE *fp; + char tp[MAX_PATH - 13]; + char fn[MAX_PATH + 1]; + int *pfd = &fd; + int retner = -1; + char tfname[] = "MemTF_"; + if (!GetTempPathA(sizeof(tp), tp)) + return NULL; + if (!GetTempFileNameA(tp, tfname, 0, fn)) + return NULL; + retner = _sopen_s(pfd, fn, _O_CREAT | _O_SHORT_LIVED | _O_TEMPORARY | _O_RDWR | _O_BINARY | _O_NOINHERIT, _SH_DENYRW, _S_IREAD | _S_IWRITE); + if (retner != 0) + return NULL; + if (fd == -1) + return NULL; + fp = _fdopen(fd, "wb+"); + if (!fp) { + _close(fd); + return NULL; + } + /*File descriptors passed into _fdopen are owned by the returned FILE * stream.If _fdopen is successful, do not call _close on the file descriptor.Calling fclose on the returned FILE * also closes the file descriptor.*/ + fwrite(buf, len, 1, fp); + rewind(fp); + return fp; } diff --git a/software/src/darkside.c b/software/src/darkside.c index ecd6674..2295f51 100644 --- a/software/src/darkside.c +++ b/software/src/darkside.c @@ -28,7 +28,7 @@ int main(int argc, char *argv[]) { uint32_t uid = (uint32_t)atoui(argv[1]); uint32_t count = 0, i, j; uint32_t keycount = 0; - uint64_t *keylist = NULL, * last_keylist = NULL; + uint64_t *keylist = NULL, *last_keylist = NULL; DarksideParam *dps = NULL; bool no_key_recover = true; diff --git a/software/src/lib/pthread/ANNOUNCE b/software/src/lib/pthread/ANNOUNCE deleted file mode 100644 index 950c86f..0000000 --- a/software/src/lib/pthread/ANNOUNCE +++ /dev/null @@ -1,483 +0,0 @@ -PTHREADS-WIN32 RELEASE 2.9.0 (2012-05-25) ------------------------------------------ -Web Site: http://sourceware.org/pthreads-win32/ -FTP Site: ftp://sourceware.org/pub/pthreads-win32 -Maintainer: Ross Johnson - - -We are pleased to announce the availability of a new release of -Pthreads-win32, an Open Source Software implementation of the -Threads component of the POSIX 1003.1 2001 Standard for Microsoft's -Win32 environment. Some functions from other sections of POSIX -1003.1 2001 are also supported including semaphores and scheduling -functions. - -Some common non-portable functions are also implemented for -additional compatibility, as are a few functions specific -to pthreads-win32 for easier integration with Win32 applications. - -Pthreads-win32 is free software, distributed under the GNU Lesser -General Public License (LGPL). - - -Acknowledgements ----------------- -This library is based originally on a Win32 pthreads -implementation contributed by John Bossom. - -The implementation of Condition Variables uses algorithms developed -by Alexander Terekhov and Louis Thomas. - -The implementation of POSIX mutexes has been improved by Thomas Pfaff -and later by Alexander Terekhov. - -The implementation of Spinlocks and Barriers was contributed -by Ross Johnson. - -The implementation of read/write locks was contributed by -Aurelio Medina and improved by Alexander Terekhov. - -Many others have contributed significant time and effort to solve crutial -problems in order to make the library workable, robust and reliable. - -Thanks to Xavier Leroy for granting permission to use and modify his -LinuxThreads manual pages. - -Thanks to The Open Group for making the Single Unix Specification -publicly available - many of the manual pages included in the package -were extracted from it. - -There is also a separate CONTRIBUTORS file. This file and others are -on the web site: - - http://sourceware.org/pthreads-win32 - -As much as possible, the ChangeLog file acknowledges contributions to the -code base in more detail. - - -Changes since the last release ------------------------------- -These are now documented in the NEWS file. -See the ChangeLog file also. - - -Known Bugs ----------- -These are now documented in the BUGS file. - - -Level of standards conformance ------------------------------- - -The following POSIX 1003.1 2001 options are defined and set to 200112L: - - _POSIX_THREADS - _POSIX_THREAD_SAFE_FUNCTIONS - _POSIX_THREAD_ATTR_STACKSIZE - _POSIX_THREAD_PRIORITY_SCHEDULING - _POSIX_SEMAPHORES - _POSIX_READER_WRITER_LOCKS - _POSIX_SPIN_LOCKS - _POSIX_BARRIERS - - -The following POSIX 1003.1 2001 options are defined and set to -1: - - _POSIX_THREAD_ATTR_STACKADDR - _POSIX_THREAD_PRIO_INHERIT - _POSIX_THREAD_PRIO_PROTECT - _POSIX_THREAD_PROCESS_SHARED - - -The following POSIX 1003.1 2001 limits are defined and set: - - _POSIX_THREAD_THREADS_MAX - _POSIX_SEM_VALUE_MAX - _POSIX_SEM_NSEMS_MAX - _POSIX_THREAD_KEYS_MAX - _POSIX_THREAD_DESTRUCTOR_ITERATIONS - PTHREAD_STACK_MIN - PTHREAD_THREADS_MAX - SEM_VALUE_MAX - SEM_NSEMS_MAX - PTHREAD_KEYS_MAX - PTHREAD_DESTRUCTOR_ITERATIONS - - -The following functions are implemented: - - --------------------------- - PThreads - --------------------------- - pthread_attr_init - pthread_attr_destroy - pthread_attr_getdetachstate - pthread_attr_getstackaddr - pthread_attr_getstacksize - pthread_attr_setdetachstate - pthread_attr_setstackaddr - pthread_attr_setstacksize - - pthread_create - pthread_detach - pthread_equal - pthread_exit - pthread_join - pthread_once - pthread_self - - pthread_cancel - pthread_cleanup_pop - pthread_cleanup_push - pthread_setcancelstate - pthread_setcanceltype - pthread_testcancel - - --------------------------- - Thread Specific Data - --------------------------- - pthread_key_create - pthread_key_delete - pthread_setspecific - pthread_getspecific - - --------------------------- - Mutexes - --------------------------- - pthread_mutexattr_init - pthread_mutexattr_destroy - pthread_mutexattr_getpshared - pthread_mutexattr_setpshared - pthread_mutexattr_gettype - pthread_mutexattr_settype (types: PTHREAD_MUTEX_DEFAULT - PTHREAD_MUTEX_NORMAL - PTHREAD_MUTEX_ERRORCHECK - PTHREAD_MUTEX_RECURSIVE ) - pthread_mutexattr_getrobust - pthread_mutexattr_setrobust (values: PTHREAD_MUTEX_STALLED - PTHREAD_MUTEX_ROBUST) - pthread_mutex_init - pthread_mutex_destroy - pthread_mutex_lock - pthread_mutex_trylock - pthread_mutex_timedlock - pthread_mutex_unlock - pthread_mutex_consistent - - --------------------------- - Condition Variables - --------------------------- - pthread_condattr_init - pthread_condattr_destroy - pthread_condattr_getpshared - pthread_condattr_setpshared - - pthread_cond_init - pthread_cond_destroy - pthread_cond_wait - pthread_cond_timedwait - pthread_cond_signal - pthread_cond_broadcast - - --------------------------- - Read/Write Locks - --------------------------- - pthread_rwlock_init - pthread_rwlock_destroy - pthread_rwlock_tryrdlock - pthread_rwlock_trywrlock - pthread_rwlock_rdlock - pthread_rwlock_timedrdlock - pthread_rwlock_rwlock - pthread_rwlock_timedwrlock - pthread_rwlock_unlock - pthread_rwlockattr_init - pthread_rwlockattr_destroy - pthread_rwlockattr_getpshared - pthread_rwlockattr_setpshared - - --------------------------- - Spin Locks - --------------------------- - pthread_spin_init - pthread_spin_destroy - pthread_spin_lock - pthread_spin_unlock - pthread_spin_trylock - - --------------------------- - Barriers - --------------------------- - pthread_barrier_init - pthread_barrier_destroy - pthread_barrier_wait - pthread_barrierattr_init - pthread_barrierattr_destroy - pthread_barrierattr_getpshared - pthread_barrierattr_setpshared - - --------------------------- - Semaphores - --------------------------- - sem_init - sem_destroy - sem_post - sem_wait - sem_trywait - sem_timedwait - sem_getvalue (# free if +ve, # of waiters if -ve) - sem_open (returns an error ENOSYS) - sem_close (returns an error ENOSYS) - sem_unlink (returns an error ENOSYS) - - --------------------------- - RealTime Scheduling - --------------------------- - pthread_attr_getschedparam - pthread_attr_setschedparam - pthread_attr_getinheritsched - pthread_attr_setinheritsched - pthread_attr_getschedpolicy (only supports SCHED_OTHER) - pthread_attr_setschedpolicy (only supports SCHED_OTHER) - pthread_getschedparam - pthread_setschedparam - pthread_getconcurrency - pthread_setconcurrency - pthread_attr_getscope - pthread_attr_setscope (only supports PTHREAD_SCOPE_SYSTEM) - sched_get_priority_max - sched_get_priority_min - sched_rr_get_interval (returns an error ENOTSUP) - sched_setscheduler (only supports SCHED_OTHER) - sched_getscheduler (only supports SCHED_OTHER) - sched_yield - - --------------------------- - Signals - --------------------------- - pthread_sigmask - pthread_kill (only supports zero sig value, - for thread validity checking) - - --------------------------- - Non-portable routines (see the README.NONPORTABLE file for usage) - --------------------------- - pthread_getw32threadhandle_np - pthread_timechange_handler_np - pthread_delay_np - pthread_getunique_np - pthread_mutexattr_getkind_np - pthread_mutexattr_setkind_np (types: PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ADAPTIVE_NP, - PTHREAD_MUTEX_TIMED_NP) - pthread_num_processors_np - (The following four routines may be required when linking statically. - The process_* routines should not be needed for MSVC or GCC.) - pthread_win32_process_attach_np - pthread_win32_process_detach_np - (The following routines should only be needed to manage implicit - POSIX handles i.e. when Win native threads call POSIX thread routines - (other than pthread_create)) - pthread_win32_thread_attach_np - pthread_win32_thread_detach_np - - --------------------------- - Static Initializers - --------------------------- - PTHREAD_ONCE_INIT - PTHREAD_MUTEX_INITIALIZER - PTHREAD_RECURSIVE_MUTEX_INITIALIZER - PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP - PTHREAD_COND_INITIALIZER - PTHREAD_RWLOCK_INITIALIZER - PTHREAD_SPINLOCK_INITIALIZER - - -The library includes two non-API functions for creating cancellation -points in applications and libraries: - - pthreadCancelableWait - pthreadCancelableTimedWait - - -The following functions are not implemented: - - --------------------------- - RealTime Scheduling - --------------------------- - pthread_mutex_getprioceiling - pthread_mutex_setprioceiling - pthread_mutex_attr_getprioceiling - pthread_mutex_attr_getprotocol - pthread_mutex_attr_setprioceiling - pthread_mutex_attr_setprotocol - - --------------------------- - Fork Handlers - --------------------------- - pthread_atfork - - --------------------------- - Stdio - --------------------------- - flockfile - ftrylockfile - funlockfile - getc_unlocked - getchar_unlocked - putc_unlocked - putchar_unlocked - - --------------------------- - Thread-Safe C Runtime Library - --------------------------- - readdir_r - getgrgid_r - getgrnam_r - getpwuid_r - getpwnam_r - - --------------------------- - Signals - --------------------------- - sigtimedwait - sigwait - sigwaitinfo - - --------------------------- - General - --------------------------- - sysconf - - --------------------------- - Thread-Safe C Runtime Library (macros) - --------------------------- - strtok_r - asctime_r - ctime_r - gmtime_r - localtime_r - rand_r - - -Availability ------------- - -The prebuilt DLL, export libs (for both MSVC and Mingw32), and the header -files (pthread.h, semaphore.h, sched.h) are available along with the -complete source code. - -The source code can be found at: - - ftp://sources.redhat.com/pub/pthreads-win32 - -and as individual source code files at - - ftp://sources.redhat.com/pub/pthreads-win32/source - -The pre-built DLL, export libraries and include files can be found at: - - ftp://sources.redhat.com/pub/pthreads-win32/dll-latest - - - -Mailing List ------------- - -There is a mailing list for discussing pthreads on Win32. To join, -send email to: - - pthreads-win32-subscribe@sourceware.cygnus.com - - -Application Development Environments ------------------------------------- - -See the README file for more information. - -MSVC: -MSVC using SEH works. Distribute pthreadVSE.dll with your application. -MSVC using C++ EH works. Distribute pthreadVCE.dll with your application. -MSVC using C setjmp/longjmp works. Distribute pthreadVC.dll with your application. - - -Mingw32: -See the FAQ, Questions 6 and 10. - -Mingw using C++ EH works. Distribute pthreadGCE.dll with your application. -Mingw using C setjmp/longjmp works. Distribute pthreadGC.dll with your application. - - -Cygwin: (http://sourceware.cygnus.com/cygwin/) -Developers using Cygwin do not need pthreads-win32 since it has POSIX threads -support. Refer to its documentation for details and extent. - - -UWIN: -UWIN is a complete Unix-like environment for Windows from AT&T. Pthreads-win32 -doesn't currently support UWIN (and vice versa), but that may change in the -future. - -Generally: -For convenience, the following pre-built files are available on the FTP site -(see Availability above): - - pthread.h - for POSIX threads - semaphore.h - for POSIX semaphores - sched.h - for POSIX scheduling - pthreadVCE.dll - built with MSVC++ compiler using C++ EH - pthreadVCE.lib - pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp - pthreadVC.lib - pthreadVSE.dll - built with MSVC compiler using SEH - pthreadVSE.lib - pthreadGCE.dll - built with Mingw32 G++ 2.95.2-1 - pthreadGC.dll - built with Mingw32 GCC 2.95.2-1 using setjmp/longjmp - libpthreadGCE.a - derived from pthreadGCE.dll - libpthreadGC.a - derived from pthreadGC.dll - gcc.dll - needed if distributing applications that use - pthreadGCE.dll (but see the FAQ Q 10 for the latest - related information) - -These are the only files you need in order to build POSIX threads -applications for Win32 using either MSVC or Mingw32. - -See the FAQ file in the source tree for additional information. - - -Documentation -------------- - -For the authoritative reference, see the online POSIX -standard reference at: - - http://www.OpenGroup.org - -For POSIX Thread API programming, several reference books are -available: - - Programming with POSIX Threads - David R. Butenhof - Addison-Wesley (pub) - - Pthreads Programming - By Bradford Nichols, Dick Buttlar & Jacqueline Proulx Farrell - O'Reilly (pub) - -On the web: see the links at the bottom of the pthreads-win32 site: - - http://sources.redhat.com/pthreads-win32/ - - Currently, there is no documentation included in the package apart - from the copious comments in the source code. - - - -Enjoy! - -Ross Johnson diff --git a/software/src/lib/pthread/BUGS b/software/src/lib/pthread/BUGS deleted file mode 100644 index 285ba4e..0000000 --- a/software/src/lib/pthread/BUGS +++ /dev/null @@ -1,141 +0,0 @@ ----------- -Known bugs ----------- - -1. Not strictly a bug, more of a gotcha. - - Under MS VC++ (only tested with version 6.0), a term_func - set via the standard C++ set_terminate() function causes the - application to abort. - - Notes from the MSVC++ manual: - 1) A term_func() should call exit(), otherwise - abort() will be called on return to the caller. - A call to abort() raises SIGABRT and the default signal handler - for all signals terminates the calling program with - exit code 3. - 2) A term_func() must not throw an exception. Therefore - term_func() should not call pthread_exit(), which - works by throwing an exception (pthreadVCE or pthreadVSE) - or by calling longjmp (pthreadVC). - - Workaround: avoid using pthread_exit() in C++ applications. Exit - threads by dropping through the end of the thread routine. - -2. Cancellation problems in C++ builds - - Milan Gardian - - [Note: It's not clear if this problem isn't simply due to the context - switch in pthread_cancel() which occurs unless the QueueUserAPCEx - library and driver are installed and used. Just like setjmp/longjmp, - this is probably not going to work well in C++. In any case, unless for - some very unusual reason you really must use the C++ build then please - use the C build pthreadVC2.dll or pthreadGC2.dll, i.e. for C++ - applications.] - - This is suspected to be a compiler bug in VC6.0, and also seen in - VC7.0 and VS .NET 2003. The GNU C++ compiler does not have a problem - with this, and it has been reported that the Intel C++ 8.1 compiler - and Visual C++ 2005 Express Edition Beta2 pass tests\semaphore4.c - (which exposes the bug). - - Workaround [rpj - 2 Feb 2002] - ----------------------------- - [Please note: this workaround did not solve a similar problem in - snapshot-2004-11-03 or later, even though similar symptoms were seen. - tests\semaphore4.c fails in that snapshot for the VCE version of the - DLL.] - - The problem disappears when /Ob0 is used, i.e. /O2 /Ob0 works OK, - but if you want to use inlining optimisation you can be much more - specific about where it's switched off and on by using a pragma. - - So the inlining optimisation is interfering with the way that cleanup - handlers are run. It appears to relate to auto-inlining of class methods - since this is the only auto inlining that is performed at /O1 optimisation - (functions with the "inline" qualifier are also inlined, but the problem - doesn't appear to involve any such functions in the library or testsuite). - - In order to confirm the inlining culprit, the following use of pragmas - eliminate the problem but I don't know how to make it transparent, putting - it in, say, pthread.h where pthread_cleanup_push defined as a macro. - - #pragma inline_depth(0) - pthread_cleanup_push(handlerFunc, (void *) &arg); - - /* ... */ - - pthread_cleanup_pop(0); - #pragma inline_depth() - - Note the empty () pragma value after the pop macro. This resets depth to the - default. Or you can specify a non-zero depth here. - - The pragma is also needed (and now used) within the library itself wherever - cleanup handlers are used (condvar.c and rwlock.c). - - Use of these pragmas allows compiler optimisations /O1 and /O2 to be - used for either or both the library and applications. - - Experimenting further, I found that wrapping the actual cleanup handler - function with #pragma auto_inline(off|on) does NOT work. - - MSVC6.0 doesn't appear to support the C99 standard's _Pragma directive, - however, later versions may. This form is embeddable inside #define - macros, which would be ideal because it would mean that it could be added - to the push/pop macro definitions in pthread.h and hidden from the - application programmer. - - [/rpj] - - Original problem description - ---------------------------- - - The cancellation (actually, cleanup-after-cancel) tests fail when using VC - (professional) optimisation switches (/O1 or /O2) in pthreads library. I - have not investigated which concrete optimisation technique causes this - problem (/Og, /Oi, /Ot, /Oy, /Ob1, /Gs, /Gf, /Gy, etc.), but here is a - summary of builds and corresponding failures: - - * pthreads VSE (optimised tests): OK - * pthreads VCE (optimised tests): Failed "cleanup1" test (runtime) - - * pthreads VSE (DLL in CRT, optimised tests): OK - * pthreads VCE (DLL in CRT, optimised tests): Failed "cleanup1" test - (runtime) - - Please note that while in VSE version of the pthreads library the - optimisation does not really have any impact on the tests (they pass OK), in - VCE version addition of optimisation (/O2 in this case) causes the tests to - fail uniformly - either in "cleanup0" or "cleanup1" test cases. - - Please note that all the tests above use default pthreads DLL (no - optimisations, linked with either static or DLL CRT, based on test type). - Therefore the problem lies not within the pthreads DLL but within the - compiled client code (the application using pthreads -> involvement of - "pthread.h"). - - I think the message of this section is that usage of VCE version of pthreads - in applications relying on cancellation/cleanup AND using optimisations for - creation of production code is highly unreliable for the current version of - the pthreads library. - -3. The Borland Builder 5.5 version of the library produces memory read exceptions -in some tests. - -4. pthread_barrier_wait() can deadlock if the number of potential calling -threads for a particular barrier is greater than the barrier count parameter -given to pthread_barrier_init() for that barrier. - -This is due to the very lightweight implementation of pthread-win32 barriers. -To cope with more than "count" possible waiters, barriers must effectively -implement all the same safeguards as condition variables, making them much -"heavier" than at present. - -The workaround is to ensure that no more than "count" threads attempt to wait -at the barrier. - -5. Canceling a thread blocked on pthread_once appears not to work in the MSVC++ -version of the library "pthreadVCE.dll". The test case "once3.c" hangs. I have no -clues on this at present. All other versions pass this test ok - pthreadsVC.dll, -pthreadsVSE.dll, pthreadsGC.dll and pthreadsGCE.dll. diff --git a/software/src/lib/pthread/CONTRIBUTORS b/software/src/lib/pthread/CONTRIBUTORS deleted file mode 100644 index da31ff2..0000000 --- a/software/src/lib/pthread/CONTRIBUTORS +++ /dev/null @@ -1,140 +0,0 @@ -Contributors (in approximate order of appearance) - -[See also the ChangeLog file where individuals are -attributed in log entries. Likewise in the FAQ file.] - -Ben Elliston bje at cygnus dot com - Initiated the project; - setup the project infrastructure (CVS, web page, etc.); - early prototype routines. -Ross Johnson Ross dot Johnson at dot homemail dot com dot au - early prototype routines; - ongoing project coordination/maintenance; - implementation of spin locks and barriers; - various enhancements; - bug fixes; - documentation; - testsuite. -Robert Colquhoun rjc at trump dot net dot au - Early bug fixes. -John E. Bossom John dot Bossom at cognos dot com - Contributed substantial original working implementation; - bug fixes; - ongoing guidance and standards interpretation. -Anders Norlander anorland at hem2 dot passagen dot se - Early enhancements and runtime checking for supported - Win32 routines. -Tor Lillqvist tml at iki dot fi - General enhancements; - early bug fixes to condition variables. -Scott Lightner scott at curriculum dot com - Bug fix. -Kevin Ruland Kevin dot Ruland at anheuser-busch dot com - Various bug fixes. -Mike Russo miker at eai dot com - Bug fix. -Mark E. Armstrong avail at pacbell dot net - Bug fixes. -Lorin Hochstein lmh at xiphos dot ca - general bug fixes; bug fixes to condition variables. -Peter Slacik Peter dot Slacik at tatramed dot sk - Bug fixes. -Mumit Khan khan at xraylith dot wisc dot edu - Fixes to work with Mingw32. -Milan Gardian mg at tatramed dot sk - Bug fixes and reports/analyses of obscure problems. -Aurelio Medina aureliom at crt dot com - First implementation of read-write locks. -Graham Dumpleton Graham dot Dumpleton at ra dot pad dot otc dot telstra dot com dot au - Bug fix in condition variables. -Tristan Savatier tristan at mpegtv dot com - WinCE port. -Erik Hensema erik at hensema dot xs4all dot nl - Bug fixes. -Rich Peters rpeters at micro-magic dot com -Todd Owen towen at lucidcalm dot dropbear dot id dot au - Bug fixes to dll loading. -Jason Nye jnye at nbnet dot nb dot ca - Implementation of async cancelation. -Fred Forester fforest at eticomm dot net -Kevin D. Clark kclark at cabletron dot com -David Baggett dmb at itasoftware dot com - Bug fixes. -Paul Redondo paul at matchvision dot com -Scott McCaskill scott at 3dfx dot com - Bug fixes. -Jef Gearhart jgearhart at tpssys dot com - Bug fix. -Arthur Kantor akantor at bexusa dot com - Mutex enhancements. -Steven Reddie smr at essemer dot com dot au - Bug fix. -Alexander Terekhov TEREKHOV at de dot ibm dot com - Re-implemented and improved read-write locks; - (with Louis Thomas) re-implemented and improved - condition variables; - enhancements to semaphores; - enhancements to mutexes; - new mutex implementation in 'futex' style; - suggested a robust implementation of pthread_once - similar to that implemented by V.Kliathcko; - system clock change handling re CV timeouts; - bug fixes. -Thomas Pfaff tpfaff at gmx dot net - Changes to make C version usable with C++ applications; - re-implemented mutex routines to avoid Win32 mutexes - and TryEnterCriticalSection; - procedure to fix Mingw32 thread-safety issues. -Franco Bez franco dot bez at gmx dot de - procedure to fix Mingw32 thread-safety issues. -Louis Thomas lthomas at arbitrade dot com - (with Alexander Terekhov) re-implemented and improved - condition variables. -David Korn dgk at research dot att dot com - Ported to UWIN. -Phil Frisbie, Jr. phil at hawksoft dot com - Bug fix. -Ralf Brese Ralf dot Brese at pdb4 dot siemens dot de - Bug fix. -prionx at juno dot com prionx at juno dot com - Bug fixes. -Max Woodbury mtew at cds dot duke dot edu - POSIX versioning conditionals; - reduced namespace pollution; - idea to separate routines to reduce statically - linked image sizes. -Rob Fanner rfanner at stonethree dot com - Bug fix. -Michael Johnson michaelj at maine dot rr dot com - Bug fix. -Nicolas Barry boozai at yahoo dot com - Bug fixes. -Piet van Bruggen pietvb at newbridges dot nl - Bug fix. -Makoto Kato raven at oldskool dot jp - AMD64 port. -Panagiotis E. Hadjidoukas peh at hpclab dot ceid dot upatras dot gr - phadjido at cs dot uoi dot gr - Contributed the QueueUserAPCEx package which - makes preemptive async cancelation possible. -Will Bryant will dot bryant at ecosm dot com - Borland compiler patch and makefile. -Anuj Goyal anuj dot goyal at gmail dot com - Port to Digital Mars compiler. -Gottlob Frege gottlobfrege at gmail dot com - re-implemented pthread_once (version 2) - (pthread_once cancellation added by rpj). -Vladimir Kliatchko vladimir at kliatchko dot com - reimplemented pthread_once with the same form - as described by A.Terekhov (later version 2); - implementation of MCS (Mellor-Crummey/Scott) locks. -Ramiro Polla ramiro.polla at gmail dot com - static library auto init/cleanup on application - start/exit via RT hooks (MSC and GCC compilers only). -Daniel Richard G. skunk at iSKUNK dot org - Patches and cleanups for x86 and x64, particularly - across a range of MS build environments. -John Kamp john dot kamp at globalgraphics dot com - Patches to fix various problems on x64; brutal testing - particularly using high memory run environments. - diff --git a/software/src/lib/pthread/COPYING b/software/src/lib/pthread/COPYING deleted file mode 100644 index 5cfea0d..0000000 --- a/software/src/lib/pthread/COPYING +++ /dev/null @@ -1,150 +0,0 @@ - pthreads-win32 - a POSIX threads library for Microsoft Windows - - -This file is Copyrighted ------------------------- - - This file is covered under the following Copyright: - - Copyright (C) 2001,2006 Ross P. Johnson - All rights reserved. - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Pthreads-win32 is covered by the GNU Lesser General Public License ------------------------------------------------------------------- - - Pthreads-win32 is open software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public License - as published by the Free Software Foundation version 2.1 of the - License. - - Pthreads-win32 is several binary link libraries, several modules, - associated interface definition files and scripts used to control - its compilation and installation. - - Pthreads-win32 is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - A copy of the GNU Lesser General Public License is distributed with - pthreads-win32 under the filename: - - COPYING.LIB - - You should have received a copy of the version 2.1 GNU Lesser General - Public License with pthreads-win32; if not, write to: - - Free Software Foundation, Inc. - 59 Temple Place - Suite 330 - Boston, MA 02111-1307 - USA - - The contact addresses for pthreads-win32 is as follows: - - Web: http://sources.redhat.com/pthreads-win32 - Email: Ross Johnson - Please use: Firstname.Lastname@homemail.com.au - - - -Pthreads-win32 copyrights and exception files ---------------------------------------------- - - With the exception of the files listed below, Pthreads-win32 - is covered under the following GNU Lesser General Public License - Copyrights: - - Pthreads-win32 - POSIX Threads Library for Win32 - Copyright(C) 1998 John E. Bossom - Copyright(C) 1999,2006 Pthreads-win32 contributors - - The current list of contributors is contained - in the file CONTRIBUTORS included with the source - code distribution. The current list of CONTRIBUTORS - can also be seen at the following WWW location: - http://sources.redhat.com/pthreads-win32/contributors.html - - Contact Email: Ross Johnson - Please use: Firstname.Lastname@homemail.com.au - - These files are not covered under one of the Copyrights listed above: - - COPYING - COPYING.LIB - tests/rwlock7.c - - This file, COPYING, is distributed under the Copyright found at the - top of this file. It is important to note that you may distribute - verbatim copies of this file but you may not modify this file. - - The file COPYING.LIB, which contains a copy of the version 2.1 - GNU Lesser General Public License, is itself copyrighted by the - Free Software Foundation, Inc. Please note that the Free Software - Foundation, Inc. does NOT have a copyright over Pthreads-win32, - only the COPYING.LIB that is supplied with pthreads-win32. - - The file tests/rwlock7.c is derived from code written by - Dave Butenhof for his book 'Programming With POSIX(R) Threads'. - The original code was obtained by free download from his website - http://home.earthlink.net/~anneart/family/Threads/source.html - and did not contain a copyright or author notice. It is assumed to - be freely distributable. - - In all cases one may use and distribute these exception files freely. - And because one may freely distribute the LGPL covered files, the - entire pthreads-win32 source may be freely used and distributed. - - - -General Copyleft and License info ---------------------------------- - - For general information on Copylefts, see: - - http://www.gnu.org/copyleft/ - - For information on GNU Lesser General Public Licenses, see: - - http://www.gnu.org/copyleft/lesser.html - http://www.gnu.org/copyleft/lesser.txt - - -Why pthreads-win32 did not use the GNU General Public License -------------------------------------------------------------- - - The goal of the pthreads-win32 project has been to - provide a quality and complete implementation of the POSIX - threads API for Microsoft Windows within the limits imposed - by virtue of it being a stand-alone library and not - linked directly to other POSIX compliant libraries. For - example, some functions and features, such as those based - on POSIX signals, are missing. - - Pthreads-win32 is a library, available in several different - versions depending on supported compilers, and may be used - as a dynamically linked module or a statically linked set of - binary modules. It is not an application on it's own. - - It was fully intended that pthreads-win32 be usable with - commercial software not covered by either the GPL or the LGPL - licenses. Pthreads-win32 has many contributors to it's - code base, many of whom have done so because they have - used the library in commercial or proprietry software - projects. - - Releasing pthreads-win32 under the LGPL ensures that the - library can be used widely, while at the same time ensures - that bug fixes and improvements to the pthreads-win32 code - itself is returned to benefit all current and future users - of the library. - - Although pthreads-win32 makes it possible for applications - that use POSIX threads to be ported to Win32 platforms, the - broader goal of the project is to encourage the use of open - standards, and in particular, to make it just a little easier - for developers writing Win32 applications to consider - widening the potential market for their products. diff --git a/software/src/lib/pthread/COPYING.LIB b/software/src/lib/pthread/COPYING.LIB deleted file mode 100644 index b1e3f5a..0000000 --- a/software/src/lib/pthread/COPYING.LIB +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/software/src/lib/pthread/ChangeLog b/software/src/lib/pthread/ChangeLog deleted file mode 100644 index 42abcc4..0000000 --- a/software/src/lib/pthread/ChangeLog +++ /dev/null @@ -1,5211 +0,0 @@ -2012-03-18 Ross Johnson - - * create.c (pthread_create): add __cdecl attribute to thread routine - arg - * implement.h (pthread_key_t): add __cdecl attribute to destructor - element - (ThreadParms): likewise for start element - * pthread.h (pthread_create): add __cdecl to prototype start arg - (pthread_once): likewise for init_routine arg - (pthread_key_create): likewise for destructor arg - (ptw32_cleanup_push): replace type of routine arg with previously - defined ptw32_cleanup_callback_t - * pthread_key_create.c: add __cdecl attribute to destructor arg - * pthread_once.c: add __cdecl attribute to init_routine arg - * ptw32_threadStart.c (start): add __cdecl to start variable type - - -2011-07-06 Ross Johnson - - * pthread_cond_wait.c (pragma inline_depth): this is almost redundant - now nevertheless fixed thei controlling MSC_VER from "< 800" to - "< 1400" (i.e. any prior to VC++ 8.0). - * pthread_once.ci (pragma inline_depth): Likewise. - * pthread_rwlock_timedwrlock.ci (pragma inline_depth): Likewise. - * pthread_rwlock_wrlock.ci (pragma inline_depth): Likewise. - * sem_timedwait.ci (pragma inline_depth): Likewise. - * sem_wait.ci (pragma inline_depth): Likewise. - -2011-07-05 Ross Johnson - - * pthread_win32_attach_detach_np.c: Use strncat_s if available - to removei a compile warning; MingW supports this routine but we - continue to use strncat anyway there because it is secure if - given the correct parameters; fix strncat param 3 to avoid - buffer overrun exploitation potential. - -2011-07-03 Ross Johnson - - * pthread_spin_unlock.c (EPERM): Return success if unlocking a lock - that is not locked, because single CPU machines wrap a - PTHREAD_MUTEX_NORMAL mutex, which returns success in this case. - * pthread_win32_attach_detach_np.c (QUSEREX.DLL): Load from an - absolute path only which must be the Windows System folder. - -2011-07-03 Daniel Richard G. - - * Makefile (_WIN32_WINNT): Removed; duplicate definition in - implement.h; more cleanup and enhancements. - -2011-07-02 Daniel Richard G. - - * Makefile: Cleanups and implovements. - * ptw32_MCS_locks.c: Casting fixes. - * implement.h: Interlocked call and argument casting macro fixes - to support older and newer build environments. - -2011-07-01 Ross Johnson - - * *.[ch] (PTW32_INTERLOCKED_*): Redo 23 and 64 bit versions of these - macros and re-apply in code to undo the incorrect changes from - 2011-06-29; remove some size_t casts which should not be required - and may be problematic.a - There are now two sets of macros: - PTW32_INTERLOCKED_*_LONG which work only on 32 bit integer variables; - PTW32_INTERLOCKED_*_SIZE which work on size_t integer variables, i.e. - LONG for 32 bit systems and LONGLONG for 64 bit systems. - * implement.h (MCS locks): nextFlag and waitFlag are now HANDLE type. - * ptw32_MCS_locks.c: Likewise. - * pthread.h (#include ): Removed. - * ptw32_throw.c (#include ): Added. - * ptw32_threadStart.c (#include ): Added. - * implement.h (#include ): Added. - -2011-06-30 Ross Johnson - - * pthread_once.c: Tighten 'if' statement casting; fix interlocked - pointer cast for 64 bit compatibility (missed yesterday); remove - the superfluous static cleanup routine and call the release routine - directly if popped. - * create.c (stackSize): Now type size_t. - * pthread.h (struct ptw32_thread_t_): Rearrange to fix element alignments. - -2011-06-29 Daniel Richard G. - - * ptw32_relmillisecs.c (ftime): - _ftime64_s() is only available in MSVC 2005 or later; - _ftime64() is available in MinGW or MSVC 2002 or later; - _ftime() is always available. - * pthread.h (long long): Not defined in older MSVC 6. - * implement.h (long long): Likewise. - * pthread_getunique_np.c (long long): Likewise. - -2011-06-29 Ross Johnson - - * *.[ch] (PTW32_INTERLOCKED_*): These macros should now work for - both 32 and 64 bit builds. The MingW versions are all inlined asm - while the MSVC versions expand to their Interlocked* or Interlocked*64 - counterparts appropriately. The argument type have also been changed - to cast to the appropriate value or pointer size for the architecture. - -2011-05-29 Ross Johnson - - * *.[ch] (#ifdef): Extended cleanup to whole project. - -2011-05-29 Daniel Richard G. - - * Makefile (CC): Define CC to allow use of other compatible - compilers such as the Intel compilter icl. - * implement.h (#if): Fix forms like #if HAVE_SOMETHING. - * pthread.h: Likewise. - * sched.h: Likewise; PTW32_LEVEL_* becomes PTW32_SCHED_LEVEL_*. - * semaphore.h: Likewise. - -2011-05-11 Ross Johnson - - * ptw32_callUserDestroyRoutines.c (terminate): Altered includes - to match ptw32_threadStart.c. - * GNUmakefile (GCE-inlined-debug, DOPT): Fixed. - -2011-04-31 Ross Johnson - - * (robust mutexes): Added this API. The API is not - mandatory for implementations that don't support PROCESS_SHARED - mutexes, nevertheless it was considered useful both functionally - and for source-level compatibility. - -2011-03-26 Ross Johnson - - * pthread_getunique_np.c: New non-POSIX interface for compatibility - with some other implementations; returns a 64 bit sequence number - that is unique to each thread in the process. - * pthread.h (pthread_getunique_np): Added. - * global.c: Add global sequence counter for above. - * implement.h: Likewise. - -2011-03-25 Ross Johnson - - * (cancelLock): Convert to an MCS lock and rename to stateLock. - * (threadLock): Likewise. - * (keyLock): Likewise. - * pthread_mutex*.c: First working robust mutexes. - -2011-03-11 Ross Johnson - - * implement.h (PTW32_INTERLOCKED_*CREMENT macros): increment/decrement - using ++/-- instead of add/subtract 1. - * ptw32_MCS_lock.c: Make casts consistent. - -2011-03-09 Ross Johnson - - * implement.h (ptw32_thread_t_): Add process unique sequence number. - * global.c: Replace global Critical Section objects with MCS - queue locks. - * implement.h: Likewise. - * pthread_cond_destroy.c: Likewise. - * pthread_cond_init.c: Likewise. - * pthread_detach.c: Likewise. - * pthread_join.c: Likewise. - * pthread_kill.c: Likewise. - * pthread_mutex_destroy.c: Likewise. - * pthread_rwlock_destroy.c: Likewise. - * pthread_spin_destroy.c: Likewise. - * pthread_timechange_handler_np.c: Likewise. - * ptw32_cond_check_need_init.c: Likewise. - * ptw32_mutex_check_need_init.c: Likewise. - * ptw32_processInitialize.c: Likewise. - * ptw32_processTerminate.c: Likewise. - * ptw32_reuse.c: Likewise. - * ptw32_rwlock_check_need_init.c: Likewise. - * ptw32_spinlock_check_need_init.c: Likewise. - -2011-03-06 Ross Johnson - - * several (MINGW64): Cast and call fixups for 64 bit compatibility; - clean build via x86_64-w64-mingw32 cross toolchain on Linux i686 - targeting x86_64 win64. - * ptw32_threadStart.c (ptw32_threadStart): Routine no longer attempts - to pass [unexpected C++] exceptions out of scope but ends the thread - normally setting EINTR as the exit status. - * ptw32_throw.c: Fix C++ exception throwing warnings; ignore - informational warning. - * implement.h: Likewise with the corresponding header definition. - -2011-03-04 Ross Johnson - - * implement.h (PTW32_INTERLOCKED_*): Mingw32 does not provide - the __sync_* intrinsics so implemented them here as macro - assembler routines. MSVS Interlocked* are emmitted as intrinsics - wherever possible, so we want mingw to match it; Extended to - include all interlocked routines used by the library; implemented - x86_64 versions also. - * ptw32_InterlockedCompareExchange.c: No code remaining here. - * ptw32_MCS_lock.c: Converted interlocked calls to use new macros. - * pthread_barrier_wait.c: Likewise. - * pthread_once.c: Likewise. - * ptw32_MCS_lock.c (ptw32_mcs_node_substitute): Name changed to - ptw32_mcs_node_transfer. - -2011-02-28 Ross Johnson - - * ptw32_relmillisecs.c: If possible, use _ftime64_s or _ftime64 - before resorting to _ftime. - -2011-02-27 Ross Johnson - - * sched_setscheduler.c: Ensure the handle is closed after use. - * sched_getscheduler.c: Likewise. - * pthread.h: Remove POSIX compatibility macros; don't define - timespec if already defined. - * context.h: Changes for 64 bit. - * pthread_cancel.c: Likewise. - * pthread_exit.c: Likewise. - * pthread_spin_destroy.c: Likewise. - * pthread_timechange_handler_np.c: Likewise. - * ptw32_MCS_lock.c: Likewise; some of these changes may - not be compatible with pre Windows 2000 systems; reverse the order of - the includes. - * ptw32_threadStart.c: Likewise. - * ptw32_throw.c: Likewise. - -2011-02-13 Ross Johnson - - * pthread_self: Add comment re returning 'nil' value to - indicate failure only to win32 threads that call us. - * pthread_attr_setstackaddr: Fix comments; note this - function and it's compliment are now removed from SUSv4. - -2011-02-12 Ross Johnson - - README.NONPORTABLE: Record a description of an obvious - method for nulling/comparing/hashing pthread_t using a - union; plus and investigation of a change of type for - pthread_t (to a union) to neutralise any padding bits and - bytes if they occur in pthread_t (the current pthread_t struct - does not contain padding AFAIK, but porting the library to a - future architecture may introduce them). Padding affects - byte-by-byte copies and compare operations. - -2010-11-16 Ross Johnson - - * ChangeLog: Add this entry ;-) - Restore entries from 2007 through 2009 that went missing - at the last update. - -2010-06-19 Ross Johnson - - * ptw32_MCS_lock.c (ptw32_mcs_node_substitute): Fix variable - names to avoid using C++ keyword ("new"). - * implement.h (ptw32_mcs_node_substitute): Likewise. - * pthread_barrier_wait.c: Fix signed/unsigned comparison warning. - -2010-06-18 Ramiro Polla - - * autostatic.c: New file; call pthread_win32_process_*() - libary init/cleanup routines automatically on application start - when statically linked. - * pthread.c (autostatic.c): Included. - * pthread.h (declspec): Remove import/export defines if compiler - is MINGW. - * sched.h (declspec): Likewise. - * semaphore.h (declspec): Likewise. - * need_errno.h (declspec): Likewise. - * Makefile (autostatic.obj): Add for small static builds. - * GNUmakefile (autostatic.o): Likewise. - * NEWS (Version 2.9.0): Add changes. - * README.NONPORTABLE (pthread_win32_process_*): Update - description. - -2010-06-15 Ramiro Polla - - * Makefile: Remove linkage with the winsock library by default. - * GNUmakefile: Likewise. - * pthread_getspecific.c: Likewise by removing calls to WSA - functions. - * config.h (RETAIN_WSALASTERROR): Can be defined if necessary. - -2010-01-26 Ross Johnson - - * ptw32_MCS_lock.c (ptw32_mcs_node_substitute): New routine - to allow relocating the lock owners thread-local node to somewhere - else, e.g. to global space so that another thread can release the - lock. Used in pthread_barrier_wait. - (ptw32_mcs_lock_try_acquire): New routine. - * pthread_barrier_init: Only one semaphore is used now. - * pthread_barrier_wait: Added an MCS guard lock with the last thread - to leave the barrier releasing the lock. This removes a deadlock bug - observed when there are greater than barrier-count threads - attempting to cross. - * pthread_barrier_destroy: Added an MCS guard lock. - -2009-03-03 Stephan O'Farrill - - * pthread_attr_getschedpolicy.c: Add "const" to function parameter - in accordance with SUSv3 (POSIX). - * pthread_attr_getinheritsched.c: Likewise. - * pthread_mutexattr_gettype.c: Likewise. - -2008-06-06 Robert Kindred - - * ptw32_throw.c (ptw32_throw): Remove possible reference to NULL - pointer. (At the same time made the switch block conditionally - included only if exitCode is needed - RPJ.) - * pthread_testcancel.c (pthread_testcancel): Remove duplicate and - misplaced pthread_mutex_unlock(). - -2008-02-21 Sebastian Gottschalk - - * pthread_attr_getdetachstate.c (pthread_attr_getdetachstate): - Remove potential and superfluous null pointer assignment. - -2007-11-22 Ivan Pizhenko - - * pthread.h (gmtime_r): gmtime returns 0 if tm represents a time - prior to 1/1/1970. Notice this to prevent raising an exception. - * pthread.h (localtime_r): Likewise for localtime. - -2007-07-14 Marcel Ruff - - * errno.c (_errno): Fix test for pthread_self() success. - * need_errno.h: Remove unintentional line wrap from #if line. - -2007-07-14 Mike Romanchuk - - * pthread.h (timespec): Fix tv_sec type. - -2007-01-07 Sinan Kaya - - * need_errno.h: Fix declaration of _errno - the local version of - _errno() is used, e.g. by WinCE. - -2007-01-06 Ross Johnson - - * ptw32_semwait.c: Add check for invalid sem_t after acquiring the - sem_t state guard mutex and before affecting changes to sema state. - -2007-01-06 Marcel Ruff - - * error.c: Fix reference to pthread handle exitStatus member for - builds that use NEED_ERRNO (i.e. WINCE). - * context.h: Add support for ARM processor (WinCE). - * mutex.c (process.h): Exclude for WINCE. - * create.c: Likewise. - * exit.c: Likewise. - * implement.h: Likewise. - * pthread_detach.c (signal.h): Exclude for WINCE. - * pthread_join.c: Likewise. - * pthread_kill.c: Likewise. - * pthread_rwlock_init.c (errno.h): Remove - included by pthread.h. - * pthread_rwlock_destroy.c: Likewise. - * pthread_rwlock_rdlock.c: Likewise. - * pthread_rwlock_timedrdlock.c: Likewise. - * pthread_rwlock_timedwrlock.c: Likewise. - * pthread_rwlock_tryrdlock.c: Likewise. - * pthread_rwlock_trywrlock.c: likewise. - * pthread_rwlock_unlock.c: Likewise. - * pthread_rwlock_wrlock.c: Likewise. - * pthread_rwlockattr_destroy.c: Likewise. - * pthread_rwlockattr_getpshared.c: Likewise. - * pthread_rwlockattr_init.c: Likewise. - * pthread_rwlockattr_setpshared.c: Likewise. - -2007-01-06 Romano Paolo Tenca - - * pthread_cond_destroy.c: Replace sem_wait() with non-cancelable - ptw32_semwait() since pthread_cond_destroy() is not a cancelation - point. - * implement.h (ptw32_spinlock_check_need_init): Add prototype. - * ptw32_MCS_lock.c: Reverse order of includes. - -2007-01-06 Eric Berge - - * pthread_cond_destroy.c: Add LeaveCriticalSection before returning - after errors. - -2007-01-04 Ross Johnson - - * ptw32_InterlockedCompareExchange.c: Conditionally skip for - Win64 as not required. - * pthread_win32_attach_detach_np.c (pthread_win32_process_attach_np): - Test for InterlockedCompareExchange is not required for Win64. - * context.h: New file. Included by pthread_cancel.h and any tests - that need it (e.g. context1.c). - * pthread_cancel.c: Architecture-dependent context macros moved - to context.h. - -2007-01-04 Kip Streithorst - - * implement.h (PTW32_INTERLOCKED_COMPARE_EXCHANGE): Add Win64 - support. - -2006-12-20 Ross Johnson - - * sem_destroy.c: Fix the race involving invalidation of the sema; - fix incorrect return of EBUSY resulting from the mutex trylock - on the private mutex guard. - * sem_wait.c: Add check for invalid sem_t after acquiring the - sem_t state guard mutex and before affecting changes to sema state. - * sem_trywait.c: Likewise. - * sem_timedwait.c: Likewise. - * sem_getvalue.c: Likewise. - * sem_post.c: Similar. - * sem_post_multiple.c: Likewise. - * sem_init.c: Set max Win32 semaphore count to SEM_VALUE_MAX (was - _POSIX_SEM_VALUE_MAX, which is a lower value - the minimum). - - * pthread_win32_attach_detach_np.c (pthread_win32_process_attach_np): - Load COREDLL.DLL under WINCE to check existence of - InterlockedCompareExchange() routine. This used to be done to test - for TryEnterCriticalSection() but was removed when this was no - longer needed. - -2006-01-25 Prashant Thakre - - * pthread_cancel.c: Added _M_IA64 register context support. - -2005-05-13 Ross Johnson - - * pthread_kill.c (pthread_kill): Remove check for Win32 thread - priority (to confirm HANDLE validity). Useless since thread HANDLEs - a not recycle-unique. - -2005-05-30 Vladimir Kliatchko - - * pthread_once.c: Re-implement using an MCS queue-based lock. The form - of pthread_once is as proposed by Alexander Terekhov (see entry of - 2005-03-13). The MCS lock implementation does not require a unique - 'name' to identify the lock between threads. Attempts to get the Event - or Semaphore based versions of pthread_once to a satisfactory level - of robustness have thus far failed. The last problem (avoiding races - involving non recycle-unique Win32 HANDLEs) was giving everyone - grey hair trying to solve it. - - * ptw32_MCS_lock.c: New MCS queue-based lock implementation. These - locks are efficient: they have very low overhead in the uncontended case; - are efficient in contention and minimise cache-coherence updates in - managing the user level FIFO queue; do not require an ABI change in the - library. - -2005-05-27 Alexander Gottwald - - * pthread.h: Some things, like HANDLE, were only defined if - PTW32_LEVEL was >= 3. They should always be defined. - -2005-05-25 Vladimir Kliatchko - - * pthread_once.c: Eliminate all priority operations and other - complexity by replacing the event with a semaphore. The advantage - of the change is the ability to release just one waiter if the - init_routine thread is cancelled yet still release all waiters when - done. Simplify once_control state checks to improve efficiency - further. - -2005-05-24 Mikael Magnusson - - * GNUmakefile: Patched to allow cross-compile with mingw32 on Linux. - It uses macros instead of referencing dlltool, gcc and g++ directly; - added a call to ranlib. For example the GC static library can be - built with: - make CC=i586-mingw32msvc-gcc RC=i586-mingw32msvc-windres \ - RANLIB=i586-mingw32msvc-ranlib clean GC-static - -2005-05-13 Ross Johnson - - * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np): - Move on-exit-only stuff from ptw32_threadDestroy() to here. - * ptw32_threadDestroy.c: It's purpose is now only to reclaim thread - resources for detached threads, or via pthread_join() or - pthread_detach() on joinable threads. - * ptw32_threadStart.c: Calling user destruct routines has moved to - pthread_win32_thread_detach_np(); call pthread_win32_thread_detach_np() - directly if statically linking, otherwise do so via dllMain; store - thread return value in thread struct for all cases, including - cancellation and exception exits; thread abnormal exits go via - pthread_win32_thread_detach_np. - * pthread_join.c (pthread_join): Don't try to get return code from - Win32 thread - always get it from he thread struct. - * pthread_detach.c (pthread_detach): reduce extent of the thread - existence check since we now don't care if the Win32 thread HANDLE has - been closed; reclaim thread resources if the thread has exited already. - * ptw32_throw.c (ptw32_throw): For Win32 threads that are not implicit, - only Call thread cleanup if statically linking, otherwise leave it to - dllMain. - * sem_post.c (_POSIX_SEM_VALUE_MAX): Change to SEM_VALUE_MAX. - * sem_post_multiple.c: Likewise. - * sem_init.c: Likewise. - -2005-05-10 Ross Johnson - - * pthread_join.c (pthread_join): Add missing check for thread ID - reference count in thread existence test; reduce extent of the - existence test since we don't care if the Win32 thread HANDLE has - been closed. - -2005-05-09 Ross Johnson - - * ptw32_callUserDestroyRoutines.c: Run destructor process (i.e. - loop over all keys calling destructors) up to - PTHREAD_DESTRUCTOR_ITERATIONS times if TSD value isn't NULL yet; - modify assoc management. - * pthread_key_delete.c: Modify assoc management. - * ptw32_tkAssocDestroy.c: Fix error in assoc removal from chains. - * pthread.h - (_POSIX_THREAD_DESTRUCTOR_ITERATIONS): Define to value specified by - POSIX. - (_POSIX_THREAD_KEYS_MAX): Define to value specified by POSIX. - (PTHREAD_KEYS_MAX): Redefine [upward] to minimum required by POSIX. - (SEM_NSEMS_MAX): Define to implementation value. - (SEM_VALUE_MAX): Define to implementation value. - (_POSIX_SEM_NSEMS_MAX): Redefine to value specified by POSIX. - (_POSIX_SEM_VALUE_MAX): Redefine to value specified by POSIX. - -2005-05-06 Ross Johnson - - * signal.c (sigwait): Add a cancellation point to this otherwise - no-op. - * sem_init.c (sem_init): Check for and return ERANGE error. - * sem_post.c (sem_post): Likewise. - * sem_post_multiple.c (sem_post_multiple): Likewise. - * manual (directory): Added; see ChangeLog inside. - -2005-05-02 Ross Johnson - - * implement.h (struct pthread_key_t_): Change threadsLock to keyLock - so as not to be confused with the per thread lock 'threadlock'; - change all references to it. - * implement.h (struct ThreadKeyAssoc): Remove lock; add prevKey - and prevThread pointers; re-implemented all routines that use this - struct. The effect of this is to save one handle per association, - which could potentially equal the number of keys multiplied by the - number of threads, accumulating over time - and to free the - association memory as soon as it is no longer referenced by either - the key or the thread. Previously, the handle and memory were - released only after BOTH key and thread no longer referenced the - association. That is, often no association resources were released - until the process itself exited. In addition, at least one race - condition has been removed - where two threads could attempt to - release the association resources simultaneously - one via - ptw32_callUserDestroyRoutines and the other via - pthread_key_delete. - - thanks to Richard Hughes at Aculab for discovering the problem. - * pthread_key_create.c: See above. - * pthread_key_delete.c: See above. - * pthread_setspecific.c: See above. - * ptw32_callUserDestroyRoutines.c: See above. - * ptw32_tkAssocCreate.c: See above. - * ptw32_tkAssocDestroy.c: See above. - -2005-04-27 Ross Johnson - - * sem_wait.c (ptw32_sem_wait_cleanup): after cancellation re-attempt - to acquire the semaphore to avoid a race with a late sem_post. - * sem_timedwait.c: Modify comments. - -2005-04-25 Ross Johnson - - * ptw32_relmillisecs.c: New module; converts future abstime to - milliseconds relative to 'now'. - * pthread_mutex_timedlock.c: Use new ptw32_relmillisecs routine in - place of internal code; remove the NEED_SEM code - this routine is now - implemented for builds that define NEED_SEM (WinCE etc) - * sem_timedwait.c: Likewise; after timeout or cancellation, - re-attempt to acquire the semaphore in case one has been posted since - the timeout/cancel occurred. Thanks to Stefan Mueller. - * Makefile: Add ptw32_relmillisecs.c module; remove - ptw32_{in,de}crease_semaphore.c modules. - * GNUmakefile: Likewise. - * Bmakefile: Likewise. - - * sem_init.c: Re-write the NEED_SEM code to be consistent with the - non-NEED_SEM code, but retaining use of an event in place of the w32 sema - for w32 systems that don't include semaphores (WinCE); - the NEED_SEM versions of semaphores has been broken for a long time but is - now fixed and supports all of the same routines as the non-NEED_SEM case. - * sem_destroy.c: Likewise. - * sem_wait.c: Likewise. - * sem_post.c: Likewise. - * sem_post_multple.c: Likewise. - * implement.h: Likewise. - * sem_timedwait.c: Likewise; this routine is now - implemented for builds that define NEED_SEM (WinCE etc). - * sem_trywait.c: Likewise. - * sem_getvalue.c: Likewise. - - * pthread_once.c: Yet more changes, reverting closer to Gottlob Frege's - first design, but retaining cancellation, priority boosting, and adding - preservation of W32 error codes to make pthread_once transparent to - GetLastError. - -2005-04-11 Ross Johnson - - * pthread_once.c (pthread_once): Added priority boosting to - solve starvation problem after once_routine cancellation. - See notes in file. - -2005-04-06 Kevin Lussier - - * Makefile: Added debug targets for all versions of the library. - -2005-04-01 Ross Johnson - - * GNUmakefile: Add target to build libpthreadGC1.a as a static link - library. - * Makefile: Likewise for pthreadGC1.lib. - -2005-04-01 Kevin Lussier - - * sem_timedwait.c (sem_timedwait): Increase size of temp variables to - avoid int overflows for large timeout values. - * implement.h (int64_t): Include or define. - -2005-03-31 Dimitar Panayotov ^M - - * pthread.h: Fix conditional defines for static linking. - * sched.h: Liekwise. - * semaphore.h: Likewise. - * dll.c (PTW32_STATIC_LIB): Module is conditionally included - in the build. - -2005-03-16 Ross Johnson ^M - - * pthread_setcancelstate.c: Undo the last change. - -2005-03-16 Ross Johnson ^M - - * pthread_setcancelstate.c: Don't check for an async cancel event - if the library is using alertable async cancel.. - -2005-03-14 Ross Johnson - - * pthread_once.c (pthread_once): Downgrade interlocked operations to simple - memory operations where these are protected by the critical section; edit - comments. - -2005-03-13 Ross Johnson - - * pthread_once.c (pthread_once): Completely redesigned; a change was - required to the ABI (pthread_once_t_), and resulting in a version - compatibility index increment. - - NOTES: - The design (based on pseudo code contributed by Gottlob Frege) avoids - creating a kernel object if there is no contention. See URL for details:- - http://sources.redhat.com/ml/pthreads-win32/2005/msg00029.html - This uses late initialisation similar to the technique already used for - pthreads-win32 mutexes and semaphores (from Alexander Terekhov). - - The subsequent cancelation cleanup additions (by rpj) could not be implemented - without sacrificing some of the efficiency in Gottlob's design. In particular, - although each once_control uses it's own event to block on, a global CS is - required to manage it - since the event must be either re-usable or - re-creatable under cancelation. This is not needed in the non-cancelable - design because it is able to mark the event as closed (forever). - - When uncontested, a CS operation is equivalent to an Interlocked operation - in speed. So, in the final design with cancelability, an uncontested - once_control operation involves a minimum of five interlocked operations - (including the LeaveCS operation). - - ALTERNATIVES: - An alternative design from Alexander Terekhov proposed using a named mutex, - as sketched below:- - - if (!once_control) { // May be in TLS - named_mutex::guard guard(&once_control2); - if (!once_control2) { - - once_control2 = true; - } - once_control = true; - } - - A more detailed description of this can be found here:- - http://groups.yahoo.com/group/boost/message/15442 - - [Although the definition of a suitable PTHREAD_ONCE_INIT precludes use of the - TLS located flag, this is not critical.] - - There are three primary concerns though:- - 1) The [named] mutex is 'created' even in the uncontended case. - 2) A system wide unique name must be generated. - 3) Win32 mutexes are VERY slow even in the uncontended case. An uncontested - Win32 mutex lock operation can be 50 (or more) times slower than an - uncontested EnterCS operation. - - Ultimately, the named mutex trick is making use of the global locks maintained - by the kernel. - - * pthread.h (pthread_once_t_): One flag and an event HANDLE added. - (PTHREAD_ONCE_INIT): Additional values included. - -2005-03-08 Ross Johnson - - * pthread_once.c (pthread_once): Redesigned to elliminate potential - starvation problem. - - reported by Gottlob Frege - - * ptw32_threadDestroy.c (ptw32_threadDestroy): Implicit threads were - not closing their Win32 thread duplicate handle. - - reported by Dmitrii Semii - -2005-01-25 Ralf Kubis - - * Attempted acquisition of recursive mutex was causing waiting - threads to not be woken when the mutex is released. - - * GNUmakefile (GCE): Generate correct version resource comments. - -2005-01-01 Konstantin Voronkov - - * pthread_mutex_lock.c (pthread_mutex_lock): The new atomic exchange - mutex algorithm is known to allow a thread to steal the lock off - FIFO waiting threads. The next waiting FIFO thread gets a spurious - wake-up and must attempt to re-acquire the lock. The woken thread - was setting itself as the mutex's owner before the re-acquisition. - -2004-11-22 Ross Johnson - - * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Undo change - from 2004-11-02. - * Makefile (DLL_VER): Added for DLL naming suffix - see README. - * GNUmakefile (DLL_VER): Likewise. - * Wmakefile (DLL_VER): Likewise. - * Bmakefile (DLL_VER): Likewise. - * pthread.dsw (version.rc): Added to MSVS workspace. - -2004-11-20 Boudewijn Dekker - - * pthread_getspecific.c (pthread_getspecific): Check for - invalid (NULL) key argument. - -2004-11-19 Ross Johnson - - * config.h (PTW32_THREAD_ID_REUSE_INCREMENT): Added to allow - building the library for either unique thread IDs like Solaris - or non-unique thread IDs like Linux; allows application developers - to override the library's default insensitivity to some apps - that may not be strictly POSIX compliant. - * version.rc: New resource module to encode version information - within the DLL. - * pthread.h: Added PTW32_VERSION* defines and grouped sections - required by resource compiler together; bulk of file is skipped - if RC_INVOKED. Defined some error numbers and other names for - Borland compiler. - -2004-11-02 Ross Johnson - - * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Lock CV mutex at - start of cleanup handler rather than at the end. - * implement.h (PTW32_THREAD_REUSE_EMPTY): Renamed from *_BOTTOM. - (ptw32_threadReuseBottom): New global variable. - * global.c (ptw32_threadReuseBottom): Declare new variable. - * ptw32_reuse.c (ptw32_reuse): Change reuse LIFO stack to LILO queue - to more evenly distribute use of reusable thread IDs; use renamed - PTW32_THREAD_REUSE_EMPTY. - * ptw32_processTerminate.c (ptw2_processTerminate): Use renamed - PTW32_THREAD_REUSE_EMPTY. - -2004-10-31 Ross Johnson - - * implement.h (PThreadState): Add new state value - 'PThreadStateCancelPending'. - * pthread_testcancel.c (pthread_testcancel): Use new thread - 'PThreadStateCancelPending' state as short cut to avoid entering - kernel space via WaitForSingleObject() call. This was obviated - by user space sema acquisition in sem_wait() and sem_timedwait(), - which are also cancelation points. A call to pthread_testcancel() - was required, which introduced a kernel call, effectively nullifying - any gains made by the user space sem acquisition checks. - * pthread_cancel.c (pthread_cancel): Set new thread - 'PThreadStateCancelPending' state. - -2004-10-29 Ross Johnson - - * implement.h (pthread_t): Renamed to ptw32_thread_t; struct contains - all thread state. - * pthread.h (ptw32_handle_t): New general purpose struct to serve - as a handle for various reusable object IDs - currently only used - by pthread_t; contains a pointer to ptw32_thread_t (thread state) - and a general purpose uint for use as a reuse counter or flags etc. - (pthread_t): typedef'ed to ptw32_handle_t; the uint is the reuse - counter that allows the library to maintain unique POSIX thread IDs. - When the pthread struct reuse stack was introduced, threads would - often acquire an identical ID to a previously destroyed thread. The - same was true for the pre-reuse stack library, by virtue of pthread_t - being the address of the thread struct. The new pthread_t retains - the reuse stack but provides virtually unique thread IDs. - * sem_wait.c (ptw32_sem_wait_cleanup): New routine used for - cancelation cleanup. - * sem_timedwait.c (ptw32_sem_timedwait_cleanup): Likewise. - -2004-10-22 Ross Johnson - - * sem_init.c (sem_init): Introduce a 'lock' element in order to - replace the interlocked operations with conventional serialisation. - This is needed in order to be able to atomically modify the sema - value and perform Win32 sema release operations. Win32 semaphores are - used instead of events in order to support efficient multiple posting. - If the whole modify/release isn't atomic, a race between - sem_timedwait() and sem_post() could result in a release when there is - no waiting semaphore, which would cause too many threads to proceed. - * sem_wait.c (sem_wait): Use new 'lock'element. - * sem_timedwait.c (sem_timedwait): Likewise. - * sem_trywait.c (sem_trywait): Likewise. - * sem_post.c (sem_post): Likewise. - * sem_post_multiple.c (sem_post_multiple): Likewise. - * sem_getvalue.c (sem_getvalue): Likewise. - * ptw32_semwait.c (ptw32_semwait): Likewise. - * sem_destroy.c (sem_destroy): Likewise; also tightened the conditions - for semaphore destruction; in particular, a semaphore will not be - destroyed if it has waiters. - * sem_timedwait.c (sem_timedwait): Added cancel cleanup handler to - restore sema value when cancelled. - * sem_wait.c (sem_wait): Likewise. - -2004-10-21 Ross Johnson - - * pthread_mutex_unlock.c (pthread_mutex_unlock): Must use PulseEvent() - rather than SetEvent() to reset the event if there are no waiters. - -2004-10-19 Ross Johnson - - * sem_init.c (sem_init): New semaphore model based on the same idea - as mutexes, i.e. user space interlocked check to avoid - unnecessarily entering kernel space. Wraps the Win32 semaphore and - keeps it's own counter. Although the motivation to do this has existed - for a long time, credit goes to Alexander Terekhov for providing - the logic. I have deviated slightly from AT's logic to add the waiters - count, which has made the code more complicated by adding cancelation - cleanup. This also appears to have broken the VCE (C++ EH) version of - the library (the same problem as previously reported - see BUGS #2), - only apparently not fixable using the usual workaround, nor by turning - all optimisation off. The GCE version works fine, so it is presumed to - be a bug in MSVC++ 6.0. The cancelation exception is thrown and caught - correctly, but the cleanup class destructor is never called. The failing - test is tests\semaphore4.c. - * sem_wait.c (sem_wait): Implemented user space check model. - * sem_post.c (sem_post): Likewise. - * sem_trywait.c (sem_trywait): Likewise. - * sem_timedwait.c (sem_timedwait): Likewise. - * sem_post_multiple.c (sem_post_multiple): Likewise. - * sem_getvalue.c (sem_getvalue): Likewise. - * ptw32_semwait.c (ptw32_semwait): Likewise. - * implement.h (sem_t_): Add counter element. - -2004-10-15 Ross Johnson - - * implement.h (pthread_mutex_t_): Use an event in place of - the POSIX semaphore. - * pthread_mutex_init.c: Create the event; remove semaphore init. - * pthread_mutex_destroy.c: Delete the event. - * pthread_mutex_lock.c: Replace the semaphore wait with the event wait. - * pthread_mutex_trylock.c: Likewise. - * pthread_mutex_timedlock.c: Likewise. - * pthread_mutex_unlock.c: Set the event. - -2004-10-14 Ross Johnson - - * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm using - Terekhov's xchg based variation of Drepper's cmpxchg model. - Theoretically, xchg uses fewer clock cycles than cmpxchg (using IA-32 - as a reference), however, in my opinion bus locking dominates the - equation on smp systems, so the model with the least number of bus - lock operations in the execution path should win, which is Terekhov's - variant. On IA-32 uni-processor systems, it's faster to use the - CMPXCHG instruction without locking the bus than to use the XCHG - instruction, which always locks the bus. This makes the two variants - equal for the non-contended lock (fast lane) execution path on up - IA-32. Testing shows that the xchg variant is faster on up IA-32 as - well if the test forces higher lock contention frequency, even though - kernel calls should be dominating the times (on up IA-32, both - variants used CMPXCHG instructions and neither locked the bus). - * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly. - * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly. - * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly. - * ptw32_InterlockedCompareExchange.c (ptw32_InterlockExchange): New - function. - (PTW32_INTERLOCKED_EXCHANGE): Sets up macro to use inlined - ptw32_InterlockedExchange. - * implement.h (PTW32_INTERLOCKED_EXCHANGE): Set default to - InterlockedExchange(). - * Makefile: Building using /Ob2 so that asm sections within inline - functions are inlined. - -2004-10-08 Ross Johnson - - * pthread_mutex_destroy.c (pthread_mutex_destroy): Critical Section - element is no longer required. - * pthread_mutex_init.c (pthread_mutex_init): Likewise. - * pthread_mutex_lock.c (pthread_mutex_lock): New algorithm following - Drepper's paper at http://people.redhat.com/drepper/futex.pdf, but - using the existing semaphore in place of the futex described in the - paper. Idea suggested by Alexander Terekhov - see: - http://sources.redhat.com/ml/pthreads-win32/2003/msg00108.html - * pthread_mutex_timedlock.c pthread_mutex_timedlock(): Similarly. - * pthread_mutex_trylock.c (pthread_mutex_trylock): Similarly. - * pthread_mutex_unlock.c (pthread_mutex_unlock): Similarly. - * pthread_barrier_wait.c (pthread_barrier_wait): Use inlined version - of InterlockedCompareExchange() if possible - determined at - build-time. - * pthread_spin_destroy.c pthread_spin_destroy(): Likewise. - * pthread_spin_lock.c pthread_spin_lock():Likewise. - * pthread_spin_trylock.c (pthread_spin_trylock):Likewise. - * pthread_spin_unlock.c (pthread_spin_unlock):Likewise. - * ptw32_InterlockedCompareExchange.c: Sets up macro for inlined use. - * implement.h (pthread_mutex_t_): Remove Critical Section element. - (PTW32_INTERLOCKED_COMPARE_EXCHANGE): Set to default non-inlined - version of InterlockedCompareExchange(). - * private.c: Include ptw32_InterlockedCompareExchange.c first for - inlining. - * GNUmakefile: Add commandline option to use inlined - InterlockedCompareExchange(). - * Makefile: Likewise. - -2004-09-27 Ross Johnson - - * pthread_mutex_lock.c (pthread_mutex_lock): Separate - PTHREAD_MUTEX_NORMAL logic since we do not need to keep or check some - state required by other mutex types; do not check mutex pointer arg - for validity - leave this to the system since we are only checking - for NULL pointers. This should improve speed of NORMAL mutexes and - marginally improve speed of other type. - * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise. - * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise; also avoid - entering the critical section for the no-waiters case, with approx. - 30% reduction in lock/unlock overhead for this case. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise; also - no longer keeps mutex if post-timeout second attempt succeeds - this - will assist applications that wish to impose strict lock deadlines, - rather than simply to escape from frozen locks. - -2004-09-09 Tristan Savatier - * pthread.h (struct pthread_once_t_): Qualify the 'done' element - as 'volatile'. - * pthread_once.c: Concerned about possible race condition, - specifically on MPU systems re concurrent access to multibyte types. - [Maintainer's note: the race condition is harmless on SPU systems - and only a problem on MPU systems if concurrent access results in an - exception (presumably generated by a hardware interrupt). There are - other instances of similar harmless race conditions that have not - been identified as issues.] - -2004-09-09 Ross Johnson - - * pthread.h: Declare additional types as volatile. - -2004-08-27 Ross Johnson - - * pthread_barrier_wait.c (pthread_barrier_wait): Remove excessive code - by substituting the internal non-cancelable version of sem_wait - (ptw32_semwait). - -2004-08-25 Ross Johnson - - * pthread_join.c (pthread_join): Rewrite and re-order the conditional - tests in an attempt to improve efficiency and remove a race - condition. - -2004-08-23 Ross Johnson - - * create.c (pthread_create): Don't create a thread if the thread - id pointer location (first arg) is inaccessible. A memory - protection fault will result if the thread id arg isn't an accessible - location. This is consistent with GNU/Linux but different to - Solaris or MKS (and possibly others), which accept NULL as meaning - 'don't return the created thread's ID'. Applications that run - using pthreads-win32 will run on all other POSIX threads - implementations, at least w.r.t. this feature. - - It was decided not to copy the Solaris et al behaviour because, - although it would have simplified some application porting (but only - from Solaris to Windows), the feature is not technically necessary, - and the alternative segfault behaviour helps avoid buggy application - code. - -2004-07-01 Anuj Goyal - - * builddmc.bat: New; Windows bat file to build the library. - * config.h (__DMC__): Support for Digital Mars compiler. - * create.c (__DMC__): Likewise. - * pthread_exit.c (__DMC__): Likewise. - * pthread_join.c (__DMC__): Likewise. - * ptw32_threadDestroy.c (__DMC__): Likewise. - * ptw32_threadStart.c (__DMC__): Likewise. - * ptw32_throw.c (__DMC__): Likewise. - -2004-06-29 Anuj Goyal - - * pthread.h (__DMC__): Initial support for Digital Mars compiler. - -2004-06-29 Will Bryant - - * README.Borland: New; description of Borland changes. - * Bmakefile: New makefile for the Borland make utility. - * ptw32_InterlockedCompareExchange.c: - Add Borland compatible asm code. - -2004-06-26 Jason Bard - - * pthread.h (HAVE_STRUCT_TIMESPEC): If undefined, define it - to avoid timespec struct redefined errors elsewhere in an - application. - -2004-06-21 Ross Johnson - - * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER): Mutex - initialiser added for compatibility with Linux threads and - others; currently not included in SUSV3. - * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER): Likewise. - * pthread.h (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP): Likewise. - * pthread.h (PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP): Likewise. - - * ptw32_mutex_check_need_init.c (ptw32_mutex_check_need_init): - Add new initialisers. - - * pthread_mutex_lock.c (pthread_mutex_lock): Check for new - initialisers. - * pthread_mutex_trylock.c (pthread_mutex_trylock): Likewise. - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise. - * pthread_mutex_unlock.c (pthread_mutex_unlock): Likewise. - * pthread_mutex_destroy.c (pthread_mutex_destroy): Likewise. - -2004-05-20 Ross Johnson - - * README.NONPORTABLE: Document pthread_win32_test_features_np(). - * FAQ: Update various answers. - -2004-05-19 Ross Johnson - - * Makefile: Don't define _WIN32_WINNT on compiler command line. - * GNUmakefile: Likewise. - -2004-05-16 Ross Johnson - - * pthread_cancel.c (pthread_cancel): Adapted to use auto-detected - QueueUserAPCEx features at run-time. - (ptw32_RegisterCancelation): Drop in replacement for QueueUserAPCEx() - if it can't be used. Provides older style non-preemptive async - cancelation. - * pthread_win32_attach_detach_np.c (pthread_win32_attach_np): - Auto-detect quserex.dll and the availability of alertdrv.sys; - initialise and close on process attach/detach. - * global.c (ptw32_register_cancelation): Pointer to either - QueueUserAPCEx() or ptw32_RegisterCancelation() depending on - availability. QueueUserAPCEx makes pre-emptive async cancelation - possible. - * implement.h: Add definitions and prototypes related to QueueUserAPC. - -2004-05-16 Panagiotis E. Hadjidoukas - - * QueueUserAPCEx (separate contributed package): Provides preemptive - APC feature. - * pthread_cancel.c (pthread_cancel): Initial integration of - QueueUserAPCEx into pthreads-win32 to provide true pre-emptive - async cancelation of threads, including blocked threads. - -2004-05-06 Makoto Kato - - * pthread.h (DWORD_PTR): Define typedef for older MSVC. - * pthread_cancel.c (AMD64): Add architecture specific Context register. - * ptw32_getprocessors.c: Use correct types (DWORD_PTR) for mask - variables. - -2004-04-06 P. van Bruggen - - * ptw32_threadDestroy.c: Destroy threadLock mutex to - close a memory leak. - -2004-02-13 Gustav Hallberg - - * pthread_equal.c: Remove redundant equality logic. - -2003-12-10 Philippe Di Cristo - - * sem_timedwait.c (sem_timedwait): Fix timeout calculations. - -2003-10-20 Alexander Terekhov - - * pthread_mutex_timedlock.c (ptw32_semwait): Move to individual module. - * ptw32_semwait.c: New module. - * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Replace cancelable - sem_wait() call with non-cancelable ptw32_semwait() call. - * pthread.c (private.c): Re-order for inlining. GNU C warned that - function ptw32_semwait() was defined 'inline' after it was called. - * pthread_cond_signal.c (ptw32_cond_unblock): Likewise. - * pthread_delay_np.c: Disable Watcom warning with comment. - * *.c (process.h): Remove include from .c files. This is conditionally - included by the common project include files. - -2003-10-20 James Ewing - - * ptw32_getprocessors.c: Some Win32 environments don't have - GetProcessAffinityMask(), so always return CPU count = 1 for them. - * config.h (NEED_PROCESSOR_AFFINITY_MASK): Define for WinCE. - -2003-10-15 Ross Johnson - - * Re-indented all .c files using default GNU style to remove assorted - editor ugliness (used GNU indent utility in default style). - -2003-10-15 Alex Blanco - - * sem_init.c (sem_init): Would call CreateSemaphore even if the sema - struct calloc failed; was not freeing calloced memory if either - CreateSemaphore or CreateEvent failed. - -2003-10-14 Ross Johnson - - * pthread.h: Add Watcom compiler compatibility. Esssentially just add - the cdecl attribute to all exposed function prototypes so that Watcom - generates function call code compatible with non-Watcom built libraries. - By default, Watcom uses registers to pass function args if possible rather - than pushing to stack. - * semaphore.h: Likewise. - * sched.h: Likewise. - * pthread_cond_wait.c (ptw32_cond_wait_cleanup): Define with cdecl attribute - for Watcom compatibility. This routine is called via pthread_cleanup_push so - it had to match function arg definition. - * Wmakefile: New makefile for Watcom builds. - -2003-09-14 Ross Johnson - - * pthread_setschedparam.c (pthread_setschedparam): Attempt to map - all priority levels between max and min (as returned by - sched_get_priority_min/max) to reasonable Win32 priority levels - i.e. - levels between THREAD_PRIORITY_LOWEST/IDLE to THREAD_PRIORITY_LOWEST and - between THREAD_PRIORITY_HIGHEST/TIME_CRITICAL to THREAD_PRIORITY_HIGHEST - while others remain unchanged; record specified thread priority level - for return by pthread_getschedparam. - - Note that, previously, specified levels not matching Win32 priority levels - would silently leave the current thread priority unaltered. - - * pthread_getschedparam.c (pthread_getschedparam): Return the priority - level specified by the latest pthread_setschedparam or pthread_create rather - than the actual running thread priority as returned by GetThreadPriority - as - required by POSIX. I.e. temporary or adjusted actual priority levels are not - returned by this routine. - - * pthread_create.c (pthread_create): For priority levels specified via - pthread attributes, attempt to map all priority levels between max and - min (as returned by sched_get_priority_min/max) to reasonable Win32 - priority levels; record priority level given via attributes, or - inherited from parent thread, for later return by pthread_getschedparam. - - * ptw32_new.c (ptw32_new): Initialise pthread_t_ sched_priority element. - - * pthread_self.c (pthread_self): Set newly created implicit POSIX thread - sched_priority to Win32 thread's current actual priority. Temporarily - altered priorities can't be avoided in this case. - - * implement.h (struct pthread_t_): Add new sched_priority element. - -2003-09-12 Ross Johnson - - * sched_get_priority_min.c (sched_get_priority_min): On error should return -1 - with errno set. - * sched_get_priority_max.c (sched_get_priority_max): Likewise. - -2003-09-03 Ross Johnson - - * w32_cancelableWait.c (ptw32_cancelable_wait): Allow cancelation - of implicit POSIX threads as well. - -2003-09-02 Ross Johnson - - * pthread_win32_attach_detach_np.c (pthread_win32_thread_detach_np): - Add comment. - - * pthread_exit.c (pthread_exit): Fix to recycle the POSIX thread handle in - addition to calling user TSD destructors. Move the implicit POSIX thread exit - handling to ptw32_throw to centralise the logic. - - * ptw32_throw.c (ptw32_throw): Implicit POSIX threads have no point - to jump or throw to, so cleanup and exit the thread here in this case. For - processes using the C runtime, the exit code will be set to the POSIX - reason for the throw (i.e. PTHREAD_CANCEL or the value given to pthread_exit). - Note that pthread_exit() already had similar logic, which has been moved to - here. - - * ptw32_threadDestroy.c (ptw32_threadDestroy): Don't close the Win32 handle - of implicit POSIX threads - expect this to be done by Win32? - -2003-09-01 Ross Johnson - - * pthread_self.c (pthread_self): The newly aquired pthread_t must be - assigned to the reuse stack, not freed, if the routine fails somehow. - -2003-08-13 Ross Johnson - - * pthread_getschedparam.c (pthread_getschedparam): An invalid thread ID - parameter was returning an incorrect error value; now uses a more exhaustive - check for validity. - - * pthread_setschedparam.c (pthread_setschedparam): Likewise. - - * pthread_join.c (pthread_join): Now uses a more exhaustive - check for validity. - - * pthread_detach.c (pthread_detach): Likewise. - - * pthread_cancel.c (pthread_cancel): Likewise. - - * ptw32_threadDestroy.c (ptw32_threadDestroy): pthread_t structs are - never freed - push them onto a stack for reuse. - - * ptw32_new.c (ptw32_new): Check for reusable pthread_t before dynamically - allocating new memory for the struct. - - * pthread_kill.c (pthread_kill): New file; new routine; takes only a zero - signal arg so that applications can check the thread arg for validity; checks - that the underlying Win32 thread HANDLE is valid. - - * pthread.h (pthread_kill): Add prototype. - - * ptw32_reuse.c (ptw32_threadReusePop): New file; new routine; pop a - pthread_t off the reuse stack. pthread_t_ structs that have been destroyed, i.e. - have exited detached or have been joined, are cleaned up and put onto a reuse - stack. Consequently, thread IDs are no longer freed once calloced. The library - will attempt to get a struct off this stack before asking the system to alloc - new memory when creating threads. The stack is guarded by a global mutex. - (ptw32_threadReusePush): New routine; push a pthread_t onto the reuse stack. - - * implement.h (ptw32_threadReusePush): Add new prototype. - (ptw32_threadReusePop): Likewise. - (pthread_t): Add new element. - - * ptw32_processTerminate.c (ptw32_processTerminate): Delete the thread - reuse lock; free all thread ID structs on the thread reuse stack. - - * ptw32_processInitialize.c (ptw32_processInitialize): Initialise the - thread reuse lock. - -2003-07-19 Ross Johnson - - * GNUmakefile: modified to work under MsysDTK environment. - * pthread_spin_lock.c (pthread_spin_lock): Check for NULL arg. - * pthread_spin_unlock.c (pthread_spin_unlock): Likewise. - * pthread_spin_trylock.c (pthread_spin_trylock): Likewise; - fix incorrect pointer value if lock is dynamically initialised by - this function. - * sem_init.c (sem_init): Initialise sem_t value to quell compiler warning. - * sem_destroy.c (sem_destroy): Likewise. - * ptw32_threadStart.c (non-MSVC code sections): Include rather - than old-style ; fix all std:: namespace entities such as - std::terminate_handler instances and associated methods. - * ptw32_callUserDestroyRoutines.c (non-MSVC code sections): Likewise. - -2003-06-24 Piet van Bruggen - - * pthread_spin_destroy.c (pthread_spin_destroy): Was not freeing the - spinlock struct. - -2003-06-22 Nicolas Barry - - * pthread_mutex_destroy.c (pthread_mutex_destroy): When called - with a recursive mutex that was locked by the current thread, the - function was failing with a success return code. - -2003-05-15 Steven Reddie - - * pthread_win32_attach_detach_np.c (pthread_win32_process_detach_np): - NULLify ptw32_selfThreadKey after the thread is destroyed, otherwise - destructors calling pthreads routines might resurrect it again, creating - memory leaks. Call the underlying Win32 Tls routine directly rather than - pthread_setspecific(). - (pthread_win32_thread_detach_np): Likewise. - -2003-05-14 Viv - - * pthread.dsp: Change /MT compile flag to /MD. - -2003-03-04 Alexander Terekhov - - * pthread_mutex_timedlock.c (pthread_mutex_timedlock): Fix failure to - set ownership of mutex on second grab after abstime timeout. - - bug reported by Robert Strycek - -2002-12-17 Thomas Pfaff - - * pthread_mutex_lock.c (ptw32_semwait): New static routine to provide - a non-cancelable sem_wait() function. This is consistent with the - way that pthread_mutex_timedlock.c does it. - (pthread_mutex_lock): Use ptw32_semwait() instead of sem_wait(). - -2002-12-11 Thomas Pfaff - - * pthread_mutex_trylock.c: Should return EBUSY rather than EDEADLK. - * pthread_mutex_destroy.c: Remove redundant ownership test (the - trylock call does this for us); do not destroy a recursively locked - mutex. - -2002-09-20 Michael Johnson - - * pthread_cond_destroy.c (pthread_cond_destroy): - When two different threads exist, and one is attempting to - destroy a condition variable while the other is attempting to - initialize a condition variable that was created with - PTHREAD_COND_INITIALIZER, a deadlock can occur. Shrink - the ptw32_cond_list_lock critical section to fix it. - -2002-07-31 Ross Johnson - - * ptw32_threadStart.c (ptw32_threadStart): Thread cancelLock - destruction moved to ptw32_threadDestroy(). - - * ptw32_threadDestroy.c (ptw32_threadDestroy): Destroy - the thread's cancelLock. Moved here from ptw32_threadStart.c - to cleanup implicit threads as well. - -2002-07-30 Alexander Terekhov - - * pthread_cond_wait.c (ptw32_cond_wait_cleanup): - Remove code designed to avoid/prevent spurious wakeup - problems. It is believed that the sem_timedwait() call - is consuming a CV signal that it shouldn't and this is - breaking the avoidance logic. - -2002-07-30 Ross Johnson - - * sem_timedwait.c (sem_timedwait): Tighten checks for - unreasonable abstime values - that would result in - unexpected timeout values. - - * w32_CancelableWait.c (ptw32_cancelable_wait): - Tighten up return value checking and add comments. - - -2002-06-08 Ross Johnson - - * sem_getvalue.c (sem_getvalue): Now returns a value for the - NEED_SEM version (i.e. earlier versions of WinCE). - - -2002-06-04 Rob Fanner - - * sem_getvalue.c (sem_getvalue): The Johnson M. Hart - approach didn't work - we are forced to take an - intrusive approach. We try to decrement the sema - and then immediately release it again to get the - value. There is a small probability that this may - block other threads, but only momentarily. - -2002-06-03 Ross Johnson - - * sem_init.c (sem_init): Initialise Win32 semaphores - to _POSIX_SEM_VALUE_MAX (which this implementation - defines in pthread.h) so that sem_getvalue() can use - the trick described in the comments in sem_getvalue(). - * pthread.h (_POSIX_SEM_VALUE_MAX): Defined. - (_POSIX_SEM_NSEMS_MAX): Defined - not used but may be - useful for source code portability. - -2002-06-03 Rob Fanner - - * sem_getvalue.c (sem_getvalue): Did not work on NT. - Use approach suggested by Johnson M. Hart in his book - "Win32 System Programming". - -2002-02-28 Ross Johnson - - * errno.c: Compiler directive was incorrectly including code. - * pthread.h: Conditionally added some #defines from config.h - needed when not building the library. e.g. NEED_ERRNO, NEED_SEM. - (PTW32_DLLPORT): Now only defined if _DLL defined. - (_errno): Compiler directive was incorrectly including prototype. - * sched.h: Conditionally added some #defines from config.h - needed when not building the library. - * semaphore.h: Replace an instance of NEED_SEM that should - have been NEED_ERRNO. This change currently has nil effect. - - * GNUmakefile: Correct some recent changes. - - * Makefile: Add rule to generate pre-processor output. - -2002-02-23 Ross Johnson - - * pthread_rwlock_timedrdlock.c: New - untested. - * pthread_rwlock_timedwrlock.c: New - untested. - - * Testsuite passed (except known MSVC++ problems) - - * pthread_cond_destroy.c: Expand the time change - critical section to solve deadlock problem. - - * pthread.c: Add all remaining C modules. - * pthread.h: Use dllexport/dllimport attributes on functions - to avoid using pthread.def. - * sched.h: Likewise. - * semaphore.h: Likewise. - * GNUmakefile: Add new targets for single translation - unit build to maximise inlining potential; generate - pthread.def automatically. - * Makefile: Likewise, but no longer uses pthread.def. - -2002-02-20 Ross Johnson - - * pthread_cond_destroy.c (pthread_cond_destroy): - Enter the time change critical section earlier. - -2002-02-17 Ross Johnson - - * nonportable.c (pthread_delay_np): Make a true - cancelation point. Deferred cancels will interrupt the - wait. - -2002-02-07 Ross Johnson - - Reduced name space pollution. - ----------------------------- - When the appropriate symbols are defined, the headers - will restrict the definitions of new names. In particular, - it must be possible to NOT include the - header and related definitions with some combination - of symbol definitions. Secondly, it should be possible - that additional definitions should be limited to POSIX - compliant symbols by the definition of appropriate symbols. - - * pthread.h: POSIX conditionals. - * sched.h: POSIX conditionals. - * semaphore.h: POSIX conditionals. - - * semaphore.c: Included . - (sem_init): Changed magic 0x7FFFFFFFL to INT_MAX. - (sem_getvalue): Trial version. - - Reduce executable size. - ----------------------- - When linking with the static library, only those - routines actually called, either directly or indirectly - should be included. - - [Gcc has the -ffunction-segments option to do this but MSVC - doesn't have this feature as far as I can determine. Other - compilers are undetermined as well. - rpj] - - * semaphore.c: All routines are now in separate compilation units; - This file is used to congregate the separate modules for - potential inline optimisation and backward build compatibility. - * sem_close.c: Separated routine from semaphore.c. - * ptw32_decrease_semaphore.c: Likewise. - * sem_destroy.c: Likewise. - * sem_getvalue.c: Likewise. - * ptw32_increase_semaphore.c: Likewise. - * sem_init.c: Likewise. - * sem_open.c: Likewise. - * sem_post.c: Likewise. - * sem_post_multiple.c: Likewise. - * sem_timedwait.c: Likewise. - * sem_trywait.c: Likewise. - * sem_unlink.c: Likewise. - * sem_wait.c: Likewise. - -2002-02-04 Ross Johnson - - The following extends the idea above to the rest of pthreads-win32 - rpj - - * attr.c: All routines are now in separate compilation units; - This file is used to congregate the separate modules for - potential inline optimisation and backward build compatibility. - * pthread_attr_destroy.c: Separated routine from attr.c. - * pthread_attr_getdetachstate.c: Likewise. - * pthread_attr_getscope.c: Likewise. - * pthread_attr_getstackaddr.c: Likewise. - * pthread_attr_getstacksize.c: Likewise. - * pthread_attr_init.c: Likewise. - * pthread_attr_is_attr.c: Likewise. - * pthread_attr_setdetachstate.c: Likewise. - * pthread_attr_setscope.c: Likewise. - * pthread_attr_setstackaddr.c: Likewise. - * pthread_attr_setstacksize.c: Likewise. - - * pthread.c: Agregation of agregate modules for super-inlineability. - -2002-02-02 Ross Johnson - - * cancel.c: Rearranged some code and introduced checks - to disable cancelation at the start of a thread's cancelation - run to prevent double cancelation. The main problem - arises if a thread is canceling and then receives a subsequent - async cancel request. - * private.c: Likewise. - * condvar.c: Place pragmas around cleanup_push/pop to turn - off inline optimisation (/Obn where n>0 - MSVC only). Various - optimisation switches in MSVC turn this on, which interferes with - the way that cleanup handlers are run in C++ EH and SEH - code. Application code compiled with inline optimisation must - also wrap cleanup_push/pop blocks with the pragmas, e.g. - #pragma inline_depth(0) - pthread_cleanup_push(...) - ... - pthread_cleanup_pop(...) - #pragma inline_depth(8) - * rwlock.c: Likewise. - * mutex.c: Remove attempts to inline some functions. - * signal.c: Modify misleading comment. - -2002-02-01 Ross Johnson - - * semaphore.c (sem_trywait): Fix missing errno return - for systems that define NEED_SEM (e.g. early WinCE). - * mutex.c (pthread_mutex_timedlock): Return ENOTSUP - for systems that define NEED_SEM since they don't - have sem_trywait(). - -2002-01-27 Ross Johnson - - * mutex.c (pthread_mutex_timedlock): New function suggested by - Alexander Terekhov. The logic required to implement this - properly came from Alexander, with some collaboration - with Thomas Pfaff. - (pthread_mutex_unlock): Wrap the waiters check and sema - post in a critical section to prevent a race with - pthread_mutex_timedlock. - (ptw32_timed_semwait): New function; - returns a special result if the absolute timeout parameter - represents a time already passed when called; used by - pthread_mutex_timedwait(). Have deliberately not reused - the name "ptw32_sem_timedwait" because they are not the same - routine. - * condvar.c (ptw32_cond_timedwait): Use the new sem_timedwait() - instead of ptw32_sem_timedwait(), which now has a different - function. See previous. - * implement.h: Remove prototype for ptw32_sem_timedwait. - See next. - (pthread_mutex_t_): Add critical section element for access - to lock_idx during mutex post-timeout processing. - * semaphore.h (sem_timedwait): See next. - * semaphore.c (sem_timedwait): See next. - * private.c (ptw32_sem_timedwait): Move to semaphore.c - and rename as sem_timedwait(). - -2002-01-18 Ross Johnson - - * sync.c (pthread_join): Was getting the exit code from the - calling thread rather than the joined thread if - defined(__MINGW32__) && !defined(__MSVCRT__). - -2002-01-15 Ross Johnson - - * pthread.h: Unless the build explicitly defines __CLEANUP_SEH, - __CLEANUP_CXX, or __CLEANUP_C, then the build defaults to - __CLEANUP_C style cleanup. This style uses setjmp/longjmp - in the cancelation and thread exit implementations and therefore - won't do stack unwinding if linked to applications that have it - (e.g. C++ apps). This is currently consistent with most/all - commercial Unix POSIX threads implementations. - - * spin.c (pthread_spin_init): Edit renamed function call. - * nonportable.c (pthread_num_processors_np): New. - (pthread_getprocessors_np): Renamed to ptw32_getprocessors - and moved to private.c. - * private.c (pthread_getprocessors): Moved here from - nonportable.c. - * pthread.def (pthread_getprocessors_np): Removed - from export list. - - * rwlock.c (pthread_rwlockattr_init): New. - (pthread_rwlockattr_destroy): New. - (pthread_rwlockattr_getpshared): New. - (pthread_rwlockattr_setpshared): New. - -2002-01-14 Ross Johnson - - * attr.c (pthread_attr_setscope): Fix struct pointer - indirection error introduced 2002-01-04. - (pthread_attr_getscope): Likewise. - -2002-01-12 Ross Johnson - - * pthread.dsp (SOURCE): Add missing source files. - -2002-01-08 Ross Johnson - - * mutex.c (pthread_mutex_trylock): use - ptw32_interlocked_compare_exchange function pointer - rather than ptw32_InterlockedCompareExchange() directly - to retain portability to non-iX86 processors, - e.g. WinCE etc. The pointer will point to the native - OS version of InterlockedCompareExchange() if the - OS supports it (see ChangeLog entry of 2001-10-17). - -2002-01-07 Thomas Pfaff , Alexander Terekhov - - * mutex.c (pthread_mutex_init): Remove critical - section calls. - (pthread_mutex_destroy): Likewise. - (pthread_mutex_unlock): Likewise. - (pthread_mutex_trylock): Likewise; uses - ptw32_InterlockedCompareExchange() to avoid need for - critical section; library is no longer i386 compatible; - recursive mutexes now increment the lock count rather - than return EBUSY; errorcheck mutexes return EDEADLCK - rather than EBUSY. This behaviour is consistent with the - Solaris pthreads implementation. - * implement.h (pthread_mutex_t_): Remove critical - section element - no longer needed. - - -2002-01-04 Ross Johnson - - * attr.c (pthread_attr_setscope): Add more error - checking and actually store the scope value even - though it's not really necessary. - (pthread_attr_getscope): Return stored value. - * implement.h (pthread_attr_t_): Add new scope element. - * ANNOUNCE: Fix out of date comment next to - pthread_attr_setscope in conformance section. - -2001-12-21 Alexander Terekhov - - * mutex.c (pthread_mutex_lock): Decrementing lock_idx was - not thread-safe. - (pthread_mutex_trylock): Likewise. - -2001-10-26 prionx@juno.com - - * semaphore.c (sem_init): Fix typo and missing bracket - in conditionally compiled code. Only older versions of - WinCE require this code, hence it doesn't normally get - tested; somehow when sem_t reverted to an opaque struct - the calloc NULL check was left in the conditionally included - section. - (sem_destroy): Likewise, the calloced sem_t wasn't being freed. - -2001-10-25 Ross Johnson - - * GNUmakefile (libwsock32): Add to linker flags for - WSAGetLastError() and WSASetLastError(). - * Makefile (wsock32.lib): Likewise. - * create.c: Minor mostly inert changes. - * implement.h (PTW32_MAX): Move into here and renamed - from sched.h. - (PTW32_MIN): Likewise. - * GNUmakefile (TEST_ICE): Define if testing internal - implementation of InterlockedCompareExchange. - * Makefile (TEST_ICE): Likewise. - * private.c (TEST_ICE): Likewise. - -2001-10-24 Ross Johnson - - * attr.c (pthread_attr_setstacksize): Quell warning - from LCC by conditionally compiling the stacksize - validity check. LCC correctly warns that the condition - (stacksize < PTHREAD_STACK_MIN) is suspicious - because STACK_MIN is 0 and stacksize is of type - size_t (or unsigned int). - -2001-10-17 Ross Johnson - - * barrier.c: Move _LONG and _LPLONG defines into - implement.h; rename to PTW32_INTERLOCKED_LONG and - PTW32_INTERLOCKED_LPLONG respectively. - * spin.c: Likewise; ptw32_interlocked_compare_exchange used - in place of InterlockedCompareExchange directly. - * global.c (ptw32_interlocked_compare_exchange): Add - prototype for this new routine pointer to be used when - InterlockedCompareExchange isn't supported by Windows. - * nonportable.c (pthread_win32_process_attach_np): Check for - support of InterlockedCompareExchange in kernel32 and assign its - address to ptw32_interlocked_compare_exchange if it exists, or - our own ix86 specific implementation ptw32_InterlockedCompareExchange. - *private.c (ptw32_InterlockedCompareExchange): An - implementation of InterlockedCompareExchange() which is - specific to ix86; written directly in assembler for either - MSVC or GNU C; needed because Windows 95 doesn't support - InterlockedCompareExchange(). - - * sched.c (sched_get_priority_min): Extend to return - THREAD_PRIORITY_IDLE. - (sched_get_priority_max): Extend to return - THREAD_PRIORITY_CRITICAL. - -2001-10-15 Ross Johnson - - * spin.c (pthread_spin_lock): PTHREAD_SPINLOCK_INITIALIZER - was causing a program fault. - (pthread_spin_init): Could have alloced memory - without freeing under some error conditions. - - * mutex.c (pthread_mutex_init): Move memory - allocation of mutex struct after checking for - PROCESS_SHARED. - -2001-10-12 Ross Johnson - - * spin.c (pthread_spin_unlock): Was not returning - EPERM if the spinlock was not locked, for multi CPU - machines. - -2001-10-08 Ross Johnson - - * spin.c (pthread_spin_trylock): Was not returning - EBUSY for multi CPU machines. - -2001-08-24 Ross Johnson - - * condvar.c (pthread_cond_destroy): Remove cv element - that is no longer used. - * implement.h: Likewise. - -2001-08-23 Alexander Terekhov - - * condvar.c (pthread_cond_destroy): fix bug with - respect to deadlock in the case of concurrent - _destroy/_unblock; a condition variable can be destroyed - immediately after all the threads that are blocked on - it are awakened. - -2001-08-23 Phil Frisbie, Jr. - - * tsd.c (pthread_getspecific): Preserve the last - winsock error [from WSAGetLastError()]. - -2001-07-18 Scott McCaskill - - * mutex.c (pthread_mutexattr_init): Return ENOMEM - immediately and don't dereference the NULL pointer - if calloc fails. - (pthread_mutexattr_getpshared): Don't dereference - a pointer that is possibly NULL. - * barrier.c (pthread_barrierattr_init): Likewise - (pthread_barrierattr_getpshared): Don't dereference - a pointer that is possibly NULL. - * condvar.c (pthread_condattr_getpshared): Don't dereference - a pointer that is possibly NULL. - -2001-07-15 Ross Johnson - - * rwlock.c (pthread_rwlock_wrlock): Is allowed to be - a cancelation point; re-enable deferred cancelability - around the CV call. - -2001-07-10 Ross Johnson - - * barrier.c: Still more revamping. The exclusive access - mutex isn't really needed so it has been removed and replaced - by an InterlockedDecrement(). nSerial has been removed. - iStep is now dual-purpose. The process shared attribute - is now stored in the barrier struct. - * implement.h (pthread_barrier_t_): Lost some/gained one - elements. - * private.c (ptw32_threadStart): Removed some comments. - -2001-07-10 Ross Johnson - - * barrier.c: Revamped to fix the race condition. Two alternating - semaphores are used instead of the PulseEvent. Also improved - overall throughput by returning PTHREAD_BARRIER_SERIAL_THREAD - to the first waking thread. - * implement.h (pthread_barrier_t_): Revamped. - -2001-07-09 Ross Johnson - - * barrier.c: Fix several bugs in all routines. Now passes - tests/barrier5.c which is fairly rigorous. There is still - a non-optimal work-around for a race condition between - the barrier breeched event signal and event wait. Basically - the last (signalling) thread to hit the barrier yields - to allow any other threads, which may have lost the race, - to complete. - -2001-07-07 Ross Johnson - - * barrier.c: Changed synchronisation mechanism to a - Win32 manual reset Event and use PulseEvent to signal - waiting threads. If the implementation continued to use - a semaphore it would require a second semaphore and - some management to use them alternately as barriers. A - single semaphore allows threads to cascade from one barrier - through the next, leaving some threads blocked at the first. - * implement.h (pthread_barrier_t_): As per above. - * general: Made a number of other routines inlinable. - -2001-07-07 Ross Johnson - - * spin.c: Revamped and working; included static initialiser. - Now beta level. - * barrier.c: Likewise. - * condvar.c: Macro constant change; inline auto init routine. - * mutex.c: Likewise. - * rwlock.c: Likewise. - * private.c: Add support for spinlock initialiser. - * global.c: Likewise. - * implement.h: Likewise. - * pthread.h (PTHREAD_SPINLOCK_INITIALIZER): Fix typo. - -2001-07-05 Ross Johnson - - * barrier.c: Remove static initialisation - irrelevent - for this object. - * pthread.h (PTHREAD_BARRIER_INITIALIZER): Removed. - * rwlock.c (pthread_rwlock_wrlock): This routine is - not a cancelation point - disable deferred - cancelation around call to pthread_cond_wait(). - -2001-07-05 Ross Johnson - - * spin.c: New module implementing spin locks. - * barrier.c: New module implementing barriers. - * pthread.h (_POSIX_SPIN_LOCKS): defined. - (_POSIX_BARRIERS): Defined. - (pthread_spin_*): Defined. - (pthread_barrier*): Defined. - (PTHREAD_BARRIER_SERIAL_THREAD): Defined. - * implement.h (pthread_spinlock_t_): Defined. - (pthread_barrier_t_): Defined. - (pthread_barrierattr_t_): Defined. - - * mutex.c (pthread_mutex_lock): Return with the error - if an auto-initialiser initialisation fails. - - * nonportable.c (pthread_getprocessors_np): New; gets the - number of available processors for the current process. - -2001-07-03 Ross Johnson - - * pthread.h (_POSIX_READER_WRITER_LOCKS): Define it - if not already defined. - -2001-07-01 Alexander Terekhov - - * condvar.c: Fixed lost signal bug reported by Timur Aydin - (taydin@snet.net). - [RPJ (me) didn't translate the original algorithm - correctly.] - * semaphore.c: Added sem_post_multiple; this is a useful - routine, but it doesn't appear to be standard. For now it's - not an exported function. - -2001-06-25 Ross Johnson - - * create.c (pthread_create): Add priority inheritance - attributes. - * mutex.c (pthread_mutex_lock): Remove some overhead for - PTHREAD_MUTEX_NORMAL mutex types. Specifically, avoid - calling pthread_self() and pthread_equal() to check/set - the mutex owner. Introduce a new pseudo owner for this - type. Test results suggest increases in speed of up to - 90% for non-blocking locks. - This is the default type of mutex used internally by other - synchronising objects, ie. condition variables and - read-write locks. The test rwlock7.c shows about a - 30-35% speed increase over snapshot 2001-06-06. The - price of this is that the application developer - must ensure correct behaviour, or explicitly set the - mutex to a safer type such as PTHREAD_MUTEX_ERRORCHECK. - For example, PTHREAD_MUTEX_NORMAL (or PTHREAD_MUTEX_DEFAULT) - type mutexes will not return an error if a thread which is not - the owner calls pthread_mutex_unlock. The call will succeed - in unlocking the mutex if it is currently locked, but a - subsequent unlock by the true owner will then fail with EPERM. - This is however consistent with some other implementations. - (pthread_mutex_unlock): Likewise. - (pthread_mutex_trylock): Likewise. - (pthread_mutex_destroy): Likewise. - * attr.c (pthread_attr_init): PTHREAD_EXPLICIT_SCHED is the - default inheritance attribute; THREAD_PRIORITY_NORMAL is - the default priority for new threads. - * sched.c (pthread_attr_setschedpolicy): Added routine. - (pthread_attr_getschedpolicy): Added routine. - (pthread_attr_setinheritsched): Added routine. - (pthread_attr_getinheritsched): Added routine. - * pthread.h (sched_rr_set_interval): Added as a macro; - returns -1 with errno set to ENOSYS. - -2001-06-23 Ross Johnson - - *sched.c (pthread_attr_setschedparam): Add priority range - check. - (sched_setscheduler): New function; checks for a valid - pid and policy; checks for permission to set information - in the target process; expects pid to be a Win32 process ID, - not a process handle; the only scheduler policy allowed is - SCHED_OTHER. - (sched_getscheduler): Likewise, but checks for permission - to query. - * pthread.h (SCHED_*): Moved to sched.h as defined in the - POSIX standard. - * sched.h (SCHED_*): Moved from pthread.h. - (pid_t): Defined if necessary. - (sched_setscheduler): Defined. - (sched_getscheduler): Defined. - * pthread.def (sched_setscheduler): Exported. - (sched_getscheduler): Likewise. - -2001-06-23 Ralf Brese - - * create.c (pthread_create): Set thread priority from - thread attributes. - -2001-06-18 Ross Johnson - - * Made organisational-only changes to UWIN additions. - * dll.c (dllMain): Moved UWIN process attach code - to pthread_win32_process_attach_np(); moved - instance of pthread_count to global.c. - * global.c (pthread_count): Moved from dll.c. - * nonportable.c (pthread_win32_process_attach_np): - Moved _UWIN code to here from dll.c. - * implement.h (pthread_count): Define extern int. - * create.c (pthread_count): Remove extern int. - * private.c (pthread_count): Likewise. - * exit.c (pthread_count): Likewise. - -2001-06-18 David Korn - - * dll.c: Added changes necessary to work with UWIN. - * create.c: Likewise. - * pthread.h: Likewise. - * misc.c: Likewise. - * exit.c: Likewise. - * private.c: Likewise. - * implement.h: Likewise. - There is some room at the start of struct pthread_t_ - to implement the signal semantics in UWIN's posix.dll - although this is not yet complete. - * Nmakefile: Compatible with UWIN's Nmake utility. - * Nmakefile.tests: Likewise - for running the tests. - -2001-06-08 Ross Johnson - - * semaphore.h (sem_t): Fixed for compile and test. - * implement.h (sem_t_): Likewise. - * semaphore.c: Likewise. - * private.c (ptw32_sem_timedwait): Updated to use new - opaque sem_t. - -2001-06-06 Ross Johnson - - * semaphore.h (sem_t): Is now an opaque pointer; - moved actual definition to implement.h. - * implement.h (sem_t_): Move here from semaphore.h; - was the definition of sem_t. - * semaphore.c: Wherever necessary, changed use of sem - from that of a pointer to a pointer-pointer; added - extra checks for a valid sem_t; NULL sem_t when - it is destroyed; added extra checks when creating - and destroying sem_t elements in the NEED_SEM - code branches; changed from using a pthread_mutex_t - ((*sem)->mutex) to CRITICAL_SECTION ((*sem)->sem_lock_cs) - in NEED_SEM branches for access serialisation. - -2001-06-06 Ross Johnson - - * mutex.c (pthread_mutexattr_init): Remove - ptw32_mutex_default_kind. - -2001-06-05 Ross Johnson - - * nonportable.c (pthread_mutex_setdefaultkind_np): - Remove - should not have been included in the first place. - (pthread_mutex_getdefaultkind_np): Likewise. - * global.c (ptw32_mutex_default_kind): Likewise. - * mutex.c (pthread_mutex_init): Remove use of - ptw32_mutex_default_kind. - * pthread.h (pthread_mutex_setdefaultkind_np): Likewise. - (pthread_mutex_getdefaultkind_np): Likewise. - * pthread.def (pthread_mutexattr_setkind_np): Added. - (pthread_mutexattr_getkind_np): Likewise. - - * README: Many changes that should have gone in before - the last snapshot. - * README.NONPORTABLE: New - referred to by ANNOUNCE - but never created; documents the non-portable routines - included in the library - moved from README with new - routines added. - * ANNOUNCE (pthread_mutexattr_setkind_np): Added to - compliance list. - (pthread_mutexattr_getkind_np): Likewise. - -2001-06-04 Ross Johnson - - * condvar.c: Add original description of the algorithm as - developed by Terekhov and Thomas, plus reference to - README.CV. - -2001-06-03 Alexander Terekhov , Louis Thomas - - * condvar.c (pthread_cond_init): Completely revamped. - (pthread_cond_destroy): Likewise. - (ptw32_cond_wait_cleanup): Likewise. - (ptw32_cond_timedwait): Likewise. - (ptw32_cond_unblock): New general signaling routine. - (pthread_cond_signal): Now calls ptw32_cond_unblock. - (pthread_cond_broadcast): Likewise. - * implement.h (pthread_cond_t_): Revamped. - * README.CV: New; explanation of the above changes. - -2001-05-30 Ross Johnson - - * pthread.h (rand_r): Fake using _seed argument to quell - compiler warning (compiler should optimise this away later). - - * GNUmakefile (OPT): Leave symbolic information out of the library - and increase optimisation level - for smaller faster prebuilt - dlls. - -2001-05-29 Milan Gardian - - * Makefile: fix typo. - * pthreads.h: Fix problems with stdcall/cdecl conventions, in particular - remove the need for PT_STDCALL everywhere; remove warning supression. - * (errno): Fix the longstanding "inconsistent dll linkage" problem - with errno; now also works with /MD debugging libs - - warnings emerged when compiling pthreads library with /MD (or /MDd) - compiler switch, instead of /MT (or /MTd) (i.e. when compiling pthreads - using Multithreaded DLL CRT instead of Multithreaded statically linked - CRT). - * create.c (pthread_create): Likewise; fix typo. - * private.c (ptw32_threadStart): Eliminate use of terminate() which doesn't - throw exceptions. - * Remove unnecessary #includes from a number of modules - - [I had to #include malloc.h in implement.h for gcc - rpj]. - -2001-05-29 Thomas Pfaff - - * pthread.h (PTHREAD_MUTEX_DEFAULT): New; equivalent to - PTHREAD_MUTEX_DEFAULT_NP. - * (PTHREAD_MUTEX_NORMAL): Similarly. - * (PTHREAD_MUTEX_ERRORCHECK): Similarly. - * (PTHREAD_MUTEX_RECURSIVE): Similarly. - * (pthread_mutex_setdefaultkind_np): New; Linux compatibility stub - for pthread_mutexattr_settype. - * (pthread_mutexattr_getkind_np): New; Linux compatibility stub - for pthread_mutexattr_gettype. - * mutex.c (pthread_mutexattr_settype): New; allow - the following types of mutex: - PTHREAD_MUTEX_DEFAULT_NP - PTHREAD_MUTEX_NORMAL_NP - PTHREAD_MUTEX_ERRORCHECK_NP - PTHREAD_MUTEX_RECURSIVE_NP - * Note that PTHREAD_MUTEX_DEFAULT is equivalent to - PTHREAD_MUTEX_NORMAL - ie. mutexes should no longer - be recursive by default, and a thread will deadlock if it - tries to relock a mutex it already owns. This is inline with - other pthreads implementations. - * (pthread_mutex_lock): Process the lock request - according to the mutex type. - * (pthread_mutex_init): Eliminate use of Win32 mutexes as the - basis of POSIX mutexes - instead, a combination of one critical section - and one semaphore are used in conjunction with Win32 Interlocked* routines. - * (pthread_mutex_destroy): Likewise. - * (pthread_mutex_lock): Likewise. - * (pthread_mutex_trylock): Likewise. - * (pthread_mutex_unlock): Likewise. - * Use longjmp/setjmp to implement cancelation when building the library - using a C compiler which doesn't support exceptions, e.g. gcc -x c (note - that gcc -x c++ uses exceptions). - * Also fixed some of the same typos and eliminated PT_STDCALL as - Milan Gardian's patches above. - -2001-02-07 Alexander Terekhov - - * rwlock.c: Revamped. - * implement.h (pthread_rwlock_t_): Redefined. - This implementation does not have reader/writer starvation problem. - Rwlock attempts to behave more like a normal mutex with - races and scheduling policy determining who is more important; - It also supports recursive locking, - has less synchronization overhead (no broadcasts at all, - readers are not blocked on any condition variable) and seem to - be faster than the current implementation [W98 appears to be - approximately 15 percent faster at least - on top of speed increase - from Thomas Pfaff's changes to mutex.c - rpj]. - -2000-12-29 Ross Johnson - - * Makefile: Back-out "for" loops which don't work. - - * GNUmakefile: Remove the fake.a target; add the "realclean" - target; don't remove built libs under the "clean" target. - - * config.h: Add a guard against multiple inclusion. - - * semaphore.h: Add some defines from config.h to make - semaphore.h independent of config.h when building apps. - - * pthread.h (_errno): Back-out previous fix until we know how to - fix it properly. - - * implement.h (lockCount): Add missing element to pthread_mutex_t_. - - * sync.c (pthread_join): Spelling fix in comment. - - * private.c (ptw32_threadStart): Reset original termination - function (C++). - (ptw32_threadStart): Cleanup detached threads early in case - the library is statically linked. - (ptw32_callUserDestroyRoutines): Remove [SEH] __try block from - destructor call so that unhandled exceptions will be passed through - to the system; call terminate() from [C++] try block for the same - reason. - - * tsd.c (pthread_getspecific): Add comment. - - * mutex.c (pthread_mutex_init): Initialise new elements in - pthread_mutex_t. - (pthread_mutex_unlock): Invert "pthread_equal()" test. - -2000-12-28 Ross Johnson - - * semaphore.c (mode_t): Use ifndef HAVE_MODE_T to include definition. - - * config.h.in (HAVE_MODE_T): Added. - (_UWIN): Start adding defines for the UWIN package. - - * private.c (ptw32_threadStart): Unhandled exceptions are - now passed through to the system to deal with. This is consistent - with normal Windows behaviour. C++ applications may use - set_terminate() to override the default behaviour which is - to call ptw32_terminate(). Ptw32_terminate() cleans up some - POSIX thread stuff before calling the system default function - which calls abort(). The users termination function should conform - to standard C++ semantics which is to not return. It should - exit the thread (call pthread_exit()) or exit the application. - * private.c (ptw32_terminate): Added as the default set_terminate() - function. It calls the system default function after cleaning up - some POSIX thread stuff. - - * implement.h (ptw32_try_enter_critical_section): Move - declaration. - * global.c (ptw32_try_enter_critical_section): Moved - from dll.c. - * dll.c: Move process and thread attach/detach code into - functions in nonportable.c. - * nonportable.c (pthread_win32_process_attach_np): Process - attach code from dll.c is now available to static linked - applications. - * nonportable.c (pthread_win32_process_detach_np): Likewise. - * nonportable.c (pthread_win32_thread_attach_np): Likewise. - * nonportable.c (pthread_win32_thread_detach_np): Likewise. - - * pthread.h: Add new non-portable prototypes for static - linked applications. - - * GNUmakefile (OPT): Increase optimisation flag and remove - debug info flag. - - * pthread.def: Add new non-portable exports for static - linked applications. - -2000-12-11 Ross Johnson - - * FAQ: Update Answer 6 re getting a fully working - Mingw32 built library. - -2000-10-10 Steven Reddie - - * misc.c (pthread_self): Restore Win32 "last error" - cleared by TlsGetValue() call in - pthread_getspecific() - -2000-09-20 Arthur Kantor - - * mutex.c (pthread_mutex_lock): Record the owner - of the mutex. This requires also keeping count of - recursive locks ourselves rather than leaving it - to Win32 since we need to know when to NULL the - thread owner when the mutex is unlocked. - (pthread_mutex_trylock): Likewise. - (pthread_mutex_unlock): Check that the calling - thread owns the mutex, decrement the recursive - lock count, and NULL the owner if zero. Return - EPERM if the mutex is owned by another thread. - * implement.h (pthread_mutex_t_): Add ownerThread - and lockCount members. - -2000-09-13 Jef Gearhart - - * mutex.c (pthread_mutex_init): Call - TryEnterCriticalSection through the pointer - rather than directly so that the dll can load - on Windows versions that can't resolve the - function, eg. Windows 95 - -2000-09-09 Ross Johnson - - * pthread.h (ctime_r): Fix arg. - -2000-09-08 Ross Johnson - - * GNUmakefile(_WIN32_WINNT=0x400): Define in CFLAGS; - doesn't seem to be needed though. - - * cancel.c (pthread_cancel): Must get "self" through - calling pthread_self() which will ensure a POSIX thread - struct is built for non-POSIX threads; return an error - if this fails - - Ollie Leahy - (pthread_setcancelstate): Likewise. - (pthread_setcanceltype): Likewise. - * misc.c (ptw32_cancelable_wait): Likewise. - - * private.c (ptw32_tkAssocCreate): Remove unused #if 0 - wrapped code. - - * pthread.h (ptw32_get_exception_services_code): - Needed to be forward declared unconditionally. - -2000-09-06 Ross Johnson - - * cancel.c (pthread_cancel): If called from the main - thread "self" would be NULL; get "self" via pthread_self() - instead of directly from TLS so that an implicit - pthread object is created. - - * misc.c (pthread_equal): Strengthen test for NULLs. - -2000-09-02 Ross Johnson - - * condvar.c (ptw32_cond_wait_cleanup): Ensure that all - waking threads check if they are the last, and notify - the broadcaster if so - even if an error occurs in the - waiter. - - * semaphore.c (_decrease_semaphore): Should be - a call to ptw32_decrease_semaphore. - (_increase_semaphore): Should be a call to - ptw32_increase_semaphore. - - * misc.c (ptw32_cancelable_wait): Renamed from - CancelableWait. - * rwlock.c (_rwlock_check*): Renamed to - ptw32_rwlock_check*. - * mutex.c (_mutex_check*): Renamed to ptw32_mutex_check*. - * condvar.c (cond_timed*): Renamed to ptw32_cond_timed*. - (_cond_check*): Renamed to ptw32_cond_check*. - (cond_wait_cleanup*): Rename to ptw32_cond_wait_cleanup*. - (ptw32_cond_timedwait): Add comments. - -2000-08-22 Ross Johnson - - * private.c (ptw32_throw): Fix exception test; - move exceptionInformation declaration. - - * tsd.c (pthread_key_create): newkey wrongly declared. - - * pthread.h: Fix comment block. - -2000-08-18 Ross Johnson - - * mutex.c (pthread_mutex_destroy): Check that the mutex isn't - held; invalidate the mutex as early as possible to avoid - contention; not perfect - FIXME! - - * rwlock.c (pthread_rwlock_init): Remove redundant assignment - to "rw". - (pthread_rwlock_destroy): Invalidate the rwlock before - freeing up any of it's resources - to avoid contention. - - * private.c (ptw32_tkAssocCreate): Change assoc->lock - to use a dynamically initialised mutex - only consumes - a W32 mutex or critical section when first used, - not before. - - * mutex.c (pthread_mutex_init): Remove redundant assignment - to "mx". - (pthread_mutexattr_destroy): Set attribute to NULL - before freeing it's memory - to avoid contention. - - * implement.h (PTW32_EPS_CANCEL/PTW32_EPS_EXIT): - Must be defined for all compilers - used as generic - exception selectors by ptw32_throw(). - - * Several: Fix typos from scripted edit session - yesterday. - - * nonportable.c (pthread_mutexattr_setforcecs_np): - Moved this function from mutex.c. - (pthread_getw32threadhandle_np): New function to - return the win32 thread handle that the POSIX - thread is using. - * mutex.c (pthread_mutexattr_setforcecs_np): - Moved to new file "nonportable.c". - - * pthread.h (PTW32_BUILD): Only redefine __except - and catch compiler keywords if we aren't building - the library (ie. PTW32_BUILD is not defined) - - this is safer than defining and then undefining - if not building the library. - * implement.h: Remove __except and catch undefines. - * Makefile (CFLAGS): Define PTW32_BUILD. - * GNUmakefile (CFLAGS): Define PTW32_BUILD. - - * All appropriate: Change Pthread_exception* to - ptw32_exception* to be consistent with internal - identifier naming. - - * private.c (ptw32_throw): New function to provide - a generic exception throw for all internal - exceptions and EH schemes. - (ptw32_threadStart): pthread_exit() value is now - returned via the thread structure exitStatus - element. - * exit.c (pthread_exit): pthread_exit() value is now - returned via the thread structure exitStatus - element. - * cancel.c (ptw32_cancel_self): Now uses ptw32_throw. - (pthread_setcancelstate): Ditto. - (pthread_setcanceltype): Ditto. - (pthread_testcancel): Ditto. - (pthread_cancel): Ditto. - * misc.c (CancelableWait): Ditto. - * exit.c (pthread_exit): Ditto. - * All applicable: Change PTW32_ prefix to - PTW32_ prefix to remove leading underscores - from private library identifiers. - -2000-08-17 Ross Johnson - - * All applicable: Change _pthread_ prefix to - ptw32_ prefix to remove leading underscores - from private library identifiers (single - and double leading underscores are reserved in the - ANSI C standard for compiler implementations). - - * tsd.c (pthread_create_key): Initialise temporary - key before returning it's address to avoid race - conditions. - -2000-08-13 Ross Johnson - - * errno.c: Add _MD precompile condition; thus far - had no effect when using /MD compile option but I - thnk it should be there. - - * exit.c: Add __cplusplus to various #if lines; - was compiling SEH code even when VC++ had - C++ compile options. - - * private.c: ditto. - - * create.c (pthread_create): Add PT_STDCALL macro to - function pointer arg in _beginthread(). - - * pthread.h: PT_STDCALL really does need to be defined - in both this and impliment.h; don't set it to __cdecl - - this macro is only used to extend function pointer - casting for functions that will be passed as parameters. - (~PThreadCleanup): add cast and group expression. - (_errno): Add _MD compile conditional. - (PtW32NoCatchWarn): Change pragma message. - - * implement.h: Move and change PT_STDCALL define. - - * need_errno.h: Add _MD to compilation conditional. - - * GNUmakefile: Substantial rewrite for new naming - convention; set for nil optimisation (turn it up - when we have a working library build; add target - "fake.a" to build a libpthreadw32.a from the VC++ - built DLL pthreadVCE.dll. - - * pthread.def (LIBRARY): Don't specify in the .def - file - it is specified on the linker command line - since we now use the same .def file for variously - named .dlls. - - * Makefile: Substantial rewrite for new naming - convention; default nmake target only issues a - help message; run nmake with specific target - corresponding to the EH scheme being used. - - * README: Update information; add naming convention - explanation. - - * ANNOUNCE: Update information. - -2000-08-12 Ross Johnson - - * pthread.h: Add compile-time message when using - MSC_VER compiler and C++ EH to warn application - programmers to use PtW32Catch instead of catch(...) - if they want cancelation and pthread_exit to work. - - * implement.h: Remove #include ; we - use our own local semaphore.h. - -2000-08-10 Ross Johnson - - * cleanup.c (pthread_pop_cleanup): Remove _pthread - prefix from __except and catch keywords; implement.h - now simply undefines ptw32__except and - ptw32_catch if defined; VC++ was not textually - substituting ptw32_catch etc back to catch as - it was redefined; the reason for using the prefixed - version was to make it clear that it was not using - the pthread.h redefined catch keyword. - - * private.c (ptw32_threadStart): Ditto. - (ptw32_callUserDestroyRoutines): Ditto. - - * implement.h (ptw32__except): Remove #define. - (ptw32_catch): Remove #define. - - * GNUmakefile (pthread.a): New target to build - libpthread32.a from pthread.dll using dlltool. - - * buildlib.bat: Duplicate cl commands with args to - build C++ EH version of pthread.dll; use of .bat - files is redundant now that nmake compatible - Makefile is included; used as a kludge only now. - - * Makefile: Localise some macros and fix up the clean: - target to extend it and work properly. - - * CONTRIBUTORS: Add contributors. - - * ANNOUNCE: Updated. - - * README: Updated. - -2000-08-06 Ross Johnson - - * pthread.h: Remove #warning - VC++ doesn't accept it. - -2000-08-05 Ross Johnson - - * pthread.h (PtW32CatchAll): Add macro. When compiling - applications using VC++ with C++ EH rather than SEH - 'PtW32CatchAll' must be used in place of any 'catch( ... )' - if the application wants pthread cancelation or - pthread_exit() to work. - -2000-08-03 Ross Johnson - - * pthread.h: Add a base class ptw32_exception for - library internal exceptions and change the "catch" - re-define macro to use it. - -2000-08-02 Ross Johnson - - * GNUmakefile (CFLAGS): Add -mthreads. - Add new targets to generate cpp and asm output. - - * sync.c (pthread_join): Remove dead code. - -2000-07-25 Tristan Savatier - - * sched.c (sched_get_priority_max): Handle different WinCE and - Win32 priority values together. - (sched_get_priority_min): Ditto. - -2000-07-25 Ross Johnson - - * create.c (pthread_create): Force new threads to wait until - pthread_create has the new thread's handle; we also retain - a local copy of the handle for internal use until - pthread_create returns. - - * private.c (ptw32_threadStart): Initialise ei[]. - (ptw32_threadStart): When beginthread is used to start the - thread, force waiting until the creator thread had the - thread handle. - - * cancel.c (ptw32_cancel_thread): Include context switch - code for defined(_X86_) environments in addition to _M_IX86. - - * rwlock.c (pthread_rwlock_destroy): Assignment changed - to avoid compiler warning. - - * private.c (ptw32_get_exception_services_code): Cast - NULL return value to avoid compiler warning. - - * cleanup.c (pthread_pop_cleanup): Initialise "cleanup" variable - to avoid compiler warnings. - - * misc.c (ptw32_new): Change "new" variable to "t" to avoid - confusion with the C++ keyword of the same name. - - * condvar.c (cond_wait_cleanup): Initialise lastWaiter variable. - (cond_timedwait): Remove unused local variables. to avoid - compiler warnings. - - * dll.c (dllMain): Remove 2000-07-21 change - problem - appears to be in pthread_create(). - -2000-07-22 Ross Johnson - - * tsd.c (pthread_key_create): If a destructor was given - and the pthread_mutex_init failed, then would try to - reference a NULL pointer (*key); eliminate this section of - code by using a dynamically initialised mutex - (PTHREAD_MUTEX_INITIALIZER). - - * tsd.c (pthread_setspecific): Return an error if - unable to set the value; simplify cryptic conditional. - - * tsd.c (pthread_key_delete): Locking threadsLock relied - on mutex_lock returning an error if the key has no destructor. - ThreadsLock is only initialised if the key has a destructor. - Making this mutex a static could reduce the number of mutexes - used by an application since it is actually created only at - first use and it's often destroyed soon after. - -2000-07-22 Ross Johnson - - * FAQ: Added Q5 and Q6. - -2000-07-21 David Baggett - - * dll.c: Include resource leakage work-around. This is a - partial FIXME which doesn't stop all leakage. The real - problem needs to be found and fixed. - -2000-07-21 Ross Johnson - - * create.c (pthread_create): Set threadH to 0 (zero) - everywhere. Some assignments were using NULL. Maybe - it should be NULL everywhere - need to check. (I know - they are nearly always the same thing - but not by - definition.) - - * misc.c (pthread_self): Try to catch NULL thread handles - at the point where they might be generated, even though - they should always be valid at this point. - - * tsd.c (pthread_setspecific): return an error value if - pthread_self() returns NULL. - - * sync.c (pthread_join): return an error value if - pthread_self() returns NULL. - - * signal.c (pthread_sigmask): return an error value if - pthread_self() returns NULL. - -2000-03-02 Ross Johnson - - * attr.c (pthread_attr_init): Set default stacksize to zero (0) - rather than PTHREAD_STACK_MIN even though these are now the same. - - * pthread.h (PTHREAD_STACK_MIN): Lowered to 0. - -2000-01-28 Ross Johnson - - * mutex.c (pthread_mutex_init): Free mutex if it has been alloced; - if critical sections can be used instead of Win32 mutexes, test - that the critical section works and return an error if not. - -2000-01-07 Ross Johnson - - * cleanup.c (pthread_pop_cleanup): Include SEH code only if MSC is not - compiling as C++. - (pthread_push_cleanup): Include SEH code only if MSC is not - compiling as C++. - - * pthread.h: Include SEH code only if MSC is not - compiling as C++. - - * implement.h: Include SEH code only if MSC is not - compiling as C++. - - * cancel.c (ptw32_cancel_thread): Add _M_IX86 check. - (pthread_testcancel): Include SEH code only if MSC is not - compiling as C++. - (ptw32_cancel_self): Include SEH code only if MSC is not - compiling as C++. - -2000-01-06 Erik Hensema - - * Makefile: Remove inconsistencies in 'cl' args - -2000-01-04 Ross Johnson - - * private.c (ptw32_get_exception_services_code): New; returns - value of EXCEPTION_PTW32_SERVICES. - (ptw32_processInitialize): Remove initialisation of - ptw32_exception_services which is no longer needed. - - * pthread.h (ptw32_exception_services): Remove extern. - (ptw32_get_exception_services_code): Add function prototype; - use this to return EXCEPTION_PTW32_SERVICES value instead of - using the ptw32_exception_services variable which I had - trouble exporting through pthread.def. - - * global.c (ptw32_exception_services): Remove declaration. - -1999-11-22 Ross Johnson - - * implement.h: Forward declare ptw32_new(); - - * misc.c (ptw32_new): New; alloc and initialise a new pthread_t. - (pthread_self): New thread struct is generated by new routine - ptw32_new(). - - * create.c (pthread_create): New thread struct is generated - by new routine ptw32_new(). - -1999-11-21 Ross Johnson - - * global.c (ptw32_exception_services): Declare new variable. - - * private.c (ptw32_threadStart): Destroy thread's - cancelLock mutex; make 'catch' and '__except' usageimmune to - redfinitions in pthread.h. - (ptw32_processInitialize): Init new constant ptw32_exception_services. - - * create.c (pthread_create): Initialise thread's cancelLock - mutex. - - * cleanup.c (pthread_pop_cleanup): Make 'catch' and '__except' - usage immune to redfinition s in pthread.h. - - * private.c: Ditto. - - * pthread.h (catch): Redefine 'catch' so that C++ applications - won't catch our internal exceptions. - (__except): ditto for __except. - - * implement.h (ptw32_catch): Define internal version - of 'catch' because 'catch' is redefined by pthread.h. - (__except): ditto for __except. - (struct pthread_t_): Add cancelLock mutex for async cancel - safety. - -1999-11-21 Jason Nye , Erik Hensema - - * cancel.c (ptw32_cancel_self): New; part of the async - cancellation implementation. - (ptw32_cancel_thread): Ditto; this function is X86 - processor specific. - (pthread_setcancelstate): Add check for pending async - cancel request and cancel the calling thread if - required; add async-cancel safety lock. - (pthread_setcanceltype): Ditto. - -1999-11-13 Erik Hensema - - * configure.in (AC_OUTPUT): Put generated output into GNUmakefile - rather than Makefile. Makefile will become the MSC nmake compatible - version - -1999-11-13 John Bossom (John.Bossom@cognos.com> - - * misc.c (pthread_self): Add a note about GetCurrentThread - returning a pseudo-handle - -1999-11-10 Todd Owen - - * dll.c (dllMain): Free kernel32 ASAP. - If TryEnterCriticalSection is not being used, then free - the kernel32.dll handle now, rather than leaving it until - DLL_PROCESS_DETACH. - - Note: this is not a pedantic exercise in freeing unused - resources! It is a work-around for a bug in Windows 95 - (see microsoft knowledge base article, Q187684) which - does Bad Things when FreeLibrary is called within - the DLL_PROCESS_DETACH code, in certain situations. - Since w95 just happens to be a platform which does not - provide TryEnterCriticalSection, the bug will be - effortlessly avoided. - -1999-11-10 Ross Johnson - - * sync.c (pthread_join): Make it a deferred cancelation point. - - * misc.c (pthread_self): Explicitly initialise implicitly - created thread state to default values. - -1999-11-05 Tristan Savatier - - * pthread.h (winsock.h): Include unconditionally. - (ETIMEDOUT): Change fallback value to that defined by winsock.h. - - * general: Patched for portability to WinCE. The details are - described in the file WinCE-PORT. Follow the instructions - in README.WinCE to make the appropriate changes in config.h. - -1999-10-30 Erik Hensema - - * create.c (pthread_create): Explicitly initialise thread state to - default values. - - * cancel.c (pthread_setcancelstate): Check for NULL 'oldstate' - for compatibility with Solaris pthreads; - (pthread_setcanceltype): ditto: - -1999-10-23 Erik Hensema - - * pthread.h (ctime_r): Fix incorrect argument "_tm" - -1999-10-21 Aurelio Medina - - * pthread.h (_POSIX_THREADS): Only define it if it isn't - already defined. Projects may need to define this on - the CC command line under Win32 as it doesn't have unistd.h - -1999-10-17 Ross Johnson - - * rwlock.c (pthread_rwlock_destroy): Add cast to remove compile - warning. - - * condvar.c (pthread_cond_broadcast): Only release semaphores - if there are waiting threads. - -1999-10-15 Lorin Hochstein , Peter Slacik - - * condvar.c (cond_wait_cleanup): New static cleanup handler for - cond_timedwait; - (cond_timedwait): pthread_cleanup_push args changed; - canceling a thread while it's in pthread_cond_wait - will now decrement the waiters count and cleanup if it's the - last waiter. - -1999-10-15 Graham Dumpleton - - * condvar.c (cond_wait_cleanup): the last waiter will now reset the CV's - wasBroadcast flag - -Thu Sep 16 1999 Ross Johnson - - * rwlock.c (pthread_rwlock_destroy): Add serialisation. - (_rwlock_check_need_init): Check for detroyed rwlock. - * rwlock.c: Check return codes from _rwlock_check_need_init(); - modify comments; serialise access to rwlock objects during - operations; rename rw_mutex to rw_lock. - * implement.h: Rename rw_mutex to rw_lock. - * mutex.c (pthread_mutex_destroy): Add serialisation. - (_mutex_check_need_init): Check for detroyed mutex. - * condvar.c (pthread_cond_destroy): Add serialisation. - (_cond_check_need_init): Check for detroyed condvar. - * mutex.c: Modify comments. - * condvar.c: Modify comments. - -1999-08-10 Aurelio Medina - - * implement.h (pthread_rwlock_t_): Add. - * pthread.h (pthread_rwlock_t): Add. - (PTHREAD_RWLOCK_INITIALIZER): Add. - Add rwlock function prototypes. - * rwlock.c: New module. - * pthread.def: Add new rwlock functions. - * private.c (ptw32_processInitialize): initialise - ptw32_rwlock_test_init_lock critical section. - * global.c (ptw32_rwlock_test_init_lock): Add. - - * mutex.c (pthread_mutex_destroy): Don't free mutex memory - if mutex is PTHREAD_MUTEX_INITIALIZER and has not been - initialised yet. - -1999-08-08 Milan Gardian - - * mutex.c (pthread_mutex_destroy): Free mutex memory. - -1999-08-22 Ross Johnson - - * exit.c (pthread_exit): Fix reference to potentially - uninitialised pointer. - -1999-08-21 Ross Johnson - - * private.c (ptw32_threadStart): Apply fix of 1999-08-19 - this time to C++ and non-trapped C versions. Ommitted to - do this the first time through. - -1999-08-19 Ross Johnson - - * private.c (ptw32_threadStart): Return exit status from - the application thread startup routine. - - Milan Gardian - -1999-08-18 John Bossom - - * exit.c (pthread_exit): Put status into pthread_t->exitStatus - * private.c (ptw32_threadStart): Set pthread->exitStatus - on exit of try{} block. - * sync.c (pthread_join): use pthread_exitStatus value if the - thread exit doesn't return a value (for Mingw32 CRTDLL - which uses endthread instead of _endthreadex). - -Tue Aug 17 20:17:58 CDT 1999 Mumit Khan - - * create.c (pthread_create): Add CRTDLL suppport. - * exit.c (pthread_exit): Likewise. - * private.c (ptw32_threadStart): Likewise. - (ptw32_threadDestroy): Likewise. - * sync.c (pthread_join): Likewise. - * tests/join1.c (main): Warn about partial support for CRTDLL. - -Tue Aug 17 20:00:08 1999 Mumit Khan - - * Makefile.in (LD): Delete entry point. - * acconfig.h (STDCALL): Delete unused macro. - * configure.in: Remove test for STDCALL. - * config.h.in: Regenerate. - * errno.c (_errno): Fix self type. - * pthread.h (PT_STDCALL): Move from here to - * implement.h (PT_STDCALL): here. - (ptw32_threadStart): Fix prototype. - * private.c (ptw32_threadStart): Likewise. - -1999-08-14 Ross Johnson - - * exit.c (pthread_exit): Don't call pthread_self() but - get thread handle directly from TSD for efficiency. - -1999-08-12 Ross Johnson - - * private.c (ptw32_threadStart): ei[] only declared if _MSC_VER. - - * exit.c (pthread_exit): Check for implicitly created threads - to avoid raising an unhandled exception. - -1999-07-12 Peter Slacik - - * condvar.c (pthread_cond_destroy): Add critical section. - (cond_timedwait): Add critical section; check for timeout - waiting on semaphore. - (pthread_cond_broadcast): Add critical section. - -1999-07-09 Lorin Hochstein , John Bossom - - The problem was that cleanup handlers were not executed when - pthread_exit() was called. - - * implement.h (pthread_t_): Add exceptionInformation element for - C++ per-thread exception information. - (general): Define and rename exceptions. - -1999-07-09 Ross Johnson - - * misc.c (CancelableWait): PTW32_EPS_CANCEL (SEH) and - ptw32_exception_cancel (C++) used to identify the exception. - - * cancel.c (pthread_testcancel): PTW32_EPS_CANCEL (SEH) and - ptw32_exception_cancel (C++) used to identify the exception. - - * exit.c (pthread_exit): throw/raise an exception to return to - ptw32_threadStart() to exit the thread. PTW32_EPS_EXIT (SEH) - and ptw32_exception_exit (C++) used to identify the exception. - - * private.c (ptw32_threadStart): Add pthread_exit exception trap; - clean up and exit the thread directly rather than via pthread_exit(). - -Sun May 30 00:25:02 1999 Ross Johnson - - * semaphore.h (mode_t): Conditionally typedef it. - -Fri May 28 13:33:05 1999 Mark E. Armstrong - - * condvar.c (pthread_cond_broadcast): Fix possible memory fault - -Thu May 27 13:08:46 1999 Peter Slacik - - * condvar.c (pthread_cond_broadcast): Fix logic bug - -Thu May 27 13:08:46 1999 Bossom, John - - * condvar.c (pthread_cond_broadcast): optimise sem_post loop - -Fri May 14 12:13:18 1999 Mike Russo - - * attr.c (pthread_attr_setdetachstate): Fix logic bug - -Sat May 8 09:42:30 1999 Ross Johnson - - * pthread.def (sem_open): Add. - (sem_close): Add. - (sem_unlink): Add. - (sem_getvalue): Add. - - * FAQ (Question 3): Add. - -Thu Apr 8 01:16:23 1999 Ross Johnson - - * semaphore.c (sem_open): New function; returns an error (ENOSYS). - (sem_close): ditto. - (sem_unlink): ditto. - (sem_getvalue): ditto. - - * semaphore.h (_POSIX_SEMAPHORES): define. - -Wed Apr 7 14:09:52 1999 Ross Johnson - - * errno.c (_REENTRANT || _MT): Invert condition. - - * pthread.h (_errno): Conditionally include prototype. - -Wed Apr 7 09:37:00 1999 Ross Johnson - - * *.c (comments): Remove individual attributions - these are - documented sufficiently elsewhere. - - * implement.h (pthread.h): Remove extraneous include. - -Sun Apr 4 11:05:57 1999 Ross Johnson - - * sched.c (sched.h): Include. - - * sched.h: New file for POSIX 1b scheduling. - - * pthread.h: Move opaque structures to implement.h; move sched_* - prototypes out and into sched.h. - - * implement.h: Add opaque structures from pthread.h. - - * sched.c (sched_yield): New function. - - * condvar.c (ptw32_sem_*): Rename to sem_*; except for - ptw32_sem_timedwait which is an private function. - -Sat Apr 3 23:28:00 1999 Ross Johnson - - * Makefile.in (OBJS): Add errno.o. - -Fri Apr 2 11:08:50 1999 Ross Johnson - - * implement.h (ptw32_sem_*): Remove prototypes now defined in - semaphore.h. - - * pthread.h (sempahore.h): Include. - - * semaphore.h: New file for POSIX 1b semaphores. - - * semaphore.c (ptw32_sem_timedwait): Moved to private.c. - - * pthread.h (ptw32_sem_t): Change to sem_t. - - * private.c (ptw32_sem_timedwait): Moved from semaphore.c; - set errno on error. - - * pthread.h (pthread_t_): Add per-thread errno element. - -Fri Apr 2 11:08:50 1999 John Bossom - - * semaphore.c (ptw32_sem_*): Change to sem_*; these functions - will be exported from the library; set errno on error. - - * errno.c (_errno): New file. New function. - -Fri Mar 26 14:11:45 1999 Tor Lillqvist - - * semaphore.c (ptw32_sem_timedwait): Check for negative - milliseconds. - -Wed Mar 24 11:32:07 1999 John Bossom - - * misc.c (CancelableWait): Initialise exceptionInformation[2]. - (pthread_self): Get a real Win32 thread handle for implicit threads. - - * cancel.c (pthread_testcancel): Initialise exceptionInformation[2]. - - * implement.h (SE_INFORMATION): Fix values. - - * private.c (ptw32_threadDestroy): Close the thread handle. - -Fri Mar 19 12:57:27 1999 Ross Johnson - - * cancel.c (comments): Update and cleanup. - -Fri Mar 19 09:12:59 1999 Ross Johnson - - * private.c (ptw32_threadStart): status returns PTHREAD_CANCELED. - - * pthread.h (PTHREAD_CANCELED): defined. - -Tue Mar 16 1999 Ross Johnson - - * all: Add GNU LGPL and Copyright and Warranty. - -Mon Mar 15 00:20:13 1999 Ross Johnson - - * condvar.c (pthread_cond_init): fix possible uninitialised use - of cv. - -Sun Mar 14 21:01:59 1999 Ross Johnson - - * condvar.c (pthread_cond_destroy): don't do full cleanup if - static initialised cv has never been used. - (cond_timedwait): check result of auto-initialisation. - -Thu Mar 11 09:01:48 1999 Ross Johnson - - * pthread.h (pthread_mutex_t): revert to (pthread_mutex_t *); - define a value to serve as PTHREAD_MUTEX_INITIALIZER. - (pthread_mutex_t_): remove staticinit and valid elements. - (pthread_cond_t): revert to (pthread_cond_t_ *); - define a value to serve as PTHREAD_COND_INITIALIZER. - (pthread_cond_t_): remove staticinit and valid elements. - - * mutex.c (pthread_mutex_t args): adjust indirection of references. - (all functions): check for PTHREAD_MUTEX_INITIALIZER value; - check for NULL (invalid). - - * condvar.c (pthread_cond_t args): adjust indirection of references. - (all functions): check for PTHREAD_COND_INITIALIZER value; - check for NULL (invalid). - -Wed Mar 10 17:18:12 1999 Ross Johnson - - * misc.c (CancelableWait): Undo changes from Mar 8 and 7. - -Mon Mar 8 11:18:59 1999 Ross Johnson - - * misc.c (CancelableWait): Ensure cancelEvent handle is the lowest - indexed element in the handles array. Enhance test for abandoned - objects. - - * pthread.h (PTHREAD_MUTEX_INITIALIZER): Trailing elements not - initialised are set to zero by the compiler. This avoids the - problem of initialising the opaque critical section element in it. - (PTHREAD_COND_INITIALIZER): Ditto. - - * semaphore.c (ptw32_sem_timedwait): Check sem == NULL earlier. - -Sun Mar 7 12:31:14 1999 Ross Johnson - - * condvar.c (pthread_cond_init): set semaphore initial value - to 0, not 1. cond_timedwait was returning signaled immediately. - - * misc.c (CancelableWait): Place the cancel event handle first - in the handle table for WaitForMultipleObjects. This ensures that - the cancel event is recognised and acted apon if both objects - happen to be signaled together. - - * private.c (ptw32_cond_test_init_lock): Initialise and destroy. - - * implement.h (ptw32_cond_test_init_lock): Add extern. - - * global.c (ptw32_cond_test_init_lock): Add declaration. - - * condvar.c (pthread_cond_destroy): check for valid initialised CV; - flag destroyed CVs as invalid. - (pthread_cond_init): pthread_cond_t is no longer just a pointer. - This is because PTHREAD_COND_INITIALIZER needs state info to reside - in pthread_cond_t so that it can initialise on first use. Will work on - making pthread_cond_t (and other objects like it) opaque again, if - possible, later. - (cond_timedwait): add check for statically initialisation of - CV; initialise on first use. - (pthread_cond_signal): check for valid CV. - (pthread_cond_broadcast): check for valid CV. - (_cond_check_need_init): Add. - - * pthread.h (PTHREAD_COND_INITIALIZER): Fix. - (pthread_cond_t): no longer a pointer to pthread_cond_t_. - (pthread_cond_t_): add 'staticinit' and 'valid' elements. - -Sat Mar 6 1999 Ross Johnson - - * implement.h: Undate comments. - -Sun Feb 21 1999 Ross Johnson - - * pthread.h (PTHREAD_MUTEX_INITIALIZER): missing braces around - cs element initialiser. - -1999-02-21 Ben Elliston - - * pthread.h (pthread_exit): The return type of this function is - void, not int. - - * exit.c (pthread_exit): Do not return 0. - -Sat Feb 20 16:03:30 1999 Ross Johnson - - * dll.c (DLLMain): Expand TryEnterCriticalSection support test. - - * mutex.c (pthread_mutex_trylock): The check for - ptw32_try_enter_critical_section == NULL should have been - removed long ago. - -Fri Feb 19 16:03:30 1999 Ross Johnson - - * sync.c (pthread_join): Fix pthread_equal() test. - - * mutex.c (pthread_mutex_trylock): Check mutex != NULL before - using it. - -Thu Feb 18 16:17:30 1999 Ross Johnson - - * misc.c (pthread_equal): Fix inverted result. - - * Makefile.in: Use libpthread32.a as the name of the DLL export - library instead of pthread.lib. - - * condvar.c (pthread_cond_init): cv could have been used unitialised; - initialise. - - * create.c (pthread_create): parms could have been used unitialised; - initialise. - - * pthread.h (struct pthread_once_t_): Remove redefinition. - -Sat Feb 13 03:03:30 1999 Ross Johnson - - * pthread.h (struct pthread_once_t_): Replaced. - - * misc.c (pthread_once): Replace with John Bossom's version; - has lighter weight serialisation; fixes problem of not holding - competing threads until after the init_routine completes. - -Thu Feb 11 13:34:14 1999 Ross Johnson - - * misc.c (CancelableWait): Change C++ exception throw. - - * sync.c (pthread_join): Change FIXME comment - issue resolved. - -Wed Feb 10 12:49:11 1999 Ross Johnson - - * configure: Various temporary changes. - - Kevin Ruland - - * README: Update. - - * pthread.def (pthread_attr_getstackaddr): uncomment - (pthread_attr_setstackaddr): uncomment - -Fri Feb 5 13:42:30 1999 Ross Johnson - - * semaphore.c: Comment format changes. - -Thu Feb 4 10:07:28 1999 Ross Johnson - - * global.c: Remove ptw32_exception instantiation. - - * cancel.c (pthread_testcancel): Change C++ exception throw. - - * implement.h: Remove extern declaration. - -Wed Feb 3 13:04:44 1999 Ross Johnson - - * cleanup.c: Rename ptw32_*_cleanup() to pthread_*_cleanup(). - - * pthread.def: Ditto. - - * pthread.h: Ditto. - - * pthread.def (pthread_cleanup_push): Remove from export list; - the function is defined as a macro under all compilers. - (pthread_cleanup_pop): Ditto. - - * pthread.h: Remove #if defined(). - -Wed Feb 3 10:13:48 1999 Ross Johnson - - * sync.c (pthread_join): Check for NULL value_ptr arg; - check for detached threads. - -Tue Feb 2 18:07:43 1999 Ross Johnson - - * implement.h: Add #include . - Change sem_t to ptw32_sem_t. - -Tue Feb 2 18:07:43 1999 Kevin Ruland - - * signal.c (pthread_sigmask): Add and modify casts. - Reverse LHS/RHS bitwise assignments. - - * pthread.h: Remove #include . - (PTW32_ATTR_VALID): Add cast. - (struct pthread_t_): Add sigmask element. - - * dll.c: Add "extern C" for DLLMain. - (DllMain): Add cast. - - * create.c (pthread_create): Set sigmask in thread. - - * condvar.c: Remove #include. Change sem_* to ptw32_sem_*. - - * attr.c: Changed #include. - - * Makefile.in: Additional targets and changes to build the library - as a DLL. - -Fri Jan 29 11:56:28 1999 Ross Johnson - - * Makefile.in (OBJS): Add semaphore.o to list. - - * semaphore.c (ptw32_sem_timedwait): Move from private.c. - Rename sem_* to ptw32_sem_*. - - * pthread.h (pthread_cond_t): Change type of sem_t. - _POSIX_SEMAPHORES no longer defined. - - * semaphore.h: Contents moved to implement.h. - Removed from source tree. - - * implement.h: Add semaphore function prototypes and rename all - functions to prepend 'ptw32_'. They are - now private to the pthreads-win32 implementation. - - * private.c: Change #warning. - Move ptw32_sem_timedwait() to semaphore.c. - - * cleanup.c: Change #warning. - - * misc.c: Remove #include - - * pthread.def: Cleanup CVS merge conflicts. - - * global.c: Ditto. - - * ChangeLog: Ditto. - - * cleanup.c: Ditto. - -Sun Jan 24 01:34:52 1999 Ross Johnson - - * semaphore.c (sem_wait): Remove second arg to - pthreadCancelableWait() call. - -Sat Jan 23 17:36:40 1999 Ross Johnson - - * pthread.def: Add new functions to export list. - - * pthread.h (PTHREAD_MUTEX_AUTO_CS_NP): New. - (PTHREAD_MUTEX_FORCE_CS_NP): New. - - * README: Updated. - -Fri Jan 22 14:31:59 1999 Ross Johnson - - * Makefile.in (CFLAGS): Remove -fhandle-exceptions. Not needed - with egcs. Add -g for debugging. - - * create.c (pthread_create): Replace __stdcall with PT_STDCALL - macro. This is a hack and must be fixed. - - * misc.c (CancelableWait): Remove redundant statement. - - * mutex.c (pthread_mutexattr_init): Cast calloc return value. - - * misc.c (CancelableWait): Add cast. - (pthread_self): Add cast. - - * exit.c (pthread_exit): Add cast. - - * condvar.c (pthread_condattr_init): Cast calloc return value. - - * cleanup.c: Reorganise conditional compilation. - - * attr.c (pthread_attr_init): Remove unused 'result'. - Cast malloc return value. - - * private.c (ptw32_callUserDestroyRoutines): Redo conditional - compilation. - - * misc.c (CancelableWait): C++ version uses 'throw'. - - * cancel.c (pthread_testcancel): Ditto. - - * implement.h (class ptw32_exception): Define for C++. - - * pthread.h: Fix C, C++, and Win32 SEH condition compilation - mayhem around pthread_cleanup_* defines. C++ version now uses John - Bossom's cleanup handlers. - (pthread_attr_t): Make 'valid' unsigned. - Define '_timeb' as 'timeb' for Ming32. - Define PT_STDCALL as nothing for Mingw32. May be temporary. - - * cancel.c (pthread_testcancel): Cast return value. - -Wed Jan 20 09:31:28 1999 Ross Johnson - - * pthread.h (pthread_mutexattr_t): Changed to a pointer. - - * mutex.c (pthread_mutex_init): Conditionally create Win32 mutex - - from John Bossom's implementation. - (pthread_mutex_destroy): Conditionally close Win32 mutex - - from John Bossom's implementation. - (pthread_mutexattr_init): Replaced by John Bossom's version. - (pthread_mutexattr_destroy): Ditto. - (pthread_mutexattr_getpshared): New function from John Bossom's - implementation. - (pthread_mutexattr_setpshared): New function from John Bossom's - implementation. - -Tue Jan 19 18:27:42 1999 Ross Johnson - - * pthread.h (pthreadCancelableTimedWait): New prototype. - (pthreadCancelableWait): Remove second argument. - - * misc.c (CancelableWait): New static function is - pthreadCancelableWait() renamed. - (pthreadCancelableWait): Now just calls CancelableWait() with - INFINITE timeout. - (pthreadCancelableTimedWait): Just calls CancelableWait() - with passed in timeout. - -Tue Jan 19 18:27:42 1999 Scott Lightner - - * private.c (ptw32_sem_timedwait): 'abstime' arg really is - absolute time. Calculate relative time to wait from current - time before passing timeout to new routine - pthreadCancelableTimedWait(). - -Tue Jan 19 10:27:39 1999 Ross Johnson - - * pthread.h (pthread_mutexattr_setforcecs_np): New prototype. - - * mutex.c (pthread_mutexattr_init): Init 'pshared' and 'forcecs' - attributes to 0. - (pthread_mutexattr_setforcecs_np): New function (not portable). - - * pthread.h (pthread_mutex_t): - Add 'mutex' element. Set to NULL in PTHREAD_MUTEX_INITIALIZER. - The pthread_mutex_*() routines will try to optimise performance - by choosing either mutexes or critical sections as the basis - for pthread mutexes for each indevidual mutex. - (pthread_mutexattr_t_): Add 'forcecs' element. - Some applications may choose to force use of critical sections - if they know that:- - the mutex is PROCESS_PRIVATE and, - either the OS supports TryEnterCriticalSection() or - pthread_mutex_trylock() will never be called on the mutex. - This attribute will be setable via a non-portable routine. - - Note: We don't yet support PROCESS_SHARED mutexes, so the - implementation as it stands will default to Win32 mutexes only if - the OS doesn't support TryEnterCriticalSection. On Win9x, and early - versions of NT 'forcecs' will need to be set in order to get - critical section based mutexes. - -Sun Jan 17 12:01:26 1999 Ross Johnson - - * pthread.h (PTHREAD_MUTEX_INITIALIZER): Init new 'staticinit' - value to '1' and existing 'valid' value to '1'. - - * global.c (ptw32_mutex_test_init_lock): Add. - - * implement.h (ptw32_mutex_test_init_lock.): Add extern. - - * private.c (ptw32_processInitialize): Init critical section for - global lock used by _mutex_check_need_init(). - (ptw32_processTerminate): Ditto (:s/Init/Destroy/). - - * dll.c (dllMain): Move call to FreeLibrary() so that it is only - called once when the process detaches. - - * mutex.c (_mutex_check_need_init): New static function to test - and init PTHREAD_MUTEX_INITIALIZER mutexes. Provides serialised - access to the internal state of the uninitialised static mutex. - Called from pthread_mutex_trylock() and pthread_mutex_lock() which - do a quick unguarded test to check if _mutex_check_need_init() - needs to be called. This is safe as the test is conservative - and is repeated inside the guarded section of - _mutex_check_need_init(). Thus in all calls except the first - calls to lock static mutexes, the additional overhead to lock any - mutex is a single memory fetch and test for zero. - - * pthread.h (pthread_mutex_t_): Add 'staticinit' member. Mutexes - initialised by PTHREAD_MUTEX_INITIALIZER aren't really initialised - until the first attempt to lock it. Using the 'valid' - flag (which flags the mutex as destroyed or not) to record this - information would be messy. It is possible for a statically - initialised mutex such as this to be destroyed before ever being - used. - - * mutex.c (pthread_mutex_trylock): Call _mutex_check_need_init() - to test/init PTHREAD_MUTEX_INITIALIZER mutexes. - (pthread_mutex_lock): Ditto. - (pthread_mutex_unlock): Add check to ensure we don't try to unlock - an unitialised static mutex. - (pthread_mutex_destroy): Add check to ensure we don't try to delete - a critical section that we never created. Allows us to destroy - a static mutex that has never been locked (and hence initialised). - (pthread_mutex_init): Set 'staticinit' flag to 0 for the new mutex. - -Sun Jan 17 12:01:26 1999 Ross Johnson - - * private.c (ptw32_sem_timedwait): Move from semaphore.c. - - * semaphore.c : Remove redundant #includes. - (ptw32_sem_timedwait): Move to private.c. - (sem_wait): Add missing abstime arg to pthreadCancelableWait() call. - -Fri Jan 15 23:38:05 1999 Ross Johnson - - * condvar.c (cond_timedwait): Remove comment. - -Fri Jan 15 15:41:28 1999 Ross Johnson - - * pthread.h: Add new 'abstime' arg to pthreadCancelableWait() - prototype. - - * condvar.c (cond_timedwait): New generalised function called by - both pthread_cond_wait() and pthread_cond_timedwait(). This is - essentially pthread_cond_wait() renamed and modified to add the - 'abstime' arg and call the new ptw32_sem_timedwait() instead of - sem_wait(). - (pthread_cond_wait): Now just calls the internal static - function cond_timedwait() with an INFINITE wait. - (pthread_cond_timedwait): Now implemented. Calls the internal - static function cond_timedwait(). - - * implement.h (ptw32_sem_timedwait): New internal function - prototype. - - * misc.c (pthreadCancelableWait): Added new 'abstime' argument - to allow shorter than INFINITE wait. - - * semaphore.c (ptw32_sem_timedwait): New function for internal - use. This is essentially sem_wait() modified to add the - 'abstime' arg and call the modified (see above) - pthreadCancelableWait(). - -Thu Jan 14 14:27:13 1999 Ross Johnson - - * cleanup.c: Correct _cplusplus to __cplusplus wherever used. - - * Makefile.in: Add CC=g++ and add -fhandle-exceptions to CFLAGS. - The derived Makefile will compile all units of the package as C++ - so that those which include try/catch exception handling should work - properly. The package should compile ok if CC=gcc, however, exception - handling will not be included and thus thread cancellation, for - example, will not work. - - * cleanup.c (ptw32_pop_cleanup): Add #warning to compile this - file as C++ if using a cygwin32 environment. Perhaps the whole package - should be compiled using g++ under cygwin. - - * private.c (ptw32_threadStart): Change #error directive - into #warning and bracket for __CYGWIN__ and derivative compilers. - -Wed Jan 13 09:34:52 1999 Ross Johnson - - * build.bat: Delete old binaries before compiling/linking. - -Tue Jan 12 09:58:38 1999 Tor Lillqvist - - * dll.c: The Microsoft compiler pragmas probably are more - appropriately protected by _MSC_VER than by _WIN32. - - * pthread.h: Define ETIMEDOUT. This should be returned by - pthread_cond_timedwait which is not implemented yet as of - snapshot-1999-01-04-1305. It was implemented in the older version. - The Microsoft compiler pragmas probably are more appropriately - protected by _MSC_VER than by _WIN32. - - * pthread.def: pthread_mutex_destroy was missing from the def file - - * condvar.c (pthread_cond_broadcast): Ensure we only wait on threads - if there were any waiting on the condition. - I think pthread_cond_broadcast should do the WaitForSingleObject - only if cv->waiters > 0? Otherwise it seems to hang, at least in the - testg thread program from glib. - -Tue Jan 12 09:58:38 1999 Ross Johnson - - * condvar.c (pthread_cond_timedwait): Fix function description - comments. - - * semaphore.c (sem_post): Correct typo in comment. - -Mon Jan 11 20:33:19 1999 Ross Johnson - - * pthread.h: Re-arrange conditional compile of pthread_cleanup-* - macros. - - * cleanup.c (ptw32_push_cleanup): Provide conditional - compile of cleanup->prev. - -1999-01-11 Tor Lillqvist - - * condvar.c (pthread_cond_init): Invert logic when testing the - return value from calloc(). - -Sat Jan 9 14:32:08 1999 Ross Johnson - - * implement.h: Compile-time switch for CYGWIN derived environments - to use CreateThread instead of _beginthreadex. Ditto for ExitThread. - Patch provided by Anders Norlander . - -Tue Jan 5 16:33:04 1999 Ross Johnson - - * cleanup.c (ptw32_pop_cleanup): Add C++ version of __try/__except - block. Move trailing "}" out of #ifdef _WIN32 block left there by - (rpj's) mistake. - - * private.c: Remove #include which is included by pthread.h. - -1998-12-11 Ben Elliston - - * README: Update info about subscribing to the mailing list. - -Mon Jan 4 11:23:40 1999 Ross Johnson - - * all: No code changes, just cleanup. - - remove #if 0 /* Pre Bossom */ enclosed code. - - Remove some redundant #includes. - * pthread.h: Update implemented/unimplemented routines list. - * Tag the bossom merge branch getting ready to merge back to main - trunk. - -Tue Dec 29 13:11:16 1998 Ross Johnson - - * implement.h: Move the following struct definitions to pthread.h: - pthread_t_, pthread_attr_t_, pthread_mutex_t_, pthread_mutex_t_, - pthread_mutexattr_t_, pthread_key_t_, pthread_cond_t_, - pthread_condattr_t_, pthread_once_t_. - - * pthread.h: Add "_" prefix to pthread_push_cleanup and - pthread_pop_cleanup internal routines, and associated struct and - typedefs. - - * buildlib.bat: Add compile command for semaphore.c - - * pthread.def: Comment out pthread_atfork routine name. - Now unimplemented. - - * tsd.c (pthread_setspecific): Rename tkAssocCreate to - ptw32_tkAssocCreate. - (pthread_key_delete): Rename tkAssocDestroy to - ptw32_tkAssocDestroy. - - * sync.c (pthread_join): Rename threadDestroy to ptw32_threadDestroy - - * sched.c (is_attr): attr is now **attr (was *attr), so add extra - NULL pointer test. - (pthread_attr_setschedparam): Increase redirection for attr which is - now a **. - (pthread_attr_getschedparam): Ditto. - (pthread_setschedparam): Change thread validation and rename "thread" - Win32 thread Handle element name to match John Bossom's version. - (pthread_getschedparam): Ditto. - - * private.c (ptw32_threadDestroy): Rename call to - callUserDestroyRoutines() as ptw32_callUserDestroyRoutines() - - * misc.c: Add #include "implement.h". - - * dll.c: Remove defined(KLUDGE) wrapped code. - - * fork.c: Remove redefinition of ENOMEM. - Remove pthread_atfork() and fork() with #if 0/#endif. - - * create.c (pthread_create): Rename threadStart and threadDestroy calls - to ptw32_threadStart and ptw32_threadDestroy. - - * implement.h: Rename "detachedstate" to "detachstate". - - * attr.c: Rename "detachedstate" to "detachstate". - -Mon Dec 28 09:54:39 1998 John Bossom - - * semaphore.c: Initial version. - * semaphore.h: Initial version. - -Mon Dec 28 09:54:39 1998 Ross Johnson - - * pthread.h (pthread_attr_t_): Change to *pthread_attr_t. - -Mon Dec 28 09:54:39 1998 John Bossom, Ben Elliston - - * attr.c (pthread_attr_setstacksize): Merge with John's version. - (pthread_attr_getstacksize): Merge with John's version. - (pthread_attr_setstackaddr): Merge with John's version. - (pthread_attr_getstackaddr): Merge with John's version. - (pthread_attr_init): Merge with John's version. - (pthread_attr_destroy): Merge with John's version. - (pthread_attr_getdetachstate): Merge with John's version. - (pthread_attr_setdetachstate): Merge with John's version. - (is_attr): attr is now **attr (was *attr), so add extra NULL pointer - test. - -Mon Dec 28 09:54:39 1998 Ross Johnson - - * implement.h (pthread_attr_t_): Add and rename elements in JEB's - version to correspond to original, so that it can be used with - original attr routines. - - * pthread.h: Add #endif at end which was truncated in merging. - -Sun Dec 20 14:51:58 1998 Ross Johnson - - * misc.c (pthreadCancelableWait): New function by John Bossom. Non-standard - but provides a hook that can be used to implement cancellation points in - applications that use this library. - - * pthread.h (pthread_cleanup_pop): C++ (non-WIN32) version uses - try/catch to emulate John Bossom's WIN32 __try/__finally behaviour. - In the WIN32 version __finally block, add a test for AbnormalTermination otherwise - cleanup is only run if the cleanup_pop execute arg is non-zero. Cancellation - should cause the cleanup to run irrespective of the execute arg. - - * condvar.c (pthread_condattr_init): Replaced by John Bossom's version. - (pthread_condattr_destroy): Replaced by John Bossom's version. - (pthread_condattr_getpshared): Replaced by John Bossom's version. - (pthread_condattr_setpshared): Replaced by John Bossom's version. - (pthread_cond_init): Replaced by John Bossom's version. - Fix comment (refered to mutex rather than condition variable). - (pthread_cond_destroy): Replaced by John Bossom's version. - (pthread_cond_wait): Replaced by John Bossom's version. - (pthread_cond_timedwait): Replaced by John Bossom's version. - (pthread_cond_signal): Replaced by John Bossom's version. - (pthread_cond_broadcast): Replaced by John Bossom's version. - -Thu Dec 17 19:10:46 1998 Ross Johnson - - * tsd.c (pthread_key_create): Replaced by John Bossom's version. - (pthread_key_delete): Replaced by John Bossom's version. - (pthread_setspecific): Replaced by John Bossom's version. - (pthread_getspecific): Replaced by John Bossom's version. - -Mon Dec 7 09:44:40 1998 John Bossom - - * cancel.c (pthread_setcancelstate): Replaced. - (pthread_setcanceltype): Replaced. - (pthread_testcancel): Replaced. - (pthread_cancel): Replaced. - - * exit.c (pthread_exit): Replaced. - - * misc.c (pthread_self): Replaced. - (pthread_equal): Replaced. - - * sync.c (pthread_detach): Replaced. - (pthread_join): Replaced. - - * create.c (pthread_create): Replaced. - - * private.c (ptw32_processInitialize): New. - (ptw32_processTerminate): New. - (ptw32_threadStart): New. - (ptw32_threadDestroy): New. - (ptw32_cleanupStack): New. - (ptw32_tkAssocCreate): New. - (ptw32_tkAssocDestroy): New. - (ptw32_callUserDestroyRoutines): New. - - * implement.h: Added non-API structures and declarations. - - * dll.c (PthreadsEntryPoint): Cast return value of GetProcAddress - to resolve compile warning from MSVC. - - * dll.c (DLLmain): Replaced. - * dll.c (PthreadsEntryPoint): - Re-applied Anders Norlander's patch:- - Initialize ptw32_try_enter_critical_section at startup - and release kernel32 handle when DLL is being unloaded. - -Sun Dec 6 21:54:35 1998 Ross Johnson - - * buildlib.bat: Fix args to CL when building the .DLL - - * cleanup.c (ptw32_destructor_run_all): Fix TSD key management. - This is a tidy-up before TSD and Thread management is completely - replaced by John Bossom's code. - - * tsd.c (pthread_key_create): Fix TSD key management. - - * global.c (ptw32_key_virgin_next): Initialise. - - * build.bat: New DOS script to compile and link a pthreads app - using Microsoft's CL compiler linker. - * buildlib.bat: New DOS script to compile all the object files - and create pthread.lib and pthread.dll using Microsoft's CL - compiler linker. - -1998-12-05 Anders Norlander - - * implement.h (ptw32_try_enter_critical_section): New extern - * dll.c (ptw32_try_enter_critical_section): New pointer to - TryEnterCriticalSection if it exists; otherwise NULL. - * dll.c (PthreadsEntryPoint): - Initialize ptw32_try_enter_critical_section at startup - and release kernel32 handle when DLL is being unloaded. - * mutex.c (pthread_mutex_trylock): Replaced check for NT with - a check if ptw32_try_enter_critical_section is valid - pointer to a function. Call ptw32_try_enter_critical_section - instead of TryEnterCriticalSection to avoid errors on Win95. - -Thu Dec 3 13:32:00 1998 Ross Johnson - - * README: Correct cygwin32 compatibility statement. - -Sun Nov 15 21:24:06 1998 Ross Johnson - - * cleanup.c (ptw32_destructor_run_all): Declare missing void * arg. - Fixup CVS merge conflicts. - -1998-10-30 Ben Elliston - - * condvar.c (cond_wait): Fix semantic error. Test for equality - instead of making an assignment. - -Fri Oct 30 15:15:50 1998 Ross Johnson - - * cleanup.c (ptw32_handler_push): Fixed bug appending new - handler to list reported by Peter Slacik - . - (new_thread): Rename poorly named local variable to - "new_handler". - -Sat Oct 24 18:34:59 1998 Ross Johnson - - * global.c: Add TSD key management array and index declarations. - - * implement.h: Ditto for externs. - -Fri Oct 23 00:08:09 1998 Ross Johnson - - * implement.h (PTW32_TSD_KEY_REUSE): Add enum. - - * private.c (ptw32_delete_thread): Add call to - ptw32_destructor_run_all() to clean up the threads keys. - - * cleanup.c (ptw32_destructor_run_all): Check for no more dirty - keys to run destructors on. Assume that the destructor call always - succeeds and set the key value to NULL. - -Thu Oct 22 21:44:44 1998 Ross Johnson - - * tsd.c (pthread_setspecific): Add key management code. - (pthread_key_create): Ditto. - (pthread_key_delete): Ditto. - - * implement.h (struct ptw32_tsd_key): Add status member. - - * tsd.c: Add description of pthread_key_delete() from the - standard as a comment. - -Fri Oct 16 17:38:47 1998 Ross Johnson - - * cleanup.c (ptw32_destructor_run_all): Fix and improve - stepping through the key table. - -Thu Oct 15 14:05:01 1998 Ross Johnson - - * private.c (ptw32_new_thread): Remove init of destructorstack. - No longer an element of pthread_t. - - * tsd.c (pthread_setspecific): Fix type declaration and cast. - (pthread_getspecific): Ditto. - (pthread_getspecific): Change error return value to NULL if key - is not in use. - -Thu Oct 15 11:53:21 1998 Ross Johnson - - * global.c (ptw32_tsd_key_table): Fix declaration. - - * implement.h(ptw32_TSD_keys_TlsIndex): Add missing extern. - (ptw32_tsd_mutex): Ditto. - - * create.c (ptw32_start_call): Fix "keys" array declaration. - Add comment. - - * tsd.c (pthread_setspecific): Fix type declaration and cast. - (pthread_getspecific): Ditto. - - * cleanup.c (ptw32_destructor_run_all): Declare missing loop - counter. - -Wed Oct 14 21:09:24 1998 Ross Johnson - - * private.c (ptw32_new_thread): Increment ptw32_threads_count. - (ptw32_delete_thread): Decrement ptw32_threads_count. - Remove some comments. - - * exit.c (ptw32_exit): : Fix two pthread_mutex_lock() calls that - should have been pthread_mutex_unlock() calls. - (ptw32_vacuum): Remove call to ptw32_destructor_pop_all(). - - * create.c (pthread_create): Fix two pthread_mutex_lock() calls that - should have been pthread_mutex_unlock() calls. - - * global.c (ptw32_tsd_mutex): Add mutex for TSD operations. - - * tsd.c (pthread_key_create): Add critical section. - (pthread_setspecific): Ditto. - (pthread_getspecific): Ditto. - (pthread_key_delete): Ditto. - - * sync.c (pthread_join): Fix two pthread_mutex_lock() calls that - should have been pthread_mutex_unlock() calls. - -Mon Oct 12 00:00:44 1998 Ross Johnson - - * implement.h (ptw32_tsd_key_table): New. - - * create.c (ptw32_start_call): Initialise per-thread TSD keys - to NULL. - - * misc.c (pthread_once): Correct typo in comment. - - * implement.h (ptw32_destructor_push): Remove. - (ptw32_destructor_pop): Remove. - (ptw32_destructor_run_all): Rename from ptw32_destructor_pop_all. - (PTW32_TSD_KEY_DELETED): Add enum. - (PTW32_TSD_KEY_INUSE): Add enum. - - * cleanup.c (ptw32_destructor_push): Remove. - (ptw32_destructor_pop): Remove. - (ptw32_destructor_run_all): Totally revamped TSD. - - * dll.c (ptw32_TSD_keys_TlsIndex): Initialise. - - * tsd.c (pthread_setspecific): Totally revamped TSD. - (pthread_getspecific): Ditto. - (pthread_create): Ditto. - (pthread_delete): Ditto. - -Sun Oct 11 22:44:55 1998 Ross Johnson - - * global.c (ptw32_tsd_key_table): Add new global. - - * implement.h (ptw32_tsd_key_t and struct ptw32_tsd_key): - Add. - (struct _pthread): Remove destructorstack. - - * cleanup.c (ptw32_destructor_run_all): Rename from - ptw32_destructor_pop_all. The key destructor stack was made - global rather than per-thread. No longer removes destructor nodes - from the stack. Comments updated. - -1998-10-06 Ben Elliston - - * condvar.c (cond_wait): Use POSIX, not Win32 mutex calls. - (pthread_cond_broadcast): Likewise. - (pthread_cond_signal): Likewise. - -1998-10-05 Ben Elliston - - * pthread.def: Update. Some functions aren't available yet, others - are macros in . - - * tests/join.c: Remove; useless. - -Mon Oct 5 14:25:08 1998 Ross Johnson - - * pthread.def: New file for building the DLL. - -1998-10-05 Ben Elliston - - * misc.c (pthread_equal): Correct inverted logic bug. - (pthread_once): Use the POSIX mutex primitives, not Win32. Remove - irrelevant FIXME comment. - - * global.c (PTHREAD_MUTEX_INITIALIZER): Move to pthread.h. - - * pthread.h (PTHREAD_MUTEX_INITIALIZER): Define. - (pthread_mutex_t): Reimplement as a struct containing a valid - flag. If the flag is ever down upon entry to a mutex operation, - we call pthread_mutex_create() to initialise the object. This - fixes the problem of how to handle statically initialised objects - that can't call InitializeCriticalSection() due to their context. - (PTHREAD_ONCE_INIT): Define. - - * mutex.c (pthread_mutex_init): Set valid flag. - (pthread_mutex_destroy): Clear valid flag. - (pthread_mutex_lock): Check and handle the valid flag. - (pthread_mutex_unlock): Likewise. - (pthread_mutex_trylock): Likewise. - - * tests/mutex3.c: New file; test for the static initialisation - macro. Passes. - - * tests/create1.c: New file; test pthread_create(). Passes. - - * tests/equal.c: Poor test; remove. - - * tests/equal1.c New file; test pthread_equal(). Passes. - - * tests/once1.c: New file; test for pthread_once(). Passes. - - * tests/self.c: Remove; rename to self1.c. - - * tests/self1.c: This is the old self.c. - - * tests/self2.c: New file. Test pthread_self() with a single - thread. Passes. - - * tests/self3.c: New file. Test pthread_self() with a couple of - threads to ensure their thread IDs differ. Passes. - -1998-10-04 Ben Elliston - - * tests/mutex2.c: Test pthread_mutex_trylock(). Passes. - - * tests/mutex1.c: New basic test for mutex functions (it passes). - (main): Eliminate warning. - - * configure.in: Test for __stdcall, not _stdcall. Typo. - - * configure: Regenerate. - - * attr.c (pthread_attr_setstackaddr): Remove FIXME comment. Win32 - does know about ENOSYS after all. - (pthread_attr_setstackaddr): Likewise. - -1998-10-03 Ben Elliston - - * configure.in: Test for the `_stdcall' keyword. Define `STDCALL' - to `_stdcall' if we have it, null otherwise. - - * configure: Regenerate. - - * acconfig.h (STDCALL): New define. - - * config.h.in: Regenerate. - - * create.c (ptw32_start_call): Add STDCALL prefix. - - * mutex.c (pthread_mutex_init): Correct function signature. - - * attr.c (pthread_attr_init): Only zero out the `sigmask' member - if we have the sigset_t type. - - * pthread.h: No need to include . It doesn't even exist - on Win32! Again, an artifact of cross-compilation. - (pthread_sigmask): Only provide if we have the sigset_t type. - - * process.h: Remove. This was a stand-in before we started doing - native compilation under Win32. - - * pthread.h (pthread_mutex_init): Make `attr' argument const. - -1998-10-02 Ben Elliston - - * COPYING: Remove. - - * COPYING.LIB: Add. This library is under the LGPL. - -1998-09-13 Ben Elliston - - * configure.in: Test for required system features. - - * configure: Generate. - - * acconfig.h: New file. - - * config.h.in: Generate. - - * Makefile.in: Renamed from Makefile. - - * COPYING: Import from a recent GNU package. - - * config.guess: Likewise. - - * config.sub: Likewise. - - * install-sh: Likewise. - - * config.h: Remove. - - * Makefile: Likewise. - -1998-09-12 Ben Elliston - - * windows.h: No longer needed; remove. - - * windows.c: Likewise. - -Sat Sep 12 20:09:24 1998 Ross Johnson - - * windows.h: Remove error number definitions. These are in - - * tsd.c: Add comment explaining rationale for not building - POSIX TSD on top of Win32 TLS. - -1998-09-12 Ben Elliston - - * {most}.c: Include to get POSIX error values. - - * signal.c (pthread_sigmask): Only provide if HAVE_SIGSET_T is - defined. - - * config.h: #undef features, don't #define them. This will be - generated by autoconf very soon. - -1998-08-11 Ben Elliston - - * Makefile (LIB): Define. - (clean): Define target. - (all): Build a library not just the object files. - - * pthread.h: Provide a definition for struct timespec if we don't - already have one. - - * windows.c (TlsGetValue): Bug fix. - -Thu Aug 6 15:19:22 1998 Ross Johnson - - * misc.c (pthread_once): Fix arg 1 of EnterCriticalSection() - and LeaveCriticalSection() calls to pass address-of lock. - - * fork.c (pthread_atfork): Typecast (void (*)(void *)) funcptr - in each ptw32_handler_push() call. - - * exit.c (ptw32_exit): Fix attr arg in - pthread_attr_getdetachstate() call. - - * private.c (ptw32_new_thread): Typecast (HANDLE) NULL. - (ptw32_delete_thread): Ditto. - - * implement.h: (PTW32_MAX_THREADS): Add define. This keeps - changing in an attempt to make thread administration data types - opaque and cleanup DLL startup. - - * dll.c (PthreadsEntryPoint): - (ptw32_virgins): Remove malloc() and free() calls. - (ptw32_reuse): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * global.c (_POSIX_THREAD_THREADS_MAX): Initialise with - PTW32_MAX_THREADS. - (ptw32_virgins): Ditto. - (ptw32_reuse): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * create.c (pthread_create): Typecast (HANDLE) NULL. - Typecast (unsigned (*)(void *)) start_routine. - - * condvar.c (pthread_cond_init): Add address-of operator & to - arg 1 of pthread_mutex_init() call. - (pthread_cond_destroy): Add address-of operator & to - arg 1 of pthread_mutex_destroy() call. - - * cleanup.c (ptw32_destructor_pop_all): Add (int) cast to - pthread_getspecific() arg. - (ptw32_destructor_pop): Add (void *) cast to "if" conditional. - (ptw32_destructor_push): Add (void *) cast to - ptw32_handler_push() "key" arg. - (malloc.h): Add include. - - * implement.h (ptw32_destructor_pop): Add prototype. - - * tsd.c (implement.h): Add include. - - * sync.c (pthread_join): Remove target_thread_mutex and it's - initialisation. Rename getdetachedstate to getdetachstate. - Remove unused variable "exitcode". - (pthread_detach): Remove target_thread_mutex and it's - initialisation. Rename getdetachedstate to getdetachstate. - Rename setdetachedstate to setdetachstate. - - * signal.c (pthread_sigmask): Rename SIG_SET to SIG_SETMASK. - Cast "set" to (long *) in assignment to passify compiler warning. - Add address-of operator & to thread->attr.sigmask in memcpy() call - and assignment. - (pthread_sigmask): Add address-of operator & to thread->attr.sigmask - in memcpy() call and assignment. - - * windows.h (THREAD_PRIORITY_ERROR_RETURN): Add. - (THREAD_PRIORITY_LOWEST): Add. - (THREAD_PRIORITY_HIGHEST): Add. - - * sched.c (is_attr): Add function. - (implement.h): Add include. - (pthread_setschedparam): Rename all instances of "sched_policy" - to "sched_priority". - (pthread_getschedparam): Ditto. - -Tue Aug 4 16:57:58 1998 Ross Johnson - - * private.c (ptw32_delete_thread): Fix typo. Add missing ';'. - - * global.c (ptw32_virgins): Change types from pointer to - array pointer. - (ptw32_reuse): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * implement.h(ptw32_virgins): Change types from pointer to - array pointer. - (ptw32_reuse): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * private.c (ptw32_delete_thread): Fix "entry" should be "thread". - - * misc.c (pthread_self): Add extern for ptw32_threadID_TlsIndex. - - * global.c: Add comment. - - * misc.c (pthread_once): Fix member -> dereferences. - Change ptw32_once_flag to once_control->flag in "if" test. - -Tue Aug 4 00:09:30 1998 Ross Johnson - - * implement.h(ptw32_virgins): Add extern. - (ptw32_virgin_next): Ditto. - (ptw32_reuse): Ditto. - (ptw32_reuse_top): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * global.c (ptw32_virgins): Changed from array to pointer. - Storage allocation for the array moved into dll.c. - (ptw32_reuse): Ditto. - (ptw32_win32handle_map): Ditto. - (ptw32_threads_mutex_table): Ditto. - - * dll.c (PthreadsEntryPoint): Set up thread admin storage when - DLL is loaded. - - * fork.c (pthread_atfork): Fix function pointer arg to all - ptw32_handler_push() calls. Change "arg" arg to NULL in child push. - - * exit.c: Add windows.h and process.h includes. - (ptw32_exit): Add local detachstate declaration. - (ptw32_exit): Fix incorrect name for pthread_attr_getdetachstate(). - - * pthread.h (_POSIX_THREAD_ATTR_STACKSIZE): Move from global.c - (_POSIX_THREAD_ATTR_STACKADDR): Ditto. - - * create.c (pthread_create): Fix #if should be #ifdef. - (ptw32_start_call): Remove usused variables. - - * process.h: Create. - - * windows.h: Move _beginthreadex and _endthreadex into - process.h - -Mon Aug 3 21:19:57 1998 Ross Johnson - - * condvar.c (pthread_cond_init): Add NULL attr to - pthread_mutex_init() call - default attributes will be used. - (cond_wait): Fix typo. - (cond_wait): Fix typo - cv was ev. - (pthread_cond_broadcast): Fix two identical typos. - - * cleanup.c (ptw32_destructor_pop_all): Remove _ prefix from - PTHREAD_DESTRUCTOR_ITERATIONS. - - * pthread.h: Move _POSIX_* values into posix.h - - * pthread.h: Fix typo in pthread_mutex_init() prototype. - - * attr.c (pthread_attr_init): Fix error in priority member init. - - * windows.h (THREAD_PRIORITY_NORMAL): Add. - - * pthread.h (sched_param): Add missing ';' to struct definition. - - * attr.c (pthread_attr_init): Remove obsolete pthread_attr_t - member initialisation - cancelstate, canceltype, cancel_pending. - (is_attr): Make arg "attr" a const. - - * implement.h (PTW32_HANDLER_POP_LIFO): Remove definition. - (PTW32_HANDLER_POP_FIFO): Ditto. - (PTW32_VALID): Add missing newline escape (\). - (ptw32_handler_node): Make element "next" a pointer. - -1998-08-02 Ben Elliston - - * windows.h: Remove duplicate TlsSetValue() prototype. Add - TlsGetValue() prototype. - (FALSE): Define. - (TRUE): Likewise. - Add forgotten errno values. Guard against multiple #includes. - - * windows.c: New file. Implement stubs for Win32 functions. - - * Makefile (SRCS): Remove. Not explicitly needed. - (CFLAGS): Add -Wall for all warnings with GCC. - -Sun Aug 2 19:03:42 1998 Ross Johnson - - * config.h: Create. This is a temporary stand-in for autoconf yet - to be done. - (HAVE_SIGNAL_H): Add. - - * pthread.h: Minor rearrangement for temporary config.h. - -Fri Jul 31 14:00:29 1998 Ross Johnson - - * cleanup.c (ptw32_destructor_pop): Implement. Removes - destructors associated with a key without executing them. - (ptw32_destructor_pop_all): Add FIXME comment. - - * tsd.c (pthread_key_delete): Add call to ptw32_destructor_pop(). - -Fri Jul 31 00:05:45 1998 Ross Johnson - - * tsd.c (pthread_key_create): Update to properly associate - the destructor routine with the key. - (pthread_key_delete): Add FIXME comment. - - * exit.c (ptw32_vacuum): Add call to - ptw32_destructor_pop_all(). - - * implement.h (ptw32_handler_pop_all): Add prototype. - (ptw32_destructor_pop_all): Ditto. - - * cleanup.c (ptw32_destructor_push): Implement. This is just a - call to ptw32_handler_push(). - (ptw32_destructor_pop_all): Implement. This is significantly - different to ptw32_handler_pop_all(). - - * Makefile (SRCS): Create. Preliminary. - - * windows.h: Create. Contains Win32 definitions for compile - testing. This is just a standin for the real one. - - * pthread.h (SIG_UNBLOCK): Fix typo. Was SIG_BLOCK. - (windows.h): Add include. Required for CRITICAL_SECTION. - (pthread_cond_t): Move enum declaration outside of struct - definition. - (unistd.h): Add include - may be temporary. - - * condvar.c (windows.h): Add include. - - * implement.h (PTW32_THIS): Remove - no longer required. - (PTW32_STACK): Use pthread_self() instead of PTW32_THIS. - -Thu Jul 30 23:12:45 1998 Ross Johnson - - * implement.h: Remove ptw32_find_entry() prototype. - - * private.c: Extend comments. - Remove ptw32_find_entry() - no longer needed. - - * create.c (ptw32_start_call): Add call to TlsSetValue() to - store the thread ID. - - * dll.c (PthreadsEntryPoint): Implement. This is called - whenever a process loads the DLL. Used to initialise thread - local storage. - - * implement.h: Add ptw32_threadID_TlsIndex. - Add ()s around PTW32_VALID expression. - - * misc.c (pthread_self): Re-implement using Win32 TLS to store - the threads own ID. - -Wed Jul 29 11:39:03 1998 Ross Johnson - - * private.c: Corrections in comments. - (ptw32_new_thread): Alter "if" flow to be more natural. - - * cleanup.c (ptw32_handler_push): Same as below. - - * create.c (pthread_create): Same as below. - - * private.c (ptw32_new_thread): Rename "new" to "new_thread". - Since when has a C programmer been required to know C++? - -Tue Jul 28 14:04:29 1998 Ross Johnson - - * implement.h: Add PTW32_VALID macro. - - * sync.c (pthread_join): Modify to use the new thread - type and ptw32_delete_thread(). Rename "target" to "thread". - Remove extra local variable "target". - (pthread_detach): Ditto. - - * signal.c (pthread_sigmask): Move init of "us" out of inner block. - Fix instance of "this" should have been "us". Rename "us" to "thread". - - * sched.c (pthread_setschedparam): Modify to use the new thread - type. - (pthread_getschedparam): Ditto. - - * private.c (ptw32_find_thread): Fix return type and arg. - - * implement.h: Remove PTW32_YES and PTW32_NO. - (ptw32_new_thread): Add prototype. - (ptw32_find_thread): Ditto. - (ptw32_delete_thread): Ditto. - (ptw32_new_thread_entry): Remove prototype. - (ptw32_find_thread_entry): Ditto. - (ptw32_delete_thread_entry): Ditto. - ( PTW32_NEW, PTW32_INUSE, PTW32_EXITED, PTW32_REUSE): - Add. - - - * create.c (pthread_create): Minor rename "us" to "new" (I need - these cues but it doesn't stop me coming out with some major bugs - at times). - Load start_routine and arg into the thread so the wrapper can - call it. - - * exit.c (pthread_exit): Fix pthread_this should be pthread_self. - - * cancel.c (pthread_setcancelstate): Change - ptw32_threads_thread_t * to pthread_t and init with - pthread_this(). - (pthread_setcanceltype): Ditto. - - * exit.c (ptw32_exit): Add new pthread_t arg. - Rename ptw32_delete_thread_entry to ptw32_delete_thread. - Rename "us" to "thread". - (pthread_exit): Call ptw32_exit with added thread arg. - - * create.c (ptw32_start_call): Insert missing ")". - Add "us" arg to ptw32_exit() call. - (pthread_create): Modify to use new thread allocation scheme. - - * private.c: Added detailed explanation of the new thread - allocation scheme. - (ptw32_new_thread): Totally rewritten to use - new thread allocation scheme. - (ptw32_delete_thread): Ditto. - (ptw32_find_thread): Obsolete. - -Mon Jul 27 17:46:37 1998 Ross Johnson - - * create.c (pthread_create): Start of rewrite. Not completed yet. - - * private.c (ptw32_new_thread_entry): Start of rewrite. Not - complete. - - * implement.h (ptw32_threads_thread): Rename, remove thread - member, add win32handle and ptstatus members. - (ptw32_t): Add. - - * pthread.h: pthread_t is no longer mapped directly to a Win32 - HANDLE type. This is so we can let the Win32 thread terminate and - reuse the HANDLE while pthreads holds it's own thread ID until - the last waiting join exits. - -Mon Jul 27 00:20:37 1998 Ross Johnson - - * private.c (ptw32_delete_thread_entry): Destroy the thread - entry attribute object before deleting the thread entry itself. - - * attr.c (pthread_attr_init): Initialise cancel_pending = FALSE. - (pthread_attr_setdetachstate): Rename "detached" to "detachedstate". - (pthread_attr_getdetachstate): Ditto. - - * exit.c (ptw32_exit): Fix incorrect check for detachedstate. - - * implement.h (ptw32_call_t): Remove env member. - -Sun Jul 26 13:06:12 1998 Ross Johnson - - * implement.h (ptw32_new_thread_entry): Fix prototype. - (ptw32_find_thread_entry): Ditto. - (ptw32_delete_thread_entry): Ditto. - (ptw32_exit): Add prototype. - - * exit.c (ptw32_exit): New function. Called from pthread_exit() - and ptw32_start_call() to exit the thread. It allows an extra - argument which is the return code passed to _endthreadex(). - (ptw32_exit): Move thread entry delete call from ptw32_vacuum() - into here. Add more explanation of thread entry deletion. - (ptw32_exit): Clarify comment. - - * create.c (ptw32_start_call): Change pthread_exit() call to - ptw32_exit() call. - - * exit.c (ptw32_vacuum): Add thread entry deletion code - moved from ptw32_start_call(). See next item. - (pthread_exit): Remove longjmp(). Add mutex lock around thread table - manipulation code. This routine now calls _enthreadex(). - - * create.c (ptw32_start_call): Remove setjmp() call and move - cleanup code out. Call pthread_exit(NULL) to terminate the thread. - -1998-07-26 Ben Elliston - - * tsd.c (pthread_getspecific): Update comments. - - * mutex.c (pthread_mutexattr_setpshared): Not supported; remove. - (pthread_mutexattr_getpshared): Likewise. - - * pthread.h (pthread_mutexattr_setpshared): Remove prototype. - (pthread_mutexattr_getpshared): Likewise. - -Sun Jul 26 00:09:59 1998 Ross Johnson - - * sync.c: Rename all instances of ptw32_count_mutex to - ptw32_table_mutex. - - * implement.h: Rename ptw32_count_mutex to - ptw32_table_mutex. - - * global.c: Rename ptw32_count_mutex to - ptw32_table_mutex. - - * create.c (pthread_create): Add critical sections. - (ptw32_start_call): Rename ptw32_count_mutex to - ptw32_table_mutex. - - * cancel.c (pthread_setcancelstate): Fix indirection bug and rename - "this" to "us". - - * signal.c (pthread_sigmask): Rename "this" to "us" and fix some - minor syntax errors. Declare "us" and initialise it. - - * sync.c (pthread_detach): Rename "this" to "target". - - * pthread.h: Converting PTHREAD_* defines to alias the (const int) - values in global.c. - - * global.c: Started converting PTHREAD_* defines to (const int) as - a part of making the eventual pthreads DLL binary compatible - through version changes. - - * condvar.c (cond_wait): Add cancelation point. This applies the - point to both pthread_cond_wait() and pthread_cond_timedwait(). - - * exit.c (pthread_exit): Rename "this" to "us". - - * implement.h: Add comment. - - * sync.c (pthread_join): I've satisfied myself that pthread_detach() - does set the detached attribute in the thread entry attributes - to PTHREAD_CREATE_DETACHED. "if" conditions were changed to test - that attribute instead of a separate flag. - - * create.c (pthread_create): Rename "this" to "us". - (pthread_create): cancelstate and canceltype are not attributes - so the copy to thread entry attribute storage was removed. - Only the thread itself can change it's cancelstate or canceltype, - ie. the thread must exist already. - - * private.c (ptw32_delete_thread_entry): Mutex locks removed. - Mutexes must be applied at the caller level. - (ptw32_new_thread_entry): Ditto. - (ptw32_new_thread_entry): Init cancelstate, canceltype, and - cancel_pending to default values. - (ptw32_new_thread_entry): Rename "this" to "new". - (ptw32_find_thread_entry): Rename "this" to "entry". - (ptw32_delete_thread_entry): Rename "thread_entry" to "entry". - - * create.c (ptw32_start_call): Mutexes changed to - ptw32_count_mutex. All access to the threads table entries is - under the one mutex. Otherwise chaos reigns. - -Sat Jul 25 23:16:51 1998 Ross Johnson - - * implement.h (ptw32_threads_thread): Move cancelstate and - canceltype members out of pthread_attr_t into here. - - * fork.c (fork): Add comment. - -1998-07-25 Ben Elliston - - * fork.c (fork): Autoconfiscate. - -Sat Jul 25 00:00:13 1998 Ross Johnson - - * create.c (ptw32_start_call): Set thread priority. Ensure our - thread entry is removed from the thread table but only if - pthread_detach() was called and there are no waiting joins. - (pthread_create): Set detach flag in thread entry if the - thread is created PTHREAD_CREATE_DETACHED. - - * pthread.h (pthread_attr_t): Rename member "detachedstate". - - * attr.c (pthread_attr_init): Rename attr members. - - * exit.c (pthread_exit): Fix indirection mistake. - - * implement.h (PTW32_THREADS_TABLE_INDEX): Add. - - * exit.c (ptw32_vacuum): Fix incorrect args to - ptw32_handler_pop_all() calls. - Make thread entry removal conditional. - - * sync.c (pthread_join): Add multiple join and async detach handling. - - * implement.h (PTW32_THREADS_TABLE_INDEX): Add. - - * global.c (ptw32_threads_mutex_table): Add. - - * implement.h (ptw32_once_flag): Remove. - (ptw32_once_lock): Ditto. - (ptw32_threads_mutex_table): Add. - - * global.c (ptw32_once_flag): Remove. - (ptw32_once_lock): Ditto. - - * sync.c (pthread_join): Fix tests involving new return value - from ptw32_find_thread_entry(). - (pthread_detach): Ditto. - - * private.c (ptw32_find_thread_entry): Failure return code - changed from -1 to NULL. - -Fri Jul 24 23:09:33 1998 Ross Johnson - - * create.c (pthread_create): Change . to -> in sigmask memcpy() args. - - * pthread.h: (pthread_cancel): Add function prototype. - (pthread_testcancel): Ditto. - -1998-07-24 Ben Elliston - - * pthread.h (pthread_condattr_t): Rename dummy structure member. - (pthread_mutexattr_t): Likewise. - -Fri Jul 24 21:13:55 1998 Ross Johnson - - * cancel.c (pthread_cancel): Implement. - (pthread_testcancel): Implement. - - * exit.c (pthread_exit): Add comment explaining the longjmp(). - - * implement.h (ptw32_threads_thread_t): New member cancelthread. - (PTW32_YES): Define. - (PTW32_NO): Define. - (RND_SIZEOF): Remove. - - * create.c (pthread_create): Rename cancelability to cancelstate. - - * pthread.h (pthread_attr_t): Rename cancelability to cancelstate. - (PTHREAD_CANCELED): Define. - -1998-07-24 Ben Elliston - - * pthread.h (SIG_BLOCK): Define if not already defined. - (SIG_UNBLOCK): Likewise. - (SIG_SETMASK): Likewise. - (pthread_attr_t): Add signal mask member. - (pthread_sigmask): Add function prototype. - - * signal.c (pthread_sigmask): Implement. - - * create.c: #include to get a prototype for memcpy(). - (pthread_create): New threads inherit their creator's signal - mask. Copy the signal mask to the new thread structure if we know - about signals. - -Fri Jul 24 16:33:17 1998 Ross Johnson - - * fork.c (pthread_atfork): Add all the necessary push calls. - Local implementation semantics: - If we get an ENOMEM at any time then ALL handlers - (including those from previous pthread_atfork() calls) will be - popped off each of the three atfork stacks before we return. - (fork): Add all the necessary pop calls. Add the thread cancellation - and join calls to the child fork. - Add #includes. - - * implement.h: (ptw32_handler_push): Fix return type and stack arg - type in prototype. - (ptw32_handler_pop): Fix stack arg type in prototype. - (ptw32_handler_pop_all): Fix stack arg type in prototype. - - * cleanup.c (ptw32_handler_push): Change return type to int and - return ENOMEM if malloc() fails. - - * sync.c (pthread_detach): Use equality test, not assignment. - - * create.c (ptw32_start_call): Add call to Win32 CloseHandle() - if thread is detached. - -1998-07-24 Ben Elliston - - * sync.c (pthread_detach): Close the Win32 thread handle to - emulate detached (or daemon) threads. - -Fri Jul 24 03:00:25 1998 Ross Johnson - - * sync.c (pthread_join): Save valueptr arg in joinvalueptr for - pthread_exit() to use. - - * private.c (ptw32_new_thread_entry): Initialise joinvalueptr to - NULL. - - * create.c (ptw32_start_call): Rewrite to facilitate joins. - pthread_exit() will do a longjmp() back to here. Does appropriate - cleanup and exit/return from the thread. - (pthread_create): _beginthreadex() now passes a pointer to our - thread table entry instead of just the call member of that entry. - - * implement.h (ptw32_threads_thread): New member - void ** joinvalueptr. - (ptw32_call_t): New member jmpbuf env. - - * exit.c (pthread_exit): Major rewrite to handle joins and handing - value pointer to joining thread. Uses longjmp() back to - ptw32_start_call(). - - * create.c (pthread_create): Ensure values of new attribute members - are copied to the thread attribute object. - - * attr.c (pthread_attr_destroy): Fix merge conflicts. - (pthread_attr_getdetachstate): Fix merge conflicts. - (pthread_attr_setdetachstate): Fix merge conflicts. - - * pthread.h: Fix merge conflicts. - - * sync.c (pthread_join): Fix merge conflicts. - -Fri Jul 24 00:21:21 1998 Ross Johnson - - * sync.c (pthread_join): Add check for valid and joinable - thread. - (pthread_detach): Implement. After checking for a valid and joinable - thread, it's still a no-op. - - * private.c (ptw32_find_thread_entry): Bug prevented returning - an error value in some cases. - - * attr.c (pthread_attr_setdetachedstate): Implement. - (pthread_attr_getdetachedstate): Implement. - - * implement.h: Move more hidden definitions into here from - pthread.h. - -1998-07-24 Ben Elliston - - * pthread.h (PTHREAD_CREATE_JOINABLE): Define. - (PTHREAD_CREATE_DETACHED): Likewise. - (pthread_attr_t): Add new structure member `detached'. - (pthread_attr_getdetachstate): Add function prototype. - (pthread_attr_setdetachstate): Likewise. - - * sync.c (pthread_join): Return if the target thread is detached. - - * attr.c (pthread_attr_init): Initialise cancelability and - canceltype structure members. - (pthread_attr_getdetachstate): Implement. - (pthread_attr_setdetachstate): Likewise. - - * implement.h (PTW32_CANCEL_DEFAULTS): Remove. Bit fields - proved to be too cumbersome. Set the defaults in attr.c using the - public PTHREAD_CANCEL_* constants. - - * cancel.c: New file. - - * pthread.h (sched_param): Define this type. - (pthread_attr_getschedparam): Add function prototype. - (pthread_attr_setschedparam): Likewise. - (pthread_setcancelstate): Likewise. - (pthread_setcanceltype): Likewise. - (sched_get_priority_min): Likewise. - (sched_get_priority_max): Likewise. - (pthread_mutexattr_setprotocol): Remove; not supported. - (pthread_mutexattr_getprotocol): Likewise. - (pthread_mutexattr_setprioceiling): Likewise. - (pthread_mutexattr_getprioceiling): Likewise. - (pthread_attr_t): Add canceltype member. Update comments. - (SCHED_OTHER): Define this scheduling policy constant. - (SCHED_FIFO): Likewise. - (SCHED_RR): Likewise. - (SCHED_MIN): Define the lowest possible value for this constant. - (SCHED_MAX): Likewise, the maximum possible value. - (PTHREAD_CANCEL_ASYNCHRONOUS): Redefine. - (PTHREAD_CANCEL_DEFERRED): Likewise. - - * sched.c: New file. - (pthread_setschedparam): Implement. - (pthread_getschedparam): Implement. - (sched_get_priority_max): Validate policy argument. - (sched_get_priority_min): Likewise. - - * mutex.c (pthread_mutexattr_setprotocol): Remove; not supported. - (pthread_mutexattr_getprotocol): Likewise. - (pthread_mutexattr_setprioceiling): Likewise. - (pthread_mutexattr_getprioceiling): Likewise. - -Fri Jul 24 00:21:21 1998 Ross Johnson - - * create.c (pthread_create): Arg to ptw32_new_thread_entry() - changed. See next entry. Move mutex locks out. Changes made yesterday - and today allow us to start the new thread running rather than - temporarily suspended. - - * private.c (ptw32_new_thread_entry): ptw32_thread_table - was changed back to a table of thread structures rather than pointers. - As such we're trading storage for increaded speed. This routine - was modified to work with the new table. Mutex lock put in around - global data accesses. - (ptw32_find_thread_entry): Ditto - (ptw32_delete_thread_entry): Ditto - -Thu Jul 23 23:25:30 1998 Ross Johnson - - * global.c: New. Global data objects declared here. These moved from - pthread.h. - - * pthread.h: Move implementation hidden definitions into - implement.h. - - * implement.h: Move implementation hidden definitions from - pthread.h. Add constants to index into the different handler stacks. - - * cleanup.c (ptw32_handler_push): Simplify args. Restructure. - (ptw32_handler_pop): Simplify args. Restructure. - (ptw32_handler_pop_all): Simplify args. Restructure. - -Wed Jul 22 00:16:22 1998 Ross Johnson - - * attr.c, implement.h, pthread.h, ChangeLog: Resolve CVS merge - conflicts. - - * private.c (ptw32_find_thread_entry): Changes to return type - to support leaner ptw32_threads_table[] which now only stores - ptw32_thread_thread_t *. - (ptw32_new_thread_entry): Internal changes. - (ptw32_delete_thread_entry): Internal changes to avoid contention. - Calling routines changed accordingly. - - * pthread.h: Modified cleanup macros to use new generic push and pop. - Added destructor and atfork stacks to ptw32_threads_thread_t. - - * cleanup.c (ptw32_handler_push, ptw32_handler_pop, - ptw32_handler_pop_all): Renamed cleanup push and pop routines - and made generic to handle destructors and atfork handlers as - well. - - * create.c (ptw32_start_call): New function is a wrapper for - all new threads. It allows us to do some cleanup when the thread - returns, ie. that is otherwise only done if the thread is cancelled. - - * exit.c (ptw32_vacuum): New function contains code from - pthread_exit() that we need in the new ptw32_start_call() - as well. - - * implement.h: Various additions and minor changes. - - * pthread.h: Various additions and minor changes. - Change cleanup handler macros to use generic handler push and pop - functions. - - * attr.c: Minor mods to all functions. - (is_attr): Implemented missing function. - - * create.c (pthread_create): More clean up. - - * private.c (ptw32_find_thread_entry): Implement. - (ptw32_delete_thread_entry): Implement. - (ptw32_new_thread_entry): Implement. - These functions manipulate the implementations internal thread - table and are part of general code cleanup and modularisation. - They replace ptw32_getthreadindex() which was removed. - - * exit.c (pthread_exit): Changed to use the new code above. - - * pthread.h: Add cancelability constants. Update comments. - -1998-07-22 Ben Elliston - - * attr.c (pthread_setstacksize): Update test of attr argument. - (pthread_getstacksize): Likewise. - (pthread_setstackaddr): Likewise. - (pthread_getstackaddr): Likewise. - (pthread_attr_init): No need to allocate any storage. - (pthread_attr_destroy): No need to free any storage. - - * mutex.c (is_attr): Not likely to be needed; remove. - (remove_attr): Likewise. - (insert_attr): Likewise. - - * implement.h (ptw32_mutexattr_t): Moved to a public definition - in pthread.h. There was little gain in hiding these details. - (ptw32_condattr_t): Likewise. - (ptw32_attr_t): Likewise. - - * pthread.h (pthread_atfork): Add function prototype. - (pthread_attr_t): Moved here from implement.h. - - * fork.c (pthread_atfork): Preliminary implementation. - (ptw32_fork): Likewise. - -Wed Jul 22 00:16:22 1998 Ross Johnson - - * cleanup.c (ptw32_cleanup_push): Implement. - (ptw32_cleanup_pop): Implement. - (ptw32_do_cancellation): Implement. - These are private to the implementation. The real cleanup functions - are macros. See below. - - * pthread.h (pthread_cleanup_push): Implement as a macro. - (pthread_cleanup_pop): Implement as a macro. - Because these are macros which start and end a block, the POSIX scoping - requirement is observed. See the comment in the file. - - * exit.c (pthread_exit): Refine the code. - - * create.c (pthread_create): Code cleanup. - - * implement.h (RND_SIZEOF): Add RND_SIZEOF(T) to round sizeof(T) - up to multiple of DWORD. - Add function prototypes. - - * private.c (ptw32_getthreadindex): "*thread" should have been - "thread". Detect empty slot fail condition. - -1998-07-20 Ben Elliston - - * misc.c (pthread_once): Implement. Don't use a per-application - flag and mutex--make `pthread_once_t' contain these elements in - their structure. The earlier version had incorrect semantics. - - * pthread.h (ptw32_once_flag): Add new variable. Remove. - (ptw32_once_lock): Add new mutex lock to ensure integrity of - access to ptw32_once_flag. Remove. - (pthread_once): Add function prototype. - (pthread_once_t): Define this type. - -Mon Jul 20 02:31:05 1998 Ross Johnson - - * private.c (ptw32_getthreadindex): Implement. - - * pthread.h: Add application static data dependent on - _PTHREADS_BUILD_DLL define. This is needed to avoid allocating - non-sharable static data within the pthread DLL. - - * implement.h: Add ptw32_cleanup_stack_t, ptw32_cleanup_node_t - and PTW32_HASH_INDEX. - - * exit.c (pthread_exit): Begin work on cleanup and de-allocate - thread-private storage. - - * create.c (pthread_create): Add thread to thread table. - Keep a thread-private copy of the attributes with default values - filled in when necessary. Same for the cleanup stack. Make - pthread_create C run-time library friendly by using _beginthreadex() - instead of CreateThread(). Fix error returns. - -Sun Jul 19 16:26:23 1998 Ross Johnson - - * implement.h: Rename pthreads_thread_count to ptw32_threads_count. - Create ptw32_threads_thread_t struct to keep thread specific data. - - * create.c: Rename pthreads_thread_count to ptw32_threads_count. - (pthread_create): Handle errors from CreateThread(). - -1998-07-19 Ben Elliston - - * condvar.c (pthread_cond_wait): Generalise. Moved from here .. - (cond_wait): To here. - (pthread_cond_timedwait): Implement; use generalised cond_wait(). - - * pthread.h (pthread_key_t): Define this type. - (pthread_key_create): Add function prototype. - (pthread_setspecific): Likewise. - (pthread_getspecific): Likwise. - (pthread_key_delete): Likewise. - - * tsd.c (pthread_key_create): Implement. - (pthread_setspecific): Likewise. - (pthread_getspecific): Likewise. - (pthread_key_delete): Likewise. - - * mutex.c (pthread_mutex_trylock): Return ENOSYS if this function - is called on a Win32 platform which is not Windows NT. - -1998-07-18 Ben Elliston - - * condvar.c (pthread_condattr_init): Do not attempt to malloc any - storage; none is needed now that condattr_t is an empty struct. - (pthread_condattr_destory): Likewise; do not free storage. - (pthread_condattr_setpshared): No longer supported; return ENOSYS. - (pthread_condattr_getpshared): Likewise. - (pthread_cond_init): Implement with help from Douglas Schmidt. - Remember to initialise the cv's internal mutex. - (pthread_cond_wait): Likewise. - (pthread_cond_signal): Likewise. - (pthread_cond_broadcast): Likewise. - (pthread_cond_timedwait): Preliminary implementation, but I need - to see some API documentation for `WaitForMultipleObject'. - (pthread_destory): Implement. - - * pthread.h (pthread_cond_init): Add function protoype. - (pthread_cond_broadcast): Likewise. - (pthread_cond_signal): Likewise. - (pthread_cond_timedwait): Likewise. - (pthread_cond_wait): Likewise. - (pthread_cond_destroy): Likewise. - (pthread_cond_t): Define this type. Fix for u_int. Do not assume - that the mutex contained withing the pthread_cond_t structure will - be a critical section. Use our new POSIX type! - - * implement.h (ptw32_condattr_t): Remove shared attribute. - -1998-07-17 Ben Elliston - - * pthread.h (PTHREADS_PROCESS_PRIVATE): Remove. - (PTHREAD_PROCESS_SHARED): Likewise. No support for mutexes shared - across processes for now. - (pthread_mutex_t): Use a Win32 CRITICAL_SECTION type for better - performance. - - * implement.h (ptw32_mutexattr_t): Remove shared attribute. - - * mutex.c (pthread_mutexattr_setpshared): This optional function - is no longer supported, since we want to implement POSIX mutex - variables using the much more efficient Win32 critical section - primitives. Critical section objects in Win32 cannot be shared - between processes. - (pthread_mutexattr_getpshared): Likewise. - (pthread_mutexattr_init): No need to malloc any storage; the - attributes structure is now empty. - (pthread_mutexattr_destroy): This is now a nop. - (pthread_mutex_init): Use InitializeCriticalSection(). - (pthread_mutex_destroy): Use DeleteCriticalSection(). - (pthread_mutex_lock): Use EnterCriticalSection(). - (pthread_mutex_trylock): Use TryEnterCriticalSection(). This is - not supported by Windows 9x, but trylock is a hack anyway, IMHO. - (pthread_mutex_unlock): Use LeaveCriticalSection(). - -1998-07-14 Ben Elliston - - * attr.c (pthread_attr_setstacksize): Implement. - (pthread_attr_getstacksize): Likewise. - (pthread_attr_setstackaddr): Likewise. - (pthread_attr_getstackaddr): Likewise. - (pthread_attr_init): Likewise. - (pthread_attr_destroy): Likewise. - - * condvar.c (pthread_condattr_init): Add `_cond' to function name. - - * mutex.c (pthread_mutex_lock): Add `_mutex' to function name. - (pthread_mutex_trylock): Likewise. - (pthread_mutex_unlock): Likewise. - - * pthread.h (pthread_condattr_setpshared): Fix typo. - (pthread_attr_init): Add function prototype. - (pthread_attr_destroy): Likewise. - (pthread_attr_setstacksize): Likewise. - (pthread_attr_getstacksize): Likewise. - (pthread_attr_setstackaddr): Likewise. - (pthread_attr_getstackaddr): Likewise. - -Mon Jul 13 01:09:55 1998 Ross Johnson - - * implement.h: Wrap in #ifndef _IMPLEMENT_H - - * create.c (pthread_create): Map stacksize attr to Win32. - - * mutex.c: Include implement.h - -1998-07-13 Ben Elliston - - * condvar.c (pthread_condattr_init): Implement. - (pthread_condattr_destroy): Likewise. - (pthread_condattr_setpshared): Likewise. - (pthread_condattr_getpshared): Likewise. - - * implement.h (PTHREAD_THREADS_MAX): Remove trailing semicolon. - (PTHREAD_STACK_MIN): Specify; needs confirming. - (ptw32_attr_t): Define this type. - (ptw32_condattr_t): Likewise. - - * pthread.h (pthread_mutex_t): Define this type. - (pthread_condattr_t): Likewise. - (pthread_mutex_destroy): Add function prototype. - (pthread_lock): Likewise. - (pthread_trylock): Likewise. - (pthread_unlock): Likewise. - (pthread_condattr_init): Likewise. - (pthread_condattr_destroy): Likewise. - (pthread_condattr_setpshared): Likewise. - (pthread_condattr_getpshared): Likewise. - - * mutex.c (pthread_mutex_init): Implement. - (pthread_mutex_destroy): Likewise. - (pthread_lock): Likewise. - (pthread_trylock): Likewise. - (pthread_unlock): Likewise. - -1998-07-12 Ben Elliston - - * implement.h (ptw32_mutexattr_t): Define this implementation - internal type. Application programmers only see a mutex attribute - object as a void pointer. - - * pthread.h (pthread_mutexattr_t): Define this type. - (pthread_mutexattr_init): Add function prototype. - (pthread_mutexattr_destroy): Likewise. - (pthread_mutexattr_setpshared): Likewise. - (pthread_mutexattr_getpshared): Likewise. - (pthread_mutexattr_setprotocol): Likewise. - (pthread_mutexattr_getprotocol): Likewise. - (pthread_mutexattr_setprioceiling): Likewise. - (pthread_mutexattr_getprioceiling): Likewise. - (PTHREAD_PROCESS_PRIVATE): Define. - (PTHREAD_PROCESS_SHARED): Define. - - * mutex.c (pthread_mutexattr_init): Implement. - (pthread_mutexattr_destroy): Implement. - (pthread_mutexattr_setprotocol): Implement. - (pthread_mutexattr_getprotocol): Likewise. - (pthread_mutexattr_setprioceiling): Likewise. - (pthread_mutexattr_getprioceiling): Likewise. - (pthread_mutexattr_setpshared): Likewise. - (pthread_mutexattr_getpshared): Likewise. - (insert_attr): New function; very preliminary implementation! - (is_attr): Likewise. - (remove_attr): Likewise. - -Sat Jul 11 14:48:54 1998 Ross Johnson - - * implement.h: Preliminary implementation specific defines. - - * create.c (pthread_create): Preliminary implementation. - -1998-07-11 Ben Elliston - - * sync.c (pthread_join): Implement. - - * misc.c (pthread_equal): Likewise. - - * pthread.h (pthread_join): Add function prototype. - (pthread_equal): Likewise. - -1998-07-10 Ben Elliston - - * misc.c (pthread_self): Implement. - - * exit.c (pthread_exit): Implement. - - * pthread.h (pthread_exit): Add function prototype. - (pthread_self): Likewise. - (pthread_t): Define this type. - -1998-07-09 Ben Elliston - - * create.c (pthread_create): A dummy stub right now. - - * pthread.h (pthread_create): Add function prototype. diff --git a/software/src/lib/pthread/FAQ b/software/src/lib/pthread/FAQ deleted file mode 100644 index cb1786c..0000000 --- a/software/src/lib/pthread/FAQ +++ /dev/null @@ -1,451 +0,0 @@ - ========================================= - PTHREADS-WIN32 Frequently Asked Questions - ========================================= - -INDEX ------ - -Q 1 What is it? - -Q 2 Which of the several dll versions do I use? - or, - What are all these pthread*.dll and pthread*.lib files? - -Q 3 What is the library naming convention? - -Q 4 Cleanup code default style or: it used to work when I built - the library myself, but now it doesn't - why? - -Q 5 Why is the default library version now less exception-friendly? - -Q 6 Should I use Cygwin or Mingw32 as a development environment? - -Q 7 Now that pthreads-win32 builds under Mingw32, why do I get - memory access violations (segfaults)? - -Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) - -Q 9 Cancelation doesn't work for me, why? - -Q 10 How do I generate pthreadGCE.dll and libpthreadw32.a for use - with Mingw32? - -Q 11 Why isn't pthread_t defined as a scalar (e.g. pointer or int) - like it is for other POSIX threads implementations? - -============================================================================= - -Q 1 What is it? ---- - -Pthreads-win32 is an Open Source Software implementation of the -Threads component of the POSIX 1003.1c 1995 Standard for Microsoft's -Win32 environment. Some functions from POSIX 1003.1b are also -supported including semaphores. Other related functions include -the set of read-write lock functions. The library also supports -some of the functionality of the Open Group's Single Unix -specification, version 2, namely mutex types. - -See the file "ANNOUNCE" for more information including standards -conformance details and list of supported routines. - - ------------------------------------------------------------------------------- - -Q 2 Which of the several dll versions do I use? ---- or, - What are all these pthread*.dll and pthread*.lib files? - -Simply, you only use one of them, but you need to choose carefully. - -The most important choice you need to make is whether to use a -version that uses exceptions internally, or not (there are versions -of the library that use exceptions as part of the thread -cancelation and cleanup implementation, and one that uses -setjmp/longjmp instead). - -There is some contension amongst POSIX threads experts as -to how POSIX threads cancelation and exit should work -with languages that include exceptions and handlers, e.g. -C++ and even C (Microsoft's Structured Exceptions). - -The issue is: should cancelation of a thread in, say, -a C++ application cause object destructors and C++ exception -handlers to be invoked as the stack unwinds during thread -exit, or not? - -There seems to be more opinion in favour of using the -standard C version of the library (no EH) with C++ applications -since this appears to be the assumption commercial pthreads -implementations make. Therefore, if you use an EH version -of pthreads-win32 then you may be under the illusion that -your application will be portable, when in fact it is likely to -behave very differently linked with other pthreads libraries. - -Now you may be asking: why have you kept the EH versions of -the library? - -There are a couple of reasons: -- there is division amongst the experts and so the code may - be needed in the future. (Yes, it's in the repository and we - can get it out anytime in the future, but ...) -- pthreads-win32 is one of the few implementations, and possibly - the only freely available one, that has EH versions. It may be - useful to people who want to play with or study application - behaviour under these conditions. - - ------------------------------------------------------------------------------- - -Q 3 What is the library naming convention? ---- - -Because the library is being built using various exception -handling schemes and compilers - and because the library -may not work reliably if these are mixed in an application, -each different version of the library has it's own name. - -Note 1: the incompatibility is really between EH implementations -of the different compilers. It should be possible to use the -standard C version from either compiler with C++ applications -built with a different compiler. If you use an EH version of -the library, then you must use the same compiler for the -application. This is another complication and dependency that -can be avoided by using only the standard C library version. - -Note 2: if you use a standard C pthread*.dll with a C++ -application, then any functions that you define that are -intended to be called via pthread_cleanup_push() must be -__cdecl. - -Note 3: the intention is to also name either the VC or GC -version (it should be arbitrary) as pthread.dll, including -pthread.lib and libpthread.a as appropriate. - -In general: - pthread[VG]{SE,CE,C}.dll - pthread[VG]{SE,CE,C}.lib - -where: - [VG] indicates the compiler - V - MS VC - G - GNU C - - {SE,CE,C} indicates the exception handling scheme - SE - Structured EH - CE - C++ EH - C - no exceptions - uses setjmp/longjmp - -For example: - pthreadVSE.dll (MSVC/SEH) - pthreadGCE.dll (GNUC/C++ EH) - pthreadGC.dll (GNUC/not dependent on exceptions) - -The GNU library archive file names have changed to: - - libpthreadGCE.a - libpthreadGC.a - - ------------------------------------------------------------------------------- - -Q 4 Cleanup code default style or: it used to work when I built ---- the library myself, but now it doesn't - why? - -Up to and including snapshot 2001-07-12, if not defined, the cleanup -style was determined automatically from the compiler used, and one -of the following was defined accordingly: - - __CLEANUP_SEH MSVC only - __CLEANUP_CXX C++, including MSVC++, GNU G++ - __CLEANUP_C C, including GNU GCC, not MSVC - -These defines determine the style of cleanup (see pthread.h) and, -most importantly, the way that cancelation and thread exit (via -pthread_exit) is performed (see the routine ptw32_throw() in private.c). - -In short, the exceptions versions of the library throw an exception -when a thread is canceled or exits (via pthread_exit()), which is -caught by a handler in the thread startup routine, so that the -the correct stack unwinding occurs regardless of where the thread -is when it's canceled or exits via pthread_exit(). - -After snapshot 2001-07-12, unless your build explicitly defines (e.g. -via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then -the build now ALWAYS defaults to __CLEANUP_C style cleanup. This style -uses setjmp/longjmp in the cancelation and pthread_exit implementations, -and therefore won't do stack unwinding even when linked to applications -that have it (e.g. C++ apps). This is for consistency with most/all -commercial Unix POSIX threads implementations. - -Although it was not clearly documented before, it is still necessary to -build your application using the same __CLEANUP_* define as was -used for the version of the library that you link with, so that the -correct parts of pthread.h are included. That is, the possible -defines require the following library versions: - - __CLEANUP_SEH pthreadVSE.dll - __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll - __CLEANUP_C pthreadVC.dll or pthreadGC.dll - -THE POINT OF ALL THIS IS: if you have not been defining one of these -explicitly, then the defaults have been set according to the compiler -and language you are using, as described at the top of this -section. - -THIS NOW CHANGES, as has been explained above. For example: - -If you were building your application with MSVC++ i.e. using C++ -exceptions (rather than SEH) and not explicitly defining one of -__CLEANUP_*, then __CLEANUP_C++ was defined for you in pthread.h. -You should have been linking with pthreadVCE.dll, which does -stack unwinding. - -If you now build your application as you had before, pthread.h will now -set __CLEANUP_C as the default style, and you will need to link -with pthreadVC.dll. Stack unwinding will now NOT occur when a -thread is canceled, nor when the thread calls pthread_exit(). - -Your application will now most likely behave differently to previous -versions, and in non-obvious ways. Most likely is that local -objects may not be destroyed or cleaned up after a thread -is canceled. - -If you want the same behaviour as before, then you must now define -__CLEANUP_C++ explicitly using a compiler option and link with -pthreadVCE.dll as you did before. - - ------------------------------------------------------------------------------- - -Q 5 Why is the default library version now less exception-friendly? ---- - -Because most commercial Unix POSIX threads implementations don't allow you to -choose to have stack unwinding. (Compaq's TRU64 Unix is possibly an exception.) - -Therefore, providing it in pthread-win32 as a default could be dangerous -and non-portable. We still provide the choice but you must now consciously -make it. - -WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER? -There are a few reasons: -- because there are well respected POSIX threads people who believe - that POSIX threads implementations should be exceptions-aware and - do the expected thing in that context. (There are equally respected - people who believe it should not be easily accessible, if it's there - at all.) -- because pthreads-win32 is one of the few implementations that has - the choice, perhaps the only freely available one, and so offers - a laboratory to people who may want to explore the effects; -- although the code will always be around somewhere for anyone who - wants it, once it's removed from the current version it will not be - nearly as visible to people who may have a use for it. - - ------------------------------------------------------------------------------- - -Q 6 Should I use Cygwin or Mingw32 as a development environment? ---- - -Important: see Q7 also. - -Use Mingw32 with the MSVCRT library to build applications that use -the pthreads DLL. - -Cygwin's own internal support for POSIX threads is growing. -Consult that project's documentation for more information. - ------------------------------------------------------------------------------- - -Q 7 Now that pthreads-win32 builds under Mingw32, why do I get ---- memory access violations (segfaults)? - -The latest Mingw32 package has thread-safe exception handling (see Q10). -Also, see Q6 above. - ------------------------------------------------------------------------------- - -Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0) ---- - -> -> I'm a "rookie" when it comes to your pthread implementation. I'm currently -> desperately trying to install the prebuilt .dll file into my MSVC compiler. -> Could you please provide me with explicit instructions on how to do this (or -> direct me to a resource(s) where I can acquire such information)? -> -> Thank you, -> - -You should have a .dll, .lib, .def, and three .h files. It is recommended -that you use pthreadVC.dll, rather than pthreadVCE.dll or pthreadVSE.dll -(see Q2 above). - -The .dll can go in any directory listed in your PATH environment -variable, so putting it into C:\WINDOWS should work. - -The .lib file can go in any directory listed in your LIB environment -variable. - -The .h files can go in any directory listed in your INCLUDE -environment variable. - -Or you might prefer to put the .lib and .h files into a new directory -and add its path to LIB and INCLUDE. You can probably do this easiest -by editing the file:- - -C:\Program Files\DevStudio\vc\bin\vcvars32.bat - -The .def file isn't used by anything in the pre-compiled version but -is included for information. - -Cheers. -Ross - ------------------------------------------------------------------------------- - -Q 9 Cancelation doesn't work for me, why? ---- - -> I'm investigating a problem regarding thread cancelation. The thread I want -> to cancel has PTHREAD_CANCEL_ASYNCHRONOUS, however, this piece of code -> blocks on the join(): -> -> if ((retv = Pthread_cancel( recvThread )) == 0) -> { -> retv = Pthread_join( recvThread, 0 ); -> } -> -> Pthread_* are just macro's; they call pthread_*. -> -> The thread recvThread seems to block on a select() call. It doesn't get -> cancelled. -> -> Two questions: -> -> 1) is this normal behaviour? -> -> 2) if not, how does the cancel mechanism work? I'm not very familliar to -> win32 programming, so I don't really understand how the *Event() family of -> calls work. - -The answer to your first question is, normal POSIX behaviour would -be to asynchronously cancel the thread. However, even that doesn't -guarantee cancelation as the standard only says it should be -cancelled as soon as possible. - -Snapshot 99-11-02 or earlier only partially supports asynchronous cancellation. -Snapshots since then simulate async cancelation by poking the address of -a cancelation routine into the PC of the threads context. This requires -the thread to be resumed in some way for the cancelation to actually -proceed. This is not true async cancelation, but it is as close as we've -been able to get to it. - -If the thread you're trying to cancel is blocked (for instance, it could be -waiting for data from the network), it will only get cancelled when it unblocks -(when the data arrives). For true pre-emptive cancelation in these cases, -pthreads-win32 from snapshot 2004-05-16 can automatically recognise and use the -QueueUserAPCEx package by Panagiotis E. Hadjidoukas. This package is available -from the pthreads-win32 ftp site and is included in the pthreads-win32 -self-unpacking zip from 2004-05-16 onwards. - -Using deferred cancelation would normally be the way to go, however, -even though the POSIX threads standard lists a number of C library -functions that are defined as deferred cancelation points, there is -no hookup between those which are provided by Windows and the -pthreads-win32 library. - -Incidently, it's worth noting for code portability that the older POSIX -threads standards cancelation point lists didn't include "select" because -(as I read in Butenhof) it wasn't part of POSIX. However, it does appear in -the SUSV3. - -Effectively, the only mandatory cancelation points that pthreads-win32 -recognises are those the library implements itself, ie. - - pthread_testcancel - pthread_cond_wait - pthread_cond_timedwait - pthread_join - sem_wait - sem_timedwait - pthread_delay_np - -The following routines from the non-mandatory list in SUSV3 are -cancelation points in pthreads-win32: - - pthread_rwlock_wrlock - pthread_rwlock_timedwrlock - -The following routines from the non-mandatory list in SUSV3 are not -cancelation points in pthreads-win32: - - pthread_rwlock_rdlock - pthread_rwlock_timedrdlock - -Pthreads-win32 also provides two functions that allow you to create -cancelation points within your application, but only for cases where -a thread is going to block on a Win32 handle. These are: - - pthreadCancelableWait(HANDLE waitHandle) /* Infinite wait */ - - pthreadCancelableTimedWait(HANDLE waitHandle, DWORD timeout) - ------------------------------------------------------------------------------- - - -Q 10 How do I create thread-safe applications using ----- pthreadGCE.dll, libpthreadw32.a and Mingw32? - -This should not be a problem with recent versions of MinGW32. - -For early versions, see Thomas Pfaff's email at: -http://sources.redhat.com/ml/pthreads-win32/2002/msg00000.html ------------------------------------------------------------------------------- - -Q 11 Why isn't pthread_t defined as a scalar (e.g. pointer or int) - like it is for other POSIX threads implementations? ----- - -Originally pthread_t was defined as a pointer (to the opaque pthread_t_ -struct) and later it was changed to a struct containing the original -pointer plus a sequence counter. This is allowed under both the original -POSIX Threads Standard and the current Single Unix Specification. - -When pthread_t is a simple pointer to a struct some very difficult to -debug problems arise from the process of freeing and later allocing -thread structs because new pthread_t handles can acquire the identity of -previously detached threads. The change to a struct was made, along with -some changes to their internal managment, in order to guarantee (for -practical applications) that the pthread_t handle will be unique over the -life of the running process. - -Where application code attempts to compare one pthread_t against another -directly, a compiler error will be emitted because structs can't be -compared at that level. This should signal a potentially serious problem -in the code design, which would go undetected if pthread_t was a scalar. - -The POSIX Threading API provides a function named pthread_equal() to -compare pthread_t thread handles. - -Other pthreads implementations, such as Sun's, use an int as the handle -but do guarantee uniqueness within the process scope. Win32 scalar typed -thread handles also guarantee uniqueness in system scope. It wasn't clear -how well the internal management of these handles would scale as the -number of threads and the fragmentation of the sequence numbering -increased for applications where thousands or millions of threads are -created and detached over time. The current management of threads within -pthreads-win32 using structs for pthread_t, and reusing without ever -freeing them, reduces the management time overheads to a constant, which -could be important given that pthreads-win32 threads are built on top of -Win32 threads and will therefore include that management overhead on top -of their own. The cost is that the memory resources used for thread -handles will remain at the peak level until the process exits. - -While it may be inconvenient for developers to be forced away from making -assumptions about the internals of pthread_t, the advantage for the -future development of pthread-win32, as well as those applications that -use it and other pthread implementations, is that the library is free to -change pthread_t internals and management as better methods arise. - diff --git a/software/src/lib/pthread/MAINTAINERS b/software/src/lib/pthread/MAINTAINERS deleted file mode 100644 index d253c1f..0000000 --- a/software/src/lib/pthread/MAINTAINERS +++ /dev/null @@ -1,4 +0,0 @@ -CVS Repository maintainers - -Ross Johnson rpj@ise.canberra.edu.au -Ben Elliston bje@cygnus.com diff --git a/software/src/lib/pthread/NEWS b/software/src/lib/pthread/NEWS deleted file mode 100644 index d1b7896..0000000 --- a/software/src/lib/pthread/NEWS +++ /dev/null @@ -1,1241 +0,0 @@ -RELEASE 2.9.0 -------------- -(2012-05-25) - -General -------- -New bug fixes in this release since 2.8.0 have NOT been applied to the -1.x.x series. - -Some changes post 2011-02-26 in CVS may not be compatible with pre -Windows 2000 systems. - -Use of other than the "C" version of the library is now discouraged. -That is, the "C++" version fails some tests and does not provide any -additional functionality. - -Testing and verification ------------------------- -This version has been tested on SMP architecture (Intel x64 Hex Core) -by completing the included test suite, stress and bench tests. - -New Features ------------- -DLL properties now properly includes the target architecture, i.e. -right-click on the file pthreadVC2.dll in explorer and choose the Detail -tab will show the compiler and architecture in the description field, e.g. -"MS C x64" or "MS C x86". -- Ross Johnson - -(MSC and GNU builds) The statically linked library now automatically -initialises and cleans up on program start/exit, i.e. statically linked -applications need not call the routines pthread_win32_process_attach_np() -and pthread_win32_process_detach_np() explicitly. The per-thread routine -pthread_win32_thread_detach_np() is also called at program exit to cleanup -POSIX resources acquired by the primary Windows native thread, if I (RJ) -understand the process correctly. Other Windows native threads that call -POSIX API routines may need to call the thread detach routine on thread -exit if the application depends on reclaimed POSIX resources or running -POSIX TSD (TLS) destructors. -See README.NONPORTABLE for descriptions of these routines. -- Ramiro Polla - -Robust mutexes are implemented within the PROCESS_PRIVATE scope. NOTE that -pthread_mutex_* functions may return different error codes for robust -mutexes than they otherwise do in normal usage, e.g. pthread_mutex_unlock -is required to check ownership for all mutex types when the mutex is -robust, whereas this does not occur for the "normal" non-robust mutex type. -- Ross Johnson - -pthread_getunique_np is implemented for source level compatibility -with some other implementations. This routine returns a 64 bit -sequence number that is uniquely associated with a thread. It can be -used by applications to order or hash POSIX thread handles. -- Ross Johnson - -Bug fixes ---------- -Many more changes for 64 bit systems. -- Kai Tietz - -Various modifications and fixes to build and test for WinCE. -- Marcel Ruff, Sinan Kaya - -Fix pthread_cond_destroy() - should not be a cancellation point. Other -minor build problems fixed. -- Romano Paolo Tenca - -Remove potential deadlock condition from pthread_cond_destroy(). -- Eric Berge - -Various modifications to build and test for Win64. -- Kip Streithorst - -Various fixes to the QueueUserAPCEx async cancellation helper DLL -(this is a separate download) and pthreads code cleanups. -- Sebastian Gottschalk - -Removed potential NULL pointer reference. -- Robert Kindred - -Removed the requirement that applications restrict the number of threads -calling pthread_barrier_wait to just the barrier count. Also reduced the -contention between barrier_wait and barrier_destroy. This change will have -slowed barriers down slightly but halves the number of semaphores consumed -per barrier to one. -- Ross Johnson - -Fixed a handle leak in sched_[gs]etscheduler. -- Mark Pizzolato - -Removed all of the POSIX re-entrant function compatibility macros from pthread.h. -Some were simply not semanticly correct. -- Igor Lubashev - -Threads no longer attempt to pass uncaught exceptions out of thread scope (C++ -and SEH builds only). Uncaught exceptions now cause the thread to exit with -the return code PTHREAD_CANCELED. -- Ross Johnson - -Lots of casting fixes particularly for x64, Interlocked fixes and reworking -for x64. -- Daniel Richard G., John Kamp - -Other changes -------------- -Dependence on the winsock library is now discretionary via -#define RETAIN_WSALASTERROR in config.h. It is undefined by default unless -WINCE is defined (because RJ is unsure of the dependency there). -- Ramiro Polla - -Several static POSIX mutexes used for internal management were replaced by -MCS queue-based locks to reduce resource consumption, in particular use of Win32 -objects. -- Ross Johnson - -For security, the QuserEx.dll if used must now be installed in the Windows System -folder. -- Ross Johnson - -New tests ---------- -robust[1-5].c - Robust mutexes -sequence1.c - per-thread unique sequence numbers - -Modified tests and benchtests ------------------------------ -All mutex*.c tests wherever appropriate have been modified to also test -robust mutexes under the same conditions. -Added robust mutex benchtests to benchtest*.c wherever appropriate. - - -RELEASE 2.8.0 -------------- -(2006-12-22) - -General -------- -New bug fixes in this release since 2.7.0 have not been applied to the -version 1.x.x series. It is probably time to drop version 1. - -Testing and verification ------------------------- -This release has not yet been tested on SMP architechtures. All tests pass -on a uni-processor system. - -Bug fixes ---------- -Sem_destroy could return EBUSY even though no threads were waiting on the -semaphore. Other races around invalidating semaphore structs (internally) -have been removed as well. - -New tests ---------- -semaphore5.c - tests the bug fix referred to above. - - -RELEASE 2.7.0 -------------- -(2005-06-04) - -General -------- -All new features in this release have been back-ported in release 1.11.0, -including the incorporation of MCS locks in pthread_once, however, versions -1 and 2 remain incompatible even though they are now identical in -performance and functionality. - -Testing and verification ------------------------- -This release has been tested (passed the test suite) on both uni-processor -and multi-processor systems. -- Tim Theisen - -Bug fixes ---------- -Pthread_once has been re-implemented to remove priority boosting and other -complexity to improve robustness. Races for Win32 handles that are not -recycle-unique have been removed. The general form of pthread_once is now -the same as that suggested earlier by Alexander Terekhov, but instead of the -'named mutex', a queue-based lock has been implemented which has the required -properties of dynamic self initialisation and destruction. This lock is also -efficient. The ABI is unaffected in as much as the size of pthread_once_t has -not changed and PTHREAD_ONCE_INIT has not changed, however, applications that -peek inside pthread_once_t, which is supposed to be opaque, will break. -- Vladimir Kliatchko - -New features ------------- -* Support for Mingw cross development tools added to GNUmakefile. -Mingw cross tools allow building the libraries on Linux. -- Mikael Magnusson - - -RELEASE 2.6.0 -------------- -(2005-05-19) - -General -------- -All of the bug fixes and new features in this release have been -back-ported in release 1.10.0. - -Testing and verification ------------------------- -This release has been tested (passed the test suite) on both uni-processor -and multi-processor systems. Thanks to Tim Theisen at TomoTherapy for -exhaustively running the MP tests and for providing crutial observations -and data when faults are detected. - -Bugs fixed ----------- - -* pthread_detach() now reclaims remaining thread resources if called after -the target thread has terminated. Previously, this routine did nothing in -this case. - -New tests ---------- - -* detach1.c - tests that pthread_detach properly invalidates the target -thread, which indicates that the thread resources have been reclaimed. - - -RELEASE 2.5.0 -------------- -(2005-05-09) - -General -------- - -The package now includes a reference documentation set consisting of -HTML formatted Unix-style manual pages that have been edited for -consistency with Pthreads-w32. The set can also be read online at: -http://sources.redhat.com/pthreads-win32/manual/index.html - -Thanks again to Tim Theisen for running the test suite pre-release -on an MP system. - -All of the bug fixes and new features in this release have been -back-ported in release 1.9.0. - -Bugs fixed ----------- - -* Thread Specific Data (TSD) key management has been ammended to -eliminate a source of (what was effectively) resource leakage (a HANDLE -plus memory for each key destruct routine/thread association). This was -not a true leak because these resources were eventually reclaimed when -pthread_key_delete was run AND each thread referencing the key had exited. -The problem was that these two conditions are often not met until very -late, and often not until the process is about to exit. - -The ammended implementation avoids the need for the problematic HANDLE -and reclaims the memory as soon as either the key is deleted OR the -thread exits, whichever is first. - -Thanks to Richard Hughes at Aculab for identifying and locating the leak. - -* TSD key destructors are now processed up to PTHREAD_DESTRUCTOR_ITERATIONS -times instead of just once. PTHREAD_DESTRUCTOR_ITERATIONS has been -defined in pthread.h for some time but not used. - -* Fix a semaphore accounting race between sem_post/sem_post_multiple -and sem_wait cancellation. This is the same issue as with -sem_timedwait that was fixed in the last release. - -* sem_init, sem_post, and sem_post_multiple now check that the -semaphore count never exceeds _POSIX_SEM_VALUE_MAX. - -* Although sigwait() is nothing more than a no-op, it should at least -be a cancellation point to be consistent with the standard. - -New tests ---------- - -* stress1.c - attempts to expose problems in condition variable -and semaphore timed wait logic. This test was inspired by Stephan -Mueller's sample test code used to identify the sem_timedwait bug -from the last release. It's not a part of the regular test suite -because it can take awhile to run. To run it: -nmake clean VC-stress - -* tsd2.c - tests that key destructors are re-run if the tsd key value is -not NULL after the destructor routine has run. Also tests that -pthread_setspecific() and pthread_getspecific() are callable from -destructors. - - -RELEASE 2.4.0 -------------- -(2005-04-26) - -General -------- - -There is now no plan to release a version 3.0.0 to fix problems in -pthread_once(). Other possible implementations of pthread_once -will still be investigated for a possible future release in an attempt -to reduce the current implementation's complexity. - -All of the bug fixes and new features in this release have been -back-ported for release 1.8.0. - -Bugs fixed ----------- - -* Fixed pthread_once race (failures on an MP system). Thanks to -Tim Theisen for running exhaustive pre-release testing on his MP system -using a range of compilers: - VC++ 6 - VC++ 7.1 - Intel C++ version 8.0 -All tests passed. -Some minor speed improvements were also done. - -* Fix integer overrun error in pthread_mutex_timedlock() - missed when -sem_timedwait() was fixed in release 2.2.0. This routine no longer returns -ENOTSUP when NEED_SEM is defined - it is supported (NEED_SEM is only -required for WinCE versions prior to 3.0). - -* Fix timeout bug in sem_timedwait(). -- Thanks to Stephan Mueller for reporting, providing diagnostic output -and test code. - -* Fix several problems in the NEED_SEM conditionally included code. -NEED_SEM included code is provided for systems that don't implement W32 -semaphores, such as WinCE prior to version 3.0. An alternate implementation -of POSIX semaphores is built using W32 events for these systems when -NEED_SEM is defined. This code has been completely rewritten in this -release to reuse most of the default POSIX semaphore code, and particularly, -to implement all of the sem_* routines supported by pthreads-win32. Tim -Theisen also run the test suite over the NEED_SEM code on his MP system. All -tests passed. - -* The library now builds without errors for the Borland Builder 5.5 compiler. - -New features ------------- - -* pthread_mutex_timedlock() and all sem_* routines provided by -pthreads-win32 are now implemented for WinCE versions prior to 3.0. Those -versions did not implement W32 semaphores. Define NEED_SEM in config.h when -building the library for these systems. - -Known issues in this release ----------------------------- - -* pthread_once is too complicated - but it works as far as testing can -determine.. - -* The Borland version of the dll fails some of the tests with a memory read -exception. The cause is not yet known but a compiler bug has not been ruled -out. - - -RELEASE 2.3.0 -------------- -(2005-04-12) - -General -------- - -Release 1.7.0 is a backport of features and bug fixes new in -this release. See earlier notes under Release 2.0.0/General. - -Bugs fixed ----------- - -* Fixed pthread_once potential for post once_routine cancellation -hanging due to starvation. See comments in pthread_once.c. -Momentary priority boosting is used to ensure that, after a -once_routine is cancelled, the thread that will run the -once_routine is not starved by higher priority waiting threads at -critical times. Priority boosting occurs only AFTER a once_routine -cancellation, and is applied only to that once_control. The -once_routine is run at the thread's normal base priority. - -New tests ---------- - -* once4.c: Aggressively tests pthread_once() under realtime -conditions using threads with varying priorities. Windows' -random priority boosting does not occur for threads with realtime -priority levels. - - -RELEASE 2.2.0 -------------- -(2005-04-04) - -General -------- - -* Added makefile targets to build static link versions of the library. -Both MinGW and MSVC. Please note that this does not imply any change -to the LGPL licensing, which still imposes psecific conditions on -distributing software that has been statically linked with this library. - -* There is a known bug in pthread_once(). Cancellation of the init_routine -exposes a potential starvation (i.e. deadlock) problem if a waiting thread -has a higher priority than the initting thread. This problem will be fixed -in version 3.0.0 of the library. - -Bugs fixed ----------- - -* Fix integer overrun error in sem_timedwait(). -Kevin Lussier - -* Fix preprocessor directives for static linking. -Dimitar Panayotov - - -RELEASE 2.1.0 -------------- -(2005-03-16) - -Bugs fixed ----------- - -* Reverse change to pthread_setcancelstate() in 2.0.0. - - -RELEASE 2.0.0 -------------- -(2005-03-16) - -General -------- - -This release represents an ABI change and the DLL version naming has -incremented from 1 to 2, e.g. pthreadVC2.dll. - -Version 1.4.0 back-ports the new functionality included in this -release. Please distribute DLLs built from that version with updates -to applications built on pthreads-win32 version 1.x.x. - -The package naming has changed, replacing the snapshot date with -the version number + descriptive information. E.g. this -release is "pthreads-w32-2-0-0-release". - -Bugs fixed ----------- - -* pthread_setcancelstate() no longer checks for a pending -async cancel event if the library is using alertable async -cancel. See the README file (Prerequisites section) for info -on adding alertable async cancelation. - -New features ------------- - -* pthread_once() now supports init_routine cancellability. - -New tests ---------- - -* Agressively test pthread_once() init_routine cancellability. - - -SNAPSHOT 2005-03-08 -------------------- -Version 1.3.0 - -Bug reports (fixed) -------------------- - -* Implicitly created threads leave Win32 handles behind after exiting. -- Dmitrii Semii - -* pthread_once() starvation problem. -- Gottlob Frege - -New tests ---------- - -* More intense testing of pthread_once(). - - -SNAPSHOT 2005-01-25 -------------------- -Version 1.2.0 - -Bug fixes ---------- - -* Attempted acquisition of a recursive mutex could cause waiting threads -to not be woken when the mutex was released. -- Ralf Kubis - -* Various package omissions have been fixed. - - -SNAPSHOT 2005-01-03 -------------------- -Version 1.1.0 - -Bug fixes ---------- - -* Unlocking recursive or errorcheck mutexes would sometimes -unexpectedly return an EPERM error (bug introduced in -snapshot-2004-11-03). -- Konstantin Voronkov - - -SNAPSHOT 2004-11-22 -------------------- -Version 1.0.0 - -This snapshot primarily fixes the condvar bug introduced in -snapshot-2004-11-03. DLL versioning has also been included to allow -applications to runtime check the Microsoft compatible DLL version -information, and to extend the DLL naming system for ABI and major -(non-backward compatible) API changes. See the README file for details. - -Bug fixes ---------- - -* Condition variables no longer deadlock (bug introduced in -snapshot-2004-11-03). -- Alexander Kotliarov and Nicolas at saintmac - -* DLL naming extended to avoid 'DLL hell' in the future, and to -accommodate the ABI change introduced in snapshot-2004-11-03. Snapshot -2004-11-03 will be removed from FTP sites. - -New features ------------- - -* A Microsoft-style version resource has been added to the DLL for -applications that wish to check DLL compatibility at runtime. - -* Pthreads-win32 DLL naming has been extended to allow incompatible DLL -versions to co-exist in the same filesystem. See the README file for details, -but briefly: while the version information inside the DLL will change with -each release from now on, the DLL version names will only change if the new -DLL is not backward compatible with older applications. - -The versioning scheme has been borrowed from GNU Libtool, and the DLL -naming scheme is from Cygwin. Provided the Libtool-style numbering rules are -honoured, the Cygwin DLL naming scheme automatcally ensures that DLL name -changes are minimal and that applications will not load an incompatible -pthreads-win32 DLL. - -Those who use the pre-built DLLs will find that the DLL/LIB names have a new -suffix (1) in this snapshot. E.g. pthreadVC1.dll etc. - -* The POSIX thread ID reuse uniqueness feature introduced in the last snapshot -has been kept as default, but the behaviour can now be controlled when the DLL -is built to effectively switch it off. This makes the library much more -sensitive to applications that assume that POSIX thread IDs are unique, i.e. -are not strictly compliant with POSIX. See the PTW32_THREAD_ID_REUSE_INCREMENT -macro comments in config.h for details. - -Other changes -------------- -Certain POSIX macros have changed. - -These changes are intended to conform to the Single Unix Specification version 3, -which states that, if set to 0 (zero) or not defined, then applications may use -sysconf() to determine their values at runtime. Pthreads-win32 does not -implement sysconf(). - -The following macros are no longer undefined, but defined and set to -1 -(not implemented): - - _POSIX_THREAD_ATTR_STACKADDR - _POSIX_THREAD_PRIO_INHERIT - _POSIX_THREAD_PRIO_PROTECT - _POSIX_THREAD_PROCESS_SHARED - -The following macros are defined and set to 200112L (implemented): - - _POSIX_THREADS - _POSIX_THREAD_SAFE_FUNCTIONS - _POSIX_THREAD_ATTR_STACKSIZE - _POSIX_THREAD_PRIORITY_SCHEDULING - _POSIX_SEMAPHORES - _POSIX_READER_WRITER_LOCKS - _POSIX_SPIN_LOCKS - _POSIX_BARRIERS - -The following macros are defined and set to appropriate values: - - _POSIX_THREAD_THREADS_MAX - _POSIX_SEM_VALUE_MAX - _POSIX_SEM_NSEMS_MAX - PTHREAD_DESTRUCTOR_ITERATIONS - PTHREAD_KEYS_MAX - PTHREAD_STACK_MIN - PTHREAD_THREADS_MAX - - -SNAPSHOT 2004-11-03 -------------------- - -DLLs produced from this snapshot cannot be used with older applications without -recompiling the application, due to a change to pthread_t to provide unique POSIX -thread IDs. - -Although this snapshot passes the extended test suite, many of the changes are -fairly major, and some applications may show different behaviour than previously, -so adopt with care. Hopefully, any changed behaviour will be due to the library -being better at it's job, not worse. - -Bug fixes ---------- - -* pthread_create() no longer accepts NULL as the thread reference arg. -A segfault (memory access fault) will result, and no thread will be -created. - -* pthread_barrier_wait() no longer acts as a cancelation point. - -* Fix potential race condition in pthread_once() -- Tristan Savatier - -* Changes to pthread_cond_destroy() exposed some coding weaknesses in several -test suite mini-apps because pthread_cond_destroy() now returns EBUSY if the CV -is still in use. - -New features ------------- - -* Added for compatibility: -PTHREAD_RECURSIVE_MUTEX_INITIALIZER, -PTHREAD_ERRORCHECK_MUTEX_INITIALIZER, -PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, -PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP - -* Initial support for Digital Mars compiler -- Anuj Goyal - -* Faster Mutexes. These have been been rewritten following a model provided by -Alexander Terekhov that reduces kernel space checks, and eliminates some additional -critical sections used to manage a race between timedlock expiration and unlock. -Please be aware that the new mutexes do not enforce strict absolute FIFO scheduling -of mutexes, however any out-of-order lock acquisition should be very rare. - -* Faster semaphores. Following a similar model to mutexes above, these have been -rewritten to use preliminary users space checks. - -* sem_getvalue() now returns the number of waiters. - -* The POSIX thread ID now has much stronger uniqueness characteristics. The library -garrantees not to reuse the same thread ID for at least 2^(wordsize) thread -destruction/creation cycles. - -New tests ---------- - -* semaphore4.c: Tests cancelation of the new sem_wait(). - -* semaphore4t.c: Likewise for sem_timedwait(). - -* rwlock8.c: Tests and times the slow execution paths of r/w locks, and the CVs, -mutexes, and semaphores that they're built on. - - -SNAPSHOT 2004-05-16 -------------------- - -Attempt to add Watcom to the list of compilers that can build the library. -This failed in the end due to it's non-thread-aware errno. The library -builds but the test suite fails. See README.Watcom for more details. - -Bug fixes ---------- -* Bug and memory leak in sem_init() -- Alex Blanco - -* ptw32_getprocessors() now returns CPU count of 1 for WinCE. -- James Ewing - -* pthread_cond_wait() could be canceled at a point where it should not -be cancelable. Fixed. -- Alexander Terekhov - -* sem_timedwait() had an incorrect timeout calculation. -- Philippe Di Cristo - -* Fix a memory leak left behind after threads are destroyed. -- P. van Bruggen - -New features ------------- -* Ported to AMD64. -- Makoto Kato - -* True pre-emptive asynchronous cancelation of threads. This is optional -and requires that Panagiotis E. Hadjidoukas's QueueUserAPCEx package be -installed. This package is included in the pthreads-win32 self-unpacking -Zip archive starting from this snapshot. See the README.txt file inside -the package for installation details. - -Note: If you don't use async cancelation in your application, or don't need -to cancel threads that are blocked on system resources such as network I/O, -then the default non-preemptive async cancelation is probably good enough. -However, pthreads-win32 auto-detects the availability of these components -at run-time, so you don't need to rebuild the library from source if you -change your mind later. - -All of the advice available in books and elsewhere on the undesirability -of using async cancelation in any application still stands, but this -feature is a welcome addition with respect to the library's conformance to -the POSIX standard. - -SNAPSHOT 2003-09-18 -------------------- - -Cleanup of thread priority management. In particular, setting of thread -priority now attempts to map invalid Win32 values within the range returned -by sched_get_priority_min/max() to useful values. See README.NONPORTABLE -under "Thread priority". - -Bug fixes ---------- -* pthread_getschedparam() now returns the priority given by the most recent -call to pthread_setschedparam() or established by pthread_create(), as -required by the standard. Previously, pthread_getschedparam() incorrectly -returned the running thread priority at the time of the call, which may have -been adjusted or temporarily promoted/demoted. - -* sched_get_priority_min() and sched_get_priority_max() now return -1 on error -and set errno. Previously, they incorrectly returned the error value directly. - - -SNAPSHOT 2003-09-04 -------------------- - -Bug fixes ---------- -* ptw32_cancelableWait() now allows cancelation of waiting implicit POSIX -threads. - -New test --------- -* cancel8.c tests cancelation of Win32 threads waiting at a POSIX cancelation -point. - - -SNAPSHOT 2003-09-03 -------------------- - -Bug fixes ---------- -* pthread_self() would free the newly created implicit POSIX thread handle if -DuplicateHandle failed instead of recycle it (very unlikely). - -* pthread_exit() was neither freeing nor recycling the POSIX thread struct -for implicit POSIX threads. - -New feature - Cancelation of/by Win32 (non-POSIX) threads ---------------------------------------------------------- -Since John Bossom's original implementation, the library has allowed non-POSIX -initialised threads (Win32 threads) to call pthreads-win32 routines and -therefore interact with POSIX threads. This is done by creating an on-the-fly -POSIX thread ID for the Win32 thread that, once created, allows fully -reciprical interaction. This did not extend to thread cancelation (async or -deferred). Now it does. - -Any thread can be canceled by any other thread (Win32 or POSIX) if the former -thread's POSIX pthread_t value is known. It's TSD destructors and POSIX -cleanup handlers will be run before the thread exits with an exit code of -PTHREAD_CANCELED (retrieved with GetExitCodeThread()). - -This allows a Win32 thread to, for example, call POSIX CV routines in the same way -that POSIX threads would/should, with pthread_cond_wait() cancelability and -cleanup handlers (pthread_cond_wait() is a POSIX cancelation point). - -By adding cancelation, Win32 threads should now be able to call all POSIX -threads routines that make sense including semaphores, mutexes, condition -variables, read/write locks, barriers, spinlocks, tsd, cleanup push/pop, -cancelation, pthread_exit, scheduling, etc. - -Note that these on-the-fly 'implicit' POSIX thread IDs are initialised as detached -(not joinable) with deferred cancelation type. The POSIX thread ID will be created -automatically by any POSIX routines that need a POSIX handle (unless the routine -needs a pthread_t as a parameter of course). A Win32 thread can discover it's own -POSIX thread ID by calling pthread_self(), which will create the handle if -necessary and return the pthread_t value. - -New tests ---------- -Test the above new feature. - - -SNAPSHOT 2003-08-19 -------------------- - -This snapshot fixes some accidental corruption to new test case sources. -There are no changes to the library source code. - - -SNAPSHOT 2003-08-15 -------------------- - -Bug fixes ---------- - -* pthread.dsp now uses correct compile flags (/MD). -- Viv - -* pthread_win32_process_detach_np() fixed memory leak. -- Steven Reddie - -* pthread_mutex_destroy() fixed incorrect return code. -- Nicolas Barry - -* pthread_spin_destroy() fixed memory leak. -- Piet van Bruggen - -* Various changes to tighten arg checking, and to work with later versions of -MinGW32 and MsysDTK. - -* pthread_getschedparam() etc, fixed dangerous thread validity checking. -- Nicolas Barry - -* POSIX thread handles are now reused and their memory is not freed on thread exit. -This allows for stronger thread validity checking. - -New standard routine --------------------- - -* pthread_kill() added to provide thread validity checking to applications. -It does not accept any non zero values for the signal arg. - -New test cases --------------- - -* New test cases to confirm validity checking, pthread_kill(), and thread reuse. - - -SNAPSHOT 2003-05-10 -------------------- - -Bug fixes ---------- - -* pthread_mutex_trylock() now returns correct error values. -pthread_mutex_destroy() will no longer destroy a recursively locked mutex. -pthread_mutex_lock() is no longer inadvertantly behaving as a cancelation point. -- Thomas Pfaff - -* pthread_mutex_timedlock() no longer occasionally sets incorrect mutex -ownership, causing deadlocks in some applications. -- Robert Strycek and Alexander Terekhov - - -SNAPSHOT 2002-11-04 -------------------- - -Bug fixes ---------- - -* sem_getvalue() now returns the correct value under Win NT and WinCE. -- Rob Fanner - -* sem_timedwait() now uses tighter checks for unreasonable -abstime values - that would result in unexpected timeout values. - -* ptw32_cond_wait_cleanup() no longer mysteriously consumes -CV signals but may produce more spurious wakeups. It is believed -that the sem_timedwait() call is consuming a CV signal that it -shouldn't. -- Alexander Terekhov - -* Fixed a memory leak in ptw32_threadDestroy() for implicit threads. - -* Fixed potential for deadlock in pthread_cond_destroy(). -A deadlock could occur for statically declared CVs (PTHREAD_COND_INITIALIZER), -when one thread is attempting to destroy the condition variable while another -is attempting to dynamically initialize it. -- Michael Johnson - - -SNAPSHOT 2002-03-02 -------------------- - -Cleanup code default style. (IMPORTANT) ----------------------------------------------------------------------- -Previously, if not defined, the cleanup style was determined automatically -from the compiler/language, and one of the following was defined accordingly: - - __CLEANUP_SEH MSVC only - __CLEANUP_CXX C++, including MSVC++, GNU G++ - __CLEANUP_C C, including GNU GCC, not MSVC - -These defines determine the style of cleanup (see pthread.h) and, -most importantly, the way that cancelation and thread exit (via -pthread_exit) is performed (see the routine ptw32_throw() in private.c). - -In short, the exceptions versions of the library throw an exception -when a thread is canceled or exits (via pthread_exit()), which is -caught by a handler in the thread startup routine, so that the -the correct stack unwinding occurs regardless of where the thread -is when it's canceled or exits via pthread_exit(). - -In this and future snapshots, unless the build explicitly defines (e.g. -via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then -the build NOW always defaults to __CLEANUP_C style cleanup. This style -uses setjmp/longjmp in the cancelation and pthread_exit implementations, -and therefore won't do stack unwinding even when linked to applications -that have it (e.g. C++ apps). This is for consistency with most -current commercial Unix POSIX threads implementations. Compaq's TRU64 -may be an exception (no pun intended) and possible future trend. - -Although it was not clearly documented before, it is still necessary to -build your application using the same __CLEANUP_* define as was -used for the version of the library that you link with, so that the -correct parts of pthread.h are included. That is, the possible -defines require the following library versions: - - __CLEANUP_SEH pthreadVSE.dll - __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll - __CLEANUP_C pthreadVC.dll or pthreadGC.dll - -E.g. regardless of whether your app is C or C++, if you link with -pthreadVC.lib or libpthreadGC.a, then you must define __CLEANUP_C. - - -THE POINT OF ALL THIS IS: if you have not been defining one of these -explicitly, then the defaults as described at the top of this -section were being used. - -THIS NOW CHANGES, as has been explained above, but to try to make this -clearer here's an example: - -If you were building your application with MSVC++ i.e. using C++ -exceptions and not explicitly defining one of __CLEANUP_*, then -__CLEANUP_C++ was automatically defined for you in pthread.h. -You should have been linking with pthreadVCE.dll, which does -stack unwinding. - -If you now build your application as you had before, pthread.h will now -automatically set __CLEANUP_C as the default style, and you will need to -link with pthreadVC.dll. Stack unwinding will now NOT occur when a thread -is canceled, or the thread calls pthread_exit(). - -Your application will now most likely behave differently to previous -versions, and in non-obvious ways. Most likely is that locally -instantiated objects may not be destroyed or cleaned up after a thread -is canceled. - -If you want the same behaviour as before, then you must now define -__CLEANUP_C++ explicitly using a compiler option and link with -pthreadVCE.dll as you did before. - - -WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY? -Because no commercial Unix POSIX threads implementation allows you to -choose to have stack unwinding. Therefore, providing it in pthread-win32 -as a default is dangerous. We still provide the choice but unless -you consciously choose to do otherwise, your pthreads applications will -now run or crash in similar ways irrespective of the threads platform -you use. Or at least this is the hope. - - -WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER? -There are a few reasons: -- because there are well respected POSIX threads people who believe - that POSIX threads implementations should be exceptions aware and - do the expected thing in that context. (There are equally respected - people who believe it should not be easily accessible, if it's there - at all, for unconditional conformity to other implementations.) -- because pthreads-win32 is one of the few implementations that has - the choice, perhaps the only freely available one, and so offers - a laboratory to people who may want to explore the effects; -- although the code will always be around somewhere for anyone who - wants it, once it's removed from the current version it will not be - nearly as visible to people who may have a use for it. - - -Source module splitting ------------------------ -In order to enable smaller image sizes to be generated -for applications that link statically with the library, -most routines have been separated out into individual -source code files. - -This is being done in such a way as to be backward compatible. -The old source files are reused to congregate the individual -routine files into larger translation units (via a bunch of -# includes) so that the compiler can still optimise wherever -possible, e.g. through inlining, which can only be done -within the same translation unit. - -It is also possible to build the entire library by compiling -the single file named "pthread.c", which just #includes all -the secondary congregation source files. The compiler -may be able to use this to do more inlining of routines. - -Although the GNU compiler is able to produce libraries with -the necessary separation (the -ffunction-segments switch), -AFAIK, the MSVC and other compilers don't have this feature. - -Finally, since I use makefiles and command-line compilation, -I don't know what havoc this reorganisation may wreak amongst -IDE project file users. You should be able to continue -using your existing project files without modification. - - -New non-portable functions --------------------------- -pthread_num_processors_np(): - Returns the number of processors in the system that are - available to the process, as determined from the processor - affinity mask. - -pthread_timechange_handler_np(): - To improve tolerance against operator or time service initiated - system clock changes. - - This routine can be called by an application when it - receives a WM_TIMECHANGE message from the system. At present - it broadcasts all condition variables so that waiting threads - can wake up and re-evaluate their conditions and restart - their timed waits if required. - - Suggested by Alexander Terekhov - - -Platform dependence -------------------- -As Win95 doesn't provide one, the library now contains -it's own InterlockedCompareExchange() routine, which is used -whenever Windows doesn't provide it. InterlockedCompareExchange() -is used to implement spinlocks and barriers, and also in mutexes. -This routine relies on the CMPXCHG machine instruction which -is not available on i386 CPUs. This library (from snapshot -20010712 onwards) is therefore no longer supported on i386 -processor platforms. - - -New standard routines ---------------------- -For source code portability only - rwlocks cannot be process shared yet. - - pthread_rwlockattr_init() - pthread_rwlockattr_destroy() - pthread_rwlockattr_setpshared() - pthread_rwlockattr_getpshared() - -As defined in the new POSIX standard, and the Single Unix Spec version 3: - - sem_timedwait() - pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff - pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock() - pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock() - - -pthread.h no longer includes windows.h --------------------------------------- -[Not yet for G++] - -This was done to prevent conflicts. - -HANDLE, DWORD, and NULL are temporarily defined within pthread.h if -they are not already. - - -pthread.h, sched.h and semaphore.h now use dllexport/dllimport --------------------------------------------------------------- -Not only to avoid the need for the pthread.def file, but to -improve performance. Apparently, declaring functions with dllimport -generates a direct call to the function and avoids the overhead -of a stub function call. - -Bug fixes ---------- -* Fixed potential NULL pointer dereferences in pthread_mutexattr_init, -pthread_mutexattr_getpshared, pthread_barrierattr_init, -pthread_barrierattr_getpshared, and pthread_condattr_getpshared. -- Scott McCaskill - -* Removed potential race condition in pthread_mutex_trylock and -pthread_mutex_lock; -- Alexander Terekhov - -* The behaviour of pthread_mutex_trylock in relation to -recursive mutexes was inconsistent with commercial implementations. -Trylock would return EBUSY if the lock was owned already by the -calling thread regardless of mutex type. Trylock now increments the -recursion count and returns 0 for RECURSIVE mutexes, and will -return EDEADLK rather than EBUSY for ERRORCHECK mutexes. This is -consistent with Solaris. -- Thomas Pfaff - -* Found a fix for the library and workaround for applications for -the known bug #2, i.e. where __CLEANUP_CXX or __CLEANUP_SEH is defined. -See the "Known Bugs in this snapshot" section below. - -This could be made transparent to applications by replacing the macros that -define the current C++ and SEH versions of pthread_cleanup_push/pop -with the C version, but AFAIK cleanup handlers would not then run in the -correct sequence with destructors and exception cleanup handlers when -an exception occurs. - -* Cancelation once started in a thread cannot now be inadvertantly -double canceled. That is, once a thread begins it's cancelation run, -cancelation is disabled and a subsequent cancel request will -return an error (ESRCH). - -* errno: An incorrect compiler directive caused a local version -of errno to be used instead of the Win32 errno. Both instances are -thread-safe but applications checking errno after a pthreads-win32 -call would be wrong. Fixing this also fixed a bad compiler -option in the testsuite (/MT should have been /MD) which is -needed to link with the correct library MSVCRT.LIB. - - -SNAPSHOT 2001-07-12 -------------------- - -To be added - - -SNAPSHOT 2001-07-03 -------------------- - -To be added - - -SNAPSHOT 2000-08-13 -------------------- - -New: -- Renamed DLL and LIB files: - pthreadVSE.dll (MS VC++/Structured EH) - pthreadVSE.lib - pthreadVCE.dll (MS VC++/C++ EH) - pthreadVCE.lib - pthreadGCE.dll (GNU G++/C++ EH) - libpthreadw32.a - - Both your application and the pthread dll should use the - same exception handling scheme. - -Bugs fixed: -- MSVC++ C++ exception handling. - -Some new tests have been added. - - -SNAPSHOT 2000-08-10 -------------------- - -New: -- asynchronous cancelation on X86 (Jason Nye) -- Makefile compatible with MS nmake to replace - buildlib.bat -- GNUmakefile for Mingw32 -- tests/Makefile for MS nmake replaces runall.bat -- tests/GNUmakefile for Mingw32 - -Bugs fixed: -- kernel32 load/free problem -- attempt to hide internel exceptions from application - exception handlers (__try/__except and try/catch blocks) -- Win32 thread handle leakage bug - (David Baggett/Paul Redondo/Eyal Lebedinsky) - -Some new tests have been added. - - -SNAPSHOT 1999-11-02 -------------------- - -Bugs fixed: -- ctime_r macro had an incorrect argument (Erik Hensema), -- threads were not being created - PTHREAD_CANCEL_DEFERRED. This should have - had little effect as deferred is the only - supported type. (Ross Johnson). - -Some compatibility improvements added, eg. -- pthread_setcancelstate accepts NULL pointer - for the previous value argument. Ditto for - pthread_setcanceltype. This is compatible - with Solaris but should not affect - standard applications (Erik Hensema) - -Some new tests have been added. - - -SNAPSHOT 1999-10-17 -------------------- - -Bug fix - Cancelation of threads waiting on condition variables -now works properly (Lorin Hochstein and Peter Slacik) - - -SNAPSHOT 1999-08-12 -------------------- - -Fixed exception stack cleanup if calling pthread_exit() -- (Lorin Hochstein and John Bossom). - -Fixed bugs in condition variables - (Peter Slacik): - - additional contention checks - - properly adjust number of waiting threads after timed - condvar timeout. - - -SNAPSHOT 1999-05-30 -------------------- - -Some minor bugs have been fixed. See the ChangeLog file for details. - -Some more POSIX 1b functions are now included but ony return an -error (ENOSYS) if called. They are: - - sem_open - sem_close - sem_unlink - sem_getvalue - - -SNAPSHOT 1999-04-07 -------------------- - -Some POSIX 1b functions which were internally supported are now -available as exported functions: - - sem_init - sem_destroy - sem_wait - sem_trywait - sem_post - sched_yield - sched_get_priority_min - sched_get_priority_max - -Some minor bugs have been fixed. See the ChangeLog file for details. - - -SNAPSHOT 1999-03-16 -------------------- - -Initial release. - diff --git a/software/src/lib/pthread/PROGRESS b/software/src/lib/pthread/PROGRESS deleted file mode 100644 index 9abf0bc..0000000 --- a/software/src/lib/pthread/PROGRESS +++ /dev/null @@ -1,4 +0,0 @@ -Please see the ANNOUNCE file "Level of Standards Conformance" -or the web page: - -http://sources.redhat.com/pthreads-win32/conformance.html diff --git a/software/src/lib/pthread/README b/software/src/lib/pthread/README deleted file mode 100644 index 545360b..0000000 --- a/software/src/lib/pthread/README +++ /dev/null @@ -1,601 +0,0 @@ -PTHREADS-WIN32 -============== - -Pthreads-win32 is free software, distributed under the GNU Lesser -General Public License (LGPL). See the file 'COPYING.LIB' for terms -and conditions. Also see the file 'COPYING' for information -specific to pthreads-win32, copyrights and the LGPL. - - -What is it? ------------ - -Pthreads-win32 is an Open Source Software implementation of the -Threads component of the POSIX 1003.1c 1995 Standard (or later) -for Microsoft's Win32 environment. Some functions from POSIX -1003.1b are also supported including semaphores. Other related -functions include the set of read-write lock functions. The -library also supports some of the functionality of the Open -Group's Single Unix specification, version 2, namely mutex types, -plus some common and pthreads-win32 specific non-portable -routines (see README.NONPORTABLE). - -See the file "ANNOUNCE" for more information including standards -conformance details and the list of supported and unsupported -routines. - - -Prerequisites -------------- -MSVC or GNU C (MinGW32 MSys development kit) - To build from source. - -QueueUserAPCEx by Panagiotis E. Hadjidoukas - To support any thread cancelation in C++ library builds or - to support cancelation of blocked threads in any build. - This library is not required otherwise. - - For true async cancelation of threads (including blocked threads). - This is a DLL and Windows driver that provides pre-emptive APC - by forcing threads into an alertable state when the APC is queued. - Both the DLL and driver are provided with the pthreads-win32.exe - self-unpacking ZIP, and on the pthreads-win32 FTP site (in source - and pre-built forms). Currently this is a separate LGPL package to - pthreads-win32. See the README in the QueueUserAPCEx folder for - installation instructions. - - Pthreads-win32 will automatically detect if the QueueUserAPCEx DLL - QuserEx.DLL is available and whether the driver AlertDrv.sys is - loaded. If it is not available, pthreads-win32 will simulate async - cancelation, which means that it can async cancel only threads that - are runnable. The simulated async cancellation cannot cancel blocked - threads. - - [FOR SECURITY] To be found Quserex.dll MUST be installed in the - Windows System Folder. This is not an unreasonable constraint given a - driver must also be installed and loaded at system startup. - - -Library naming --------------- - -Because the library is being built using various exception -handling schemes and compilers - and because the library -may not work reliably if these are mixed in an application, -each different version of the library has it's own name. - -Note 1: the incompatibility is really between EH implementations -of the different compilers. It should be possible to use the -standard C version from either compiler with C++ applications -built with a different compiler. If you use an EH version of -the library, then you must use the same compiler for the -application. This is another complication and dependency that -can be avoided by using only the standard C library version. - -Note 2: if you use a standard C pthread*.dll with a C++ -application, then any functions that you define that are -intended to be called via pthread_cleanup_push() must be -__cdecl. - -Note 3: the intention was to also name either the VC or GC -version (it should be arbitrary) as pthread.dll, including -pthread.lib and libpthread.a as appropriate. This is no longer -likely to happen. - -Note 4: the compatibility number was added so that applications -can differentiate between binary incompatible versions of the -libs and dlls. - -In general: - pthread[VG]{SE,CE,C}[c].dll - pthread[VG]{SE,CE,C}[c].lib - -where: - [VG] indicates the compiler - V - MS VC, or - G - GNU C - - {SE,CE,C} indicates the exception handling scheme - SE - Structured EH, or - CE - C++ EH, or - C - no exceptions - uses setjmp/longjmp - - c - DLL compatibility number indicating ABI and API - compatibility with applications built against - a snapshot with the same compatibility number. - See 'Version numbering' below. - -The name may also be suffixed by a 'd' to indicate a debugging version -of the library. E.g. pthreadVC2d.lib. Debugging versions contain -additional information for debugging (symbols etc) and are often not -optimised in any way (compiled with optimisation turned off). - -Examples: - pthreadVSE.dll (MSVC/SEH) - pthreadGCE.dll (GNUC/C++ EH) - pthreadGC.dll (GNUC/not dependent on exceptions) - pthreadVC1.dll (MSVC/not dependent on exceptions - not binary - compatible with pthreadVC.dll) - pthreadVC2.dll (MSVC/not dependent on exceptions - not binary - compatible with pthreadVC1.dll or pthreadVC.dll) - -The GNU library archive file names have correspondingly changed to: - - libpthreadGCEc.a - libpthreadGCc.a - - -Versioning numbering --------------------- - -Version numbering is separate from the snapshot dating system, and -is the canonical version identification system embedded within the -DLL using the Microsoft version resource system. The versioning -system chosen follows the GNU Libtool system. See -http://www.gnu.org/software/libtool/manual.html section 6.2. - -See the resource file 'version.rc'. - -Microsoft version numbers use 4 integers: - - 0.0.0.0 - -Pthreads-win32 uses the first 3 following the Libtool convention. -The fourth is commonly used for the build number, but will be reserved -for future use. - - current.revision.age.0 - -The numbers are changed as follows: - -1. If the library source code has changed at all since the last update, - then increment revision (`c:r:a' becomes `c:r+1:a'). -2. If any interfaces have been added, removed, or changed since the last - update, increment current, and set revision to 0. -3. If any interfaces have been added since the last public release, then - increment age. -4. If any interfaces have been removed or changed since the last public - release, then set age to 0. - - -DLL compatibility numbering is an attempt to ensure that applications -always load a compatible pthreads-win32 DLL by using a DLL naming system -that is consistent with the version numbering system. It also allows -older and newer DLLs to coexist in the same filesystem so that older -applications can continue to be used. For pre .NET Windows systems, -this inevitably requires incompatible versions of the same DLLs to have -different names. - -Pthreads-win32 has adopted the Cygwin convention of appending a single -integer number to the DLL name. The number used is based on the library -version number and is computed as 'current' - 'age'. - -(See http://home.att.net/~perlspinr/libversioning.html for a nicely -detailed explanation.) - -Using this method, DLL name/s will only change when the DLL's -backwards compatibility changes. Note that the addition of new -'interfaces' will not of itself change the DLL's compatibility for older -applications. - - -Which of the several dll versions to use? ------------------------------------------ -or, ---- -What are all these pthread*.dll and pthread*.lib files? -------------------------------------------------------- - -Simple, use either pthreadGCv.* if you use GCC, or pthreadVCv.* if you -use MSVC - where 'v' is the DLL versioning (compatibility) number. - -Otherwise, you need to choose carefully and know WHY. - -The most important choice you need to make is whether to use a -version that uses exceptions internally, or not. There are versions -of the library that use exceptions as part of the thread -cancelation and exit implementation. The default version uses -setjmp/longjmp. - -There is some contension amongst POSIX threads experts as -to how POSIX threads cancelation and exit should work -with languages that use exceptions, e.g. C++ and even C -(Microsoft's Structured Exceptions). - -The issue is: should cancelation of a thread in, say, -a C++ application cause object destructors and C++ exception -handlers to be invoked as the stack unwinds during thread -exit, or not? - -There seems to be more opinion in favour of using the -standard C version of the library (no EH) with C++ applications -for the reason that this appears to be the assumption commercial -pthreads implementations make. Therefore, if you use an EH version -of pthreads-win32 then you may be under the illusion that -your application will be portable, when in fact it is likely to -behave differently when linked with other pthreads libraries. - -Now you may be asking: then why have you kept the EH versions of -the library? - -There are a couple of reasons: -- there is division amongst the experts and so the code may - be needed in the future. Yes, it's in the repository and we - can get it out anytime in the future, but it would be difficult - to find. -- pthreads-win32 is one of the few implementations, and possibly - the only freely available one, that has EH versions. It may be - useful to people who want to play with or study application - behaviour under these conditions. - -Notes: - -[If you use either pthreadVCE or pthreadGCE] - -1. [See also the discussion in the FAQ file - Q2, Q4, and Q5] - -If your application contains catch(...) blocks in your POSIX -threads then you will need to replace the "catch(...)" with the macro -"PtW32Catch", eg. - - #ifdef PtW32Catch - PtW32Catch { - ... - } - #else - catch(...) { - ... - } - #endif - -Otherwise neither pthreads cancelation nor pthread_exit() will work -reliably when using versions of the library that use C++ exceptions -for cancelation and thread exit. - -This is due to what is believed to be a C++ compliance error in VC++ -whereby you may not have multiple handlers for the same exception in -the same try/catch block. GNU G++ doesn't have this restriction. - - -Other name changes ------------------- - -All snapshots prior to and including snapshot 2000-08-13 -used "_pthread_" as the prefix to library internal -functions, and "_PTHREAD_" to many library internal -macros. These have now been changed to "ptw32_" and "PTW32_" -respectively so as to not conflict with the ANSI standard's -reservation of identifiers beginning with "_" and "__" for -use by compiler implementations only. - -If you have written any applications and you are linking -statically with the pthreads-win32 library then you may have -included a call to _pthread_processInitialize. You will -now have to change that to ptw32_processInitialize. - - -Cleanup code default style --------------------------- - -Previously, if not defined, the cleanup style was determined automatically -from the compiler used, and one of the following was defined accordingly: - - __CLEANUP_SEH MSVC only - __CLEANUP_CXX C++, including MSVC++, GNU G++ - __CLEANUP_C C, including GNU GCC, not MSVC - -These defines determine the style of cleanup (see pthread.h) and, -most importantly, the way that cancelation and thread exit (via -pthread_exit) is performed (see the routine ptw32_throw()). - -In short, the exceptions versions of the library throw an exception -when a thread is canceled, or exits via pthread_exit(). This exception is -caught by a handler in the thread startup routine, so that the -the correct stack unwinding occurs regardless of where the thread -is when it's canceled or exits via pthread_exit(). - -In this snapshot, unless the build explicitly defines (e.g. via a -compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then -the build NOW always defaults to __CLEANUP_C style cleanup. This style -uses setjmp/longjmp in the cancelation and pthread_exit implementations, -and therefore won't do stack unwinding even when linked to applications -that have it (e.g. C++ apps). This is for consistency with most/all -commercial Unix POSIX threads implementations. - -Although it was not clearly documented before, it is still necessary to -build your application using the same __CLEANUP_* define as was -used for the version of the library that you link with, so that the -correct parts of pthread.h are included. That is, the possible -defines require the following library versions: - - __CLEANUP_SEH pthreadVSE.dll - __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll - __CLEANUP_C pthreadVC.dll or pthreadGC.dll - -It is recommended that you let pthread.h use it's default __CLEANUP_C -for both library and application builds. That is, don't define any of -the above, and then link with pthreadVC.lib (MSVC or MSVC++) and -libpthreadGC.a (MinGW GCC or G++). The reason is explained below, but -another reason is that the prebuilt pthreadVCE.dll is currently broken. -Versions built with MSVC++ later than version 6 may not be broken, but I -can't verify this yet. - -WHY ARE WE MAKING THE DEFAULT STYLE LESS EXCEPTION-FRIENDLY? -Because no commercial Unix POSIX threads implementation allows you to -choose to have stack unwinding. Therefore, providing it in pthread-win32 -as a default is dangerous. We still provide the choice but unless -you consciously choose to do otherwise, your pthreads applications will -now run or crash in similar ways irrespective of the pthreads platform -you use. Or at least this is the hope. - - -Building under VC++ using C++ EH, Structured EH, or just C ----------------------------------------------------------- - -From the source directory run nmake without any arguments to list -help information. E.g. - -$ nmake - -Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 -Copyright (C) Microsoft Corp 1988-1998. All rights reserved. - -Run one of the following command lines: -nmake clean VCE (to build the MSVC dll with C++ exception handling) -nmake clean VSE (to build the MSVC dll with structured exception handling) -nmake clean VC (to build the MSVC dll with C cleanup code) -nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) -nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) -nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) -nmake clean VC-static (to build the MSVC static lib with C cleanup code) -nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) -nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) -nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) -nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) -nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) -nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) -nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) - - -The pre-built dlls are normally built using the *-inlined targets. - -You can run the testsuite by changing to the "tests" directory and -running nmake. E.g.: - -$ cd tests -$ nmake - -Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 -Copyright (C) Microsoft Corp 1988-1998. All rights reserved. - -Run one of the following command lines: -nmake clean VC (to test using VC dll with VC (no EH) applications) -nmake clean VCX (to test using VC dll with VC++ (EH) applications) -nmake clean VCE (to test using the VCE dll with VC++ EH applications) -nmake clean VSE (to test using VSE dll with VC (SEH) applications) -nmake clean VC-bench (to benchtest using VC dll with C bench app) -nmake clean VCX-bench (to benchtest using VC dll with C++ bench app) -nmake clean VCE-bench (to benchtest using VCE dll with C++ bench app) -nmake clean VSE-bench (to benchtest using VSE dll with SEH bench app) -nmake clean VC-static (to test using VC static lib with VC (no EH) applications) - - -Building under Mingw32 ----------------------- - -The dll can be built easily with recent versions of Mingw32. -(The distributed versions are built using Mingw32 and MsysDTK -from www.mingw32.org.) - -From the source directory, run make for help information. E.g.: - -$ make -Run one of the following command lines: -make clean GC (to build the GNU C dll with C cleanup code) -make clean GCE (to build the GNU C dll with C++ exception handling) -make clean GC-inlined (to build the GNU C inlined dll with C cleanup code) -make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling) -make clean GC-static (to build the GNU C inlined static lib with C cleanup code) -make clean GC-debug (to build the GNU C debug dll with C cleanup code) -make clean GCE-debug (to build the GNU C debug dll with C++ exception handling) -make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code) -make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling) -make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code) - - -The pre-built dlls are normally built using the *-inlined targets. - -You can run the testsuite by changing to the "tests" directory and -running make for help information. E.g.: - -$ cd tests -$ make -Run one of the following command lines: -make clean GC (to test using GC dll with C (no EH) applications) -make clean GCX (to test using GC dll with C++ (EH) applications) -make clean GCE (to test using GCE dll with C++ (EH) applications) -make clean GC-bench (to benchtest using GNU C dll with C cleanup code) -make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling) -make clean GC-static (to test using GC static lib with C (no EH) applications) - - -Building under Linux using the Mingw32 cross development tools --------------------------------------------------------------- - -You can build the library without leaving Linux by using the Mingw32 cross -development toolchain. See http://www.libsdl.org/extras/win32/cross/ for -tools and info. The GNUmakefile contains some support for this, for example: - -make CROSS=i386-mingw32msvc- clean GC-inlined - -will build pthreadGCn.dll and libpthreadGCn.a (n=version#), provided your -cross-tools/bin directory is in your PATH (or use the cross-make.sh script -at the URL above). - - -Building the library as a statically linkable library ------------------------------------------------------ - -General: PTW32_STATIC_LIB must be defined for both the library build and the -application build. The makefiles supplied and used by the following 'make' -command lines will define this for you. - -MSVC (creates pthreadVCn.lib as a static link lib): - -nmake clean VC-static - - -MinGW32 (creates libpthreadGCn.a as a static link lib): - -make clean GC-static - - -Define PTW32_STATIC_LIB when building your application. Also, your -application must call a two non-portable routines to initialise the -some state on startup and cleanup before exit. One other routine needs -to be called to cleanup after any Win32 threads have called POSIX API -routines. See README.NONPORTABLE or the html reference manual pages for -details on these routines: - -BOOL pthread_win32_process_attach_np (void); -BOOL pthread_win32_process_detach_np (void); -BOOL pthread_win32_thread_attach_np (void); // Currently a no-op -BOOL pthread_win32_thread_detach_np (void); - - -The tests makefiles have the same targets but only check that the -static library is statically linkable. They don't run the full -testsuite. To run the full testsuite, build the dlls and run the -dll test targets. - - -Building the library under Cygwin ---------------------------------- - -Cygwin is implementing it's own POSIX threads routines and these -will be the ones to use if you develop using Cygwin. - - -Ready to run binaries ---------------------- - -For convenience, the following ready-to-run files can be downloaded -from the FTP site (see under "Availability" below): - - pthread.h - semaphore.h - sched.h - pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp - pthreadVC.lib - pthreadVCE.dll - built with MSVC++ compiler using C++ EH - pthreadVCE.lib - pthreadVSE.dll - built with MSVC compiler using SEH - pthreadVSE.lib - pthreadGC.dll - built with Mingw32 GCC - libpthreadGC.a - derived from pthreadGC.dll - pthreadGCE.dll - built with Mingw32 G++ - libpthreadGCE.a - derived from pthreadGCE.dll - -As of August 2003 pthreads-win32 pthreadG* versions are built and tested -using the MinGW + MsysDTK environment current as of that date or later. -The following file MAY be needed for older MinGW environments. - - gcc.dll - needed to build and run applications that use - pthreadGCE.dll. - - -Building applications with GNU compilers ----------------------------------------- - -If you're using pthreadGC.dll: - -With the three header files, pthreadGC.dll and libpthreadGC.a in the -same directory as your application myapp.c, you could compile, link -and run myapp.c under Mingw32 as follows: - - gcc -o myapp.exe myapp.c -I. -L. -lpthreadGC - myapp - -Or put pthreadGC.dll in an appropriate directory in your PATH, -put libpthreadGC.a in your system lib directory, and -put the three header files in your system include directory, -then use: - - gcc -o myapp.exe myapp.c -lpthreadGC - myapp - - -If you're using pthreadGCE.dll: - -With the three header files, pthreadGCE.dll, gcc.dll and libpthreadGCE.a -in the same directory as your application myapp.c, you could compile, -link and run myapp.c under Mingw32 as follows: - - gcc -x c++ -o myapp.exe myapp.c -I. -L. -lpthreadGCE - myapp - -Or put pthreadGCE.dll and gcc.dll in an appropriate directory in -your PATH, put libpthreadGCE.a in your system lib directory, and -put the three header files in your system include directory, -then use: - - gcc -x c++ -o myapp.exe myapp.c -lpthreadGCE - myapp - - -Availability ------------- - -The complete source code in either unbundled, self-extracting -Zip file, or tar/gzipped format can be found at: - - ftp://sources.redhat.com/pub/pthreads-win32 - -The pre-built DLL, export libraries and matching pthread.h can -be found at: - - ftp://sources.redhat.com/pub/pthreads-win32/dll-latest - -Home page: - - http://sources.redhat.com/pthreads-win32/ - - -Mailing list ------------- - -There is a mailing list for discussing pthreads on Win32. -To join, send email to: - - pthreads-win32-subscribe@sources.redhat.com - -Unsubscribe by sending mail to: - - pthreads-win32-unsubscribe@sources.redhat.com - - -Acknowledgements ----------------- - -See the ANNOUNCE file for acknowledgements. -See the 'CONTRIBUTORS' file for the list of contributors. - -As much as possible, the ChangeLog file attributes -contributions and patches that have been incorporated -in the library to the individuals responsible. - -Finally, thanks to all those who work on and contribute to the -POSIX and Single Unix Specification standards. The maturity of an -industry can be measured by it's open standards. - ----- -Ross Johnson - - - - - - - - - diff --git a/software/src/lib/pthread/README.Borland b/software/src/lib/pthread/README.Borland deleted file mode 100644 index a130d2b..0000000 --- a/software/src/lib/pthread/README.Borland +++ /dev/null @@ -1,57 +0,0 @@ -In ptw32_InterlockedCompareExchange.c, I've added a section for -Borland's compiler; it's identical to that for the MS compiler except -that it uses /* ... */ comments instead of ; comments. - -[RPJ: need to define HAVE_TASM32 in config.h to use the above.] - - -The other file is a makefile suitable for use with Borland's compiler -(run "make -fBmakefile" in the directory). It builds a single version -of the library, pthreadBC.dll and the corresponding pthreadBC.lib -import library, which is comparable to the pthreadVC version; I can't -personally see any demand for the versions that include structured or -C++ exception cancellation handling so I haven't attempted to build -those versions of the library. (I imagine a static version might be -of use to some, but we can't legally use that on my commercial -projects so I can't try that out, unfortunately.) - -[RPJ: Added tests\Bmakefile as well.] - -Borland C++ doesn't define the ENOSYS constant used by pthreads-win32; -rather than make more extensive patches to the pthreads-win32 source I -have a mostly-arbitrary constant for it in the makefile. However this -doesn't make it visible to the application using the library, so if -anyone actually wants to use this constant in their apps (why?) -someone might like to make a seperate NEED_BCC_something define to add -this stuff. - -The makefile also #defines EDEADLK as EDEADLOCK, _timeb as timeb, and -_ftime as ftime, to deal with the minor differences between the two -RTLs' naming conventions, and sets the compiler flags as required to -get a normal compile of the library. - -[RPJ: Moved errno values and _timeb etc to pthread.h, so apps will also -use them.] - -(While I'm on the subject, the reason Borland users should recompile -the library, rather than using the impdef/implib technique suggested -previously on the mailing list, is that a) the errno constants are -different, so the results returned by the pthread_* functions can be -meaningless, and b) the errno variable/pseudo-variable itself is -different in the MS & BCC runtimes, so you can't access the -pthreadVC's errno from a Borland C++-compiled host application -correctly - I imagine there are other potential problems from the RTL -mismatch too.) - -[RPJ: Make sure you use the same RTL in both dll and application builds. -The dll and tests Bmakefiles use cw32mti.lib. Having some trouble with -memory read exceptions running the test suite using BCC55.] - -Best regards, -Will - --- -Will Bryant -Systems Architect, eCOSM Limited -Cell +64 21 655 443, office +64 3 365 4176 -http://www.ecosm.com/ diff --git a/software/src/lib/pthread/README.CV b/software/src/lib/pthread/README.CV deleted file mode 100644 index 698728b..0000000 --- a/software/src/lib/pthread/README.CV +++ /dev/null @@ -1,3036 +0,0 @@ -README.CV -- Condition Variables --------------------------------- - -The original implementation of condition variables in -pthreads-win32 was based on a discussion paper: - -"Strategies for Implementing POSIX Condition Variables -on Win32": http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - -The changes suggested below were made on Feb 6 2001. This -file is included in the package for the benefit of anyone -interested in understanding the pthreads-win32 implementation -of condition variables and the (sometimes subtle) issues that -it attempts to resolve. - -Thanks go to the individuals whose names appear throughout -the following text. - -Ross Johnson - --------------------------------------------------------------------- - -fyi.. (more detailed problem description/demos + possible fix/patch) - -regards, -alexander. - - -Alexander Terekhov -31.01.2001 17:43 - -To: ace-bugs@cs.wustl.edu -cc: -From: Alexander Terekhov/Germany/IBM@IBMDE -Subject: Implementation of POSIX CVs: spur.wakeups/lost - signals/deadlocks/unfairness - - - - ACE VERSION: - - 5.1.12 (pthread-win32 snapshot 2000-12-29) - - HOST MACHINE and OPERATING SYSTEM: - - IBM IntelliStation Z Pro, 2 x XEON 1GHz, Win2K - - TARGET MACHINE and OPERATING SYSTEM, if different from HOST: - COMPILER NAME AND VERSION (AND PATCHLEVEL): - - Microsoft Visual C++ 6.0 - - AREA/CLASS/EXAMPLE AFFECTED: - - Implementation of POSIX condition variables - OS.cpp/.h - - DOES THE PROBLEM AFFECT: - - EXECUTION? YES! - - SYNOPSIS: - - a) spurious wakeups (minor problem) - b) lost signals - c) broadcast deadlock - d) unfairness (minor problem) - - DESCRIPTION: - - Please see attached copy of discussion thread - from comp.programming.threads for more details on - some reported problems. (i've also posted a "fyi" - message to ace-users a week or two ago but - unfortunately did not get any response so far). - - It seems that current implementation suffers from - two essential problems: - - 1) cond.waiters_count does not accurately reflect - number of waiters blocked on semaphore - w/o - proper synchronisation that could result (in the - time window when counter is not accurate) - in spurious wakeups organised by subsequent - _signals and _broadcasts. - - 2) Always having (with no e.g. copy_and_clear/..) - the same queue in use (semaphore+counter) - neither signal nor broadcast provide 'atomic' - behaviour with respect to other threads/subsequent - calls to signal/broadcast/wait. - - Each problem and combination of both could produce - various nasty things: - - a) spurious wakeups (minor problem) - - it is possible that waiter(s) which was already - unblocked even so is still counted as blocked - waiter. signal and broadcast will release - semaphore which will produce a spurious wakeup - for a 'real' waiter coming later. - - b) lost signals - - signalling thread ends up consuming its own - signal. please see demo/discussion below. - - c) broadcast deadlock - - last_waiter processing code does not correctly - handle the case with multiple threads - waiting for the end of broadcast. - please see demo/discussion below. - - d) unfairness (minor problem) - - without SignalObjectAndWait some waiter(s) - may end up consuming broadcasted signals - multiple times (spurious wakeups) because waiter - thread(s) can be preempted before they call - semaphore wait (but after count++ and mtx.unlock). - - REPEAT BY: - - See below... run problem demos programs (tennis.cpp and - tennisb.cpp) number of times concurrently (on multiprocessor) - and in multiple sessions or just add a couple of "Sleep"s - as described in the attached copy of discussion thread - from comp.programming.threads - - SAMPLE FIX/WORKAROUND: - - See attached patch to pthread-win32.. well, I can not - claim that it is completely bug free but at least my - test and tests provided by pthreads-win32 seem to work. - Perhaps that will help. - - regards, - alexander. - - ->> Forum: comp.programming.threads ->> Thread: pthread_cond_* implementation questions -. -. -. -David Schwartz wrote: - -> terekhov@my-deja.com wrote: -> ->> BTW, could you please also share your view on other perceived ->> "problems" such as nested broadcast deadlock, spurious wakeups ->> and (the latest one) lost signals?? -> ->I'm not sure what you mean. The standard allows an implementation ->to do almost whatever it likes. In fact, you could implement ->pthread_cond_wait by releasing the mutex, sleeping a random ->amount of time, and then reacquiring the mutex. Of course, ->this would be a pretty poor implementation, but any code that ->didn't work under that implementation wouldn't be strictly ->compliant. - -The implementation you suggested is indeed correct -one (yes, now I see it :). However it requires from -signal/broadcast nothing more than to "{ return 0; }" -That is not the case for pthread-win32 and ACE -implementations. I do think that these implementations -(basically the same implementation) have some serious -problems with wait/signal/broadcast calls. I am looking -for help to clarify whether these problems are real -or not. I think that I can demonstrate what I mean -using one or two small sample programs. -. -. -. -========== -tennis.cpp -========== - -#include "ace/Synch.h" -#include "ace/Thread.h" - -enum GAME_STATE { - - START_GAME, - PLAYER_A, // Player A playes the ball - PLAYER_B, // Player B playes the ball - GAME_OVER, - ONE_PLAYER_GONE, - BOTH_PLAYERS_GONE - -}; - -enum GAME_STATE eGameState; -ACE_Mutex* pmtxGameStateLock; -ACE_Condition< ACE_Mutex >* pcndGameStateChange; - -void* - playerA( - void* pParm - ) -{ - - // For access to game state variable - pmtxGameStateLock->acquire(); - - // Play loop - while ( eGameState < GAME_OVER ) { - - // Play the ball - cout << endl << "PLAYER-A" << endl; - - // Now its PLAYER-B's turn - eGameState = PLAYER_B; - - // Signal to PLAYER-B that now it is his turn - pcndGameStateChange->signal(); - - // Wait until PLAYER-B finishes playing the ball - do { - - pcndGameStateChange->wait(); - - if ( PLAYER_B == eGameState ) - cout << endl << "----PLAYER-A: SPURIOUS WAKEUP!!!" << endl; - - } while ( PLAYER_B == eGameState ); - - } - - // PLAYER-A gone - eGameState = (GAME_STATE)(eGameState+1); - cout << endl << "PLAYER-A GONE" << endl; - - // No more access to state variable needed - pmtxGameStateLock->release(); - - // Signal PLAYER-A gone event - pcndGameStateChange->broadcast(); - - return 0; - -} - -void* - playerB( - void* pParm - ) -{ - - // For access to game state variable - pmtxGameStateLock->acquire(); - - // Play loop - while ( eGameState < GAME_OVER ) { - - // Play the ball - cout << endl << "PLAYER-B" << endl; - - // Now its PLAYER-A's turn - eGameState = PLAYER_A; - - // Signal to PLAYER-A that now it is his turn - pcndGameStateChange->signal(); - - // Wait until PLAYER-A finishes playing the ball - do { - - pcndGameStateChange->wait(); - - if ( PLAYER_A == eGameState ) - cout << endl << "----PLAYER-B: SPURIOUS WAKEUP!!!" << endl; - - } while ( PLAYER_A == eGameState ); - - } - - // PLAYER-B gone - eGameState = (GAME_STATE)(eGameState+1); - cout << endl << "PLAYER-B GONE" << endl; - - // No more access to state variable needed - pmtxGameStateLock->release(); - - // Signal PLAYER-B gone event - pcndGameStateChange->broadcast(); - - return 0; - -} - - -int -main (int, ACE_TCHAR *[]) -{ - - pmtxGameStateLock = new ACE_Mutex(); - pcndGameStateChange = new ACE_Condition< ACE_Mutex >( *pmtxGameStateLock -); - - // Set initial state - eGameState = START_GAME; - - // Create players - ACE_Thread::spawn( playerA ); - ACE_Thread::spawn( playerB ); - - // Give them 5 sec. to play - Sleep( 5000 );//sleep( 5 ); - - // Set game over state - pmtxGameStateLock->acquire(); - eGameState = GAME_OVER; - - // Let them know - pcndGameStateChange->broadcast(); - - // Wait for players to stop - do { - - pcndGameStateChange->wait(); - - } while ( eGameState < BOTH_PLAYERS_GONE ); - - // Cleanup - cout << endl << "GAME OVER" << endl; - pmtxGameStateLock->release(); - delete pcndGameStateChange; - delete pmtxGameStateLock; - - return 0; - -} - -=========== -tennisb.cpp -=========== -#include "ace/Synch.h" -#include "ace/Thread.h" - -enum GAME_STATE { - - START_GAME, - PLAYER_A, // Player A playes the ball - PLAYER_B, // Player B playes the ball - GAME_OVER, - ONE_PLAYER_GONE, - BOTH_PLAYERS_GONE - -}; - -enum GAME_STATE eGameState; -ACE_Mutex* pmtxGameStateLock; -ACE_Condition< ACE_Mutex >* pcndGameStateChange; - -void* - playerA( - void* pParm - ) -{ - - // For access to game state variable - pmtxGameStateLock->acquire(); - - // Play loop - while ( eGameState < GAME_OVER ) { - - // Play the ball - cout << endl << "PLAYER-A" << endl; - - // Now its PLAYER-B's turn - eGameState = PLAYER_B; - - // Signal to PLAYER-B that now it is his turn - pcndGameStateChange->broadcast(); - - // Wait until PLAYER-B finishes playing the ball - do { - - pcndGameStateChange->wait(); - - if ( PLAYER_B == eGameState ) - cout << endl << "----PLAYER-A: SPURIOUS WAKEUP!!!" << endl; - - } while ( PLAYER_B == eGameState ); - - } - - // PLAYER-A gone - eGameState = (GAME_STATE)(eGameState+1); - cout << endl << "PLAYER-A GONE" << endl; - - // No more access to state variable needed - pmtxGameStateLock->release(); - - // Signal PLAYER-A gone event - pcndGameStateChange->broadcast(); - - return 0; - -} - -void* - playerB( - void* pParm - ) -{ - - // For access to game state variable - pmtxGameStateLock->acquire(); - - // Play loop - while ( eGameState < GAME_OVER ) { - - // Play the ball - cout << endl << "PLAYER-B" << endl; - - // Now its PLAYER-A's turn - eGameState = PLAYER_A; - - // Signal to PLAYER-A that now it is his turn - pcndGameStateChange->broadcast(); - - // Wait until PLAYER-A finishes playing the ball - do { - - pcndGameStateChange->wait(); - - if ( PLAYER_A == eGameState ) - cout << endl << "----PLAYER-B: SPURIOUS WAKEUP!!!" << endl; - - } while ( PLAYER_A == eGameState ); - - } - - // PLAYER-B gone - eGameState = (GAME_STATE)(eGameState+1); - cout << endl << "PLAYER-B GONE" << endl; - - // No more access to state variable needed - pmtxGameStateLock->release(); - - // Signal PLAYER-B gone event - pcndGameStateChange->broadcast(); - - return 0; - -} - - -int -main (int, ACE_TCHAR *[]) -{ - - pmtxGameStateLock = new ACE_Mutex(); - pcndGameStateChange = new ACE_Condition< ACE_Mutex >( *pmtxGameStateLock -); - - // Set initial state - eGameState = START_GAME; - - // Create players - ACE_Thread::spawn( playerA ); - ACE_Thread::spawn( playerB ); - - // Give them 5 sec. to play - Sleep( 5000 );//sleep( 5 ); - - // Make some noise - pmtxGameStateLock->acquire(); - cout << endl << "---Noise ON..." << endl; - pmtxGameStateLock->release(); - for ( int i = 0; i < 100000; i++ ) - pcndGameStateChange->broadcast(); - cout << endl << "---Noise OFF" << endl; - - // Set game over state - pmtxGameStateLock->acquire(); - eGameState = GAME_OVER; - cout << endl << "---Stopping the game..." << endl; - - // Let them know - pcndGameStateChange->broadcast(); - - // Wait for players to stop - do { - - pcndGameStateChange->wait(); - - } while ( eGameState < BOTH_PLAYERS_GONE ); - - // Cleanup - cout << endl << "GAME OVER" << endl; - pmtxGameStateLock->release(); - delete pcndGameStateChange; - delete pmtxGameStateLock; - - return 0; - -} -. -. -. -David Schwartz wrote: ->> > It's compliant ->> ->> That is really good. -> ->> Tomorrow (I have to go urgently now) I will try to ->> demonstrate the lost-signal "problem" of current ->> pthread-win32 and ACE-(variant w/o SingleObjectAndWait) ->> implementations: players start suddenly drop their balls :-) ->> (with no change in source code). -> ->Signals aren't lost, they're going to the main thread, ->which isn't coded correctly to handle them. Try this: -> -> // Wait for players to stop -> do { -> -> pthread_cond_wait( &cndGameStateChange,&mtxGameStateLock ); ->printf("Main thread stole a signal\n"); -> -> } while ( eGameState < BOTH_PLAYERS_GONE ); -> ->I bet everytime you thing a signal is lost, you'll see that printf. ->The signal isn't lost, it was stolen by another thread. - -well, you can probably loose your bet.. it was indeed stolen -by "another" thread but not the one you seem to think of. - -I think that what actually happens is the following: - -H:\SA\UXX\pt\PTHREADS\TESTS>tennis3.exe - -PLAYER-A - -PLAYER-B - -----PLAYER-B: SPURIOUS WAKEUP!!! - -PLAYER-A GONE - -PLAYER-B GONE - -GAME OVER - -H:\SA\UXX\pt\PTHREADS\TESTS> - -here you can see that PLAYER-B after playing his first -ball (which came via signal from PLAYER-A) just dropped -it down. What happened is that his signal to player A -was consumed as spurious wakeup by himself (player B). - -The implementation has a problem: - -================ -waiting threads: -================ - -{ /** Critical Section - - inc cond.waiters_count - -} - - /* - /* Atomic only if using Win32 SignalObjectAndWait - /* - cond.mtx.release - - /*** ^^-- A THREAD WHICH DID SIGNAL MAY ACQUIRE THE MUTEX, - /*** GO INTO WAIT ON THE SAME CONDITION AND OVERTAKE - /*** ORIGINAL WAITER(S) CONSUMING ITS OWN SIGNAL! - - cond.sem.wait - -Player-A after playing game's initial ball went into -wait (called _wait) but was pre-empted before reaching -wait semaphore. He was counted as waiter but was not -actually waiting/blocked yet. - -=============== -signal threads: -=============== - -{ /** Critical Section - - waiters_count = cond.waiters_count - -} - - if ( waiters_count != 0 ) - - sem.post 1 - - endif - -Player-B after he received signal/ball from Player A -called _signal. The _signal did see that there was -one waiter blocked on the condition (Player-A) and -released the semaphore.. (but it did not unblock -Player-A because he was not actually blocked). -Player-B thread continued its execution, called _wait, -was counted as second waiter BUT was allowed to slip -through opened semaphore gate (which was opened for -Player-B) and received his own signal. Player B remained -blocked followed by Player A. Deadlock happened which -lasted until main thread came in and said game over. - -It seems to me that the implementation fails to -correctly implement the following statement -from specification: - -http://www.opengroup.org/ -onlinepubs/007908799/xsh/pthread_cond_wait.html - -"These functions atomically release mutex and cause -the calling thread to block on the condition variable -cond; atomically here means "atomically with respect -to access by another thread to the mutex and then the -condition variable". That is, if another thread is -able to acquire the mutex after the about-to-block -thread has released it, then a subsequent call to -pthread_cond_signal() or pthread_cond_broadcast() -in that thread behaves as if it were issued after -the about-to-block thread has blocked." - -Question: Am I right? - -(I produced the program output above by simply -adding ?Sleep( 1 )?: - -================ -waiting threads: -================ - -{ /** Critical Section - - inc cond.waiters_count - -} - - /* - /* Atomic only if using Win32 SignalObjectAndWait - /* - cond.mtx.release - -Sleep( 1 ); // Win32 - - /*** ^^-- A THREAD WHICH DID SIGNAL MAY ACQUIRE THE MUTEX, - /*** GO INTO WAIT ON THE SAME CONDITION AND OVERTAKE - /*** ORIGINAL WAITER(S) CONSUMING ITS OWN SIGNAL! - - cond.sem.wait - -to the source code of pthread-win32 implementation: - -http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/ -condvar.c?rev=1.36&content-type=text/ -x-cvsweb-markup&cvsroot=pthreads-win32 - - - /* - * We keep the lock held just long enough to increment the count of - * waiters by one (above). - * Note that we can't keep it held across the - * call to sem_wait since that will deadlock other calls - * to pthread_cond_signal - */ - cleanup_args.mutexPtr = mutex; - cleanup_args.cv = cv; - cleanup_args.resultPtr = &result; - - pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) -&cleanup_args); - - if ((result = pthread_mutex_unlock (mutex)) == 0) - {((result -Sleep( 1 ); // @AT - - /* - * Wait to be awakened by - * pthread_cond_signal, or - * pthread_cond_broadcast, or - * a timeout - * - * Note: - * ptw32_sem_timedwait is a cancelation point, - * hence providing the - * mechanism for making pthread_cond_wait a cancelation - * point. We use the cleanup mechanism to ensure we - * re-lock the mutex and decrement the waiters count - * if we are canceled. - */ - if (ptw32_sem_timedwait (&(cv->sema), abstime) == -1) { - result = errno; - } - } - - pthread_cleanup_pop (1); /* Always cleanup */ - - -BTW, on my system (2 CPUs) I can manage to get -signals lost even without any source code modification -if I run the tennis program many times in different -shell sessions. -. -. -. -David Schwartz wrote: ->terekhov@my-deja.com wrote: -> ->> well, it might be that the program is in fact buggy. ->> but you did not show me any bug. -> ->You're right. I was close but not dead on. I was correct, however, ->that the code is buggy because it uses 'pthread_cond_signal' even ->though not any thread waiting on the condition variable can do the ->job. I was wrong in which thread could be waiting on the cv but ->unable to do the job. - -Okay, lets change 'pthread_cond_signal' to 'pthread_cond_broadcast' -but also add some noise from main() right before declaring the game -to be over (I need it in order to demonstrate another problem of -pthread-win32/ACE implementations - broadcast deadlock)... -. -. -. -It is my understanding of POSIX conditions, -that on correct implementation added noise -in form of unnecessary broadcasts from main, -should not break the tennis program. The -only 'side effect' of added noise on correct -implementation would be 'spurious wakeups' of -players (in fact they are not spurious, -players just see them as spurious) unblocked, -not by another player but by main before -another player had a chance to acquire the -mutex and change the game state variable: -. -. -. - -PLAYER-B - -PLAYER-A - ----Noise ON... - -PLAYER-B - -PLAYER-A - -. -. -. - -PLAYER-B - -PLAYER-A - -----PLAYER-A: SPURIOUS WAKEUP!!! - -PLAYER-B - -PLAYER-A - ----Noise OFF - -PLAYER-B - ----Stopping the game... - -PLAYER-A GONE - -PLAYER-B GONE - -GAME OVER - -H:\SA\UXX\pt\PTHREADS\TESTS> - -On pthread-win32/ACE implementations the -program could stall: - -. -. -. - -PLAYER-A - -PLAYER-B - -PLAYER-A - -PLAYER-B - -PLAYER-A - -PLAYER-B - -PLAYER-A - -PLAYER-B - ----Noise ON... - -PLAYER-A - ----Noise OFF -^C -H:\SA\UXX\pt\PTHREADS\TESTS> - - -The implementation has problems: - -================ -waiting threads: -================ - -{ /** Critical Section - - inc cond.waiters_count - -} - - /* - /* Atomic only if using Win32 SignalObjectAndWait - /* - cond.mtx.release - cond.sem.wait - - /*** ^^-- WAITER CAN BE PREEMPTED AFTER BEING UNBLOCKED... - -{ /** Critical Section - - dec cond.waiters_count - - /*** ^^- ...AND BEFORE DECREMENTING THE COUNT (1) - - last_waiter = ( cond.was_broadcast && - cond.waiters_count == 0 ) - - if ( last_waiter ) - - cond.was_broadcast = FALSE - - endif - -} - - if ( last_waiter ) - - /* - /* Atomic only if using Win32 SignalObjectAndWait - /* - cond.auto_reset_event_or_sem.post /* Event for Win32 - cond.mtx.acquire - - /*** ^^-- ...AND BEFORE CALL TO mtx.acquire (2) - - /*** ^^-- NESTED BROADCASTS RESULT IN A DEADLOCK - - - else - - cond.mtx.acquire - - /*** ^^-- ...AND BEFORE CALL TO mtx.acquire (3) - - endif - - -================== -broadcast threads: -================== - -{ /** Critical Section - - waiters_count = cond.waiters_count - - if ( waiters_count != 0 ) - - cond.was_broadcast = TRUE - - endif - -} - -if ( waiters_count != 0 ) - - cond.sem.post waiters_count - - /*** ^^^^^--- SPURIOUS WAKEUPS DUE TO (1) - - cond.auto_reset_event_or_sem.wait /* Event for Win32 - - /*** ^^^^^--- DEADLOCK FOR FURTHER BROADCASTS IF THEY - HAPPEN TO GO INTO WAIT WHILE PREVIOUS - BROADCAST IS STILL IN PROGRESS/WAITING - -endif - -a) cond.waiters_count does not accurately reflect -number of waiters blocked on semaphore - that could -result (in the time window when counter is not accurate) -in spurios wakeups organised by subsequent _signals -and _broadcasts. From standard compliance point of view -that is OK but that could be a real problem from -performance/efficiency point of view. - -b) If subsequent broadcast happen to go into wait on -cond.auto_reset_event_or_sem before previous -broadcast was unblocked from cond.auto_reset_event_or_sem -by its last waiter, one of two blocked threads will -remain blocked because last_waiter processing code -fails to unblock both threads. - -In the situation with tennisb.c the Player-B was put -in a deadlock by noise (broadcast) coming from main -thread. And since Player-B holds the game state -mutex when it calls broadcast, the whole program -stalled: Player-A was deadlocked on mutex and -main thread after finishing with producing the noise -was deadlocked on mutex too (needed to declare the -game over) - -(I produced the program output above by simply -adding ?Sleep( 1 )?: - -================== -broadcast threads: -================== - -{ /** Critical Section - - waiters_count = cond.waiters_count - - if ( waiters_count != 0 ) - - cond.was_broadcast = TRUE - - endif - -} - -if ( waiters_count != 0 ) - -Sleep( 1 ); //Win32 - - cond.sem.post waiters_count - - /*** ^^^^^--- SPURIOUS WAKEUPS DUE TO (1) - - cond.auto_reset_event_or_sem.wait /* Event for Win32 - - /*** ^^^^^--- DEADLOCK FOR FURTHER BROADCASTS IF THEY - HAPPEN TO GO INTO WAIT WHILE PREVIOUS - BROADCAST IS STILL IN PROGRESS/WAITING - -endif - -to the source code of pthread-win32 implementation: - -http://sources.redhat.com/cgi-bin/cvsweb.cgi/pthreads/ -condvar.c?rev=1.36&content-type=text/ -x-cvsweb-markup&cvsroot=pthreads-win32 - - if (wereWaiters) - {(wereWaiters)sroot=pthreads-win32eb.cgi/pthreads/Yem...m - /* - * Wake up all waiters - */ - -Sleep( 1 ); //@AT - -#ifdef NEED_SEM - - result = (ptw32_increase_semaphore( &cv->sema, cv->waiters ) - ? 0 - : EINVAL); - -#else /* NEED_SEM */ - - result = (ReleaseSemaphore( cv->sema, cv->waiters, NULL ) - ? 0 - : EINVAL); - -#endif /* NEED_SEM */ - - } - - (void) pthread_mutex_unlock(&(cv->waitersLock)); - - if (wereWaiters && result == 0) - {(wereWaiters - /* - * Wait for all the awakened threads to acquire their part of - * the counting semaphore - */ - - if (WaitForSingleObject (cv->waitersDone, INFINITE) - == WAIT_OBJECT_0) - { - result = 0; - } - else - { - result = EINVAL; - } - - } - - return (result); - -} - -BTW, on my system (2 CPUs) I can manage to get -the program stalled even without any source code -modification if I run the tennisb program many -times in different shell sessions. - -=================== -pthread-win32 patch -=================== -struct pthread_cond_t_ { - long nWaitersBlocked; /* Number of threads blocked -*/ - long nWaitersUnblocked; /* Number of threads unblocked -*/ - long nWaitersToUnblock; /* Number of threads to unblock -*/ - sem_t semBlockQueue; /* Queue up threads waiting for the -*/ - /* condition to become signalled -*/ - sem_t semBlockLock; /* Semaphore that guards access to -*/ - /* | waiters blocked count/block queue -*/ - /* +-> Mandatory Sync.LEVEL-1 -*/ - pthread_mutex_t mtxUnblockLock; /* Mutex that guards access to -*/ - /* | waiters (to)unblock(ed) counts -*/ - /* +-> Optional* Sync.LEVEL-2 -*/ -}; /* Opt*) for _timedwait and -cancellation*/ - -int -pthread_cond_init (pthread_cond_t * cond, const pthread_condattr_t * attr) - int result = EAGAIN; - pthread_cond_t cv = NULL; - - if (cond == NULL) - {(cond - return EINVAL; - } - - if ((attr != NULL && *attr != NULL) && - ((*attr)->pshared == PTHREAD_PROCESS_SHARED)) - { - /* - * Creating condition variable that can be shared between - * processes. - */ - result = ENOSYS; - - goto FAIL0; - } - - cv = (pthread_cond_t) calloc (1, sizeof (*cv)); - - if (cv == NULL) - {(cv - result = ENOMEM; - goto FAIL0; - } - - cv->nWaitersBlocked = 0; - cv->nWaitersUnblocked = 0; - cv->nWaitersToUnblock = 0; - - if (sem_init (&(cv->semBlockLock), 0, 1) != 0) - {(sem_init - goto FAIL0; - } - - if (sem_init (&(cv->semBlockQueue), 0, 0) != 0) - {(sem_init - goto FAIL1; - } - - if (pthread_mutex_init (&(cv->mtxUnblockLock), 0) != 0) - {(pthread_mutex_init - goto FAIL2; - } - - - result = 0; - - goto DONE; - - /* - * ------------- - * Failed... - * ------------- - */ -FAIL2: - (void) sem_destroy (&(cv->semBlockQueue)); - -FAIL1: - (void) sem_destroy (&(cv->semBlockLock)); - -FAIL0: -DONE: - *cond = cv; - - return (result); - -} /* pthread_cond_init */ - -int -pthread_cond_destroy (pthread_cond_t * cond) -{ - int result = 0; - pthread_cond_t cv; - - /* - * Assuming any race condition here is harmless. - */ - if (cond == NULL - || *cond == NULL) - { - return EINVAL; - } - - if (*cond != (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) - {(*cond - cv = *cond; - - /* - * Synchronize access to waiters blocked count (LEVEL-1) - */ - if (sem_wait(&(cv->semBlockLock)) != 0) - {(sem_wait(&(cv->semBlockLock)) - return errno; - } - - /* - * Synchronize access to waiters (to)unblock(ed) counts (LEVEL-2) - */ - if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) - {((result - (void) sem_post(&(cv->semBlockLock)); - return result; - } - - /* - * Check whether cv is still busy (still has waiters blocked) - */ - if (cv->nWaitersBlocked - cv->nWaitersUnblocked > 0) - {(cv->nWaitersBlocked - (void) sem_post(&(cv->semBlockLock)); - (void) pthread_mutex_unlock(&(cv->mtxUnblockLock)); - return EBUSY; - } - - /* - * Now it is safe to destroy - */ - (void) sem_destroy (&(cv->semBlockLock)); - (void) sem_destroy (&(cv->semBlockQueue)); - (void) pthread_mutex_unlock (&(cv->mtxUnblockLock)); - (void) pthread_mutex_destroy (&(cv->mtxUnblockLock)); - - free(cv); - *cond = NULL; - } - else - { - /* - * See notes in ptw32_cond_check_need_init() above also. - */ - EnterCriticalSection(&ptw32_cond_test_init_lock); - - /* - * Check again. - */ - if (*cond == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) - {(*cond - /* - * This is all we need to do to destroy a statically - * initialised cond that has not yet been used (initialised). - * If we get to here, another thread - * waiting to initialise this cond will get an EINVAL. - */ - *cond = NULL; - } - else - { - /* - * The cv has been initialised while we were waiting - * so assume it's in use. - */ - result = EBUSY; - } - - LeaveCriticalSection(&ptw32_cond_test_init_lock); - } - - return (result); -} - -/* - * Arguments for cond_wait_cleanup, since we can only pass a - * single void * to it. - */ -typedef struct { - pthread_mutex_t * mutexPtr; - pthread_cond_t cv; - int * resultPtr; -} ptw32_cond_wait_cleanup_args_t; - -static void -ptw32_cond_wait_cleanup(void * args) -{ - ptw32_cond_wait_cleanup_args_t * cleanup_args = -(ptw32_cond_wait_cleanup_args_t *) args; - pthread_cond_t cv = cleanup_args->cv; - int * resultPtr = cleanup_args->resultPtr; - int eLastSignal; /* enum: 1=yes 0=no -1=cancelled/timedout w/o signal(s) -*/ - int result; - - /* - * Whether we got here as a result of signal/broadcast or because of - * timeout on wait or thread cancellation we indicate that we are no - * longer waiting. The waiter is responsible for adjusting waiters - * (to)unblock(ed) counts (protected by unblock lock). - * Unblock lock/Sync.LEVEL-2 supports _timedwait and cancellation. - */ - if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) - {((result - *resultPtr = result; - return; - } - - cv->nWaitersUnblocked++; - - eLastSignal = (cv->nWaitersToUnblock == 0) ? - -1 : (--cv->nWaitersToUnblock == 0); - - /* - * No more LEVEL-2 access to waiters (to)unblock(ed) counts needed - */ - if ((result = pthread_mutex_unlock(&(cv->mtxUnblockLock))) != 0) - {((result - *resultPtr = result; - return; - } - - /* - * If last signal... - */ - if (eLastSignal == 1) - {(eLastSignal - /* - * ...it means that we have end of 'atomic' signal/broadcast - */ - if (sem_post(&(cv->semBlockLock)) != 0) - {(sem_post(&(cv->semBlockLock)) - *resultPtr = errno; - return; - } - } - /* - * If not last signal and not timed out/cancelled wait w/o signal... - */ - else if (eLastSignal == 0) - { - /* - * ...it means that next waiter can go through semaphore - */ - if (sem_post(&(cv->semBlockQueue)) != 0) - {(sem_post(&(cv->semBlockQueue)) - *resultPtr = errno; - return; - } - } - - /* - * XSH: Upon successful return, the mutex has been locked and is owned - * by the calling thread - */ - if ((result = pthread_mutex_lock(cleanup_args->mutexPtr)) != 0) - {((result - *resultPtr = result; - } - -} /* ptw32_cond_wait_cleanup */ - -static int -ptw32_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime) -{ - int result = 0; - pthread_cond_t cv; - ptw32_cond_wait_cleanup_args_t cleanup_args; - - if (cond == NULL || *cond == NULL) - {(cond - return EINVAL; - } - - /* - * We do a quick check to see if we need to do more work - * to initialise a static condition variable. We check - * again inside the guarded section of ptw32_cond_check_need_init() - * to avoid race conditions. - */ - if (*cond == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) - {(*cond - result = ptw32_cond_check_need_init(cond); - } - - if (result != 0 && result != EBUSY) - {(result - return result; - } - - cv = *cond; - - /* - * Synchronize access to waiters blocked count (LEVEL-1) - */ - if (sem_wait(&(cv->semBlockLock)) != 0) - {(sem_wait(&(cv->semBlockLock)) - return errno; - } - - cv->nWaitersBlocked++; - - /* - * Thats it. Counted means waiting, no more access needed - */ - if (sem_post(&(cv->semBlockLock)) != 0) - {(sem_post(&(cv->semBlockLock)) - return errno; - } - - /* - * Setup this waiter cleanup handler - */ - cleanup_args.mutexPtr = mutex; - cleanup_args.cv = cv; - cleanup_args.resultPtr = &result; - - pthread_cleanup_push (ptw32_cond_wait_cleanup, (void *) &cleanup_args); - - /* - * Now we can release 'mutex' and... - */ - if ((result = pthread_mutex_unlock (mutex)) == 0) - {((result - - /* - * ...wait to be awakened by - * pthread_cond_signal, or - * pthread_cond_broadcast, or - * timeout, or - * thread cancellation - * - * Note: - * - * ptw32_sem_timedwait is a cancellation point, - * hence providing the mechanism for making - * pthread_cond_wait a cancellation point. - * We use the cleanup mechanism to ensure we - * re-lock the mutex and adjust (to)unblock(ed) waiters - * counts if we are cancelled, timed out or signalled. - */ - if (ptw32_sem_timedwait (&(cv->semBlockQueue), abstime) != 0) - {(ptw32_sem_timedwait - result = errno; - } - } - - /* - * Always cleanup - */ - pthread_cleanup_pop (1); - - - /* - * "result" can be modified by the cleanup handler. - */ - return (result); - -} /* ptw32_cond_timedwait */ - - -static int -ptw32_cond_unblock (pthread_cond_t * cond, - int unblockAll) -{ - int result; - pthread_cond_t cv; - - if (cond == NULL || *cond == NULL) - {(cond - return EINVAL; - } - - cv = *cond; - - /* - * No-op if the CV is static and hasn't been initialised yet. - * Assuming that any race condition is harmless. - */ - if (cv == (pthread_cond_t) PTW32_OBJECT_AUTO_INIT) - {(cv - return 0; - } - - /* - * Synchronize access to waiters blocked count (LEVEL-1) - */ - if (sem_wait(&(cv->semBlockLock)) != 0) - {(sem_wait(&(cv->semBlockLock)) - return errno; - } - - /* - * Synchronize access to waiters (to)unblock(ed) counts (LEVEL-2) - * This sync.level supports _timedwait and cancellation - */ - if ((result = pthread_mutex_lock(&(cv->mtxUnblockLock))) != 0) - {((result - return result; - } - - /* - * Adjust waiters blocked and unblocked counts (collect garbage) - */ - if (cv->nWaitersUnblocked != 0) - {(cv->nWaitersUnblocked - cv->nWaitersBlocked -= cv->nWaitersUnblocked; - cv->nWaitersUnblocked = 0; - } - - /* - * If (after adjustment) there are still some waiters blocked counted... - */ - if ( cv->nWaitersBlocked > 0) - {( - /* - * We will unblock first waiter and leave semBlockLock/LEVEL-1 locked - * LEVEL-1 access is left disabled until last signal/unblock -completes - */ - cv->nWaitersToUnblock = (unblockAll) ? cv->nWaitersBlocked : 1; - - /* - * No more LEVEL-2 access to waiters (to)unblock(ed) counts needed - * This sync.level supports _timedwait and cancellation - */ - if ((result = pthread_mutex_unlock(&(cv->mtxUnblockLock))) != 0) - {((result - return result; - } - - - /* - * Now, with LEVEL-2 lock released let first waiter go through -semaphore - */ - if (sem_post(&(cv->semBlockQueue)) != 0) - {(sem_post(&(cv->semBlockQueue)) - return errno; - } - } - /* - * No waiter blocked - no more LEVEL-1 access to blocked count needed... - */ - else if (sem_post(&(cv->semBlockLock)) != 0) - { - return errno; - } - /* - * ...and no more LEVEL-2 access to waiters (to)unblock(ed) counts needed -too - * This sync.level supports _timedwait and cancellation - */ - else - { - result = pthread_mutex_unlock(&(cv->mtxUnblockLock)); - } - - return(result); - -} /* ptw32_cond_unblock */ - -int -pthread_cond_wait (pthread_cond_t * cond, - pthread_mutex_t * mutex) -{ - /* The NULL abstime arg means INFINITE waiting. */ - return(ptw32_cond_timedwait(cond, mutex, NULL)); -} /* pthread_cond_wait */ - - -int -pthread_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime) -{ - if (abstime == NULL) - {(abstime - return EINVAL; - } - - return(ptw32_cond_timedwait(cond, mutex, abstime)); -} /* pthread_cond_timedwait */ - - -int -pthread_cond_signal (pthread_cond_t * cond) -{ - /* The '0'(FALSE) unblockAll arg means unblock ONE waiter. */ - return(ptw32_cond_unblock(cond, 0)); -} /* pthread_cond_signal */ - -int -pthread_cond_broadcast (pthread_cond_t * cond) -{ - /* The '1'(TRUE) unblockAll arg means unblock ALL waiters. */ - return(ptw32_cond_unblock(cond, 1)); -} /* pthread_cond_broadcast */ - - - - -TEREKHOV@de.ibm.com on 17.01.2001 01:00:57 - -Please respond to TEREKHOV@de.ibm.com - -To: pthreads-win32@sourceware.cygnus.com -cc: schmidt@uci.edu -Subject: win32 conditions: sem+counter+event = broadcast_deadlock + - spur.wakeup/unfairness/incorrectness ?? - - - - - - - -Hi, - -Problem 1: broadcast_deadlock - -It seems that current implementation does not provide "atomic" -broadcasts. That may lead to "nested" broadcasts... and it seems -that nested case is not handled correctly -> producing a broadcast -DEADLOCK as a result. - -Scenario: - -N (>1) waiting threads W1..N are blocked (in _wait) on condition's -semaphore. - -Thread B1 calls pthread_cond_broadcast, which results in "releasing" N -W threads via incrementing semaphore counter by N (stored in -cv->waiters) BUT cv->waiters counter does not change!! The caller -thread B1 remains blocked on cv->waitersDone event (auto-reset!!) BUT -condition is not protected from starting another broadcast (when called -on another thread) while still waiting for the "old" broadcast to -complete on thread B1. - -M (>=0, waiters counter. - -L (N-M) "late" waiter W threads are a) still blocked/not returned from -their semaphore wait call or b) were preempted after sem_wait but before -lock( &cv->waitersLock ) or c) are blocked on cv->waitersLock. - -cv->waiters is still > 0 (= L). - -Another thread B2 (or some W thread from M group) calls -pthread_cond_broadcast and gains access to counter... neither a) nor b) -prevent thread B2 in pthread_cond_broadcast from gaining access to -counter and starting another broadcast ( for c) - it depends on -cv->waitersLock scheduling rules: FIFO=OK, PRTY=PROBLEM,... ) - -That call to pthread_cond_broadcast (on thread B2) will result in -incrementing semaphore by cv->waiters (=L) which is INCORRECT (all -W1..N were in fact already released by thread B1) and waiting on -_auto-reset_ event cv->waitersDone which is DEADLY WRONG (produces a -deadlock)... - -All late W1..L threads now have a chance to complete their _wait call. -Last W_L thread sets an auto-reselt event cv->waitersDone which will -release either B1 or B2 leaving one of B threads in a deadlock. - -Problem 2: spur.wakeup/unfairness/incorrectness - -It seems that: - -a) because of the same problem with counter which does not reflect the -actual number of NOT RELEASED waiters, the signal call may increment -a semaphore counter w/o having a waiter blocked on it. That will result -in (best case) spurious wake ups - performance degradation due to -unnecessary context switches and predicate re-checks and (in worth case) -unfairness/incorrectness problem - see b) - -b) neither signal nor broadcast prevent other threads - "new waiters" -(and in the case of signal, the caller thread as well) from going into -_wait and overtaking "old" waiters (already released but still not returned -from sem_wait on condition's semaphore). Win semaphore just [API DOC]: -"Maintains a count between zero and some maximum value, limiting the number -of threads that are simultaneously accessing a shared resource." Calling -ReleaseSemaphore does not imply (at least not documented) that on return -from ReleaseSemaphore all waiters will in fact become released (returned -from their Wait... call) and/or that new waiters calling Wait... afterwards -will become less importance. It is NOT documented to be an atomic release -of -waiters... And even if it would be there is still a problem with a thread -being preempted after Wait on semaphore and before Wait on cv->waitersLock -and scheduling rules for cv->waitersLock itself -(??WaitForMultipleObjects??) -That may result in unfairness/incorrectness problem as described -for SetEvent impl. in "Strategies for Implementing POSIX Condition -Variables -on Win32": http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - -Unfairness -- The semantics of the POSIX pthread_cond_broadcast function is -to wake up all threads currently blocked in wait calls on the condition -variable. The awakened threads then compete for the external_mutex. To -ensure -fairness, all of these threads should be released from their -pthread_cond_wait calls and allowed to recheck their condition expressions -before other threads can successfully complete a wait on the condition -variable. - -Unfortunately, the SetEvent implementation above does not guarantee that -all -threads sleeping on the condition variable when cond_broadcast is called -will -acquire the external_mutex and check their condition expressions. Although -the Pthreads specification does not mandate this degree of fairness, the -lack of fairness can cause starvation. - -To illustrate the unfairness problem, imagine there are 2 threads, C1 and -C2, -that are blocked in pthread_cond_wait on condition variable not_empty_ that -is guarding a thread-safe message queue. Another thread, P1 then places two -messages onto the queue and calls pthread_cond_broadcast. If C1 returns -from -pthread_cond_wait, dequeues and processes the message, and immediately -waits -again then it and only it may end up acquiring both messages. Thus, C2 will -never get a chance to dequeue a message and run. - -The following illustrates the sequence of events: - -1. Thread C1 attempts to dequeue and waits on CV non_empty_ -2. Thread C2 attempts to dequeue and waits on CV non_empty_ -3. Thread P1 enqueues 2 messages and broadcasts to CV not_empty_ -4. Thread P1 exits -5. Thread C1 wakes up from CV not_empty_, dequeues a message and runs -6. Thread C1 waits again on CV not_empty_, immediately dequeues the 2nd - message and runs -7. Thread C1 exits -8. Thread C2 is the only thread left and blocks forever since - not_empty_ will never be signaled - -Depending on the algorithm being implemented, this lack of fairness may -yield -concurrent programs that have subtle bugs. Of course, application -developers -should not rely on the fairness semantics of pthread_cond_broadcast. -However, -there are many cases where fair implementations of condition variables can -simplify application code. - -Incorrectness -- A variation on the unfairness problem described above -occurs -when a third consumer thread, C3, is allowed to slip through even though it -was not waiting on condition variable not_empty_ when a broadcast occurred. - -To illustrate this, we will use the same scenario as above: 2 threads, C1 -and -C2, are blocked dequeuing messages from the message queue. Another thread, -P1 -then places two messages onto the queue and calls pthread_cond_broadcast. -C1 -returns from pthread_cond_wait, dequeues and processes the message. At this -time, C3 acquires the external_mutex, calls pthread_cond_wait and waits on -the events in WaitForMultipleObjects. Since C2 has not had a chance to run -yet, the BROADCAST event is still signaled. C3 then returns from -WaitForMultipleObjects, and dequeues and processes the message in the -queue. -Thus, C2 will never get a chance to dequeue a message and run. - -The following illustrates the sequence of events: - -1. Thread C1 attempts to dequeue and waits on CV non_empty_ -2. Thread C2 attempts to dequeue and waits on CV non_empty_ -3. Thread P1 enqueues 2 messages and broadcasts to CV not_empty_ -4. Thread P1 exits -5. Thread C1 wakes up from CV not_empty_, dequeues a message and runs -6. Thread C1 exits -7. Thread C3 waits on CV not_empty_, immediately dequeues the 2nd - message and runs -8. Thread C3 exits -9. Thread C2 is the only thread left and blocks forever since - not_empty_ will never be signaled - -In the above case, a thread that was not waiting on the condition variable -when a broadcast occurred was allowed to proceed. This leads to incorrect -semantics for a condition variable. - - -COMMENTS??? - -regards, -alexander. - ------------------------------------------------------------------------------ - -Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* - implementation questions -Date: Wed, 21 Feb 2001 11:54:47 +0100 -From: TEREKHOV@de.ibm.com -To: lthomas@arbitrade.com -CC: rpj@ise.canberra.edu.au, Thomas Pfaff , - Nanbor Wang - -Hi Louis, - -generation number 8.. - -had some time to revisit timeouts/spurious wakeup problem.. -found some bugs (in 7.b/c/d) and something to improve -(7a - using IPC semaphores but it should speedup Win32 -version as well). - -regards, -alexander. - ----------- Algorithm 8a / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ -given: -semBlockLock - bin.semaphore -semBlockQueue - semaphore -mtxExternal - mutex or CS -mtxUnblockLock - mutex or CS -nWaitersGone - int -nWaitersBlocked - int -nWaitersToUnblock - int - -wait( timeout ) { - - [auto: register int result ] // error checking omitted - [auto: register int nSignalsWasLeft ] - [auto: register int nWaitersWasGone ] - - sem_wait( semBlockLock ); - nWaitersBlocked++; - sem_post( semBlockLock ); - - unlock( mtxExternal ); - bTimedOut = sem_wait( semBlockQueue,timeout ); - - lock( mtxUnblockLock ); - if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { - if ( bTimeout ) { // timeout (or canceled) - if ( 0 != nWaitersBlocked ) { - nWaitersBlocked--; - } - else { - nWaitersGone++; // count spurious wakeups - } - } - if ( 0 == --nWaitersToUnblock ) { - if ( 0 != nWaitersBlocked ) { - sem_post( semBlockLock ); // open the gate - nSignalsWasLeft = 0; // do not open the gate below -again - } - else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { - nWaitersGone = 0; - } - } - } - else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious -semaphore :-) - sem_wait( semBlockLock ); - nWaitersBlocked -= nWaitersGone; // something is going on here - -test of timeouts? :-) - sem_post( semBlockLock ); - nWaitersGone = 0; - } - unlock( mtxUnblockLock ); - - if ( 1 == nSignalsWasLeft ) { - if ( 0 != nWaitersWasGone ) { - // sem_adjust( -nWaitersWasGone ); - while ( nWaitersWasGone-- ) { - sem_wait( semBlockLock ); // better now than spurious -later - } - } - sem_post( semBlockLock ); // open the gate - } - - lock( mtxExternal ); - - return ( bTimedOut ) ? ETIMEOUT : 0; -} - -signal(bAll) { - - [auto: register int result ] - [auto: register int nSignalsToIssue] - - lock( mtxUnblockLock ); - - if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! - if ( 0 == nWaitersBlocked ) { // NO-OP - return unlock( mtxUnblockLock ); - } - if (bAll) { - nWaitersToUnblock += nSignalsToIssue=nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nSignalsToIssue = 1; - nWaitersToUnblock++; - nWaitersBlocked--; - } - } - else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! - sem_wait( semBlockLock ); // close the gate - if ( 0 != nWaitersGone ) { - nWaitersBlocked -= nWaitersGone; - nWaitersGone = 0; - } - if (bAll) { - nSignalsToIssue = nWaitersToUnblock = nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nSignalsToIssue = nWaitersToUnblock = 1; - nWaitersBlocked--; - } - } - else { // NO-OP - return unlock( mtxUnblockLock ); - } - - unlock( mtxUnblockLock ); - sem_post( semBlockQueue,nSignalsToIssue ); - return result; -} - ----------- Algorithm 8b / IMPL_SEM,UNBLOCK_STRATEGY == UNBLOCK_ONEBYONE ------- -given: -semBlockLock - bin.semaphore -semBlockQueue - bin.semaphore -mtxExternal - mutex or CS -mtxUnblockLock - mutex or CS -nWaitersGone - int -nWaitersBlocked - int -nWaitersToUnblock - int - -wait( timeout ) { - - [auto: register int result ] // error checking omitted - [auto: register int nWaitersWasGone ] - [auto: register int nSignalsWasLeft ] - - sem_wait( semBlockLock ); - nWaitersBlocked++; - sem_post( semBlockLock ); - - unlock( mtxExternal ); - bTimedOut = sem_wait( semBlockQueue,timeout ); - - lock( mtxUnblockLock ); - if ( 0 != (nSignalsWasLeft = nWaitersToUnblock) ) { - if ( bTimeout ) { // timeout (or canceled) - if ( 0 != nWaitersBlocked ) { - nWaitersBlocked--; - nSignalsWasLeft = 0; // do not unblock next waiter -below (already unblocked) - } - else { - nWaitersGone = 1; // spurious wakeup pending!! - } - } - if ( 0 == --nWaitersToUnblock && - if ( 0 != nWaitersBlocked ) { - sem_post( semBlockLock ); // open the gate - nSignalsWasLeft = 0; // do not open the gate below -again - } - else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { - nWaitersGone = 0; - } - } - } - else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious -semaphore :-) - sem_wait( semBlockLock ); - nWaitersBlocked -= nWaitersGone; // something is going on here - -test of timeouts? :-) - sem_post( semBlockLock ); - nWaitersGone = 0; - } - unlock( mtxUnblockLock ); - - if ( 1 == nSignalsWasLeft ) { - if ( 0 != nWaitersWasGone ) { - // sem_adjust( -1 ); - sem_wait( semBlockQueue ); // better now than spurious -later - } - sem_post( semBlockLock ); // open the gate - } - else if ( 0 != nSignalsWasLeft ) { - sem_post( semBlockQueue ); // unblock next waiter - } - - lock( mtxExternal ); - - return ( bTimedOut ) ? ETIMEOUT : 0; -} - -signal(bAll) { - - [auto: register int result ] - - lock( mtxUnblockLock ); - - if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! - if ( 0 == nWaitersBlocked ) { // NO-OP - return unlock( mtxUnblockLock ); - } - if (bAll) { - nWaitersToUnblock += nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nWaitersToUnblock++; - nWaitersBlocked--; - } - unlock( mtxUnblockLock ); - } - else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! - sem_wait( semBlockLock ); // close the gate - if ( 0 != nWaitersGone ) { - nWaitersBlocked -= nWaitersGone; - nWaitersGone = 0; - } - if (bAll) { - nWaitersToUnblock = nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nWaitersToUnblock = 1; - nWaitersBlocked--; - } - unlock( mtxUnblockLock ); - sem_post( semBlockQueue ); - } - else { // NO-OP - unlock( mtxUnblockLock ); - } - - return result; -} - ----------- Algorithm 8c / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ONEBYONE ---------- -given: -hevBlockLock - auto-reset event -hevBlockQueue - auto-reset event -mtxExternal - mutex or CS -mtxUnblockLock - mutex or CS -nWaitersGone - int -nWaitersBlocked - int -nWaitersToUnblock - int - -wait( timeout ) { - - [auto: register int result ] // error checking omitted - [auto: register int nSignalsWasLeft ] - [auto: register int nWaitersWasGone ] - - wait( hevBlockLock,INFINITE ); - nWaitersBlocked++; - set_event( hevBlockLock ); - - unlock( mtxExternal ); - bTimedOut = wait( hevBlockQueue,timeout ); - - lock( mtxUnblockLock ); - if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { - if ( bTimeout ) { // timeout (or canceled) - if ( 0 != nWaitersBlocked ) { - nWaitersBlocked--; - nSignalsWasLeft = 0; // do not unblock next waiter -below (already unblocked) - } - else { - nWaitersGone = 1; // spurious wakeup pending!! - } - } - if ( 0 == --nWaitersToUnblock ) - if ( 0 != nWaitersBlocked ) { - set_event( hevBlockLock ); // open the gate - nSignalsWasLeft = 0; // do not open the gate below -again - } - else if ( 0 != (nWaitersWasGone = nWaitersGone) ) { - nWaitersGone = 0; - } - } - } - else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious -event :-) - wait( hevBlockLock,INFINITE ); - nWaitersBlocked -= nWaitersGone; // something is going on here - -test of timeouts? :-) - set_event( hevBlockLock ); - nWaitersGone = 0; - } - unlock( mtxUnblockLock ); - - if ( 1 == nSignalsWasLeft ) { - if ( 0 != nWaitersWasGone ) { - reset_event( hevBlockQueue ); // better now than spurious -later - } - set_event( hevBlockLock ); // open the gate - } - else if ( 0 != nSignalsWasLeft ) { - set_event( hevBlockQueue ); // unblock next waiter - } - - lock( mtxExternal ); - - return ( bTimedOut ) ? ETIMEOUT : 0; -} - -signal(bAll) { - - [auto: register int result ] - - lock( mtxUnblockLock ); - - if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! - if ( 0 == nWaitersBlocked ) { // NO-OP - return unlock( mtxUnblockLock ); - } - if (bAll) { - nWaitersToUnblock += nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nWaitersToUnblock++; - nWaitersBlocked--; - } - unlock( mtxUnblockLock ); - } - else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! - wait( hevBlockLock,INFINITE ); // close the gate - if ( 0 != nWaitersGone ) { - nWaitersBlocked -= nWaitersGone; - nWaitersGone = 0; - } - if (bAll) { - nWaitersToUnblock = nWaitersBlocked; - nWaitersBlocked = 0; - } - else { - nWaitersToUnblock = 1; - nWaitersBlocked--; - } - unlock( mtxUnblockLock ); - set_event( hevBlockQueue ); - } - else { // NO-OP - unlock( mtxUnblockLock ); - } - - return result; -} - ----------- Algorithm 8d / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ -given: -hevBlockLock - auto-reset event -hevBlockQueueS - auto-reset event // for signals -hevBlockQueueB - manual-reset even // for broadcasts -mtxExternal - mutex or CS -mtxUnblockLock - mutex or CS -eBroadcast - int // 0: no broadcast, 1: broadcast, 2: -broadcast after signal(s) -nWaitersGone - int -nWaitersBlocked - int -nWaitersToUnblock - int - -wait( timeout ) { - - [auto: register int result ] // error checking omitted - [auto: register int eWasBroadcast ] - [auto: register int nSignalsWasLeft ] - [auto: register int nWaitersWasGone ] - - wait( hevBlockLock,INFINITE ); - nWaitersBlocked++; - set_event( hevBlockLock ); - - unlock( mtxExternal ); - bTimedOut = waitformultiple( hevBlockQueueS,hevBlockQueueB,timeout,ONE ); - - lock( mtxUnblockLock ); - if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { - if ( bTimeout ) { // timeout (or canceled) - if ( 0 != nWaitersBlocked ) { - nWaitersBlocked--; - nSignalsWasLeft = 0; // do not unblock next waiter -below (already unblocked) - } - else if ( 1 != eBroadcast ) { - nWaitersGone = 1; - } - } - if ( 0 == --nWaitersToUnblock ) { - if ( 0 != nWaitersBlocked ) { - set_event( hevBlockLock ); // open the gate - nSignalsWasLeft = 0; // do not open the gate below -again - } - else { - if ( 0 != (eWasBroadcast = eBroadcast) ) { - eBroadcast = 0; - } - if ( 0 != (nWaitersWasGone = nWaitersGone ) { - nWaitersGone = 0; - } - } - } - else if ( 0 != eBroadcast ) { - nSignalsWasLeft = 0; // do not unblock next waiter -below (already unblocked) - } - } - else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious -event :-) - wait( hevBlockLock,INFINITE ); - nWaitersBlocked -= nWaitersGone; // something is going on here - -test of timeouts? :-) - set_event( hevBlockLock ); - nWaitersGone = 0; - } - unlock( mtxUnblockLock ); - - if ( 1 == nSignalsWasLeft ) { - if ( 0 != eWasBroadcast ) { - reset_event( hevBlockQueueB ); - } - if ( 0 != nWaitersWasGone ) { - reset_event( hevBlockQueueS ); // better now than spurious -later - } - set_event( hevBlockLock ); // open the gate - } - else if ( 0 != nSignalsWasLeft ) { - set_event( hevBlockQueueS ); // unblock next waiter - } - - lock( mtxExternal ); - - return ( bTimedOut ) ? ETIMEOUT : 0; -} - -signal(bAll) { - - [auto: register int result ] - [auto: register HANDLE hevBlockQueue ] - - lock( mtxUnblockLock ); - - if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! - if ( 0 == nWaitersBlocked ) { // NO-OP - return unlock( mtxUnblockLock ); - } - if (bAll) { - nWaitersToUnblock += nWaitersBlocked; - nWaitersBlocked = 0; - eBroadcast = 2; - hevBlockQueue = hevBlockQueueB; - } - else { - nWaitersToUnblock++; - nWaitersBlocked--; - return unlock( mtxUnblockLock ); - } - } - else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! - wait( hevBlockLock,INFINITE ); // close the gate - if ( 0 != nWaitersGone ) { - nWaitersBlocked -= nWaitersGone; - nWaitersGone = 0; - } - if (bAll) { - nWaitersToUnblock = nWaitersBlocked; - nWaitersBlocked = 0; - eBroadcast = 1; - hevBlockQueue = hevBlockQueueB; - } - else { - nWaitersToUnblock = 1; - nWaitersBlocked--; - hevBlockQueue = hevBlockQueueS; - } - } - else { // NO-OP - return unlock( mtxUnblockLock ); - } - - unlock( mtxUnblockLock ); - set_event( hevBlockQueue ); - return result; -} ----------------------- Forwarded by Alexander Terekhov/Germany/IBM on -02/21/2001 09:13 AM --------------------------- - -Alexander Terekhov -02/20/2001 04:33 PM - -To: Louis Thomas -cc: - -From: Alexander Terekhov/Germany/IBM@IBMDE -Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio - n questions -Importance: Normal - ->Sorry, gotta take a break and work on something else for a while. ->Real work ->calls, unfortunately. I'll get back to you in two or three days. - -ok. no problem. here is some more stuff for pauses you might have -in between :) - ----------- Algorithm 7d / IMPL_EVENT,UNBLOCK_STRATEGY == UNBLOCK_ALL ------ -given: -hevBlockLock - auto-reset event -hevBlockQueueS - auto-reset event // for signals -hevBlockQueueB - manual-reset even // for broadcasts -mtxExternal - mutex or CS -mtxUnblockLock - mutex or CS -bBroadcast - int -nWaitersGone - int -nWaitersBlocked - int -nWaitersToUnblock - int - -wait( timeout ) { - - [auto: register int result ] // error checking omitted - [auto: register int bWasBroadcast ] - [auto: register int nSignalsWasLeft ] - - wait( hevBlockLock,INFINITE ); - nWaitersBlocked++; - set_event( hevBlockLock ); - - unlock( mtxExternal ); - bTimedOut = waitformultiple( hevBlockQueueS,hevBlockQueueB,timeout,ONE ); - - lock( mtxUnblockLock ); - if ( 0 != (SignalsWasLeft = nWaitersToUnblock) ) { - if ( bTimeout ) { // timeout (or canceled) - if ( 0 != nWaitersBlocked ) { - nWaitersBlocked--; - nSignalsWasLeft = 0; // do not unblock next waiter -below (already unblocked) - } - else if ( !bBroadcast ) { - wait( hevBlockQueueS,INFINITE ); // better now than spurious -later - } - } - if ( 0 == --nWaitersToUnblock ) { - if ( 0 != nWaitersBlocked ) { - if ( bBroadcast ) { - reset_event( hevBlockQueueB ); - bBroadcast = false; - } - set_event( hevBlockLock ); // open the gate - nSignalsWasLeft = 0; // do not open the gate below -again - } - else if ( false != (bWasBroadcast = bBroadcast) ) { - bBroadcast = false; - } - } - else { - bWasBroadcast = bBroadcast; - } - } - else if ( INT_MAX/2 == ++nWaitersGone ) { // timeout/canceled or spurious -event :-) - wait( hevBlockLock,INFINITE ); - nWaitersBlocked -= nWaitersGone; // something is going on here - -test of timeouts? :-) - set_event( hevBlockLock ); - nWaitersGone = 0; - } - unlock( mtxUnblockLock ); - - if ( 1 == nSignalsWasLeft ) { - if ( bWasBroadcast ) { - reset_event( hevBlockQueueB ); - } - set_event( hevBlockLock ); // open the gate - } - else if ( 0 != nSignalsWasLeft && !bWasBroadcast ) { - set_event( hevBlockQueueS ); // unblock next waiter - } - - lock( mtxExternal ); - - return ( bTimedOut ) ? ETIMEOUT : 0; -} - -signal(bAll) { - - [auto: register int result ] - [auto: register HANDLE hevBlockQueue ] - - lock( mtxUnblockLock ); - - if ( 0 != nWaitersToUnblock ) { // the gate is closed!!! - if ( 0 == nWaitersBlocked ) { // NO-OP - return unlock( mtxUnblockLock ); - } - if (bAll) { - nWaitersToUnblock += nWaitersBlocked; - nWaitersBlocked = 0; - bBroadcast = true; - hevBlockQueue = hevBlockQueueB; - } - else { - nWaitersToUnblock++; - nWaitersBlocked--; - return unlock( mtxUnblockLock ); - } - } - else if ( nWaitersBlocked > nWaitersGone ) { // HARMLESS RACE CONDITION! - wait( hevBlockLock,INFINITE ); // close the gate - if ( 0 != nWaitersGone ) { - nWaitersBlocked -= nWaitersGone; - nWaitersGone = 0; - } - if (bAll) { - nWaitersToUnblock = nWaitersBlocked; - nWaitersBlocked = 0; - bBroadcast = true; - hevBlockQueue = hevBlockQueueB; - } - else { - nWaitersToUnblock = 1; - nWaitersBlocked--; - hevBlockQueue = hevBlockQueueS; - } - } - else { // NO-OP - return unlock( mtxUnblockLock ); - } - - unlock( mtxUnblockLock ); - set_event( hevBlockQueue ); - return result; -} - - ----------------------------------------------------------------------------- - -Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio - n questions -Date: Mon, 26 Feb 2001 22:20:12 -0600 -From: Louis Thomas -To: "'TEREKHOV@de.ibm.com'" -CC: rpj@ise.canberra.edu.au, Thomas Pfaff , - Nanbor Wang - - -Sorry all. Busy week. - -> this insures the fairness -> which POSIX does not (e.g. two subsequent broadcasts - the gate does -insure -> that first wave waiters will start the race for the mutex before waiters -> from the second wave - Linux pthreads process/unblock both waves -> concurrently...) - -I'm not sure how we are any more fair about this than Linux. We certainly -don't guarantee that the threads released by the first broadcast will get -the external mutex before the threads of the second wave. In fact, it is -possible that those threads will never get the external mutex if there is -enough contention for it. - -> e.g. i was thinking about implementation with a pool of -> N semaphores/counters [...] - -I considered that too. The problem is as you mentioned in a). You really -need to assign threads to semaphores once you know how you want to wake them -up, not when they first begin waiting which is the only time you can assign -them. - -> well, i am not quite sure that i've fully understood your scenario, - -Hmm. Well, it think it's an important example, so I'll try again. First, we -have thread A which we KNOW is waiting on a condition. As soon as it becomes -unblocked for any reason, we will know because it will set a flag. Since the -flag is not set, we are 100% confident that thread A is waiting on the -condition. We have another thread, thread B, which has acquired the mutex -and is about to wait on the condition. Thus it is pretty clear that at any -point, either just A is waiting, or A and B are waiting. Now thread C comes -along. C is about to do a broadcast on the condition. A broadcast is -guaranteed to unblock all threads currently waiting on a condition, right? -Again, we said that either just A is waiting, or A and B are both waiting. -So, when C does its broadcast, depending upon whether B has started waiting -or not, thread C will unblock A or unblock A and B. Either way, C must -unblock A, right? - -Now, you said anything that happens is correct so long as a) "a signal is -not lost between unlocking the mutex and waiting on the condition" and b) "a -thread must not steal a signal it sent", correct? Requirement b) is easy to -satisfy: in this scenario, thread C will never wait on the condition, so it -won't steal any signals. Requirement a) is not hard either. The only way we -could fail to meet requirement a) in this scenario is if thread B was -started waiting but didn't wake up because a signal was lost. This will not -happen. - -Now, here is what happens. Assume thread C beats thread B. Thread C looks to -see how many threads are waiting on the condition. Thread C sees just one -thread, thread A, waiting. It does a broadcast waking up just one thread -because just one thread is waiting. Next, before A can become unblocked, -thread B begins waiting. Now there are two threads waiting, but only one -will be unblocked. Suppose B wins. B will become unblocked. A will not -become unblocked, because C only unblocked one thread (sema_post cond, 1). -So at the end, B finishes and A remains blocked. - -We have met both of your requirements, so by your rules, this is an -acceptable outcome. However, I think that the spec says this is an -unacceptable outcome! We know for certain that A was waiting and that C did -a broadcast, but A did not become unblocked! Yet, the spec says that a -broadcast wakes up all waiting threads. This did not happen. Do you agree -that this shows your rules are not strict enough? - -> and what about N2? :) this one does allow almost everything. - -Don't get me started about rule #2. I'll NEVER advocate an algorithm that -uses rule 2 as an excuse to suck! - -> but it is done (decrement)under mutex protection - this is not a subject -> of a race condition. - -You are correct. My mistake. - -> i would remove "_bTimedOut=false".. after all, it was a real timeout.. - -I disagree. A thread that can't successfully retract its waiter status can't -really have timed out. If a thread can't return without executing extra code -to deal with the fact that someone tried to unblock it, I think it is a poor -idea to pretend we -didn't realize someone was trying to signal us. After all, a signal is more -important than a time out. - -> when nSignaled != 0, it is possible to update nWaiters (--) and do not -> touch nGone - -I realize this, but I was thinking that writing it the other ways saves -another if statement. - -> adjust only if nGone != 0 and save one cache memory write - probably much -slower than 'if' - -Hmm. You are probably right. - -> well, in a strange (e.g. timeout test) program you may (theoretically) -> have an overflow of nWaiters/nGone counters (with waiters repeatedly -timing -> out and no signals at all). - -Also true. Not only that, but you also have the possibility that one could -overflow the number of waiters as well! However, considering the limit you -have chosen for nWaitersGone, I suppose it is unlikely that anyone would be -able to get INT_MAX/2 threads waiting on a single condition. :) - -Analysis of 8a: - -It looks correct to me. - -What are IPC semaphores? - -In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { -// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone -because nWaitersGone is never modified without holding mtxUnblockLock. You -are correct that there is a harmless race on nWaitersBlocked, which can -increase and make the condition become true just after we check it. If this -happens, we interpret it as the wait starting after the signal. - -I like your optimization of this. You could improve Alg. 6 as follows: ----------- Algorithm 6b ---------- -signal(bAll) { - _nSig=0 - lock counters - // this is safe because nWaiting can only be decremented by a thread that - // owns counters and nGone can only be changed by a thread that owns -counters. - if (nWaiting>nGone) { - if (0==nSignaled) { - sema_wait gate // close gate if not already closed - } - if (nGone>0) { - nWaiting-=nGone - nGone=0 - } - _nSig=bAll?nWaiting:1 - nSignaled+=_nSig - nWaiting-=_nSig - } - unlock counters - if (0!=_nSig) { - sema_post queue, _nSig - } -} ----------- ---------- ---------- -I guess this wouldn't apply to Alg 8a because nWaitersGone changes meanings -depending upon whether the gate is open or closed. - -In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on -semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. - -What have you gained by making the last thread to be signaled do the waits -for all the timed out threads, besides added complexity? It took me a long -time to figure out what your objective was with this, to realize you were -using nWaitersGone to mean two different things, and to verify that you -hadn't introduced any bug by doing this. Even now I'm not 100% sure. - -What has all this playing about with nWaitersGone really gained us besides a -lot of complexity (it is much harder to verify that this solution is -correct), execution overhead (we now have a lot more if statements to -evaluate), and space overhead (more space for the extra code, and another -integer in our data)? We did manage to save a lock/unlock pair in an -uncommon case (when a time out occurs) at the above mentioned expenses in -the common cases. - -As for 8b, c, and d, they look ok though I haven't studied them thoroughly. -What would you use them for? - - Later, - -Louis! :) - ------------------------------------------------------------------------------ - -Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio - n questions -Date: Tue, 27 Feb 2001 15:51:28 +0100 -From: TEREKHOV@de.ibm.com -To: Louis Thomas -CC: rpj@ise.canberra.edu.au, Thomas Pfaff , - Nanbor Wang - -Hi Louis, - ->> that first wave waiters will start the race for the mutex before waiters ->> from the second wave - Linux pthreads process/unblock both waves ->> concurrently...) -> ->I'm not sure how we are any more fair about this than Linux. We certainly ->don't guarantee that the threads released by the first broadcast will get ->the external mutex before the threads of the second wave. In fact, it is ->possible that those threads will never get the external mutex if there is ->enough contention for it. - -correct. but gate is nevertheless more fair than Linux because of the -barrier it establishes between two races (1st and 2nd wave waiters) for -the mutex which under 'normal' circumstances (e.g. all threads of equal -priorities,..) will 'probably' result in fair behaviour with respect to -mutex ownership. - ->> well, i am not quite sure that i've fully understood your scenario, -> ->Hmm. Well, it think it's an important example, so I'll try again. ... - -ok. now i seem to understand this example. well, now it seems to me -that the only meaningful rule is just: - -a) "a signal is not lost between unlocking the mutex and waiting on the -condition" - -and that the rule - -b) "a thread must not steal a signal it sent" - -is not needed at all because a thread which violates b) also violates a). - -i'll try to explain.. - -i think that the most important thing is how POSIX defines waiter's -visibility: - -"if another thread is able to acquire the mutex after the about-to-block -thread -has released it, then a subsequent call to pthread_cond_signal() or -pthread_cond_broadcast() in that thread behaves as if it were issued after -the about-to-block thread has blocked. " - -my understanding is the following: - -1) there is no guarantees whatsoever with respect to whether -signal/broadcast -will actually unblock any 'waiter' if it is done w/o acquiring the mutex -first -(note that a thread may release it before signal/broadcast - it does not -matter). - -2) it is guaranteed that waiters become 'visible' - eligible for unblock as -soon -as signalling thread acquires the mutex (but not before!!) - -so.. - ->So, when C does its broadcast, depending upon whether B has started -waiting ->or not, thread C will unblock A or unblock A and B. Either way, C must ->unblock A, right? - -right. but only if C did acquire the mutex prior to broadcast (it may -release it before broadcast as well). - -implementation will violate waiters visibility rule (signal will become -lost) -if C will not unblock A. - ->Now, here is what happens. Assume thread C beats thread B. Thread C looks -to ->see how many threads are waiting on the condition. Thread C sees just one ->thread, thread A, waiting. It does a broadcast waking up just one thread ->because just one thread is waiting. Next, before A can become unblocked, ->thread B begins waiting. Now there are two threads waiting, but only one ->will be unblocked. Suppose B wins. B will become unblocked. A will not ->become unblocked, because C only unblocked one thread (sema_post cond, 1). ->So at the end, B finishes and A remains blocked. - -thread C did acquire the mutex ("Thread C sees just one thread, thread A, -waiting"). beginning from that moment it is guaranteed that subsequent -broadcast will unblock A. Otherwise we will have a lost signal with respect -to A. I do think that it does not matter whether the signal was physically -(completely) lost or was just stolen by another thread (B) - in both cases -it was simply lost with respect to A. - ->..Do you agree that this shows your rules are not strict enough? - -probably the opposite.. :-) i think that it shows that the only meaningful -rule is - -a) "a signal is not lost between unlocking the mutex and waiting on the -condition" - -with clarification of waiters visibility as defined by POSIX above. - ->> i would remove "_bTimedOut=false".. after all, it was a real timeout.. -> ->I disagree. A thread that can't successfully retract its waiter status -can't ->really have timed out. If a thread can't return without executing extra -code ->to deal with the fact that someone tried to unblock it, I think it is a -poor ->idea to pretend we ->didn't realize someone was trying to signal us. After all, a signal is -more ->important than a time out. - -a) POSIX does allow timed out thread to consume a signal (cancelled is -not). -b) ETIMEDOUT status just says that: "The time specified by abstime to -pthread_cond_timedwait() has passed." -c) it seem to me that hiding timeouts would violate "The -pthread_cond_timedwait() -function is the same as pthread_cond_wait() except that an error is -returned if -the absolute time specified by abstime passes (that is, system time equals -or -exceeds abstime) before the condition cond is signaled or broadcasted" -because -the abs. time did really pass before cond was signaled (waiter was -released via semaphore). however, if it really matters, i could imaging -that we -can save an abs. time of signal/broadcast and compare it with timeout after -unblock to find out whether it was a 'real' timeout or not. absent this -check -i do think that hiding timeouts would result in technical violation of -specification.. but i think that this check is not important and we can -simply -trust timeout error code provided by wait since we are not trying to make -'hard' realtime implementation. - ->What are IPC semaphores? - - -int semctl(int, int, int, ...); -int semget(key_t, int, int); -int semop(int, struct sembuf *, size_t); - -they support adjustment of semaphore counter (semvalue) -in one single call - imaging Win32 ReleaseSemaphore( hsem,-N ) - ->In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { ->// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone ->because nWaitersGone is never modified without holding mtxUnblockLock. You ->are correct that there is a harmless race on nWaitersBlocked, which can ->increase and make the condition become true just after we check it. If -this ->happens, we interpret it as the wait starting after the signal. - -well, the reason why i've asked on comp.programming.threads whether this -race -condition is harmless or not is that in order to be harmless it should not -violate the waiters visibility rule (see above). Fortunately, we increment -the counter under protection of external mutex.. so that any (signalling) -thread which will acquire the mutex next, should see the updated counter -(in signal) according to POSIX memory visibility rules and mutexes -(memory barriers). But i am not so sure how it actually works on -Win32/INTEL -which does not explicitly define any memory visibility rules :( - ->I like your optimization of this. You could improve Alg. 6 as follows: ->---------- Algorithm 6b ---------- ->signal(bAll) { -> _nSig=0 -> lock counters -> // this is safe because nWaiting can only be decremented by a thread -that -> // owns counters and nGone can only be changed by a thread that owns ->counters. -> if (nWaiting>nGone) { -> if (0==nSignaled) { -> sema_wait gate // close gate if not already closed -> } -> if (nGone>0) { -> nWaiting-=nGone -> nGone=0 -> } -> _nSig=bAll?nWaiting:1 -> nSignaled+=_nSig -> nWaiting-=_nSig -> } -> unlock counters -> if (0!=_nSig) { -> sema_post queue, _nSig -> } ->} ->---------- ---------- ---------- ->I guess this wouldn't apply to Alg 8a because nWaitersGone changes -meanings ->depending upon whether the gate is open or closed. - -agree. - ->In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on ->semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. - -you are correct. my mistake. - ->What have you gained by making the last thread to be signaled do the waits ->for all the timed out threads, besides added complexity? It took me a long ->time to figure out what your objective was with this, to realize you were ->using nWaitersGone to mean two different things, and to verify that you ->hadn't introduced any bug by doing this. Even now I'm not 100% sure. -> ->What has all this playing about with nWaitersGone really gained us besides -a ->lot of complexity (it is much harder to verify that this solution is ->correct), execution overhead (we now have a lot more if statements to ->evaluate), and space overhead (more space for the extra code, and another ->integer in our data)? We did manage to save a lock/unlock pair in an ->uncommon case (when a time out occurs) at the above mentioned expenses in ->the common cases. - -well, please consider the following: - -1) with multiple waiters unblocked (but some timed out) the trick with -counter -seem to ensure potentially higher level of concurrency by not delaying -most of unblocked waiters for semaphore cleanup - only the last one -will be delayed but all others would already contend/acquire/release -the external mutex - the critical section protected by mtxUnblockLock is -made smaller (increment + couple of IFs is faster than system/kernel call) -which i think is good in general. however, you are right, this is done -at expense of 'normal' waiters.. - -2) some semaphore APIs (e.g. POSIX IPC sems) do allow to adjust the -semaphore counter in one call => less system/kernel calls.. imagine: - -if ( 1 == nSignalsWasLeft ) { - if ( 0 != nWaitersWasGone ) { - ReleaseSemaphore( semBlockQueue,-nWaitersWasGone ); // better now -than spurious later - } - sem_post( semBlockLock ); // open the gate - } - -3) even on win32 a single thread doing multiple cleanup calls (to wait) -will probably result in faster execution (because of processor caching) -than multiple threads each doing a single call to wait. - ->As for 8b, c, and d, they look ok though I haven't studied them -thoroughly. ->What would you use them for? - -8b) for semaphores which do not allow to unblock multiple waiters -in a single call to post/release (e.g. POSIX realtime semaphores - -) - -8c/8d) for WinCE prior to 3.0 (WinCE 3.0 does have semaphores) - -ok. so, which one is the 'final' algorithm(s) which we should use in -pthreads-win32?? - -regards, -alexander. - ----------------------------------------------------------------------------- - -Louis Thomas on 02/27/2001 05:20:12 AM - -Please respond to Louis Thomas - -To: Alexander Terekhov/Germany/IBM@IBMDE -cc: rpj@ise.canberra.edu.au, Thomas Pfaff , Nanbor Wang - -Subject: RE: FYI/comp.programming.threads/Re: pthread_cond_* implementatio - n questions - -Sorry all. Busy week. - -> this insures the fairness -> which POSIX does not (e.g. two subsequent broadcasts - the gate does -insure -> that first wave waiters will start the race for the mutex before waiters -> from the second wave - Linux pthreads process/unblock both waves -> concurrently...) - -I'm not sure how we are any more fair about this than Linux. We certainly -don't guarantee that the threads released by the first broadcast will get -the external mutex before the threads of the second wave. In fact, it is -possible that those threads will never get the external mutex if there is -enough contention for it. - -> e.g. i was thinking about implementation with a pool of -> N semaphores/counters [...] - -I considered that too. The problem is as you mentioned in a). You really -need to assign threads to semaphores once you know how you want to wake -them -up, not when they first begin waiting which is the only time you can assign -them. - -> well, i am not quite sure that i've fully understood your scenario, - -Hmm. Well, it think it's an important example, so I'll try again. First, we -have thread A which we KNOW is waiting on a condition. As soon as it -becomes -unblocked for any reason, we will know because it will set a flag. Since -the -flag is not set, we are 100% confident that thread A is waiting on the -condition. We have another thread, thread B, which has acquired the mutex -and is about to wait on the condition. Thus it is pretty clear that at any -point, either just A is waiting, or A and B are waiting. Now thread C comes -along. C is about to do a broadcast on the condition. A broadcast is -guaranteed to unblock all threads currently waiting on a condition, right? -Again, we said that either just A is waiting, or A and B are both waiting. -So, when C does its broadcast, depending upon whether B has started waiting -or not, thread C will unblock A or unblock A and B. Either way, C must -unblock A, right? - -Now, you said anything that happens is correct so long as a) "a signal is -not lost between unlocking the mutex and waiting on the condition" and b) -"a -thread must not steal a signal it sent", correct? Requirement b) is easy to -satisfy: in this scenario, thread C will never wait on the condition, so it -won't steal any signals. Requirement a) is not hard either. The only way -we -could fail to meet requirement a) in this scenario is if thread B was -started waiting but didn't wake up because a signal was lost. This will not -happen. - -Now, here is what happens. Assume thread C beats thread B. Thread C looks -to -see how many threads are waiting on the condition. Thread C sees just one -thread, thread A, waiting. It does a broadcast waking up just one thread -because just one thread is waiting. Next, before A can become unblocked, -thread B begins waiting. Now there are two threads waiting, but only one -will be unblocked. Suppose B wins. B will become unblocked. A will not -become unblocked, because C only unblocked one thread (sema_post cond, 1). -So at the end, B finishes and A remains blocked. - -We have met both of your requirements, so by your rules, this is an -acceptable outcome. However, I think that the spec says this is an -unacceptable outcome! We know for certain that A was waiting and that C did -a broadcast, but A did not become unblocked! Yet, the spec says that a -broadcast wakes up all waiting threads. This did not happen. Do you agree -that this shows your rules are not strict enough? - -> and what about N2? :) this one does allow almost everything. - -Don't get me started about rule #2. I'll NEVER advocate an algorithm that -uses rule 2 as an excuse to suck! - -> but it is done (decrement)under mutex protection - this is not a subject -> of a race condition. - -You are correct. My mistake. - -> i would remove "_bTimedOut=false".. after all, it was a real timeout.. - -I disagree. A thread that can't successfully retract its waiter status -can't -really have timed out. If a thread can't return without executing extra -code -to deal with the fact that someone tried to unblock it, I think it is a -poor -idea to pretend we -didn't realize someone was trying to signal us. After all, a signal is more -important than a time out. - -> when nSignaled != 0, it is possible to update nWaiters (--) and do not -> touch nGone - -I realize this, but I was thinking that writing it the other ways saves -another if statement. - -> adjust only if nGone != 0 and save one cache memory write - probably much -slower than 'if' - -Hmm. You are probably right. - -> well, in a strange (e.g. timeout test) program you may (theoretically) -> have an overflow of nWaiters/nGone counters (with waiters repeatedly -timing -> out and no signals at all). - -Also true. Not only that, but you also have the possibility that one could -overflow the number of waiters as well! However, considering the limit you -have chosen for nWaitersGone, I suppose it is unlikely that anyone would be -able to get INT_MAX/2 threads waiting on a single condition. :) - -Analysis of 8a: - -It looks correct to me. - -What are IPC semaphores? - -In the line where you state, "else if ( nWaitersBlocked > nWaitersGone ) { -// HARMLESS RACE CONDITION!" there is no race condition for nWaitersGone -because nWaitersGone is never modified without holding mtxUnblockLock. You -are correct that there is a harmless race on nWaitersBlocked, which can -increase and make the condition become true just after we check it. If this -happens, we interpret it as the wait starting after the signal. - -I like your optimization of this. You could improve Alg. 6 as follows: ----------- Algorithm 6b ---------- -signal(bAll) { - _nSig=0 - lock counters - // this is safe because nWaiting can only be decremented by a thread that - // owns counters and nGone can only be changed by a thread that owns -counters. - if (nWaiting>nGone) { - if (0==nSignaled) { - sema_wait gate // close gate if not already closed - } - if (nGone>0) { - nWaiting-=nGone - nGone=0 - } - _nSig=bAll?nWaiting:1 - nSignaled+=_nSig - nWaiting-=_nSig - } - unlock counters - if (0!=_nSig) { - sema_post queue, _nSig - } -} ----------- ---------- ---------- -I guess this wouldn't apply to Alg 8a because nWaitersGone changes meanings -depending upon whether the gate is open or closed. - -In the loop "while ( nWaitersWasGone-- ) {" you do a sema_wait on -semBlockLock. Perhaps waiting on semBlockQueue would be a better idea. - -What have you gained by making the last thread to be signaled do the waits -for all the timed out threads, besides added complexity? It took me a long -time to figure out what your objective was with this, to realize you were -using nWaitersGone to mean two different things, and to verify that you -hadn't introduced any bug by doing this. Even now I'm not 100% sure. - -What has all this playing about with nWaitersGone really gained us besides -a -lot of complexity (it is much harder to verify that this solution is -correct), execution overhead (we now have a lot more if statements to -evaluate), and space overhead (more space for the extra code, and another -integer in our data)? We did manage to save a lock/unlock pair in an -uncommon case (when a time out occurs) at the above mentioned expenses in -the common cases. - -As for 8b, c, and d, they look ok though I haven't studied them thoroughly. -What would you use them for? - - Later, - -Louis! :) - diff --git a/software/src/lib/pthread/README.NONPORTABLE b/software/src/lib/pthread/README.NONPORTABLE deleted file mode 100644 index 9bdc445..0000000 --- a/software/src/lib/pthread/README.NONPORTABLE +++ /dev/null @@ -1,783 +0,0 @@ -This file documents non-portable functions and other issues. - -Non-portable functions included in pthreads-win32 -------------------------------------------------- - -BOOL -pthread_win32_test_features_np(int mask) - - This routine allows an application to check which - run-time auto-detected features are available within - the library. - - The possible features are: - - PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE - Return TRUE if the native version of - InterlockedCompareExchange() is being used. - This feature is not meaningful in recent - library versions as MSVC builds only support - system implemented ICE. Note that all Mingw - builds use inlined asm versions of all the - Interlocked routines. - PTW32_ALERTABLE_ASYNC_CANCEL - Return TRUE is the QueueUserAPCEx package - QUSEREX.DLL is available and the AlertDrv.sys - driver is loaded into Windows, providing - alertable (pre-emptive) asyncronous threads - cancelation. If this feature returns FALSE - then the default async cancel scheme is in - use, which cannot cancel blocked threads. - - Features may be Or'ed into the mask parameter, in which case - the routine returns TRUE if any of the Or'ed features would - return TRUE. At this stage it doesn't make sense to Or features - but it may some day. - - -void * -pthread_timechange_handler_np(void *) - - To improve tolerance against operator or time service - initiated system clock changes. - - This routine can be called by an application when it - receives a WM_TIMECHANGE message from the system. At - present it broadcasts all condition variables so that - waiting threads can wake up and re-evaluate their - conditions and restart their timed waits if required. - - It has the same return type and argument type as a - thread routine so that it may be called directly - through pthread_create(), i.e. as a separate thread. - - Parameters - - Although a parameter must be supplied, it is ignored. - The value NULL can be used. - - Return values - - It can return an error EAGAIN to indicate that not - all condition variables were broadcast for some reason. - Otherwise, 0 is returned. - - If run as a thread, the return value is returned - through pthread_join(). - - The return value should be cast to an integer. - - -HANDLE -pthread_getw32threadhandle_np(pthread_t thread); - - Returns the win32 thread handle that the POSIX - thread "thread" is running as. - - Applications can use the win32 handle to set - win32 specific attributes of the thread. - -DWORD -pthread_getw32threadid_np (pthread_t thread) - - Returns the Windows native thread ID that the POSIX - thread "thread" is running as. - - Only valid when the library is built where - ! (defined(__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) || defined (__DMC__) - and otherwise returns 0. - - -int -pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, int kind) - -int -pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, int *kind) - - These two routines are included for Linux compatibility - and are direct equivalents to the standard routines - pthread_mutexattr_settype - pthread_mutexattr_gettype - - pthread_mutexattr_setkind_np accepts the following - mutex kinds: - PTHREAD_MUTEX_FAST_NP - PTHREAD_MUTEX_ERRORCHECK_NP - PTHREAD_MUTEX_RECURSIVE_NP - - These are really just equivalent to (respectively): - PTHREAD_MUTEX_NORMAL - PTHREAD_MUTEX_ERRORCHECK - PTHREAD_MUTEX_RECURSIVE - -int -pthread_delay_np (const struct timespec *interval); - - This routine causes a thread to delay execution for a specific period of time. - This period ends at the current time plus the specified interval. The routine - will not return before the end of the period is reached, but may return an - arbitrary amount of time after the period has gone by. This can be due to - system load, thread priorities, and system timer granularity. - - Specifying an interval of zero (0) seconds and zero (0) nanoseconds is - allowed and can be used to force the thread to give up the processor or to - deliver a pending cancelation request. - - This routine is a cancelation point. - - The timespec structure contains the following two fields: - - tv_sec is an integer number of seconds. - tv_nsec is an integer number of nanoseconds. - - Return Values - - If an error condition occurs, this routine returns an integer value - indicating the type of error. Possible return values are as follows: - - 0 Successful completion. - [EINVAL] The value specified by interval is invalid. - -int -pthread_num_processors_np (void) - - This routine (found on HPUX systems) returns the number of processors - in the system. This implementation actually returns the number of - processors available to the process, which can be a lower number - than the system's number, depending on the process's affinity mask. - -BOOL -pthread_win32_process_attach_np (void); - -BOOL -pthread_win32_process_detach_np (void); - -BOOL -pthread_win32_thread_attach_np (void); - -BOOL -pthread_win32_thread_detach_np (void); - - These functions contain the code normally run via dllMain - when the library is used as a dll but which need to be - called explicitly by an application when the library - is statically linked. As of version 2.9.0 of the library, static - builds using either MSC or GCC will call pthread_win32_process_* - automatically at application startup and exit respectively. - - Otherwise, you will need to call pthread_win32_process_attach_np() - before you can call any pthread routines when statically linking. - You should call pthread_win32_process_detach_np() before - exiting your application to clean up. - - pthread_win32_thread_attach_np() is currently a no-op, but - pthread_win32_thread_detach_np() is needed to clean up - the implicit pthread handle that is allocated to a Win32 thread if - it calls any pthreads routines. Call this routine when the - Win32 thread exits. - - Threads created through pthread_create() do not need to call - pthread_win32_thread_detach_np(). - - These functions invariably return TRUE except for - pthread_win32_process_attach_np() which will return FALSE - if pthreads-win32 initialisation fails. - -int -pthreadCancelableWait (HANDLE waitHandle); - -int -pthreadCancelableTimedWait (HANDLE waitHandle, DWORD timeout); - - These two functions provide hooks into the pthread_cancel - mechanism that will allow you to wait on a Windows handle - and make it a cancellation point. Both functions block - until either the given w32 handle is signaled, or - pthread_cancel has been called. It is implemented using - WaitForMultipleObjects on 'waitHandle' and a manually - reset w32 event used to implement pthread_cancel. - - -Non-portable issues -------------------- - -Thread priority - - POSIX defines a single contiguous range of numbers that determine a - thread's priority. Win32 defines priority classes and priority - levels relative to these classes. Classes are simply priority base - levels that the defined priority levels are relative to such that, - changing a process's priority class will change the priority of all - of it's threads, while the threads retain the same relativity to each - other. - - A Win32 system defines a single contiguous monotonic range of values - that define system priority levels, just like POSIX. However, Win32 - restricts individual threads to a subset of this range on a - per-process basis. - - The following table shows the base priority levels for combinations - of priority class and priority value in Win32. - - Process Priority Class Thread Priority Level - ----------------------------------------------------------------- - 1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - 15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - 15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - 15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - 15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE - 17 REALTIME_PRIORITY_CLASS -7 - 18 REALTIME_PRIORITY_CLASS -6 - 19 REALTIME_PRIORITY_CLASS -5 - 20 REALTIME_PRIORITY_CLASS -4 - 21 REALTIME_PRIORITY_CLASS -3 - 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST - 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL - 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL - 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL - 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST - 27 REALTIME_PRIORITY_CLASS 3 - 28 REALTIME_PRIORITY_CLASS 4 - 29 REALTIME_PRIORITY_CLASS 5 - 30 REALTIME_PRIORITY_CLASS 6 - 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL - - Windows NT: Values -7, -6, -5, -4, -3, 3, 4, 5, and 6 are not supported. - - - As you can see, the real priority levels available to any individual - Win32 thread are non-contiguous. - - An application using pthreads-win32 should not make assumptions about - the numbers used to represent thread priority levels, except that they - are monotonic between the values returned by sched_get_priority_min() - and sched_get_priority_max(). E.g. Windows 95, 98, NT, 2000, XP make - available a non-contiguous range of numbers between -15 and 15, while - at least one version of WinCE (3.0) defines the minimum priority - (THREAD_PRIORITY_LOWEST) as 5, and the maximum priority - (THREAD_PRIORITY_HIGHEST) as 1. - - Internally, pthreads-win32 maps any priority levels between - THREAD_PRIORITY_IDLE and THREAD_PRIORITY_LOWEST to THREAD_PRIORITY_LOWEST, - or between THREAD_PRIORITY_TIME_CRITICAL and THREAD_PRIORITY_HIGHEST to - THREAD_PRIORITY_HIGHEST. Currently, this also applies to - REALTIME_PRIORITY_CLASSi even if levels -7, -6, -5, -4, -3, 3, 4, 5, and 6 - are supported. - - If it wishes, a Win32 application using pthreads-win32 can use the Win32 - defined priority macros THREAD_PRIORITY_IDLE through - THREAD_PRIORITY_TIME_CRITICAL. - - -The opacity of the pthread_t datatype -------------------------------------- -and possible solutions for portable null/compare/hash, etc ----------------------------------------------------------- - -Because pthread_t is an opague datatype an implementation is permitted to define -pthread_t in any way it wishes. That includes defining some bits, if it is -scalar, or members, if it is an aggregate, to store information that may be -extra to the unique identifying value of the ID. As a result, pthread_t values -may not be directly comparable. - -If you want your code to be portable you must adhere to the following contraints: - -1) Don't assume it is a scalar data type, e.g. an integer or pointer value. There -are several other implementations where pthread_t is also a struct. See our FAQ -Question 11 for our reasons for defining pthread_t as a struct. - -2) You must not compare them using relational or equality operators. You must use -the API function pthread_equal() to test for equality. - -3) Never attempt to reference individual members. - - -The problem - -Certain applications would like to be able to access only the 'pure' pthread_t -id values, primarily to use as keys into data structures to manage threads or -thread-related data, but this is not possible in a maximally portable and -standards compliant way for current POSIX threads implementations. - -For implementations that define pthread_t as a scalar, programmers often employ -direct relational and equality operators on pthread_t. This code will break when -ported to an implementation that defines pthread_t as an aggregate type. - -For implementations that define pthread_t as an aggregate, e.g. a struct, -programmers can use memcmp etc., but then face the prospect that the struct may -include alignment padding bytes or bits as well as extra implementation-specific -members that are not part of the unique identifying value. - -[While this is not currently the case for pthreads-win32, opacity also -means that an implementation is free to change the definition, which should -generally only require that applications be recompiled and relinked, not -rewritten.] - - -Doesn't the compiler take care of padding? - -The C89 and later standards only effectively guarrantee element-by-element -equivalence following an assignment or pass by value of a struct or union, -therefore undefined areas of any two otherwise equivalent pthread_t instances -can still compare differently, e.g. attempting to compare two such pthread_t -variables byte-by-byte, e.g. memcmp(&t1, &t2, sizeof(pthread_t) may give an -incorrect result. In practice I'm reasonably confident that compilers routinely -also copy the padding bytes, mainly because assignment of unions would be far -too complicated otherwise. But it just isn't guarranteed by the standard. - -Illustration: - -We have two thread IDs t1 and t2 - -pthread_t t1, t2; - -In an application we create the threads and intend to store the thread IDs in an -ordered data structure (linked list, tree, etc) so we need to be able to compare -them in order to insert them initially and also to traverse. - -Suppose pthread_t contains undefined padding bits and our compiler copies our -pthread_t [struct] element-by-element, then for the assignment: - -pthread_t temp = t1; - -temp and t1 will be equivalent and correct but a byte-for-byte comparison such as -memcmp(&temp, &t1, sizeof(pthread_t)) == 0 may not return true as we expect because -the undefined bits may not have the same values in the two variable instances. - -Similarly if passing by value under the same conditions. - -If, on the other hand, the undefined bits are at least constant through every -assignment and pass-by-value then the byte-for-byte comparison -memcmp(&temp, &t1, sizeof(pthread_t)) == 0 will always return the expected result. -How can we force the behaviour we need? - - -Solutions - -Adding new functions to the standard API or as non-portable extentions is -the only reliable and portable way to provide the necessary operations. -Remember also that POSIX is not tied to the C language. The most common -functions that have been suggested are: - -pthread_null() -pthread_compare() -pthread_hash() - -A single more general purpose function could also be defined as a -basis for at least the last two of the above functions. - -First we need to list the freedoms and constraints with restpect -to pthread_t so that we can be sure our solution is compatible with the -standard. - -What is known or may be deduced from the standard: -1) pthread_t must be able to be passed by value, so it must be a single object. -2) from (1) it must be copyable so cannot embed thread-state information, locks -or other volatile objects required to manage the thread it associates with. -3) pthread_t may carry additional information, e.g. for debugging or to manage -itself. -4) there is an implicit requirement that the size of pthread_t is determinable -at compile-time and size-invariant, because it must be able to copy the object -(i.e. through assignment and pass-by-value). Such copies must be genuine -duplicates, not merely a copy of a pointer to a common instance such as -would be the case if pthread_t were defined as an array. - - -Suppose we define the following function: - -/* This function shall return it's argument */ -pthread_t* pthread_normalize(pthread_t* thread); - -For scalar or aggregate pthread_t types this function would simply zero any bits -within the pthread_t that don't uniquely identify the thread, including padding, -such that client code can return consistent results from operations done on the -result. If the additional bits are a pointer to an associate structure then -this function would ensure that the memory used to store that associate -structure does not leak. After normalization the following compare would be -valid and repeatable: - -memcmp(pthread_normalize(&t1),pthread_normalize(&t2),sizeof(pthread_t)) - -Note 1: such comparisons are intended merely to order and sort pthread_t values -and allow them to index various data structures. They are not intended to reveal -anything about the relationships between threads, like startup order. - -Note 2: the normalized pthread_t is also a valid pthread_t that uniquely -identifies the same thread. - -Advantages: -1) In most existing implementations this function would reduce to a no-op that -emits no additional instructions, i.e after in-lining or optimisation, or if -defined as a macro: -#define pthread_normalise(tptr) (tptr) - -2) This single function allows an application to portably derive -application-level versions of any of the other required functions. - -3) It is a generic function that could enable unanticipated uses. - -Disadvantages: -1) Less efficient than dedicated compare or hash functions for implementations -that include significant extra non-id elements in pthread_t. - -2) Still need to be concerned about padding if copying normalized pthread_t. -See the later section on defining pthread_t to neutralise padding issues. - -Generally a pthread_t may need to be normalized every time it is used, -which could have a significant impact. However, this is a design decision -for the implementor in a competitive environment. An implementation is free -to define a pthread_t in a way that minimises or eliminates padding or -renders this function a no-op. - -Hazards: -1) Pass-by-reference directly modifies 'thread' so the application must -synchronise access or ensure that the pointer refers to a copy. The alternative -of pass-by-value/return-by-value was considered but then this requires two copy -operations, disadvantaging implementations where this function is not a no-op -in terms of speed of execution. This function is intended to be used in high -frequency situations and needs to be efficient, or at least not unnecessarily -inefficient. The alternative also sits awkwardly with functions like memcmp. - -2) [Non-compliant] code that uses relational and equality operators on -arithmetic or pointer style pthread_t types would need to be rewritten, but it -should be rewritten anyway. - - -C implementation of null/compare/hash functions using pthread_normalize(): - -/* In pthread.h */ -pthread_t* pthread_normalize(pthread_t* thread); - -/* In user code */ -/* User-level bitclear function - clear bits in loc corresponding to mask */ -void* bitclear (void* loc, void* mask, size_t count); - -typedef unsigned int hash_t; - -/* User-level hash function */ -hash_t hash(void* ptr, size_t count); - -/* - * User-level pthr_null function - modifies the origin thread handle. - * The concept of a null pthread_t is highly implementation dependent - * and this design may be far from the mark. For example, in an - * implementation "null" may mean setting a special value inside one - * element of pthread_t to mean "INVALID". However, if that value was zero and - * formed part of the id component then we may get away with this design. - */ -pthread_t* pthr_null(pthread_t* tp) -{ - /* - * This should have the same effect as memset(tp, 0, sizeof(pthread_t)) - * We're just showing that we can do it. - */ - void* p = (void*) pthread_normalize(tp); - return (pthread_t*) bitclear(p, p, sizeof(pthread_t)); -} - -/* - * Safe user-level pthr_compare function - modifies temporary thread handle copies - */ -int pthr_compare_safe(pthread_t thread1, pthread_t thread2) -{ - return memcmp(pthread_normalize(&thread1), pthread_normalize(&thread2), sizeof(pthread_t)); -} - -/* - * Fast user-level pthr_compare function - modifies origin thread handles - */ -int pthr_compare_fast(pthread_t* thread1, pthread_t* thread2) -{ - return memcmp(pthread_normalize(&thread1), pthread_normalize(&thread2), sizeof(pthread_t)); -} - -/* - * Safe user-level pthr_hash function - modifies temporary thread handle copy - */ -hash_t pthr_hash_safe(pthread_t thread) -{ - return hash((void *) pthread_normalize(&thread), sizeof(pthread_t)); -} - -/* - * Fast user-level pthr_hash function - modifies origin thread handle - */ -hash_t pthr_hash_fast(pthread_t thread) -{ - return hash((void *) pthread_normalize(&thread), sizeof(pthread_t)); -} - -/* User-level bitclear function - modifies the origin array */ -void* bitclear(void* loc, void* mask, size_t count) -{ - int i; - for (i=0; i < count; i++) { - (unsigned char) *loc++ &= ~((unsigned char) *mask++); - } -} - -/* Donald Knuth hash */ -hash_t hash(void* str, size_t count) -{ - hash_t hash = (hash_t) count; - unsigned int i = 0; - - for(i = 0; i < len; str++, i++) - { - hash = ((hash << 5) ^ (hash >> 27)) ^ (*str); - } - return hash; -} - -/* Example of advantage point (3) - split a thread handle into its id and non-id values */ -pthread_t id = thread, non-id = thread; -bitclear((void*) &non-id, (void*) pthread_normalize(&id), sizeof(pthread_t)); - - -A pthread_t type change proposal to neutralise the effects of padding - -Even if pthread_nornalize() is available, padding is still a problem because -the standard only garrantees element-by-element equivalence through -copy operations (assignment and pass-by-value). So padding bit values can -still change randomly after calls to pthread_normalize(). - -[I suspect that most compilers take the easy path and always byte-copy anyway, -partly because it becomes too complex to do (e.g. unions that contain sub-aggregates) -but also because programmers can easily design their aggregates to minimise and -often eliminate padding]. - -How can we eliminate the problem of padding bytes in structs? Could -defining pthread_t as a union rather than a struct provide a solution? - -In fact, the Linux pthread.h defines most of it's pthread_*_t objects (but not -pthread_t itself) as unions, possibly for this and/or other reasons. We'll -borrow some element naming from there but the ideas themselves are well known -- the __align element used to force alignment of the union comes from K&R's -storage allocator example. - -/* Essentially our current pthread_t renamed */ -typedef struct { - struct thread_state_t * __p; - long __x; /* sequence counter */ -} thread_id_t; - -Ensuring that the last element in the above struct is a long ensures that the -overall struct size is a multiple of sizeof(long), so there should be no trailing -padding in this struct or the union we define below. -(Later we'll see that we can handle internal but not trailing padding.) - -/* New pthread_t */ -typedef union { - char __size[sizeof(thread_id_t)]; /* array as the first element */ - thread_id_t __tid; - long __align; /* Ensure that the union starts on long boundary */ -} pthread_t; - -This guarrantees that, during an assignment or pass-by-value, the compiler copies -every byte in our thread_id_t because the compiler guarrantees that the __size -array, which we have ensured is the equal-largest element in the union, retains -equivalence. - -This means that pthread_t values stored, assigned and passed by value will at least -carry the value of any undefined padding bytes along and therefore ensure that -those values remain consistent. Our comparisons will return consistent results and -our hashes of [zero initialised] pthread_t values will also return consistent -results. - -We have also removed the need for a pthread_null() function; we can initialise -at declaration time or easily create our own const pthread_t to use in assignments -later: - -const pthread_t null_tid = {0}; /* braces are required */ - -pthread_t t; -... -t = null_tid; - - -Note that we don't have to explicitly make use of the __size array at all. It's -there just to force the compiler behaviour we want. - - -Partial solutions without a pthread_normalize function - - -An application-level pthread_null and pthread_compare proposal -(and pthread_hash proposal by extention) - -In order to deal with the problem of scalar/aggregate pthread_t type disparity in -portable code I suggest using an old-fashioned union, e.g.: - -Contraints: -- there is no padding, or padding values are preserved through assignment and - pass-by-value (see above); -- there are no extra non-id values in the pthread_t. - - -Example 1: A null initialiser for pthread_t variables... - -typedef union { - unsigned char b[sizeof(pthread_t)]; - pthread_t t; -} init_t; - -const init_t initial = {0}; - -pthread_t tid = initial.t; /* init tid to all zeroes */ - - -Example 2: A comparison function for pthread_t values - -typedef union { - unsigned char b[sizeof(pthread_t)]; - pthread_t t; -} pthcmp_t; - -int pthcmp(pthread_t left, pthread_t right) -{ - /* - * Compare two pthread handles in a way that imposes a repeatable but arbitrary - * ordering on them. - * I.e. given the same set of pthread_t handles the ordering should be the same - * each time but the order has no particular meaning other than that. E.g. - * the ordering does not imply the thread start sequence, or any other - * relationship between threads. - * - * Return values are: - * 1 : left is greater than right - * 0 : left is equal to right - * -1 : left is less than right - */ - int i; - pthcmp_t L, R; - L.t = left; - R.t = right; - for (i = 0; i < sizeof(pthread_t); i++) - { - if (L.b[i] > R.b[i]) - return 1; - else if (L.b[i] < R.b[i]) - return -1; - } - return 0; -} - -It has been pointed out that the C99 standard allows for the possibility that -integer types also may include padding bits, which could invalidate the above -method. This addition to C99 was specifically included after it was pointed -out that there was one, presumably not particularly well known, architecture -that included a padding bit in it's 32 bit integer type. See section 6.2.6.2 -of both the standard and the rationale, specifically the paragraph starting at -line 16 on page 43 of the rationale. - - -An aside - -Certain compilers, e.g. gcc and one of the IBM compilers, include a feature -extention: provided the union contains a member of the same type as the -object then the object may be cast to the union itself. - -We could use this feature to speed up the pthrcmp() function from example 2 -above by casting rather than assigning the pthread_t arguments to the union, e.g.: - -int pthcmp(pthread_t left, pthread_t right) -{ - /* - * Compare two pthread handles in a way that imposes a repeatable but arbitrary - * ordering on them. - * I.e. given the same set of pthread_t handles the ordering should be the same - * each time but the order has no particular meaning other than that. E.g. - * the ordering does not imply the thread start sequence, or any other - * relationship between threads. - * - * Return values are: - * 1 : left is greater than right - * 0 : left is equal to right - * -1 : left is less than right - */ - int i; - for (i = 0; i < sizeof(pthread_t); i++) - { - if (((pthcmp_t)left).b[i] > ((pthcmp_t)right).b[i]) - return 1; - else if (((pthcmp_t)left).b[i] < ((pthcmp_t)right).b[i]) - return -1; - } - return 0; -} - - -Result thus far - -We can't remove undefined bits if they are there in pthread_t already, but we have -attempted to render them inert for comparison and hashing functions by making them -consistent through assignment, copy and pass-by-value. - -Note: Hashing pthread_t values requires that all pthread_t variables be initialised -to the same value (usually all zeros) before being assigned a proper thread ID, i.e. -to ensure that any padding bits are zero, or at least the same value for all -pthread_t. Since all pthread_t values are generated by the library in the first -instance this need not be an application-level operation. - - -Conclusion - -I've attempted to resolve the multiple issues of type opacity and the possible -presence of undefined bits and bytes in pthread_t values, which prevent -applications from comparing or hashing pthread handles. - -Two complimentary partial solutions have been proposed, one an application-level -scheme to handle both scalar and aggregate pthread_t types equally, plus a -definition of pthread_t itself that neutralises padding bits and bytes by -coercing semantics out of the compiler to eliminate variations in the values of -padding bits. - -I have not provided any solution to the problem of handling extra values embedded -in pthread_t, e.g. debugging or trap information that an implementation is entitled -to include. Therefore none of this replaces the portability and flexibility of API -functions but what functions are needed? The threads standard is unlikely to -include that can be implemented by a combination of existing features and more -generic functions (several references in the threads rationale suggest this. -Therefore I propose that the following function could replace the several functions -that have been suggested in conversations: - -pthread_t * pthread_normalize(pthread_t * handle); - -For most existing pthreads implementations this function, or macro, would reduce to -a no-op with zero call overhead. diff --git a/software/src/lib/pthread/README.Watcom b/software/src/lib/pthread/README.Watcom deleted file mode 100644 index 2974928..0000000 --- a/software/src/lib/pthread/README.Watcom +++ /dev/null @@ -1,62 +0,0 @@ -Watcom compiler notes -===================== - -Status ------- -Not yet usable. Although the library builds under Watcom it -substantially fails the test suite. - -There is a working Wmakefile for wmake for the library build. - -invoke as any of: -wmake -f Wmakefile clean WC -wmake -f Wmakefile clean WC-inlined -wmake -f Wmakefile clean WCE -wmake -f Wmakefile clean WCE-inlined - -These build pthreadWC.dll and pthreadWCE.dll. - -There is a working Wmakefile for wmake for the test suite. - -invoke as any of: -wmake -f Wmakefile clean WC -wmake -f Wmakefile clean WCX -wmake -f Wmakefile clean WCE -wmake -f Wmakefile clean WC-bench -wmake -f Wmakefile clean WCX-bench -wmake -f Wmakefile clean WCE-bench - - -Current known problems ----------------------- - -Library build: -The Watcom compiler uses a different default call convention to MS C or GNU C and so -applications are not compatible with pthreadVC.dll etc using pre 2003-10-14 versions -of pthread.h, sched.h, or semaphore.h. The cdecl attribute can be used on exposed -function prototypes to force compatibility with MS C built DLLs. - -However, there appear to be other incompatibilities. Errno.h, for example, defines -different values for the standard C and POSIX errors to those defined by the MS C -errno.h. It may be that references to Watcom's threads compatible 'errno' do set -and return translated numbers consistently, but I have not verified this. - -Watcom defines errno as a dereferenced pointer returned by the function -_get_errno_ptr(). This is similar to both the MS and GNU C environments for -multithreaded use. However, the Watcom version appears to have a number of problems: - -- different threads return the same pointer value. Compare with the MS and GNU C -versions which correctly return different values (since each thread must maintain -a thread specific errno value). - -- an errno value set within the DLL appears as zero in the application even though -both share the same thread. - -Therefore applications built using the Watcom compiler may need to use -a Watcom built version of the library (pthreadWC.dll). If this is the case, then -the cdecl function attribute should not be required. - -Application builds: -The test suite fails with the Watcom compiler. - -Test semaphore1.c fails for pthreadWC.dll because errno returns 0 instead of EAGAIN. diff --git a/software/src/lib/pthread/README.WinCE b/software/src/lib/pthread/README.WinCE deleted file mode 100644 index a2cd8c2..0000000 --- a/software/src/lib/pthread/README.WinCE +++ /dev/null @@ -1,6 +0,0 @@ -WinCE port ----------- -(See the file WinCE-PORT for a detailed explanation.) - -Make sure you define "WINCE" amongst your compiler flags (eg. -DWINCE). -The config.h file will define all the necessary defines for you. diff --git a/software/src/lib/pthread/WinCE-PORT b/software/src/lib/pthread/WinCE-PORT deleted file mode 100644 index 7bcfdea..0000000 --- a/software/src/lib/pthread/WinCE-PORT +++ /dev/null @@ -1,222 +0,0 @@ -NOTE: The comments in this file relate to the original WinCE port -done by Tristan Savatier. The semaphore routines have been -completely rewritten since (2005-04-25), having been progressively -broken more and more by changes to the library. All of the semaphore -routines implemented for W9x/WNT/2000 and up should now also work for -WinCE. Also, pthread_mutex_timedlock should now work. - -Additional WinCE updates have been applied since this as well. Check the -ChangeLog file and search for WINCE for example. (2007-01-07) - -[RPJ] - ----- - -Some interesting news: - -I have been able to port pthread-win32 to Windows-CE, -which uses a subset of the WIN32 API. - -Since we intend to keep using pthread-win32 for our -Commercial WinCE developments, I would be very interested -if WinCE support could be added to the main source tree -of pthread-win32. Also, I would like to be credited -for this port :-) - -Now, here is the story... - -The port was performed and tested on a Casio "Cassiopeia" -PalmSize PC, which runs a MIP processor. The OS in the -Casio is WinCE version 2.11, but I used VC++ 6.0 with -the WinCE SDK for version 2.01. - -I used pthread-win32 to port a heavily multithreaded -commercial application (real-time MPEG video player) -from Linux to WinCE. I consider the changes that -I have done to be quite well tested. - -Overall the modifications that we had to do are minor. - -The WinCE port were based on pthread-win32-snap-1999-05-30, -but I am certain that they can be integrated very easiely -to more recent versions of the source. - -I have attached the modified source code: -pthread-win32-snap-1999-05-30-WinCE. - -All the changes do not affect the code compiled on non-WinCE -environment, provided that the macros used for WinCE compilation -are not used, of course! - -Overall description of the WinCE port: -------------------------------------- - -Most of the changes had to be made in areas where -pthread-win32 was relying on some standard-C librairies -(e.g. _ftime, calloc, errno), which are not available -on WinCE. We have changed the code to use native Win32 -API instead (or in some cases we made wrappers). - -The Win32 Semaphores are not available, -so we had to re-implement Semaphores using mutexes -and events. - -Limitations / known problems of the WinCE port: ----------------------------------------------- - -Not all the semaphore routines have been ported -(semaphores are defined by Posix but are not part -pf pthread). I have just done enough to make -pthread routines (that rely internally on semaphores) -work, like signal conditions. - -I noticed that the Win32 threads work slightly -differently on WinCE. This may have some impact -on some tricky parts of pthread-win32, but I have -not really investigated. For example, on WinCE, -the process is killed if the main thread falls off -the bottom (or calls pthread_exit), regardless -of the existence of any other detached thread. -Microsoft manual indicates that this behavior is -deffirent from that of Windows Threads for other -Win32 platforms. - - -Detailed descriptions of the changes and rationals: - ------------------------------------- -- use a new macro NEED_ERRNO. - -If defined, the code in errno.c that defines a reentrant errno -is compiled, regardless of _MT and _REENTRANT. - -Rational: On WinCE, there is no support for , or -any other standard C library, i.e. even if _MT or _REENTRANT -is defined, errno is not provided by any library. NEED_ERRNO -must be set to compile for WinCE. - ------------------------------------- -- In implement.h, change #include to #include "semaphore.h". - -Rational: semaphore.h is provided in pthread-win32 and should not -be searched in the systems standard include. would not compile. -This change does not seem to create problems on "classic" win32 -(e.g. win95). - ------------------------------------- -- use a new macro NEED_CALLOC. - -If defined, some code in misc.c will provide a replacement -for calloc, which is not available on Win32. - - ------------------------------------- -- use a new macro NEED_CREATETHREAD. - -If defined, implement.h defines the macro _beginthreadex -and _endthreadex. - -Rational: On WinCE, the wrappers _beginthreadex and _endthreadex -do not exist. The native Win32 routines must be used. - ------------------------------------- -- in misc.c: - -#ifdef NEED_DUPLICATEHANDLE - /* DuplicateHandle does not exist on WinCE */ - self->threadH = GetCurrentThread(); -#else - if( !DuplicateHandle( - GetCurrentProcess(), - GetCurrentThread(), - GetCurrentProcess(), - &self->threadH, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ) ) - { - free( self ); - return (NULL); - } -#endif - -Rational: On WinCE, DuplicateHandle does not exist. I could not understand -why DuplicateHandle must be used. It seems to me that getting the current -thread handle with GetCurrentThread() is sufficient, and it seems to work -perfectly fine, so maybe DuplicateHandle was just plain useless to begin with ? - ------------------------------------- -- In private.c, added some code at the beginning of ptw32_processInitialize -to detect the case of multiple calls to ptw32_processInitialize. - -Rational: In order to debug pthread-win32, it is easier to compile -it as a regular library (it is not possible to debug DLL's on winCE). -In that case, the application must call ptw32_rocessInitialize() -explicitely, to initialize pthread-win32. It is safer in this circumstance -to handle the case where ptw32_processInitialize() is called on -an already initialized library: - -int -ptw32_processInitialize (void) -{ - if (ptw32_processInitialized) { - /* - * ignore if already initialized. this is useful for - * programs that uses a non-dll pthread - * library. such programs must call ptw32_processInitialize() explicitely, - * since this initialization routine is automatically called only when - * the dll is loaded. - */ - return TRUE; - } - ptw32_processInitialized = TRUE; - [...] -} - ------------------------------------- -- in private.c, if macro NEED_FTIME is defined, add routines to -convert timespec_to_filetime and filetime_to_timespec, and modified -code that was using _ftime() to use Win32 API instead. - -Rational: _ftime is not available on WinCE. It is necessary to use -the native Win32 time API instead. - -Note: the routine timespec_to_filetime is provided as a convenience and a mean -to test that filetime_to_timespec works, but it is not used by the library. - ------------------------------------- -- in semaphore.c, if macro NEED_SEM is defined, add code for the routines -_increase_semaphore and _decrease_semaphore, and modify significantly -the implementation of the semaphores so that it does not use CreateSemaphore. - -Rational: CreateSemaphore is not available on WinCE. I had to re-implement -semaphores using mutexes and Events. - -Note: Only the semaphore routines that are used by pthread are implemented -(i.e. signal conditions rely on a subset of the semaphores routines, and -this subset works). Some other semaphore routines (e.g. sem_trywait) are -not yet supported on my WinCE port (and since I don't need them, I am not -planning to do anything about them). - ------------------------------------- -- in tsd.c, changed the code that defines TLS_OUT_OF_INDEXES - -/* TLS_OUT_OF_INDEXES not defined on WinCE */ -#ifndef TLS_OUT_OF_INDEXES -#define TLS_OUT_OF_INDEXES 0xffffffff -#endif - -Rational: TLS_OUT_OF_INDEXES is not defined in any standard include file -on WinCE. - ------------------------------------- -- added file need_errno.h - -Rational: On WinCE, there is no errno.h file. need_errno.h is just a -copy of windows version of errno.h, with minor modifications due to the fact -that some of the error codes are defined by the WinCE socket library. -In pthread.h, if NEED_ERRNO is defined, the file need_errno.h is -included (instead of ). - - --- eof diff --git a/software/src/lib/pthread/dll/x64/pthreadGC2.dll b/software/src/lib/pthread/dll/x64/pthreadGC2.dll deleted file mode 100644 index 841d4a21699017e835f330b3262e5b46e988a753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185976 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 J}M||3c48>`g<4{?!e3i#pe|s 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 KI_e>e5C8y!`p_K! diff --git a/software/src/lib/pthread/dll/x86/pthreadGC2.dll b/software/src/lib/pthread/dll/x86/pthreadGC2.dll deleted file mode 100644 index 67b9289dfd9f6f1ad12c1d137f4e57ad1a54271c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119888 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 D*YY=? diff --git a/software/src/lib/pthread/dll/x86/pthreadGCE2.dll b/software/src/lib/pthread/dll/x86/pthreadGCE2.dll deleted file mode 100644 index 9e18ea24b8b99b7de0998b4f2f2cebce93583edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121953 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 U{NSn(AhOV{1JJ}1k1fXl0MVbHO8@`> diff --git a/software/src/lib/pthread/dll/x86/pthreadVC2.dll b/software/src/lib/pthread/dll/x86/pthreadVC2.dll deleted file mode 100644 index fcb5d9dcc1c18b0be18845a34c3aaf0ae37be200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55808 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 RU~mA^2>_*+QB3s^007};Fuec( diff --git a/software/src/lib/pthread/dll/x86/pthreadVSE2.dll b/software/src/lib/pthread/dll/x86/pthreadVSE2.dll deleted file mode 100644 index 8129116fd41891ebbeccaef3422b1636b28f2b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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

l~oW 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 diff --git a/software/src/lib/pthread/include/pthread.h b/software/src/lib/pthread/include/pthread.h deleted file mode 100644 index 2f3e988..0000000 --- a/software/src/lib/pthread/include/pthread.h +++ /dev/null @@ -1,1362 +0,0 @@ -/* This is an implementation of the threads API of POSIX 1003.1-2001. - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#if !defined( PTHREAD_H ) -#define PTHREAD_H - -/* - * See the README file for an explanation of the pthreads-win32 version - * numbering scheme and how the DLL is named etc. - */ -#define PTW32_VERSION 2,9,1,0 -#define PTW32_VERSION_STRING "2, 9, 1, 0\0" - -/* There are three implementations of cancel cleanup. - * Note that pthread.h is included in both application - * compilation units and also internally for the library. - * The code here and within the library aims to work - * for all reasonable combinations of environments. - * - * The three implementations are: - * - * WIN32 SEH - * C - * C++ - * - * Please note that exiting a push/pop block via - * "return", "exit", "break", or "continue" will - * lead to different behaviour amongst applications - * depending upon whether the library was built - * using SEH, C++, or C. For example, a library built - * with SEH will call the cleanup routine, while both - * C++ and C built versions will not. - */ - -/* - * Define defaults for cleanup code. - * Note: Unless the build explicitly defines one of the following, then - * we default to standard C style cleanup. This style uses setjmp/longjmp - * in the cancelation and thread exit implementations and therefore won't - * do stack unwinding if linked to applications that have it (e.g. - * C++ apps). This is currently consistent with most/all commercial Unix - * POSIX threads implementations. - */ -#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) -# define __CLEANUP_C -#endif - -#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) -#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. -#endif - -/* - * Stop here if we are being included by the resource compiler. - */ -#if !defined(RC_INVOKED) - -#undef PTW32_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_LEVEL -#define PTW32_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_LEVEL -#define PTW32_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) -#define PTW32_LEVEL PTW32_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(_UWIN) -# define HAVE_STRUCT_TIMESPEC 1 -# define HAVE_SIGNAL_H 1 -# undef HAVE_PTW32_CONFIG_H -# pragma comment(lib, "pthread") -#endif - -/* - * ------------------------------------------------------------- - * - * - * Module: pthread.h - * - * Purpose: - * Provides an implementation of PThreads based upon the - * standard: - * - * POSIX 1003.1-2001 - * and - * The Single Unix Specification version 3 - * - * (these two are equivalent) - * - * in order to enhance code portability between Windows, - * various commercial Unix implementations, and Linux. - * - * See the ANNOUNCE file for a full list of conforming - * routines and defined constants, and a list of missing - * routines and constants not defined in this implementation. - * - * Authors: - * There have been many contributors to this library. - * The initial implementation was contributed by - * John Bossom, and several others have provided major - * sections or revisions of parts of the implementation. - * Often significant effort has been contributed to - * find and fix important bugs and other problems to - * improve the reliability of the library, which sometimes - * is not reflected in the amount of code which changed as - * result. - * As much as possible, the contributors are acknowledged - * in the ChangeLog file in the source code distribution - * where their changes are noted in detail. - * - * Contributors are listed in the CONTRIBUTORS file. - * - * As usual, all bouquets go to the contributors, and all - * brickbats go to the project maintainer. - * - * Maintainer: - * The code base for this project is coordinated and - * eventually pre-tested, packaged, and made available by - * - * Ross Johnson - * - * QA Testers: - * Ultimately, the library is tested in the real world by - * a host of competent and demanding scientists and - * engineers who report bugs and/or provide solutions - * which are then fixed or incorporated into subsequent - * versions of the library. Each time a bug is fixed, a - * test case is written to prove the fix and ensure - * that later changes to the code don't reintroduce the - * same error. The number of test cases is slowly growing - * and therefore so is the code reliability. - * - * Compliance: - * See the file ANNOUNCE for the list of implemented - * and not-implemented routines and defined options. - * Of course, these are all defined is this file as well. - * - * Web site: - * The source code and other information about this library - * are available from - * - * http://sources.redhat.com/pthreads-win32/ - * - * ------------------------------------------------------------- - */ - -/* Try to avoid including windows.h */ -#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) -#define PTW32_INCLUDE_WINDOWS_H -#endif - -#if defined(PTW32_INCLUDE_WINDOWS_H) -#include -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) -/* - * VC++6.0 or early compiler's header has no DWORD_PTR type. - */ -typedef unsigned long DWORD_PTR; -typedef unsigned long ULONG_PTR; -#endif -/* - * ----------------- - * autoconf switches - * ----------------- - */ - -#if defined(HAVE_PTW32_CONFIG_H) -#include "config.h" -#endif /* HAVE_PTW32_CONFIG_H */ - -#if !defined(NEED_FTIME) -#include -#else /* NEED_FTIME */ -/* use native WIN32 time API */ -#endif /* NEED_FTIME */ - -#if defined(HAVE_SIGNAL_H) -#include -#endif /* HAVE_SIGNAL_H */ - -#include - -/* - * Boolean values to make us independent of system includes. - */ -enum { - PTW32_FALSE = 0, - PTW32_TRUE = (! PTW32_FALSE) -}; - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Several systems don't define some error numbers. - */ -#if !defined(ENOTSUP) -# define ENOTSUP 48 /* This is the value in Solaris. */ -#endif - -#if !defined(ETIMEDOUT) -# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ -#endif - -#if !defined(ENOSYS) -# define ENOSYS 140 /* Semi-arbitrary value */ -#endif - -#if !defined(EDEADLK) -# if defined(EDEADLOCK) -# define EDEADLK EDEADLOCK -# else -# define EDEADLK 36 /* This is the value in MSVC. */ -# endif -#endif - -/* POSIX 2008 - related to robust mutexes */ -#if !defined(EOWNERDEAD) -# define EOWNERDEAD 43 -#endif -#if !defined(ENOTRECOVERABLE) -# define ENOTRECOVERABLE 44 -#endif - -#include - -/* - * To avoid including windows.h we define only those things that we - * actually need from it. - */ -#if !defined(PTW32_INCLUDE_WINDOWS_H) -#if !defined(HANDLE) -# define PTW32__HANDLE_DEF -# define HANDLE void * -#endif -#if !defined(DWORD) -# define PTW32__DWORD_DEF -# define DWORD unsigned long -#endif -#endif - -#if !defined(HAVE_STRUCT_TIMESPEC) -#define HAVE_STRUCT_TIMESPEC -#if !defined(_TIMESPEC_DEFINED) -#define _TIMESPEC_DEFINED -struct timespec { - time_t tv_sec; - long tv_nsec; -}; -#endif /* _TIMESPEC_DEFINED */ -#endif /* HAVE_STRUCT_TIMESPEC */ - -#if !defined(SIG_BLOCK) -#define SIG_BLOCK 0 -#endif /* SIG_BLOCK */ - -#if !defined(SIG_UNBLOCK) -#define SIG_UNBLOCK 1 -#endif /* SIG_UNBLOCK */ - -#if !defined(SIG_SETMASK) -#define SIG_SETMASK 2 -#endif /* SIG_SETMASK */ - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -/* - * ------------------------------------------------------------- - * - * POSIX 1003.1-2001 Options - * ========================= - * - * Options are normally set in , which is not provided - * with pthreads-win32. - * - * For conformance with the Single Unix Specification (version 3), all of the - * options below are defined, and have a value of either -1 (not supported) - * or 200112L (supported). - * - * These options can neither be left undefined nor have a value of 0, because - * either indicates that sysconf(), which is not implemented, may be used at - * runtime to check the status of the option. - * - * _POSIX_THREADS (== 200112L) - * If == 200112L, you can use threads - * - * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) - * If == 200112L, you can control the size of a thread's - * stack - * pthread_attr_getstacksize - * pthread_attr_setstacksize - * - * _POSIX_THREAD_ATTR_STACKADDR (== -1) - * If == 200112L, you can allocate and control a thread's - * stack. If not supported, the following functions - * will return ENOSYS, indicating they are not - * supported: - * pthread_attr_getstackaddr - * pthread_attr_setstackaddr - * - * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) - * If == 200112L, you can use realtime scheduling. - * This option indicates that the behaviour of some - * implemented functions conforms to the additional TPS - * requirements in the standard. E.g. rwlocks favour - * writers over readers when threads have equal priority. - * - * _POSIX_THREAD_PRIO_INHERIT (== -1) - * If == 200112L, you can create priority inheritance - * mutexes. - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PRIO_PROTECT (== -1) - * If == 200112L, you can create priority ceiling mutexes - * Indicates the availability of: - * pthread_mutex_getprioceiling - * pthread_mutex_setprioceiling - * pthread_mutexattr_getprioceiling - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprioceiling - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PROCESS_SHARED (== -1) - * If set, you can create mutexes and condition - * variables that can be shared with another - * process.If set, indicates the availability - * of: - * pthread_mutexattr_getpshared - * pthread_mutexattr_setpshared - * pthread_condattr_getpshared - * pthread_condattr_setpshared - * - * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) - * If == 200112L you can use the special *_r library - * functions that provide thread-safe behaviour - * - * _POSIX_READER_WRITER_LOCKS (== 200112L) - * If == 200112L, you can use read/write locks - * - * _POSIX_SPIN_LOCKS (== 200112L) - * If == 200112L, you can use spin locks - * - * _POSIX_BARRIERS (== 200112L) - * If == 200112L, you can use barriers - * - * + These functions provide both 'inherit' and/or - * 'protect' protocol, based upon these macro - * settings. - * - * ------------------------------------------------------------- - */ - -/* - * POSIX Options - */ -#undef _POSIX_THREADS -#define _POSIX_THREADS 200809L - -#undef _POSIX_READER_WRITER_LOCKS -#define _POSIX_READER_WRITER_LOCKS 200809L - -#undef _POSIX_SPIN_LOCKS -#define _POSIX_SPIN_LOCKS 200809L - -#undef _POSIX_BARRIERS -#define _POSIX_BARRIERS 200809L - -#undef _POSIX_THREAD_SAFE_FUNCTIONS -#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L - -#undef _POSIX_THREAD_ATTR_STACKSIZE -#define _POSIX_THREAD_ATTR_STACKSIZE 200809L - -/* - * The following options are not supported - */ -#undef _POSIX_THREAD_ATTR_STACKADDR -#define _POSIX_THREAD_ATTR_STACKADDR -1 - -#undef _POSIX_THREAD_PRIO_INHERIT -#define _POSIX_THREAD_PRIO_INHERIT -1 - -#undef _POSIX_THREAD_PRIO_PROTECT -#define _POSIX_THREAD_PRIO_PROTECT -1 - -/* TPS is not fully supported. */ -#undef _POSIX_THREAD_PRIORITY_SCHEDULING -#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 - -#undef _POSIX_THREAD_PROCESS_SHARED -#define _POSIX_THREAD_PROCESS_SHARED -1 - - -/* - * POSIX 1003.1-2001 Limits - * =========================== - * - * These limits are normally set in , which is not provided with - * pthreads-win32. - * - * PTHREAD_DESTRUCTOR_ITERATIONS - * Maximum number of attempts to destroy - * a thread's thread-specific data on - * termination (must be at least 4) - * - * PTHREAD_KEYS_MAX - * Maximum number of thread-specific data keys - * available per process (must be at least 128) - * - * PTHREAD_STACK_MIN - * Minimum supported stack size for a thread - * - * PTHREAD_THREADS_MAX - * Maximum number of threads supported per - * process (must be at least 64). - * - * SEM_NSEMS_MAX - * The maximum number of semaphores a process can have. - * (must be at least 256) - * - * SEM_VALUE_MAX - * The maximum value a semaphore can have. - * (must be at least 32767) - * - */ -#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 - -#undef PTHREAD_DESTRUCTOR_ITERATIONS -#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS - -#undef _POSIX_THREAD_KEYS_MAX -#define _POSIX_THREAD_KEYS_MAX 128 - -#undef PTHREAD_KEYS_MAX -#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX - -#undef PTHREAD_STACK_MIN -#define PTHREAD_STACK_MIN 0 - -#undef _POSIX_THREAD_THREADS_MAX -#define _POSIX_THREAD_THREADS_MAX 64 - -/* Arbitrary value */ -#undef PTHREAD_THREADS_MAX -#define PTHREAD_THREADS_MAX 2019 - -#undef _POSIX_SEM_NSEMS_MAX -#define _POSIX_SEM_NSEMS_MAX 256 - -/* Arbitrary value */ -#undef SEM_NSEMS_MAX -#define SEM_NSEMS_MAX 1024 - -#undef _POSIX_SEM_VALUE_MAX -#define _POSIX_SEM_VALUE_MAX 32767 - -#undef SEM_VALUE_MAX -#define SEM_VALUE_MAX INT_MAX - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * The Open Watcom C/C++ compiler uses a non-standard calling convention - * that passes function args in registers unless __cdecl is explicitly specified - * in exposed function prototypes. - * - * We force all calls to cdecl even though this could slow Watcom code down - * slightly. If you know that the Watcom compiler will be used to build both - * the DLL and application, then you can probably define this as a null string. - * Remember that pthread.h (this file) is used for both the DLL and application builds. - */ -#define PTW32_CDECL __cdecl - -#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX -# include -#else -/* - * Generic handle type - intended to extend uniqueness beyond - * that available with a simple pointer. It should scale for either - * IA-32 or IA-64. - */ -typedef struct { - void *p; /* Pointer to actual object */ - unsigned int x; /* Extra information - reuse count etc */ -} ptw32_handle_t; - -typedef ptw32_handle_t pthread_t; -typedef struct pthread_attr_t_ *pthread_attr_t; -typedef struct pthread_once_t_ pthread_once_t; -typedef struct pthread_key_t_ *pthread_key_t; -typedef struct pthread_mutex_t_ *pthread_mutex_t; -typedef struct pthread_mutexattr_t_ *pthread_mutexattr_t; -typedef struct pthread_cond_t_ *pthread_cond_t; -typedef struct pthread_condattr_t_ *pthread_condattr_t; -#endif -typedef struct pthread_rwlock_t_ *pthread_rwlock_t; -typedef struct pthread_rwlockattr_t_ *pthread_rwlockattr_t; -typedef struct pthread_spinlock_t_ *pthread_spinlock_t; -typedef struct pthread_barrier_t_ *pthread_barrier_t; -typedef struct pthread_barrierattr_t_ *pthread_barrierattr_t; - -/* - * ==================== - * ==================== - * POSIX Threads - * ==================== - * ==================== - */ - -enum { - /* - * pthread_attr_{get,set}detachstate - */ - PTHREAD_CREATE_JOINABLE = 0, /* Default */ - PTHREAD_CREATE_DETACHED = 1, - - /* - * pthread_attr_{get,set}inheritsched - */ - PTHREAD_INHERIT_SCHED = 0, - PTHREAD_EXPLICIT_SCHED = 1, /* Default */ - - /* - * pthread_{get,set}scope - */ - PTHREAD_SCOPE_PROCESS = 0, - PTHREAD_SCOPE_SYSTEM = 1, /* Default */ - - /* - * pthread_setcancelstate paramters - */ - PTHREAD_CANCEL_ENABLE = 0, /* Default */ - PTHREAD_CANCEL_DISABLE = 1, - - /* - * pthread_setcanceltype parameters - */ - PTHREAD_CANCEL_ASYNCHRONOUS = 0, - PTHREAD_CANCEL_DEFERRED = 1, /* Default */ - - /* - * pthread_mutexattr_{get,set}pshared - * pthread_condattr_{get,set}pshared - */ - PTHREAD_PROCESS_PRIVATE = 0, - PTHREAD_PROCESS_SHARED = 1, - - /* - * pthread_mutexattr_{get,set}robust - */ - PTHREAD_MUTEX_STALLED = 0, /* Default */ - PTHREAD_MUTEX_ROBUST = 1, - - /* - * pthread_barrier_wait - */ - PTHREAD_BARRIER_SERIAL_THREAD = -1 -}; - -/* - * ==================== - * ==================== - * Cancelation - * ==================== - * ==================== - */ -#define PTHREAD_CANCELED ((void *)(size_t) -1) - - -/* - * ==================== - * ==================== - * Once Key - * ==================== - * ==================== - */ -#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} - -struct pthread_once_t_ { - int done; /* indicates if user function has been executed */ - void *lock; - int reserved1; - int reserved2; -}; - - -/* - * ==================== - * ==================== - * Object initialisers - * ==================== - * ==================== - */ -#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) - -/* - * Compatibility with LinuxThreads - */ -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER - -#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) - -#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) - -#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) - - -/* - * Mutex types. - */ -enum { - /* Compatibility with LinuxThreads */ - PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, - /* For compatibility with POSIX */ - PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL -}; - - -typedef struct ptw32_cleanup_t ptw32_cleanup_t; - -#if defined(_MSC_VER) -/* Disable MSVC 'anachronism used' warning */ -#pragma warning( disable : 4229 ) -#endif - -typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); - -#if defined(_MSC_VER) -#pragma warning( default : 4229 ) -#endif - -struct ptw32_cleanup_t { - ptw32_cleanup_callback_t routine; - void *arg; - struct ptw32_cleanup_t *prev; -}; - -#if defined(__CLEANUP_SEH) -/* - * WIN32 SEH version of cancel cleanup. - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ - _cleanup.arg = (_arg); \ - __try \ - { \ - -#define pthread_cleanup_pop( _execute ) \ - } \ - __finally \ - { \ - if( _execute || AbnormalTermination()) \ - { \ - (*(_cleanup.routine))( _cleanup.arg ); \ - } \ - } \ - } - -#else /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_C) - -/* - * C implementation of PThreads cancel cleanup - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ - -#define pthread_cleanup_pop( _execute ) \ - (void) ptw32_pop_cleanup( _execute ); \ - } - -#else /* __CLEANUP_C */ - -#if defined(__CLEANUP_CXX) - -/* - * C++ version of cancel cleanup. - * - John E. Bossom. - */ - -class PThreadCleanup { - /* - * PThreadCleanup - * - * Purpose - * This class is a C++ helper class that is - * used to implement pthread_cleanup_push/ - * pthread_cleanup_pop. - * The destructor of this class automatically - * pops the pushed cleanup routine regardless - * of how the code exits the scope - * (i.e. such as by an exception) - */ - ptw32_cleanup_callback_t cleanUpRout; - void *obj; - int executeIt; - - public: - PThreadCleanup() : - cleanUpRout(0), - obj(0), - executeIt(0) - /* - * No cleanup performed - */ - { - } - - PThreadCleanup( - ptw32_cleanup_callback_t routine, - void *arg) : - cleanUpRout(routine), - obj(arg), - executeIt(1) - /* - * Registers a cleanup routine for 'arg' - */ - { - } - - ~PThreadCleanup() { - if (executeIt && ((void *) cleanUpRout != (void *) 0)) { - (void)(*cleanUpRout)(obj); - } - } - - void execute(int exec) { - executeIt = exec; - } -}; - -/* - * C++ implementation of PThreads cancel cleanup; - * This implementation takes advantage of a helper - * class who's destructor automatically calls the - * cleanup routine if we exit our scope weirdly - */ -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ - (void *) (_arg) ); - -#define pthread_cleanup_pop( _execute ) \ - cleanup.execute( _execute ); \ - } - -#else - -#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. - -#endif /* __CLEANUP_CXX */ - -#endif /* __CLEANUP_C */ - -#endif /* __CLEANUP_SEH */ - -/* - * =============== - * =============== - * Methods - * =============== - * =============== - */ - -/* - * PThread Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_attr_init(pthread_attr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy(pthread_attr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate(const pthread_attr_t *attr, - int *detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr(const pthread_attr_t *attr, - void **stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize(const pthread_attr_t *attr, - size_t *stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate(pthread_attr_t *attr, - int detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr(pthread_attr_t *attr, - void *stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize(pthread_attr_t *attr, - size_t stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam(const pthread_attr_t *attr, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam(pthread_attr_t *attr, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy(pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy(const pthread_attr_t *, - int *); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t *attr, - int inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t *attr, - int *inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope(pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope(const pthread_attr_t *, - int *); - -/* - * PThread Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_create(pthread_t *tid, - const pthread_attr_t *attr, - void *(PTW32_CDECL *start)(void *), - void *arg); - -PTW32_DLLPORT int PTW32_CDECL pthread_detach(pthread_t tid); - -PTW32_DLLPORT int PTW32_CDECL pthread_equal(pthread_t t1, - pthread_t t2); - -PTW32_DLLPORT void PTW32_CDECL pthread_exit(void *value_ptr); - -PTW32_DLLPORT int PTW32_CDECL pthread_join(pthread_t thread, - void **value_ptr); - -PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self(void); - -PTW32_DLLPORT int PTW32_CDECL pthread_cancel(pthread_t thread); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate(int state, - int *oldstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype(int type, - int *oldtype); - -PTW32_DLLPORT void PTW32_CDECL pthread_testcancel(void); - -PTW32_DLLPORT int PTW32_CDECL pthread_once(pthread_once_t *once_control, - void (PTW32_CDECL *init_routine)(void)); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -PTW32_DLLPORT ptw32_cleanup_t *PTW32_CDECL ptw32_pop_cleanup(int execute); - -PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup(ptw32_cleanup_t *cleanup, - ptw32_cleanup_callback_t routine, - void *arg); -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread Specific Data Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_key_create(pthread_key_t *key, - void (PTW32_CDECL *destructor)(void *)); - -PTW32_DLLPORT int PTW32_CDECL pthread_key_delete(pthread_key_t key); - -PTW32_DLLPORT int PTW32_CDECL pthread_setspecific(pthread_key_t key, - const void *value); - -PTW32_DLLPORT void *PTW32_CDECL pthread_getspecific(pthread_key_t key); - - -/* - * Mutex Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init(pthread_mutexattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy(pthread_mutexattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared(const pthread_mutexattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, - int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( - pthread_mutexattr_t *attr, - int robust); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( - const pthread_mutexattr_t *attr, - int *robust); - -/* - * Barrier Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init(pthread_barrierattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy(pthread_barrierattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared(const pthread_barrierattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, - int pshared); - -/* - * Mutex Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init(pthread_mutex_t *mutex, - const pthread_mutexattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy(pthread_mutex_t *mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock(pthread_mutex_t *mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t *mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock(pthread_mutex_t *mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock(pthread_mutex_t *mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent(pthread_mutex_t *mutex); - -/* - * Spinlock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_spin_init(pthread_spinlock_t *lock, int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy(pthread_spinlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock(pthread_spinlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock(pthread_spinlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock(pthread_spinlock_t *lock); - -/* - * Barrier Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init(pthread_barrier_t *barrier, - const pthread_barrierattr_t *attr, - unsigned int count); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy(pthread_barrier_t *barrier); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait(pthread_barrier_t *barrier); - -/* - * Condition Variable Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init(pthread_condattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy(pthread_condattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared(const pthread_condattr_t *attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared(pthread_condattr_t *attr, - int pshared); - -/* - * Condition Variable Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_cond_init(pthread_cond_t *cond, - const pthread_condattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy(pthread_cond_t *cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait(pthread_cond_t *cond, - pthread_mutex_t *mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait(pthread_cond_t *cond, - pthread_mutex_t *mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal(pthread_cond_t *cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast(pthread_cond_t *cond); - -/* - * Scheduling - */ -PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam(pthread_t thread, - int policy, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam(pthread_t thread, - int *policy, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency(int); - -PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency(void); - -/* - * Read-Write Lock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, - const pthread_rwlockattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init(pthread_rwlockattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, - int pshared); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 - -/* - * Signal Functions. Should be defined in but MSVC and MinGW32 - * already have signal.h that don't define these. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); - -/* - * Non-portable functions - */ - -/* - * Compatibility with Linux. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, - int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t *attr, - int *kind); - -/* - * Possibly supported by other POSIX threads implementations - */ -PTW32_DLLPORT int PTW32_CDECL pthread_delay_np(struct timespec *interval); -PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); -PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); - -/* - * Useful if an application wants to statically link - * the lib rather than load the DLL at run-time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); - -/* - * Features that are auto-detected at load/run time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); -enum ptw32_features { - PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ - PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ -}; - -/* - * Register a system time change with the library. - * Causes the library to perform various functions - * in response to the change. Should be called whenever - * the application's top level window receives a - * WM_TIMECHANGE message. It can be passed directly to - * pthread_create() as a new thread if desired. - */ -PTW32_DLLPORT void *PTW32_CDECL pthread_timechange_handler_np(void *); - -#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* - * Returns the Win32 HANDLE for the POSIX thread. - */ -PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); -/* - * Returns the win32 thread ID for POSIX thread. - */ -PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np(pthread_t thread); - - -/* - * Protected Methods - * - * This function blocks until the given WIN32 handle - * is signaled or pthread_cancel had been called. - * This function allows the caller to hook into the - * PThreads cancel mechanism. It is implemented using - * - * WaitForMultipleObjects - * - * on 'waitHandle' and a manually reset WIN32 Event - * used to implement pthread_cancel. The 'timeout' - * argument to TimedWait is simply passed to - * WaitForMultipleObjects. - */ -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait(HANDLE waitHandle); -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait(HANDLE waitHandle, - DWORD timeout); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread-Safe C Runtime Library Mappings. - */ -#if !defined(_UWIN) -# if defined(NEED_ERRNO) -PTW32_DLLPORT int *PTW32_CDECL _errno(void); -# else -# if !defined(errno) -# if (defined(_MT) || defined(_DLL)) -__declspec(dllimport) extern int *__cdecl _errno(void); -# define errno (*_errno()) -# endif -# endif -# endif -#endif - -/* - * Some compiler environments don't define some things. - */ -#if defined(__BORLANDC__) -# define _ftime ftime -# define _timeb timeb -#endif - -#if defined(__cplusplus) - -/* - * Internal exceptions - */ -class ptw32_exception {}; -class ptw32_exception_cancel : public ptw32_exception {}; -class ptw32_exception_exit : public ptw32_exception {}; - -#endif - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* FIXME: This is only required if the library was built using SEH */ -/* - * Get internal SEH tag - */ -PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -#if !defined(PTW32_BUILD) - -#if defined(__CLEANUP_SEH) - -/* - * Redefine the SEH __except keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#define __except( E ) \ - __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ - ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) - -#endif /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_CXX) - -/* - * Redefine the C++ catch keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#if defined(_MSC_VER) -/* - * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' - * if you want Pthread-Win32 cancelation and pthread_exit to work. - */ - -#if !defined(PtW32NoCatchWarn) - -#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") -#pragma message("------------------------------------------------------------------") -#pragma message("When compiling applications with MSVC++ and C++ exception handling:") -#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") -#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") -#pragma message(" cancelation and pthread_exit to work. For example:") -#pragma message("") -#pragma message(" #if defined(PtW32CatchAll)") -#pragma message(" PtW32CatchAll") -#pragma message(" #else") -#pragma message(" catch(...)") -#pragma message(" #endif") -#pragma message(" {") -#pragma message(" /* Catchall block processing */") -#pragma message(" }") -#pragma message("------------------------------------------------------------------") - -#endif - -#define PtW32CatchAll \ - catch( ptw32_exception & ) { throw; } \ - catch( ... ) - -#else /* _MSC_VER */ - -#define catch( E ) \ - catch( ptw32_exception & ) { throw; } \ - catch( E ) - -#endif /* _MSC_VER */ - -#endif /* __CLEANUP_CXX */ - -#endif /* ! PTW32_BUILD */ - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#if defined(PTW32__HANDLE_DEF) -# undef HANDLE -#endif -#if defined(PTW32__DWORD_DEF) -# undef DWORD -#endif - -#undef PTW32_LEVEL -#undef PTW32_LEVEL_MAX - -#endif /* ! RC_INVOKED */ - -#endif /* PTHREAD_H */ diff --git a/software/src/lib/pthread/include/sched.h b/software/src/lib/pthread/include/sched.h deleted file mode 100644 index 05cf793..0000000 --- a/software/src/lib/pthread/include/sched.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Module: sched.h - * - * Purpose: - * Provides an implementation of POSIX realtime extensions - * as defined in - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined(_SCHED_H) -#define _SCHED_H - -#undef PTW32_SCHED_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SCHED_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SCHED_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) -#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX -/* Include everything */ -#endif - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ - -#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) -# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -/* For pid_t */ -# include -/* Required by Unix 98 */ -# include -# else -typedef int pid_t; -# endif -#else -typedef int pid_t; -#endif - -/* Thread scheduling policies */ - -enum { - SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; - -struct sched_param { - int sched_priority; -}; - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -PTW32_DLLPORT int __cdecl sched_yield(void); - -PTW32_DLLPORT int __cdecl sched_get_priority_min(int policy); - -PTW32_DLLPORT int __cdecl sched_get_priority_max(int policy); - -PTW32_DLLPORT int __cdecl sched_setscheduler(pid_t pid, int policy); - -PTW32_DLLPORT int __cdecl sched_getscheduler(pid_t pid); - -/* - * Note that this macro returns ENOTSUP rather than - * ENOSYS as might be expected. However, returning ENOSYS - * should mean that sched_get_priority_{min,max} are - * not implemented as well as sched_rr_get_interval. - * This is not the case, since we just don't support - * round-robin scheduling. Therefore I have chosen to - * return the same value as sched_setscheduler when - * SCHED_RR is passed to it. - */ -#define sched_rr_get_interval(_pid, _interval) \ - ( errno = ENOTSUP, (int) -1 ) - - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SCHED_LEVEL -#undef PTW32_SCHED_LEVEL_MAX - -#endif /* !_SCHED_H */ - diff --git a/software/src/lib/pthread/include/semaphore.h b/software/src/lib/pthread/include/semaphore.h deleted file mode 100644 index 5704d0e..0000000 --- a/software/src/lib/pthread/include/semaphore.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Module: semaphore.h - * - * Purpose: - * Semaphores aren't actually part of the PThreads standard. - * They are defined by the POSIX Standard: - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined( SEMAPHORE_H ) -#define SEMAPHORE_H - -#undef PTW32_SEMAPHORE_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SEMAPHORE_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SEMAPHORE_LEVEL_MAX 3 - -#if !defined(PTW32_SEMAPHORE_LEVEL) -#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(__GNUC__) && ! defined (__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ - -#define _POSIX_SEMAPHORES - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -#if !defined(HAVE_MODE_T) -typedef unsigned int mode_t; -#endif - - -typedef struct sem_t_ *sem_t; - -PTW32_DLLPORT int __cdecl sem_init(sem_t *sem, - int pshared, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_destroy(sem_t *sem); - -PTW32_DLLPORT int __cdecl sem_trywait(sem_t *sem); - -PTW32_DLLPORT int __cdecl sem_wait(sem_t *sem); - -PTW32_DLLPORT int __cdecl sem_timedwait(sem_t *sem, - const struct timespec *abstime); - -PTW32_DLLPORT int __cdecl sem_post(sem_t *sem); - -PTW32_DLLPORT int __cdecl sem_post_multiple(sem_t *sem, - int count); - -PTW32_DLLPORT int __cdecl sem_open(const char *name, - int oflag, - mode_t mode, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_close(sem_t *sem); - -PTW32_DLLPORT int __cdecl sem_unlink(const char *name); - -PTW32_DLLPORT int __cdecl sem_getvalue(sem_t *sem, - int *sval); - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SEMAPHORE_LEVEL -#undef PTW32_SEMAPHORE_LEVEL_MAX - -#endif /* !SEMAPHORE_H */ diff --git a/software/src/lib/pthread/lib/x64/libpthreadGC2.a b/software/src/lib/pthread/lib/x64/libpthreadGC2.a deleted file mode 100644 index 430162364f91f802273c5b43f3e5eab1387a04fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93692 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 diff --git a/software/src/lib/pthread/lib/x64/pthreadVC2.lib b/software/src/lib/pthread/lib/x64/pthreadVC2.lib deleted file mode 100644 index 1b07e0e9aa43b91f04d2884e2f594bbeca4fdac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29738 zcmY$iNi0gvu;bEKKm~@z#uf&a#ujEqsNx1tuDPKRl$pTAz`*dCfx$wHfx#+)fx&tf z14H%)2zK1YzyQLwuNW9W*e;HN0fe127#Kj<;Sd7@2)pz!Fo3Y54FdxRyRtDbfUtuP z0|N-Vh%qpLu=_0r1`u|8z`y{)?lBAuAnXyuzyQKNuNW9W*!vp;0|@)%F))CzZvq1Y z2#3fqFo3YX1_J{Kr#xd|0O0^81_lrgtzcjP;V3l*1`rP4$G`x>5nC7-KsZ{0fdPbL z1Q-}VIC2dG0|-Y?VPF8^NCO525Dw{LU;yE$ISdRS9AUx00K$RS7#Kh}D1?ClgaeZp z7(h6ti-7@zv%WAefN>cELsl6BL(&WgPF%pi0K!R93=ANgEWp43!p^f87(m$m0s{jW zhcPhNhcPfXErDRWTMP^!98kf)0K&Op3=Cj=hJhjX3n7ASUNV90Y~V8~a4;6fV) z1`y7l#J~W;#Ssh)Ae^>~fdPbrtr!@yv&Jbc?0O9m`3=AObmczgR!Z}3@3}F0(fg$G!1B2Hr z2==sNU;ts?I}8jU9LvJM0K%b63=ANg@q>W@gcG(fFo1Bu6$S~VpC z0fhahF))CzZ3zPd2;2N(U;tr1F9rq>&MaeK0O7bO1_m&`z`zi9fq^0Z2m~kCFff2{ z@gW8V5H6}?U;yEua|{e1?A^k^0LFX_4BmVU42fD09Ph=z5bqTq@97)h9~2Vr;u`E6 z!t^cJHDDPmI$=$>7pioLW+ppHy0ms7Fw2h05X5osLI0LJo`W_~iV&;>_Zb)I2nc zktML`14n;xYDsoxUP^pk0X*%aI2tC2OMf~({Ya9i`qNWEl{ln1kdc^|l9P(;0PM23 zO~^!XKC*6z42I6qyv)K zq!A{CQ!i3p$D$oc7N-eFxgCoMNV2FVfc*=uqWuz8mmJ}yvAl3O`-RP27^rz#~k1mO-AJuKJ5Jwe- z=m0wn+!8M+%FHjyEUApoO{`$RA&gs3W*$~OnR(C_Kg2*-RF>wX7D3gc2%(t|)`X-M z<^iw}vf9eb)SMKkfeg;3Rk0-_)_IWsLY8J;MS z#ZXm43K(el7Z2&jU>0JS^4Ls)mV~$r!H`BZ1D5o`5nBMxIIuv)B893KVkO+WP%f&P z;?$fpxC$@_UB09kJ={PE5GIDI8eECSgUVgFnMgv|)RtuCrlw%gfDp%~t27Ub7N{UL z^(94>STw*yQFVZP2P%C~0~=Koq63sgN{TAW6EjP|Ngu{W$QI-mL!`hARPp%S(wvga zf*eSW0x3X6P$q%hq)Of1!F^GVJ3o8 zA503XAgX#;5&_!?Q;#BuT|K%LFfA}~R9)aGMX>@Qf<-0F5SV+wieZAN>Y*WsVm7iE zR@E@0VCF+Lz=TotfI8EOdC93csDo)}!Z`GR`+YEL;99_&oYZho2?})~nkWt(A)smlyEcRrir)B?)SSdh^it4f(KCnjotXH{LDOf>H>36<-yquYzj;VLIjISgf%G2 z5yGf?px(mnS*R#h9S{Q{K>@P~Y8bK<>2ra`@VUTh1_lN#3kHS+D+Y#H)(i|EvKbh* zIWjQ3vSnb1vtwY;aAIIM8lC zkcehr5Qt%5SQE*>FeRFS!61@>p(})eVNMhSgGB@b!?i#LhL9izhNM6ShOQU}hA&wR z3}smi3^S4#7#1WlFi0gaFbE_wFwAmhV7OqW znSo)K9|J>QG6TbHl*7RAB!_`vmKOtqohJjs9bX0pmRJS`rcefk9~le`TM`%; zt`smZ{K;ova7$xg_~FXH(BR6zpy9>9u*H*s;aMyLLqRM9!>?ophJq9ZhPDg_h6^4H z4AcA>7)opz7=GC>FnIYfFqCC7Fhs>MFkFaZU^o)bz+jWWz;LLTfuXL5f#F;b14D~9 z0|TEo1A|r~1A|vQc;c6Vk%5UJk0Fn!%PKfgz9~p23E}pCN#ujKPn=j-hnK z`Ini2+*v`Ck_b^R;;7&d3c&Ruie}I_Tv0sswgtEwNq9yM|L_US5TtG@76*Vj+~BSi zWLyfD3eb!e4mtR&9v*q{JQ@~xaQh64IN|w3B8Hx@^$%ec1vqfv3UK-ztOAGML2~%~ z4wJ{?cl@nlm@JmSfk}aDW7KeiN`XCwJyjvAz&YHBtO&OQz_#EV@Wk5k1h*M*cHi>z zQgGx2us$p<0gFTXl&B#AmVq<@K#f=|l30QdqzUXR>|qC&#u;#M6*$}qHXL`5LHe(# zZpG0W#yV((Z5j}>eGeKVMV=W%wGUnvfXB2j<**MhrKgtQnz2Bh0fBUoL9KQSgUgML zAVY50W=XI#NI@ftSbO*&39LhnSY}Zn{d%MsD^zDeq_HOkh#Z!9hDd;0?bu8Mr%Bwh z&;c=QI-%nOSfs$o3Xe0v@;Ilzzz&8fflceGh5|z)&Sn*; z-p5{2q71^J83><^!6J^O$N(FKeaIIqg*66ojvRr~8|FABs!NC)V?k8~si`o_e26NL zb5Q1zu~`VI7(k6>=%h6sMVQushOqH1(1RHUQinYFjUtXYt__ZRP+c02GT#W%g-sG| z1`$@#VoU*o(hjIKjv;|QABaBNhnnj^LqTX06Cfd^Tm|BS=MV7H`AlFx&w)3Y&)^{R@~o;5`e30BB4d9w3n31WXd#kAQK|76c**g9|>?BnZk$ zu(}XQC8EE8Bna;XAbJYeWFdV7m<+gg0ONp~|ImH`vJkXK02e}DUI}hEA}>#ase(wL zM+!s~CDb88;3^tbFF5wGi9_4@sH&kAHi{rPGO;=VEQ8dl$JB-;)qq_J(+OPzh*cxF zd5kH8>20uKNbPn^Jy?<=!WoFRI#!J+&cJM+!}Ne#<}ePV4T(`0L4{F#02PBav(XFy zM;;z2Xe$_97rfPtDS=%FTC_vmgjFp#u+dWkL<3j~ON=AQV(~gy7nTSDx1wPl05yZb zlY)@;GlnoqB!LtowV9C=V<{UzwF!FJ0B*aY`w=XN;(o9QO4b64z}mxbdqItAv=9b0 zI?+mhP+ViSeqn|{+N!X1MTF)a5lv83{UB>m+PY}ckaZHcOoujtkqrm6Sn;)NAzM$7 z+q6&-p3gUp{ z7Q_IzNI?v6TNK7Xv_e55pxA=6KfyetwLZ``CrB7v#p2t+0}cK#XCu9ooE&`xLOTRa z4a}f>1rxYZ+L#&CHXigBVq{?8V1NLisbd_KTkAcC3fq|h1#(~lf3<6GinJI}S zi7G}=AqEi!28Ig^3=B`80?Z5y3=Rwi2cYWApu!9S3=9lRj0klgaR&y4156AI45AF2 zAT9$Rs;AT$gaz24#)ITRI~%3v3i)Ox7v&e{rjBXdr>}D=5Fg_#oPW!2y=vOh9}P2IcD;AO;c!siQ>*6BD`$3=DX8 zB$67wh@H@&9nYXVo6-g<)3m_;Wr1}B@buK7MJG%pluI~fP0gWMLIKrgRR#tIMg}Z4 zBM$^XZDAleJ(c)nP3lP z9R^UjjA=Kvu?3jrB>Nkdb0y3sD}t@JD~I%$+j6!h_m6e8D(SyW;Mwn zjxSxaW3?M;*cASnQ@(PUgj8H@NLj^PJ3w(`MS|WPYr6(>f;$ zV6zpJpOD9B$xmT;$`CTt2+3yX2r>Gw4*B-tX$=Ttu@_q* zf?B2!(eA-xrwA51!ChEXOGs{O;VZX9G3^8o2*G;kXjYS4ADZFtuO0&fgBT9GF^8~V zQH<&u!l7*jUBjz@R!3+sFffSYu$>yQjL+8+IPAq7f+N@0rZ{{p$H2fKiDWzK02tY} zSzyn-Y77hvQpmP}rcp3vSID*%N4f&F|qNU z`H)4o5q0hf7OG2u$4!*6a4GL&B;wutSJx)ZK zgr^m$h|ONy#UaUl#@9Ph!e%#BQZc^zM;V)~xQjy4eT=6pR6({IWo8tXc}R_0QyhI> z(725%l5OY{uVmYY$9HNd_94&fl53j@j&>So%ugN3Hk4^&m}Ml#oC%I{NQQxdK?B(~ zq`hn~%Setl9Cm@~Fij-8u+MsvZ7ZHJFfCMDad)Xm4p)42iZ+_9XcKcVkCJXDp4wUm z)lQ5>0WeERjZ-rmb*C-^1A{KAow(N=z$_=($M{BM^l;dYvZjG-oAKoveI%Qa*G#}H zBQ=aoaf~l2F)%O~AlZevB!d<<8lu^Vy5fUe8}Wsw5weX)3rfhf3tyYW7|Aa1;t4G4 zRmim$U%S8r!(JTCX_E5@zSLuiVJo(#2sP8I8HSC>OAE*jSsZmHXl%nA!$xp(8k@DG zhb^AE#RAh_)Wt|J&ysE{o^sw2!&cNa88AypjZ=IjtrfbR_!{yg`xf7rtTk4fG1qF5 z?Q0w*FKA}R2AAEitsSUAOmbfhUwhsbm))o<&0yXpJ=3!lIhwe1)%-1;atWs^d^yPt$u7vcMO?%EB-@IkKL8p_bH}t5 zTjnJ>RPnW|JTUD^4(#v=&d_ArQOmR4KLajhqBwx0i||w)kqIU?kg-*Qb-4d-2soAt-i1 zkKaOB{!X^7c=~3c*leXr+XA0o!_aKST)j^VzlNjQN~bZ-2sB&iF~%8*Y$s?t0*)aR zQp+cNvu07~c2cEmz-MDLx{cHs$-pzF5QA=NKMZPPct0tDnkYahE%Zagtt|J0|XZMB&U6RrDz)51*qG$D6|nz>5`7H5qVn}YOsse8tJ~mF@g+Q(U1?d3%(-~&10xs!YR@ONBWRpU|=YK+J&t_NKJbRq4t3HbD|nd za(c(-pCYI|;O(Lm+JmoTE=IBku^Sc5Lef(Oj@k&cs-^^LBY238Dy!b`<>FG9ZP4Ac h6#EQEEic8uz)%LY3%Xku%_>wbWvRU!Y7@5L0{~3a^lbnD diff --git a/software/src/lib/pthread/lib/x86/libpthreadGC2.a b/software/src/lib/pthread/lib/x86/libpthreadGC2.a deleted file mode 100644 index df211759f80f37494af2d8fcea749957bb51aaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93480 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 WJ=di4{18bM;eA|*8CeDP6b%3ej7#Kj< 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

0n?O(y0?t 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 Cb^K-fu# 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 diff --git a/software/src/lib/pthread/lib/x86/pthreadVCE2.lib b/software/src/lib/pthread/lib/x86/pthreadVCE2.lib deleted file mode 100644 index 7f05317ba28e87e5f199c6a36751ef6ee628ec87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30460 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 U8Qn58KEc?-mrlxIc3}-f0Iv+RG5`Po diff --git a/software/src/lib/pthread/lib/x86/pthreadVSE2.lib b/software/src/lib/pthread/lib/x86/pthreadVSE2.lib deleted file mode 100644 index 3f3335d46981ea9ed40ad3e648a05c210ee77014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30460 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 +#include +#include +#include +#include "common.h" +#include "crapto1.h" +#include "parity.h" + +#define KEY_SPACE_SIZE (1 << 18) + +typedef struct { + uint32_t authuid; + uint32_t nt; + uint32_t nt_enc; + uint8_t nt_par_enc; +} NtData; + +static uint32_t hex_to_uint32(const char *hex_str) { + return (uint32_t)strtoul(hex_str, NULL, 16); +} + +static int bin_to_uint8_arr(const char *bin_str, uint8_t bit_arr[], uint8_t arr_size) { + if (strlen(bin_str) != arr_size) { + fprintf(stderr, "Error: Binary string (%s) length does not match array size (%i).\n", bin_str, arr_size); + return 1; + } + + for (uint8_t i = 0; i < arr_size; i++) { + if (bin_str[i] == '0') { + bit_arr[i] = 0; + } else if (bin_str[i] == '1') { + bit_arr[i] = 1; + } else { + fprintf(stderr, "Error: Invalid character '%c' in binary string.\n", bin_str[i]); + return 1; + } + } + return 0; +} + +static uint64_t *generate_keys(uint64_t authuid, uint32_t nt, uint32_t nt_enc, uint32_t nt_par_enc, uint32_t *keyCount) { + + uint64_t *result_keys = (uint64_t *)calloc(1, KEY_SPACE_SIZE * sizeof(uint64_t)); + if (result_keys == NULL) { + fprintf(stderr, "\nCalloc error in generate_and_intersect_keys!\n"); + return NULL; + } + + struct Crypto1State *revstate, *revstate_start = NULL, *s = NULL; + uint64_t lfsr = 0; + uint32_t ks1 = nt ^ nt_enc; + + revstate = lfsr_recovery32(ks1, nt ^ authuid); + if (revstate == NULL) { + fprintf(stderr, "\nCalloc error in generate_keys!\n"); + free(result_keys); + return NULL; + } + + revstate_start = revstate; + + s = crypto1_create(0); + if (s == NULL) { + fprintf(stderr, "\nCalloc error in generate_keys!\n"); + free(result_keys); + crypto1_destroy(revstate_start); + return 0; + } + + while ((revstate->odd != 0x0) || (revstate->even != 0x0)) { + lfsr_rollback_word(revstate, nt ^ authuid, 0); + crypto1_get_lfsr(revstate, &lfsr); + + // only filtering possibility: last parity bit ks in ks2 + uint32_t ks2; + uint8_t lastpar1, lastpar2, kslastp; + crypto1_init(s, lfsr); + crypto1_word(s, nt ^ authuid, 0); + ks2 = crypto1_word(s, 0, 0); + lastpar1 = oddparity8(nt & 0xFF); + kslastp = (ks2 >> 24) & 1; + lastpar2 = (nt_par_enc & 1) ^ kslastp; + if (lastpar1 == lastpar2) { + result_keys[(*keyCount)++] = lfsr; + if (*keyCount == KEY_SPACE_SIZE) { + fprintf(stderr, "No space left on result_keys, abort! Increase KEY_SPACE_SIZE\n"); + break; + } + } + revstate++; + } + + crypto1_destroy(s); + crypto1_destroy(revstate_start); + revstate_start = NULL; + return result_keys; +} + +int main(int argc, char *const argv[]) { + + if (argc != 6) { + int cmdlen = strlen(argv[0]); + printf("Usage:\n %s \n" + " parity example: if for block 63 == sector 15, nt in trace is 7b! fc! 7a! 5b\n" + " then nt_enc is 7bfc7a5b and nt_par_err is 1110\n" + "Example:\n" + " %*s a13e4902 15 d14191b3 2e9e49fc 1111\n" + " %*s +uid +s +nt +nt_enc +nt_par_err\n", + argv[0], cmdlen, argv[0], cmdlen, ""); + return 1; + } + + uint64_t *keys = NULL; + uint32_t keyCount = 0; + + uint32_t authuid = hex_to_uint32(argv[1]); + uint32_t sector = atoi(argv[2]); + uint32_t nt = hex_to_uint32(argv[3]); + uint32_t nt_enc = hex_to_uint32(argv[4]); + + uint8_t nt_par_err_arr[4]; + if (bin_to_uint8_arr(argv[5], nt_par_err_arr, 4)) { + return 1; + } + + uint8_t nt_par_enc = ((nt_par_err_arr[0] ^ oddparity8((nt_enc >> 24) & 0xFF)) << 3) | + ((nt_par_err_arr[1] ^ oddparity8((nt_enc >> 16) & 0xFF)) << 2) | + ((nt_par_err_arr[2] ^ oddparity8((nt_enc >> 8) & 0xFF)) << 1) | + ((nt_par_err_arr[3] ^ oddparity8((nt_enc >> 0) & 0xFF)) << 0); + + printf("uid=%08x nt=%08x nt_enc=%08x nt_par_err=%u%u%u%u nt_par_enc=%u%u%u%u ks1=%08x\n" + , authuid + , nt + , nt_enc + , nt_par_err_arr[0] + , nt_par_err_arr[1] + , nt_par_err_arr[2] + , nt_par_err_arr[3] + , (uint8_t)((nt_par_enc >> 3) & 1) + , (uint8_t)((nt_par_enc >> 2) & 1) + , (uint8_t)((nt_par_enc >> 1) & 1) + , (uint8_t)(nt_par_enc & 1) + , nt ^ nt_enc + ); + + + printf("Finding key candidates...\n"); + keys = generate_keys(authuid, nt, nt_enc, nt_par_enc, &keyCount); + + printf("Finding phase complete, found %u keys\n", keyCount); + + FILE *fptr; + char filename[30]; + snprintf(filename, sizeof(filename), "keys_%08x_%02u_%08x.dic", authuid, sector, nt); + + fptr = fopen(filename, "w"); + if (fptr != NULL) { + if (keyCount > 0) { + for (uint32_t j = 0; j < keyCount; j++) { + fprintf(fptr, "%012" PRIx64 "\n", keys[j]); + } + } + fclose(fptr); + } else { + fprintf(stderr, "Warning: Cannot save keys in %s\n", filename); + } + + if (keys != NULL) { + free(keys); + } + return 0; +} diff --git a/software/src/staticnested_2x1nt_rf08s.c b/software/src/staticnested_2x1nt_rf08s.c new file mode 100644 index 0000000..0a83c10 --- /dev/null +++ b/software/src/staticnested_2x1nt_rf08s.c @@ -0,0 +1,279 @@ +// Faster Backdoored Nested Attack against Fudan FM11RF08S tags +// +// Attack conditions: +// * Backdoor +// * keyA and keyB are different for the targeted sector +// +// Strategy: +// * Use backdoor on the targeted sector to get the clear static nested nT for keyA and for keyB +// * Generate 2 lists of key candidates based on clear and encrypted nT +// * Search couples of keyA/keyB satisfying some obscure relationship +// * Use the resulting dictionary to bruteforce the keyA (and staticnested_2x1nt_rf08s_1key for keyB) +// +// Doegox, 2024, cf https://eprint.iacr.org/2024/1275 for more info + +#include +#include +#include +#include +#include + +uint16_t i_lfsr16[1 << 16] = {0}; +uint16_t s_lfsr16[1 << 16] = {0}; + +static void init_lfsr16_table(void) { + uint16_t x = 1; + for (uint16_t i = 1; i; ++i) { + i_lfsr16[(x & 0xff) << 8 | x >> 8] = i; + s_lfsr16[i] = (x & 0xff) << 8 | x >> 8; + x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15; + } +} + +// static uint16_t next_lfsr16(uint16_t nonce) { +// uint16_t i = i_lfsr16[nonce]; +// if (i == 0xffff) { +// i = 1; +// } else { +// i++; +// } +// return s_lfsr16[i]; +// } + +static uint16_t prev_lfsr16(uint16_t nonce) { + uint16_t i = i_lfsr16[nonce]; + if (i == 1) { + i = 0xffff; + } else { + i--; + } + return s_lfsr16[i]; +} + +static uint16_t compute_seednt16_nt32(uint32_t nt32, uint64_t key) { + uint8_t a[] = {0, 8, 9, 4, 6, 11, 1, 15, 12, 5, 2, 13, 10, 14, 3, 7}; + uint8_t b[] = {0, 13, 1, 14, 4, 10, 15, 7, 5, 3, 8, 6, 9, 2, 12, 11}; + uint16_t nt = nt32 >> 16; + uint8_t prev = 14; + for (uint8_t i = 0; i < prev; i++) { + nt = prev_lfsr16(nt); + } + uint8_t prevoff = 8; + bool odd = 1; + + for (uint8_t i = 0; i < 6 * 8; i += 8) { + if (odd) { + nt ^= (a[(key >> i) & 0xF]); + nt ^= (b[(key >> i >> 4) & 0xF]) << 4; + } else { + nt ^= (b[(key >> i) & 0xF]); + nt ^= (a[(key >> i >> 4) & 0xF]) << 4; + } + odd ^= 1; + prev += prevoff; + for (uint8_t j = 0; j < prevoff; j++) { + nt = prev_lfsr16(nt); + } + } + return nt; +} + +int main(int argc, char *const argv[]) { + + if (argc != 3) { + printf("Usage:\n %s keys___.dic keys___.dic\n" + " where both dict files are produced by staticnested_1nt *for the same UID and same sector*\n", + argv[0]); + return 1; + } + + uint32_t uid1, sector1, nt1, uid2, sector2, nt2; + char *filename1 = argv[1], *filename2 = argv[2]; + + int result = sscanf(filename1, "keys_%8x_%2u_%8x.dic", &uid1, §or1, &nt1); + if (result != 3) { + fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename1); + return 1; + } + + result = sscanf(filename2, "keys_%8x_%2u_%8x.dic", &uid2, §or2, &nt2); + if (result != 3) { + fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename2); + return 1; + } + + if (uid1 != uid2) { + fprintf(stderr, "Error: Files must belong to the same UID.\n"); + return 1; + } + + if (sector1 != sector2) { + fprintf(stderr, "Error: Files must belong to the same sector.\n"); + return 1; + } + + if (nt1 == nt2) { + fprintf(stderr, "Error: Files must belong to different nonces.\n"); + return 1; + } + + init_lfsr16_table(); + + uint32_t keycount1 = 0; + uint64_t *keys1 = NULL; + uint8_t *filter_keys1 = NULL; + uint16_t *seednt1 = NULL; + uint32_t keycount2 = 0; + uint64_t *keys2 = NULL; + uint8_t *filter_keys2 = NULL; + FILE *fptr; + + fptr = fopen(filename1, "r"); + if (fptr != NULL) { + + uint64_t buffer; + while (fscanf(fptr, "%012" PRIx64, &buffer) == 1) { + keycount1++; + } + + keys1 = (uint64_t *)calloc(1, keycount1 * sizeof(uint64_t)); + filter_keys1 = (uint8_t *)calloc(keycount1, sizeof(uint8_t)); + if ((keys1 == NULL) || (filter_keys1 == NULL)) { + perror("Failed to allocate memory"); + fclose(fptr); + goto end; + } + + rewind(fptr); + + for (uint32_t i = 0; i < keycount1; i++) { + if (fscanf(fptr, "%012" PRIx64, &keys1[i]) != 1) { + perror("Failed to read key"); + fclose(fptr); + goto end; + } + } + fclose(fptr); + } else { + fprintf(stderr, "Warning: Cannot open %s\n", filename1); + goto end; + } + + fptr = fopen(filename2, "r"); + if (fptr != NULL) { + + uint64_t buffer; + while (fscanf(fptr, "%012" PRIx64, &buffer) == 1) { + keycount2++; + } + + keys2 = (uint64_t *)calloc(1, keycount2 * sizeof(uint64_t)); + filter_keys2 = (uint8_t *)calloc(keycount2, sizeof(uint8_t)); + if ((keys2 == NULL) || (filter_keys2 == NULL)) { + perror("Failed to allocate memory"); + fclose(fptr); + goto end; + } + + rewind(fptr); + + for (uint32_t i = 0; i < keycount2; i++) { + if (fscanf(fptr, "%012" PRIx64, &keys2[i]) != 1) { + perror("Failed to read key"); + fclose(fptr); + goto end; + } + } + fclose(fptr); + } else { + fprintf(stderr, "Warning: Cannot open %s\n", filename2); + goto end; + } + + printf("%s: %u keys loaded\n", filename1, keycount1); + printf("%s: %u keys loaded\n", filename2, keycount2); + + seednt1 = (uint16_t *)calloc(1, keycount1 * sizeof(uint16_t)); + if (seednt1 == NULL) { + perror("Failed to allocate memory"); + goto end; + } + + for (uint32_t i = 0; i < keycount1; i++) { + seednt1[i] = compute_seednt16_nt32(nt1, keys1[i]); + } + + for (uint32_t j = 0; j < keycount2; j++) { + uint16_t seednt2 = compute_seednt16_nt32(nt2, keys2[j]); + for (uint32_t i = 0; i < keycount1; i++) { + if (seednt2 == seednt1[i]) { +// printf("MATCH: key1=%012" PRIx64 " key2=%012" PRIx64 "\n", keys1[i], keys2[j]); + filter_keys1[i] = 1; + filter_keys2[j] = 1; + } + } + } + + char filter_filename1[40]; + uint32_t filter_keycount1 = 0; + snprintf(filter_filename1, sizeof(filter_filename1), "keys_%08x_%02u_%08x_filtered.dic", uid1, sector1, nt1); + + fptr = fopen(filter_filename1, "w"); + if (fptr != NULL) { + + for (uint32_t j = 0; j < keycount1; j++) { + if (filter_keys1[j]) { + filter_keycount1++; + fprintf(fptr, "%012" PRIx64 "\n", keys1[j]); + } + } + fclose(fptr); + + } else { + fprintf(stderr, "Warning: Cannot save keys in %s\n", filter_filename1); + } + + char filter_filename2[40]; + uint32_t filter_keycount2 = 0; + snprintf(filter_filename2, sizeof(filter_filename2), "keys_%08x_%02u_%08x_filtered.dic", uid2, sector2, nt2); + + fptr = fopen(filter_filename2, "w"); + if (fptr != NULL) { + + for (uint32_t j = 0; j < keycount2; j++) { + if (filter_keys2[j]) { + filter_keycount2++; + fprintf(fptr, "%012" PRIx64 "\n", keys2[j]); + } + } + fclose(fptr); + + } else { + fprintf(stderr, "Warning: Cannot save keys in %s\n", filter_filename2); + } + printf("%s: %u keys saved\n", filter_filename1, filter_keycount1); + printf("%s: %u keys saved\n", filter_filename2, filter_keycount2); + +end: + if (keys1 != NULL) { + free(keys1); + } + + if (keys2 != NULL) { + free(keys2); + } + + if (filter_keys1 != NULL) { + free(filter_keys1); + } + + if (filter_keys2 != NULL) { + free(filter_keys2); + } + + if (seednt1 != NULL) { + free(seednt1); + } + + return 0; +} diff --git a/software/src/staticnested_2x1nt_rf08s_1key.c b/software/src/staticnested_2x1nt_rf08s_1key.c new file mode 100644 index 0000000..91a2f23 --- /dev/null +++ b/software/src/staticnested_2x1nt_rf08s_1key.c @@ -0,0 +1,169 @@ +// Faster Backdoored Nested Attack against Fudan FM11RF08S tags, part 2 +// +// Attack conditions: +// * Backdoor +// * keyA and keyB are different for the targeted sector +// +// Strategy: +// * Use f08s_nested_known_collision to crack keyA +// * If keyB not readable, find keyB in its dictionary based on the obscure relationship between keyA, keyB and their nT +// +// Doegox, 2024, cf https://eprint.iacr.org/2024/1275 for more info + +#include +#include +#include +#include +#include + +static uint32_t hex_to_uint32(const char *hex_str) { + return (uint32_t)strtoul(hex_str, NULL, 16); +} + +uint16_t i_lfsr16[1 << 16] = {0}; +uint16_t s_lfsr16[1 << 16] = {0}; + +static void init_lfsr16_table(void) { + uint16_t x = 1; + for (uint16_t i = 1; i; ++i) { + i_lfsr16[(x & 0xff) << 8 | x >> 8] = i; + s_lfsr16[i] = (x & 0xff) << 8 | x >> 8; + x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15; + } +} + +// static uint16_t next_lfsr16(uint16_t nonce) { +// uint16_t i = i_lfsr16[nonce]; +// if (i == 0xffff) { +// i = 1; +// } else { +// i++; +// } +// return s_lfsr16[i]; +// } + +static uint16_t prev_lfsr16(uint16_t nonce) { + uint16_t i = i_lfsr16[nonce]; + if (i == 1) { + i = 0xffff; + } else { + i--; + } + return s_lfsr16[i]; +} + +static uint16_t compute_seednt16_nt32(uint32_t nt32, uint64_t key) { + uint8_t a[] = {0, 8, 9, 4, 6, 11, 1, 15, 12, 5, 2, 13, 10, 14, 3, 7}; + uint8_t b[] = {0, 13, 1, 14, 4, 10, 15, 7, 5, 3, 8, 6, 9, 2, 12, 11}; + uint16_t nt = nt32 >> 16; + uint8_t prev = 14; + + for (uint8_t i = 0; i < prev; i++) { + nt = prev_lfsr16(nt); + } + + uint8_t prevoff = 8; + bool odd = 1; + + for (uint8_t i = 0; i < 6 * 8; i += 8) { + + if (odd) { + nt ^= (a[(key >> i) & 0xF]); + nt ^= (b[(key >> i >> 4) & 0xF]) << 4; + } else { + nt ^= (b[(key >> i) & 0xF]); + nt ^= (a[(key >> i >> 4) & 0xF]) << 4; + } + + odd ^= 1; + prev += prevoff; + + for (uint8_t j = 0; j < prevoff; j++) { + nt = prev_lfsr16(nt); + } + } + return nt; +} + +int main(int argc, char *const argv[]) { + + if (argc != 4) { + printf("Usage:\n %s keys___.dic\n" + " where dict file is produced by rf08s_nested_known *for the same UID and same sector* as provided nt and key\n", + argv[0]); + return 1; + } + + uint32_t nt1 = hex_to_uint32(argv[1]); + uint64_t key1 = 0; + if (sscanf(argv[2], "%012" PRIx64, &key1) != 1) { + fprintf(stderr, "Failed to parse key: %s", argv[2]); + return 1; + } + + char *filename = argv[3]; + uint32_t uid, sector, nt2; + + int result = sscanf(filename, "keys_%8x_%2u_%8x.dic", &uid, §or, &nt2); + if (result != 3) { + fprintf(stderr, "Error: Failed to parse the filename %s.\n", filename); + return 1; + } + + if (nt1 == nt2) { + fprintf(stderr, "Error: File must belong to different nonce.\n"); + return 1; + } + + init_lfsr16_table(); + + uint32_t keycount2 = 0; + uint64_t *keys2 = NULL; + + FILE *fptr = fopen(filename, "r"); + if (fptr != NULL) { + + uint64_t buffer; + while (fscanf(fptr, "%012" PRIx64, &buffer) == 1) { + keycount2++; + } + + keys2 = (uint64_t *)calloc(1, keycount2 * sizeof(uint64_t)); + if (keys2 == NULL) { + perror("Failed to allocate memory"); + fclose(fptr); + goto end; + } + + rewind(fptr); + + for (uint32_t i = 0; i < keycount2; i++) { + if (fscanf(fptr, "%012" PRIx64, &keys2[i]) != 1) { + perror("Failed to read key"); + fclose(fptr); + goto end; + } + } + fclose(fptr); + + } else { + fprintf(stderr, "Warning: Cannot open %s\n", filename); + goto end; + } + + uint32_t found = 0; + uint16_t seednt1 = compute_seednt16_nt32(nt1, key1); + for (uint32_t i = 0; i < keycount2; i++) { + if (seednt1 == compute_seednt16_nt32(nt2, keys2[i])) { + printf("%012" PRIx64 "\n", keys2[i]); + found++; + } + } + +end: + if (keys2 != NULL) { + free(keys2); + } + + return 0; +} diff --git a/software/src/xz/CMakeLists.txt b/software/src/xz/CMakeLists.txt deleted file mode 100644 index 32506cd..0000000 --- a/software/src/xz/CMakeLists.txt +++ /dev/null @@ -1,2485 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# CMake support for building XZ Utils -# -# Requirements: -# -# - CMake 3.20 or later -# -# - To get translated messages, install GNU gettext tools (the command -# msgfmt is needed). Alternatively disable translations by setting -# XZ_NLS=OFF. -# -# - If building from xz.git instead of a release tarball: To generate -# translated man pages, run po4a/update-po which requires the po4a -# tool. The build works without this step too. -# -# About CMAKE_BUILD_TYPE: -# -# - CMake's standard choices are fine to use for production builds, -# including "Release" and "RelWithDebInfo". -# -# NOTE: While "Release" uses -O3 by default with some compilers, -# this file overrides -O3 to -O2 for "Release" builds if -# CMAKE_C_FLAGS_RELEASE is not defined by the user. At least -# with GCC and Clang/LLVM, -O3 doesn't seem useful for this -# package as it can result in bigger binaries without any -# improvement in speed compared to -O2. -# -# - Empty value (the default) is handled slightly specially: It -# adds -DNDEBUG to disable debugging code (assert() and a few -# other things). No optimization flags are added so an empty -# CMAKE_BUILD_TYPE is an easy way to build with whatever -# optimization flags one wants, and so this method is also -# suitable for production builds. -# -# If debugging is wanted when using empty CMAKE_BUILD_TYPE, -# include -UNDEBUG in the CFLAGS environment variable or -# in the CMAKE_C_FLAGS CMake variable to override -DNDEBUG. -# With empty CMAKE_BUILD_TYPE, the -UNDEBUG option will go -# after the -DNDEBUG option on the compiler command line and -# thus NDEBUG will be undefined. -# -# - Non-standard build types like "None" aren't treated specially -# and thus won't have -DNEBUG. Such non-standard build types -# SHOULD BE AVOIDED FOR PRODUCTION BUILDS. Or at least one -# should remember to add -DNDEBUG. -# -# This file provides the following installation components (if you only -# need liblzma, install only its components!): -# - liblzma_Runtime (shared library only) -# - liblzma_Development -# - liblzma_Documentation (examples and Doxygen-generated API docs as HTML) -# - xz_Runtime (xz, the symlinks, and possibly translation files) -# - xz_Documentation (xz man pages and the symlinks) -# - xzdec_Runtime -# - xzdec_Documentation (xzdec *and* lzmadec man pages) -# - lzmadec_Runtime -# - lzmainfo_Runtime -# - lzmainfo_Documentation (lzmainfo man pages) -# - scripts_Runtime (xzdiff, xzgrep, xzless, xzmore) -# - scripts_Documentation (their man pages) -# - Documentation (generic docs like README and licenses) -# -# To find the target liblzma::liblzma from other packages, use the CONFIG -# option with find_package() to avoid a conflict with the FindLibLZMA module -# with case-insensitive file systems. For example, to require liblzma 5.2.5 -# or a newer compatible version: -# -# find_package(liblzma 5.2.5 REQUIRED CONFIG) -# target_link_libraries(my_application liblzma::liblzma) -# -############################################################################# -# -# Author: Lasse Collin -# -############################################################################# - -cmake_minimum_required(VERSION 3.20...3.31 FATAL_ERROR) - -include(CMakePushCheckState) -include(CheckIncludeFile) -include(CheckSymbolExists) -include(CheckStructHasMember) -include(CheckCSourceCompiles) -include(CheckCCompilerFlag) -include(cmake/tuklib_large_file_support.cmake) -include(cmake/tuklib_integer.cmake) -include(cmake/tuklib_cpucores.cmake) -include(cmake/tuklib_physmem.cmake) -include(cmake/tuklib_progname.cmake) -include(cmake/tuklib_mbstr.cmake) - -set(PACKAGE_NAME "XZ Utils") -set(PACKAGE_BUGREPORT "xz@tukaani.org") -set(PACKAGE_URL "https://tukaani.org/xz/") - -# Get the package version from version.h into PACKAGE_VERSION_SHORT and -# PACKAGE_VERSION. The former variable won't include the possible "alpha" -# or "beta" suffix. -file(READ src/liblzma/api/lzma/version.h PACKAGE_VERSION) -string(REGEX REPLACE -"^.*\n\ -#define LZMA_VERSION_MAJOR ([0-9]+)\n\ -.*\ -#define LZMA_VERSION_MINOR ([0-9]+)\n\ -.*\ -#define LZMA_VERSION_PATCH ([0-9]+)\n\ -.*$" - "\\1.\\2.\\3" PACKAGE_VERSION_SHORT "${PACKAGE_VERSION}") - -if(PACKAGE_VERSION MATCHES "\n#define [A-Z_ ]*_ALPHA\n") - set(PACKAGE_VERSION "${PACKAGE_VERSION_SHORT}alpha") -elseif(PACKAGE_VERSION MATCHES "\n#define [A-Z_ ]*_BETA\n") - set(PACKAGE_VERSION "${PACKAGE_VERSION_SHORT}beta") -else() - set(PACKAGE_VERSION "${PACKAGE_VERSION_SHORT}") -endif() - -# With several compilers, CMAKE_BUILD_TYPE=Release uses -O3 optimization -# which results in bigger code without a clear difference in speed. If -# no user-defined CMAKE_C_FLAGS_RELEASE is present, override -O3 to -O2 -# to make it possible to recommend CMAKE_BUILD_TYPE=Release. -if(NOT DEFINED CMAKE_C_FLAGS_RELEASE) - set(OVERRIDE_O3_IN_C_FLAGS_RELEASE ON) -endif() - -# Among other things, this gives us variables xz_VERSION and xz_VERSION_MAJOR. -project(xz VERSION "${PACKAGE_VERSION_SHORT}" LANGUAGES C) - -if(OVERRIDE_O3_IN_C_FLAGS_RELEASE) - # Looking at CMake's source, there aren't any _FLAGS_RELEASE_INIT - # entries where "-O3" would appear as part of some other option, - # thus a simple search and replace should be fine. - string(REPLACE -O3 -O2 CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") - - # Update the cache value while keeping its docstring unchanged. - set_property(CACHE CMAKE_C_FLAGS_RELEASE - PROPERTY VALUE "${CMAKE_C_FLAGS_RELEASE}") -endif() - -# Reject unsupported MSVC versions. -if(MSVC AND MSVC_VERSION LESS 1900) - message(FATAL_ERROR "Visual Studio older than 2015 is not supported") -endif() - -# We need a compiler that supports enough C99 or newer (variable-length arrays -# aren't needed, those are optional in C11/C17). C11 is preferred since C11 -# features may be optionally used if they are available. -# -# Setting CMAKE_C_STANDARD here makes it the default for all targets. -# It doesn't affect the INTERFACE so liblzma::liblzma won't end up with -# INTERFACE_COMPILE_FEATURES "c_std_99" or such (the API headers are C89 -# and C++ compatible). -# -# Avoid set(CMAKE_C_STANDARD_REQUIRED ON) because it's fine to decay -# to C99 if C11 isn't supported. -set(CMAKE_C_STANDARD 11) - -# On Apple OSes, don't build executables as bundles: -set(CMAKE_MACOSX_BUNDLE OFF) - -# The targets defined here don't support compiling as a unity build. Encoder -# and decoder source files define different types with the same name, and some -# internal header files don't have header guards leading to redeclaration -# errors. -set(CMAKE_UNITY_BUILD OFF) - -# Set CMAKE_INSTALL_LIBDIR and friends. This needs to be done before -# the LOCALEDIR_DEFINITION workaround below. -include(GNUInstallDirs) - -# windres from GNU binutils can be tricky with command line arguments -# that contain spaces or other funny characters. Unfortunately we need -# a space in PACKAGE_NAME. Using \x20 to encode the US-ASCII space seems -# to work in both cmd.exe and /bin/sh. -# -# However, even \x20 isn't enough in all situations, resulting in -# "syntax error" from windres. Using --use-temp-file prevents windres -# from using popen() and this seems to fix the problem. -# -# llvm-windres from Clang/LLVM 16.0.6 and older: The \x20 results -# in "XZx20Utils" in the compiled binary. The option --use-temp-file -# makes no difference. -# -# llvm-windres 17.0.0 and later: It emulates GNU windres more accurately, so -# the workarounds used with GNU windres must be used with llvm-windres too. -# -# CMake 3.27 doesn't have CMAKE_RC_COMPILER_ID so we rely on -# CMAKE_C_COMPILER_ID. -if((MINGW OR CYGWIN) AND ( - NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" OR - CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "17")) - # Use workarounds with GNU windres and llvm-windres >= 17.0.0. The \x20 - # in PACKAGE_NAME_DEFINITION works with gcc and clang too so we don't need - # to worry how to pass different flags to windres and the C compiler. - # Keep the original PACKAGE_NAME intact for generation of liblzma.pc. - string(APPEND CMAKE_RC_FLAGS " --use-temp-file") - string(REPLACE " " "\\040" PACKAGE_NAME_DEFINITION "${PACKAGE_NAME}") - - # Use octal because "Program Files" would become \x20F. - string(REPLACE " " "\\040" LOCALEDIR_DEFINITION - "${CMAKE_INSTALL_FULL_LOCALEDIR}") -else() - # Elsewhere a space is safe. This also keeps things compatible with - # EBCDIC in case CMake-based build is ever done on such a system. - set(PACKAGE_NAME_DEFINITION "${PACKAGE_NAME}") - set(LOCALEDIR_DEFINITION "${CMAKE_INSTALL_FULL_LOCALEDIR}") -endif() - -# When used with MSVC, CMake can merge .manifest files with -# linker-generated manifests and embed the result in an executable. -# However, when paired with MinGW-w64, CMake (3.30) ignores .manifest -# files. Embedding a manifest with a resource file works with both -# toochains. It's also the way to do it with Autotools. -# -# With MSVC, we need to disable the default manifest; attempting to add -# two manifest entries would break the build. The flag /MANIFEST:NO -# goes to the linker and it also affects behavior of CMake itself: it -# looks what flags are being passed to the linker and when CMake sees -# the /MANIFEST:NO option, other manifest-related linker flags are -# no longer added (see the file Source/cmcmd.cxx in CMake). -# -# See: https://gitlab.kitware.com/cmake/cmake/-/issues/23066 -if(MSVC) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") -endif() - -# Dependencies for all Windows resource files: -set(W32RES_DEPENDENCIES - "${CMAKE_CURRENT_SOURCE_DIR}/src/common/common_w32res.rc" - "${CMAKE_CURRENT_SOURCE_DIR}/src/common/w32_application.manifest" -) - -# Definitions common to all targets: -add_compile_definitions( - # Package info: - PACKAGE_NAME="${PACKAGE_NAME_DEFINITION}" - PACKAGE_BUGREPORT="${PACKAGE_BUGREPORT}" - PACKAGE_URL="${PACKAGE_URL}" - - # Standard headers and types are available: - HAVE_STDBOOL_H - HAVE__BOOL - HAVE_STDINT_H - HAVE_INTTYPES_H - - # Always enable CRC32 since liblzma should never build without it. - HAVE_CHECK_CRC32 - - # Disable assert() checks when no build type has been specified. Non-empty - # build types like "Release" and "Debug" handle this by default. - $<$:NDEBUG> -) - -# Support 32-bit x86 assembly files. -if(NOT MSVC) - # It's simplest to ask the compiler for the architecture because we - # know that on supported platforms __i386__ is defined. - # - # Checking CMAKE_SYSTEM_PROCESSOR wouldn't be so simple or as reliable - # because it could indicate x86-64 even if building for 32-bit x86 - # because one doesn't necessarily use a CMake toolchain file when - # building 32-bit executables on a 64-bit system. Also, the strings - # that identify 32-bit or 64-bit x86 aren't standardized in CMake. - if(MINGW OR CYGWIN OR CMAKE_SYSTEM_NAME MATCHES - "^FreeBSD$|^GNU$|^Linux$|^MirBSD$|^NetBSD$|^OpenBSD$") - check_symbol_exists("__i386__" "" ASM_I386_DEFAULT) - else() - set(ASM_I386_DEFAULT OFF) - endif() - - option(XZ_ASM_I386 "Enable 32-bit x86 assembly code" - "${ASM_I386_DEFAULT}") - - if(XZ_ASM_I386) - enable_language(ASM) - endif() -endif() - - -###################### -# System definitions # -###################### - -# _GNU_SOURCE and such definitions. This specific macro is special since -# it also adds the definitions to CMAKE_REQUIRED_DEFINITIONS. -tuklib_use_system_extensions() - -# Check for large file support. It's required on some 32-bit platforms and -# even on 64-bit MinGW-w64 to get 64-bit off_t. This can be forced off on -# the CMake command line if needed: -DLARGE_FILE_SUPPORT=OFF -tuklib_large_file_support(ALL) - -# This is needed by liblzma and xz. -tuklib_integer(ALL) - -# This is used for liblzma.pc generation to add -lrt and -lmd if needed. -# -# The variable name LIBS comes from Autoconf where AC_SEARCH_LIBS adds the -# libraries it finds into the shell variable LIBS. These libraries need to -# be put into liblzma.pc too, thus liblzma.pc.in has @LIBS@ because that -# matches the Autoconf's variable. When CMake support was added, using -# the same variable with configure_file() was the simplest method. -set(LIBS) - -# Check for clock_gettime(). Do this before checking for threading so -# that we know there if CLOCK_MONOTONIC is available. -check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME) - -if(NOT HAVE_CLOCK_GETTIME) - # With glibc <= 2.17 or Solaris 10 this needs librt. - # Add librt for the next check for HAVE_CLOCK_GETTIME. If it is - # found after including the library, we know that librt is required. - list(PREPEND CMAKE_REQUIRED_LIBRARIES rt) - check_symbol_exists(clock_gettime time.h HAVE_CLOCK_GETTIME_LIBRT) - - # If it was found now, add librt to all targets and keep it in - # CMAKE_REQUIRED_LIBRARIES for further tests too. - if(HAVE_CLOCK_GETTIME_LIBRT) - link_libraries(rt) - set(LIBS "-lrt ${LIBS}") # For liblzma.pc - else() - list(POP_FRONT CMAKE_REQUIRED_LIBRARIES) - endif() -endif() - -if(HAVE_CLOCK_GETTIME OR HAVE_CLOCK_GETTIME_LIBRT) - add_compile_definitions(HAVE_CLOCK_GETTIME) - - # Check if CLOCK_MONOTONIC is available for clock_gettime(). - check_symbol_exists(CLOCK_MONOTONIC time.h HAVE_CLOCK_MONOTONIC) - tuklib_add_definition_if(ALL HAVE_CLOCK_MONOTONIC) -endif() - - -# The definition ENABLE_NLS is added only to those targets that use it, thus -# it's not done here. (xz has translations, xzdec doesn't.) -set(XZ_NLS_DEFAULT OFF) -find_package(Intl) -find_package(Gettext) -if(Intl_FOUND AND GETTEXT_FOUND) - set(XZ_NLS_DEFAULT ON) -endif() - -option(XZ_NLS "Native Language Support (translated messages and man pages)" - "${XZ_NLS_DEFAULT}") - -if(XZ_NLS) - if(NOT Intl_FOUND) - message(FATAL_ERROR "Native language support (NLS) was enabled but " - "find_package(Intl) failed. " - "Install libintl or set XZ_NLS=OFF.") - endif() - - if(NOT GETTEXT_FOUND) - message(FATAL_ERROR "Native language support (NLS) was enabled but " - "find_package(Gettext) failed. " - "Install gettext tools or set XZ_NLS=OFF.") - endif() - - if(WIN32) - # The command line tools use UTF-8 on native Windows. - # Non-ASCII characters display correctly only when - # using UCRT and gettext-runtime >= 0.23.1. - check_c_source_compiles( - "#define WIN32_LEAN_AND_MEAN - #include - #include - - #ifndef _UCRT - #error \"Not UCRT\" - #endif - - #if LIBINTL_VERSION < 0x001701 - #error \"gettext-runtime < 0.23.1\" - #endif - - int main(void) { return 0; } - " - USING_UCRT_AND_RECENT_GETTEXT) - if(NOT USING_UCRT_AND_RECENT_GETTEXT) - message(FATAL_ERROR "Native language support (NLS) was enabled " - "but it requires UCRT and " - "gettext-runtime >= 0.23.1. To build with " - "MSVCRT or old gettext-runtime, " - "set XZ_NLS=OFF.") - endif() - endif() - - # Warn if translated man pages are missing. - if(UNIX AND NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/po4a/man") - message(WARNING "Native language support (NLS) was enabled " - "but pre-generated translated man pages " - "were not found and thus they won't be installed. " - "Run 'po4a/update-po' to generate them.") - endif() - - # The *installed* name of the translation files is "xz.mo". - set(TRANSLATION_DOMAIN "xz") -endif() - - -# Add warning options for GCC or Clang. Keep this in sync with configure.ac. -# -# NOTE: add_compile_options() doesn't affect the feature checks; -# only the new targets being created use these flags. Thus -# the -Werror usage in checks won't be break because of these. -if(CMAKE_C_COMPILER_ID MATCHES GNU|Clang) - foreach(OPT -Wall - -Wextra - -Wvla - -Wformat=2 - -Winit-self - -Wmissing-include-dirs - -Wshift-overflow=2 - -Wstrict-overflow=3 - -Walloc-zero - -Wduplicated-cond - -Wfloat-equal - -Wundef - -Wshadow - -Wpointer-arith - -Wbad-function-cast - -Wwrite-strings - -Wdate-time - -Wsign-conversion - -Wfloat-conversion - -Wlogical-op - -Waggregate-return - -Wstrict-prototypes - -Wold-style-definition - -Wmissing-prototypes - -Wmissing-declarations - -Wredundant-decls - -Wimplicit-fallthrough - -Wimplicit-fallthrough=5 - - -Wc99-compat - -Wc11-extensions - -Wc2x-compat - -Wc2x-extensions - -Wpre-c2x-compat - -Warray-bounds-pointer-arithmetic - -Wassign-enum - -Wconditional-uninitialized - -Wdocumentation - -Wduplicate-enum - -Wempty-translation-unit - -Wflexible-array-extensions - -Wmissing-variable-declarations - -Wnewline-eof - -Wshift-sign-overflow - -Wstring-conversion - ) - # A variable name cannot have = in it so replace = with _. - string(REPLACE = _ CACHE_VAR "HAVE_COMPILER_OPTION_${OPT}") - - check_c_compiler_flag("${OPT}" "${CACHE_VAR}") - - if("${${CACHE_VAR}}") - add_compile_options("${OPT}") - endif() - endforeach() -endif() - - -############################################################################# -# liblzma -############################################################################# - -option(BUILD_SHARED_LIBS "Build liblzma as a shared library instead of static") - -# Symbol versioning is supported with ELF shared libraries on certain OSes. -# First assume that symbol versioning isn't supported. -set(SYMBOL_VERSIONING "no") - -if(NOT WIN32) - # The XZ_SYMBOL_VERSIONING option is ignored for static libraries but - # we keep the option visible still in case the project is reconfigured - # to build a shared library. - # - # auto Autodetect between no, generic, and linux - # yes Force on by autodetecting between linux and generic - # no Disable symbol versioning - # generic FreeBSD, most Linux/glibc systems, and GNU/Hurd - # linux Linux/glibc with extra symbol versions for compatibility - # with binaries that have been linked against a liblzma version - # that has been patched with "xz-5.2.2-compat-libs.patch" from - # RHEL/CentOS 7. - set(SUPPORTED_SYMBOL_VERSIONING_VARIANTS auto yes no generic linux) - set(XZ_SYMBOL_VERSIONING "auto" CACHE STRING "Enable ELF shared library \ -symbol versioning (${SUPPORTED_SYMBOL_VERSIONING_VARIANTS})") - - # Show a dropdown menu in CMake GUI: - set_property(CACHE XZ_SYMBOL_VERSIONING - PROPERTY STRINGS "${SUPPORTED_SYMBOL_VERSIONING_VARIANTS}") - - if(NOT XZ_SYMBOL_VERSIONING IN_LIST SUPPORTED_SYMBOL_VERSIONING_VARIANTS) - message(FATAL_ERROR "'${XZ_SYMBOL_VERSIONING}' is not a supported " - "symbol versioning variant") - endif() - - if(NOT XZ_SYMBOL_VERSIONING MATCHES "^auto$|^yes$") - # Autodetection was disabled. Use the user-specified value as is. - set(SYMBOL_VERSIONING "${XZ_SYMBOL_VERSIONING}") - else() - # Autodetect the symbol versioning variant. - # - # Avoid symvers on Linux with non-glibc like musl and uClibc. - # In Autoconf it's enough to check that $host_os equals linux-gnu - # instead of, for example, linux-musl. CMake doesn't provide such - # a method. - # - # This check is here for now since it's not strictly required - # by anything else. - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - check_c_source_compiles( - "#include - #if defined(__GLIBC__) && !defined(__UCLIBC__) - int main(void) { return 0; } - #else - compile error - #endif - " - IS_LINUX_WITH_GLIBC) - else() - set(IS_LINUX_WITH_GLIBC OFF) - endif() - - if(IS_LINUX_WITH_GLIBC AND - (CMAKE_SYSTEM_PROCESSOR MATCHES "[Mm]icro[Bb]laze" OR - CMAKE_C_COMPILER_ID STREQUAL "NVHPC")) - # As a special case, GNU/Linux on MicroBlaze gets the generic - # symbol versioning because GCC 12 doesn't support the __symver__ - # attribute on MicroBlaze. On Linux, CMAKE_SYSTEM_PROCESSOR comes - # from "uname -m" for native builds (should be "microblaze") or - # from the CMake toolchain file (not perfectly standardized but - # it very likely has "microblaze" in lower case or mixed case - # somewhere in the string). - # - # NVIDIA HPC Compiler doesn't support symbol versioning but - # it uses the linked from the system so the linker script - # can still be used to get the generic symbol versioning. - set(SYMBOL_VERSIONING "generic") - - elseif(IS_LINUX_WITH_GLIBC) - # GNU/Linux-specific symbol versioning for shared liblzma. This - # includes a few extra compatibility symbols for RHEL/CentOS 7 - # which are pointless on non-glibc non-Linux systems. - set(SYMBOL_VERSIONING "linux") - - elseif(CMAKE_SYSTEM_NAME MATCHES "^FreeBSD$|^GNU$" OR - XZ_SYMBOL_VERSIONING STREQUAL "yes") - set(SYMBOL_VERSIONING "generic") - endif() - endif() -endif() - -set(LIBLZMA_API_HEADERS - src/liblzma/api/lzma.h - src/liblzma/api/lzma/base.h - src/liblzma/api/lzma/bcj.h - src/liblzma/api/lzma/block.h - src/liblzma/api/lzma/check.h - src/liblzma/api/lzma/container.h - src/liblzma/api/lzma/delta.h - src/liblzma/api/lzma/filter.h - src/liblzma/api/lzma/hardware.h - src/liblzma/api/lzma/index.h - src/liblzma/api/lzma/index_hash.h - src/liblzma/api/lzma/lzma12.h - src/liblzma/api/lzma/stream_flags.h - src/liblzma/api/lzma/version.h - src/liblzma/api/lzma/vli.h -) - -add_library(liblzma - src/common/mythread.h - src/common/sysdefs.h - src/common/tuklib_common.h - src/common/tuklib_config.h - src/common/tuklib_integer.h - src/common/tuklib_physmem.c - src/common/tuklib_physmem.h - ${LIBLZMA_API_HEADERS} - src/liblzma/check/check.c - src/liblzma/check/check.h - src/liblzma/check/crc_common.h - src/liblzma/check/crc_x86_clmul.h - src/liblzma/check/crc32_arm64.h - src/liblzma/check/crc32_loongarch.h - src/liblzma/common/block_util.c - src/liblzma/common/common.c - src/liblzma/common/common.h - src/liblzma/common/easy_preset.c - src/liblzma/common/easy_preset.h - src/liblzma/common/filter_common.c - src/liblzma/common/filter_common.h - src/liblzma/common/hardware_physmem.c - src/liblzma/common/index.c - src/liblzma/common/index.h - src/liblzma/common/memcmplen.h - src/liblzma/common/stream_flags_common.c - src/liblzma/common/stream_flags_common.h - src/liblzma/common/string_conversion.c - src/liblzma/common/vli_size.c -) - -target_include_directories(liblzma PRIVATE - src/liblzma/api - src/liblzma/common - src/liblzma/check - src/liblzma/lz - src/liblzma/rangecoder - src/liblzma/lzma - src/liblzma/delta - src/liblzma/simple - src/common -) - - -############# -# Threading # -############# - -# Supported threading methods: -# yes - Autodetect the best threading method. The autodetection will -# prefer Windows threading (win95 or vista) over posix if both are -# available. vista threads will be used over win95 unless it is a -# 32-bit build. Configuration fails if no threading support is found; -# threading won't be silently disabled. -# no - Disable threading. -# posix - Use posix threading (pthreads), or throw an error if not available. -# win95 - Use Windows win95 threading, or throw an error if not available. -# vista - Use Windows vista threading, or throw an error if not available. -set(SUPPORTED_THREADING_METHODS yes no posix win95 vista) - -set(XZ_THREADS yes CACHE STRING "Threading method: \ -'yes' to autodetect, 'no' to disable, 'posix' (pthreads), \ -'win95' (WinXP compatible), 'vista' (needs Windows Vista or later)") - -# Create dropdown in CMake GUI since only 1 threading method is possible -# to select in a build. -set_property(CACHE XZ_THREADS - PROPERTY STRINGS "${SUPPORTED_THREADING_METHODS}") - -# This is a flag variable set when win95 threads are used. We must ensure -# that the combination of XZ_SMALL and win95 threads is only used with a -# compiler that supports the __constructor__ attribute. -set(USE_WIN95_THREADS OFF) - -# This is a flag variable set when posix threading (pthreads) is used. -# It's needed when creating liblzma-config.cmake where dependency on -# Threads::Threads is only needed with pthreads. -set(USE_POSIX_THREADS OFF) - -if(NOT XZ_THREADS IN_LIST SUPPORTED_THREADING_METHODS) - message(FATAL_ERROR "'${XZ_THREADS}' is not a supported threading method") -endif() - -if(XZ_THREADS) - # Also set THREADS_PREFER_PTHREAD_FLAG since the flag has no effect - # for Windows threading. - set(THREADS_PREFER_PTHREAD_FLAG TRUE) - find_package(Threads REQUIRED) - - # If both Windows and posix threading are available, prefer Windows. - # Note that on Cygwin, CMAKE_USE_WIN32_THREADS_INIT is false. - if(CMAKE_USE_WIN32_THREADS_INIT AND NOT XZ_THREADS STREQUAL "posix") - if(XZ_THREADS STREQUAL "win95" - OR (XZ_THREADS STREQUAL "yes" AND CMAKE_SIZEOF_VOID_P EQUAL 4)) - # Use Windows 95 (and thus XP) compatible threads. - # This avoids use of features that were added in - # Windows Vista. This is used for 32-bit x86 builds for - # compatibility reasons since it makes no measurable difference - # in performance compared to Vista threads. - set(USE_WIN95_THREADS ON) - add_compile_definitions(MYTHREAD_WIN95) - else() - add_compile_definitions(MYTHREAD_VISTA) - endif() - elseif(CMAKE_USE_PTHREADS_INIT) - if(XZ_THREADS MATCHES "^posix$|^yes$") - # The threading library only needs to be explicitly linked - # for posix threads, so this is needed for creating - # liblzma-config.cmake later. - set(USE_POSIX_THREADS ON) - - target_link_libraries(liblzma PRIVATE Threads::Threads) - add_compile_definitions(MYTHREAD_POSIX) - - # Make the thread libs available in later checks. In practice - # only pthread_condattr_setclock check should need this. - list(PREPEND CMAKE_REQUIRED_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") - - # Check if pthread_condattr_setclock() exists to - # use CLOCK_MONOTONIC. - if(HAVE_CLOCK_MONOTONIC) - check_symbol_exists(pthread_condattr_setclock pthread.h - HAVE_PTHREAD_CONDATTR_SETCLOCK) - tuklib_add_definition_if(ALL HAVE_PTHREAD_CONDATTR_SETCLOCK) - endif() - else() - message(SEND_ERROR - "Windows threading method was requested but a compatible " - "library could not be found") - endif() - else() - message(SEND_ERROR "No supported threading library found") - endif() - - target_sources(liblzma PRIVATE - src/common/tuklib_cpucores.c - src/common/tuklib_cpucores.h - src/liblzma/common/hardware_cputhreads.c - src/liblzma/common/outqueue.c - src/liblzma/common/outqueue.h - ) -endif() - - -###################### -# Size optimizations # -###################### - -option(XZ_SMALL "Reduce code size at expense of speed. \ -This may be useful together with CMAKE_BUILD_TYPE=MinSizeRel.") - -if(XZ_SMALL) - add_compile_definitions(HAVE_SMALL) -endif() - - -########## -# Checks # -########## - -set(SUPPORTED_CHECKS crc32 crc64 sha256) - -set(XZ_CHECKS "${SUPPORTED_CHECKS}" CACHE STRING - "Check types to support (crc32 is always built)") - -foreach(CHECK IN LISTS XZ_CHECKS) - if(NOT CHECK IN_LIST SUPPORTED_CHECKS) - message(FATAL_ERROR "'${CHECK}' is not a supported check type") - endif() -endforeach() - -if(XZ_SMALL) - target_sources(liblzma PRIVATE src/liblzma/check/crc32_small.c) -else() - target_sources(liblzma PRIVATE - src/liblzma/check/crc32_fast.c - src/liblzma/check/crc32_table_be.h - src/liblzma/check/crc32_table_le.h - ) - - if(XZ_ASM_I386) - target_sources(liblzma PRIVATE src/liblzma/check/crc32_x86.S) - target_compile_definitions(liblzma PRIVATE HAVE_CRC_X86_ASM) - endif() -endif() - -if("crc64" IN_LIST XZ_CHECKS) - add_compile_definitions("HAVE_CHECK_CRC64") - - if(XZ_SMALL) - target_sources(liblzma PRIVATE src/liblzma/check/crc64_small.c) - else() - target_sources(liblzma PRIVATE - src/liblzma/check/crc64_fast.c - src/liblzma/check/crc64_table_be.h - src/liblzma/check/crc64_table_le.h - ) - - if(XZ_ASM_I386) - target_sources(liblzma PRIVATE src/liblzma/check/crc64_x86.S) - # Adding #define HAVE_CRC_X86_ASM was already handled in - # the CRC32 case a few lines above. CRC32 is always built. - endif() - endif() -endif() - -# External SHA-256 -# -# At least the following implementations are supported: -# -# OS Headers Library Type Function -# FreeBSD sys/types.h + sha256.h libmd SHA256_CTX SHA256_Init -# NetBSD sys/types.h + sha2.h SHA256_CTX SHA256_Init -# OpenBSD sys/types.h + sha2.h SHA2_CTX SHA256Init -# Solaris sys/types.h + sha2.h libmd SHA256_CTX SHA256Init -# MINIX 3 sys/types.h + sha2.h SHA256_CTX SHA256_Init -# Darwin CommonCrypto/CommonDigest.h CC_SHA256_CTX CC_SHA256_Init -# -# Note that Darwin's CC_SHA256_Update takes buffer size as uint32_t instead -# of size_t. -# -# This is disabled by default because it used to conflict with OpenSSL -# on some platforms and in some cases the builtin code in liblzma was faster. -# See INSTALL and the commit message ac398c3bafa6e4c80e20571373a96947db863b3d. -option(XZ_EXTERNAL_SHA256 "Use SHA-256 code from the operating system \ -if possible. See INSTALL for possible subtle problems." OFF) - -if("sha256" IN_LIST XZ_CHECKS) - add_compile_definitions("HAVE_CHECK_SHA256") - - # Assume that external code won't be used. We need this to know - # if the internal sha256.c should be built. - set(USE_INTERNAL_SHA256 ON) - - if(XZ_EXTERNAL_SHA256) - # Find the header. - set(SHA256_HEADER OFF) - - foreach(X CommonCrypto/CommonDigest.h sha256.h sha2.h) - string(TOUPPER "HAVE_${X}" HAVE_X) - string(REGEX REPLACE "[/.]" "_" HAVE_X "${HAVE_X}") - check_include_file("${X}" "${HAVE_X}") - if(${HAVE_X}) - target_compile_definitions(liblzma PRIVATE "${HAVE_X}") - set(SHA256_HEADER "${X}") - break() - endif() - endforeach() - - if(SHA256_HEADER) - # Find the type to hold the SHA-256 state. - set(SHA256_TYPE OFF) - - foreach(X CC_SHA256_CTX SHA256_CTX SHA2_CTX) - string(TOUPPER "HAVE_${X}" HAVE_X) - - # configure.ac uses conditionally but it's - # required on all cases except Darwin where it exists too. - # So just use it unconditionally here. - set(SOURCE - "#include - #include <${SHA256_HEADER}> - int main(void) - { - ${X} ctx; - return 0; - }") - check_c_source_compiles("${SOURCE}" "${HAVE_X}") - if(${HAVE_X}) - target_compile_definitions(liblzma PRIVATE "${HAVE_X}") - set(SHA256_TYPE "${X}") - break() - endif() - endforeach() - - if(SHA256_TYPE) - # Find the initialization function. It might required libmd. - foreach(X CC_SHA256_Init SHA256Init SHA256_Init) - string(TOUPPER "HAVE_${X}" HAVE_X) - - # On FreeBSD, defines the SHA-256 functions as - # macros to rename them for namespace reasons. Avoid - # check_symbol_exists as that would accept macros without - # checking if the program links. - set(SOURCE - "#include - #include <${SHA256_HEADER}> - int main(void) - { - ${SHA256_TYPE} ctx; - ${X}(&ctx); - return 0; - }") - - check_c_source_compiles("${SOURCE}" "${HAVE_X}") - if(${HAVE_X}) - target_compile_definitions(liblzma PRIVATE "${HAVE_X}") - set(USE_INTERNAL_SHA256 OFF) - break() - else() - # Try with libmd. Other checks don't need it so we - # don't need to leave it into CMAKE_REQUIRED_LIBRARIES. - list(PREPEND CMAKE_REQUIRED_LIBRARIES md) - check_c_source_compiles("${SOURCE}" "${HAVE_X}_LIBMD") - list(POP_FRONT CMAKE_REQUIRED_LIBRARIES) - if(${HAVE_X}_LIBMD) - # NOTE: Just "${HAVE_X}", not "${HAVE_X}_LIBMD": - target_compile_definitions(liblzma PRIVATE - "${HAVE_X}") - target_link_libraries(liblzma PRIVATE md) - set(LIBS "-lmd ${LIBS}") # For liblzma.pc - set(USE_INTERNAL_SHA256 OFF) - break() - endif() - endif() - endforeach() - endif() - endif() - endif() - - if(USE_INTERNAL_SHA256) - target_sources(liblzma PRIVATE src/liblzma/check/sha256.c) - endif() -endif() - - -################# -# Match finders # -################# - -set(SUPPORTED_MATCH_FINDERS hc3 hc4 bt2 bt3 bt4) - -set(XZ_MATCH_FINDERS "${SUPPORTED_MATCH_FINDERS}" CACHE STRING - "Match finders to support (at least one is required for LZMA1 or LZMA2)") - -foreach(MF IN LISTS XZ_MATCH_FINDERS) - if(MF IN_LIST SUPPORTED_MATCH_FINDERS) - string(TOUPPER "${MF}" MF_UPPER) - add_compile_definitions("HAVE_MF_${MF_UPPER}") - else() - message(FATAL_ERROR "'${MF}' is not a supported match finder") - endif() -endforeach() - - -############ -# Encoders # -############ - -set(SIMPLE_FILTERS - x86 - arm - armthumb - arm64 - powerpc - ia64 - sparc - riscv -) - -# The SUPPORTED_FILTERS are shared between Encoders and Decoders -# since only lzip does not appear in both lists. lzip is a special -# case anyway, so it is handled separately in the Decoders section. -set(SUPPORTED_FILTERS - lzma1 - lzma2 - delta - "${SIMPLE_FILTERS}" -) - -set(XZ_ENCODERS "${SUPPORTED_FILTERS}" CACHE STRING "Encoders to support") - -# If LZMA2 is enabled, then LZMA1 must also be enabled. -if(NOT "lzma1" IN_LIST XZ_ENCODERS AND "lzma2" IN_LIST XZ_ENCODERS) - message(FATAL_ERROR "LZMA2 encoder requires that LZMA1 is also enabled") -endif() - -# If LZMA1 is enabled, then at least one match finder must be enabled. -if(XZ_MATCH_FINDERS STREQUAL "" AND "lzma1" IN_LIST XZ_ENCODERS) - message(FATAL_ERROR "At least 1 match finder is required for an " - "LZ-based encoder") -endif() - -set(HAVE_DELTA_CODER OFF) -set(SIMPLE_ENCODERS OFF) -set(HAVE_ENCODERS OFF) - -foreach(ENCODER IN LISTS XZ_ENCODERS) - if(ENCODER IN_LIST SUPPORTED_FILTERS) - set(HAVE_ENCODERS ON) - - if(NOT SIMPLE_ENCODERS AND ENCODER IN_LIST SIMPLE_FILTERS) - set(SIMPLE_ENCODERS ON) - endif() - - string(TOUPPER "${ENCODER}" ENCODER_UPPER) - add_compile_definitions("HAVE_ENCODER_${ENCODER_UPPER}") - else() - message(FATAL_ERROR "'${ENCODER}' is not a supported encoder") - endif() -endforeach() - -if(HAVE_ENCODERS) - add_compile_definitions(HAVE_ENCODERS) - - target_sources(liblzma PRIVATE - src/liblzma/common/alone_encoder.c - src/liblzma/common/block_buffer_encoder.c - src/liblzma/common/block_buffer_encoder.h - src/liblzma/common/block_encoder.c - src/liblzma/common/block_encoder.h - src/liblzma/common/block_header_encoder.c - src/liblzma/common/easy_buffer_encoder.c - src/liblzma/common/easy_encoder.c - src/liblzma/common/easy_encoder_memusage.c - src/liblzma/common/filter_buffer_encoder.c - src/liblzma/common/filter_encoder.c - src/liblzma/common/filter_encoder.h - src/liblzma/common/filter_flags_encoder.c - src/liblzma/common/index_encoder.c - src/liblzma/common/index_encoder.h - src/liblzma/common/stream_buffer_encoder.c - src/liblzma/common/stream_encoder.c - src/liblzma/common/stream_flags_encoder.c - src/liblzma/common/vli_encoder.c - ) - - if(XZ_THREADS) - target_sources(liblzma PRIVATE - src/liblzma/common/stream_encoder_mt.c - ) - endif() - - if(SIMPLE_ENCODERS) - target_sources(liblzma PRIVATE - src/liblzma/simple/simple_encoder.c - src/liblzma/simple/simple_encoder.h - ) - endif() - - if("lzma1" IN_LIST XZ_ENCODERS) - target_sources(liblzma PRIVATE - src/liblzma/lzma/lzma_encoder.c - src/liblzma/lzma/lzma_encoder.h - src/liblzma/lzma/lzma_encoder_optimum_fast.c - src/liblzma/lzma/lzma_encoder_optimum_normal.c - src/liblzma/lzma/lzma_encoder_private.h - src/liblzma/lzma/fastpos.h - src/liblzma/lz/lz_encoder.c - src/liblzma/lz/lz_encoder.h - src/liblzma/lz/lz_encoder_hash.h - src/liblzma/lz/lz_encoder_hash_table.h - src/liblzma/lz/lz_encoder_mf.c - src/liblzma/rangecoder/price.h - src/liblzma/rangecoder/price_table.c - src/liblzma/rangecoder/range_encoder.h - ) - - if(NOT XZ_SMALL) - target_sources(liblzma PRIVATE src/liblzma/lzma/fastpos_table.c) - endif() - endif() - - if("lzma2" IN_LIST XZ_ENCODERS) - target_sources(liblzma PRIVATE - src/liblzma/lzma/lzma2_encoder.c - src/liblzma/lzma/lzma2_encoder.h - ) - endif() - - if("delta" IN_LIST XZ_ENCODERS) - set(HAVE_DELTA_CODER ON) - target_sources(liblzma PRIVATE - src/liblzma/delta/delta_encoder.c - src/liblzma/delta/delta_encoder.h - ) - endif() -endif() - - -############ -# Decoders # -############ - -set(XZ_DECODERS "${SUPPORTED_FILTERS}" CACHE STRING "Decoders to support") - -set(SIMPLE_DECODERS OFF) -set(HAVE_DECODERS OFF) - -foreach(DECODER IN LISTS XZ_DECODERS) - if(DECODER IN_LIST SUPPORTED_FILTERS) - set(HAVE_DECODERS ON) - - if(NOT SIMPLE_DECODERS AND DECODER IN_LIST SIMPLE_FILTERS) - set(SIMPLE_DECODERS ON) - endif() - - string(TOUPPER "${DECODER}" DECODER_UPPER) - add_compile_definitions("HAVE_DECODER_${DECODER_UPPER}") - else() - message(FATAL_ERROR "'${DECODER}' is not a supported decoder") - endif() -endforeach() - -if(HAVE_DECODERS) - add_compile_definitions(HAVE_DECODERS) - - target_sources(liblzma PRIVATE - src/liblzma/common/alone_decoder.c - src/liblzma/common/alone_decoder.h - src/liblzma/common/auto_decoder.c - src/liblzma/common/block_buffer_decoder.c - src/liblzma/common/block_decoder.c - src/liblzma/common/block_decoder.h - src/liblzma/common/block_header_decoder.c - src/liblzma/common/easy_decoder_memusage.c - src/liblzma/common/file_info.c - src/liblzma/common/filter_buffer_decoder.c - src/liblzma/common/filter_decoder.c - src/liblzma/common/filter_decoder.h - src/liblzma/common/filter_flags_decoder.c - src/liblzma/common/index_decoder.c - src/liblzma/common/index_decoder.h - src/liblzma/common/index_hash.c - src/liblzma/common/stream_buffer_decoder.c - src/liblzma/common/stream_decoder.c - src/liblzma/common/stream_flags_decoder.c - src/liblzma/common/stream_decoder.h - src/liblzma/common/vli_decoder.c - ) - - if(XZ_THREADS) - target_sources(liblzma PRIVATE - src/liblzma/common/stream_decoder_mt.c - ) - endif() - - if(SIMPLE_DECODERS) - target_sources(liblzma PRIVATE - src/liblzma/simple/simple_decoder.c - src/liblzma/simple/simple_decoder.h - ) - endif() - - if("lzma1" IN_LIST XZ_DECODERS) - target_sources(liblzma PRIVATE - src/liblzma/lzma/lzma_decoder.c - src/liblzma/lzma/lzma_decoder.h - src/liblzma/rangecoder/range_decoder.h - src/liblzma/lz/lz_decoder.c - src/liblzma/lz/lz_decoder.h - ) - endif() - - if("lzma2" IN_LIST XZ_DECODERS) - target_sources(liblzma PRIVATE - src/liblzma/lzma/lzma2_decoder.c - src/liblzma/lzma/lzma2_decoder.h - ) - endif() - - if("delta" IN_LIST XZ_DECODERS) - set(HAVE_DELTA_CODER ON) - target_sources(liblzma PRIVATE - src/liblzma/delta/delta_decoder.c - src/liblzma/delta/delta_decoder.h - ) - endif() -endif() - -# Some sources must appear if the filter is configured as either -# an encoder or decoder. -if("lzma1" IN_LIST XZ_ENCODERS OR "lzma1" IN_LIST XZ_DECODERS) - target_sources(liblzma PRIVATE - src/liblzma/rangecoder/range_common.h - src/liblzma/lzma/lzma_encoder_presets.c - src/liblzma/lzma/lzma_common.h - ) -endif() - -if(HAVE_DELTA_CODER) - target_sources(liblzma PRIVATE - src/liblzma/delta/delta_common.c - src/liblzma/delta/delta_common.h - src/liblzma/delta/delta_private.h - ) -endif() - -if(SIMPLE_ENCODERS OR SIMPLE_DECODERS) - target_sources(liblzma PRIVATE - src/liblzma/simple/simple_coder.c - src/liblzma/simple/simple_coder.h - src/liblzma/simple/simple_private.h - ) -endif() - -foreach(SIMPLE_CODER IN LISTS SIMPLE_FILTERS) - if(SIMPLE_CODER IN_LIST XZ_ENCODERS OR SIMPLE_CODER IN_LIST XZ_DECODERS) - target_sources(liblzma PRIVATE "src/liblzma/simple/${SIMPLE_CODER}.c") - endif() -endforeach() - - -############# -# MicroLZMA # -############# - -option(XZ_MICROLZMA_ENCODER - "MicroLZMA encoder (needed by specific applications only)" ON) - -option(XZ_MICROLZMA_DECODER - "MicroLZMA decoder (needed by specific applications only)" ON) - -if(XZ_MICROLZMA_ENCODER) - if(NOT "lzma1" IN_LIST XZ_ENCODERS) - message(FATAL_ERROR "The LZMA1 encoder is required to support the " - "MicroLZMA encoder") - endif() - - target_sources(liblzma PRIVATE src/liblzma/common/microlzma_encoder.c) -endif() - -if(XZ_MICROLZMA_DECODER) - if(NOT "lzma1" IN_LIST XZ_DECODERS) - message(FATAL_ERROR "The LZMA1 decoder is required to support the " - "MicroLZMA decoder") - endif() - - target_sources(liblzma PRIVATE src/liblzma/common/microlzma_decoder.c) -endif() - - -############################# -# lzip (.lz) format support # -############################# - -option(XZ_LZIP_DECODER "Support lzip decoder" ON) - -if(XZ_LZIP_DECODER) - # If lzip decoder support is requested, make sure LZMA1 decoder is enabled. - if(NOT "lzma1" IN_LIST XZ_DECODERS) - message(FATAL_ERROR "The LZMA1 decoder is required to support the " - "lzip decoder") - endif() - - add_compile_definitions(HAVE_LZIP_DECODER) - - target_sources(liblzma PRIVATE - src/liblzma/common/lzip_decoder.c - src/liblzma/common/lzip_decoder.h - ) -endif() - -### - -# Put the tuklib functions under the lzma_ namespace. -target_compile_definitions(liblzma PRIVATE TUKLIB_SYMBOL_PREFIX=lzma_) -tuklib_cpucores(liblzma) -tuklib_physmem(liblzma) - -# While liblzma can be built without tuklib_cpucores or tuklib_physmem -# modules, the liblzma API functions lzma_cputhreads() and lzma_physmem() -# will then be useless (which isn't too bad but still unfortunate). Since -# I expect the CMake-based builds to be only used on systems that are -# supported by these tuklib modules, problems with these tuklib modules -# are considered a hard error for now. This hopefully helps to catch bugs -# in the CMake versions of the tuklib checks. -if(NOT TUKLIB_CPUCORES_FOUND OR NOT TUKLIB_PHYSMEM_FOUND) - # Use SEND_ERROR instead of FATAL_ERROR. If someone reports a bug, - # seeing the results of the remaining checks can be useful too. - message(SEND_ERROR - "tuklib_cpucores() or tuklib_physmem() failed. " - "Unless you really are building for a system where these " - "modules are not supported (unlikely), this is a bug in the " - "included cmake/tuklib_*.cmake files that should be fixed. " - "To build anyway, edit this CMakeLists.txt to ignore this error.") -endif() - -# Check for __attribute__((__constructor__)) support. -# This needs -Werror because some compilers just warn -# about this being unsupported. -cmake_push_check_state() -set(CMAKE_REQUIRED_FLAGS "-Werror") -check_c_source_compiles(" - __attribute__((__constructor__)) - static void my_constructor_func(void) { return; } - int main(void) { return 0; } - " - HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR) -cmake_pop_check_state() -tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR) - -# The Win95 threading lacks a thread-safe one-time initialization function. -# The one-time initialization is needed for crc32_small.c and crc64_small.c -# create the CRC tables. So if small mode is enabled, the threading mode is -# win95, and the compiler does not support attribute constructor, then we -# would end up with a multithreaded build that is thread-unsafe. As a -# result this configuration is not allowed. -if(USE_WIN95_THREADS AND XZ_SMALL AND NOT HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR) - message(SEND_ERROR "Threading method win95 and XZ_SMALL " - "cannot be used at the same time because the compiler " - "doesn't support __attribute__((__constructor__))") -endif() - - -# cpuid.h -check_include_file(cpuid.h HAVE_CPUID_H) -tuklib_add_definition_if(liblzma HAVE_CPUID_H) - -# immintrin.h: -check_include_file(immintrin.h HAVE_IMMINTRIN_H) -if(HAVE_IMMINTRIN_H) - target_compile_definitions(liblzma PRIVATE HAVE_IMMINTRIN_H) - - # SSE2 intrinsics: - check_c_source_compiles(" - #include - int main(void) - { - __m128i x = { 0 }; - _mm_movemask_epi8(x); - return 0; - } - " - HAVE__MM_MOVEMASK_EPI8) - tuklib_add_definition_if(liblzma HAVE__MM_MOVEMASK_EPI8) - - # CLMUL intrinsic: - option(XZ_CLMUL_CRC "Use carryless multiplication for CRC \ -calculation (with runtime detection) if supported by the compiler" ON) - - if(XZ_CLMUL_CRC) - check_c_source_compiles(" - #include - #if defined(__e2k__) && __iset__ < 6 - # error - #endif - #if (defined(__GNUC__) || defined(__clang__)) \ - && !defined(__EDG__) - __attribute__((__target__(\"ssse3,sse4.1,pclmul\"))) - #endif - int main(void) - { - __m128i a = _mm_set_epi64x(1, 2); - a = _mm_clmulepi64_si128(a, a, 0); - return 0; - } - " - HAVE_USABLE_CLMUL) - tuklib_add_definition_if(liblzma HAVE_USABLE_CLMUL) - endif() -endif() - -# ARM64 C Language Extensions define CRC32 functions in arm_acle.h. -# These are supported by at least GCC and Clang which both need -# __attribute__((__target__("+crc"))), unless the needed compiler flags -# are used to support the CRC instruction. -option(XZ_ARM64_CRC32 "Use ARM64 CRC32 instructions (with runtime detection) \ -if supported by the compiler" ON) - -if(XZ_ARM64_CRC32) - check_c_source_compiles(" - #include - - #ifndef _MSC_VER - #include - #endif - - #if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) - __attribute__((__target__(\"+crc\"))) - #endif - int main(void) - { - return __crc32d(1, 2) != 0; - } - " - HAVE_ARM64_CRC32) - - if(HAVE_ARM64_CRC32) - target_compile_definitions(liblzma PRIVATE HAVE_ARM64_CRC32) - - # Check for ARM64 CRC32 instruction runtime detection. - # getauxval() is supported on Linux. - check_symbol_exists(getauxval sys/auxv.h HAVE_GETAUXVAL) - tuklib_add_definition_if(liblzma HAVE_GETAUXVAL) - - # elf_aux_info() is supported on FreeBSD and OpenBSD >= 7.6. - check_symbol_exists(elf_aux_info sys/auxv.h HAVE_ELF_AUX_INFO) - tuklib_add_definition_if(liblzma HAVE_ELF_AUX_INFO) - - # sysctlbyname("hw.optional.armv8_crc32", ...) is supported on Darwin - # (macOS, iOS, etc.). Note that sysctlbyname() is supported on FreeBSD, - # NetBSD, and possibly others too but the string is specific to - # Apple OSes. The C code is responsible for checking - # defined(__APPLE__) before using - # sysctlbyname("hw.optional.armv8_crc32", ...). - check_symbol_exists(sysctlbyname sys/sysctl.h HAVE_SYSCTLBYNAME) - tuklib_add_definition_if(liblzma HAVE_SYSCTLBYNAME) - endif() -endif() - -option(XZ_LOONGARCH_CRC32 - "Use LoongArch CRC32 instructions if supported by the compiler" ON) - -if(XZ_LOONGARCH_CRC32) - # LoongArch CRC32 intrinsics are in larchintrin.h. - # These are supported by at least GCC and Clang. - # - # Only 64-bit LoongArch is currently supported. - # It doesn't need runtime detection. - check_c_source_compiles(" - #if !(defined(__loongarch__) && __loongarch_grlen >= 64) - # error - #endif - - #include - int main(void) - { - return __crc_w_w_w(1, 2); - } - " - HAVE_LOONGARCH_CRC32) - tuklib_add_definition_if(liblzma HAVE_LOONGARCH_CRC32) -endif() - - -# Symbol visibility support: -# -# The C_VISIBILITY_PRESET property takes care of adding the compiler -# option -fvisibility=hidden (or equivalent) if and only if it is supported. -# -# HAVE_VISIBILITY should always be defined to 0 or 1. It tells liblzma -# if __attribute__((__visibility__("default"))) -# and __attribute__((__visibility__("hidden"))) are supported. -# Those are useful only when the compiler supports -fvisibility=hidden -# or such option so HAVE_VISIBILITY should be 1 only when both option and -# the attribute support are present. HAVE_VISIBILITY is ignored on Windows -# and Cygwin by the liblzma C code; __declspec(dllexport) is used instead. -# -# CMake's GenerateExportHeader module is too fancy since liblzma already -# has the necessary macros. Instead, check CMake's internal variable -# CMAKE_C_COMPILE_OPTIONS_VISIBILITY (it's the C-specific variant of -# CMAKE__COMPILE_OPTIONS_VISIBILITY) which contains the compiler -# command line option for visibility support. It's empty or unset when -# visibility isn't supported. (It was added to CMake 2.8.12 in the commit -# 0e9f4bc00c6b26f254e74063e4026ac33b786513 in 2013.) This way we don't -# set HAVE_VISIBILITY to 1 when visibility isn't actually supported. -if(BUILD_SHARED_LIBS AND CMAKE_C_COMPILE_OPTIONS_VISIBILITY) - set_target_properties(liblzma PROPERTIES C_VISIBILITY_PRESET hidden) - target_compile_definitions(liblzma PRIVATE HAVE_VISIBILITY=1) -else() - target_compile_definitions(liblzma PRIVATE HAVE_VISIBILITY=0) -endif() - -if(WIN32 OR CYGWIN) - if(BUILD_SHARED_LIBS) - # Add the Windows resource file for liblzma.dll. - target_sources(liblzma PRIVATE src/liblzma/liblzma_w32res.rc) - - set_source_files_properties(src/liblzma/liblzma_w32res.rc PROPERTIES - OBJECT_DEPENDS "${W32RES_DEPENDENCIES}" - ) - - # Export the public API symbols with __declspec(dllexport). - target_compile_definitions(liblzma PRIVATE DLL_EXPORT) - - if(NOT MSVC AND NOT CYGWIN) - # Create a DEF file. The Autotools-based build creates a DEF file - # under Cygwin & MSYS2 too but it almost certainly is a useless - # file in that context, so the CMake build omits it. - # - # The linker puts the ordinal numbers in the DEF file - # too so the output from the linker isn't our final file. - target_link_options(liblzma PRIVATE - "-Wl,--output-def,liblzma.def.in") - - # Remove the ordinal numbers from the DEF file so that - # no one will create an import library that links by ordinal - # instead of by name. We don't maintain a DEF file so the - # ordinal numbers aren't stable. - add_custom_command(TARGET liblzma POST_BUILD - COMMAND "${CMAKE_COMMAND}" - -DINPUT_FILE=liblzma.def.in - -DOUTPUT_FILE=liblzma.def - -P - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/remove-ordinals.cmake" - BYPRODUCTS "liblzma.def" - VERBATIM) - endif() - else() - # Disable __declspec(dllimport) when linking against static liblzma. - target_compile_definitions(liblzma INTERFACE LZMA_API_STATIC) - endif() -elseif(BUILD_SHARED_LIBS AND SYMBOL_VERSIONING STREQUAL "linux") - # Note that adding link options doesn't affect static builds - # but HAVE_SYMBOL_VERSIONS_LINUX must not be used with static builds - # because it would put symbol versions into the static library which - # can cause problems. It's clearer if all symver related things are - # omitted when not building a shared library. - # - # NOTE: Set it explicitly to 1 to make it clear that versioning is - # done unconditionally in the C files. - target_compile_definitions(liblzma PRIVATE HAVE_SYMBOL_VERSIONS_LINUX=1) - target_link_options(liblzma PRIVATE - "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_linux.map" - ) - set_target_properties(liblzma PROPERTIES - LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_linux.map" - ) -elseif(BUILD_SHARED_LIBS AND SYMBOL_VERSIONING STREQUAL "generic") - target_link_options(liblzma PRIVATE - "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_generic.map" - ) - set_target_properties(liblzma PROPERTIES - LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_generic.map" - ) -endif() - -# Calculate Libtool-compatible Mach-O versions for Apple OSes. -# Switching from CMake's or Meson's default Mach-O versioning style to -# GNU Libtool style is always a backward compatible change because the -# Libtool style always results in higher Mach-O version values. -# -# The other way would be a breaking change, and switching from Autotools -# to CMake used to result in "Incompatible library version" error from the -# dynamic linker ("dyld") when trying to run existing executables. This -# happened because the Mach-O current_version in the CMake-built library -# was less than the compatibility_version stored in the executable. -# -# Example: If on GNU/Linux one had libfoo.so.5.6.7, on macOS one would -# have libfoo.5.dylib containing the following Mach-O versions: -# -# compatibility_version current_version -# Libtool 12.0.0 12.7.0 -# CMake 5.0.0 5.6.7 -# Meson 5.0.0 5.0.0 -# -# Apple's docs say that the major version is encoded in the library filename, -# and the Mach-O version fields are for tracking backward compatible changes -# (minor versions). The default Mach-O versioning styles in CMake and -# Meson don't store the minor version in the compatibility_version though -# but Libtool does (using its own idiosyncratic encoding). In practice the -# lack of minor ABI version tracking doesn't matter much; it's the -# compatibility between the build systems that counts. -# -# It's unclear how much this matters in 2024. It might be that the -# dynamic linker in macOS >= 12 doesn't enforce the version checks. -# But this is a simple and safe change so it's fine to do it anyway. -# -# Apple docs: -# https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/DynamicLibraryDesignGuidelines.html -# -# This change was made in XZ Utils 5.7.1alpha. -# -# * * * * * -# -# At least for now the xz package versioning matches the rules used for -# shared library versioning (excluding development releases) so it is -# fine to use the package version when setting the liblzma ABI version. -math(EXPR LIBLZMA_MACHO_COMPATIBILITY_VERSION - "${xz_VERSION_MAJOR} + ${xz_VERSION_MINOR} + 1") -set(LIBLZMA_MACHO_CURRENT_VERSION - "${LIBLZMA_MACHO_COMPATIBILITY_VERSION}.${xz_VERSION_PATCH}") - -set_target_properties(liblzma PROPERTIES - SOVERSION "${xz_VERSION_MAJOR}" - VERSION "${xz_VERSION}" - MACHO_COMPATIBILITY_VERSION "${LIBLZMA_MACHO_COMPATIBILITY_VERSION}" - MACHO_CURRENT_VERSION "${LIBLZMA_MACHO_CURRENT_VERSION}" - - # The name liblzma a mess because in many places "lib" is just a prefix - # and not part of the actual name. (Don't name a new library this way!) - # Cygwin uses "cyg", MSYS2 uses "msys-", and some platforms use no prefix. - # However, we want to avoid lzma.dll on Windows as that would conflict - # with LZMA SDK. liblzma has been liblzma.dll on Windows since the - # beginning so try to stick with it. - # - # Up to XZ Utils 5.6.2 we set PREFIX and IMPORT_PREFIX properties to "" - # while keeping the default "liblzma" OUTPUT_NAME that was derived from - # the target name. But this broke naming on Cygwin and MSYS2. - # - # Setting OUTPUT_NAME without the "lib" prefix means that CMake will add - # the platform-specific prefix as needed. So on most systems CMake will - # add "lib" but on Cygwin and MSYS2 the naming will be correct too. - # - # On Windows, CMake uses the "lib" prefix with MinGW-w64 but not with - # other toolchains. Those need to be handled specially to get the DLL - # file named liblzma.dll instead of lzma.dll. - OUTPUT_NAME "lzma" -) - -if(WIN32 AND NOT MINGW) - # Up to XZ Utils 5.6.2 and building with MSVC, we produced liblzma.dll - # and liblzma.lib. The downside of liblzma.lib is that it's not - # compatible with pkgconf usage. liblzma.pc contains "-llzma" which - # "pkgconf --msvc-syntax --libs liblzma" converts to "lzma.lib". - # So as a compromise, we can keep the liblzma.dll name but the import - # library and static liblzma need to be named lzma.lib so that pkgconf - # can be used with MSVC. (MinGW-w64 finds both names with "-llzma".) - set_target_properties(liblzma PROPERTIES RUNTIME_OUTPUT_NAME "liblzma") -endif() - -# Create liblzma-config-version.cmake. -# -# NOTE: SameMajorVersion is correct for stable releases but it is wrong -# for development releases where each release may have incompatible changes. -include(CMakePackageConfigHelpers) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/liblzma-config-version.cmake" - VERSION "${xz_VERSION}" - COMPATIBILITY SameMajorVersion) - -# Create liblzma-config.cmake. We use this spelling instead of -# liblzmaConfig.cmake to make find_package work in case insensitive -# manner even with case sensitive file systems. This gives more consistent -# behavior between operating systems. This optionally includes a dependency -# on a threading library, so the contents are created in two separate parts. -# The "second half" is always needed, so create it first. -set(LZMA_CONFIG_CONTENTS -"include(\"\${CMAKE_CURRENT_LIST_DIR}/liblzma-targets.cmake\") - -if(NOT TARGET LibLZMA::LibLZMA) - # Be compatible with the spelling used by the FindLibLZMA module. This - # doesn't use ALIAS because it would make CMake resolve LibLZMA::LibLZMA - # to liblzma::liblzma instead of keeping the original spelling. Keeping - # the original spelling is important for good FindLibLZMA compatibility. - add_library(LibLZMA::LibLZMA INTERFACE IMPORTED) - set_target_properties(LibLZMA::LibLZMA PROPERTIES - INTERFACE_LINK_LIBRARIES liblzma::liblzma) -endif() -") - -if(USE_POSIX_THREADS) - set(LZMA_CONFIG_CONTENTS -"include(CMakeFindDependencyMacro) -set(THREADS_PREFER_PTHREAD_FLAG TRUE) -find_dependency(Threads) - -${LZMA_CONFIG_CONTENTS} -") -endif() - -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/liblzma-config.cmake" - "${LZMA_CONFIG_CONTENTS}") - - -# Create liblzma.pc. If CMAKE_INSTALL_

paths are relative to -# CMAKE_INSTALL_PREFIX, the .pc file will be relocatable (that is, -# all paths will be relative to ${prefix}). Otherwise absolute -# paths will be used. -set(prefix "${CMAKE_INSTALL_PREFIX}") -set(exec_prefix "\${prefix}") -cmake_path(APPEND libdir "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") -cmake_path(APPEND includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") - -# Threads::Threads is linked in only when using POSIX threads. -# Use an empty value if using Windows threads or if threading is disabled. -set(PTHREAD_CFLAGS) -if(USE_POSIX_THREADS) - set(PTHREAD_CFLAGS "${CMAKE_THREAD_LIBS_INIT}") -endif() - -configure_file(src/liblzma/liblzma.pc.in liblzma.pc @ONLY) - - -# Install the library binary. The INCLUDES specifies the include path that -# is exported for other projects to use but it doesn't install any files. -install(TARGETS liblzma EXPORT liblzmaTargets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT liblzma_Runtime - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - COMPONENT liblzma_Runtime - NAMELINK_COMPONENT liblzma_Development - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - COMPONENT liblzma_Development - INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - -# Install the liblzma API headers. These use a subdirectory so -# this has to be done as a separate step. -install(DIRECTORY src/liblzma/api/ - COMPONENT liblzma_Development - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING PATTERN "*.h") - -# Install the CMake files that other packages can use to find liblzma. -set(XZ_INSTALL_CMAKEDIR - "${CMAKE_INSTALL_LIBDIR}/cmake/liblzma" - CACHE STRING "Path to liblzma's .cmake files") - -install(EXPORT liblzmaTargets - NAMESPACE liblzma:: - FILE liblzma-targets.cmake - DESTINATION "${XZ_INSTALL_CMAKEDIR}" - COMPONENT liblzma_Development) - -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/liblzma-config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/liblzma-config-version.cmake" - DESTINATION "${XZ_INSTALL_CMAKEDIR}" - COMPONENT liblzma_Development) - -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/liblzma.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" - COMPONENT liblzma_Development) - - -############################################################################# -# Helper functions for installing files -############################################################################# - -# For each non-empty element in the list LINK_NAMES, creates symbolic links -# ${LINK_NAME}${LINK_SUFFIX} -> ${TARGET_NAME} in the directory ${DIR}. -# The target file should exist because on Cygwin and MSYS2 symlink creation -# can fail under certain conditions if the target doesn't exist. -function(my_install_symlinks COMPONENT DIR TARGET_NAME LINK_SUFFIX LINK_NAMES) - install(CODE "set(D \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${DIR}\") - foreach(L ${LINK_NAMES}) - file(CREATE_LINK \"${TARGET_NAME}\" - \"\${D}/\${L}${LINK_SUFFIX}\" - SYMBOLIC) - endforeach()" - COMPONENT "${COMPONENT}") -endfunction() - -# Installs a man page file of a given language ("" for the untranslated file) -# and optionally its alternative names as symlinks. This is a helper function -# for my_install_man() below. -function(my_install_man_lang COMPONENT SRC_FILE MAN_LANG LINK_NAMES) - # Get the man page section from the filename suffix. - string(REGEX REPLACE "^.*\.([^/.]+)$" "\\1" MAN_SECTION "${SRC_FILE}") - - # A few man pages might be missing from translations. - # Don't attempt to install them or create the related symlinks. - if(NOT MAN_LANG STREQUAL "" AND NOT EXISTS "${SRC_FILE}") - return() - endif() - - # Installing the file must be done before creating the symlinks - # due to Cygwin and MSYS2. - install(FILES "${SRC_FILE}" - DESTINATION "${CMAKE_INSTALL_MANDIR}/${MAN_LANG}/man${MAN_SECTION}" - COMPONENT "${COMPONENT}") - - # Get the basename of the file to be used as the symlink target. - get_filename_component(BASENAME "${SRC_FILE}" NAME) - - # LINK_NAMES don't contain the man page filename suffix (like ".1") - # so it needs to be told to my_install_symlinks. - my_install_symlinks("${COMPONENT}" - "${CMAKE_INSTALL_MANDIR}/${MAN_LANG}/man${MAN_SECTION}" - "${BASENAME}" ".${MAN_SECTION}" "${LINK_NAMES}") -endfunction() - -# Installs a man page file and optionally its alternative names as symlinks. -# Does the same for translations if XZ_NLS. -function(my_install_man COMPONENT SRC_FILE LINK_NAMES) - my_install_man_lang("${COMPONENT}" "${SRC_FILE}" "" "${LINK_NAMES}") - - if(XZ_NLS) - # Find the translated versions of this man page. - get_filename_component(BASENAME "${SRC_FILE}" NAME) - file(GLOB MAN_FILES "po4a/man/*/${BASENAME}") - - foreach(F ${MAN_FILES}) - get_filename_component(MAN_LANG "${F}" DIRECTORY) - get_filename_component(MAN_LANG "${MAN_LANG}" NAME) - my_install_man_lang("${COMPONENT}" "${F}" "${MAN_LANG}" - "${LINK_NAMES}") - endforeach() - endif() -endfunction() - - -############################################################################# -# libgnu (getopt_long) -############################################################################# - -# This mirrors how the Autotools build system handles the getopt_long -# replacement, calling the object library libgnu since the replacement -# version comes from Gnulib. -add_library(libgnu OBJECT) - -# CMake requires that even an object library must have at least once source -# file. So we give it a header file that results in no output files. -# -# NOTE: Using a file outside the lib directory makes it possible to -# delete lib/*.h and lib/*.c and still keep the build working if -# getopt_long replacement isn't needed. It's convenient if one wishes -# to be certain that no GNU LGPL code gets included in the binaries. -target_sources(libgnu PRIVATE src/common/sysdefs.h) - -# The Ninja Generator requires setting the linker language since it cannot -# guess the programming language of just a header file. Setting this -# property avoids needing an empty .c file or an non-empty unnecessary .c -# file. -set_target_properties(libgnu PROPERTIES LINKER_LANGUAGE C) - -# Create /lib directory in the build directory and add it to the include path. -file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") -target_include_directories(libgnu PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/lib") - -# Include /lib from the source directory. It does no harm even if none of -# the Gnulib replacements are used. -target_include_directories(libgnu PUBLIC lib) - -# The command line tools need getopt_long in order to parse arguments. If -# the system does not have a getopt_long implementation we can use the one -# from Gnulib instead. -check_symbol_exists(getopt_long getopt.h HAVE_GETOPT_LONG) - -if(NOT HAVE_GETOPT_LONG) - # Set the __GETOPT_PREFIX definition to "rpl_" (replacement) to avoid - # name conflicts with libc symbols. The same prefix is set if using - # the Autotools build (m4/getopt.m4). - target_compile_definitions(libgnu PUBLIC "__GETOPT_PREFIX=rpl_") - - # Copy the getopt header to the build directory and re-copy it - # if it is updated. (Gnulib does it this way because it allows - # choosing which .in.h files to actually use in the build. We - # need just getopt.h so this is a bit overcomplicated for - # a single header file only.) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/lib/getopt.in.h" - "${CMAKE_CURRENT_BINARY_DIR}/lib/getopt.h" - COPYONLY) - - target_sources(libgnu PRIVATE - lib/getopt1.c - lib/getopt.c - lib/getopt_int.h - lib/getopt-cdefs.h - lib/getopt-core.h - lib/getopt-ext.h - lib/getopt-pfx-core.h - lib/getopt-pfx-ext.h - "${CMAKE_CURRENT_BINARY_DIR}/lib/getopt.h" - ) -endif() - - -############################################################################# -# Sandboxing for the command line tools -############################################################################# - -# auto Use sandboxing if a supported method is available in the OS. -# no Disable sandboxing. -# capsicum Require Capsicum (FreeBSD >= 10.2) and fail if not found. -# pledge Require pledge(2) (OpenBSD >= 5.9) and fail if not found. -# landlock Require Landlock (Linux >= 5.13) and fail if not found. -set(SUPPORTED_SANDBOX_METHODS auto no capsicum pledge landlock) - -set(XZ_SANDBOX auto CACHE STRING - "Sandboxing method to use in 'xz', 'xzdec', and 'lzmadec'") - -set_property(CACHE XZ_SANDBOX PROPERTY STRINGS "${SUPPORTED_SANDBOX_METHODS}") - -if(NOT XZ_SANDBOX IN_LIST SUPPORTED_SANDBOX_METHODS) - message(FATAL_ERROR "'${XZ_SANDBOX}' is not a supported " - "sandboxing method") -endif() - -# When autodetecting, the search order is fixed and we must not find -# more than one method. -if(XZ_SANDBOX STREQUAL "no") - set(SANDBOX_FOUND ON) -else() - set(SANDBOX_FOUND OFF) -endif() - -# Since xz and xzdec can both use sandboxing, the compile definition needed -# to use the sandbox must be added to both targets. -set(SANDBOX_COMPILE_DEFINITION OFF) - -# Sandboxing: Capsicum -if(NOT SANDBOX_FOUND AND XZ_SANDBOX MATCHES "^auto$|^capsicum$") - check_symbol_exists(cap_rights_limit sys/capsicum.h - HAVE_CAP_RIGHTS_LIMIT) - if(HAVE_CAP_RIGHTS_LIMIT) - set(SANDBOX_COMPILE_DEFINITION "HAVE_CAP_RIGHTS_LIMIT") - set(SANDBOX_FOUND ON) - endif() -endif() - -# Sandboxing: pledge(2) -if(NOT SANDBOX_FOUND AND XZ_SANDBOX MATCHES "^auto$|^pledge$") - check_symbol_exists(pledge unistd.h HAVE_PLEDGE) - if(HAVE_PLEDGE) - set(SANDBOX_COMPILE_DEFINITION "HAVE_PLEDGE") - set(SANDBOX_FOUND ON) - endif() -endif() - -# Sandboxing: Landlock -if(NOT SANDBOX_FOUND AND XZ_SANDBOX MATCHES "^auto$|^landlock$") - # A compile check is done here because some systems have - # linux/landlock.h, but do not have the syscalls defined - # in order to actually use Linux Landlock. - check_c_source_compiles(" - #include - #include - #include - - int main(void) - { - (void)prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); - (void)SYS_landlock_create_ruleset; - (void)SYS_landlock_restrict_self; - (void)LANDLOCK_CREATE_RULESET_VERSION; - return 0; - } - " - HAVE_LINUX_LANDLOCK) - - if(HAVE_LINUX_LANDLOCK) - set(SANDBOX_COMPILE_DEFINITION "HAVE_LINUX_LANDLOCK") - set(SANDBOX_FOUND ON) - - # Of our three sandbox methods, only Landlock is incompatible - # with -fsanitize. FreeBSD 13.2 with Capsicum was tested with - # -fsanitize=address,undefined and had no issues. OpenBSD (as - # of version 7.4) has minimal support for process instrumentation. - # OpenBSD does not distribute the additional libraries needed - # (libasan, libubsan, etc.) with GCC or Clang needed for runtime - # sanitization support and instead only support - # -fsanitize-minimal-runtime for minimal undefined behavior - # sanitization. This minimal support is compatible with our use - # of the Pledge sandbox. So only Landlock will result in a - # build that cannot compress or decompress a single file to - # standard out. - if(CMAKE_C_FLAGS MATCHES "-fsanitize=") - message(SEND_ERROR - "CMAKE_C_FLAGS or the environment variable CFLAGS " - "contains '-fsanitize=' which is incompatible " - "with Landlock sandboxing. Use -DXZ_SANDBOX=no " - "as an argument to 'cmake' when using '-fsanitize'.") - endif() - endif() -endif() - -if(NOT SANDBOX_FOUND AND NOT XZ_SANDBOX MATCHES "^auto$|^no$") - message(SEND_ERROR "XZ_SANDBOX=${XZ_SANDBOX} was used but " - "support for the sandboxing method wasn't found.") -endif() - - -############################################################################# -# xzdec and lzmadec -############################################################################# - -option(XZ_TOOL_XZDEC "Build and install the xzdec command line tool" ON) -option(XZ_TOOL_LZMADEC "Build and install the lzmadec command line tool" ON) - -if(HAVE_DECODERS) - set(XZDEC_TOOLS) - - if(XZ_TOOL_XZDEC) - list(APPEND XZDEC_TOOLS xzdec) - endif() - - if(XZ_TOOL_LZMADEC) - list(APPEND XZDEC_TOOLS lzmadec) - endif() - - foreach(XZDEC ${XZDEC_TOOLS}) - add_executable("${XZDEC}" - src/common/my_landlock.h - src/common/sysdefs.h - src/common/tuklib_common.h - src/common/tuklib_config.h - src/common/tuklib_mbstr_nonprint.c - src/common/tuklib_mbstr_nonprint.h - src/common/tuklib_exit.c - src/common/tuklib_exit.h - src/common/tuklib_gettext.h - src/common/tuklib_progname.c - src/common/tuklib_progname.h - src/xzdec/xzdec.c - ) - - target_include_directories("${XZDEC}" PRIVATE - src/common - src/liblzma/api - ) - - target_link_libraries("${XZDEC}" PRIVATE liblzma libgnu) - - if(WIN32 OR CYGWIN) - # Add the Windows resource file for xzdec.exe or lzmadec.exe. - target_sources("${XZDEC}" PRIVATE "src/xzdec/${XZDEC}_w32res.rc") - set_source_files_properties( - "src/xzdec/${XZDEC}_w32res.rc" PROPERTIES - OBJECT_DEPENDS "${W32RES_DEPENDENCIES}" - ) - endif() - - if(SANDBOX_COMPILE_DEFINITION) - target_compile_definitions("${XZDEC}" PRIVATE - "${SANDBOX_COMPILE_DEFINITION}") - endif() - - tuklib_progname("${XZDEC}") - tuklib_mbstr("${XZDEC}") - - install(TARGETS "${XZDEC}" - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT "${XZDEC}_Runtime") - endforeach() - - if(XZ_TOOL_LZMADEC) - # This is the only build-time difference with lzmadec. - target_compile_definitions(lzmadec PRIVATE "LZMADEC") - endif() - - if(UNIX AND XZ_TOOL_XZDEC) - # NOTE: This puts the lzmadec.1 symlinks into xzdec_Documentation. - # This isn't great but doing them separately with translated - # man pages would require extra code. So this has to suffice for now. - # - # Also, if xzdec is disabled but lzmadec isn't, then the man page - # isn't installed at all. It could be done but it's not a typical - # situation so let's keep this simpler. - if(XZ_TOOL_LZMADEC) - my_install_man(xzdec_Documentation src/xzdec/xzdec.1 lzmadec) - else() - my_install_man(xzdec_Documentation src/xzdec/xzdec.1 "") - endif() - endif() -endif() - - -############################################################################# -# lzmainfo -############################################################################# - -option(XZ_TOOL_LZMAINFO "Build and install the lzmainfo command line tool" ON) - -if(XZ_TOOL_LZMAINFO AND HAVE_DECODERS) - add_executable(lzmainfo - src/common/sysdefs.h - src/common/tuklib_common.h - src/common/tuklib_config.h - src/common/tuklib_mbstr.h - src/common/tuklib_mbstr_nonprint.c - src/common/tuklib_mbstr_nonprint.h - src/common/tuklib_mbstr_width.c - src/common/tuklib_mbstr_wrap.c - src/common/tuklib_mbstr_wrap.h - src/common/tuklib_exit.c - src/common/tuklib_exit.h - src/common/tuklib_gettext.h - src/common/tuklib_progname.c - src/common/tuklib_progname.h - src/lzmainfo/lzmainfo.c - ) - - target_include_directories(lzmainfo PRIVATE - src/common - src/liblzma/api - ) - - target_link_libraries(lzmainfo PRIVATE liblzma libgnu) - - if(WIN32 OR CYGWIN) - # Add the Windows resource file for lzmainfo.exe. - target_sources(lzmainfo PRIVATE src/lzmainfo/lzmainfo_w32res.rc) - set_source_files_properties(src/lzmainfo/lzmainfo_w32res.rc PROPERTIES - OBJECT_DEPENDS "${W32RES_DEPENDENCIES}" - ) - endif() - - tuklib_progname(lzmainfo) - tuklib_mbstr(lzmainfo) - - # NOTE: The translations are in the "xz" domain and the .mo files are - # installed as part of the "xz" target. - if(XZ_NLS) - target_link_libraries(lzmainfo PRIVATE Intl::Intl) - - target_compile_definitions(lzmainfo PRIVATE - ENABLE_NLS - PACKAGE="${TRANSLATION_DOMAIN}" - LOCALEDIR="${LOCALEDIR_DEFINITION}" - ) - endif() - - install(TARGETS lzmainfo - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT lzmainfo_Runtime) - - if(UNIX) - my_install_man(lzmainfo_Documentation src/lzmainfo/lzmainfo.1 "") - endif() -endif() - - -############################################################################# -# xz -############################################################################# - -option(XZ_TOOL_XZ "Build and install the xz command line tool" ON) - -if(XZ_TOOL_XZ) - add_executable(xz - src/common/my_landlock.h - src/common/mythread.h - src/common/sysdefs.h - src/common/tuklib_common.h - src/common/tuklib_config.h - src/common/tuklib_mbstr_nonprint.c - src/common/tuklib_mbstr_nonprint.h - src/common/tuklib_exit.c - src/common/tuklib_exit.h - src/common/tuklib_gettext.h - src/common/tuklib_integer.h - src/common/tuklib_mbstr.h - src/common/tuklib_mbstr_fw.c - src/common/tuklib_mbstr_width.c - src/common/tuklib_mbstr_wrap.c - src/common/tuklib_mbstr_wrap.h - src/common/tuklib_open_stdxxx.c - src/common/tuklib_open_stdxxx.h - src/common/tuklib_progname.c - src/common/tuklib_progname.h - src/xz/args.c - src/xz/args.h - src/xz/coder.c - src/xz/coder.h - src/xz/file_io.c - src/xz/file_io.h - src/xz/hardware.c - src/xz/hardware.h - src/xz/main.c - src/xz/main.h - src/xz/message.c - src/xz/message.h - src/xz/mytime.c - src/xz/mytime.h - src/xz/options.c - src/xz/options.h - src/xz/private.h - src/xz/sandbox.c - src/xz/sandbox.h - src/xz/signals.c - src/xz/signals.h - src/xz/suffix.c - src/xz/suffix.h - src/xz/util.c - src/xz/util.h - ) - - target_include_directories(xz PRIVATE - src/common - src/liblzma/api - ) - - if(HAVE_DECODERS) - target_sources(xz PRIVATE - src/xz/list.c - src/xz/list.h - ) - endif() - - target_link_libraries(xz PRIVATE liblzma libgnu) - - if(USE_POSIX_THREADS) - # src/xz/signals.c uses mythread_sigmask() which with POSIX - # threads calls pthread_sigmask(). Thus, we need the threading - # library as a dependency for xz. The liblzma target links against - # Threads::Threads PRIVATEly, thus that won't provide the pthreads - # symbols for xz. - # - # NOTE: The build may work without this if the symbol is in libc - # but it is mandatory to have this here to keep it working with - # all pthread implementations. - target_link_libraries(xz PRIVATE Threads::Threads) - endif() - - set(XZ_ASSUME_RAM "128" CACHE STRING "Assume that the system has \ -this many MiB of RAM if xz cannot determine the amount at runtime") - target_compile_definitions(xz PRIVATE "ASSUME_RAM=${XZ_ASSUME_RAM}") - - if(WIN32 OR CYGWIN) - # Add the Windows resource file for xz.exe. - target_sources(xz PRIVATE src/xz/xz_w32res.rc) - set_source_files_properties(src/xz/xz_w32res.rc PROPERTIES - OBJECT_DEPENDS "${W32RES_DEPENDENCIES}" - ) - endif() - - if(SANDBOX_COMPILE_DEFINITION) - target_compile_definitions(xz PRIVATE "${SANDBOX_COMPILE_DEFINITION}") - endif() - - tuklib_progname(xz) - tuklib_mbstr(xz) - - check_symbol_exists(optreset getopt.h HAVE_OPTRESET) - tuklib_add_definition_if(xz HAVE_OPTRESET) - - check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE) - tuklib_add_definition_if(xz HAVE_POSIX_FADVISE) - - # How to get file time: - check_struct_has_member("struct stat" st_atim.tv_nsec - "sys/types.h;sys/stat.h" - HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) - if(HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) - tuklib_add_definitions(xz HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) - else() - check_struct_has_member("struct stat" st_atimespec.tv_nsec - "sys/types.h;sys/stat.h" - HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC) - if(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC) - tuklib_add_definitions(xz HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC) - else() - check_struct_has_member("struct stat" st_atimensec - "sys/types.h;sys/stat.h" - HAVE_STRUCT_STAT_ST_ATIMENSEC) - tuklib_add_definition_if(xz HAVE_STRUCT_STAT_ST_ATIMENSEC) - endif() - endif() - - # How to set file time: - check_symbol_exists(futimens "sys/types.h;sys/stat.h" HAVE_FUTIMENS) - if(HAVE_FUTIMENS) - tuklib_add_definitions(xz HAVE_FUTIMENS) - else() - check_symbol_exists(futimes "sys/time.h" HAVE_FUTIMES) - if(HAVE_FUTIMES) - tuklib_add_definitions(xz HAVE_FUTIMES) - else() - check_symbol_exists(futimesat "sys/time.h" HAVE_FUTIMESAT) - if(HAVE_FUTIMESAT) - tuklib_add_definitions(xz HAVE_FUTIMESAT) - else() - check_symbol_exists(utimes "sys/time.h" HAVE_UTIMES) - if(HAVE_UTIMES) - tuklib_add_definitions(xz HAVE_UTIMES) - else() - check_symbol_exists(_futime "sys/utime.h" HAVE__FUTIME) - if(HAVE__FUTIME) - tuklib_add_definitions(xz HAVE__FUTIME) - else() - check_symbol_exists(utime "utime.h" HAVE_UTIME) - tuklib_add_definition_if(xz HAVE_UTIME) - endif() - endif() - endif() - endif() - endif() - - if(XZ_NLS) - target_link_libraries(xz PRIVATE Intl::Intl) - - target_compile_definitions(xz PRIVATE - ENABLE_NLS - PACKAGE="${TRANSLATION_DOMAIN}" - LOCALEDIR="${LOCALEDIR_DEFINITION}" - ) - - file(STRINGS po/LINGUAS LINGUAS) - - # NOTE: gettext_process_po_files' INSTALL_DESTINATION is - # incompatible with how Autotools requires the .po files to - # be named. CMake would require each .po file to be named with - # the translation domain and thus each .po file would need its - # own language-specific directory (like "po/fi/xz.po"). On top - # of this, INSTALL_DESTINATION doesn't allow specifying COMPONENT - # and thus the .mo files go into "Unspecified" component. So we - # can use gettext_process_po_files to convert the .po files but - # installation needs to be done with our own code. - # - # Also, the .gmo files will go to root of the build directory - # instead of neatly into a subdirectory. This is hardcoded in - # CMake's FindGettext.cmake. - foreach(LANG IN LISTS LINGUAS) - gettext_process_po_files("${LANG}" ALL - PO_FILES "${CMAKE_CURRENT_SOURCE_DIR}/po/${LANG}.po") - endforeach() - - foreach(LANG IN LISTS LINGUAS) - install( - FILES "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo" - DESTINATION "${CMAKE_INSTALL_LOCALEDIR}/${LANG}/LC_MESSAGES" - RENAME "${TRANSLATION_DOMAIN}.mo" - COMPONENT xz_Runtime) - endforeach() - endif() - - # This command must be before the symlink creation to keep things working - # on Cygwin and MSYS2 in all cases. - # - # - Cygwin can encode symlinks in multiple ways. This can be - # controlled via the environment variable "CYGWIN". If it contains - # "winsymlinks:nativestrict" then symlink creation will fail if - # the link target doesn't exist. This mode isn't the default though. - # See: https://cygwin.com/faq.html#faq.api.symlinks - # - # - MSYS2 supports the same winsymlinks option in the environment - # variable "MSYS" (not "MSYS2). The default in MSYS2 is to make - # a copy of the file instead of any kind of symlink. Thus the link - # target must exist or the creation of the "symlink" (copy) will fail. - # - # Our installation order must be such that when a symbolic link is created - # its target must already exists. There is no race condition for parallel - # builds because the generated cmake_install.cmake executes serially. - install(TARGETS xz - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT xz_Runtime) - - if(UNIX) - option(XZ_TOOL_SYMLINKS "Create unxz and xzcat symlinks" ON) - option(XZ_TOOL_SYMLINKS_LZMA - "Create 'lzma' and other symlinks for LZMA Utils compatibility" - ON) - set(XZ_LINKS) - - if(XZ_TOOL_SYMLINKS) - list(APPEND XZ_LINKS "unxz" "xzcat") - endif() - - if(XZ_TOOL_SYMLINKS_LZMA) - list(APPEND XZ_LINKS "lzma" "unlzma" "lzcat") - endif() - - # On Cygwin, don't add the .exe suffix to the symlinks. - # - # FIXME? Does this make sense on MSYS & MSYS2 where "ln -s" - # by default makes copies? Inside MSYS & MSYS2 it is possible - # to execute files without the .exe suffix but not outside - # (like in Command Prompt). Omitting the suffix matches - # what configure.ac has done for many years though. - my_install_symlinks(xz_Runtime "${CMAKE_INSTALL_BINDIR}" - "xz${CMAKE_EXECUTABLE_SUFFIX}" "" "${XZ_LINKS}") - - # Install the man pages and (optionally) their symlinks - # and translations. - my_install_man(xz_Documentation src/xz/xz.1 "${XZ_LINKS}") - endif() -endif() - - -############################################################################# -# Scripts -############################################################################# - -set(ENABLE_SCRIPTS OFF) - -if(UNIX) - # NOTE: These depend on the xz tool and decoder support. - option(XZ_TOOL_SCRIPTS "Install the scripts \ -xzdiff, xzgrep, xzmore, xzless, and their symlinks" ON) - - if(XZ_TOOL_SCRIPTS AND XZ_TOOL_XZ AND HAVE_DECODERS) - set(ENABLE_SCRIPTS ON) - endif() - - # NOTE: This isn't as sophisticated as in the Autotools build which - # uses posix-shell.m4 but hopefully this doesn't need to be either. - # CMake likely won't be used on as many (old) obscure systems as the - # Autotools-based builds are. - if(CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND EXISTS "/usr/xpg4/bin/sh") - set(POSIX_SHELL_DEFAULT "/usr/xpg4/bin/sh") - else() - set(POSIX_SHELL_DEFAULT "/bin/sh") - endif() - - set(XZ_POSIX_SHELL "${POSIX_SHELL_DEFAULT}" CACHE STRING - "Shell to use for scripts (xzgrep and others)") - - # Guess the extra path to add from XZ_POSIX_SHELL. Autotools-based build - # has a separate option --enable-path-for-scripts=PREFIX but this is - # enough for Solaris. - set(enable_path_for_scripts) - get_filename_component(POSIX_SHELL_DIR "${XZ_POSIX_SHELL}" DIRECTORY) - - if(NOT POSIX_SHELL_DIR MATCHES "^/bin$|^/usr/bin$") - set(enable_path_for_scripts "PATH=${POSIX_SHELL_DIR}:\$PATH") - endif() - - set(XZDIFF_LINKS xzcmp) - set(XZGREP_LINKS xzegrep xzfgrep) - set(XZMORE_LINKS) - set(XZLESS_LINKS) - - if(XZ_TOOL_SYMLINKS_LZMA) - list(APPEND XZDIFF_LINKS lzdiff lzcmp) - list(APPEND XZGREP_LINKS lzgrep lzegrep lzfgrep) - list(APPEND XZMORE_LINKS lzmore) - list(APPEND XZLESS_LINKS lzless) - endif() - - set(xz "xz") - set(POSIX_SHELL "${XZ_POSIX_SHELL}") - - foreach(S xzdiff xzgrep xzmore xzless) - configure_file("src/scripts/${S}.in" "${S}" - @ONLY - NEWLINE_STYLE LF - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE - GROUP_READ GROUP_EXECUTE - WORLD_READ WORLD_EXECUTE) - - if(ENABLE_SCRIPTS) - install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/${S}" - DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT scripts_Runtime) - endif() - endforeach() - - unset(xz) - unset(POSIX_SHELL) - unset(enable_path_for_scripts) - - if(ENABLE_SCRIPTS) - my_install_symlinks(scripts_Runtime "${CMAKE_INSTALL_BINDIR}" - xzdiff "" "${XZDIFF_LINKS}") - - my_install_symlinks(scripts_Runtime "${CMAKE_INSTALL_BINDIR}" - xzgrep "" "${XZGREP_LINKS}") - - my_install_symlinks(scripts_Runtime "${CMAKE_INSTALL_BINDIR}" - xzmore "" "${XZMORE_LINKS}") - - my_install_symlinks(scripts_Runtime "${CMAKE_INSTALL_BINDIR}" - xzless "" "${XZLESS_LINKS}") - - my_install_man(scripts_Documentation - src/scripts/xzdiff.1 "${XZDIFF_LINKS}") - - my_install_man(scripts_Documentation - src/scripts/xzgrep.1 "${XZGREP_LINKS}") - - my_install_man(scripts_Documentation - src/scripts/xzmore.1 "${XZMORE_LINKS}") - - my_install_man(scripts_Documentation - src/scripts/xzless.1 "${XZLESS_LINKS}") - endif() -endif() - - -############################################################################# -# Documentation -############################################################################# - -if(UNIX) - option(XZ_DOXYGEN "Use Doxygen to generate liblzma API docs" OFF) - - if (XZ_DOXYGEN) - file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doc") - - add_custom_command( - VERBATIM - COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/doxygen/update-doxygen" - ARGS "api" - "${CMAKE_CURRENT_SOURCE_DIR}" - "${CMAKE_CURRENT_BINARY_DIR}/doc" - OUTPUT doc/api/index.html - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/doxygen/update-doxygen" - "${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile" - ${LIBLZMA_API_HEADERS} - ) - - add_custom_target( - liblzma-doc-api ALL - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/doc/api/index.html" - ) - - install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doc/api" - DESTINATION "${CMAKE_INSTALL_DOCDIR}" - COMPONENT liblzma_Documentation) - endif() -endif() - -option(XZ_DOC "Install basic documentation, examples, and license files" ON) -if(XZ_DOC) - install(DIRECTORY doc/examples - DESTINATION "${CMAKE_INSTALL_DOCDIR}" - COMPONENT liblzma_Documentation) - - # GPLv2 applies to the scripts. If GNU getopt_long is used then - # LGPLv2.1 applies to the command line tools but, using the - # section 3 of LGPLv2.1, GNU getopt_long can be handled as GPLv2 too. - # Thus GPLv2 should be enough here. - install(FILES AUTHORS - COPYING - COPYING.0BSD - COPYING.GPLv2 - NEWS - README - THANKS - doc/faq.txt - doc/history.txt - doc/lzma-file-format.txt - doc/xz-file-format.txt - DESTINATION "${CMAKE_INSTALL_DOCDIR}" - COMPONENT Documentation) -endif() - - -############################################################################# -# Tests -############################################################################# - -# Tests are in a separate file so that it's possible to delete the whole -# "tests" directory and still have a working build, just without the tests. -include(tests/tests.cmake OPTIONAL) diff --git a/software/src/xz/COPYING b/software/src/xz/COPYING deleted file mode 100644 index ef33713..0000000 --- a/software/src/xz/COPYING +++ /dev/null @@ -1,70 +0,0 @@ - -XZ Utils Licensing -================== - - Different licenses apply to different files in this package. Here - is a summary of which licenses apply to which parts of this package: - - - liblzma is under the BSD Zero Clause License (0BSD). - - - The command line tools xz, xzdec, lzmadec, and lzmainfo are - under 0BSD except that, on systems that don't have a usable - getopt_long, GNU getopt_long is compiled and linked in from the - 'lib' directory. The getopt_long code is under GNU LGPLv2.1+. - - - The scripts to grep, diff, and view compressed files have been - adapted from GNU gzip. These scripts (xzgrep, xzdiff, xzless, - and xzmore) are under GNU GPLv2+. The man pages of the scripts - are under 0BSD; they aren't based on the man pages of GNU gzip. - - - Most of the XZ Utils specific documentation that is in - plain text files (like README, INSTALL, PACKAGERS, NEWS, - and ChangeLog) are under 0BSD unless stated otherwise in - the file itself. The files xz-file-format.txt and - lzma-file-format.xt are in the public domain but may - be distributed under the terms of 0BSD too. - - - Translated messages and man pages are under 0BSD except that - some old translations are in the public domain. - - - Test files and test code in the 'tests' directory, and - debugging utilities in the 'debug' directory are under - the BSD Zero Clause License (0BSD). - - - The GNU Autotools based build system contains files that are - under GNU GPLv2+, GNU GPLv3+, and a few permissive licenses. - These files don't affect the licensing of the binaries being - built. - - - The 'extra' directory contains files that are under various - free software licenses. These aren't built or installed as - part of XZ Utils. - - The following command may be helpful in finding per-file license - information. It works on xz.git and on a clean file tree extracted - from a release tarball. - - sh build-aux/license-check.sh -v - - For the files under the BSD Zero Clause License (0BSD), if - a copyright notice is needed, the following is sufficient: - - Copyright (C) The XZ Utils authors and contributors - - If you copy significant amounts of 0BSD-licensed code from XZ Utils - into your project, acknowledging this somewhere in your software is - polite (especially if it is proprietary, non-free software), but - it is not legally required by the license terms. Here is an example - of a good notice to put into "about box" or into documentation: - - This software includes code from XZ Utils . - - The following license texts are included in the following files: - - COPYING.0BSD: BSD Zero Clause License - - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 - - COPYING.GPLv2: GNU General Public License version 2 - - COPYING.GPLv3: GNU General Public License version 3 - - If you have questions, don't hesitate to ask for more information. - The contact information is in the README file. - diff --git a/software/src/xz/COPYING.0BSD b/software/src/xz/COPYING.0BSD deleted file mode 100644 index 4322122..0000000 --- a/software/src/xz/COPYING.0BSD +++ /dev/null @@ -1,11 +0,0 @@ -Permission to use, copy, modify, and/or distribute this -software for any purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL -THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/software/src/xz/Makefile.am b/software/src/xz/Makefile.am deleted file mode 100644 index fc54f47..0000000 --- a/software/src/xz/Makefile.am +++ /dev/null @@ -1,123 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -# Use -n to prevent gzip from adding a timestamp to the .gz headers. -GZIP_ENV = -9n - -DIST_SUBDIRS = lib src po tests debug -SUBDIRS = - -if COND_GNULIB -SUBDIRS += lib -endif - -SUBDIRS += src po tests - -if COND_DOC -dist_doc_DATA = \ - AUTHORS \ - COPYING \ - COPYING.0BSD \ - COPYING.GPLv2 \ - NEWS \ - README \ - THANKS \ - doc/faq.txt \ - doc/history.txt \ - doc/xz-file-format.txt \ - doc/lzma-file-format.txt - -examplesdir = $(docdir)/examples -dist_examples_DATA = \ - doc/examples/00_README.txt \ - doc/examples/01_compress_easy.c \ - doc/examples/02_decompress.c \ - doc/examples/03_compress_custom.c \ - doc/examples/04_compress_easy_mt.c \ - doc/examples/11_file_info.c \ - doc/examples/Makefile -endif - -EXTRA_DIST = \ - cmake \ - dos \ - doxygen \ - extra \ - po4a \ - windows \ - CMakeLists.txt \ - COPYING.GPLv2 \ - COPYING.GPLv3 \ - COPYING.LGPLv2.1 \ - INSTALL.generic \ - PACKAGERS \ - TODO \ - autogen.sh \ - build-aux/license-check.sh \ - build-aux/manconv.sh \ - build-aux/version.sh \ - po/xz.pot-header - -ACLOCAL_AMFLAGS = -I m4 - -# List of man pages to convert to plain text in the dist-hook target -# or to PDF in the pdf-local target. -manfiles = \ - src/xz/xz.1 \ - src/xzdec/xzdec.1 \ - src/lzmainfo/lzmainfo.1 \ - src/scripts/xzdiff.1 \ - src/scripts/xzgrep.1 \ - src/scripts/xzless.1 \ - src/scripts/xzmore.1 - -# Create ChangeLog using "git log". -# Convert the man pages to plain text (ASCII only) format. -dist-hook: - if test -d "$(srcdir)/.git" && type git > /dev/null 2>&1; then \ - ( cd "$(srcdir)" && git log --pretty=medium --date=iso --stat \ - b69da6d4bb6bb11fc0cf066920791990d2b22a06^..HEAD ) \ - > "$(distdir)/ChangeLog"; \ - fi - if type groff > /dev/null 2>&1; then \ - dest="$(distdir)/doc/man" && \ - $(MKDIR_P) "$$dest/txt" && \ - for FILE in $(manfiles); do \ - BASE=`basename $$FILE .1` && \ - $(SHELL) "$(srcdir)/build-aux/manconv.sh" ascii \ - < "$(srcdir)/$$FILE" \ - > "$$dest/txt/$$BASE.txt"; \ - done; \ - fi - cd "$(distdir)" && $(SHELL) "build-aux/license-check.sh" - -# This works with GNU tar and gives cleaner package than normal 'make dist'. -# This also ensures that the translations are up to date (dist-hook -# would be too late for that). -mydist: - $(SHELL) "$(srcdir)/src/liblzma/validate_map.sh" - cd po && $(MAKE) xz.pot-update - cd "$(srcdir)/po4a" && $(SHELL) update-po - VERSION=$(VERSION); \ - if test -d "$(srcdir)/.git" && type git > /dev/null 2>&1; then \ - $(SHELL) "$(srcdir)/build-aux/license-check.sh" || exit 1; \ - SNAPSHOT=`cd "$(srcdir)" && git describe --abbrev=8 | cut -b2-`; \ - test -n "$$SNAPSHOT" && VERSION=$$SNAPSHOT; \ - fi; \ - TAR_OPTIONS='--owner=0 --group=0 --numeric-owner --mode=u+rw,go+r-w --sort=name' \ - LC_COLLATE=C \ - $(MAKE) VERSION="$$VERSION" dist-gzip - -# NOTE: This only creates the PDFs. The install rules are missing. -pdf-local: - dest="doc/man" && \ - $(MKDIR_P) "$$dest/pdf-a4" "$$dest/pdf-letter" && \ - for FILE in $(manfiles); do \ - BASE=`basename $$FILE .1` && \ - $(SHELL) "$(srcdir)/build-aux/manconv.sh" pdf a4 \ - < "$(srcdir)/$$FILE" \ - > "$$dest/pdf-a4/$$BASE-a4.pdf" && \ - $(SHELL) "$(srcdir)/build-aux/manconv.sh" pdf letter \ - < "$(srcdir)/$$FILE" \ - > "$$dest/pdf-letter/$$BASE-letter.pdf"; \ - done diff --git a/software/src/xz/README b/software/src/xz/README deleted file mode 100644 index 3b2502a..0000000 --- a/software/src/xz/README +++ /dev/null @@ -1,3 +0,0 @@ -# Heavily modifed XZ Utils only containing LibLZMA -# Based on xz-5.8.1 -# See https://github.com/tukaani-project/xz for the original source diff --git a/software/src/xz/cmake/remove-ordinals.cmake b/software/src/xz/cmake/remove-ordinals.cmake deleted file mode 100644 index de85ddf..0000000 --- a/software/src/xz/cmake/remove-ordinals.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# remove-ordinals.cmake -# -# Removes the ordinal numbers from a DEF file that has been created by -# GNU ld or LLVM lld option --output-def (when creating a Windows DLL). -# This should be equivalent: sed 's/ \+@ *[0-9]\+//' -# -# Usage: -# -# cmake -DINPUT_FILE=infile.def.in \ -# -DOUTPUT_FILE=outfile.def \ -# -P remove-ordinals.cmake -# -############################################################################# -# -# Author: Lasse Collin -# -############################################################################# - -file(READ "${INPUT_FILE}" STR) -string(REGEX REPLACE " +@ *[0-9]+" "" STR "${STR}") -file(WRITE "${OUTPUT_FILE}" "${STR}") diff --git a/software/src/xz/cmake/tuklib_common.cmake b/software/src/xz/cmake/tuklib_common.cmake deleted file mode 100644 index 9762e24..0000000 --- a/software/src/xz/cmake/tuklib_common.cmake +++ /dev/null @@ -1,56 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_common.cmake - common functions and macros for tuklib_*.cmake files -# -# Author: Lasse Collin -# -############################################################################# - -function(tuklib_add_definitions TARGET_OR_ALL DEFINITIONS) - # DEFINITIONS may be an empty string/list but it's fine here. There is - # no need to quote ${DEFINITIONS} as empty arguments are fine here. - if(TARGET_OR_ALL STREQUAL "ALL") - add_compile_definitions(${DEFINITIONS}) - else() - target_compile_definitions("${TARGET_OR_ALL}" PRIVATE ${DEFINITIONS}) - endif() -endfunction() - -function(tuklib_add_definition_if TARGET_OR_ALL VAR) - if(${VAR}) - tuklib_add_definitions("${TARGET_OR_ALL}" "${VAR}") - endif() -endfunction() - -# This is an over-simplified version of AC_USE_SYSTEM_EXTENSIONS in Autoconf -# or gl_USE_SYSTEM_EXTENSIONS in gnulib. -# -# NOTE: This is a macro because the changes to CMAKE_REQUIRED_DEFINITIONS -# must be visible in the calling scope. -macro(tuklib_use_system_extensions) - if(NOT MSVC) - add_compile_definitions( - _GNU_SOURCE # glibc, musl, mingw-w64 - _NETBSD_SOURCE # NetBSD, MINIX 3 - _OPENBSD_SOURCE # Also NetBSD! - __EXTENSIONS__ # Solaris - _POSIX_PTHREAD_SEMANTICS # Solaris - _DARWIN_C_SOURCE # macOS - _TANDEM_SOURCE # HP NonStop - _ALL_SOURCE # AIX, z/OS - ) - - list(APPEND CMAKE_REQUIRED_DEFINITIONS - -D_GNU_SOURCE - -D_NETBSD_SOURCE - -D_OPENBSD_SOURCE - -D__EXTENSIONS__ - -D_POSIX_PTHREAD_SEMANTICS - -D_DARWIN_C_SOURCE - -D_TANDEM_SOURCE - -D_ALL_SOURCE - ) - endif() -endmacro() diff --git a/software/src/xz/cmake/tuklib_cpucores.cmake b/software/src/xz/cmake/tuklib_cpucores.cmake deleted file mode 100644 index 05f3cee..0000000 --- a/software/src/xz/cmake/tuklib_cpucores.cmake +++ /dev/null @@ -1,184 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_cpucores.cmake - see tuklib_cpucores.m4 for description and comments -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(CMakePushCheckState) -include(CheckCSourceCompiles) -include(CheckIncludeFile) - -function(tuklib_cpucores_internal_check) - if(WIN32 OR CYGWIN) - # Nothing to do, the tuklib_cpucores.c handles it. - set(TUKLIB_CPUCORES_DEFINITIONS "" CACHE INTERNAL "") - return() - endif() - - # glibc-based systems (GNU/Linux and GNU/kFreeBSD) have - # sched_getaffinity(). The CPU_COUNT() macro was added in glibc 2.9. - # glibc 2.9 is old enough that if someone uses the code on older glibc, - # the fallback to sysconf() should be good enough. - # - # NOTE: This required that _GNU_SOURCE is defined. We assume that whatever - # feature test macros the caller wants to use are already set in - # CMAKE_REQUIRED_DEFINES and in the target defines. - check_c_source_compiles(" - #include - int main(void) - { - cpu_set_t cpu_mask; - sched_getaffinity(0, sizeof(cpu_mask), &cpu_mask); - return CPU_COUNT(&cpu_mask); - } - " - TUKLIB_CPUCORES_SCHED_GETAFFINITY) - if(TUKLIB_CPUCORES_SCHED_GETAFFINITY) - set(TUKLIB_CPUCORES_DEFINITIONS - "TUKLIB_CPUCORES_SCHED_GETAFFINITY" - CACHE INTERNAL "") - return() - endif() - - # FreeBSD has both cpuset and sysctl. Look for cpuset first because - # it's a better approach. - # - # This test would match on GNU/kFreeBSD too but it would require - # -lfreebsd-glue when linking and thus in the current form this would - # fail on GNU/kFreeBSD. The above test for sched_getaffinity() matches - # on GNU/kFreeBSD so the test below should never run on that OS. - check_c_source_compiles(" - #include - #include - int main(void) - { - cpuset_t set; - cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, - sizeof(set), &set); - return 0; - } - " - TUKLIB_CPUCORES_CPUSET) - if(TUKLIB_CPUCORES_CPUSET) - set(TUKLIB_CPUCORES_DEFINITIONS "HAVE_PARAM_H;TUKLIB_CPUCORES_CPUSET" - CACHE INTERNAL "") - return() - endif() - - # On OS/2, both sysconf() and sysctl() pass the tests in this file, - # but only sysctl() works. On QNX it's the opposite: only sysconf() works - # (although it assumes that _POSIX_SOURCE, _XOPEN_SOURCE, and - # _POSIX_C_SOURCE are undefined or alternatively _QNX_SOURCE is defined). - # - # We test sysctl() first and intentionally break the sysctl() test on QNX - # so that sysctl() is never used on QNX. - cmake_push_check_state() - check_include_file(sys/param.h HAVE_SYS_PARAM_H) - if(HAVE_SYS_PARAM_H) - list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_PARAM_H) - endif() - check_c_source_compiles(" - #ifdef __QNX__ - compile error - #endif - #ifdef HAVE_SYS_PARAM_H - # include - #endif - #include - int main(void) - { - #ifdef HW_NCPUONLINE - /* This is preferred on OpenBSD, see tuklib_cpucores.c. */ - int name[2] = { CTL_HW, HW_NCPUONLINE }; - #else - int name[2] = { CTL_HW, HW_NCPU }; - #endif - int cpus; - size_t cpus_size = sizeof(cpus); - sysctl(name, 2, &cpus, &cpus_size, NULL, 0); - return 0; - } - " - TUKLIB_CPUCORES_SYSCTL) - cmake_pop_check_state() - if(TUKLIB_CPUCORES_SYSCTL) - if(HAVE_SYS_PARAM_H) - set(TUKLIB_CPUCORES_DEFINITIONS - "HAVE_PARAM_H;TUKLIB_CPUCORES_SYSCTL" - CACHE INTERNAL "") - else() - set(TUKLIB_CPUCORES_DEFINITIONS - "TUKLIB_CPUCORES_SYSCTL" - CACHE INTERNAL "") - endif() - return() - endif() - - # Many platforms support sysconf(). - check_c_source_compiles(" - #include - int main(void) - { - long i; - #ifdef _SC_NPROCESSORS_ONLN - /* Many systems using sysconf() */ - i = sysconf(_SC_NPROCESSORS_ONLN); - #else - /* IRIX */ - i = sysconf(_SC_NPROC_ONLN); - #endif - return 0; - } - " - TUKLIB_CPUCORES_SYSCONF) - if(TUKLIB_CPUCORES_SYSCONF) - set(TUKLIB_CPUCORES_DEFINITIONS "TUKLIB_CPUCORES_SYSCONF" - CACHE INTERNAL "") - return() - endif() - - # HP-UX - check_c_source_compiles(" - #include - #include - int main(void) - { - struct pst_dynamic pst; - pstat_getdynamic(&pst, sizeof(pst), 1, 0); - (void)pst.psd_proc_cnt; - return 0; - } - " - TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) - if(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) - set(TUKLIB_CPUCORES_DEFINITIONS "TUKLIB_CPUCORES_PSTAT_GETDYNAMIC" - CACHE INTERNAL "") - return() - endif() -endfunction() - -function(tuklib_cpucores TARGET_OR_ALL) - if(NOT DEFINED TUKLIB_CPUCORES_FOUND) - message(STATUS - "Checking how to detect the number of available CPU cores") - tuklib_cpucores_internal_check() - - if(DEFINED TUKLIB_CPUCORES_DEFINITIONS) - set(TUKLIB_CPUCORES_FOUND 1 CACHE INTERNAL "") - else() - set(TUKLIB_CPUCORES_FOUND 0 CACHE INTERNAL "") - message(WARNING - "No method to detect the number of CPU cores was found") - endif() - endif() - - if(TUKLIB_CPUCORES_FOUND) - tuklib_add_definitions("${TARGET_OR_ALL}" - "${TUKLIB_CPUCORES_DEFINITIONS}") - endif() -endfunction() diff --git a/software/src/xz/cmake/tuklib_integer.cmake b/software/src/xz/cmake/tuklib_integer.cmake deleted file mode 100644 index 7e1ed3c..0000000 --- a/software/src/xz/cmake/tuklib_integer.cmake +++ /dev/null @@ -1,141 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_integer.cmake - see tuklib_integer.m4 for description and comments -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(TestBigEndian) -include(CheckCSourceCompiles) -include(CheckIncludeFile) -include(CheckSymbolExists) - -function(tuklib_integer TARGET_OR_ALL) - # Check for endianness. Unlike the Autoconf's AC_C_BIGENDIAN, this doesn't - # support Apple universal binaries. The CMake module will leave the - # variable unset so we can catch that situation here instead of continuing - # as if we were little endian. - test_big_endian(WORDS_BIGENDIAN) - if(NOT DEFINED WORDS_BIGENDIAN) - message(FATAL_ERROR "Cannot determine endianness") - endif() - tuklib_add_definition_if("${TARGET_OR_ALL}" WORDS_BIGENDIAN) - - # Look for a byteswapping method. - check_c_source_compiles(" - int main(void) - { - __builtin_bswap16(1); - __builtin_bswap32(1); - __builtin_bswap64(1); - return 0; - } - " - HAVE___BUILTIN_BSWAPXX) - if(HAVE___BUILTIN_BSWAPXX) - tuklib_add_definitions("${TARGET_OR_ALL}" HAVE___BUILTIN_BSWAPXX) - else() - check_include_file(byteswap.h HAVE_BYTESWAP_H) - if(HAVE_BYTESWAP_H) - tuklib_add_definitions("${TARGET_OR_ALL}" HAVE_BYTESWAP_H) - check_symbol_exists(bswap_16 byteswap.h HAVE_BSWAP_16) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_16) - check_symbol_exists(bswap_32 byteswap.h HAVE_BSWAP_32) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_32) - check_symbol_exists(bswap_64 byteswap.h HAVE_BSWAP_64) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_BSWAP_64) - else() - check_include_file(sys/endian.h HAVE_SYS_ENDIAN_H) - if(HAVE_SYS_ENDIAN_H) - tuklib_add_definitions("${TARGET_OR_ALL}" HAVE_SYS_ENDIAN_H) - else() - check_include_file(sys/byteorder.h HAVE_SYS_BYTEORDER_H) - tuklib_add_definition_if("${TARGET_OR_ALL}" - HAVE_SYS_BYTEORDER_H) - endif() - endif() - endif() - - # Guess that unaligned access is fast on these archs: - # - 32/64-bit x86 / x86-64 - # - 32/64-bit big endian PowerPC - # - 64-bit little endian PowerPC - # - Some 32-bit ARM - # - Some 64-bit ARM64 (AArch64) - # - Some 32/64-bit RISC-V - # - # CMake doesn't provide a standardized/normalized list of processor arch - # names. For example, x86-64 may be "x86_64" (Linux), "AMD64" (Windows), - # or even "EM64T" (64-bit WinXP). - set(FAST_UNALIGNED_GUESS OFF) - string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" PROCESSOR) - - # There is no ^ in the first regex branch to allow "i" at the beginning - # so it can match "i386" to "i786", and "x86_64". - if(PROCESSOR MATCHES "[x34567]86|^x64|^amd64|^em64t") - set(FAST_UNALIGNED_GUESS ON) - - elseif(PROCESSOR MATCHES "^powerpc|^ppc") - if(WORDS_BIGENDIAN OR PROCESSOR MATCHES "64") - set(FAST_UNALIGNED_GUESS ON) - endif() - - elseif(PROCESSOR MATCHES "^arm|^aarch64|^riscv") - # On 32-bit and 64-bit ARM, GCC and Clang - # #define __ARM_FEATURE_UNALIGNED if - # unaligned access is supported. - # - # Exception: GCC at least up to 13.2.0 - # defines it even when using -mstrict-align - # so in that case this autodetection goes wrong. - # Most of the time -mstrict-align isn't used so it - # shouldn't be a common problem in practice. See: - # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111555 - # - # RISC-V C API Specification says that if - # __riscv_misaligned_fast is defined then - # unaligned access is known to be fast. - # - # MSVC is handled as a special case: We assume that - # 32/64-bit ARM supports fast unaligned access. - # If MSVC gets RISC-V support then this will assume - # fast unaligned access on RISC-V too. - check_c_source_compiles(" - #if !defined(__ARM_FEATURE_UNALIGNED) \ - && !defined(__riscv_misaligned_fast) \ - && !defined(_MSC_VER) - compile error - #endif - int main(void) { return 0; } - " - TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR) - if(TUKLIB_FAST_UNALIGNED_DEFINED_BY_PREPROCESSOR) - set(FAST_UNALIGNED_GUESS ON) - endif() - endif() - - option(TUKLIB_FAST_UNALIGNED_ACCESS - "Enable if the system supports *fast* unaligned memory access \ -with 16-bit, 32-bit, and 64-bit integers." - "${FAST_UNALIGNED_GUESS}") - tuklib_add_definition_if("${TARGET_OR_ALL}" TUKLIB_FAST_UNALIGNED_ACCESS) - - # Unsafe type punning: - option(TUKLIB_USE_UNSAFE_TYPE_PUNNING - "This introduces strict aliasing violations and \ -may result in broken code. However, this might improve performance \ -in some cases, especially with old compilers \ -(e.g. GCC 3 and early 4.x on x86, GCC < 6 on ARMv6 and ARMv7)." - OFF) - tuklib_add_definition_if("${TARGET_OR_ALL}" TUKLIB_USE_UNSAFE_TYPE_PUNNING) - - # Check for GCC/Clang __builtin_assume_aligned(). - check_c_source_compiles( - "int main(void) { __builtin_assume_aligned(\"\", 1); return 0; }" - HAVE___BUILTIN_ASSUME_ALIGNED) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE___BUILTIN_ASSUME_ALIGNED) -endfunction() diff --git a/software/src/xz/cmake/tuklib_large_file_support.cmake b/software/src/xz/cmake/tuklib_large_file_support.cmake deleted file mode 100644 index 7c11969..0000000 --- a/software/src/xz/cmake/tuklib_large_file_support.cmake +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_large_file_support.cmake -# -# If off_t is less than 64 bits by default and -D_FILE_OFFSET_BITS=64 -# makes off_t become 64-bit, the CMake option LARGE_FILE_SUPPORT is -# provided (ON by default) and -D_FILE_OFFSET_BITS=64 is added to -# the compile definitions if LARGE_FILE_SUPPORT is ON. -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(CMakePushCheckState) -include(CheckCSourceCompiles) - -function(tuklib_large_file_support TARGET_OR_ALL) - # MSVC must be handled specially in the C code. - if(MSVC) - return() - endif() - - set(TUKLIB_LARGE_FILE_SUPPORT_TEST - "#include - int foo[sizeof(off_t) >= 8 ? 1 : -1]; - int main(void) { return 0; }") - - check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}" - TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT) - - if(NOT TUKLIB_LARGE_FILE_SUPPORT_BY_DEFAULT) - cmake_push_check_state() - # This needs -D. - list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64") - check_c_source_compiles("${TUKLIB_LARGE_FILE_SUPPORT_TEST}" - TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64) - cmake_pop_check_state() - endif() - - if(TUKLIB_LARGE_FILE_SUPPORT_WITH_FOB64) - # Show the option only when _FILE_OFFSET_BITS=64 affects sizeof(off_t). - option(LARGE_FILE_SUPPORT - "Use -D_FILE_OFFSET_BITS=64 to support files larger than 2 GiB." - ON) - - if(LARGE_FILE_SUPPORT) - # This must not use -D. - tuklib_add_definitions("${TARGET_OR_ALL}" "_FILE_OFFSET_BITS=64") - endif() - endif() -endfunction() diff --git a/software/src/xz/cmake/tuklib_mbstr.cmake b/software/src/xz/cmake/tuklib_mbstr.cmake deleted file mode 100644 index bd234cb..0000000 --- a/software/src/xz/cmake/tuklib_mbstr.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_mbstr.cmake - see tuklib_mbstr.m4 for description and comments -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(CheckSymbolExists) - -function(tuklib_mbstr TARGET_OR_ALL) - check_symbol_exists(mbrtowc wchar.h HAVE_MBRTOWC) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_MBRTOWC) - - # NOTE: wcwidth() requires _GNU_SOURCE or _XOPEN_SOURCE on GNU/Linux. - check_symbol_exists(wcwidth wchar.h HAVE_WCWIDTH) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_WCWIDTH) - - # NOTE: vasprintf() requires _GNU_SOURCE on GNU/Linux. - check_symbol_exists(vasprintf stdio.h HAVE_VASPRINTF) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_VASPRINTF) -endfunction() diff --git a/software/src/xz/cmake/tuklib_physmem.cmake b/software/src/xz/cmake/tuklib_physmem.cmake deleted file mode 100644 index d4d3f3d..0000000 --- a/software/src/xz/cmake/tuklib_physmem.cmake +++ /dev/null @@ -1,153 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_physmem.cmake - see tuklib_physmem.m4 for description and comments -# -# NOTE: Compared tuklib_physmem.m4, this lacks support for Tru64, IRIX, and -# Linux sysinfo() (usually sysconf() is used on GNU/Linux). -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(CMakePushCheckState) -include(CheckCSourceCompiles) -include(CheckIncludeFile) - -function(tuklib_physmem_internal_check) - # Shortcut on Windows: - if(WIN32 OR CYGWIN) - # Nothing to do, the tuklib_physmem.c handles it. - set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "") - return() - endif() - - # Full check for special cases: - check_c_source_compiles(" - #if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \ - || defined(__DJGPP__) || defined(__VMS) \ - || defined(AMIGA) || defined(__AROS__) || defined(__QNX__) - int main(void) { return 0; } - #else - compile error - #endif - " - TUKLIB_PHYSMEM_SPECIAL) - if(TUKLIB_PHYSMEM_SPECIAL) - # Nothing to do, the tuklib_physmem.c handles it. - set(TUKLIB_PHYSMEM_DEFINITIONS "" CACHE INTERNAL "") - return() - endif() - - # Look for AIX-specific solution before sysconf(), because the test - # for sysconf() will pass on AIX but won't actually work - # (sysconf(_SC_PHYS_PAGES) compiles but always returns -1 on AIX). - check_c_source_compiles(" - #include - int main(void) - { - (void)_system_configuration.physmem; - return 0; - } - " - TUKLIB_PHYSMEM_AIX) - if(TUKLIB_PHYSMEM_AIX) - set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_AIX" CACHE INTERNAL "") - return() - endif() - - # sysconf() - check_c_source_compiles(" - #include - int main(void) - { - long i; - i = sysconf(_SC_PAGESIZE); - i = sysconf(_SC_PHYS_PAGES); - return 0; - } - " - TUKLIB_PHYSMEM_SYSCONF) - if(TUKLIB_PHYSMEM_SYSCONF) - set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_SYSCONF" - CACHE INTERNAL "") - return() - endif() - - # sysctl() - cmake_push_check_state() - check_include_file(sys/param.h HAVE_SYS_PARAM_H) - if(HAVE_SYS_PARAM_H) - list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_PARAM_H) - endif() - check_c_source_compiles(" - #ifdef HAVE_SYS_PARAM_H - # include - #endif - #include - int main(void) - { - int name[2] = { CTL_HW, HW_PHYSMEM }; - unsigned long mem; - size_t mem_ptr_size = sizeof(mem); - sysctl(name, 2, &mem, &mem_ptr_size, NULL, 0); - return 0; - } - " - TUKLIB_PHYSMEM_SYSCTL) - cmake_pop_check_state() - if(TUKLIB_PHYSMEM_SYSCTL) - if(HAVE_SYS_PARAM_H) - set(TUKLIB_PHYSMEM_DEFINITIONS - "HAVE_PARAM_H;TUKLIB_PHYSMEM_SYSCTL" - CACHE INTERNAL "") - else() - set(TUKLIB_PHYSMEM_DEFINITIONS - "TUKLIB_PHYSMEM_SYSCTL" - CACHE INTERNAL "") - endif() - return() - endif() - - # HP-UX - check_c_source_compiles(" - #include - #include - int main(void) - { - struct pst_static pst; - pstat_getstatic(&pst, sizeof(pst), 1, 0); - (void)pst.physical_memory; - (void)pst.page_size; - return 0; - } - " - TUKLIB_PHYSMEM_PSTAT_GETSTATIC) - if(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) - set(TUKLIB_PHYSMEM_DEFINITIONS "TUKLIB_PHYSMEM_PSTAT_GETSTATIC" - CACHE INTERNAL "") - return() - endif() -endfunction() - -function(tuklib_physmem TARGET_OR_ALL) - if(NOT DEFINED TUKLIB_PHYSMEM_FOUND) - message(STATUS "Checking how to detect the amount of physical memory") - tuklib_physmem_internal_check() - - if(DEFINED TUKLIB_PHYSMEM_DEFINITIONS) - set(TUKLIB_PHYSMEM_FOUND 1 CACHE INTERNAL "") - else() - set(TUKLIB_PHYSMEM_FOUND 0 CACHE INTERNAL "") - message(WARNING - "No method to detect the amount of physical memory was found") - endif() - endif() - - if(TUKLIB_PHYSMEM_FOUND) - tuklib_add_definitions("${TARGET_OR_ALL}" - "${TUKLIB_PHYSMEM_DEFINITIONS}") - endif() -endfunction() diff --git a/software/src/xz/cmake/tuklib_progname.cmake b/software/src/xz/cmake/tuklib_progname.cmake deleted file mode 100644 index a1f15bd..0000000 --- a/software/src/xz/cmake/tuklib_progname.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: 0BSD - -############################################################################# -# -# tuklib_progname.cmake - see tuklib_progname.m4 for description and comments -# -# Author: Lasse Collin -# -############################################################################# - -include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake") -include(CheckSymbolExists) - -function(tuklib_progname TARGET_OR_ALL) - # NOTE: This glibc extension requires _GNU_SOURCE. - check_symbol_exists(program_invocation_name errno.h - HAVE_PROGRAM_INVOCATION_NAME) - tuklib_add_definition_if("${TARGET_OR_ALL}" HAVE_PROGRAM_INVOCATION_NAME) -endfunction() diff --git a/software/src/xz/configure.ac b/software/src/xz/configure.ac deleted file mode 100644 index 80d6d33..0000000 --- a/software/src/xz/configure.ac +++ /dev/null @@ -1,1425 +0,0 @@ -# -*- Autoconf -*- -# SPDX-License-Identifier: 0BSD - -############################################################################### -# -# Process this file with autoconf to produce a configure script. -# -# Author: Lasse Collin -# -############################################################################### - -# NOTE: Don't add useless checks. autoscan detects this and that, but don't -# let it confuse you. For example, we don't care about checking for behavior -# of malloc(), stat(), or lstat(), since we don't use those functions in -# a way that would cause the problems the autoconf macros check. - -AC_PREREQ([2.69]) - -AC_INIT([XZ Utils], m4_esyscmd([/bin/sh build-aux/version.sh]), - [xz@tukaani.org], [xz], [https://tukaani.org/xz/]) -AC_CONFIG_SRCDIR([src/liblzma/common/common.h]) -AC_CONFIG_AUX_DIR([build-aux]) -AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_HEADERS([config.h]) - -echo -echo "$PACKAGE_STRING" - -echo -echo "System type:" -# This is needed to know if assembler optimizations can be used. -AC_CANONICAL_HOST - -# We do some special things on Windows (32-bit or 64-bit) builds. -case $host_os in - mingw* | cygwin | msys) is_w32=yes ;; - *) is_w32=no ;; -esac -AM_CONDITIONAL([COND_W32], [test "$is_w32" = yes]) - -# We need to use $EXEEXT with $(LN_S) when creating symlinks to -# executables. Cygwin is an exception to this, since it is recommended -# that symlinks don't have the .exe suffix. To make this work, we -# define LN_EXEEXT. -# -# MSYS2 is treated the same way as Cygwin. It uses plain "msys" like -# the original MSYS when building MSYS/MSYS2-binaries. Hopefully this -# doesn't break things for the original MSYS developers. Note that this -# doesn't affect normal MSYS/MSYS2 users building non-MSYS/MSYS2 binaries -# since in that case the $host_os is usually mingw32. -case $host_os in - cygwin | msys) LN_EXEEXT= ;; - *) LN_EXEEXT='$(EXEEXT)' ;; -esac -AC_SUBST([LN_EXEEXT]) - -echo -echo "Configure options:" -AM_CFLAGS= - - -############# -# Debugging # -############# - -AC_MSG_CHECKING([if debugging code should be compiled]) -AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [Enable debugging code.]), - [], enable_debug=no) -if test "x$enable_debug" = xyes; then - AC_MSG_RESULT([yes]) -else - AC_DEFINE([NDEBUG], [1], [Define to 1 to disable debugging code.]) - AC_MSG_RESULT([no]) -fi - - -########### -# Filters # -########### - -m4_define([SUPPORTED_FILTERS], [lzma1,lzma2,delta,x86,powerpc,ia64,arm,armthumb,arm64,sparc,riscv])dnl -m4_define([SIMPLE_FILTERS], [x86,powerpc,ia64,arm,armthumb,arm64,sparc,riscv]) -m4_define([LZ_FILTERS], [lzma1,lzma2]) - -m4_foreach([NAME], [SUPPORTED_FILTERS], -[enable_filter_[]NAME=no -enable_encoder_[]NAME=no -enable_decoder_[]NAME=no -])dnl - -AC_MSG_CHECKING([which encoders to build]) -AC_ARG_ENABLE([encoders], AS_HELP_STRING([--enable-encoders=LIST], - [Comma-separated list of encoders to build. Default=all. - Available encoders:] - m4_translit(m4_defn([SUPPORTED_FILTERS]), [,], [ ])), - [], [enable_encoders=SUPPORTED_FILTERS]) -enable_encoders=`echo "$enable_encoders" | sed 's/,/ /g'` -if test "x$enable_encoders" = xno || test "x$enable_encoders" = x; then - enable_encoders=no - AC_MSG_RESULT([(none)]) -else - for arg in $enable_encoders - do - case $arg in m4_foreach([NAME], [SUPPORTED_FILTERS], [ - NAME) - enable_filter_[]NAME=yes - enable_encoder_[]NAME=yes - AC_DEFINE(HAVE_ENCODER_[]m4_toupper(NAME), [1], - [Define to 1 if] NAME [encoder is enabled.]) - ;;]) - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([unknown filter: $arg]) - ;; - esac - done - AC_DEFINE([HAVE_ENCODERS], [1], - [Define to 1 if any of HAVE_ENCODER_foo have been defined.]) - AC_MSG_RESULT([$enable_encoders]) -fi - -AC_MSG_CHECKING([which decoders to build]) -AC_ARG_ENABLE([decoders], AS_HELP_STRING([--enable-decoders=LIST], - [Comma-separated list of decoders to build. Default=all. - Available decoders are the same as available encoders.]), - [], [enable_decoders=SUPPORTED_FILTERS]) -enable_decoders=`echo "$enable_decoders" | sed 's/,/ /g'` -if test "x$enable_decoders" = xno || test "x$enable_decoders" = x; then - enable_decoders=no - AC_MSG_RESULT([(none)]) -else - for arg in $enable_decoders - do - case $arg in m4_foreach([NAME], [SUPPORTED_FILTERS], [ - NAME) - enable_filter_[]NAME=yes - enable_decoder_[]NAME=yes - AC_DEFINE(HAVE_DECODER_[]m4_toupper(NAME), [1], - [Define to 1 if] NAME [decoder is enabled.]) - ;;]) - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([unknown filter: $arg]) - ;; - esac - done - AC_DEFINE([HAVE_DECODERS], [1], - [Define to 1 if any of HAVE_DECODER_foo have been defined.]) - AC_MSG_RESULT([$enable_decoders]) -fi - -if test "x$enable_encoder_lzma2$enable_encoder_lzma1" = xyesno \ - || test "x$enable_decoder_lzma2$enable_decoder_lzma1" = xyesno; then - AC_MSG_ERROR([LZMA2 requires that LZMA1 is also enabled.]) -fi - -AM_CONDITIONAL(COND_MAIN_ENCODER, test "x$enable_encoders" != xno) -AM_CONDITIONAL(COND_MAIN_DECODER, test "x$enable_decoders" != xno) - -m4_foreach([NAME], [SUPPORTED_FILTERS], -[AM_CONDITIONAL(COND_FILTER_[]m4_toupper(NAME), test "x$enable_filter_[]NAME" = xyes) -AM_CONDITIONAL(COND_ENCODER_[]m4_toupper(NAME), test "x$enable_encoder_[]NAME" = xyes) -AM_CONDITIONAL(COND_DECODER_[]m4_toupper(NAME), test "x$enable_decoder_[]NAME" = xyes) -])dnl - -# The so called "simple filters" share common code. -enable_filter_simple=no -enable_encoder_simple=no -enable_decoder_simple=no -m4_foreach([NAME], [SIMPLE_FILTERS], -[test "x$enable_filter_[]NAME" = xyes && enable_filter_simple=yes -test "x$enable_encoder_[]NAME" = xyes && enable_encoder_simple=yes -test "x$enable_decoder_[]NAME" = xyes && enable_decoder_simple=yes -])dnl -AM_CONDITIONAL(COND_FILTER_SIMPLE, test "x$enable_filter_simple" = xyes) -AM_CONDITIONAL(COND_ENCODER_SIMPLE, test "x$enable_encoder_simple" = xyes) -AM_CONDITIONAL(COND_DECODER_SIMPLE, test "x$enable_decoder_simple" = xyes) - -# LZ-based filters share common code. -enable_filter_lz=no -enable_encoder_lz=no -enable_decoder_lz=no -m4_foreach([NAME], [LZ_FILTERS], -[test "x$enable_filter_[]NAME" = xyes && enable_filter_lz=yes -test "x$enable_encoder_[]NAME" = xyes && enable_encoder_lz=yes -test "x$enable_decoder_[]NAME" = xyes && enable_decoder_lz=yes -])dnl -AM_CONDITIONAL(COND_FILTER_LZ, test "x$enable_filter_lz" = xyes) -AM_CONDITIONAL(COND_ENCODER_LZ, test "x$enable_encoder_lz" = xyes) -AM_CONDITIONAL(COND_DECODER_LZ, test "x$enable_decoder_lz" = xyes) - - -################# -# Match finders # -################# - -m4_define([SUPPORTED_MATCH_FINDERS], [hc3,hc4,bt2,bt3,bt4]) - -m4_foreach([NAME], [SUPPORTED_MATCH_FINDERS], -[enable_match_finder_[]NAME=no -]) - -AC_MSG_CHECKING([which match finders to build]) -AC_ARG_ENABLE([match-finders], AS_HELP_STRING([--enable-match-finders=LIST], - [Comma-separated list of match finders to build. Default=all. - At least one match finder is required for encoding with - the LZMA1 and LZMA2 filters. Available match finders:] - m4_translit(m4_defn([SUPPORTED_MATCH_FINDERS]), [,], [ ])), [], - [enable_match_finders=SUPPORTED_MATCH_FINDERS]) -enable_match_finders=`echo "$enable_match_finders" | sed 's/,/ /g'` -if test "x$enable_encoder_lz" = xyes ; then - if test -z "$enable_match_finders"; then - AC_MSG_ERROR([At least one match finder is required for an LZ-based encoder.]) - fi - - for arg in $enable_match_finders - do - case $arg in m4_foreach([NAME], [SUPPORTED_MATCH_FINDERS], [ - NAME) - enable_match_finder_[]NAME=yes - AC_DEFINE(HAVE_MF_[]m4_toupper(NAME), [1], - [Define to 1 to enable] NAME [match finder.]) - ;;]) - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([unknown match finder: $arg]) - ;; - esac - done - AC_MSG_RESULT([$enable_match_finders]) -else - AC_MSG_RESULT([(none because not building any LZ-based encoder)]) -fi - - -#################### -# Integrity checks # -#################### - -m4_define([SUPPORTED_CHECKS], [crc32,crc64,sha256]) - -m4_foreach([NAME], [SUPPORTED_CHECKS], -[enable_check_[]NAME=no -])dnl - -AC_MSG_CHECKING([which integrity checks to build]) -AC_ARG_ENABLE([checks], AS_HELP_STRING([--enable-checks=LIST], - [Comma-separated list of integrity checks to build. - Default=all. Available integrity checks:] - m4_translit(m4_defn([SUPPORTED_CHECKS]), [,], [ ])), - [], [enable_checks=SUPPORTED_CHECKS]) -enable_checks=`echo "$enable_checks" | sed 's/,/ /g'` -if test "x$enable_checks" = xno || test "x$enable_checks" = x; then - AC_MSG_RESULT([(none)]) -else - for arg in $enable_checks - do - case $arg in m4_foreach([NAME], [SUPPORTED_CHECKS], [ - NAME) - enable_check_[]NAME=yes - AC_DEFINE(HAVE_CHECK_[]m4_toupper(NAME), [1], - [Define to 1 if] NAME - [integrity check is enabled.]) - ;;]) - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([unknown integrity check: $arg]) - ;; - esac - done - AC_MSG_RESULT([$enable_checks]) -fi -if test "x$enable_check_crc32" = xno ; then - AC_MSG_ERROR([For now, the CRC32 check must always be enabled.]) -fi - -m4_foreach([NAME], [SUPPORTED_CHECKS], -[AM_CONDITIONAL(COND_CHECK_[]m4_toupper(NAME), test "x$enable_check_[]NAME" = xyes) -])dnl - -AC_MSG_CHECKING([if external SHA-256 should be used]) -AC_ARG_ENABLE([external-sha256], AS_HELP_STRING([--enable-external-sha256], - [Use SHA-256 code from the operating system. - See INSTALL for possible subtle problems.]), - [], [enable_external_sha256=no]) -if test "x$enable_check_sha256" != "xyes"; then - enable_external_sha256=no -fi -if test "x$enable_external_sha256" = xyes; then - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi - - -############# -# MicroLZMA # -############# - -AC_MSG_CHECKING([if MicroLZMA support should be built]) -AC_ARG_ENABLE([microlzma], AS_HELP_STRING([--disable-microlzma], - [Do not build MicroLZMA encoder and decoder. - It is needed by specific applications only, - for example, erofs-utils.]), - [], [enable_microlzma=yes]) -case $enable_microlzma in - yes | no) - AC_MSG_RESULT([$enable_microlzma]) - ;; - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-microlzma accepts only 'yes' or 'no'.]) - ;; -esac -AM_CONDITIONAL(COND_MICROLZMA, test "x$enable_microlzma" = xyes) - - -############################# -# .lz (lzip) format support # -############################# - -AC_MSG_CHECKING([if .lz (lzip) decompression support should be built]) -AC_ARG_ENABLE([lzip-decoder], AS_HELP_STRING([--disable-lzip-decoder], - [Disable decompression support for .lz (lzip) files.]), - [], [enable_lzip_decoder=yes]) -if test "x$enable_decoder_lzma1" != xyes; then - enable_lzip_decoder=no - AC_MSG_RESULT([no because LZMA1 decoder is disabled]) -elif test "x$enable_lzip_decoder" = xyes; then - AC_DEFINE([HAVE_LZIP_DECODER], [1], - [Define to 1 if .lz (lzip) decompression support is enabled.]) - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi -AM_CONDITIONAL(COND_LZIP_DECODER, test "x$enable_lzip_decoder" = xyes) - - -########################### -# Assembler optimizations # -########################### - -AC_MSG_CHECKING([if assembler optimizations should be used]) -AC_ARG_ENABLE([assembler], AS_HELP_STRING([--disable-assembler], - [Do not use assembler optimizations even if such exist - for the architecture.]), - [], [enable_assembler=yes]) -if test "x$enable_assembler" = xyes; then - enable_assembler=no - case $host_os in - # Darwin should work too but only if not creating universal - # binaries. Solaris x86 could work too but I cannot test. - linux* | *bsd* | mingw* | cygwin | msys | *djgpp*) - case $host_cpu in - i?86) enable_assembler=x86 ;; - esac - ;; - esac -fi -case $enable_assembler in - x86) - AC_DEFINE([HAVE_CRC_X86_ASM], [1], [Define to 1 if - the 32-bit x86 CRC assembly files are used.]) - AC_MSG_RESULT([x86]) - ;; - no) - AC_MSG_RESULT([no]) - ;; - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-assembler accepts only 'yes', 'no', or 'x86' (32-bit).]) - ;; -esac -AM_CONDITIONAL(COND_ASM_X86, test "x$enable_assembler" = xx86) - - -############# -# CLMUL CRC # -############# - -AC_ARG_ENABLE([clmul-crc], AS_HELP_STRING([--disable-clmul-crc], - [Do not use carryless multiplication for CRC calculation - even if support for it is detected.]), - [], [enable_clmul_crc=yes]) - - -############################ -# ARM64 CRC32 Instructions # -############################ - -AC_ARG_ENABLE([arm64-crc32], AS_HELP_STRING([--disable-arm64-crc32], - [Do not use ARM64 CRC32 instructions even if support for it - is detected.]), - [], [enable_arm64_crc32=yes]) - - -################################ -# LoongArch CRC32 instructions # -################################ - -AC_ARG_ENABLE([loongarch-crc32], AS_HELP_STRING([--disable-loongarch-crc32], - [Do not use LoongArch CRC32 instructions even if support for - them is detected.]), - [], [enable_loongarch_crc32=yes]) - - -##################### -# Size optimization # -##################### - -AC_MSG_CHECKING([if small size is preferred over speed]) -AC_ARG_ENABLE([small], AS_HELP_STRING([--enable-small], - [Make liblzma smaller and a little slower. - This is disabled by default to optimize for speed.]), - [], [enable_small=no]) -if test "x$enable_small" = xyes; then - AC_DEFINE([HAVE_SMALL], [1], [Define to 1 if optimizing for size.]) -elif test "x$enable_small" != xno; then - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-small accepts only 'yes' or 'no']) -fi -AC_MSG_RESULT([$enable_small]) -AM_CONDITIONAL(COND_SMALL, test "x$enable_small" = xyes) - - -############# -# Threading # -############# - -AC_MSG_CHECKING([if threading support is wanted]) -AC_ARG_ENABLE([threads], AS_HELP_STRING([--enable-threads=METHOD], - [Supported METHODS are 'yes', 'no', 'posix', 'win95', and - 'vista'. The default is 'yes'. Using 'no' together with - --enable-small makes liblzma thread unsafe.]), - [], [enable_threads=yes]) - -if test "x$enable_threads" = xyes; then - case $host_os in - mingw*) - case $host_cpu in - i?86) enable_threads=win95 ;; - *) enable_threads=vista ;; - esac - ;; - *) - enable_threads=posix - ;; - esac -fi - -case $enable_threads in - posix | win95 | vista) - AC_MSG_RESULT([yes, $enable_threads]) - ;; - no) - AC_MSG_RESULT([no]) - ;; - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-threads only accepts 'yes', 'no', 'posix', 'win95', or 'vista']) - ;; -esac - -# We use the actual result a little later. - - -######################### -# Assumed amount of RAM # -######################### - -# We use 128 MiB as default, because it will allow decompressing files -# created with "xz -9". It would be slightly safer to guess a lower value, -# but most systems, on which we don't have any way to determine the amount -# of RAM, will probably have at least 128 MiB of RAM. -AC_MSG_CHECKING([how much RAM to assume if the real amount is unknown]) -AC_ARG_ENABLE([assume-ram], AS_HELP_STRING([--enable-assume-ram=SIZE], - [If and only if the real amount of RAM cannot be determined, - assume SIZE MiB. The default is 128 MiB. This affects the - default memory usage limit.]), - [], [enable_assume_ram=128]) -assume_ram_check=`echo "$enable_assume_ram" | tr -d 0123456789` -if test -z "$enable_assume_ram" || test -n "$assume_ram_check"; then - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-assume-ram accepts only an integer argument]) -fi -AC_MSG_RESULT([$enable_assume_ram MiB]) -AC_DEFINE_UNQUOTED([ASSUME_RAM], [$enable_assume_ram], - [How many MiB of RAM to assume if the real amount cannot - be determined.]) - - -######################### -# Components to install # -######################### - -AC_ARG_ENABLE([xz], [AS_HELP_STRING([--disable-xz], - [do not build the xz tool])], - [], [enable_xz=yes]) -AM_CONDITIONAL([COND_XZ], [test x$enable_xz != xno]) - -AC_ARG_ENABLE([xzdec], [AS_HELP_STRING([--disable-xzdec], - [do not build xzdec])], - [], [enable_xzdec=yes]) -test "x$enable_decoders" = xno && enable_xzdec=no -AM_CONDITIONAL([COND_XZDEC], [test x$enable_xzdec != xno]) - -AC_ARG_ENABLE([lzmadec], [AS_HELP_STRING([--disable-lzmadec], - [do not build lzmadec - (it exists primarily for LZMA Utils compatibility)])], - [], [enable_lzmadec=yes]) -test "x$enable_decoder_lzma1" = xno && enable_lzmadec=no -AM_CONDITIONAL([COND_LZMADEC], [test x$enable_lzmadec != xno]) - -AC_ARG_ENABLE([lzmainfo], [AS_HELP_STRING([--disable-lzmainfo], - [do not build lzmainfo - (it exists primarily for LZMA Utils compatibility)])], - [], [enable_lzmainfo=yes]) -test "x$enable_decoder_lzma1" = xno && enable_lzmainfo=no -AM_CONDITIONAL([COND_LZMAINFO], [test x$enable_lzmainfo != xno]) - -AC_ARG_ENABLE([lzma-links], [AS_HELP_STRING([--disable-lzma-links], - [do not create symlinks for LZMA Utils compatibility])], - [], [enable_lzma_links=yes]) -AM_CONDITIONAL([COND_LZMALINKS], [test x$enable_lzma_links != xno]) - -AC_ARG_ENABLE([scripts], [AS_HELP_STRING([--disable-scripts], - [do not install the scripts xzdiff, xzgrep, xzless, xzmore, - and their symlinks])], - [], [enable_scripts=yes]) -AM_CONDITIONAL([COND_SCRIPTS], [test x$enable_scripts != xno]) - -AC_ARG_ENABLE([doc], [AS_HELP_STRING([--disable-doc], - [do not install documentation files to docdir - (man pages are still installed and, - if --enable-doxygen is used, - liblzma API documentation is installed too)])], - [], [enable_doc=yes]) -AM_CONDITIONAL([COND_DOC], [test x$enable_doc != xno]) - -AC_ARG_ENABLE([doxygen], [AS_HELP_STRING([--enable-doxygen], - [generate HTML version of the liblzma API documentation - using Doxygen and install the result to docdir])], - [], [enable_doxygen=no]) -AM_CONDITIONAL([COND_DOXYGEN], [test x$enable_doxygen != xno]) - - -############## -# Sandboxing # -############## - -AC_MSG_CHECKING([if sandboxing should be used]) -AC_ARG_ENABLE([sandbox], [AS_HELP_STRING([--enable-sandbox=METHOD], - [Sandboxing METHOD can be - 'auto', 'no', 'capsicum', 'pledge', or 'landlock'. - The default is 'auto' which enables sandboxing if - a supported sandboxing method is found.])], - [], [enable_sandbox=auto]) -case $enable_xzdec-$enable_xz-$enable_sandbox in - no-no-*) - enable_sandbox=no - AC_MSG_RESULT([no, --disable-xz and --disable-xzdec was used]) - ;; - *-*-auto) - AC_MSG_RESULT([maybe (autodetect)]) - ;; - *-*-no | *-*-capsicum | *-*-pledge | *-*-landlock) - AC_MSG_RESULT([$enable_sandbox]) - ;; - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([--enable-sandbox only accepts 'auto', 'no', 'capsicum', 'pledge', or 'landlock'.]) - ;; -esac - - -########################### -# PATH prefix for scripts # -########################### - -# The scripts can add a prefix to the search PATH so that POSIX tools -# or the xz binary is always in the PATH. -AC_ARG_ENABLE([path-for-scripts], - [AS_HELP_STRING([--enable-path-for-scripts=PREFIX], - [If PREFIX isn't empty, PATH=PREFIX:$PATH will be set in - the beginning of the scripts (xzgrep and others). - The default is empty except on Solaris the default is - /usr/xpg4/bin.])], - [], [ - case $host_os in - solaris*) enable_path_for_scripts=/usr/xpg4/bin ;; - *) enable_path_for_scripts= ;; - esac - ]) -if test -n "$enable_path_for_scripts" && test "x$enable_path_for_scripts" != xno ; then - enable_path_for_scripts="PATH=$enable_path_for_scripts:\$PATH" -else - enable_path_for_scripts= -fi -AC_SUBST([enable_path_for_scripts]) - - -############################################################################### -# Checks for programs. -############################################################################### - -echo -case $host_os in - solaris*) - # The gnulib POSIX shell macro below may pick a shell that - # doesn't work with xzgrep. Workaround by picking a shell - # that is known to work. - if test -z "$gl_cv_posix_shell" && test -x /usr/xpg4/bin/sh; then - gl_cv_posix_shell=/usr/xpg4/bin/sh - fi - ;; -esac -gl_POSIX_SHELL -if test -z "$POSIX_SHELL" && test "x$enable_scripts" = xyes ; then - AC_MSG_ERROR([No POSIX conforming shell (sh) was found.]) -fi - -echo -echo "Initializing Automake:" - -# We don't use "subdir-objects" yet because it breaks "make distclean" when -# dependencies are enabled (as of Automake 1.14.1) due to this bug: -# https://debbugs.gnu.org/cgi/bugreport.cgi?bug=17354 -# The -Wno-unsupported is used to silence warnings about missing -# "subdir-objects". -AM_INIT_AUTOMAKE([1.12 foreign tar-v7 filename-length-max=99 -Wno-unsupported]) -AC_PROG_LN_S - -dnl # Autoconf >= 2.70 warns that AC_PROG_CC_C99 is obsolete. However, -dnl # we have to keep using AC_PROG_CC_C99 instead of AC_PROG_CC -dnl # as long as we try to be compatible with Autoconf 2.69. -AC_PROG_CC_C99 -if test x$ac_cv_prog_cc_c99 = xno ; then - AC_MSG_ERROR([No C99 compiler was found.]) -fi - -AM_PROG_CC_C_O -AM_PROG_AS -AC_USE_SYSTEM_EXTENSIONS - -# If using GCC or compatible compiler, verify that CFLAGS doesn't contain -# something that makes -Werror unhappy. It's important to check this after -# the above check for system extensions. It adds macros that can trigger, -# for example, -Wunused-macros. -if test "$GCC" = yes && test "x$SKIP_WERROR_CHECK" != xyes ; then - AC_MSG_CHECKING([if the -Werror option is usable]) - OLD_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -Werror" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[extern int foo; int foo;]])], [ - AC_MSG_RESULT([yes]) - ], [ - AC_MSG_RESULT([no]) - AC_MSG_ERROR([ - CFLAGS contains something that makes -Werror complain (see config.log). - This would break certain checks in 'configure'. It is strongly - recommended to modify CFLAGS to fix this. If you want to use noisy - warning options, for example, -Weverything, it is still possible to - add them later when running 'make': make CFLAGS+=-Weverything - - In case you really want to continue with the current CFLAGS, pass - 'SKIP_WERROR_CHECK=yes' as an argument to 'configure'. - ]) - ]) - CFLAGS=$OLD_CFLAGS -fi - -AS_CASE([$enable_threads], - [posix], [ - echo - echo "POSIX threading support:" - AX_PTHREAD([:]) dnl We don't need the HAVE_PTHREAD macro. - LIBS="$PTHREAD_LIBS $LIBS" - AM_CFLAGS="$AM_CFLAGS $PTHREAD_CFLAGS" - - dnl NOTE: PTHREAD_CC is ignored. It would be useful on AIX, - dnl but it's tricky to get it right together with - dnl AC_PROG_CC_C99. Thus, this is handled by telling the - dnl user in INSTALL to set the correct CC manually. - - AC_DEFINE([MYTHREAD_POSIX], [1], - [Define to 1 when using POSIX threads (pthreads).]) - - # This is nice to have but not mandatory. - OLD_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - AC_CHECK_FUNCS([pthread_condattr_setclock]) - CFLAGS=$OLD_CFLAGS - ], - [win95], [ - AC_DEFINE([MYTHREAD_WIN95], [1], [Define to 1 when using - Windows 95 (and thus XP) compatible threads. - This avoids use of features that were added in - Windows Vista.]) - ], - [vista], [ - AC_DEFINE([MYTHREAD_VISTA], [1], [Define to 1 when using - Windows Vista compatible threads. This uses - features that are not available on Windows XP.]) - ] -) -AM_CONDITIONAL([COND_THREADS], [test "x$enable_threads" != xno]) - -echo -echo "Initializing Libtool:" -LT_PREREQ([2.4]) -LT_INIT([win32-dll]) -LT_LANG([Windows Resource]) - -# This is a bit wrong since it is possible to request that only some libs -# are built as shared. Using that feature isn't so common though, and this -# breaks only on Windows (at least for now) if the user enables only some -# libs as shared. -AM_CONDITIONAL([COND_SHARED], [test "x$enable_shared" != xno]) - -##################### -# Symbol versioning # -##################### - -# NOTE: This checks if we are building shared or static library -# and if --with-pic or --without-pic was used. Thus this check -# must be after Libtool initialization. -AC_MSG_CHECKING([if library symbol versioning should be used]) -AC_ARG_ENABLE([symbol-versions], [AS_HELP_STRING([--enable-symbol-versions], - [Use symbol versioning for liblzma. Enabled by default on - GNU/Linux, other GNU-based systems, and FreeBSD.])], - [], [enable_symbol_versions=auto]) -if test "x$enable_symbol_versions" = xauto; then - case $host_os in - # NOTE: Even if one omits -gnu on GNU/Linux (e.g. - # i486-slackware-linux), configure will (via config.sub) - # append -gnu (e.g. i486-slackware-linux-gnu), and this - # test will work correctly. - gnu* | *-gnu* | freebsd*) - enable_symbol_versions=yes - ;; - *) - enable_symbol_versions=no - ;; - esac -fi - -# There are two variants for symbol versioning. -# See src/liblzma/validate_map.sh for details. -# -# On GNU/Linux, extra symbols are added in the C code. These extra symbols -# must not be put into a static library as they can cause problems (and -# even if they didn't cause problems, they would be useless). On other -# systems symbol versioning may be used too but there is no problem as only -# a linker script is specified in src/liblzma/Makefile.am and that isn't -# used when creating a static library. -# -# Libtool always uses -DPIC when building shared libraries by default and -# doesn't use it for static libs by default. This can be overridden with -# --with-pic and --without-pic though. As long as neither --with-pic nor -# --without-pic is used then we can use #ifdef PIC to detect if the file is -# being built for a shared library. -AS_IF([test "x$enable_symbol_versions" = xno], [ - enable_symbol_versions=no - AC_MSG_RESULT([no]) -], [test "x$enable_shared" = xno], [ - enable_symbol_versions=no - AC_MSG_RESULT([no (not building a shared library)]) -], [ - # "yes" means that symbol version are to be used but we need to - # autodetect which variant to use. - if test "x$enable_symbol_versions" = xyes ; then - case "$host_cpu-$host_os" in - microblaze*) - # GCC 12 on MicroBlaze doesn't support - # __symver__ attribute. It's simplest and - # safest to use the generic version on that - # platform since then only the linker script - # is needed. The RHEL/CentOS 7 compatibility - # symbols don't matter on MicroBlaze. - enable_symbol_versions=generic - ;; - *-linux*) - # NVIDIA HPC Compiler doesn't support symbol - # versioning but the linker script can still - # be used. - AC_EGREP_CPP([use_generic_symbol_versioning], - [#ifdef __NVCOMPILER - use_generic_symbol_versioning - #endif], - [enable_symbol_versions=generic], - [enable_symbol_versions=linux]) - ;; - *) - enable_symbol_versions=generic - ;; - esac - fi - - if test "x$enable_symbol_versions" = xlinux ; then - case "$pic_mode-$enable_static" in - default-*) - # Use symvers if PIC is defined. - have_symbol_versions_linux=2 - ;; - *-no) - # Not building static library. - # Use symvers unconditionally. - have_symbol_versions_linux=1 - ;; - *) - AC_MSG_RESULT([]) - AC_MSG_ERROR([ - On GNU/Linux, building both shared and static library at the same time - is not supported if --with-pic or --without-pic is used. - Use either --disable-shared or --disable-static to build one type - of library at a time. If both types are needed, build one at a time, - possibly picking only src/liblzma/.libs/liblzma.a from the static build.]) - ;; - esac - AC_DEFINE_UNQUOTED([HAVE_SYMBOL_VERSIONS_LINUX], - [$have_symbol_versions_linux], - [Define to 1 to if GNU/Linux-specific details - are unconditionally wanted for symbol - versioning. Define to 2 to if these are wanted - only if also PIC is defined (allows building - both shared and static liblzma at the same - time with Libtool if neither --with-pic nor - --without-pic is used). This define must be - used together with liblzma_linux.map.]) - elif test "x$enable_symbol_versions" != xgeneric ; then - AC_MSG_RESULT([]) - AC_MSG_ERROR([unknown symbol versioning variant '$enable_symbol_versions']) - fi - AC_MSG_RESULT([yes ($enable_symbol_versions)]) -]) - -AM_CONDITIONAL([COND_SYMVERS_LINUX], - [test "x$enable_symbol_versions" = xlinux]) -AM_CONDITIONAL([COND_SYMVERS_GENERIC], - [test "x$enable_symbol_versions" = xgeneric]) - - -############################################################################### -# Checks for libraries. -############################################################################### - -dnl Support for _REQUIRE_VERSION was added in gettext 0.19.6. If both -dnl _REQUIRE_VERSION and _VERSION are present, the _VERSION is ignored. -dnl We use both for compatibility with other programs in the Autotools family. -echo -echo "Initializing gettext:" -AM_GNU_GETTEXT_REQUIRE_VERSION([0.19.6]) -AM_GNU_GETTEXT_VERSION([0.19.6]) -AM_GNU_GETTEXT([external]) - -# The command line tools use UTF-8 on native Windows. Non-ASCII characters -# display correctly only when using UCRT and gettext-runtime >= 0.23.1. -AS_CASE([$USE_NLS-$host_os], - [yes-mingw*], [ - AC_MSG_CHECKING([for UCRT and gettext-runtime >= 0.23.1]) - AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ - #define WIN32_LEAN_AND_MEAN - #include - #include - - #ifndef _UCRT - #error "Not UCRT" - #endif - - #if LIBINTL_VERSION < 0x001701 - #error "gettext-runtime < 0.23.1" - #endif - ]])], [ - AC_MSG_RESULT([yes]) - ], [ - AC_MSG_RESULT([no]) - AC_MSG_ERROR([ - Translation support (--enable-nls) on native Windows requires - UCRT and gettext-runtime >= 0.23.1. Use --disable-nls to build - with MSVCRT or old gettext-runtime.]) - ]) - ] -) - - -############################################################################### -# Checks for header files. -############################################################################### - -echo -echo "System headers and functions:" - -# immintrin.h allows the use of the intrinsic functions if they are available. -# cpuid.h may be used for detecting x86 processor features at runtime. -AC_CHECK_HEADERS([immintrin.h cpuid.h]) - - -############################################################################### -# Checks for typedefs, structures, and compiler characteristics. -############################################################################### - -AC_HEADER_STDBOOL - -AC_TYPE_UINT8_T -AC_TYPE_UINT16_T -AC_TYPE_INT32_T -AC_TYPE_UINT32_T -AC_TYPE_INT64_T -AC_TYPE_UINT64_T -AC_TYPE_UINTPTR_T - -AC_CHECK_SIZEOF([size_t]) - -# The command line tool can copy high resolution timestamps if such -# information is available in struct stat. Otherwise one second accuracy -# is used. -AC_CHECK_MEMBERS([ - struct stat.st_atim.tv_nsec, - struct stat.st_atimespec.tv_nsec, - struct stat.st_atimensec, - struct stat.st_uatime, - struct stat.st_atim.st__tim.tv_nsec]) - -AC_SYS_LARGEFILE -AC_C_BIGENDIAN - -# __attribute__((__constructor__)) can be used for one-time initializations. -# Use -Werror because some compilers accept unknown attributes and just -# give a warning. -AC_MSG_CHECKING([if __attribute__((__constructor__)) can be used]) -have_func_attribute_constructor=no -OLD_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -Werror" -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ - __attribute__((__constructor__)) - static void my_constructor_func(void) { return; } -]])], [ - AC_DEFINE([HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR], [1], - [Define to 1 if __attribute__((__constructor__)) - is supported for functions.]) - have_func_attribute_constructor=yes - AC_MSG_RESULT([yes]) -], [ - AC_MSG_RESULT([no]) -]) -CFLAGS="$OLD_CFLAGS" - -# The Win95 threading lacks a thread-safe one-time initialization function. -# The one-time initialization is needed for crc32_small.c and crc64_small.c -# create the CRC tables. So if small mode is enabled, the threading mode is -# win95, and the compiler does not support attribute constructor, then we -# would end up with a multithreaded build that is thread-unsafe. As a -# result this configuration is not allowed. -if test "x$enable_small$enable_threads$have_func_attribute_constructor" \ - = xyeswin95no; then - AC_MSG_ERROR([ - --enable-threads=win95 and --enable-small cannot be used - at the same time with a compiler that doesn't support - __attribute__((__constructor__))]) -fi - - -############################################################################### -# Checks for library functions. -############################################################################### - -# Gnulib replacements as needed -gl_GETOPT - -# If clock_gettime() is available, liblzma with pthreads may use it, and -# xz may use it even when threading support is disabled. In XZ Utils 5.4.x -# and older, configure checked for clock_gettime() only when using pthreads. -# This way non-threaded builds of liblzma didn't get a useless dependency on -# librt which further had a dependency on libpthread. Avoiding these was -# useful when a small build was needed, for example, for initramfs use. -# -# The above reasoning is thoroughly obsolete: On GNU/Linux, librt hasn't -# been needed for clock_gettime() since glibc 2.17 (2012-12-25). -# Solaris 10 needs librt but Solaris 11 doesn't anymore. -AC_SEARCH_LIBS([clock_gettime], [rt]) -AC_CHECK_FUNCS([clock_gettime]) -AC_CHECK_DECL([CLOCK_MONOTONIC], [AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], - [Define to 1 if 'CLOCK_MONOTONIC' is declared in .])], [], - [[#include ]]) - -# Find the best function to set timestamps. -AC_CHECK_FUNCS([futimens futimes futimesat utimes _futime utime], [break]) - -# This is nice to have but not mandatory. -AC_CHECK_FUNCS([posix_fadvise]) - -TUKLIB_PROGNAME -TUKLIB_INTEGER -TUKLIB_PHYSMEM -TUKLIB_CPUCORES -TUKLIB_MBSTR - -# If requested, check for system-provided SHA-256. At least the following -# implementations are supported: -# -# OS Headers Library Type Function -# FreeBSD sys/types.h + sha256.h libmd SHA256_CTX SHA256_Init -# NetBSD sys/types.h + sha2.h SHA256_CTX SHA256_Init -# OpenBSD sys/types.h + sha2.h SHA2_CTX SHA256Init -# Solaris sys/types.h + sha2.h libmd SHA256_CTX SHA256Init -# MINIX 3 sys/types.h + sha2.h SHA256_CTX SHA256_Init -# Darwin CommonCrypto/CommonDigest.h CC_SHA256_CTX CC_SHA256_Init -# -# Note that Darwin's CC_SHA256_Update takes buffer size as uint32_t instead -# of size_t. -# -sha256_header_found=no -sha256_type_found=no -sha256_func_found=no -AS_IF([test "x$enable_external_sha256" = "xyes"], [ - # Test for Common Crypto before others, because Darwin has sha256.h - # too and we don't want to use that, because on older versions it - # uses OpenSSL functions, whose SHA256_Init is not guaranteed to - # succeed. - AC_CHECK_HEADERS( - [CommonCrypto/CommonDigest.h sha256.h sha2.h], - [sha256_header_found=yes ; break]) - if test "x$sha256_header_found" = xyes; then - AC_CHECK_TYPES([CC_SHA256_CTX, SHA256_CTX, SHA2_CTX], - [sha256_type_found=yes], [], - [[#ifdef HAVE_SYS_TYPES_H - # include - #endif - #ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H - # include - #endif - #ifdef HAVE_SHA256_H - # include - #endif - #ifdef HAVE_SHA2_H - # include - #endif]]) - if test "x$sha256_type_found" = xyes ; then - AC_SEARCH_LIBS([SHA256Init], [md]) - AC_SEARCH_LIBS([SHA256_Init], [md]) - AC_CHECK_FUNCS([CC_SHA256_Init SHA256Init SHA256_Init], - [sha256_func_found=yes ; break]) - fi - fi -]) -AM_CONDITIONAL([COND_INTERNAL_SHA256], [test "x$sha256_func_found" = xno]) -if test "x$enable_external_sha256$sha256_func_found" = xyesno; then - AC_MSG_ERROR([--enable-external-sha256 was specified but no supported external SHA-256 implementation was found]) -fi - -# Check for SSE2 intrinsics. There is no run-time detection for SSE2 so if -# compiler options enable SSE2 then SSE2 support is required by the binaries. -# The compile-time check for SSE2 is done with #ifdefs because some compilers -# (ICC, MSVC) allow SSE2 intrinsics even when SSE2 isn't enabled. -AC_CHECK_DECL([_mm_movemask_epi8], - [AC_DEFINE([HAVE__MM_MOVEMASK_EPI8], [1], - [Define to 1 if _mm_movemask_epi8 is available.])], - [], -[#ifdef HAVE_IMMINTRIN_H -#include -#endif]) - -# For faster CRC on 32/64-bit x86 and E2K (see also crc64_fast.c): -# -# - Check for the CLMUL intrinsic _mm_clmulepi64_si128 in . -# Check also for _mm_set_epi64x for consistency with CMake build -# where it's needed to disable CLMUL with VS2013. -# -# - Check that __attribute__((__target__("ssse3,sse4.1,pclmul"))) works -# together with _mm_clmulepi64_si128 from . The attribute -# was added in GCC 4.4 but some GCC 4.x versions don't allow intrinsics -# with it. Exception: it must be not be used with EDG-based compilers -# like ICC and the compiler on E2K. -# -# If everything above is supported, runtime detection will be used to keep the -# binaries working on systems that don't support the required extensions. -# -# NOTE: Use a check that links and not merely compiles to ensure that -# missing intrinsics don't get accepted with compilers that allow -# implicit function declarations. -AC_MSG_CHECKING([if _mm_clmulepi64_si128 is usable]) -AS_IF([test "x$enable_clmul_crc" = xno], [ - AC_MSG_RESULT([no, --disable-clmul-crc was used]) -], [ - AC_LINK_IFELSE([AC_LANG_SOURCE([[ -#include - -// CLMUL works on older E2K instruction set but it is slow due to emulation. -#if defined(__e2k__) && __iset__ < 6 -# error -#endif - -// Intel's old compiler (ICC) can define __GNUC__ but the attribute must not -// be used with it. The new Clang-based ICX needs the attribute. -// Checking for !defined(__EDG__) catches ICC and other EDG-based compilers. -#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) -__attribute__((__target__("ssse3,sse4.1,pclmul"))) -#endif -int main(void) -{ - __m128i a = _mm_set_epi64x(1, 2); - a = _mm_clmulepi64_si128(a, a, 0); - return 0; -} - ]])], [ - AC_DEFINE([HAVE_USABLE_CLMUL], [1], - [Define to 1 if _mm_set_epi64x and - _mm_clmulepi64_si128 are usable. - See configure.ac for details.]) - enable_clmul_crc=yes - ], [ - enable_clmul_crc=no - ]) - AC_MSG_RESULT([$enable_clmul_crc]) -]) - -# ARM64 C Language Extensions define CRC32 functions in arm_acle.h. -# These are supported by at least GCC and Clang which both need -# __attribute__((__target__("+crc"))), unless the needed compiler flags -# are used to support the CRC instruction. -AC_MSG_CHECKING([if ARM64 CRC32 instruction is usable]) -AS_IF([test "x$enable_arm64_crc32" = xno], [ - AC_MSG_RESULT([no, --disable-arm64-crc32 was used]) -], [ - AC_LINK_IFELSE([AC_LANG_SOURCE([[ -#include -#include - -#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) -__attribute__((__target__("+crc"))) -#endif -int main(void) -{ - return __crc32d(1, 2) != 0; -} - ]])], [ - AC_DEFINE([HAVE_ARM64_CRC32], [1], - [Define to 1 if ARM64 CRC32 instruction is supported. - See configure.ac for details.]) - enable_arm64_crc32=yes - ], [ - enable_arm64_crc32=no - ]) - AC_MSG_RESULT([$enable_arm64_crc32]) -]) - -# Check for ARM64 CRC32 instruction runtime detection. -# -# - getauxval() is supported on Linux. -# -# - elf_aux_info() is supported on FreeBSD and OpenBSD >= 7.6. -# -# - sysctlbyname("hw.optional.armv8_crc32", ...) is supported on Darwin -# (macOS, iOS, etc.). Note that sysctlbyname() is supported on FreeBSD, -# NetBSD, and possibly others too but the string is specific to Apple -# OSes. The C code is responsible for checking defined(__APPLE__) -# before using sysctlbyname("hw.optional.armv8_crc32", ...). -# -AS_IF([test "x$enable_arm64_crc32" = xyes], [ - AC_CHECK_FUNCS([getauxval elf_aux_info sysctlbyname], [break]) -]) - - -# LoongArch CRC32 intrinsics are in larchintrin.h. -# These are supported by at least GCC and Clang. -# -# Only 64-bit LoongArch is currently supported. -# It doesn't need runtime detection. -AC_MSG_CHECKING([if LoongArch CRC32 instructions are usable]) -AS_IF([test "x$enable_loongarch_crc32" = xno], [ - AC_MSG_RESULT([no, --disable-loongarch-crc32 was used]) -], [ - AC_LINK_IFELSE([AC_LANG_SOURCE([[ -#if !(defined(__loongarch__) && __loongarch_grlen >= 64) -# error -#endif - -#include -int main(void) -{ - return __crc_w_w_w(1, 2); -} - ]])], [ - AC_DEFINE([HAVE_LOONGARCH_CRC32], [1], [Define to 1 if - 64-bit LoongArch CRC32 instructions are supported.]) - enable_loongarch_crc32=yes - ], [ - enable_loongarch_crc32=no - ]) - AC_MSG_RESULT([$enable_loongarch_crc32]) -]) - - -# Check for sandbox support. If one is found, set enable_sandbox=found. -# -# About -fsanitize: Of our three sandbox methods, only Landlock is -# incompatible with -fsanitize. FreeBSD 13.2 with Capsicum was tested with -# -fsanitize=address,undefined and had no issues. OpenBSD (as of version -# 7.4) has minimal support for process instrumentation. OpenBSD does not -# distribute the additional libraries needed (libasan, libubsan, etc.) with -# GCC or Clang needed for runtime sanitization support and instead only -# support -fsanitize-minimal-runtime for minimal undefined behavior -# sanitization. This minimal support is compatible with our use of the -# Pledge sandbox. So only Landlock will result in a build that cannot -# compress or decompress a single file to standard out. -AS_CASE([$enable_sandbox], - [auto | capsicum], [ - AC_CHECK_FUNCS([cap_rights_limit], [enable_sandbox=found]) - ] -) -AS_CASE([$enable_sandbox], - [auto | pledge], [ - AC_CHECK_FUNCS([pledge], [enable_sandbox=found]) - ] -) -AS_CASE([$enable_sandbox], - [auto | landlock], [ - AC_MSG_CHECKING([if Linux Landlock is usable]) - - # A compile check is done here because some systems have - # linux/landlock.h, but do not have the syscalls defined - # in order to actually use Linux Landlock. - AC_LINK_IFELSE([AC_LANG_SOURCE([[ - #include - #include - #include - - int main(void) - { - (void)prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); - (void)SYS_landlock_create_ruleset; - (void)SYS_landlock_restrict_self; - (void)LANDLOCK_CREATE_RULESET_VERSION; - return 0; - } - ]])], [ - enable_sandbox=found - - AS_CASE(["$CC $CFLAGS"], [*-fsanitize=*], - [AC_MSG_ERROR([ - CC or CFLAGS contain '-fsanitize=' which is incompatible with the Landlock - sandboxing. Use --disable-sandbox when using '-fsanitize'.])]) - - AC_DEFINE([HAVE_LINUX_LANDLOCK], [1], - [Define to 1 if Linux Landlock is supported. - See configure.ac for details.]) - AC_MSG_RESULT([yes]) - ], [ - AC_MSG_RESULT([no]) - ]) - ] -) - -# If a specific sandboxing method was explicitly requested and it wasn't -# found, give an error. -case $enable_sandbox in - auto | no | found) - ;; - *) - AC_MSG_ERROR([$enable_sandbox support not found]) - ;; -esac - - -############################################################################### -# If using GCC, set some additional AM_CFLAGS: -############################################################################### - -if test "$GCC" = yes ; then - echo - echo "GCC extensions:" -fi - -# Always do the visibility check but don't set AM_CFLAGS on Windows. -# This way things get set properly even on Windows. -gl_VISIBILITY -if test -n "$CFLAG_VISIBILITY" && test "$is_w32" = no; then - AM_CFLAGS="$AM_CFLAGS $CFLAG_VISIBILITY" -fi - -AS_IF([test "$GCC" = yes], [ - # Enable as much warnings as possible. These commented warnings won't - # work for this package though: - # * -Wunreachable-code breaks several assert(0) cases, which are - # backed up with "return LZMA_PROG_ERROR". - # * -Wcast-qual would break various things where we need a non-const - # pointer although we don't modify anything through it. - # * -Winline, -Wdisabled-optimization, -Wunsafe-loop-optimizations - # don't seem so useful here; at least the last one gives some - # warnings which are not bugs. - # * -Wconversion still shows too many warnings. - # - # The flags before the empty line are for GCC and many of them - # are supported by Clang too. The flags after the empty line are - # for Clang. - for NEW_FLAG in \ - -Wall \ - -Wextra \ - -Wvla \ - -Wformat=2 \ - -Winit-self \ - -Wmissing-include-dirs \ - -Wshift-overflow=2 \ - -Wstrict-overflow=3 \ - -Walloc-zero \ - -Wduplicated-cond \ - -Wfloat-equal \ - -Wundef \ - -Wshadow \ - -Wpointer-arith \ - -Wbad-function-cast \ - -Wwrite-strings \ - -Wdate-time \ - -Wsign-conversion \ - -Wfloat-conversion \ - -Wlogical-op \ - -Waggregate-return \ - -Wstrict-prototypes \ - -Wold-style-definition \ - -Wmissing-prototypes \ - -Wmissing-declarations \ - -Wredundant-decls \ - -Wimplicit-fallthrough \ - -Wimplicit-fallthrough=5 \ - \ - -Wc99-compat \ - -Wc11-extensions \ - -Wc2x-compat \ - -Wc2x-extensions \ - -Wpre-c2x-compat \ - -Warray-bounds-pointer-arithmetic \ - -Wassign-enum \ - -Wconditional-uninitialized \ - -Wdocumentation \ - -Wduplicate-enum \ - -Wempty-translation-unit \ - -Wflexible-array-extensions \ - -Wmissing-variable-declarations \ - -Wnewline-eof \ - -Wshift-sign-overflow \ - -Wstring-conversion - do - AC_MSG_CHECKING([if $CC accepts $NEW_FLAG]) - OLD_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $NEW_FLAG -Werror" - AC_COMPILE_IFELSE([AC_LANG_SOURCE( - [[void foo(void); void foo(void) { }]])], [ - AM_CFLAGS="$AM_CFLAGS $NEW_FLAG" - AC_MSG_RESULT([yes]) - ], [ - AC_MSG_RESULT([no]) - ]) - CFLAGS="$OLD_CFLAGS" - done - - AC_ARG_ENABLE([werror], - AS_HELP_STRING([--enable-werror], [Enable -Werror to abort - compilation on all compiler warnings.]), - [], [enable_werror=no]) - if test "x$enable_werror" = "xyes"; then - AM_CFLAGS="$AM_CFLAGS -Werror" - fi -]) - - -############################################################################### -# Create the makefiles and config.h -############################################################################### - -echo - -# Don't build the lib directory at all if we don't need any replacement -# functions. -AM_CONDITIONAL([COND_GNULIB], test -n "$LIBOBJS") - -# Add default AM_CFLAGS. -AC_SUBST([AM_CFLAGS]) - -# This is needed for src/scripts. -xz=`echo xz | sed "$program_transform_name"` -AC_SUBST([xz]) - -AC_CONFIG_FILES([ - Makefile - po/Makefile.in - lib/Makefile - src/Makefile - src/liblzma/Makefile - src/liblzma/api/Makefile - src/xz/Makefile - src/xzdec/Makefile - src/lzmainfo/Makefile - src/scripts/Makefile - tests/Makefile - debug/Makefile -]) -AC_CONFIG_FILES([src/scripts/xzdiff], [chmod +x src/scripts/xzdiff]) -AC_CONFIG_FILES([src/scripts/xzgrep], [chmod +x src/scripts/xzgrep]) -AC_CONFIG_FILES([src/scripts/xzmore], [chmod +x src/scripts/xzmore]) -AC_CONFIG_FILES([src/scripts/xzless], [chmod +x src/scripts/xzless]) - -AC_OUTPUT - -# Some warnings -if test x$tuklib_cv_physmem_method = xunknown; then - echo - echo "WARNING:" - echo "No supported method to detect the amount of RAM." - echo "Consider using --enable-assume-ram (if you didn't already)" - echo "or make a patch to add support for this operating system." -fi - -if test x$tuklib_cv_cpucores_method = xunknown; then - echo - echo "WARNING:" - echo "No supported method to detect the number of CPU cores." -fi - -if test "x$enable_threads$enable_small$have_func_attribute_constructor" \ - = xnoyesno; then - echo - echo "NOTE:" - echo "liblzma will be thread-unsafe due to the combination" - echo "of --disable-threads --enable-small when using a compiler" - echo "that doesn't support __attribute__((__constructor__))." -fi diff --git a/software/src/xz/lib/Makefile.am b/software/src/xz/lib/Makefile.am deleted file mode 100644 index 3309e22..0000000 --- a/software/src/xz/lib/Makefile.am +++ /dev/null @@ -1,44 +0,0 @@ -## SPDX-License-Identifier: GPL-2.0-or-later - -## -## Copyright (C) 2004-2007 Free Software Foundation, Inc. -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## - -## Not using gnulib-tool, at least for now. It is likely that we won't -## need anything else from Gnulib than getopt_long(). - -noinst_LIBRARIES = libgnu.a - -libgnu_a_SOURCES = -libgnu_a_DEPENDENCIES = $(LIBOBJS) -libgnu_a_LIBADD = $(LIBOBJS) - -EXTRA_DIST = \ - getopt.in.h \ - getopt.c \ - getopt1.c \ - getopt_int.h \ - getopt-cdefs.h \ - getopt-core.h \ - getopt-ext.h \ - getopt-pfx-core.h \ - getopt-pfx-ext.h - -BUILT_SOURCES = $(GETOPT_H) -MOSTLYCLEANFILES = getopt.h getopt.h-t - -getopt.h: getopt.in.h - { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ - cat $(srcdir)/getopt.in.h; \ - } > $@-t - mv -f $@-t $@ diff --git a/software/src/xz/lib/getopt-cdefs.h b/software/src/xz/lib/getopt-cdefs.h deleted file mode 100644 index 576428c..0000000 --- a/software/src/xz/lib/getopt-cdefs.h +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* getopt-on-non-glibc compatibility macros. - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of gnulib. - Unlike most of the getopt implementation, it is NOT shared - with the GNU C Library. - - This file is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . */ - -#ifndef _GETOPT_CDEFS_H -#define _GETOPT_CDEFS_H 1 - -/* This header should not be used directly; include getopt.h or - unistd.h instead. It does not have a protective #error, because - the guard macro for getopt.h in gnulib is not fixed. */ - -/* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect - a number of the internal macros supplied to GNU libc's headers by - sys/cdefs.h. Provide fallback definitions for all of them. */ -#ifdef HAVE_SYS_CDEFS_H -# include -#endif - -#ifndef __BEGIN_DECLS -# ifdef __cplusplus -# define __BEGIN_DECLS extern "C" { -# else -# define __BEGIN_DECLS /* nothing */ -# endif -#endif -#ifndef __END_DECLS -# ifdef __cplusplus -# define __END_DECLS } -# else -# define __END_DECLS /* nothing */ -# endif -#endif - -#ifndef __GNUC_PREREQ -# if defined __GNUC__ && defined __GNUC_VERSION__ -# define __GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -# else -# define __GNUC_PREREQ(maj, min) 0 -# endif -#endif - -#ifndef __THROW -# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4) -# if __cplusplus >= 201103L -# define __THROW noexcept (true) -# else -# define __THROW throw () -# endif -# else -# define __THROW -# endif -#endif - -#endif /* _GETOPT_CDEFS_H */ diff --git a/software/src/xz/lib/getopt-core.h b/software/src/xz/lib/getopt-core.h deleted file mode 100644 index 126ce80..0000000 --- a/software/src/xz/lib/getopt-core.h +++ /dev/null @@ -1,98 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* Declarations for getopt (basic, portable features only). - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library and is also part of gnulib. - Patches to this file should be submitted to both projects. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _GETOPT_CORE_H -#define _GETOPT_CORE_H 1 - -/* This header should not be used directly; include getopt.h or - unistd.h instead. Unlike most bits headers, it does not have - a protective #error, because the guard macro for getopt.h in - gnulib is not fixed. */ - -__BEGIN_DECLS - -/* For communication from 'getopt' to the caller. - When 'getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when 'ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to 'getopt'. - - On entry to 'getopt', zero means this is the first call; initialize. - - When 'getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, 'optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message 'getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. - - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, 'optopt' is set to the option letter, and '?' is - returned. - - The OPTS string is a list of characters which are recognized option - letters, optionally followed by colons, specifying that that letter - takes an argument, to be placed in 'optarg'. - - If a letter in OPTS is followed by two colons, its argument is - optional. This behavior is specific to the GNU 'getopt'. - - The argument '--' causes premature termination of argument - scanning, explicitly telling 'getopt' that there are no more - options. - - If OPTS begins with '-', then non-option arguments are treated as - arguments to the option '\1'. This behavior is specific to the GNU - 'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in - the environment, then do not permute arguments. - - For standards compliance, the 'argv' argument has the type - char *const *, but this is inaccurate; if argument permutation is - enabled, the argv array (not the strings it points to) must be - writable. */ - -extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) - __THROW _GL_ARG_NONNULL ((2, 3)); - -__END_DECLS - -#endif /* _GETOPT_CORE_H */ diff --git a/software/src/xz/lib/getopt-ext.h b/software/src/xz/lib/getopt-ext.h deleted file mode 100644 index 006037b..0000000 --- a/software/src/xz/lib/getopt-ext.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* Declarations for getopt (GNU extensions). - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library and is also part of gnulib. - Patches to this file should be submitted to both projects. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _GETOPT_EXT_H -#define _GETOPT_EXT_H 1 - -/* This header should not be used directly; include getopt.h instead. - Unlike most bits headers, it does not have a protective #error, - because the guard macro for getopt.h in gnulib is not fixed. */ - -__BEGIN_DECLS - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of 'struct option' terminated by an element containing a name which is - zero. - - The field 'has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field 'flag' is not NULL, it points to a variable that is set - to the value given in the field 'val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an 'int' to - a compiled-in constant, such as set a value from 'optarg', set the - option's 'flag' field to zero and its 'val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero 'flag' field, 'getopt' - returns the contents of the 'val' field. */ - -struct option -{ - const char *name; - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the 'has_arg' field of 'struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind) - __THROW _GL_ARG_NONNULL ((2, 3)); -extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind) - __THROW _GL_ARG_NONNULL ((2, 3)); - -__END_DECLS - -#endif /* _GETOPT_EXT_H */ diff --git a/software/src/xz/lib/getopt-pfx-core.h b/software/src/xz/lib/getopt-pfx-core.h deleted file mode 100644 index ee22d3f..0000000 --- a/software/src/xz/lib/getopt-pfx-core.h +++ /dev/null @@ -1,68 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* getopt (basic, portable features) gnulib wrapper header. - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of gnulib. - Unlike most of the getopt implementation, it is NOT shared - with the GNU C Library. - - This file is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . */ - -#ifndef _GETOPT_PFX_CORE_H -#define _GETOPT_PFX_CORE_H 1 - -/* This header should not be used directly; include getopt.h or - unistd.h instead. It does not have a protective #error, because - the guard macro for getopt.h in gnulib is not fixed. */ - -/* Standalone applications should #define __GETOPT_PREFIX to an - identifier that prefixes the external functions and variables - defined in getopt-core.h and getopt-ext.h. Systematically - rename identifiers so that they do not collide with the system - functions and variables. Renaming avoids problems with some - compilers and linkers. */ -#ifdef __GETOPT_PREFIX -# ifndef __GETOPT_ID -# define __GETOPT_CONCAT(x, y) x ## y -# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) -# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) -# endif -# undef getopt -# undef optarg -# undef opterr -# undef optind -# undef optopt -# define getopt __GETOPT_ID (getopt) -# define optarg __GETOPT_ID (optarg) -# define opterr __GETOPT_ID (opterr) -# define optind __GETOPT_ID (optind) -# define optopt __GETOPT_ID (optopt) - -/* Work around a problem on macOS, which declares getopt with a - trailing __DARWIN_ALIAS(getopt) that would expand to something like - __asm("_" "rpl_getopt" "$UNIX2003") were it not for the following - hack to suppress the macOS declaration . */ -# ifdef __APPLE__ -# define _GETOPT -# endif - -/* The system's getopt.h may have already included getopt-core.h to - declare the unprefixed identifiers. Undef _GETOPT_CORE_H so that - getopt-core.h declares them with prefixes. */ -# undef _GETOPT_CORE_H -#endif - -#include - -#endif /* _GETOPT_PFX_CORE_H */ diff --git a/software/src/xz/lib/getopt-pfx-ext.h b/software/src/xz/lib/getopt-pfx-ext.h deleted file mode 100644 index 00d2a09..0000000 --- a/software/src/xz/lib/getopt-pfx-ext.h +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* getopt (GNU extensions) gnulib wrapper header. - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of gnulib. - Unlike most of the getopt implementation, it is NOT shared - with the GNU C Library. - - This file is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . */ - -#ifndef _GETOPT_PFX_EXT_H -#define _GETOPT_PFX_EXT_H 1 - -/* This header should not be used directly; include getopt.h instead. - It does not have a protective #error, because the guard macro for - getopt.h in gnulib is not fixed. */ - -/* Standalone applications should #define __GETOPT_PREFIX to an - identifier that prefixes the external functions and variables - defined in getopt-core.h and getopt-ext.h. Systematically - rename identifiers so that they do not collide with the system - functions and variables. Renaming avoids problems with some - compilers and linkers. */ -#ifdef __GETOPT_PREFIX -# ifndef __GETOPT_ID -# define __GETOPT_CONCAT(x, y) x ## y -# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) -# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) -# endif -# undef getopt_long -# undef getopt_long_only -# undef option -# undef _getopt_internal -# define getopt_long __GETOPT_ID (getopt_long) -# define getopt_long_only __GETOPT_ID (getopt_long_only) -# define option __GETOPT_ID (option) -# define _getopt_internal __GETOPT_ID (getopt_internal) - -/* The system's getopt.h may have already included getopt-ext.h to - declare the unprefixed identifiers. Undef _GETOPT_EXT_H so that - getopt-ext.h declares them with prefixes. */ -# undef _GETOPT_EXT_H -#endif - -/* Standalone applications get correct prototypes for getopt_long and - getopt_long_only; they declare "char **argv". For backward - compatibility with old applications, if __GETOPT_PREFIX is not - defined, we supply GNU-libc-compatible, but incorrect, prototypes - using "char *const *argv". (GNU libc is stuck with the incorrect - prototypes, as they are baked into older versions of LSB.) */ -#ifndef __getopt_argv_const -# if defined __GETOPT_PREFIX -# define __getopt_argv_const /* empty */ -# else -# define __getopt_argv_const const -# endif -#endif - -#include - -#endif /* _GETOPT_PFX_EXT_H */ diff --git a/software/src/xz/lib/getopt.c b/software/src/xz/lib/getopt.c deleted file mode 100644 index ab3ff87..0000000 --- a/software/src/xz/lib/getopt.c +++ /dev/null @@ -1,823 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* Getopt for GNU. - Copyright (C) 1987-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library and is also part of gnulib. - Patches to this file should be submitted to both projects. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _LIBC -# ifdef HAVE_CONFIG_H -# include -# endif -#endif - -#include "getopt.h" - -#include -#include -#include -#ifndef _MSC_VER -# include -#endif - -#ifdef _LIBC -/* When used as part of glibc, error printing must be done differently - for standards compliance. getopt is not a cancellation point, so - it must not call functions that are, and it is specified by an - older standard than stdio locking, so it must not refer to - functions in the "user namespace" related to stdio locking. - Finally, it must use glibc's internal message translation so that - the messages are looked up in the proper text domain. */ -# include -# define fprintf __fxprintf_nocancel -# define flockfile(fp) _IO_flockfile (fp) -# define funlockfile(fp) _IO_funlockfile (fp) -#else -/* Completely disable NLS for getopt. We won't include translations for it - anyway. If the system lacks getopt_long, missing translations probably - aren't a problem. */ -//# include "gettext.h" -//# define _(msgid) gettext (msgid) -#define _(msgid) (msgid) -/* When used standalone, flockfile and funlockfile might not be - available. */ -# if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \ - || (defined _WIN32 && ! defined __CYGWIN__)) -# define flockfile(fp) /* nop */ -# define funlockfile(fp) /* nop */ -# endif -/* When used standalone, do not attempt to use alloca. */ -# define __libc_use_alloca(size) 0 -# undef alloca -# define alloca(size) (abort (), (void *)0) -#endif - -/* This implementation of 'getopt' has three modes for handling - options interspersed with non-option arguments. It can stop - scanning for options at the first non-option argument encountered, - as POSIX specifies. It can continue scanning for options after the - first non-option argument, but permute 'argv' as it goes so that, - after 'getopt' is done, all the options precede all the non-option - arguments and 'optind' points to the first non-option argument. - Or, it can report non-option arguments as if they were arguments to - the option character '\x01'. - - The default behavior of 'getopt_long' is to permute the argument list. - When this implementation is used standalone, the default behavior of - 'getopt' is to stop at the first non-option argument, but when it is - used as part of GNU libc it also permutes the argument list. In both - cases, setting the environment variable POSIXLY_CORRECT to any value - disables permutation. - - If the first character of the OPTSTRING argument to 'getopt' or - 'getopt_long' is '+', both functions will stop at the first - non-option argument. If it is '-', both functions will report - non-option arguments as arguments to the option character '\x01'. */ - -#include "getopt_int.h" - -/* For communication from 'getopt' to the caller. - When 'getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when 'ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to 'getopt'. - - On entry to 'getopt', zero means this is the first call; initialize. - - When 'getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, 'optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* 1003.2 says this must be 1 before any call. */ -int optind = 1; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int optopt = '?'; - -/* Keep a global copy of all internal members of getopt_data. */ - -static struct _getopt_data getopt_data; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - 'first_nonopt' and 'last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. */ - -static void -exchange (char **argv, struct _getopt_data *d) -{ - int bottom = d->__first_nonopt; - int middle = d->__last_nonopt; - int top = d->optind; - char *tem; - - /* Exchange the shorter segment with the far end of the longer segment. - That puts the shorter segment into the right place. - It leaves the longer segment in the right place overall, - but it consists of two parts that need to be swapped next. */ - - while (top > middle && middle > bottom) - { - if (top - middle > middle - bottom) - { - /* Bottom segment is the short one. */ - int len = middle - bottom; - int i; - - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } - else - { - /* Top segment is the short one. */ - int len = top - middle; - int i; - - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } - } - - /* Update records for the slots the non-options now occupy. */ - - d->__first_nonopt += (d->optind - d->__last_nonopt); - d->__last_nonopt = d->optind; -} - -/* Process the argument starting with d->__nextchar as a long option. - d->optind should *not* have been advanced over this argument. - - If the value returned is -1, it was not actually a long option, the - state is unchanged, and the argument should be processed as a set - of short options (this can only happen when long_only is true). - Otherwise, the option (and its argument, if any) have been consumed - and the return value is the value to return from _getopt_internal_r. */ -static int -process_long_option (int argc, char **argv, const char *optstring, - const struct option *longopts, int *longind, - int long_only, struct _getopt_data *d, - int print_errors, const char *prefix) -{ - char *nameend; - size_t namelen; - const struct option *p; - const struct option *pfound = NULL; - int n_options; - int option_index; - - for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - namelen = (size_t)(nameend - d->__nextchar); - - /* First look for an exact match, counting the options as a side - effect. */ - for (p = longopts, n_options = 0; p->name; p++, n_options++) - if (!strncmp (p->name, d->__nextchar, namelen) - && namelen == strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - option_index = n_options; - break; - } - - if (pfound == NULL) - { - /* Didn't find an exact match, so look for abbreviations. */ - unsigned char *ambig_set = NULL; - int ambig_malloced = 0; - int ambig_fallback = 0; - int indfound = -1; - - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp (p->name, d->__nextchar, namelen)) - { - if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else if (long_only - || pfound->has_arg != p->has_arg - || pfound->flag != p->flag - || pfound->val != p->val) - { - /* Second or later nonexact match found. */ - if (!ambig_fallback) - { - if (!print_errors) - /* Don't waste effort tracking the ambig set if - we're not going to print it anyway. */ - ambig_fallback = 1; - else if (!ambig_set) - { - if (__libc_use_alloca (n_options)) - ambig_set = alloca (n_options); - else if ((ambig_set = malloc ((size_t)n_options)) == NULL) - /* Fall back to simpler error message. */ - ambig_fallback = 1; - else - ambig_malloced = 1; - - if (ambig_set) - { - memset (ambig_set, 0, (size_t)n_options); - ambig_set[indfound] = 1; - } - } - if (ambig_set) - ambig_set[option_index] = 1; - } - } - } - - if (ambig_set || ambig_fallback) - { - if (print_errors) - { - if (ambig_fallback) - fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"), - argv[0], prefix, d->__nextchar); - else - { - flockfile (stderr); - fprintf (stderr, - _("%s: option '%s%s' is ambiguous; possibilities:"), - argv[0], prefix, d->__nextchar); - - for (option_index = 0; option_index < n_options; option_index++) - if (ambig_set[option_index]) - fprintf (stderr, " '%s%s'", - prefix, longopts[option_index].name); - - /* This must use 'fprintf' even though it's only - printing a single character, so that it goes through - __fxprintf_nocancel when compiled as part of glibc. */ - fprintf (stderr, "\n"); - funlockfile (stderr); - } - } - if (ambig_malloced) - free (ambig_set); - d->__nextchar += strlen (d->__nextchar); - d->optind++; - d->optopt = 0; - return '?'; - } - - option_index = indfound; - } - - if (pfound == NULL) - { - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short option, - then it's an error. */ - if (!long_only || argv[d->optind][1] == '-' - || strchr (optstring, *d->__nextchar) == NULL) - { - if (print_errors) - fprintf (stderr, _("%s: unrecognized option '%s%s'\n"), - argv[0], prefix, d->__nextchar); - - d->__nextchar = NULL; - d->optind++; - d->optopt = 0; - return '?'; - } - - /* Otherwise interpret it as a short option. */ - return -1; - } - - /* We have found a matching long option. Consume it. */ - d->optind++; - d->__nextchar = NULL; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - d->optarg = nameend + 1; - else - { - if (print_errors) - fprintf (stderr, - _("%s: option '%s%s' doesn't allow an argument\n"), - argv[0], prefix, pfound->name); - - d->optopt = pfound->val; - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (d->optind < argc) - d->optarg = argv[d->optind++]; - else - { - if (print_errors) - fprintf (stderr, - _("%s: option '%s%s' requires an argument\n"), - argv[0], prefix, pfound->name); - - d->optopt = pfound->val; - return optstring[0] == ':' ? ':' : '?'; - } - } - - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; -} - -/* Initialize internal data upon the first call to getopt. */ - -static const char * -_getopt_initialize (int argc, - char **argv, const char *optstring, - struct _getopt_data *d, int posixly_correct) -{ - (void)argc; - (void)argv; - /* Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - if (d->optind == 0) - d->optind = 1; - - d->__first_nonopt = d->__last_nonopt = d->optind; - d->__nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - if (optstring[0] == '-') - { - d->__ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - d->__ordering = REQUIRE_ORDER; - ++optstring; - } - else if (posixly_correct || !!getenv ("POSIXLY_CORRECT")) - d->__ordering = REQUIRE_ORDER; - else - d->__ordering = PERMUTE; - - d->__initialized = 1; - return optstring; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If 'getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If 'getopt' finds another option character, it returns that character, - updating 'optind' and 'nextchar' so that the next call to 'getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, 'getopt' returns -1. - Then 'optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set 'opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in 'optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in 'optarg', otherwise 'optarg' is set to zero. - - If OPTSTRING starts with '-' or '+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with '--' instead of '-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a '=', or else the in next ARGV-element. - When 'getopt' finds a long-named option, it returns 0 if that option's - 'flag' field is nonzero, the value of the option's 'val' field - if the 'flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of 'struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal_r (int argc, char **argv, const char *optstring, - const struct option *longopts, int *longind, - int long_only, struct _getopt_data *d, int posixly_correct) -{ - int print_errors = d->opterr; - - if (argc < 1) - return -1; - - d->optarg = NULL; - - if (d->optind == 0 || !d->__initialized) - optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct); - else if (optstring[0] == '-' || optstring[0] == '+') - optstring++; - - if (optstring[0] == ':') - print_errors = 0; - - /* Test whether ARGV[optind] points to a non-option argument. */ -#define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') - - if (d->__nextchar == NULL || *d->__nextchar == '\0') - { - /* Advance to the next ARGV-element. */ - - /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been - moved back by the user (who may also have changed the arguments). */ - if (d->__last_nonopt > d->optind) - d->__last_nonopt = d->optind; - if (d->__first_nonopt > d->optind) - d->__first_nonopt = d->optind; - - if (d->__ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (d->__first_nonopt != d->__last_nonopt - && d->__last_nonopt != d->optind) - exchange (argv, d); - else if (d->__last_nonopt != d->optind) - d->__first_nonopt = d->optind; - - /* Skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (d->optind < argc && NONOPTION_P) - d->optind++; - d->__last_nonopt = d->optind; - } - - /* The special ARGV-element '--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (d->optind != argc && !strcmp (argv[d->optind], "--")) - { - d->optind++; - - if (d->__first_nonopt != d->__last_nonopt - && d->__last_nonopt != d->optind) - exchange (argv, d); - else if (d->__first_nonopt == d->__last_nonopt) - d->__first_nonopt = d->optind; - d->__last_nonopt = argc; - - d->optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (d->optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (d->__first_nonopt != d->__last_nonopt) - d->optind = d->__first_nonopt; - return -1; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if (NONOPTION_P) - { - if (d->__ordering == REQUIRE_ORDER) - return -1; - d->optarg = argv[d->optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Check whether it might be a long option. */ - if (longopts) - { - if (argv[d->optind][1] == '-') - { - /* "--foo" is always a long option. The special option - "--" was handled above. */ - d->__nextchar = argv[d->optind] + 2; - return process_long_option (argc, argv, optstring, longopts, - longind, long_only, d, - print_errors, "--"); - } - - /* If long_only and the ARGV-element has the form "-f", - where f is a valid short option, don't consider it an - abbreviated form of a long option that starts with f. - Otherwise there would be no way to give the -f short - option. - - On the other hand, if there's a long option "fubar" and - the ARGV-element is "-fu", do consider that an - abbreviation of the long option, just like "--fu", and - not "-f" with arg "u". - - This distinction seems to be the most useful approach. */ - if (long_only && (argv[d->optind][2] - || !strchr (optstring, argv[d->optind][1]))) - { - int code; - d->__nextchar = argv[d->optind] + 1; - code = process_long_option (argc, argv, optstring, longopts, - longind, long_only, d, - print_errors, "-"); - if (code != -1) - return code; - } - } - - /* It is not a long option. Skip the initial punctuation. */ - d->__nextchar = argv[d->optind] + 1; - } - - /* Look at and handle the next short option-character. */ - - { - char c = *d->__nextchar++; - const char *temp = strchr (optstring, c); - - /* Increment 'optind' when we start to process its last character. */ - if (*d->__nextchar == '\0') - ++d->optind; - - if (temp == NULL || c == ':' || c == ';') - { - if (print_errors) - fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c); - d->optopt = c; - return '?'; - } - - /* Convenience. Treat POSIX -W foo same as long option --foo */ - if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL) - { - /* This is an option that requires an argument. */ - if (*d->__nextchar != '\0') - d->optarg = d->__nextchar; - else if (d->optind == argc) - { - if (print_errors) - fprintf (stderr, - _("%s: option requires an argument -- '%c'\n"), - argv[0], c); - - d->optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - return c; - } - else - d->optarg = argv[d->optind]; - - d->__nextchar = d->optarg; - d->optarg = NULL; - return process_long_option (argc, argv, optstring, longopts, longind, - 0 /* long_only */, d, print_errors, "-W "); - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*d->__nextchar != '\0') - { - d->optarg = d->__nextchar; - d->optind++; - } - else - d->optarg = NULL; - d->__nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*d->__nextchar != '\0') - { - d->optarg = d->__nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - d->optind++; - } - else if (d->optind == argc) - { - if (print_errors) - fprintf (stderr, - _("%s: option requires an argument -- '%c'\n"), - argv[0], c); - - d->optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented 'optind' once; - increment it again when taking next ARGV-elt as argument. */ - d->optarg = argv[d->optind++]; - d->__nextchar = NULL; - } - } - return c; - } -} - -int -_getopt_internal (int argc, char **argv, const char *optstring, - const struct option *longopts, int *longind, int long_only, - int posixly_correct) -{ - int result; - - getopt_data.optind = optind; - getopt_data.opterr = opterr; - - result = _getopt_internal_r (argc, argv, optstring, longopts, - longind, long_only, &getopt_data, - posixly_correct); - - optind = getopt_data.optind; - optarg = getopt_data.optarg; - optopt = getopt_data.optopt; - - return result; -} - -/* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt. - Standalone applications just get a POSIX-compliant getopt. - POSIX and LSB both require these functions to take 'char *const *argv' - even though this is incorrect (because of the permutation). */ -#define GETOPT_ENTRY(NAME, POSIXLY_CORRECT) \ - int \ - NAME (int argc, char *const *argv, const char *optstring) \ - { \ - return _getopt_internal (argc, (char **)argv, optstring, \ - 0, 0, 0, POSIXLY_CORRECT); \ - } - -#ifdef _LIBC -GETOPT_ENTRY(getopt, 0) -GETOPT_ENTRY(__posix_getopt, 1) -#else -GETOPT_ENTRY(getopt, 1) -#endif - - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of 'getopt'. */ - -int -main (int argc, char **argv) -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == -1) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value '%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/software/src/xz/lib/getopt.in.h b/software/src/xz/lib/getopt.in.h deleted file mode 100644 index 6d602c5..0000000 --- a/software/src/xz/lib/getopt.in.h +++ /dev/null @@ -1,60 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* Declarations for getopt. - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of gnulib. - Unlike most of the getopt implementation, it is NOT shared - with the GNU C Library, which supplies a different version of - this file. - - This file is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - This file is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program. If not, see . */ - -#ifndef _GETOPT_H - -#define _GETOPT_H 1 - -/* Standalone applications should #define __GETOPT_PREFIX to an - identifier that prefixes the external functions and variables - defined in this header. When this happens, include the - headers that might declare getopt so that they will not cause - confusion if included after this file. Then systematically rename - identifiers so that they do not collide with the system functions - and variables. Renaming avoids problems with some compilers and - linkers. */ -#if defined __GETOPT_PREFIX -# include -# include - -# ifndef _MSC_VER -# include -# endif -#endif - -/* From Gnulib's lib/arg-nonnull.h: */ -/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools - that the values passed as arguments n, ..., m must be non-NULL pointers. - n = 1 stands for the first argument, n = 2 for the second argument etc. */ -#ifndef _GL_ARG_NONNULL -# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__ -# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) -# else -# define _GL_ARG_NONNULL(params) -# endif -#endif - -#include -#include -#include - -#endif /* _GETOPT_H */ diff --git a/software/src/xz/lib/getopt1.c b/software/src/xz/lib/getopt1.c deleted file mode 100644 index 5cb3b91..0000000 --- a/software/src/xz/lib/getopt1.c +++ /dev/null @@ -1,163 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library and is also part of gnulib. - Patches to this file should be submitted to both projects. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _LIBC -# ifdef HAVE_CONFIG_H -# include -# endif -#endif - -#include "getopt.h" -#include "getopt_int.h" - -int -getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, - const struct option *long_options, int *opt_index) -{ - return _getopt_internal (argc, (char **) argv, options, long_options, - opt_index, 0, 0); -} - -int -_getopt_long_r (int argc, char **argv, const char *options, - const struct option *long_options, int *opt_index, - struct _getopt_data *d) -{ - return _getopt_internal_r (argc, argv, options, long_options, opt_index, - 0, d, 0); -} - -/* Like getopt_long, but '-' as well as '--' can indicate a long option. - If an option that starts with '-' (not '--') doesn't match a long option, - but does match a short option, it is parsed as a short option - instead. */ - -int -getopt_long_only (int argc, char *__getopt_argv_const *argv, - const char *options, - const struct option *long_options, int *opt_index) -{ - return _getopt_internal (argc, (char **) argv, options, long_options, - opt_index, 1, 0); -} - -int -_getopt_long_only_r (int argc, char **argv, const char *options, - const struct option *long_options, int *opt_index, - struct _getopt_data *d) -{ - return _getopt_internal_r (argc, argv, options, long_options, opt_index, - 1, d, 0); -} - - -#ifdef TEST - -#include -#include - -int -main (int argc, char **argv) -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - int option_index = 0; - static const struct option long_options[] = - { - {"add", 1, 0, 0}, - {"append", 0, 0, 0}, - {"delete", 1, 0, 0}, - {"verbose", 0, 0, 0}, - {"create", 0, 0, 0}, - {"file", 1, 0, 0}, - {0, 0, 0, 0} - }; - - c = getopt_long (argc, argv, "abc:d:0123456789", - long_options, &option_index); - if (c == -1) - break; - - switch (c) - { - case 0: - printf ("option %s", long_options[option_index].name); - if (optarg) - printf (" with arg %s", optarg); - printf ("\n"); - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value '%s'\n", optarg); - break; - - case 'd': - printf ("option d with value '%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/software/src/xz/lib/getopt_int.h b/software/src/xz/lib/getopt_int.h deleted file mode 100644 index 2dcb553..0000000 --- a/software/src/xz/lib/getopt_int.h +++ /dev/null @@ -1,120 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ - -/* Internal declarations for getopt. - Copyright (C) 1989-2023 Free Software Foundation, Inc. - This file is part of the GNU C Library and is also part of gnulib. - Patches to this file should be submitted to both projects. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _GETOPT_INT_H -#define _GETOPT_INT_H 1 - -#include - -extern int _getopt_internal (int ___argc, char **___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind, - int __long_only, int __posixly_correct); - - -/* Reentrant versions which can handle parsing multiple argument - vectors at the same time. */ - -/* Describe how to deal with options that follow non-option ARGV-elements. - - REQUIRE_ORDER means don't recognize them as options; stop option - processing when the first non-option is seen. This is what POSIX - specifies should happen. - - PERMUTE means permute the contents of ARGV as we scan, so that - eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written - to expect this. - - RETURN_IN_ORDER is an option available to programs that were - written to expect options and other ARGV-elements in any order - and that care about the ordering of the two. We describe each - non-option ARGV-element as if it were the argument of an option - with character code 1. - - The special argument '--' forces an end of option-scanning regardless - of the value of 'ordering'. In the case of RETURN_IN_ORDER, only - '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */ - -enum __ord - { - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER - }; - -/* Data type for reentrant functions. */ -struct _getopt_data -{ - /* These have exactly the same meaning as the corresponding global - variables, except that they are used for the reentrant - versions of getopt. */ - int optind; - int opterr; - int optopt; - char *optarg; - - /* Internal members. */ - - /* True if the internal members have been initialized. */ - int __initialized; - - /* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - char *__nextchar; - - /* See __ord above. */ - enum __ord __ordering; - - /* Handle permutation of arguments. */ - - /* Describe the part of ARGV that contains non-options that have - been skipped. 'first_nonopt' is the index in ARGV of the first - of them; 'last_nonopt' is the index after the last of them. */ - - int __first_nonopt; - int __last_nonopt; -}; - -/* The initializer is necessary to set OPTIND and OPTERR to their - default values and to clear the initialization flag. */ -#define _GETOPT_DATA_INITIALIZER { 1, 1 } - -extern int _getopt_internal_r (int ___argc, char **___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind, - int __long_only, struct _getopt_data *__data, - int __posixly_correct); - -extern int _getopt_long_r (int ___argc, char **___argv, - const char *__shortopts, - const struct option *__longopts, int *__longind, - struct _getopt_data *__data); - -extern int _getopt_long_only_r (int ___argc, char **___argv, - const char *__shortopts, - const struct option *__longopts, - int *__longind, - struct _getopt_data *__data); - -#endif /* getopt_int.h */ diff --git a/software/src/xz/src/Makefile.am b/software/src/xz/src/Makefile.am deleted file mode 100644 index 5288529..0000000 --- a/software/src/xz/src/Makefile.am +++ /dev/null @@ -1,45 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -SUBDIRS = liblzma xzdec - -if COND_XZ -SUBDIRS += xz -endif - -if COND_LZMAINFO -SUBDIRS += lzmainfo -endif - -if COND_SCRIPTS -SUBDIRS += scripts -endif - -EXTRA_DIST = \ - common/common_w32res.rc \ - common/my_landlock.h \ - common/mythread.h \ - common/sysdefs.h \ - common/tuklib_common.h \ - common/tuklib_config.h \ - common/tuklib_cpucores.c \ - common/tuklib_cpucores.h \ - common/tuklib_exit.c \ - common/tuklib_exit.h \ - common/tuklib_gettext.h \ - common/tuklib_integer.h \ - common/tuklib_mbstr.h \ - common/tuklib_mbstr_fw.c \ - common/tuklib_mbstr_nonprint.c \ - common/tuklib_mbstr_nonprint.h \ - common/tuklib_mbstr_width.c \ - common/tuklib_mbstr_wrap.c \ - common/tuklib_mbstr_wrap.h \ - common/tuklib_open_stdxxx.c \ - common/tuklib_open_stdxxx.h \ - common/tuklib_physmem.c \ - common/tuklib_physmem.h \ - common/tuklib_progname.c \ - common/tuklib_progname.h \ - common/w32_application.manifest \ - common/w32_application.manifest.comments.txt diff --git a/software/src/xz/src/common/common_w32res.rc b/software/src/xz/src/common/common_w32res.rc deleted file mode 100644 index 8114ee3..0000000 --- a/software/src/xz/src/common/common_w32res.rc +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/* - * Author: Lasse Collin - */ - -#include -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif -#define LZMA_H_INTERNAL -#define LZMA_H_INTERNAL_RC -#include "lzma/version.h" - -#ifndef MY_BUILD -# define MY_BUILD 0 -#endif -#define MY_VERSION LZMA_VERSION_MAJOR,LZMA_VERSION_MINOR,LZMA_VERSION_PATCH,MY_BUILD - -#define MY_FILENAME MY_NAME MY_SUFFIX -#define MY_COMPANY "The Tukaani Project " -#define MY_PRODUCT PACKAGE_NAME " <" PACKAGE_URL ">" - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -VS_VERSION_INFO VERSIONINFO -FILEVERSION MY_VERSION -PRODUCTVERSION MY_VERSION -FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -FILEFLAGS 0 -FILEOS VOS_NT_WINDOWS32 -FILETYPE MY_TYPE -FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", MY_COMPANY - VALUE "FileDescription", MY_DESC - VALUE "FileVersion", LZMA_VERSION_STRING - VALUE "InternalName", MY_NAME - VALUE "OriginalFilename", MY_FILENAME - VALUE "ProductName", MY_PRODUCT - VALUE "ProductVersion", LZMA_VERSION_STRING - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -/* Omit the manifest on Cygwin and MSYS2 (both define __CYGWIN__). */ -#if MY_TYPE == VFT_APP && !defined(__CYGWIN__) -CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "w32_application.manifest" -#endif diff --git a/software/src/xz/src/common/my_landlock.h b/software/src/xz/src/common/my_landlock.h deleted file mode 100644 index e135d08..0000000 --- a/software/src/xz/src/common/my_landlock.h +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file my_landlock.h -/// \brief Linux Landlock sandbox helper functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef MY_LANDLOCK_H -#define MY_LANDLOCK_H - -#include "sysdefs.h" - -#include -#include -#include - - -/// \brief Initialize Landlock ruleset attributes to forbid everything -/// -/// The supported Landlock ABI is checked at runtime and only the supported -/// actions are forbidden in the attributes. Thus, if the attributes are -/// used with my_landlock_create_ruleset(), it shouldn't fail. -/// -/// \return On success, the Landlock ABI version is returned (a positive -/// integer). If Landlock isn't supported, -1 is returned. -static int -my_landlock_ruleset_attr_forbid_all(struct landlock_ruleset_attr *attr) -{ - memzero(attr, sizeof(*attr)); - - const int abi_version = syscall(SYS_landlock_create_ruleset, - (void *)NULL, 0, LANDLOCK_CREATE_RULESET_VERSION); - if (abi_version <= 0) - return -1; - - // ABI 1 except the few at the end - attr->handled_access_fs - = LANDLOCK_ACCESS_FS_EXECUTE - | LANDLOCK_ACCESS_FS_WRITE_FILE - | LANDLOCK_ACCESS_FS_READ_FILE - | LANDLOCK_ACCESS_FS_READ_DIR - | LANDLOCK_ACCESS_FS_REMOVE_DIR - | LANDLOCK_ACCESS_FS_REMOVE_FILE - | LANDLOCK_ACCESS_FS_MAKE_CHAR - | LANDLOCK_ACCESS_FS_MAKE_DIR - | LANDLOCK_ACCESS_FS_MAKE_REG - | LANDLOCK_ACCESS_FS_MAKE_SOCK - | LANDLOCK_ACCESS_FS_MAKE_FIFO - | LANDLOCK_ACCESS_FS_MAKE_BLOCK - | LANDLOCK_ACCESS_FS_MAKE_SYM -#ifdef LANDLOCK_ACCESS_FS_REFER - | LANDLOCK_ACCESS_FS_REFER // ABI 2 -#endif -#ifdef LANDLOCK_ACCESS_FS_TRUNCATE - | LANDLOCK_ACCESS_FS_TRUNCATE // ABI 3 -#endif -#ifdef LANDLOCK_ACCESS_FS_IOCTL_DEV - | LANDLOCK_ACCESS_FS_IOCTL_DEV // ABI 5 -#endif - ; - -#ifdef LANDLOCK_ACCESS_NET_BIND_TCP - // ABI 4 - attr->handled_access_net - = LANDLOCK_ACCESS_NET_BIND_TCP - | LANDLOCK_ACCESS_NET_CONNECT_TCP; -#endif - -#ifdef LANDLOCK_SCOPE_SIGNAL - // ABI 6 - attr->scoped - = LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET - | LANDLOCK_SCOPE_SIGNAL; -#endif - - // Disable flags that require a new ABI version. - switch (abi_version) { - case 1: -#ifdef LANDLOCK_ACCESS_FS_REFER - attr->handled_access_fs &= ~LANDLOCK_ACCESS_FS_REFER; -#endif - FALLTHROUGH; - - case 2: -#ifdef LANDLOCK_ACCESS_FS_TRUNCATE - attr->handled_access_fs &= ~LANDLOCK_ACCESS_FS_TRUNCATE; -#endif - FALLTHROUGH; - - case 3: -#ifdef LANDLOCK_ACCESS_NET_BIND_TCP - attr->handled_access_net = 0; -#endif - FALLTHROUGH; - - case 4: -#ifdef LANDLOCK_ACCESS_FS_IOCTL_DEV - attr->handled_access_fs &= ~LANDLOCK_ACCESS_FS_IOCTL_DEV; -#endif - FALLTHROUGH; - - case 5: -#ifdef LANDLOCK_SCOPE_SIGNAL - attr->scoped = 0; -#endif - FALLTHROUGH; - - default: - // We only know about the features of the ABIs 1-6. - break; - } - - return abi_version; -} - - -/// \brief Wrapper for the landlock_create_ruleset(2) syscall -/// -/// Syscall wrappers provide argument type checking. -/// -/// \note Remember to call `prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)` too! -static inline int -my_landlock_create_ruleset(const struct landlock_ruleset_attr *attr, - size_t size, uint32_t flags) -{ - return syscall(SYS_landlock_create_ruleset, attr, size, flags); -} - - -/// \brief Wrapper for the landlock_restrict_self(2) syscall -static inline int -my_landlock_restrict_self(int ruleset_fd, uint32_t flags) -{ - return syscall(SYS_landlock_restrict_self, ruleset_fd, flags); -} - -#endif diff --git a/software/src/xz/src/common/mythread.h b/software/src/xz/src/common/mythread.h deleted file mode 100644 index 10ea2d4..0000000 --- a/software/src/xz/src/common/mythread.h +++ /dev/null @@ -1,548 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file mythread.h -/// \brief Some threading related helper macros and functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef MYTHREAD_H -#define MYTHREAD_H - -#include "sysdefs.h" - -// If any type of threading is enabled, #define MYTHREAD_ENABLED. -#if defined(MYTHREAD_POSIX) || defined(MYTHREAD_WIN95) \ - || defined(MYTHREAD_VISTA) -# define MYTHREAD_ENABLED 1 -#endif - - -#ifdef MYTHREAD_ENABLED - -//////////////////////////////////////// -// Shared between all threading types // -//////////////////////////////////////// - -// Locks a mutex for a duration of a block. -// -// Perform mythread_mutex_lock(&mutex) in the beginning of a block -// and mythread_mutex_unlock(&mutex) at the end of the block. "break" -// may be used to unlock the mutex and jump out of the block. -// mythread_sync blocks may be nested. -// -// Example: -// -// mythread_sync(mutex) { -// foo(); -// if (some_error) -// break; // Skips bar() -// bar(); -// } -// -// At least GCC optimizes the loops completely away so it doesn't slow -// things down at all compared to plain mythread_mutex_lock(&mutex) -// and mythread_mutex_unlock(&mutex) calls. -// -#define mythread_sync(mutex) mythread_sync_helper1(mutex, __LINE__) -#define mythread_sync_helper1(mutex, line) mythread_sync_helper2(mutex, line) -#define mythread_sync_helper2(mutex, line) \ - for (unsigned int mythread_i_ ## line = 0; \ - mythread_i_ ## line \ - ? (mythread_mutex_unlock(&(mutex)), 0) \ - : (mythread_mutex_lock(&(mutex)), 1); \ - mythread_i_ ## line = 1) \ - for (unsigned int mythread_j_ ## line = 0; \ - !mythread_j_ ## line; \ - mythread_j_ ## line = 1) -#endif - - -#if !defined(MYTHREAD_ENABLED) - -////////////////// -// No threading // -////////////////// - -// Calls the given function once. This isn't thread safe. -#define mythread_once(func) \ -do { \ - static bool once_ = false; \ - if (!once_) { \ - func(); \ - once_ = true; \ - } \ -} while (0) - - -#if !(defined(_WIN32) && !defined(__CYGWIN__)) && !defined(__wasm__) -// Use sigprocmask() to set the signal mask in single-threaded programs. -#include - -static inline void -mythread_sigmask(int how, const sigset_t *restrict set, - sigset_t *restrict oset) -{ - int ret = sigprocmask(how, set, oset); - assert(ret == 0); - (void)ret; -} -#endif - - -#elif defined(MYTHREAD_POSIX) - -//////////////////// -// Using pthreads // -//////////////////// - -#include -#include -#include -#include - -// If clock_gettime() isn't available, use gettimeofday() from -// as a fallback. gettimeofday() is in SUSv2 and thus is supported on all -// relevant POSIX systems. -#ifndef HAVE_CLOCK_GETTIME -# include -#endif - -// MinGW-w64 with winpthreads: -// -// NOTE: Typical builds with MinGW-w64 don't use this code (MYTHREAD_POSIX). -// Instead, native Windows threading APIs are used (MYTHREAD_VISTA or -// MYTHREAD_WIN95). -// -// MinGW-w64 has _sigset_t (an integer type) in . -// If _POSIX was #defined, the header would add the alias sigset_t too. -// Let's keep this working even without _POSIX. -// -// There are no functions that actually do something with sigset_t -// because signals barely exist on Windows. The sigfillset macro below -// is just to silence warnings. There is no sigfillset() in MinGW-w64. -#ifdef __MINGW32__ -# include -# define sigset_t _sigset_t -# define sigfillset(set_ptr) do { *(set_ptr) = 0; } while (0) -#endif - -#define MYTHREAD_RET_TYPE void * -#define MYTHREAD_RET_VALUE NULL - -typedef pthread_t mythread; -typedef pthread_mutex_t mythread_mutex; - -typedef struct { - pthread_cond_t cond; -#ifdef HAVE_CLOCK_GETTIME - // Clock ID (CLOCK_REALTIME or CLOCK_MONOTONIC) associated with - // the condition variable. - clockid_t clk_id; -#endif -} mythread_cond; - -typedef struct timespec mythread_condtime; - - -// Calls the given function once in a thread-safe way. -#define mythread_once(func) \ - do { \ - static pthread_once_t once_ = PTHREAD_ONCE_INIT; \ - pthread_once(&once_, &func); \ - } while (0) - - -// Use pthread_sigmask() to set the signal mask in multi-threaded programs. -// Do nothing on OpenVMS since it lacks pthread_sigmask(). -// Do nothing on MinGW-w64 too to silence warnings (its pthread_sigmask() -// is #defined to 0 so it's a no-op). -static inline void -mythread_sigmask(int how, const sigset_t *restrict set, - sigset_t *restrict oset) -{ -#if defined(__VMS) || defined(__MINGW32__) - (void)how; - (void)set; - (void)oset; -#else - int ret = pthread_sigmask(how, set, oset); - assert(ret == 0); - (void)ret; -#endif -} - - -// Creates a new thread with all signals blocked. Returns zero on success -// and non-zero on error. -static inline int -mythread_create(mythread *thread, void *(*func)(void *arg), void *arg) -{ - sigset_t old; - sigset_t all; - sigfillset(&all); - - mythread_sigmask(SIG_SETMASK, &all, &old); - const int ret = pthread_create(thread, NULL, func, arg); - mythread_sigmask(SIG_SETMASK, &old, NULL); - - return ret; -} - -// Joins a thread. Returns zero on success and non-zero on error. -static inline int -mythread_join(mythread thread) -{ - return pthread_join(thread, NULL); -} - - -// Initializes a mutex. Returns zero on success and non-zero on error. -static inline int -mythread_mutex_init(mythread_mutex *mutex) -{ - return pthread_mutex_init(mutex, NULL); -} - -static inline void -mythread_mutex_destroy(mythread_mutex *mutex) -{ - int ret = pthread_mutex_destroy(mutex); - assert(ret == 0); - (void)ret; -} - -static inline void -mythread_mutex_lock(mythread_mutex *mutex) -{ - int ret = pthread_mutex_lock(mutex); - assert(ret == 0); - (void)ret; -} - -static inline void -mythread_mutex_unlock(mythread_mutex *mutex) -{ - int ret = pthread_mutex_unlock(mutex); - assert(ret == 0); - (void)ret; -} - - -// Initializes a condition variable. -// -// Using CLOCK_MONOTONIC instead of the default CLOCK_REALTIME makes the -// timeout in pthread_cond_timedwait() work correctly also if system time -// is suddenly changed. Unfortunately CLOCK_MONOTONIC isn't available -// everywhere while the default CLOCK_REALTIME is, so the default is -// used if CLOCK_MONOTONIC isn't available. -// -// If clock_gettime() isn't available at all, gettimeofday() will be used. -static inline int -mythread_cond_init(mythread_cond *mycond) -{ -#ifdef HAVE_CLOCK_GETTIME -# if defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && \ - defined(HAVE_CLOCK_MONOTONIC) - struct timespec ts; - pthread_condattr_t condattr; - - // POSIX doesn't seem to *require* that pthread_condattr_setclock() - // will fail if given an unsupported clock ID. Test that - // CLOCK_MONOTONIC really is supported using clock_gettime(). - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0 - && pthread_condattr_init(&condattr) == 0) { - int ret = pthread_condattr_setclock( - &condattr, CLOCK_MONOTONIC); - if (ret == 0) - ret = pthread_cond_init(&mycond->cond, &condattr); - - pthread_condattr_destroy(&condattr); - - if (ret == 0) { - mycond->clk_id = CLOCK_MONOTONIC; - return 0; - } - } - - // If anything above fails, fall back to the default CLOCK_REALTIME. - // POSIX requires that all implementations of clock_gettime() must - // support at least CLOCK_REALTIME. -# endif - - mycond->clk_id = CLOCK_REALTIME; -#endif - - return pthread_cond_init(&mycond->cond, NULL); -} - -static inline void -mythread_cond_destroy(mythread_cond *cond) -{ - int ret = pthread_cond_destroy(&cond->cond); - assert(ret == 0); - (void)ret; -} - -static inline void -mythread_cond_signal(mythread_cond *cond) -{ - int ret = pthread_cond_signal(&cond->cond); - assert(ret == 0); - (void)ret; -} - -static inline void -mythread_cond_wait(mythread_cond *cond, mythread_mutex *mutex) -{ - int ret = pthread_cond_wait(&cond->cond, mutex); - assert(ret == 0); - (void)ret; -} - -// Waits on a condition or until a timeout expires. If the timeout expires, -// non-zero is returned, otherwise zero is returned. -static inline int -mythread_cond_timedwait(mythread_cond *cond, mythread_mutex *mutex, - const mythread_condtime *condtime) -{ - int ret = pthread_cond_timedwait(&cond->cond, mutex, condtime); - assert(ret == 0 || ret == ETIMEDOUT); - return ret; -} - -// Sets condtime to the absolute time that is timeout_ms milliseconds -// in the future. The type of the clock to use is taken from cond. -static inline void -mythread_condtime_set(mythread_condtime *condtime, const mythread_cond *cond, - uint32_t timeout_ms) -{ - condtime->tv_sec = (time_t)(timeout_ms / 1000); - condtime->tv_nsec = (long)((timeout_ms % 1000) * 1000000); - -#ifdef HAVE_CLOCK_GETTIME - struct timespec now; - int ret = clock_gettime(cond->clk_id, &now); - assert(ret == 0); - (void)ret; - - condtime->tv_sec += now.tv_sec; - condtime->tv_nsec += now.tv_nsec; -#else - (void)cond; - - struct timeval now; - gettimeofday(&now, NULL); - - condtime->tv_sec += now.tv_sec; - condtime->tv_nsec += now.tv_usec * 1000L; -#endif - - // tv_nsec must stay in the range [0, 999_999_999]. - if (condtime->tv_nsec >= 1000000000L) { - condtime->tv_nsec -= 1000000000L; - ++condtime->tv_sec; - } -} - - -#elif defined(MYTHREAD_WIN95) || defined(MYTHREAD_VISTA) - -///////////////////// -// Windows threads // -///////////////////// - -#define WIN32_LEAN_AND_MEAN -#ifdef MYTHREAD_VISTA -# undef _WIN32_WINNT -# define _WIN32_WINNT 0x0600 -#endif -#include -#include - -#define MYTHREAD_RET_TYPE unsigned int __stdcall -#define MYTHREAD_RET_VALUE 0 - -typedef HANDLE mythread; -typedef CRITICAL_SECTION mythread_mutex; - -#ifdef MYTHREAD_WIN95 -typedef HANDLE mythread_cond; -#else -typedef CONDITION_VARIABLE mythread_cond; -#endif - -typedef struct { - // Tick count (milliseconds) in the beginning of the timeout. - // NOTE: This is 32 bits so it wraps around after 49.7 days. - // Multi-day timeouts may not work as expected. - DWORD start; - - // Length of the timeout in milliseconds. The timeout expires - // when the current tick count minus "start" is equal or greater - // than "timeout". - DWORD timeout; -} mythread_condtime; - - -// mythread_once() is only available with Vista threads. -#ifdef MYTHREAD_VISTA -#define mythread_once(func) \ - do { \ - static INIT_ONCE once_ = INIT_ONCE_STATIC_INIT; \ - BOOL pending_; \ - if (!InitOnceBeginInitialize(&once_, 0, &pending_, NULL)) \ - abort(); \ - if (pending_) { \ - func(); \ - if (!InitOnceComplete(&once_, 0, NULL)) \ - abort(); \ - } \ - } while (0) -#endif - - -// mythread_sigmask() isn't available on Windows. Even a dummy version would -// make no sense because the other POSIX signal functions are missing anyway. - - -static inline int -mythread_create(mythread *thread, - unsigned int (__stdcall *func)(void *arg), void *arg) -{ - uintptr_t ret = _beginthreadex(NULL, 0, func, arg, 0, NULL); - if (ret == 0) - return -1; - - *thread = (HANDLE)ret; - return 0; -} - -static inline int -mythread_join(mythread thread) -{ - int ret = 0; - - if (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0) - ret = -1; - - if (!CloseHandle(thread)) - ret = -1; - - return ret; -} - - -static inline int -mythread_mutex_init(mythread_mutex *mutex) -{ - InitializeCriticalSection(mutex); - return 0; -} - -static inline void -mythread_mutex_destroy(mythread_mutex *mutex) -{ - DeleteCriticalSection(mutex); -} - -static inline void -mythread_mutex_lock(mythread_mutex *mutex) -{ - EnterCriticalSection(mutex); -} - -static inline void -mythread_mutex_unlock(mythread_mutex *mutex) -{ - LeaveCriticalSection(mutex); -} - - -static inline int -mythread_cond_init(mythread_cond *cond) -{ -#ifdef MYTHREAD_WIN95 - *cond = CreateEvent(NULL, FALSE, FALSE, NULL); - return *cond == NULL ? -1 : 0; -#else - InitializeConditionVariable(cond); - return 0; -#endif -} - -static inline void -mythread_cond_destroy(mythread_cond *cond) -{ -#ifdef MYTHREAD_WIN95 - CloseHandle(*cond); -#else - (void)cond; -#endif -} - -static inline void -mythread_cond_signal(mythread_cond *cond) -{ -#ifdef MYTHREAD_WIN95 - SetEvent(*cond); -#else - WakeConditionVariable(cond); -#endif -} - -static inline void -mythread_cond_wait(mythread_cond *cond, mythread_mutex *mutex) -{ -#ifdef MYTHREAD_WIN95 - LeaveCriticalSection(mutex); - WaitForSingleObject(*cond, INFINITE); - EnterCriticalSection(mutex); -#else - BOOL ret = SleepConditionVariableCS(cond, mutex, INFINITE); - assert(ret); - (void)ret; -#endif -} - -static inline int -mythread_cond_timedwait(mythread_cond *cond, mythread_mutex *mutex, - const mythread_condtime *condtime) -{ -#ifdef MYTHREAD_WIN95 - LeaveCriticalSection(mutex); -#endif - - DWORD elapsed = GetTickCount() - condtime->start; - DWORD timeout = elapsed >= condtime->timeout - ? 0 : condtime->timeout - elapsed; - -#ifdef MYTHREAD_WIN95 - DWORD ret = WaitForSingleObject(*cond, timeout); - assert(ret == WAIT_OBJECT_0 || ret == WAIT_TIMEOUT); - - EnterCriticalSection(mutex); - - return ret == WAIT_TIMEOUT; -#else - BOOL ret = SleepConditionVariableCS(cond, mutex, timeout); - assert(ret || GetLastError() == ERROR_TIMEOUT); - return !ret; -#endif -} - -static inline void -mythread_condtime_set(mythread_condtime *condtime, const mythread_cond *cond, - uint32_t timeout) -{ - (void)cond; - condtime->start = GetTickCount(); - condtime->timeout = timeout; -} - -#endif - -#endif diff --git a/software/src/xz/src/common/sysdefs.h b/software/src/xz/src/common/sysdefs.h deleted file mode 100644 index b10ffa7..0000000 --- a/software/src/xz/src/common/sysdefs.h +++ /dev/null @@ -1,229 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file sysdefs.h -/// \brief Common includes, definitions, system-specific things etc. -/// -/// This file is used also by the lzma command line tool, that's why this -/// file is separate from common.h. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SYSDEFS_H -#define LZMA_SYSDEFS_H - -////////////// -// Includes // -////////////// - -#ifdef HAVE_CONFIG_H -# include -#endif - -// Choose if MinGW-w64's stdio replacement functions should be used. -// The default has varied slightly in the past so it's clearest to always -// set it explicitly. -// -// Modern MinGW-w64 enables the replacement functions even with UCRT -// when _GNU_SOURCE is defined. That's good because UCRT doesn't support -// the POSIX thousand separator flag in printf (like "%'u"). Otherwise -// XZ Utils works with the UCRT stdio functions. -// -// The replacement functions add over 20 KiB to each executable. For -// size-optimized builds (HAVE_SMALL), disable the replacements. -// Then thousand separators aren't shown in xz's messages but this is -// a minor downside compare to the slower speed of the HAVE_SMALL builds. -// -// The legacy MSVCRT is pre-C99 and it's best to always use the stdio -// replacements functions from MinGW-w64. -#if defined(__MINGW32__) && !defined(__USE_MINGW_ANSI_STDIO) -# define __USE_MINGW_ANSI_STDIO 1 -# include <_mingw.h> -# if defined(_UCRT) && defined(HAVE_SMALL) -# undef __USE_MINGW_ANSI_STDIO -# define __USE_MINGW_ANSI_STDIO 0 -# endif -#endif - -// size_t and NULL -#include - -#ifdef HAVE_INTTYPES_H -# include -#endif - -// C99 says that inttypes.h always includes stdint.h, but some systems -// don't do that, and require including stdint.h separately. -#ifdef HAVE_STDINT_H -# include -#endif - -// Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The -// limits are also used to figure out some macros missing from pre-C99 systems. -#include - -// Be more compatible with systems that have non-conforming inttypes.h. -// We assume that int is 32-bit and that long is either 32-bit or 64-bit. -// Full Autoconf test could be more correct, but this should work well enough. -// Note that this duplicates some code from lzma.h, but this is better since -// we can work without inttypes.h thanks to Autoconf tests. -#ifndef UINT32_C -# if UINT_MAX != 4294967295U -# error UINT32_C is not defined and unsigned int is not 32-bit. -# endif -# define UINT32_C(n) n ## U -#endif -#ifndef UINT32_MAX -# define UINT32_MAX UINT32_C(4294967295) -#endif -#ifndef PRIu32 -# define PRIu32 "u" -#endif -#ifndef PRIx32 -# define PRIx32 "x" -#endif -#ifndef PRIX32 -# define PRIX32 "X" -#endif - -#if ULONG_MAX == 4294967295UL -# ifndef UINT64_C -# define UINT64_C(n) n ## ULL -# endif -# ifndef PRIu64 -# define PRIu64 "llu" -# endif -# ifndef PRIx64 -# define PRIx64 "llx" -# endif -# ifndef PRIX64 -# define PRIX64 "llX" -# endif -#else -# ifndef UINT64_C -# define UINT64_C(n) n ## UL -# endif -# ifndef PRIu64 -# define PRIu64 "lu" -# endif -# ifndef PRIx64 -# define PRIx64 "lx" -# endif -# ifndef PRIX64 -# define PRIX64 "lX" -# endif -#endif -#ifndef UINT64_MAX -# define UINT64_MAX UINT64_C(18446744073709551615) -#endif - -// Incorrect(?) SIZE_MAX: -// - Interix headers typedef size_t to unsigned long, -// but a few lines later define SIZE_MAX to INT32_MAX. -// - SCO OpenServer (x86) headers typedef size_t to unsigned int -// but define SIZE_MAX to INT32_MAX. -#if defined(__INTERIX) || defined(_SCO_DS) -# undef SIZE_MAX -#endif - -// The code currently assumes that size_t is either 32-bit or 64-bit. -#ifndef SIZE_MAX -# if SIZEOF_SIZE_T == 4 -# define SIZE_MAX UINT32_MAX -# elif SIZEOF_SIZE_T == 8 -# define SIZE_MAX UINT64_MAX -# else -# error size_t is not 32-bit or 64-bit -# endif -#endif -#if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX -# error size_t is not 32-bit or 64-bit -#endif - -#include -#include - -// Pre-C99 systems lack stdbool.h. All the code in XZ Utils must be written -// so that it works with fake bool type, for example: -// -// bool foo = (flags & 0x100) != 0; -// bool bar = !!(flags & 0x100); -// -// This works with the real C99 bool but breaks with fake bool: -// -// bool baz = (flags & 0x100); -// -#ifdef HAVE_STDBOOL_H -# include -#else -# if ! HAVE__BOOL -typedef unsigned char _Bool; -# endif -# define bool _Bool -# define false 0 -# define true 1 -# define __bool_true_false_are_defined 1 -#endif - -// We may need alignas from C11/C17/C23. -#if __STDC_VERSION__ >= 202311 - // alignas is a keyword in C23. Do nothing. -#elif __STDC_VERSION__ >= 201112 - // Oracle Developer Studio 12.6 lacks . - // For simplicity, avoid the header with all C11/C17 compilers. -# define alignas _Alignas -#elif defined(__GNUC__) || defined(__clang__) -# define alignas(n) __attribute__((__aligned__(n))) -#else -# define alignas(n) -#endif - -#include - -// MSVC v19.00 (VS 2015 version 14.0) and later should work. -// -// MSVC v19.27 (VS 2019 version 16.7) added support for restrict. -// Older ones support only __restrict. -#ifdef _MSC_VER -# if _MSC_VER < 1927 && !defined(restrict) -# define restrict __restrict -# endif -#endif - -//////////// -// Macros // -//////////// - -#undef memzero -#define memzero(s, n) memset(s, 0, n) - -// NOTE: Avoid using MIN() and MAX(), because even conditionally defining -// those macros can cause some portability trouble, since on some systems -// the system headers insist defining their own versions. -#define my_min(x, y) ((x) < (y) ? (x) : (y)) -#define my_max(x, y) ((x) > (y) ? (x) : (y)) - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) -#endif - -#if defined(__GNUC__) \ - && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4) -# define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x))) -#else -# define lzma_attr_alloc_size(x) -#endif - -#if __STDC_VERSION__ >= 202311 -# define FALLTHROUGH [[__fallthrough__]] -#elif (defined(__GNUC__) && __GNUC__ >= 7) \ - || (defined(__clang_major__) && __clang_major__ >= 10) -# define FALLTHROUGH __attribute__((__fallthrough__)) -#else -# define FALLTHROUGH ((void)0) -#endif - -#endif diff --git a/software/src/xz/src/common/tuklib_common.h b/software/src/xz/src/common/tuklib_common.h deleted file mode 100644 index d73f072..0000000 --- a/software/src/xz/src/common/tuklib_common.h +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_common.h -/// \brief Common definitions for tuklib modules -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_COMMON_H -#define TUKLIB_COMMON_H - -// The config file may be replaced by a package-specific file. -// It should include at least stddef.h, stdbool.h, inttypes.h, and limits.h. -#include "tuklib_config.h" - -// TUKLIB_SYMBOL_PREFIX is prefixed to all symbols exported by -// the tuklib modules. If you use a tuklib module in a library, -// you should use TUKLIB_SYMBOL_PREFIX to make sure that there -// are no symbol conflicts in case someone links your library -// into application that also uses the same tuklib module. -#ifndef TUKLIB_SYMBOL_PREFIX -# define TUKLIB_SYMBOL_PREFIX -#endif - -#define TUKLIB_CAT_X(a, b) a ## b -#define TUKLIB_CAT(a, b) TUKLIB_CAT_X(a, b) - -#ifndef TUKLIB_SYMBOL -# define TUKLIB_SYMBOL(sym) TUKLIB_CAT(TUKLIB_SYMBOL_PREFIX, sym) -#endif - -#ifndef TUKLIB_DECLS_BEGIN -# ifdef __cplusplus -# define TUKLIB_DECLS_BEGIN extern "C" { -# else -# define TUKLIB_DECLS_BEGIN -# endif -#endif - -#ifndef TUKLIB_DECLS_END -# ifdef __cplusplus -# define TUKLIB_DECLS_END } -# else -# define TUKLIB_DECLS_END -# endif -#endif - -#if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define TUKLIB_GNUC_REQ(major, minor) \ - ((__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) \ - || __GNUC__ > (major)) -#else -# define TUKLIB_GNUC_REQ(major, minor) 0 -#endif - -#if defined(__GNUC__) || defined(__clang__) -# define tuklib_attr_format_printf(fmt_index, args_index) \ - __attribute__((__format__(__printf__, fmt_index, args_index))) -#else -# define tuklib_attr_format_printf(fmt_index, args_index) -#endif - -// tuklib_attr_noreturn attribute is used to mark functions as non-returning. -// We cannot use "noreturn" as the macro name because then C23 code that -// uses [[noreturn]] would break as it would expand to [[ [[noreturn]] ]]. -// -// tuklib_attr_noreturn must be used at the beginning of function declaration -// to work in all cases. The [[noreturn]] syntax is the most limiting, it -// must be even before any GNU C's __attribute__ keywords: -// -// tuklib_attr_noreturn -// __attribute__((nonnull(1))) -// extern void foo(const char *s); -// -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311 -# define tuklib_attr_noreturn [[noreturn]] -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 -# define tuklib_attr_noreturn _Noreturn -#elif TUKLIB_GNUC_REQ(2, 5) -# define tuklib_attr_noreturn __attribute__((__noreturn__)) -#elif defined(_MSC_VER) -# define tuklib_attr_noreturn __declspec(noreturn) -#else -# define tuklib_attr_noreturn -#endif - -#if (defined(_WIN32) && !defined(__CYGWIN__)) \ - || defined(__OS2__) || defined(__MSDOS__) -# define TUKLIB_DOSLIKE 1 -#endif - -#endif diff --git a/software/src/xz/src/common/tuklib_config.h b/software/src/xz/src/common/tuklib_config.h deleted file mode 100644 index b27251d..0000000 --- a/software/src/xz/src/common/tuklib_config.h +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// If config.h isn't available, assume that the headers required by -// tuklib_common.h are available. This is required by crc32_tablegen.c. -#ifdef HAVE_CONFIG_H -# include "sysdefs.h" -#else -# include -# include -# include -# include -#endif diff --git a/software/src/xz/src/common/tuklib_cpucores.c b/software/src/xz/src/common/tuklib_cpucores.c deleted file mode 100644 index c4a781a..0000000 --- a/software/src/xz/src/common/tuklib_cpucores.c +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_cpucores.c -/// \brief Get the number of CPU cores online -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_cpucores.h" - -#if defined(_WIN32) || defined(__CYGWIN__) -# ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0500 -# endif -# include - -// glibc >= 2.9 -#elif defined(TUKLIB_CPUCORES_SCHED_GETAFFINITY) -# include - -// FreeBSD -#elif defined(TUKLIB_CPUCORES_CPUSET) -# include -# include - -#elif defined(TUKLIB_CPUCORES_SYSCTL) -# ifdef HAVE_SYS_PARAM_H -# include -# endif -# include - -#elif defined(TUKLIB_CPUCORES_SYSCONF) -# include - -// HP-UX -#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) -# include -# include -#endif - - -extern uint32_t -tuklib_cpucores(void) -{ - uint32_t ret = 0; - -#if defined(_WIN32) || defined(__CYGWIN__) - SYSTEM_INFO sysinfo; - GetSystemInfo(&sysinfo); - ret = sysinfo.dwNumberOfProcessors; - -#elif defined(TUKLIB_CPUCORES_SCHED_GETAFFINITY) - cpu_set_t cpu_mask; - if (sched_getaffinity(0, sizeof(cpu_mask), &cpu_mask) == 0) - ret = (uint32_t)CPU_COUNT(&cpu_mask); - -#elif defined(TUKLIB_CPUCORES_CPUSET) - cpuset_t set; - if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, - sizeof(set), &set) == 0) { -# ifdef CPU_COUNT - ret = (uint32_t)CPU_COUNT(&set); -# else - for (unsigned i = 0; i < CPU_SETSIZE; ++i) - if (CPU_ISSET(i, &set)) - ++ret; -# endif - } - -#elif defined(TUKLIB_CPUCORES_SYSCTL) - // On OpenBSD HW_NCPUONLINE tells the number of processor cores that - // are online so it is preferred over HW_NCPU which also counts cores - // that aren't currently available. The number of cores online is - // often less than HW_NCPU because OpenBSD disables simultaneous - // multi-threading (SMT) by default. -# ifdef HW_NCPUONLINE - int name[2] = { CTL_HW, HW_NCPUONLINE }; -# else - int name[2] = { CTL_HW, HW_NCPU }; -# endif - int cpus; - size_t cpus_size = sizeof(cpus); - if (sysctl(name, 2, &cpus, &cpus_size, NULL, 0) != -1 - && cpus_size == sizeof(cpus) && cpus > 0) - ret = (uint32_t)cpus; - -#elif defined(TUKLIB_CPUCORES_SYSCONF) -# ifdef _SC_NPROCESSORS_ONLN - // Most systems - const long cpus = sysconf(_SC_NPROCESSORS_ONLN); -# else - // IRIX - const long cpus = sysconf(_SC_NPROC_ONLN); -# endif - if (cpus > 0) - ret = (uint32_t)cpus; - -#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) - struct pst_dynamic pst; - if (pstat_getdynamic(&pst, sizeof(pst), 1, 0) != -1) - ret = (uint32_t)pst.psd_proc_cnt; -#endif - - return ret; -} diff --git a/software/src/xz/src/common/tuklib_cpucores.h b/software/src/xz/src/common/tuklib_cpucores.h deleted file mode 100644 index edff939..0000000 --- a/software/src/xz/src/common/tuklib_cpucores.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_cpucores.h -/// \brief Get the number of CPU cores online -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_CPUCORES_H -#define TUKLIB_CPUCORES_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_cpucores TUKLIB_SYMBOL(tuklib_cpucores) -extern uint32_t tuklib_cpucores(void); - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_exit.c b/software/src/xz/src/common/tuklib_exit.c deleted file mode 100644 index c84e0f6..0000000 --- a/software/src/xz/src/common/tuklib_exit.c +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_exit.c -/// \brief Close stdout and stderr, and exit -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_common.h" - -#include -#include -#include - -#include "tuklib_gettext.h" -#include "tuklib_progname.h" -#include "tuklib_exit.h" - - -extern void -tuklib_exit(int status, int err_status, int show_error) -{ - if (status != err_status) { - // Close stdout. If something goes wrong, - // print an error message to stderr. - const int ferror_err = ferror(stdout); - const int fclose_err = fclose(stdout); - if (ferror_err || fclose_err) { - status = err_status; - - // If it was fclose() that failed, we have the reason - // in errno. If only ferror() indicated an error, - // we have no idea what the reason was. - if (show_error) - fprintf(stderr, "%s: %s: %s\n", progname, - _("Writing to standard " - "output failed"), - fclose_err ? strerror(errno) - : _("Unknown error")); - } - } - - if (status != err_status) { - // Close stderr. If something goes wrong, there's - // nothing where we could print an error message. - // Just set the exit status. - const int ferror_err = ferror(stderr); - const int fclose_err = fclose(stderr); - if (fclose_err || ferror_err) - status = err_status; - } - - exit(status); -} diff --git a/software/src/xz/src/common/tuklib_exit.h b/software/src/xz/src/common/tuklib_exit.h deleted file mode 100644 index d4e6b4a..0000000 --- a/software/src/xz/src/common/tuklib_exit.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_exit.h -/// \brief Close stdout and stderr, and exit -/// \note Requires tuklib_progname and tuklib_gettext modules -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_EXIT_H -#define TUKLIB_EXIT_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_exit TUKLIB_SYMBOL(tuklib_exit) -tuklib_attr_noreturn -extern void tuklib_exit(int status, int err_status, int show_error); - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_gettext.h b/software/src/xz/src/common/tuklib_gettext.h deleted file mode 100644 index e5ad5e6..0000000 --- a/software/src/xz/src/common/tuklib_gettext.h +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_gettext.h -/// \brief Wrapper for gettext and friends -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_GETTEXT_H -#define TUKLIB_GETTEXT_H - -#include "tuklib_common.h" -#include - -#ifndef TUKLIB_GETTEXT -# ifdef ENABLE_NLS -# define TUKLIB_GETTEXT 1 -# else -# define TUKLIB_GETTEXT 0 -# endif -#endif - -#if TUKLIB_GETTEXT -# include -# define tuklib_gettext_init(package, localedir) \ - do { \ - setlocale(LC_ALL, ""); \ - bindtextdomain(package, localedir); \ - textdomain(package); \ - } while (0) -# define _(msgid) gettext(msgid) -#else -# define tuklib_gettext_init(package, localedir) \ - setlocale(LC_ALL, "") -# define _(msgid) (msgid) -# define ngettext(msgid1, msgid2, n) ((n) == 1 ? (msgid1) : (msgid2)) -#endif -#define N_(msgid) msgid - -// Optional: Strings that are word wrapped using tuklib_mbstr_wrap may be -// marked with W_("foo) in the source code. xgettext can then add a comment -// to all such strings to inform translators. The following option needs to -// be added to XGETTEXT_OPTIONS in po/Makevars or in an equivalent place: -// -// '--keyword=W_:1,"This is word wrapped at spaces. The Unicode character U+00A0 works as a non-breaking space. Tab (\t) is interpret as a zero-width space (the tab itself is not displayed); U+200B is NOT supported. Manual word wrapping with \n is supported but requires care."' -// -// NOTE: The double-quotes in the --keyword argument above must be passed to -// xgettext as is, thus one needs the single-quotes in Makevars. -#define W_(msgid) _(msgid) - -#endif diff --git a/software/src/xz/src/common/tuklib_integer.h b/software/src/xz/src/common/tuklib_integer.h deleted file mode 100644 index 4026249..0000000 --- a/software/src/xz/src/common/tuklib_integer.h +++ /dev/null @@ -1,954 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_integer.h -/// \brief Various integer and bit operations -/// -/// This file provides macros or functions to do some basic integer and bit -/// operations. -/// -/// Native endian inline functions (XX = 16, 32, or 64): -/// - Unaligned native endian reads: readXXne(ptr) -/// - Unaligned native endian writes: writeXXne(ptr, num) -/// - Aligned native endian reads: aligned_readXXne(ptr) -/// - Aligned native endian writes: aligned_writeXXne(ptr, num) -/// -/// Endianness-converting integer operations (these can be macros!) -/// (XX = 16, 32, or 64; Y = b or l): -/// - Byte swapping: byteswapXX(num) -/// - Byte order conversions to/from native (byteswaps if Y isn't -/// the native endianness): convXXYe(num) -/// - Unaligned reads: readXXYe(ptr) -/// - Unaligned writes: writeXXYe(ptr, num) -/// - Aligned reads: aligned_readXXYe(ptr) -/// - Aligned writes: aligned_writeXXYe(ptr, num) -/// -/// Since the above can macros, the arguments should have no side effects -/// because they may be evaluated more than once. -/// -/// Bit scan operations for non-zero 32-bit integers (inline functions): -/// - Bit scan reverse (find highest non-zero bit): bsr32(num) -/// - Count leading zeros: clz32(num) -/// - Count trailing zeros: ctz32(num) -/// - Bit scan forward (simply an alias for ctz32()): bsf32(num) -/// -/// The above bit scan operations return 0-31. If num is zero, -/// the result is undefined. -// -// Authors: Lasse Collin -// Joachim Henke -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_INTEGER_H -#define TUKLIB_INTEGER_H - -#include "tuklib_common.h" -#include - -// Newer Intel C compilers require immintrin.h for _bit_scan_reverse() -// and such functions. -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) -# include -// Only include when it is needed. GCC and Clang can both -// use __builtin's, so we only need Windows instrincs when using MSVC. -// GCC and Clang can set _MSC_VER on Windows, so we need to exclude these -// cases explicitly. -#elif defined(_MSC_VER) && !TUKLIB_GNUC_REQ(3, 4) && !defined(__clang__) -# include -#endif - - -/////////////////// -// Byte swapping // -/////////////////// - -#if defined(HAVE___BUILTIN_BSWAPXX) - // GCC >= 4.8 and Clang -# define byteswap16(num) __builtin_bswap16(num) -# define byteswap32(num) __builtin_bswap32(num) -# define byteswap64(num) __builtin_bswap64(num) - -#elif defined(HAVE_BYTESWAP_H) - // glibc, uClibc, dietlibc -# include -# ifdef HAVE_BSWAP_16 -# define byteswap16(num) bswap_16(num) -# endif -# ifdef HAVE_BSWAP_32 -# define byteswap32(num) bswap_32(num) -# endif -# ifdef HAVE_BSWAP_64 -# define byteswap64(num) bswap_64(num) -# endif - -#elif defined(HAVE_SYS_ENDIAN_H) - // *BSDs and Darwin -# include -# ifdef __OpenBSD__ -# define byteswap16(num) swap16(num) -# define byteswap32(num) swap32(num) -# define byteswap64(num) swap64(num) -# else -# define byteswap16(num) bswap16(num) -# define byteswap32(num) bswap32(num) -# define byteswap64(num) bswap64(num) -# endif - -#elif defined(HAVE_SYS_BYTEORDER_H) - // Solaris -# include -# ifdef BSWAP_16 -# define byteswap16(num) BSWAP_16(num) -# endif -# ifdef BSWAP_32 -# define byteswap32(num) BSWAP_32(num) -# endif -# ifdef BSWAP_64 -# define byteswap64(num) BSWAP_64(num) -# endif -# ifdef BE_16 -# define conv16be(num) BE_16(num) -# endif -# ifdef BE_32 -# define conv32be(num) BE_32(num) -# endif -# ifdef BE_64 -# define conv64be(num) BE_64(num) -# endif -# ifdef LE_16 -# define conv16le(num) LE_16(num) -# endif -# ifdef LE_32 -# define conv32le(num) LE_32(num) -# endif -# ifdef LE_64 -# define conv64le(num) LE_64(num) -# endif -#endif - -#ifndef byteswap16 -# define byteswap16(n) (uint16_t)( \ - (((n) & 0x00FFU) << 8) \ - | (((n) & 0xFF00U) >> 8) \ - ) -#endif - -#ifndef byteswap32 -# define byteswap32(n) (uint32_t)( \ - (((n) & UINT32_C(0x000000FF)) << 24) \ - | (((n) & UINT32_C(0x0000FF00)) << 8) \ - | (((n) & UINT32_C(0x00FF0000)) >> 8) \ - | (((n) & UINT32_C(0xFF000000)) >> 24) \ - ) -#endif - -#ifndef byteswap64 -# define byteswap64(n) (uint64_t)( \ - (((n) & UINT64_C(0x00000000000000FF)) << 56) \ - | (((n) & UINT64_C(0x000000000000FF00)) << 40) \ - | (((n) & UINT64_C(0x0000000000FF0000)) << 24) \ - | (((n) & UINT64_C(0x00000000FF000000)) << 8) \ - | (((n) & UINT64_C(0x000000FF00000000)) >> 8) \ - | (((n) & UINT64_C(0x0000FF0000000000)) >> 24) \ - | (((n) & UINT64_C(0x00FF000000000000)) >> 40) \ - | (((n) & UINT64_C(0xFF00000000000000)) >> 56) \ - ) -#endif - -// Define conversion macros using the basic byte swapping macros. -#ifdef WORDS_BIGENDIAN -# ifndef conv16be -# define conv16be(num) ((uint16_t)(num)) -# endif -# ifndef conv32be -# define conv32be(num) ((uint32_t)(num)) -# endif -# ifndef conv64be -# define conv64be(num) ((uint64_t)(num)) -# endif -# ifndef conv16le -# define conv16le(num) byteswap16(num) -# endif -# ifndef conv32le -# define conv32le(num) byteswap32(num) -# endif -# ifndef conv64le -# define conv64le(num) byteswap64(num) -# endif -#else -# ifndef conv16be -# define conv16be(num) byteswap16(num) -# endif -# ifndef conv32be -# define conv32be(num) byteswap32(num) -# endif -# ifndef conv64be -# define conv64be(num) byteswap64(num) -# endif -# ifndef conv16le -# define conv16le(num) ((uint16_t)(num)) -# endif -# ifndef conv32le -# define conv32le(num) ((uint32_t)(num)) -# endif -# ifndef conv64le -# define conv64le(num) ((uint64_t)(num)) -# endif -#endif - - -//////////////////////////////// -// Unaligned reads and writes // -//////////////////////////////// - -// No-strict-align archs like x86-64 -// --------------------------------- -// -// The traditional way of casting e.g. *(const uint16_t *)uint8_pointer -// is bad even if the uint8_pointer is properly aligned because this kind -// of casts break strict aliasing rules and result in undefined behavior. -// With unaligned pointers it's even worse: compilers may emit vector -// instructions that require aligned pointers even if non-vector -// instructions work with unaligned pointers. -// -// Using memcpy() is the standard compliant way to do unaligned access. -// Many modern compilers inline it so there is no function call overhead. -// For those compilers that don't handle the memcpy() method well, the -// old casting method (that violates strict aliasing) can be requested at -// build time. A third method, casting to a packed struct, would also be -// an option but isn't provided to keep things simpler (it's already a mess). -// Hopefully this is flexible enough in practice. -// -// Some compilers on x86-64 like Clang >= 10 and GCC >= 5.1 detect that -// -// buf[0] | (buf[1] << 8) -// -// reads a 16-bit value and can emit a single 16-bit load and produce -// identical code than with the memcpy() method. In other cases Clang and GCC -// produce either the same or better code with memcpy(). For example, Clang 9 -// on x86-64 can detect 32-bit load but not 16-bit load. -// -// MSVC uses unaligned access with the memcpy() method but emits byte-by-byte -// code for "buf[0] | (buf[1] << 8)". -// -// Conclusion: The memcpy() method is the best choice when unaligned access -// is supported. -// -// Strict-align archs like SPARC -// ----------------------------- -// -// GCC versions from around 4.x to to at least 13.2.0 produce worse code -// from the memcpy() method than from simple byte-by-byte shift-or code -// when reading a 32-bit integer: -// -// (1) It may be constructed on stack using four 8-bit loads, -// four 8-bit stores to stack, and finally one 32-bit load from stack. -// -// (2) Especially with -Os, an actual memcpy() call may be emitted. -// -// This is true on at least on ARM, ARM64, SPARC, SPARC64, MIPS64EL, and -// RISC-V. Of these, ARM, ARM64, and RISC-V support unaligned access in -// some processors but not all so this is relevant only in the case when -// GCC assumes that unaligned is not supported or -mstrict-align or -// -mno-unaligned-access is used. -// -// For Clang it makes little difference. ARM64 with -O2 -mstrict-align -// was one the very few with a minor difference: the memcpy() version -// was one instruction longer. -// -// Conclusion: At least in case of GCC and Clang, byte-by-byte code is -// the best choice for strict-align archs to do unaligned access. -// -// See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111502 -// -// Thanks to it was easy to test different compilers. -// The following is for little endian targets: -/* -#include -#include - -uint32_t bytes16(const uint8_t *b) -{ - return (uint32_t)b[0] - | ((uint32_t)b[1] << 8); -} - -uint32_t copy16(const uint8_t *b) -{ - uint16_t v; - memcpy(&v, b, sizeof(v)); - return v; -} - -uint32_t bytes32(const uint8_t *b) -{ - return (uint32_t)b[0] - | ((uint32_t)b[1] << 8) - | ((uint32_t)b[2] << 16) - | ((uint32_t)b[3] << 24); -} - -uint32_t copy32(const uint8_t *b) -{ - uint32_t v; - memcpy(&v, b, sizeof(v)); - return v; -} - -void wbytes16(uint8_t *b, uint16_t v) -{ - b[0] = (uint8_t)v; - b[1] = (uint8_t)(v >> 8); -} - -void wcopy16(uint8_t *b, uint16_t v) -{ - memcpy(b, &v, sizeof(v)); -} - -void wbytes32(uint8_t *b, uint32_t v) -{ - b[0] = (uint8_t)v; - b[1] = (uint8_t)(v >> 8); - b[2] = (uint8_t)(v >> 16); - b[3] = (uint8_t)(v >> 24); -} - -void wcopy32(uint8_t *b, uint32_t v) -{ - memcpy(b, &v, sizeof(v)); -} -*/ - - -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS - -static inline uint16_t -read16ne(const uint8_t *buf) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - return *(const uint16_t *)buf; -#else - uint16_t num; - memcpy(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline uint32_t -read32ne(const uint8_t *buf) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - return *(const uint32_t *)buf; -#else - uint32_t num; - memcpy(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline uint64_t -read64ne(const uint8_t *buf) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - return *(const uint64_t *)buf; -#else - uint64_t num; - memcpy(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline void -write16ne(uint8_t *buf, uint16_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint16_t *)buf = num; -#else - memcpy(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline void -write32ne(uint8_t *buf, uint32_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint32_t *)buf = num; -#else - memcpy(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline void -write64ne(uint8_t *buf, uint64_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint64_t *)buf = num; -#else - memcpy(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline uint16_t -read16be(const uint8_t *buf) -{ - uint16_t num = read16ne(buf); - return conv16be(num); -} - - -static inline uint16_t -read16le(const uint8_t *buf) -{ - uint16_t num = read16ne(buf); - return conv16le(num); -} - - -static inline uint32_t -read32be(const uint8_t *buf) -{ - uint32_t num = read32ne(buf); - return conv32be(num); -} - - -static inline uint32_t -read32le(const uint8_t *buf) -{ - uint32_t num = read32ne(buf); - return conv32le(num); -} - - -static inline uint64_t -read64be(const uint8_t *buf) -{ - uint64_t num = read64ne(buf); - return conv64be(num); -} - - -static inline uint64_t -read64le(const uint8_t *buf) -{ - uint64_t num = read64ne(buf); - return conv64le(num); -} - - -// NOTE: Possible byte swapping must be done in a macro to allow the compiler -// to optimize byte swapping of constants when using glibc's or *BSD's -// byte swapping macros. The actual write is done in an inline function -// to make type checking of the buf pointer possible. -#define write16be(buf, num) write16ne(buf, conv16be(num)) -#define write32be(buf, num) write32ne(buf, conv32be(num)) -#define write64be(buf, num) write64ne(buf, conv64be(num)) -#define write16le(buf, num) write16ne(buf, conv16le(num)) -#define write32le(buf, num) write32ne(buf, conv32le(num)) -#define write64le(buf, num) write64ne(buf, conv64le(num)) - -#else - -#ifdef WORDS_BIGENDIAN -# define read16ne read16be -# define read32ne read32be -# define read64ne read64be -# define write16ne write16be -# define write32ne write32be -# define write64ne write64be -#else -# define read16ne read16le -# define read32ne read32le -# define read64ne read64le -# define write16ne write16le -# define write32ne write32le -# define write64ne write64le -#endif - - -static inline uint16_t -read16be(const uint8_t *buf) -{ - uint16_t num = ((uint16_t)buf[0] << 8) | (uint16_t)buf[1]; - return num; -} - - -static inline uint16_t -read16le(const uint8_t *buf) -{ - uint16_t num = ((uint16_t)buf[0]) | ((uint16_t)buf[1] << 8); - return num; -} - - -static inline uint32_t -read32be(const uint8_t *buf) -{ - uint32_t num = (uint32_t)buf[0] << 24; - num |= (uint32_t)buf[1] << 16; - num |= (uint32_t)buf[2] << 8; - num |= (uint32_t)buf[3]; - return num; -} - - -static inline uint32_t -read32le(const uint8_t *buf) -{ - uint32_t num = (uint32_t)buf[0]; - num |= (uint32_t)buf[1] << 8; - num |= (uint32_t)buf[2] << 16; - num |= (uint32_t)buf[3] << 24; - return num; -} - - -static inline uint64_t -read64be(const uint8_t *buf) -{ - uint64_t num = (uint64_t)buf[0] << 56; - num |= (uint64_t)buf[1] << 48; - num |= (uint64_t)buf[2] << 40; - num |= (uint64_t)buf[3] << 32; - num |= (uint64_t)buf[4] << 24; - num |= (uint64_t)buf[5] << 16; - num |= (uint64_t)buf[6] << 8; - num |= (uint64_t)buf[7]; - return num; -} - - -static inline uint64_t -read64le(const uint8_t *buf) -{ - uint64_t num = (uint64_t)buf[0]; - num |= (uint64_t)buf[1] << 8; - num |= (uint64_t)buf[2] << 16; - num |= (uint64_t)buf[3] << 24; - num |= (uint64_t)buf[4] << 32; - num |= (uint64_t)buf[5] << 40; - num |= (uint64_t)buf[6] << 48; - num |= (uint64_t)buf[7] << 56; - return num; -} - - -static inline void -write16be(uint8_t *buf, uint16_t num) -{ - buf[0] = (uint8_t)(num >> 8); - buf[1] = (uint8_t)num; - return; -} - - -static inline void -write16le(uint8_t *buf, uint16_t num) -{ - buf[0] = (uint8_t)num; - buf[1] = (uint8_t)(num >> 8); - return; -} - - -static inline void -write32be(uint8_t *buf, uint32_t num) -{ - buf[0] = (uint8_t)(num >> 24); - buf[1] = (uint8_t)(num >> 16); - buf[2] = (uint8_t)(num >> 8); - buf[3] = (uint8_t)num; - return; -} - - -static inline void -write32le(uint8_t *buf, uint32_t num) -{ - buf[0] = (uint8_t)num; - buf[1] = (uint8_t)(num >> 8); - buf[2] = (uint8_t)(num >> 16); - buf[3] = (uint8_t)(num >> 24); - return; -} - - -static inline void -write64be(uint8_t *buf, uint64_t num) -{ - buf[0] = (uint8_t)(num >> 56); - buf[1] = (uint8_t)(num >> 48); - buf[2] = (uint8_t)(num >> 40); - buf[3] = (uint8_t)(num >> 32); - buf[4] = (uint8_t)(num >> 24); - buf[5] = (uint8_t)(num >> 16); - buf[6] = (uint8_t)(num >> 8); - buf[7] = (uint8_t)num; - return; -} - - -static inline void -write64le(uint8_t *buf, uint64_t num) -{ - buf[0] = (uint8_t)num; - buf[1] = (uint8_t)(num >> 8); - buf[2] = (uint8_t)(num >> 16); - buf[3] = (uint8_t)(num >> 24); - buf[4] = (uint8_t)(num >> 32); - buf[5] = (uint8_t)(num >> 40); - buf[6] = (uint8_t)(num >> 48); - buf[7] = (uint8_t)(num >> 56); - return; -} - -#endif - - -////////////////////////////// -// Aligned reads and writes // -////////////////////////////// - -// Separate functions for aligned reads and writes are provided since on -// strict-align archs aligned access is much faster than unaligned access. -// -// Just like in the unaligned case, memcpy() is needed to avoid -// strict aliasing violations. However, on archs that don't support -// unaligned access the compiler cannot know that the pointers given -// to memcpy() are aligned which results in slow code. As of C11 there is -// no standard way to tell the compiler that we know that the address is -// aligned but some compilers have language extensions to do that. With -// such language extensions the memcpy() method gives excellent results. -// -// What to do on a strict-align system when no known language extensions -// are available? Falling back to byte-by-byte access would be safe but ruin -// optimizations that have been made specifically with aligned access in mind. -// As a compromise, aligned reads will fall back to non-compliant type punning -// but aligned writes will be byte-by-byte, that is, fast reads are preferred -// over fast writes. This obviously isn't great but hopefully it's a working -// compromise for now. -// -// __builtin_assume_aligned is support by GCC >= 4.7 and clang >= 3.6. -#ifdef HAVE___BUILTIN_ASSUME_ALIGNED -# define tuklib_memcpy_aligned(dest, src, size) \ - memcpy(dest, __builtin_assume_aligned(src, size), size) -#else -# define tuklib_memcpy_aligned(dest, src, size) \ - memcpy(dest, src, size) -# ifndef TUKLIB_FAST_UNALIGNED_ACCESS -# define TUKLIB_USE_UNSAFE_ALIGNED_READS 1 -# endif -#endif - - -static inline uint16_t -aligned_read16ne(const uint8_t *buf) -{ -#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ - || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) - return *(const uint16_t *)buf; -#else - uint16_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline uint32_t -aligned_read32ne(const uint8_t *buf) -{ -#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ - || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) - return *(const uint32_t *)buf; -#else - uint32_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline uint64_t -aligned_read64ne(const uint8_t *buf) -{ -#if defined(TUKLIB_USE_UNSAFE_TYPE_PUNNING) \ - || defined(TUKLIB_USE_UNSAFE_ALIGNED_READS) - return *(const uint64_t *)buf; -#else - uint64_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); - return num; -#endif -} - - -static inline void -aligned_write16ne(uint8_t *buf, uint16_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint16_t *)buf = num; -#else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline void -aligned_write32ne(uint8_t *buf, uint32_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint32_t *)buf = num; -#else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline void -aligned_write64ne(uint8_t *buf, uint64_t num) -{ -#ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING - *(uint64_t *)buf = num; -#else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); -#endif - return; -} - - -static inline uint16_t -aligned_read16be(const uint8_t *buf) -{ - uint16_t num = aligned_read16ne(buf); - return conv16be(num); -} - - -static inline uint16_t -aligned_read16le(const uint8_t *buf) -{ - uint16_t num = aligned_read16ne(buf); - return conv16le(num); -} - - -static inline uint32_t -aligned_read32be(const uint8_t *buf) -{ - uint32_t num = aligned_read32ne(buf); - return conv32be(num); -} - - -static inline uint32_t -aligned_read32le(const uint8_t *buf) -{ - uint32_t num = aligned_read32ne(buf); - return conv32le(num); -} - - -static inline uint64_t -aligned_read64be(const uint8_t *buf) -{ - uint64_t num = aligned_read64ne(buf); - return conv64be(num); -} - - -static inline uint64_t -aligned_read64le(const uint8_t *buf) -{ - uint64_t num = aligned_read64ne(buf); - return conv64le(num); -} - - -// These need to be macros like in the unaligned case. -#define aligned_write16be(buf, num) aligned_write16ne((buf), conv16be(num)) -#define aligned_write16le(buf, num) aligned_write16ne((buf), conv16le(num)) -#define aligned_write32be(buf, num) aligned_write32ne((buf), conv32be(num)) -#define aligned_write32le(buf, num) aligned_write32ne((buf), conv32le(num)) -#define aligned_write64be(buf, num) aligned_write64ne((buf), conv64be(num)) -#define aligned_write64le(buf, num) aligned_write64ne((buf), conv64le(num)) - - -//////////////////// -// Bit operations // -//////////////////// - -static inline uint32_t -bsr32(uint32_t n) -{ - // Check for ICC first, since it tends to define __GNUC__ too. -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(n); - -#elif (TUKLIB_GNUC_REQ(3, 4) || defined(__clang__)) && UINT_MAX == UINT32_MAX - // GCC >= 3.4 has __builtin_clz(), which gives good results on - // multiple architectures. On x86, __builtin_clz() ^ 31U becomes - // either plain BSR (so the XOR gets optimized away) or LZCNT and - // XOR (if -march indicates that SSE4a instructions are supported). - return (uint32_t)__builtin_clz(n) ^ 31U; - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsrl %1, %0" : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) - unsigned long i; - _BitScanReverse(&i, n); - return i; - -#else - uint32_t i = 31; - - if ((n & 0xFFFF0000) == 0) { - n <<= 16; - i = 15; - } - - if ((n & 0xFF000000) == 0) { - n <<= 8; - i -= 8; - } - - if ((n & 0xF0000000) == 0) { - n <<= 4; - i -= 4; - } - - if ((n & 0xC0000000) == 0) { - n <<= 2; - i -= 2; - } - - if ((n & 0x80000000) == 0) - --i; - - return i; -#endif -} - - -static inline uint32_t -clz32(uint32_t n) -{ -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(n) ^ 31U; - -#elif (TUKLIB_GNUC_REQ(3, 4) || defined(__clang__)) && UINT_MAX == UINT32_MAX - return (uint32_t)__builtin_clz(n); - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsrl %1, %0\n\t" - "xorl $31, %0" - : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) - unsigned long i; - _BitScanReverse(&i, n); - return i ^ 31U; - -#else - uint32_t i = 0; - - if ((n & 0xFFFF0000) == 0) { - n <<= 16; - i = 16; - } - - if ((n & 0xFF000000) == 0) { - n <<= 8; - i += 8; - } - - if ((n & 0xF0000000) == 0) { - n <<= 4; - i += 4; - } - - if ((n & 0xC0000000) == 0) { - n <<= 2; - i += 2; - } - - if ((n & 0x80000000) == 0) - ++i; - - return i; -#endif -} - - -static inline uint32_t -ctz32(uint32_t n) -{ -#if defined(__INTEL_COMPILER) - return _bit_scan_forward(n); - -#elif (TUKLIB_GNUC_REQ(3, 4) || defined(__clang__)) && UINT_MAX >= UINT32_MAX - return (uint32_t)__builtin_ctz(n); - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsfl %1, %0" : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) - unsigned long i; - _BitScanForward(&i, n); - return i; - -#else - uint32_t i = 0; - - if ((n & 0x0000FFFF) == 0) { - n >>= 16; - i = 16; - } - - if ((n & 0x000000FF) == 0) { - n >>= 8; - i += 8; - } - - if ((n & 0x0000000F) == 0) { - n >>= 4; - i += 4; - } - - if ((n & 0x00000003) == 0) { - n >>= 2; - i += 2; - } - - if ((n & 0x00000001) == 0) - ++i; - - return i; -#endif -} - -#define bsf32 ctz32 - -#endif diff --git a/software/src/xz/src/common/tuklib_mbstr.h b/software/src/xz/src/common/tuklib_mbstr.h deleted file mode 100644 index 5ac06eb..0000000 --- a/software/src/xz/src/common/tuklib_mbstr.h +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr.h -/// \brief Utility functions for handling multibyte strings -/// -/// If not enough multibyte string support is available in the C library, -/// these functions keep working with the assumption that all strings -/// are in a single-byte character set without combining characters, e.g. -/// US-ASCII or ISO-8859-*. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_MBSTR_H -#define TUKLIB_MBSTR_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_mbstr_width TUKLIB_SYMBOL(tuklib_mbstr_width) -extern size_t tuklib_mbstr_width(const char *str, size_t *bytes); -///< -/// \brief Get the number of columns needed for the multibyte string -/// -/// This is somewhat similar to wcswidth() but works on multibyte strings. -/// -/// \param str String whose width is to be calculated. -/// \param bytes If this is not NULL, *bytes is set to the -/// value returned by strlen(str) (even if an -/// error occurs when calculating the width). -/// -/// \return On success, the number of columns needed to display the -/// string e.g. in a terminal emulator is returned. On error, -/// (size_t)-1 is returned. Possible errors include invalid, -/// partial, or non-printable multibyte character in str. - -#define tuklib_mbstr_width_mem TUKLIB_SYMBOL(tuklib_mbstr_width_mem) -extern size_t tuklib_mbstr_width_mem(const char *str, size_t len); -///< -/// \brief Get the number of columns needed for the multibyte buffer -/// -/// This is like tuklib_mbstr_width() except that this takes the buffer -/// length in bytes as the second argument. This allows using the function -/// for buffers that aren't terminated with '\0'. -/// -/// \param str String whose width is to be calculated. -/// \param len Number of bytes to read from str. -/// -/// \return On success, the number of columns needed to display the -/// string e.g. in a terminal emulator is returned. On error, -/// (size_t)-1 is returned. Possible errors include invalid, -/// partial, or non-printable multibyte character in str. - -#define tuklib_mbstr_fw TUKLIB_SYMBOL(tuklib_mbstr_fw) -extern int tuklib_mbstr_fw(const char *str, int columns_min); -///< -/// \brief Get the field width for printf() e.g. to align table columns -/// -/// Printing simple tables to a terminal can be done using the field field -/// feature in the printf() format string, but it works only with single-byte -/// character sets. To do the same with multibyte strings, tuklib_mbstr_fw() -/// can be used to calculate appropriate field width. -/// -/// The behavior of this function is undefined, if -/// - str is NULL or not terminated with '\0'; -/// - columns_min <= 0; or -/// - the calculated field width exceeds INT_MAX. -/// -/// \return If tuklib_mbstr_width(str, NULL) fails, -1 is returned. -/// If str needs more columns than columns_min, zero is returned. -/// Otherwise a positive integer is returned, which can be -/// used as the field width, e.g. printf("%*s", fw, str). - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_mbstr_fw.c b/software/src/xz/src/common/tuklib_mbstr_fw.c deleted file mode 100644 index 22d883b..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_fw.c +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_fw.c -/// \brief Get the field width for printf() e.g. to align table columns -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_mbstr.h" - - -extern int -tuklib_mbstr_fw(const char *str, int columns_min) -{ - size_t len; - const size_t width = tuklib_mbstr_width(str, &len); - if (width == (size_t)-1) - return -1; - - if (width > (size_t)columns_min) - return 0; - - if (width < (size_t)columns_min) - len += (size_t)columns_min - width; - - return (int)len; -} diff --git a/software/src/xz/src/common/tuklib_mbstr_nonprint.c b/software/src/xz/src/common/tuklib_mbstr_nonprint.c deleted file mode 100644 index dc77875..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_nonprint.c +++ /dev/null @@ -1,162 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_nonprint.c -/// \brief Find and replace non-printable characters with question marks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_mbstr_nonprint.h" -#include -#include -#include - -#ifdef HAVE_MBRTOWC -# include -# include -#else -# include -#endif - - -static bool -is_next_printable(const char *str, size_t len, size_t *next_len) -{ -#ifdef HAVE_MBRTOWC - // This assumes that character sets with locking shift states aren't - // used, and thus mbsinit() is never needed. - mbstate_t ps; - memset(&ps, 0, sizeof(ps)); - - wchar_t wc; - *next_len = mbrtowc(&wc, str, len, &ps); - - if (*next_len == (size_t)-2) { - // Incomplete multibyte sequence: Treat the whole sequence - // as a single non-printable multibyte character that ends - // the string. - *next_len = len; - return false; - } - - // Check more broadly than just ret == (size_t)-1 to be safe - // in case mbrtowc() returns something weird. This check - // covers (size_t)-1 (that is, SIZE_MAX) too because len is from - // strlen() and the terminating '\0' isn't part of the length. - if (*next_len < 1 || *next_len > len) { - // Invalid multibyte sequence: Treat the first byte as - // a non-printable single-byte character. Decoding will - // be restarted from the next byte on the next call to - // this function. - *next_len = 1; - return false; - } - -# if defined(_WIN32) && !defined(__CYGWIN__) - // On Windows, wchar_t stores UTF-16 code units, thus characters - // outside the Basic Multilingual Plane (BMP) don't fit into - // a single wchar_t. In an UTF-8 locale, UCRT's mbrtowc() returns - // successfully when the input is a non-BMP character but the - // output is the replacement character U+FFFD. - // - // iswprint() returns 0 for U+FFFD on Windows for some reason. Treat - // U+FFFD as printable and thus also all non-BMP chars as printable. - if (wc == 0xFFFD) - return true; -# endif - - return iswprint((wint_t)wc) != 0; -#else - (void)len; - *next_len = 1; - return isprint((unsigned char)str[0]) != 0; -#endif -} - - -static bool -has_nonprint(const char *str, size_t len) -{ - for (size_t i = 0; i < len; ) { - size_t next_len; - if (!is_next_printable(str + i, len - i, &next_len)) - return true; - - i += next_len; - } - - return false; -} - - -extern bool -tuklib_has_nonprint(const char *str) -{ - const int saved_errno = errno; - const bool ret = has_nonprint(str, strlen(str)); - errno = saved_errno; - return ret; -} - - -extern const char * -tuklib_mask_nonprint_r(const char *str, char **mem) -{ - const int saved_errno = errno; - - // Free the old string, if any. - free(*mem); - *mem = NULL; - - // If the whole input string contains only printable characters, - // return the input string. - const size_t len = strlen(str); - if (!has_nonprint(str, len)) { - errno = saved_errno; - return str; - } - - // Allocate memory for the masked string. Since we use the single-byte - // character '?' to mask non-printable characters, it's possible that - // a few bytes less memory would be needed in reality if multibyte - // characters are masked. - // - // If allocation fails, return "???" because it should be safer than - // returning the unmasked string. - *mem = malloc(len + 1); - if (*mem == NULL) { - errno = saved_errno; - return "???"; - } - - // Replace all non-printable characters with '?'. - char *dest = *mem; - - for (size_t i = 0; i < len; ) { - size_t next_len; - if (is_next_printable(str + i, len - i, &next_len)) { - memcpy(dest, str + i, next_len); - dest += next_len; - } else { - *dest++ = '?'; - } - - i += next_len; - } - - *dest = '\0'; - - errno = saved_errno; - return *mem; -} - - -extern const char * -tuklib_mask_nonprint(const char *str) -{ - static char *mem = NULL; - return tuklib_mask_nonprint_r(str, &mem); -} diff --git a/software/src/xz/src/common/tuklib_mbstr_nonprint.h b/software/src/xz/src/common/tuklib_mbstr_nonprint.h deleted file mode 100644 index 6fc9691..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_nonprint.h +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_nonprint.h -/// \brief Find and replace non-printable characters with question marks -/// -/// If mbrtowc(3) is available, it and iswprint(3) is used to check if all -/// characters are printable. Otherwise single-byte character set is assumed -/// and isprint(3) is used. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_MBSTR_NONPRINT_H -#define TUKLIB_MBSTR_NONPRINT_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_has_nonprint TUKLIB_SYMBOL(tuklib_has_nonprint) -extern bool tuklib_has_nonprint(const char *str); -///< -/// \brief Check if a string contains any non-printable characters -/// -/// \return false if str contains only valid multibyte characters and -/// iswprint(3) returns non-zero for all of them; true otherwise. -/// The value of errno is preserved. -/// -/// \note In case mbrtowc(3) isn't available, single-byte character set -/// is assumed and isprint(3) is used instead of iswprint(3). - -#define tuklib_mask_nonprint_r TUKLIB_SYMBOL(tuklib_mask_nonprint_r) -extern const char *tuklib_mask_nonprint_r(const char *str, char **mem); -///< -/// \brief Replace non-printable characters with question marks -/// -/// \param str Untrusted string, for example, a filename -/// \param mem This function always calls free(*mem) to free the old -/// allocation and then sets *mem = NULL. Before the first -/// call, *mem should be initialized to NULL. If this -/// function needs to allocate memory for a modified -/// string, a pointer to the allocated memory will be -/// stored to *mem. Otherwise *mem will remain NULL. -/// -/// \return If tuklib_has_nonprint(str) returns false, this function -/// returns str. Otherwise memory is allocated to hold a modified -/// string and a pointer to that is returned. The pointer to the -/// allocated memory is also stored to *mem. A modified string -/// has the problematic characters replaced by '?'. If memory -/// allocation fails, "???" is returned and *mem is NULL. -/// The value of errno is preserved. - -#define tuklib_mask_nonprint TUKLIB_SYMBOL(tuklib_mask_nonprint) -extern const char *tuklib_mask_nonprint(const char *str); -///< -/// \brief Replace non-printable characters with question marks -/// -/// This is a convenience function for single-threaded use. This calls -/// tuklib_mask_nonprint_r() using an internal static variable to hold -/// the possible allocation. -/// -/// \param str Untrusted string, for example, a filename -/// -/// \return See tuklib_mask_nonprint_r(). -/// -/// \note This function is not thread safe! - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_mbstr_width.c b/software/src/xz/src/common/tuklib_mbstr_width.c deleted file mode 100644 index 98c611d..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_width.c +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_width.c -/// \brief Calculate width of a multibyte string -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_mbstr.h" -#include - -#ifdef HAVE_MBRTOWC -# include -#endif - - -extern size_t -tuklib_mbstr_width(const char *str, size_t *bytes) -{ - const size_t len = strlen(str); - if (bytes != NULL) - *bytes = len; - - return tuklib_mbstr_width_mem(str, len); -} - - -extern size_t -tuklib_mbstr_width_mem(const char *str, size_t len) -{ -#ifndef HAVE_MBRTOWC - // In single-byte mode, the width of the string is the same - // as its length. - (void)str; - return len; - -#else - mbstate_t state; - memset(&state, 0, sizeof(state)); - - size_t width = 0; - size_t i = 0; - - // Convert one multibyte character at a time to wchar_t - // and get its width using wcwidth(). - while (i < len) { - wchar_t wc; - const size_t ret = mbrtowc(&wc, str + i, len - i, &state); - if (ret < 1 || ret > len - i) - return (size_t)-1; - - i += ret; - -#ifdef HAVE_WCWIDTH - const int wc_width = wcwidth(wc); - if (wc_width < 0) - return (size_t)-1; - - width += (size_t)wc_width; -#else - // Without wcwidth() (like in a native Windows build), - // assume that one multibyte char == one column. With - // UTF-8, this is less bad than one byte == one column. - // This way quite a few languages will be handled correctly - // in practice; CJK chars will be very wrong though. - ++width; -#endif - } - - // It's good to check that the string ended in the initial state. - // However, in practice this is redundant: - // - // - No one will use this code with character sets that have - // locking shift states. - // - // - We already checked that mbrtowc() didn't return (size_t)-2 - // which would indicate a partial multibyte character. - if (!mbsinit(&state)) - return (size_t)-1; - - return width; -#endif -} diff --git a/software/src/xz/src/common/tuklib_mbstr_wrap.c b/software/src/xz/src/common/tuklib_mbstr_wrap.c deleted file mode 100644 index 8d906e0..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_wrap.c +++ /dev/null @@ -1,294 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_wrap.c -/// \brief Word wraps a string and prints it to a FILE stream -/// -/// This depends on tuklib_mbstr_width.c. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_mbstr.h" -#include "tuklib_mbstr_wrap.h" -#include -#include -#include -#include - - -extern int -tuklib_wraps(FILE *outfile, const struct tuklib_wrap_opt *opt, const char *str) -{ - // left_cont may be less than left_margin. In that case, if the first - // word is extremely long, it will stay on the first line even if - // the line then gets overlong. - // - // On the other hand, left2_cont < left2_margin isn't allowed because - // it could result in inconsistent behavior when a very long word - // comes right after a \v. - // - // It is fine to have left2_margin < left_margin although it would be - // an odd use case. - if (!(opt->left_margin < opt->right_margin - && opt->left_cont < opt->right_margin - && opt->left2_margin <= opt->left2_cont - && opt->left2_cont < opt->right_margin)) - return TUKLIB_WRAP_ERR_OPT; - - // This is set to TUKLIB_WRAP_WARN_OVERLONG if one or more - // output lines extend past opt->right_margin columns. - int warn_overlong = 0; - - // Indentation of the first output line after \n or \r. - // \v sets this to opt->left2_margin. - // \r resets this back to the original value. - size_t first_indent = opt->left_margin; - - // Indentation of the output lines that occur due to word wrapping. - // \v sets this to opt->left2_cont and \r back to the original value. - size_t cont_indent = opt->left_cont; - - // If word wrapping occurs, the newline isn't printed unless more - // text would be put on the continuation line. This is also used - // when \v needs to start on a new line. - bool pending_newline = false; - - // Spaces are printed only when there is something else to put - // after the spaces on the line. This avoids unwanted empty lines - // in the output and makes it possible to ignore possible spaces - // before a \v character. - size_t pending_spaces = first_indent; - - // Current output column. When cur_col == pending_spaces, nothing - // has been actually printed to the current output line. - size_t cur_col = pending_spaces; - - while (true) { - // Number of bytes until the *next* line-break opportunity. - size_t len = 0; - - // Number of columns until the *next* line-break opportunity. - size_t width = 0; - - // Text between a pair of \b characters is treated as - // an unbreakable block even if it contains spaces. - // It must not contain any control characters before - // the closing \b. - bool unbreakable = false; - - while (true) { - // Find the next character that we handle specially. - // In an unbreakable block, search only for the - // closing \b; if missing, the unbreakable block - // extends to the end of the string. - const size_t n = strcspn(str + len, - unbreakable ? "\b" : " \t\n\r\v\b"); - - // Calculate how many columns the characters need. - const size_t w = tuklib_mbstr_width_mem(str + len, n); - if (w == (size_t)-1) - return TUKLIB_WRAP_ERR_STR; - - width += w; - len += n; - - // \b isn't a line-break opportunity so it has to - // be handled here. For simplicity, empty blocks - // are treated as zero-width characters. - if (str[len] == '\b') { - ++len; - unbreakable = !unbreakable; - continue; - } - - break; - } - - // Determine if adding this chunk of text would make the - // current output line exceed opt->right_margin columns. - const bool too_long = cur_col + width > opt->right_margin; - - // Wrap the line if needed. However: - // - // - Don't wrap if the current column is less than where - // the continuation line would begin. In that case - // the chunk wouldn't fit on the next line either so - // we just have to produce an overlong line. - // - // - Don't wrap if so far the line only contains spaces. - // Wrapping in that case would leave a weird empty line. - // NOTE: This "only contains spaces" condition is the - // reason why left2_margin > left2_cont isn't allowed. - if (too_long && cur_col > cont_indent - && cur_col > pending_spaces) { - // There might be trailing spaces or zero-width spaces - // which need to be ignored to keep the output pretty. - // - // Spaces need to be ignored because in some - // writing styles there are two spaces after - // a full stop. Example string: - // - // "Foo bar. Abc def." - // ^ - // If the first space after the first full stop - // triggers word wrapping, both spaces must be - // ignored. Otherwise the next line would be - // indented too much. - // - // Zero-width spaces are ignored the same way - // because they are meaningless if an adjacent - // character is a space. - while (*str == ' ' || *str == '\t') - ++str; - - // Don't print the newline here; only mark it as - // pending. This avoids an unwanted empty line if - // there is a \n or \r or \0 after the spaces have - // been ignored. - pending_newline = true; - pending_spaces = cont_indent; - cur_col = pending_spaces; - - // Since str may have been incremented due to the - // ignored spaces, the loop needs to be restarted. - continue; - } - - // Print the current chunk of text before the next - // line-break opportunity. If the chunk was empty, - // don't print anything so that the pending newline - // and pending spaces aren't printed on their own. - if (len > 0) { - if (pending_newline) { - pending_newline = false; - if (putc('\n', outfile) == EOF) - return TUKLIB_WRAP_ERR_IO; - } - - while (pending_spaces > 0) { - if (putc(' ', outfile) == EOF) - return TUKLIB_WRAP_ERR_IO; - - --pending_spaces; - } - - for (size_t i = 0; i < len; ++i) { - // Ignore unbreakable block characters (\b). - const int c = (unsigned char)str[i]; - if (c != '\b' && putc(c, outfile) == EOF) - return TUKLIB_WRAP_ERR_IO; - } - - str += len; - cur_col += width; - - // Remember if the line got overlong. If no other - // errors occur, we return warn_overlong. It might - // help in catching problematic strings. - if (too_long) - warn_overlong = TUKLIB_WRAP_WARN_OVERLONG; - } - - // Handle the special character after the chunk of text. - switch (*str) { - case ' ': - // Regular space. - ++cur_col; - ++pending_spaces; - break; - - case '\v': - // Set the alternative indentation settings. - first_indent = opt->left2_margin; - cont_indent = opt->left2_cont; - - if (first_indent > cur_col) { - // Add one or more spaces to reach - // the column specified in first_indent. - pending_spaces += first_indent - cur_col; - } else { - // There is no room to add even one space - // before reaching the column first_indent. - pending_newline = true; - pending_spaces = first_indent; - } - - cur_col = first_indent; - break; - - case '\0': // Implicit newline at the end of the string. - case '\r': // Newline that also resets the effect of \v. - case '\n': // Newline without resetting the indentation mode. - if (putc('\n', outfile) == EOF) - return TUKLIB_WRAP_ERR_IO; - - if (*str == '\0') - return warn_overlong; - - if (*str == '\r') { - first_indent = opt->left_margin; - cont_indent = opt->left_cont; - } - - pending_newline = false; - pending_spaces = first_indent; - cur_col = first_indent; - break; - } - - // Skip the specially-handled character. - ++str; - } -} - - -extern int -tuklib_wrapf(FILE *stream, const struct tuklib_wrap_opt *opt, - const char *fmt, ...) -{ - va_list ap; - char *buf; - -#ifdef HAVE_VASPRINTF - va_start(ap, fmt); - -#ifdef __clang__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wformat-nonliteral" -#endif - const int n = vasprintf(&buf, fmt, ap); -#ifdef __clang__ -# pragma GCC diagnostic pop -#endif - - va_end(ap); - if (n == -1) - return TUKLIB_WRAP_ERR_FORMAT; -#else - // Fixed buffer size is dumb but in practice one shouldn't need - // huge strings for *formatted* output. This simple method is safe - // with pre-C99 vsnprintf() implementations too which don't return - // the required buffer size (they return -1 or buf_size - 1) or - // which might not null-terminate the buffer in case it's too small. - const size_t buf_size = 128 * 1024; - buf = malloc(buf_size); - if (buf == NULL) - return TUKLIB_WRAP_ERR_FORMAT; - - va_start(ap, fmt); - const int n = vsnprintf(buf, buf_size, fmt, ap); - va_end(ap); - - if (n <= 0 || n >= (int)(buf_size - 1)) { - free(buf); - return TUKLIB_WRAP_ERR_FORMAT; - } -#endif - - const int ret = tuklib_wraps(stream, opt, buf); - free(buf); - return ret; -} diff --git a/software/src/xz/src/common/tuklib_mbstr_wrap.h b/software/src/xz/src/common/tuklib_mbstr_wrap.h deleted file mode 100644 index 4e2f297..0000000 --- a/software/src/xz/src/common/tuklib_mbstr_wrap.h +++ /dev/null @@ -1,204 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_mbstr_wrap.h -/// \brief Word wrapping for multibyte strings -/// -/// The word wrapping functions are intended to be usable, for example, -/// for printing --help text in command line tools. While manually-wrapped -/// --help text allows precise formatting, such freedom requires translators -/// to count spaces and determine where line breaks should occur. It's -/// tedious and error prone, and experience has shown that only some -/// translators do it well. Automatic word wrapping is less flexible but -/// results in polished-enough look with less effort from everyone. -/// Right-to-left languages and languages that don't use spaces between -/// words will still need extra effort though. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_MBSTR_WRAP_H -#define TUKLIB_MBSTR_WRAP_H - -#include "tuklib_common.h" -#include - -TUKLIB_DECLS_BEGIN - -/// One or more output lines exceeded right_margin. -/// This only a warning; everything was still printed successfully. -#define TUKLIB_WRAP_WARN_OVERLONG 0x01 - -/// Error writing to to the output FILE. The error flag in the FILE -/// should have been set as well. -#define TUKLIB_WRAP_ERR_IO 0x02 - -/// Invalid options in struct tuklib_wrap_opt. -/// Nothing was printed. -#define TUKLIB_WRAP_ERR_OPT 0x04 - -/// Invalid or unsupported multibyte character in the input string: -/// either mbrtowc() failed or wcwidth() returned a negative value. -#define TUKLIB_WRAP_ERR_STR 0x08 - -/// Only tuklib_wrapf(): Error in converting the format string. -/// It's either a memory allocation failure or something bad with the -/// format string or arguments. -#define TUKLIB_WRAP_ERR_FORMAT 0x10 - -/// Options for tuklib_wraps() and tuklib_wrapf() -struct tuklib_wrap_opt { - /// Indentation of the first output line after `\n` or `\r`. - /// This can be anything less than right_margin. - unsigned short left_margin; - - /// Column where word-wrapped continuation lines start. - /// This can be anything less than right_margin. - unsigned short left_cont; - - /// Column where the text after `\v` will start, either on the current - /// line (when there is room to add at least one space) or on a new - /// empty line. - unsigned short left2_margin; - - /// Like left_cont but for text after a `\v`. However, this must - /// be greater than or equal to left2_margin in addition to being - /// less than right_margin. - unsigned short left2_cont; - - /// For 80-column terminals, it is recommended to use 79 here for - /// maximum portability. 80 will work most of the time but it will - /// result in unwanted empty lines in the rare case where a terminal - /// moves the cursor to the beginning of the next line immediately - /// when the last column has been used. - unsigned short right_margin; -}; - -#define tuklib_wraps TUKLIB_SYMBOL(tuklib_wraps) -extern int tuklib_wraps(FILE *stream, const struct tuklib_wrap_opt *opt, - const char *str); -///< -/// \brief Word wrap a multibyte string and write it to a FILE -/// -/// Word wrapping is done only at spaces and at the special control characters -/// described below. Multiple consecutive spaces are handled properly: strings -/// that have two (or more) spaces after a full sentence will look good even -/// when the spaces occur at a word wrapping boundary. Trailing spaces are -/// ignored at the end of a line or at the end of a string. -/// -/// The following control characters have been repurposed: -/// -/// - `\t` = Zero-width space allows a line break without producing any -/// output by itself. This can be useful after hard hyphens as -/// hyphens aren't otherwise used for line breaking. This can also -/// be useful in languages that don't use spaces between words. -/// (The Unicode character U+200B isn't supported.) -/// - `\b` = Text between a pair of `\b` characters is treated as an -/// unbreakable block (not wrapped even if there are spaces). -/// For example, a non-breaking space can be done like -/// in `"123\b \bMiB"`. Control characters (like `\n` or `\t`) -/// aren't allowed before the closing `\b`. If closing `\b` is -/// missing, the block extends to the end of the string. Empty -/// blocks are treated as zero-width characters. If line breaks -/// are possible around an empty block (like in `"foo \b\b bar"` -/// or `"foo \b"`), it can result in weird output. -/// - `\v` = Change to alternative indentation (left2_margin). -/// - `\r` = Reset back to the initial indentation and add a newline. -/// The next line will be indented by left_margin. -/// - `\n` = Add a newline without resetting the effect of `\v`. The -/// next line will be indented by left_margin or left2_margin -/// (not left_cont or left2_cont). -/// -/// Only `\n` should appear in translatable strings. `\t` works too but -/// even that might confuse some translators even if there is a TRANSLATORS -/// comment explaining its meaning. -/// -/// To use the other control characters in messages, one should use -/// tuklib_wrapf() with appropriate printf format string to combine -/// translatable strings with non-translatable portions. For example: -/// -/// \code{.c} -/// static const struct tuklib_wrap_opt wrap2 = { 2, 2, 22, 22, 79 }; -/// int e = 0; -/// ... -/// e |= tuklib_wrapf(stdout, &wrap2, -/// "-h, --help\v%s\r" -/// " --version\v%s", -/// W_("display this help and exit"), -/// W_("display version information and exit")); -/// ... -/// if (e != 0) { -/// // Handle warning or error. -/// ... -/// } -/// \endcode -/// -/// Control characters other than `\n` and `\t` are unusable in -/// translatable strings: -/// -/// - Gettext tools show annoying warnings if C escape sequences other -/// than `\n` or `\t` are seen. (Otherwise they still work perfectly -/// fine though.) -/// -/// - While at least Poedit and Lokalize support all escapes, some -/// editors only support `\n` and `\t`. -/// -/// - They could confuse some translators, resulting in broken -/// translations. -/// -/// Using non-control characters would solve some issues but it wouldn't -/// help with the unfortunate real-world issue that some translators would -/// likely have trouble understanding a new syntax. The Gettext manual -/// specifically warns about this, see the subheading "No unusual markup" -/// in `info (gettext)Preparing Strings`. (While using `\t` for zero-width -/// space is such custom markup, most translators will never need it.) -/// -/// Translators can use the Unicode character U+00A0 (or U+202F) if they -/// need a non-breaking space. For example, in French a non-breaking space -/// may be needed before colons and question marks (U+00A0 is common in -/// real-world French PO files). -/// -/// Using a non-ASCII char in a string in the C code (like `"123\u00A0MiB"`) -/// can work if one tells xgettext that input encoding is UTF-8, one -/// ensures that the C compiler uses UTF-8 as the input charset, and one -/// is certain that the program is *always* run under an UTF-8 locale. -/// Unfortunately a portable program cannot make this kind of assumptions, -/// which means that there is no pretty way to have a non-breaking space in -/// a translatable string. -/// -/// Optional: To tell translators which strings are automatically word -/// wrapped, see the macro `W_` in tuklib_gettext.h. -/// -/// \param stream Output FILE stream. For decent performance, it -/// should be in buffered mode because this function -/// writes the output one byte at a time with fputc(). -/// \param opt Word wrapping options. -/// \param str Null-terminated multibyte string that is in -/// the encoding used by the current locale. -/// -/// \return Returns 0 on success. If an error or warning occurs, one of -/// TUKLIB_WRAP_* codes is returned. Those codes are powers -/// of two. When warning/error detection can be delayed, the -/// return values can be accumulated from multiple calls using -/// bitwise-or into a single variable which can be checked after -/// all strings have (hopefully) been printed. - -#define tuklib_wrapf TUKLIB_SYMBOL(tuklib_wrapf) -tuklib_attr_format_printf(3, 4) -extern int tuklib_wrapf(FILE *stream, const struct tuklib_wrap_opt *opt, - const char *fmt, ...); -///< -/// \brief Format and word-wrap a multibyte string and write it to a FILE -/// -/// This is like tuklib_wraps() except that this takes a printf -/// format string. -/// -/// \note On platforms that lack vasprintf(), the intermediate -/// result from vsnprintf() must fit into a 128 KiB buffer. -/// TUKLIB_WRAP_ERR_FORMAT is returned if it doesn't but -/// only on platforms that lack vasprintf(). - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_open_stdxxx.c b/software/src/xz/src/common/tuklib_open_stdxxx.c deleted file mode 100644 index b93e61d..0000000 --- a/software/src/xz/src/common/tuklib_open_stdxxx.c +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_open_stdxxx.c -/// \brief Make sure that file descriptors 0, 1, and 2 are open -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_open_stdxxx.h" - -#ifndef TUKLIB_DOSLIKE -# include -# include -# include -# include -#endif - - -extern void -tuklib_open_stdxxx(int err_status) -{ -#ifdef TUKLIB_DOSLIKE - // Do nothing, just silence warnings. - (void)err_status; - -#else - for (int i = 0; i <= 2; ++i) { - // We use fcntl() to check if the file descriptor is open. - if (fcntl(i, F_GETFD) == -1 && errno == EBADF) { - // With stdin, we could use /dev/full so that - // writing to stdin would fail. However, /dev/full - // is Linux specific, and if the program tries to - // write to stdin, there's already a problem anyway. - const int fd = open("/dev/null", O_NOCTTY - | (i == 0 ? O_WRONLY : O_RDONLY)); - - if (fd != i) { - if (fd != -1) - (void)close(fd); - - // Something went wrong. Exit with the - // exit status we were given. Don't try - // to print an error message, since stderr - // may very well be non-existent. This - // error should be extremely rare. - exit(err_status); - } - } - } -#endif - - return; -} diff --git a/software/src/xz/src/common/tuklib_open_stdxxx.h b/software/src/xz/src/common/tuklib_open_stdxxx.h deleted file mode 100644 index 3ee3ade..0000000 --- a/software/src/xz/src/common/tuklib_open_stdxxx.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_open_stdxxx.h -/// \brief Make sure that file descriptors 0, 1, and 2 are open -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_OPEN_STDXXX_H -#define TUKLIB_OPEN_STDXXX_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_open_stdxx TUKLIB_SYMBOL(tuklib_open_stdxxx) -extern void tuklib_open_stdxxx(int err_status); - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_physmem.c b/software/src/xz/src/common/tuklib_physmem.c deleted file mode 100644 index 5988ba7..0000000 --- a/software/src/xz/src/common/tuklib_physmem.c +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_physmem.c -/// \brief Get the amount of physical memory -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_physmem.h" - -// We want to use Windows-specific code on Cygwin, which also has memory -// information available via sysconf(), but on Cygwin 1.5 and older it -// gives wrong results (from our point of view). -#if defined(_WIN32) || defined(__CYGWIN__) -# ifndef _WIN32_WINNT -# define _WIN32_WINNT 0x0500 -# endif -# include - -#elif defined(__OS2__) -# define INCL_DOSMISC -# include - -#elif defined(__DJGPP__) -# include - -#elif defined(__VMS) -# include -# include -# include - -#elif defined(AMIGA) || defined(__AROS__) -# define __USE_INLINE__ -# include - -#elif defined(__QNX__) -# include -# include - -#elif defined(TUKLIB_PHYSMEM_AIX) -# include - -#elif defined(TUKLIB_PHYSMEM_SYSCONF) -# include - -#elif defined(TUKLIB_PHYSMEM_SYSCTL) -# ifdef HAVE_SYS_PARAM_H -# include -# endif -# include - -// Tru64 -#elif defined(TUKLIB_PHYSMEM_GETSYSINFO) -# include -# include - -// HP-UX -#elif defined(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) -# include -# include - -// IRIX -#elif defined(TUKLIB_PHYSMEM_GETINVENT_R) -# include - -// This sysinfo() is Linux-specific. -#elif defined(TUKLIB_PHYSMEM_SYSINFO) -# include -#endif - - -extern uint64_t -tuklib_physmem(void) -{ - uint64_t ret = 0; - -#if defined(_WIN32) || defined(__CYGWIN__) - // This requires Windows 2000 or later. - MEMORYSTATUSEX meminfo; - meminfo.dwLength = sizeof(meminfo); - if (GlobalMemoryStatusEx(&meminfo)) - ret = meminfo.ullTotalPhys; - -/* - // Old version that is compatible with even Win95: - if ((GetVersion() & 0xFF) >= 5) { - // Windows 2000 and later have GlobalMemoryStatusEx() which - // supports reporting values greater than 4 GiB. To keep the - // code working also on older Windows versions, use - // GlobalMemoryStatusEx() conditionally. - HMODULE kernel32 = GetModuleHandleA("kernel32.dll"); - if (kernel32 != NULL) { - typedef BOOL (WINAPI *gmse_type)(LPMEMORYSTATUSEX); - gmse_type gmse = (gmse_type)GetProcAddress( - kernel32, "GlobalMemoryStatusEx"); - if (gmse != NULL) { - MEMORYSTATUSEX meminfo; - meminfo.dwLength = sizeof(meminfo); - if (gmse(&meminfo)) - ret = meminfo.ullTotalPhys; - } - } - } - - if (ret == 0) { - // GlobalMemoryStatus() is supported by Windows 95 and later, - // so it is fine to link against it unconditionally. Note that - // GlobalMemoryStatus() has no return value. - MEMORYSTATUS meminfo; - meminfo.dwLength = sizeof(meminfo); - GlobalMemoryStatus(&meminfo); - ret = meminfo.dwTotalPhys; - } -*/ - -#elif defined(__OS2__) - unsigned long mem; - if (DosQuerySysInfo(QSV_TOTPHYSMEM, QSV_TOTPHYSMEM, - &mem, sizeof(mem)) == 0) - ret = mem; - -#elif defined(__DJGPP__) - __dpmi_free_mem_info meminfo; - if (__dpmi_get_free_memory_information(&meminfo) == 0 - && meminfo.total_number_of_physical_pages - != (unsigned long)-1) - ret = (uint64_t)meminfo.total_number_of_physical_pages * 4096; - -#elif defined(__VMS) - int vms_mem; - int val = SYI$_MEMSIZE; - if (LIB$GETSYI(&val, &vms_mem, 0, 0, 0, 0) == SS$_NORMAL) - ret = (uint64_t)vms_mem * 8192; - -#elif defined(AMIGA) || defined(__AROS__) - ret = AvailMem(MEMF_TOTAL); - -#elif defined(__QNX__) - const struct asinfo_entry *entries = SYSPAGE_ENTRY(asinfo); - size_t count = SYSPAGE_ENTRY_SIZE(asinfo) / sizeof(struct asinfo_entry); - const char *strings = SYSPAGE_ENTRY(strings)->data; - - for (size_t i = 0; i < count; ++i) - if (strcmp(strings + entries[i].name, "ram") == 0) - ret += entries[i].end - entries[i].start + 1; - -#elif defined(TUKLIB_PHYSMEM_AIX) - ret = (uint64_t)_system_configuration.physmem; - -#elif defined(TUKLIB_PHYSMEM_SYSCONF) - const long pagesize = sysconf(_SC_PAGESIZE); - const long pages = sysconf(_SC_PHYS_PAGES); - if (pagesize != -1 && pages != -1) - // According to docs, pagesize * pages can overflow. - // Simple case is 32-bit box with 4 GiB or more RAM, - // which may report exactly 4 GiB of RAM, and "long" - // being 32-bit will overflow. Casting to uint64_t - // hopefully avoids overflows in the near future. - ret = (uint64_t)pagesize * (uint64_t)pages; - -#elif defined(TUKLIB_PHYSMEM_SYSCTL) - int name[2] = { - CTL_HW, -#ifdef HW_PHYSMEM64 - HW_PHYSMEM64 -#else - HW_PHYSMEM -#endif - }; - union { - uint32_t u32; - uint64_t u64; - } mem; - size_t mem_ptr_size = sizeof(mem.u64); - if (sysctl(name, 2, &mem.u64, &mem_ptr_size, NULL, 0) != -1) { - // IIRC, 64-bit "return value" is possible on some 64-bit - // BSD systems even with HW_PHYSMEM (instead of HW_PHYSMEM64), - // so support both. - if (mem_ptr_size == sizeof(mem.u64)) - ret = mem.u64; - else if (mem_ptr_size == sizeof(mem.u32)) - ret = mem.u32; - } - -#elif defined(TUKLIB_PHYSMEM_GETSYSINFO) - // Docs are unclear if "start" is needed, but it doesn't hurt - // much to have it. - int memkb; - int start = 0; - if (getsysinfo(GSI_PHYSMEM, (caddr_t)&memkb, sizeof(memkb), &start) - != -1) - ret = (uint64_t)memkb * 1024; - -#elif defined(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) - struct pst_static pst; - if (pstat_getstatic(&pst, sizeof(pst), 1, 0) != -1) - ret = (uint64_t)pst.physical_memory * (uint64_t)pst.page_size; - -#elif defined(TUKLIB_PHYSMEM_GETINVENT_R) - inv_state_t *st = NULL; - if (setinvent_r(&st) != -1) { - inventory_t *i; - while ((i = getinvent_r(st)) != NULL) { - if (i->inv_class == INV_MEMORY - && i->inv_type == INV_MAIN_MB) { - ret = (uint64_t)i->inv_state << 20; - break; - } - } - - endinvent_r(st); - } - -#elif defined(TUKLIB_PHYSMEM_SYSINFO) - struct sysinfo si; - if (sysinfo(&si) == 0) - ret = (uint64_t)si.totalram * si.mem_unit; -#endif - - return ret; -} diff --git a/software/src/xz/src/common/tuklib_physmem.h b/software/src/xz/src/common/tuklib_physmem.h deleted file mode 100644 index f35bfba..0000000 --- a/software/src/xz/src/common/tuklib_physmem.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_physmem.h -/// \brief Get the amount of physical memory -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_PHYSMEM_H -#define TUKLIB_PHYSMEM_H - -#include "tuklib_common.h" -TUKLIB_DECLS_BEGIN - -#define tuklib_physmem TUKLIB_SYMBOL(tuklib_physmem) -extern uint64_t tuklib_physmem(void); -///< -/// \brief Get the amount of physical memory in bytes -/// -/// \return Amount of physical memory in bytes. On error, zero is -/// returned. - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/tuklib_progname.c b/software/src/xz/src/common/tuklib_progname.c deleted file mode 100644 index 959c127..0000000 --- a/software/src/xz/src/common/tuklib_progname.c +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_progname.c -/// \brief Program name to be displayed in messages -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "tuklib_progname.h" -#include - - -#ifndef HAVE_PROGRAM_INVOCATION_NAME -char *progname = NULL; -#endif - - -extern void -tuklib_progname_init(char **argv) -{ -#ifdef TUKLIB_DOSLIKE - // On these systems, argv[0] always has the full path and .exe - // suffix even if the user just types the plain program name. - // We modify argv[0] to make it nicer to read. - - // Strip the leading path. - char *p = argv[0] + strlen(argv[0]); - while (argv[0] < p && p[-1] != '/' && p[-1] != '\\') - --p; - - argv[0] = p; - - // Strip the .exe suffix. - p = strrchr(p, '.'); - if (p != NULL) - *p = '\0'; - - // Make it lowercase. - for (p = argv[0]; *p != '\0'; ++p) - if (*p >= 'A' && *p <= 'Z') - *p = *p - 'A' + 'a'; -#endif - - progname = argv[0]; - return; -} diff --git a/software/src/xz/src/common/tuklib_progname.h b/software/src/xz/src/common/tuklib_progname.h deleted file mode 100644 index a3d90cb..0000000 --- a/software/src/xz/src/common/tuklib_progname.h +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_progname.h -/// \brief Program name to be displayed in messages -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_PROGNAME_H -#define TUKLIB_PROGNAME_H - -#include "tuklib_common.h" -#include - -TUKLIB_DECLS_BEGIN - -#ifdef HAVE_PROGRAM_INVOCATION_NAME -# define progname program_invocation_name -#else -# define progname TUKLIB_SYMBOL(tuklib_progname) - extern char *progname; -#endif - -#define tuklib_progname_init TUKLIB_SYMBOL(tuklib_progname_init) -extern void tuklib_progname_init(char **argv); - -TUKLIB_DECLS_END -#endif diff --git a/software/src/xz/src/common/w32_application.manifest.comments.txt b/software/src/xz/src/common/w32_application.manifest.comments.txt deleted file mode 100644 index de5c210..0000000 --- a/software/src/xz/src/common/w32_application.manifest.comments.txt +++ /dev/null @@ -1,192 +0,0 @@ - -Windows application manifest for UTF-8 and long paths -===================================================== - -The .manifest file is embedded as is in the executables, thus -the comments are here in a separate file. These comments were -written in context of XZ Utils but might be useful when porting -other command line tools from POSIX environments to Windows. - - NOTE: On Cygwin and MSYS2, command line arguments and file - system access aren't tied to a Windows code page. Cygwin - and MSYS2 include a default application manifest. Replacing - it doesn't seem useful and might even be harmful if Cygwin - and MSYS2 some day change their default manifest. - - -UTF-8 code page ---------------- - -On Windows, command line applications can use main() or wmain(). -With the Windows-specific wmain(), argv contains UTF-16 code units -which is the native encoding on Windows. With main(), argv uses the -system active code page by default. It typically is a legacy code -page like Windows-1252. - - NOTE: On POSIX, argv for main() is constructed by the calling - process. On Windows, argv is constructed by a new process - itself: a program receives the command line as a single string, - and the startup code splits it into individual arguments, - including quote removal and wildcard expansion. Then main() or - wmain() is called. - -This application manifest forces the process code page to UTF-8 -when the application runs on Windows 10 version 1903 or later. -This is useful for programs that use main(): - - * UTF-8 allows such programs to access files whose names contain - characters that don't exist in the current legacy code page. - However, filenames on Windows may contain unpaired surrogates - (invalid UTF-16). Such files cannot be accesses even with the - UTF-8 code page. - - * UTF-8 avoids a security issue in command line argument handling: - If a command line contains Unicode characters (for example, - filenames) that don't exist in the current legacy code page, - the characters are converted to similar-looking characters - with best-fit mapping. Some best-fit mappings result in ASCII - characters that change the meaning of the command line, which - can be exploited with malicious filenames. For example: - - - Double quote (") breaks quoting and makes argument - injection possible. - - - Question mark (?) is a wildcard character which may - expand to one or more filenames. - - - Forward slash (/) makes a directory traversal attack - possible. This character can appear in a dangerous way - even from a wildcard expansion; a look-alike character - doesn't need to be passed directly on the command line. - - UTF-8 avoids best-fit mappings. However, it's still not - perfect. Unpaired surrogates (invalid UTF-16) on the command - line (including those from wildcard expansion) are converted - to the replacement character U+FFFD. Thus, filenames with - different unpaired surrogates appear identical when converted - to the UTF-8 code page and aren't distinguishable from - filenames that contain the actual replacement character U+FFFD. - - FindFirstFileA() and FindFirstFileExA() also suffer from the above - issue where unpaired surrogates become U+FFFD. Another issue is - that filenames may require more bytes in UTF-8 than in a legacy - code page. In UTF-8, a very long filename may exceed MAX_PATH bytes - and thus these APIs cannot list such filenames anymore because - WIN32_FIND_DATAA has a member "CHAR cFileName[MAX_PATH]". - -If different programs use different code pages, compatibility issues -are possible. For example, if one program produces a list of -filenames and another program reads it, both programs should use -the same code page because the code page affects filenames in the -char-based file system APIs. - -If building with a MinGW-w64 toolchain, it is strongly recommended -to use UCRT instead of the old MSVCRT. For example, with the UTF-8 -code page, MSVCRT doesn't convert non-ASCII characters correctly -when writing to console with printf(). With UCRT it works. - - -Long path names ---------------- - -The manifest enables support for path names longer than 260 wide -characters (UTF-16 code units) if the feature has been enabled in -the Windows registry. Omit the longPathAware element from the manifest -if the application isn't compatible with it. For example, some uses -of MAX_PATH might be a sign of incompatibility. - -Note that UTF-8 encoded filenames can exceed MAX_PATH (260) bytes when -the UTF-16 form is still within MAX_PATH wide characters. In this -situation the application doesn't need to be long path aware: functions -like _open() work with UTF-8 names that exceed MAX_PATH bytes if the -wide character form stays within MAX_PATH wide characters. (MAX_PATH -includes the terminating null character.) - -Documentation of the registry setting: -https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later - - -Summary of the manifest contents --------------------------------- - -See also Microsoft's documentation: -https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests - -assemblyIdentity (omitted) - - This is documented as mandatory but not all apps in the real world - have it, and of those that do, not all put an up-to-date version - number there. Things seem to work correctly without - so let's keep this simpler and omit it. - -compatibility - - Declare the application compatible with different Windows versions. - Without this, Windows versions newer than Vista will run the - application using Vista as the Operating System Context. - -trustInfo - - Declare the application as UAC-compliant. This avoids file system - and registry virtualization that Windows otherwise does with 32-bit - executables to make some ancient applications work. UAC-compliancy - also stops Windows from using heuristics based on the filename - (like setup.exe) to guess when elevated privileges might be - needed which would then bring up the UAC prompt. - -longPathAware - - Declare the application as long path aware. This way many file - system operations aren't limited to MAX_PATH (260) wide characters - (including the terminating null character). The feature has to be - enabled in the Windows registry too. - -activeCodePage - - Force the process code page to UTF-8 on Windows 10 version 1903 - and later. For example: - - - main() gets the command line arguments in UTF-8 instead of - in a legacy code page. - - - File system APIs that take char-based strings use UTF-8 - instead of a legacy code page. - - - Text written to the console via stdio.h's stdout or stderr - (like calling printf()) are expected to be in UTF-8. - - -CMake notes ------------ - -As of CMake 3.30, one can add a .manifest file as a source file but -it only works with MSVC; it's ignored with MinGW-w64 toolchains. -Embedding the manifest with a resource file works with all -toolchains. However, then the default manifest needs to be -disabled with MSVC in CMakeLists.txt to avoid duplicate -manifests which would break the build. - -w32_application.manifest.rc: - - #include - CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "w32_application.manifest" - -Or the same thing without the #include: - - 1 24 "w32_application.manifest" - -CMakeLists.txt: - - if(MSVC) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") - endif() - - add_executable(foo foo.c) - - # WIN32 isn't set on Cygwin or MSYS2, thus if(WIN32) is correct here. - if(WIN32) - target_sources(foo PRIVATE w32_application.manifest.rc) - set_source_files_properties(w32_application.manifest.rc PROPERTIES - OBJECT_DEPENDS w32_application.manifest - ) - endif() diff --git a/software/src/xz/src/liblzma/Makefile.am b/software/src/xz/src/liblzma/Makefile.am deleted file mode 100644 index d554702..0000000 --- a/software/src/xz/src/liblzma/Makefile.am +++ /dev/null @@ -1,126 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -SUBDIRS = api - -EXTRA_DIST = -CLEANFILES = -doc_DATA = - -lib_LTLIBRARIES = liblzma.la -liblzma_la_SOURCES = -liblzma_la_CPPFLAGS = \ - -I$(top_srcdir)/src/liblzma/api \ - -I$(top_srcdir)/src/liblzma/common \ - -I$(top_srcdir)/src/liblzma/check \ - -I$(top_srcdir)/src/liblzma/lz \ - -I$(top_srcdir)/src/liblzma/rangecoder \ - -I$(top_srcdir)/src/liblzma/lzma \ - -I$(top_srcdir)/src/liblzma/delta \ - -I$(top_srcdir)/src/liblzma/simple \ - -I$(top_srcdir)/src/common \ - -DTUKLIB_SYMBOL_PREFIX=lzma_ -liblzma_la_LDFLAGS = -no-undefined -version-info 13:1:8 - -EXTRA_DIST += liblzma_generic.map liblzma_linux.map validate_map.sh -if COND_SYMVERS_GENERIC -liblzma_la_LDFLAGS += \ - -Wl,--version-script=$(top_srcdir)/src/liblzma/liblzma_generic.map -endif -if COND_SYMVERS_LINUX -liblzma_la_LDFLAGS += \ - -Wl,--version-script=$(top_srcdir)/src/liblzma/liblzma_linux.map -endif - -liblzma_la_SOURCES += ../common/tuklib_physmem.c - -if COND_THREADS -liblzma_la_SOURCES += ../common/tuklib_cpucores.c -endif - -include $(srcdir)/common/Makefile.inc -include $(srcdir)/check/Makefile.inc - -if COND_FILTER_LZ -include $(srcdir)/lz/Makefile.inc -endif - -if COND_FILTER_LZMA1 -include $(srcdir)/lzma/Makefile.inc -include $(srcdir)/rangecoder/Makefile.inc -endif - -if COND_FILTER_DELTA -include $(srcdir)/delta/Makefile.inc -endif - -if COND_FILTER_SIMPLE -include $(srcdir)/simple/Makefile.inc -endif - - -## Windows-specific stuff - -# Windows resource compiler support. libtool knows what to do with .rc -# files, but Automake (<= 1.11 at least) doesn't know. -# -# We want the resource file only in shared liblzma. To avoid linking it into -# static liblzma, we overwrite the static object file with an object file -# compiled from empty input. Note that GNU-specific features are OK here, -# because on Windows we are compiled with the GNU toolchain. -# -# The typedef in empty.c will prevent an empty translation unit, which is -# not allowed by the C standard. It results in a warning with -# -Wempty-translation-unit with Clang or -pedantic for GCC. -.rc.lo: - $(LIBTOOL) --mode=compile $(RC) $(DEFS) $(DEFAULT_INCLUDES) \ - $(INCLUDES) $(liblzma_la_CPPFLAGS) $(CPPFLAGS) $(RCFLAGS) \ - -i $< -o $@ - echo "typedef void empty;" > empty.c - $(COMPILE) -c empty.c -o $(*D)/$(*F).o - -# Remove ordinals from the generated .def file. People must link by name, -# not by ordinal, because no one is going to track the ordinal numbers. -liblzma.def: liblzma.la liblzma.def.in - sed 's/ \+@ *[0-9]\+//' liblzma.def.in > liblzma.def - -# Creating liblzma.def.in is a side effect of linking the library. -liblzma.def.in: liblzma.la - -if COND_W32 -CLEANFILES += liblzma.def liblzma.def.in empty.c -liblzma_la_SOURCES += liblzma_w32res.rc -liblzma_la_LDFLAGS += -Xlinker --output-def -Xlinker liblzma.def.in - -## liblzma.def.in is created only when building shared liblzma, so don't -## try to create liblzma.def when not building shared liblzma. -if COND_SHARED -doc_DATA += liblzma.def -endif -endif - - -## pkg-config -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = liblzma.pc -EXTRA_DIST += liblzma.pc.in - -pc_verbose = $(pc_verbose_@AM_V@) -pc_verbose_ = $(pc_verbose_@AM_DEFAULT_V@) -pc_verbose_0 = @echo " PC " $@; - -liblzma.pc: $(srcdir)/liblzma.pc.in - $(AM_V_at)rm -f $@ - $(pc_verbose)sed \ - -e 's,@prefix[@],$(prefix),g' \ - -e 's,@exec_prefix[@],$(exec_prefix),g' \ - -e 's,@libdir[@],$(libdir),g' \ - -e 's,@includedir[@],$(includedir),g' \ - -e 's,@PACKAGE_URL[@],$(PACKAGE_URL),g' \ - -e 's,@PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \ - -e 's,@PTHREAD_CFLAGS[@],$(PTHREAD_CFLAGS),g' \ - -e 's,@LIBS[@],$(LIBS),g' \ - < $(srcdir)/liblzma.pc.in > $@ || { rm -f $@; exit 1; } - -clean-local: - rm -f liblzma.pc diff --git a/software/src/xz/src/liblzma/api/Makefile.am b/software/src/xz/src/liblzma/api/Makefile.am deleted file mode 100644 index 4f91c77..0000000 --- a/software/src/xz/src/liblzma/api/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -nobase_include_HEADERS = \ - lzma.h \ - lzma/base.h \ - lzma/bcj.h \ - lzma/block.h \ - lzma/check.h \ - lzma/container.h \ - lzma/delta.h \ - lzma/filter.h \ - lzma/hardware.h \ - lzma/index.h \ - lzma/index_hash.h \ - lzma/lzma12.h \ - lzma/stream_flags.h \ - lzma/version.h \ - lzma/vli.h - -if COND_DOXYGEN -$(top_builddir)/doc/api/index.html: $(top_srcdir)/doxygen/update-doxygen $(top_srcdir)/doxygen/Doxyfile $(nobase_include_HEADERS) - $(MKDIR_P) "$(top_builddir)/doc" - "$(top_srcdir)/doxygen/update-doxygen" api \ - "$(top_srcdir)" "$(top_builddir)/doc" - -all-local: $(top_builddir)/doc/api/index.html - -install-data-local: - $(MKDIR_P) "$(DESTDIR)$(docdir)/api" - $(INSTALL_DATA) "$(top_builddir)"/doc/api/* "$(DESTDIR)$(docdir)/api" - -uninstall-local: - rm -rf "$(DESTDIR)$(docdir)/api" - -clean-local: - rm -rf "$(top_builddir)/doc/api" -endif diff --git a/software/src/xz/src/liblzma/api/lzma.h b/software/src/xz/src/liblzma/api/lzma.h deleted file mode 100644 index 6ca6e50..0000000 --- a/software/src/xz/src/liblzma/api/lzma.h +++ /dev/null @@ -1,327 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file api/lzma.h - * \brief The public API of liblzma data compression library - * \mainpage - * - * liblzma is a general-purpose data compression library with a zlib-like API. - * The native file format is .xz, but also the old .lzma format and raw (no - * headers) streams are supported. Multiple compression algorithms (filters) - * are supported. Currently LZMA2 is the primary filter. - * - * liblzma is part of XZ Utils . XZ Utils - * includes a gzip-like command line tool named xz and some other tools. - * XZ Utils is developed and maintained by Lasse Collin. - * - * Major parts of liblzma are based on code written by Igor Pavlov, - * specifically the LZMA SDK . - * - * The SHA-256 implementation in liblzma is based on code written by - * Wei Dai in Crypto++ Library . - * - * liblzma is distributed under the BSD Zero Clause License (0BSD). - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H -#define LZMA_H - -/***************************** - * Required standard headers * - *****************************/ - -/* - * liblzma API headers need some standard types and macros. To allow - * including lzma.h without requiring the application to include other - * headers first, lzma.h includes the required standard headers unless - * they already seem to be included already or if LZMA_MANUAL_HEADERS - * has been defined. - * - * Here's what types and macros are needed and from which headers: - * - stddef.h: size_t, NULL - * - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n), - * UINT32_MAX, UINT64_MAX - * - * However, inttypes.h is a little more portable than stdint.h, although - * inttypes.h declares some unneeded things compared to plain stdint.h. - * - * The hacks below aren't perfect, specifically they assume that inttypes.h - * exists and that it typedefs at least uint8_t, uint32_t, and uint64_t, - * and that, in case of incomplete inttypes.h, unsigned int is 32-bit. - * If the application already takes care of setting up all the types and - * macros properly (for example by using gnulib's stdint.h or inttypes.h), - * we try to detect that the macros are already defined and don't include - * inttypes.h here again. However, you may define LZMA_MANUAL_HEADERS to - * force this file to never include any system headers. - * - * Some could argue that liblzma API should provide all the required types, - * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was - * seen as an unnecessary mess, since most systems already provide all the - * necessary types and macros in the standard headers. - * - * Note that liblzma API still has lzma_bool, because using stdbool.h would - * break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't - * necessarily the same as sizeof(bool) in C++. - */ - -#ifndef LZMA_MANUAL_HEADERS - /* - * I suppose this works portably also in C++. Note that in C++, - * we need to get size_t into the global namespace. - */ -# include - - /* - * Skip inttypes.h if we already have all the required macros. If we - * have the macros, we assume that we have the matching typedefs too. - */ -# if !defined(UINT32_C) || !defined(UINT64_C) \ - || !defined(UINT32_MAX) || !defined(UINT64_MAX) - /* - * MSVC versions older than 2013 have no C99 support, and - * thus they cannot be used to compile liblzma. Using an - * existing liblzma.dll with old MSVC can work though(*), - * but we need to define the required standard integer - * types here in a MSVC-specific way. - * - * (*) If you do this, the existing liblzma.dll probably uses - * a different runtime library than your MSVC-built - * application. Mixing runtimes is generally bad, but - * in this case it should work as long as you avoid - * the few rarely-needed liblzma functions that allocate - * memory and expect the caller to free it using free(). - */ -# if defined(_WIN32) && defined(_MSC_VER) && _MSC_VER < 1800 - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -# else - /* Use the standard inttypes.h. */ -# ifdef __cplusplus - /* - * C99 sections 7.18.2 and 7.18.4 specify - * that C++ implementations define the limit - * and constant macros only if specifically - * requested. Note that if you want the - * format macros (PRIu64 etc.) too, you need - * to define __STDC_FORMAT_MACROS before - * including lzma.h, since re-including - * inttypes.h with __STDC_FORMAT_MACROS - * defined doesn't necessarily work. - */ -# ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS 1 -# endif -# ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS 1 -# endif -# endif - -# include -# endif - - /* - * Some old systems have only the typedefs in inttypes.h, and - * lack all the macros. For those systems, we need a few more - * hacks. We assume that unsigned int is 32-bit and unsigned - * long is either 32-bit or 64-bit. If these hacks aren't - * enough, the application has to setup the types manually - * before including lzma.h. - */ -# ifndef UINT32_C -# if defined(_WIN32) && defined(_MSC_VER) -# define UINT32_C(n) n ## UI32 -# else -# define UINT32_C(n) n ## U -# endif -# endif - -# ifndef UINT64_C -# if defined(_WIN32) && defined(_MSC_VER) -# define UINT64_C(n) n ## UI64 -# else - /* Get ULONG_MAX. */ -# include -# if ULONG_MAX == 4294967295UL -# define UINT64_C(n) n ## ULL -# else -# define UINT64_C(n) n ## UL -# endif -# endif -# endif - -# ifndef UINT32_MAX -# define UINT32_MAX (UINT32_C(4294967295)) -# endif - -# ifndef UINT64_MAX -# define UINT64_MAX (UINT64_C(18446744073709551615)) -# endif -# endif -#endif /* ifdef LZMA_MANUAL_HEADERS */ - - -/****************** - * LZMA_API macro * - ******************/ - -/* - * Some systems require that the functions and function pointers are - * declared specially in the headers. LZMA_API_IMPORT is for importing - * symbols and LZMA_API_CALL is to specify the calling convention. - * - * By default it is assumed that the application will link dynamically - * against liblzma. #define LZMA_API_STATIC in your application if you - * want to link against static liblzma. If you don't care about portability - * to operating systems like Windows, or at least don't care about linking - * against static liblzma on them, don't worry about LZMA_API_STATIC. That - * is, most developers will never need to use LZMA_API_STATIC. - * - * The GCC variants are a special case on Windows (Cygwin and MinGW-w64). - * We rely on GCC doing the right thing with its auto-import feature, - * and thus don't use __declspec(dllimport). This way developers don't - * need to worry about LZMA_API_STATIC. Also the calling convention is - * omitted on Cygwin but not on MinGW-w64. - */ -#ifndef LZMA_API_IMPORT -# if !defined(LZMA_API_STATIC) && defined(_WIN32) && !defined(__GNUC__) -# define LZMA_API_IMPORT __declspec(dllimport) -# else -# define LZMA_API_IMPORT -# endif -#endif - -#ifndef LZMA_API_CALL -# if defined(_WIN32) && !defined(__CYGWIN__) -# define LZMA_API_CALL __cdecl -# else -# define LZMA_API_CALL -# endif -#endif - -#ifndef LZMA_API -# define LZMA_API(type) LZMA_API_IMPORT type LZMA_API_CALL -#endif - - -/*********** - * nothrow * - ***********/ - -/* - * None of the functions in liblzma may throw an exception. Even - * the functions that use callback functions won't throw exceptions, - * because liblzma would break if a callback function threw an exception. - */ -#ifndef lzma_nothrow -# if defined(__cplusplus) -# if __cplusplus >= 201103L || (defined(_MSVC_LANG) \ - && _MSVC_LANG >= 201103L) -# define lzma_nothrow noexcept -# else -# define lzma_nothrow throw() -# endif -# elif defined(__GNUC__) && (__GNUC__ > 3 \ - || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) -# define lzma_nothrow __attribute__((__nothrow__)) -# else -# define lzma_nothrow -# endif -#endif - - -/******************** - * GNU C extensions * - ********************/ - -/* - * GNU C extensions are used conditionally in the public API. It doesn't - * break anything if these are sometimes enabled and sometimes not, only - * affects warnings and optimizations. - */ -#if defined(__GNUC__) && __GNUC__ >= 3 -# ifndef lzma_attribute -# define lzma_attribute(attr) __attribute__(attr) -# endif - - /* warn_unused_result was added in GCC 3.4. */ -# ifndef lzma_attr_warn_unused_result -# if __GNUC__ == 3 && __GNUC_MINOR__ < 4 -# define lzma_attr_warn_unused_result -# endif -# endif - -#else -# ifndef lzma_attribute -# define lzma_attribute(attr) -# endif -#endif - - -#ifndef lzma_attr_pure -# define lzma_attr_pure lzma_attribute((__pure__)) -#endif - -#ifndef lzma_attr_const -# define lzma_attr_const lzma_attribute((__const__)) -#endif - -#ifndef lzma_attr_warn_unused_result -# define lzma_attr_warn_unused_result \ - lzma_attribute((__warn_unused_result__)) -#endif - - -/************** - * Subheaders * - **************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Subheaders check that this is defined. It is to prevent including - * them directly from applications. - */ -#define LZMA_H_INTERNAL 1 - -/* Basic features */ -#include "lzma/version.h" -#include "lzma/base.h" -#include "lzma/vli.h" -#include "lzma/check.h" - -/* Filters */ -#include "lzma/filter.h" -#include "lzma/bcj.h" -#include "lzma/delta.h" -#include "lzma/lzma12.h" - -/* Container formats */ -#include "lzma/container.h" - -/* Advanced features */ -#include "lzma/stream_flags.h" -#include "lzma/block.h" -#include "lzma/index.h" -#include "lzma/index_hash.h" - -/* Hardware information */ -#include "lzma/hardware.h" - -/* - * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications - * re-including the subheaders. - */ -#undef LZMA_H_INTERNAL - -#ifdef __cplusplus -} -#endif - -#endif /* ifndef LZMA_H */ diff --git a/software/src/xz/src/liblzma/api/lzma/base.h b/software/src/xz/src/liblzma/api/lzma/base.h deleted file mode 100644 index 590e1d2..0000000 --- a/software/src/xz/src/liblzma/api/lzma/base.h +++ /dev/null @@ -1,747 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/base.h - * \brief Data types and functions used in many places in liblzma API - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Boolean - * - * This is here because C89 doesn't have stdbool.h. To set a value for - * variables having type lzma_bool, you can use - * - C99's 'true' and 'false' from stdbool.h; - * - C++'s internal 'true' and 'false'; or - * - integers one (true) and zero (false). - */ -typedef unsigned char lzma_bool; - - -/** - * \brief Type of reserved enumeration variable in structures - * - * To avoid breaking library ABI when new features are added, several - * structures contain extra variables that may be used in future. Since - * sizeof(enum) can be different than sizeof(int), and sizeof(enum) may - * even vary depending on the range of enumeration constants, we specify - * a separate type to be used for reserved enumeration variables. All - * enumeration constants in liblzma API will be non-negative and less - * than 128, which should guarantee that the ABI won't break even when - * new constants are added to existing enumerations. - */ -typedef enum { - LZMA_RESERVED_ENUM = 0 -} lzma_reserved_enum; - - -/** - * \brief Return values used by several functions in liblzma - * - * Check the descriptions of specific functions to find out which return - * values they can return. With some functions the return values may have - * more specific meanings than described here; those differences are - * described per-function basis. - */ -typedef enum { - LZMA_OK = 0, - /**< - * \brief Operation completed successfully - */ - - LZMA_STREAM_END = 1, - /**< - * \brief End of stream was reached - * - * In encoder, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, or - * LZMA_FINISH was finished. In decoder, this indicates - * that all the data was successfully decoded. - * - * In all cases, when LZMA_STREAM_END is returned, the last - * output bytes should be picked from strm->next_out. - */ - - LZMA_NO_CHECK = 2, - /**< - * \brief Input stream has no integrity check - * - * This return value can be returned only if the - * LZMA_TELL_NO_CHECK flag was used when initializing - * the decoder. LZMA_NO_CHECK is just a warning, and - * the decoding can be continued normally. - * - * It is possible to call lzma_get_check() immediately after - * lzma_code has returned LZMA_NO_CHECK. The result will - * naturally be LZMA_CHECK_NONE, but the possibility to call - * lzma_get_check() may be convenient in some applications. - */ - - LZMA_UNSUPPORTED_CHECK = 3, - /**< - * \brief Cannot calculate the integrity check - * - * The usage of this return value is different in encoders - * and decoders. - * - * Encoders can return this value only from the initialization - * function. If initialization fails with this value, the - * encoding cannot be done, because there's no way to produce - * output with the correct integrity check. - * - * Decoders can return this value only from lzma_code() and - * only if the LZMA_TELL_UNSUPPORTED_CHECK flag was used when - * initializing the decoder. The decoding can still be - * continued normally even if the check type is unsupported, - * but naturally the check will not be validated, and possible - * errors may go undetected. - * - * With decoder, it is possible to call lzma_get_check() - * immediately after lzma_code() has returned - * LZMA_UNSUPPORTED_CHECK. This way it is possible to find - * out what the unsupported Check ID was. - */ - - LZMA_GET_CHECK = 4, - /**< - * \brief Integrity check type is now available - * - * This value can be returned only by the lzma_code() function - * and only if the decoder was initialized with the - * LZMA_TELL_ANY_CHECK flag. LZMA_GET_CHECK tells the - * application that it may now call lzma_get_check() to find - * out the Check ID. This can be used, for example, to - * implement a decoder that accepts only files that have - * strong enough integrity check. - */ - - LZMA_MEM_ERROR = 5, - /**< - * \brief Cannot allocate memory - * - * Memory allocation failed, or the size of the allocation - * would be greater than SIZE_MAX. - * - * Due to internal implementation reasons, the coding cannot - * be continued even if more memory were made available after - * LZMA_MEM_ERROR. - */ - - LZMA_MEMLIMIT_ERROR = 6, - /**< - * \brief Memory usage limit was reached - * - * Decoder would need more memory than allowed by the - * specified memory usage limit. To continue decoding, - * the memory usage limit has to be increased with - * lzma_memlimit_set(). - * - * liblzma 5.2.6 and earlier had a bug in single-threaded .xz - * decoder (lzma_stream_decoder()) which made it impossible - * to continue decoding after LZMA_MEMLIMIT_ERROR even if - * the limit was increased using lzma_memlimit_set(). - * Other decoders worked correctly. - */ - - LZMA_FORMAT_ERROR = 7, - /**< - * \brief File format not recognized - * - * The decoder did not recognize the input as supported file - * format. This error can occur, for example, when trying to - * decode .lzma format file with lzma_stream_decoder, - * because lzma_stream_decoder accepts only the .xz format. - */ - - LZMA_OPTIONS_ERROR = 8, - /**< - * \brief Invalid or unsupported options - * - * Invalid or unsupported options, for example - * - unsupported filter(s) or filter options; or - * - reserved bits set in headers (decoder only). - * - * Rebuilding liblzma with more features enabled, or - * upgrading to a newer version of liblzma may help. - */ - - LZMA_DATA_ERROR = 9, - /**< - * \brief Data is corrupt - * - * The usage of this return value is different in encoders - * and decoders. In both encoder and decoder, the coding - * cannot continue after this error. - * - * Encoders return this if size limits of the target file - * format would be exceeded. These limits are huge, thus - * getting this error from an encoder is mostly theoretical. - * For example, the maximum compressed and uncompressed - * size of a .xz Stream is roughly 8 EiB (2^63 bytes). - * - * Decoders return this error if the input data is corrupt. - * This can mean, for example, invalid CRC32 in headers - * or invalid check of uncompressed data. - */ - - LZMA_BUF_ERROR = 10, - /**< - * \brief No progress is possible - * - * This error code is returned when the coder cannot consume - * any new input and produce any new output. The most common - * reason for this error is that the input stream being - * decoded is truncated or corrupt. - * - * This error is not fatal. Coding can be continued normally - * by providing more input and/or more output space, if - * possible. - * - * Typically the first call to lzma_code() that can do no - * progress returns LZMA_OK instead of LZMA_BUF_ERROR. Only - * the second consecutive call doing no progress will return - * LZMA_BUF_ERROR. This is intentional. - * - * With zlib, Z_BUF_ERROR may be returned even if the - * application is doing nothing wrong, so apps will need - * to handle Z_BUF_ERROR specially. The above hack - * guarantees that liblzma never returns LZMA_BUF_ERROR - * to properly written applications unless the input file - * is truncated or corrupt. This should simplify the - * applications a little. - */ - - LZMA_PROG_ERROR = 11, - /**< - * \brief Programming error - * - * This indicates that the arguments given to the function are - * invalid or the internal state of the decoder is corrupt. - * - Function arguments are invalid or the structures - * pointed by the argument pointers are invalid - * e.g. if strm->next_out has been set to NULL and - * strm->avail_out > 0 when calling lzma_code(). - * - lzma_* functions have been called in wrong order - * e.g. lzma_code() was called right after lzma_end(). - * - If errors occur randomly, the reason might be flaky - * hardware. - * - * If you think that your code is correct, this error code - * can be a sign of a bug in liblzma. See the documentation - * how to report bugs. - */ - - LZMA_SEEK_NEEDED = 12, - /**< - * \brief Request to change the input file position - * - * Some coders can do random access in the input file. The - * initialization functions of these coders take the file size - * as an argument. No other coders can return LZMA_SEEK_NEEDED. - * - * When this value is returned, the application must seek to - * the file position given in lzma_stream.seek_pos. This value - * is guaranteed to never exceed the file size that was - * specified at the coder initialization. - * - * After seeking the application should read new input and - * pass it normally via lzma_stream.next_in and .avail_in. - */ - - /* - * These enumerations may be used internally by liblzma - * but they will never be returned to applications. - */ - LZMA_RET_INTERNAL1 = 101, - LZMA_RET_INTERNAL2 = 102, - LZMA_RET_INTERNAL3 = 103, - LZMA_RET_INTERNAL4 = 104, - LZMA_RET_INTERNAL5 = 105, - LZMA_RET_INTERNAL6 = 106, - LZMA_RET_INTERNAL7 = 107, - LZMA_RET_INTERNAL8 = 108 -} lzma_ret; - - -/** - * \brief The 'action' argument for lzma_code() - * - * After the first use of LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, LZMA_FULL_BARRIER, - * or LZMA_FINISH, the same 'action' must be used until lzma_code() returns - * LZMA_STREAM_END. Also, the amount of input (that is, strm->avail_in) must - * not be modified by the application until lzma_code() returns - * LZMA_STREAM_END. Changing the 'action' or modifying the amount of input - * will make lzma_code() return LZMA_PROG_ERROR. - */ -typedef enum { - LZMA_RUN = 0, - /**< - * \brief Continue coding - * - * Encoder: Encode as much input as possible. Some internal - * buffering will probably be done (depends on the filter - * chain in use), which causes latency: the input used won't - * usually be decodeable from the output of the same - * lzma_code() call. - * - * Decoder: Decode as much input as possible and produce as - * much output as possible. - */ - - LZMA_SYNC_FLUSH = 1, - /**< - * \brief Make all the input available at output - * - * Normally the encoder introduces some latency. - * LZMA_SYNC_FLUSH forces all the buffered data to be - * available at output without resetting the internal - * state of the encoder. This way it is possible to use - * compressed stream for example for communication over - * network. - * - * Only some filters support LZMA_SYNC_FLUSH. Trying to use - * LZMA_SYNC_FLUSH with filters that don't support it will - * make lzma_code() return LZMA_OPTIONS_ERROR. For example, - * LZMA1 doesn't support LZMA_SYNC_FLUSH but LZMA2 does. - * - * Using LZMA_SYNC_FLUSH very often can dramatically reduce - * the compression ratio. With some filters (for example, - * LZMA2), fine-tuning the compression options may help - * mitigate this problem significantly (for example, - * match finder with LZMA2). - * - * Decoders don't support LZMA_SYNC_FLUSH. - */ - - LZMA_FULL_FLUSH = 2, - /**< - * \brief Finish encoding of the current Block - * - * All the input data going to the current Block must have - * been given to the encoder (the last bytes can still be - * pending in *next_in). Call lzma_code() with LZMA_FULL_FLUSH - * until it returns LZMA_STREAM_END. Then continue normally - * with LZMA_RUN or finish the Stream with LZMA_FINISH. - * - * This action is currently supported only by Stream encoder - * and easy encoder (which uses Stream encoder). If there is - * no unfinished Block, no empty Block is created. - */ - - LZMA_FULL_BARRIER = 4, - /**< - * \brief Finish encoding of the current Block - * - * This is like LZMA_FULL_FLUSH except that this doesn't - * necessarily wait until all the input has been made - * available via the output buffer. That is, lzma_code() - * might return LZMA_STREAM_END as soon as all the input - * has been consumed (avail_in == 0). - * - * LZMA_FULL_BARRIER is useful with a threaded encoder if - * one wants to split the .xz Stream into Blocks at specific - * offsets but doesn't care if the output isn't flushed - * immediately. Using LZMA_FULL_BARRIER allows keeping - * the threads busy while LZMA_FULL_FLUSH would make - * lzma_code() wait until all the threads have finished - * until more data could be passed to the encoder. - * - * With a lzma_stream initialized with the single-threaded - * lzma_stream_encoder() or lzma_easy_encoder(), - * LZMA_FULL_BARRIER is an alias for LZMA_FULL_FLUSH. - */ - - LZMA_FINISH = 3 - /**< - * \brief Finish the coding operation - * - * All the input data must have been given to the encoder - * (the last bytes can still be pending in next_in). - * Call lzma_code() with LZMA_FINISH until it returns - * LZMA_STREAM_END. Once LZMA_FINISH has been used, - * the amount of input must no longer be changed by - * the application. - * - * When decoding, using LZMA_FINISH is optional unless the - * LZMA_CONCATENATED flag was used when the decoder was - * initialized. When LZMA_CONCATENATED was not used, the only - * effect of LZMA_FINISH is that the amount of input must not - * be changed just like in the encoder. - */ -} lzma_action; - - -/** - * \brief Custom functions for memory handling - * - * A pointer to lzma_allocator may be passed via lzma_stream structure - * to liblzma, and some advanced functions take a pointer to lzma_allocator - * as a separate function argument. The library will use the functions - * specified in lzma_allocator for memory handling instead of the default - * malloc() and free(). C++ users should note that the custom memory - * handling functions must not throw exceptions. - * - * Single-threaded mode only: liblzma doesn't make an internal copy of - * lzma_allocator. Thus, it is OK to change these function pointers in - * the middle of the coding process, but obviously it must be done - * carefully to make sure that the replacement 'free' can deallocate - * memory allocated by the earlier 'alloc' function(s). - * - * Multithreaded mode: liblzma might internally store pointers to the - * lzma_allocator given via the lzma_stream structure. The application - * must not change the allocator pointer in lzma_stream or the contents - * of the pointed lzma_allocator structure until lzma_end() has been used - * to free the memory associated with that lzma_stream. The allocation - * functions might be called simultaneously from multiple threads, and - * thus they must be thread safe. - */ -typedef struct { - /** - * \brief Pointer to a custom memory allocation function - * - * If you don't want a custom allocator, but still want - * custom free(), set this to NULL and liblzma will use - * the standard malloc(). - * - * \param opaque lzma_allocator.opaque (see below) - * \param nmemb Number of elements like in calloc(). liblzma - * will always set nmemb to 1, so it is safe to - * ignore nmemb in a custom allocator if you like. - * The nmemb argument exists only for - * compatibility with zlib and libbzip2. - * \param size Size of an element in bytes. - * liblzma never sets this to zero. - * - * \return Pointer to the beginning of a memory block of - * 'size' bytes, or NULL if allocation fails - * for some reason. When allocation fails, functions - * of liblzma return LZMA_MEM_ERROR. - * - * The allocator should not waste time zeroing the allocated buffers. - * This is not only about speed, but also memory usage, since the - * operating system kernel doesn't necessarily allocate the requested - * memory in physical memory until it is actually used. With small - * input files, liblzma may actually need only a fraction of the - * memory that it requested for allocation. - * - * \note LZMA_MEM_ERROR is also used when the size of the - * allocation would be greater than SIZE_MAX. Thus, - * don't assume that the custom allocator must have - * returned NULL if some function from liblzma - * returns LZMA_MEM_ERROR. - */ - void *(LZMA_API_CALL *alloc)(void *opaque, size_t nmemb, size_t size); - - /** - * \brief Pointer to a custom memory freeing function - * - * If you don't want a custom freeing function, but still - * want a custom allocator, set this to NULL and liblzma - * will use the standard free(). - * - * \param opaque lzma_allocator.opaque (see below) - * \param ptr Pointer returned by lzma_allocator.alloc(), - * or when it is set to NULL, a pointer returned - * by the standard malloc(). - */ - void (LZMA_API_CALL *free)(void *opaque, void *ptr); - - /** - * \brief Pointer passed to .alloc() and .free() - * - * opaque is passed as the first argument to lzma_allocator.alloc() - * and lzma_allocator.free(). This intended to ease implementing - * custom memory allocation functions for use with liblzma. - * - * If you don't need this, you should set this to NULL. - */ - void *opaque; - -} lzma_allocator; - - -/** - * \brief Internal data structure - * - * The contents of this structure is not visible outside the library. - */ -typedef struct lzma_internal_s lzma_internal; - - -/** - * \brief Passing data to and from liblzma - * - * The lzma_stream structure is used for - * - passing pointers to input and output buffers to liblzma; - * - defining custom memory handler functions; and - * - holding a pointer to coder-specific internal data structures. - * - * Typical usage: - * - * - After allocating lzma_stream (on stack or with malloc()), it must be - * initialized to LZMA_STREAM_INIT (see LZMA_STREAM_INIT for details). - * - * - Initialize a coder to the lzma_stream, for example by using - * lzma_easy_encoder() or lzma_auto_decoder(). Some notes: - * - In contrast to zlib, strm->next_in and strm->next_out are - * ignored by all initialization functions, thus it is safe - * to not initialize them yet. - * - The initialization functions always set strm->total_in and - * strm->total_out to zero. - * - If the initialization function fails, no memory is left allocated - * that would require freeing with lzma_end() even if some memory was - * associated with the lzma_stream structure when the initialization - * function was called. - * - * - Use lzma_code() to do the actual work. - * - * - Once the coding has been finished, the existing lzma_stream can be - * reused. It is OK to reuse lzma_stream with different initialization - * function without calling lzma_end() first. Old allocations are - * automatically freed. - * - * - Finally, use lzma_end() to free the allocated memory. lzma_end() never - * frees the lzma_stream structure itself. - * - * Application may modify the values of total_in and total_out as it wants. - * They are updated by liblzma to match the amount of data read and - * written but aren't used for anything else except as a possible return - * values from lzma_get_progress(). - */ -typedef struct { - const uint8_t *next_in; /**< Pointer to the next input byte. */ - size_t avail_in; /**< Number of available input bytes in next_in. */ - uint64_t total_in; /**< Total number of bytes read by liblzma. */ - - uint8_t *next_out; /**< Pointer to the next output position. */ - size_t avail_out; /**< Amount of free space in next_out. */ - uint64_t total_out; /**< Total number of bytes written by liblzma. */ - - /** - * \brief Custom memory allocation functions - * - * In most cases this is NULL which makes liblzma use - * the standard malloc() and free(). - * - * \note In 5.0.x this is not a const pointer. - */ - const lzma_allocator *allocator; - - /** Internal state is not visible to applications. */ - lzma_internal *internal; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. Excluding the initialization of this structure, - * you should not touch these, because the names of these variables - * may change. - */ - - /** \private Reserved member. */ - void *reserved_ptr1; - - /** \private Reserved member. */ - void *reserved_ptr2; - - /** \private Reserved member. */ - void *reserved_ptr3; - - /** \private Reserved member. */ - void *reserved_ptr4; - - /** - * \brief New seek input position for LZMA_SEEK_NEEDED - * - * When lzma_code() returns LZMA_SEEK_NEEDED, the new input position - * needed by liblzma will be available seek_pos. The value is - * guaranteed to not exceed the file size that was specified when - * this lzma_stream was initialized. - * - * In all other situations the value of this variable is undefined. - */ - uint64_t seek_pos; - - /** \private Reserved member. */ - uint64_t reserved_int2; - - /** \private Reserved member. */ - size_t reserved_int3; - - /** \private Reserved member. */ - size_t reserved_int4; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum1; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum2; - -} lzma_stream; - - -/** - * \brief Initialization for lzma_stream - * - * When you declare an instance of lzma_stream, you can immediately - * initialize it so that initialization functions know that no memory - * has been allocated yet: - * - * lzma_stream strm = LZMA_STREAM_INIT; - * - * If you need to initialize a dynamically allocated lzma_stream, you can use - * memset(strm_pointer, 0, sizeof(lzma_stream)). Strictly speaking, this - * violates the C standard since NULL may have different internal - * representation than zero, but it should be portable enough in practice. - * Anyway, for maximum portability, you can use something like this: - * - * lzma_stream tmp = LZMA_STREAM_INIT; - * *strm = tmp; - */ -#define LZMA_STREAM_INIT \ - { NULL, 0, 0, NULL, 0, 0, NULL, NULL, \ - NULL, NULL, NULL, NULL, 0, 0, 0, 0, \ - LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } - - -/** - * \brief Encode or decode data - * - * Once the lzma_stream has been successfully initialized (e.g. with - * lzma_stream_encoder()), the actual encoding or decoding is done - * using this function. The application has to update strm->next_in, - * strm->avail_in, strm->next_out, and strm->avail_out to pass input - * to and get output from liblzma. - * - * See the description of the coder-specific initialization function to find - * out what 'action' values are supported by the coder. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param action Action for this function to take. Must be a valid - * lzma_action enum value. - * - * \return Any valid lzma_ret. See the lzma_ret enum description for more - * information. - */ -extern LZMA_API(lzma_ret) lzma_code(lzma_stream *strm, lzma_action action) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Free memory allocated for the coder data structures - * - * After lzma_end(strm), strm->internal is guaranteed to be NULL. No other - * members of the lzma_stream structure are touched. - * - * \note zlib indicates an error if application end()s unfinished - * stream structure. liblzma doesn't do this, and assumes that - * application knows what it is doing. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - */ -extern LZMA_API(void) lzma_end(lzma_stream *strm) lzma_nothrow; - - -/** - * \brief Get progress information - * - * In single-threaded mode, applications can get progress information from - * strm->total_in and strm->total_out. In multi-threaded mode this is less - * useful because a significant amount of both input and output data gets - * buffered internally by liblzma. This makes total_in and total_out give - * misleading information and also makes the progress indicator updates - * non-smooth. - * - * This function gives realistic progress information also in multi-threaded - * mode by taking into account the progress made by each thread. In - * single-threaded mode *progress_in and *progress_out are set to - * strm->total_in and strm->total_out, respectively. - * - * \param strm Pointer to lzma_stream that is at least - * initialized with LZMA_STREAM_INIT. - * \param[out] progress_in Pointer to the number of input bytes processed. - * \param[out] progress_out Pointer to the number of output bytes processed. - */ -extern LZMA_API(void) lzma_get_progress(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) lzma_nothrow; - - -/** - * \brief Get the memory usage of decoder filter chain - * - * This function is currently supported only when *strm has been initialized - * with a function that takes a memlimit argument. With other functions, you - * should use e.g. lzma_raw_encoder_memusage() or lzma_raw_decoder_memusage() - * to estimate the memory requirements. - * - * This function is useful e.g. after LZMA_MEMLIMIT_ERROR to find out how big - * the memory usage limit should have been to decode the input. Note that - * this may give misleading information if decoding .xz Streams that have - * multiple Blocks, because each Block can have different memory requirements. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * - * \return How much memory is currently allocated for the filter - * decoders. If no filter chain is currently allocated, - * some non-zero value is still returned, which is less than - * or equal to what any filter chain would indicate as its - * memory requirement. - * - * If this function isn't supported by *strm or some other error - * occurs, zero is returned. - */ -extern LZMA_API(uint64_t) lzma_memusage(const lzma_stream *strm) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the current memory usage limit - * - * This function is supported only when *strm has been initialized with - * a function that takes a memlimit argument. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * - * \return On success, the current memory usage limit is returned - * (always non-zero). On error, zero is returned. - */ -extern LZMA_API(uint64_t) lzma_memlimit_get(const lzma_stream *strm) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Set the memory usage limit - * - * This function is supported only when *strm has been initialized with - * a function that takes a memlimit argument. - * - * liblzma 5.2.3 and earlier has a bug where memlimit value of 0 causes - * this function to do nothing (leaving the limit unchanged) and still - * return LZMA_OK. Later versions treat 0 as if 1 had been specified (so - * lzma_memlimit_get() will return 1 even if you specify 0 here). - * - * liblzma 5.2.6 and earlier had a bug in single-threaded .xz decoder - * (lzma_stream_decoder()) which made it impossible to continue decoding - * after LZMA_MEMLIMIT_ERROR even if the limit was increased using - * lzma_memlimit_set(). Other decoders worked correctly. - * - * \return Possible lzma_ret values: - * - LZMA_OK: New memory usage limit successfully set. - * - LZMA_MEMLIMIT_ERROR: The new limit is too small. - * The limit was not changed. - * - LZMA_PROG_ERROR: Invalid arguments, e.g. *strm doesn't - * support memory usage limit. - */ -extern LZMA_API(lzma_ret) lzma_memlimit_set( - lzma_stream *strm, uint64_t memlimit) lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/bcj.h b/software/src/xz/src/liblzma/api/lzma/bcj.h deleted file mode 100644 index fb737cb..0000000 --- a/software/src/xz/src/liblzma/api/lzma/bcj.h +++ /dev/null @@ -1,195 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/bcj.h - * \brief Branch/Call/Jump conversion filters - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/* Filter IDs for lzma_filter.id */ - -/** - * \brief Filter for x86 binaries - */ -#define LZMA_FILTER_X86 LZMA_VLI_C(0x04) - -/** - * \brief Filter for Big endian PowerPC binaries - */ -#define LZMA_FILTER_POWERPC LZMA_VLI_C(0x05) - -/** - * \brief Filter for IA-64 (Itanium) binaries - */ -#define LZMA_FILTER_IA64 LZMA_VLI_C(0x06) - -/** - * \brief Filter for ARM binaries - */ -#define LZMA_FILTER_ARM LZMA_VLI_C(0x07) - -/** - * \brief Filter for ARM-Thumb binaries - */ -#define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08) - -/** - * \brief Filter for SPARC binaries - */ -#define LZMA_FILTER_SPARC LZMA_VLI_C(0x09) - -/** - * \brief Filter for ARM64 binaries - */ -#define LZMA_FILTER_ARM64 LZMA_VLI_C(0x0A) - -/** - * \brief Filter for RISC-V binaries - */ -#define LZMA_FILTER_RISCV LZMA_VLI_C(0x0B) - - -/** - * \brief Options for BCJ filters - * - * The BCJ filters never change the size of the data. Specifying options - * for them is optional: if pointer to options is NULL, default value is - * used. You probably never need to specify options to BCJ filters, so just - * set the options pointer to NULL and be happy. - * - * If options with non-default values have been specified when encoding, - * the same options must also be specified when decoding. - * - * \note At the moment, none of the BCJ filters support - * LZMA_SYNC_FLUSH. If LZMA_SYNC_FLUSH is specified, - * LZMA_OPTIONS_ERROR will be returned. If there is need, - * partial support for LZMA_SYNC_FLUSH can be added in future. - * Partial means that flushing would be possible only at - * offsets that are multiple of 2, 4, or 16 depending on - * the filter, except x86 which cannot be made to support - * LZMA_SYNC_FLUSH predictably. - */ -typedef struct { - /** - * \brief Start offset for conversions - * - * This setting is useful only when the same filter is used - * _separately_ for multiple sections of the same executable file, - * and the sections contain cross-section branch/call/jump - * instructions. In that case it is beneficial to set the start - * offset of the non-first sections so that the relative addresses - * of the cross-section branch/call/jump instructions will use the - * same absolute addresses as in the first section. - * - * When the pointer to options is NULL, the default value (zero) - * is used. - */ - uint32_t start_offset; - -} lzma_options_bcj; - - -/** - * \brief Raw ARM64 BCJ encoder - * - * This is for special use cases only. - * - * \param start_offset The lowest 32 bits of the offset in the - * executable being filtered. For the ARM64 - * filter, this must be a multiple of four. - * For the very best results, this should also - * be in sync with 4096-byte page boundaries - * in the executable due to how ARM64's ADRP - * instruction works. - * \param buf Buffer to be filtered in place - * \param size Size of the buffer - * - * \return Number of bytes that were processed in `buf`. This is at most - * `size`. With the ARM64 filter, the return value is always - * a multiple of 4, and at most 3 bytes are left unfiltered. - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_arm64_encode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; - -/** - * \brief Raw ARM64 BCJ decoder - * - * See lzma_bcj_arm64_encode(). - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_arm64_decode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; - - -/** - * \brief Raw RISC-V BCJ encoder - * - * This is for special use cases only. - * - * \param start_offset The lowest 32 bits of the offset in the - * executable being filtered. For the RISC-V - * filter, this must be a multiple of 2. - * \param buf Buffer to be filtered in place - * \param size Size of the buffer - * - * \return Number of bytes that were processed in `buf`. This is at most - * `size`. With the RISC-V filter, the return value is always - * a multiple of 2, and at most 7 bytes are left unfiltered. - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_riscv_encode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; - -/** - * \brief Raw RISC-V BCJ decoder - * - * See lzma_bcj_riscv_encode(). - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_riscv_decode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; - - -/** - * \brief Raw x86 BCJ encoder - * - * This is for special use cases only. - * - * \param start_offset The lowest 32 bits of the offset in the - * executable being filtered. For the x86 - * filter, all values are valid. - * \param buf Buffer to be filtered in place - * \param size Size of the buffer - * - * \return Number of bytes that were processed in `buf`. This is at most - * `size`. For the x86 filter, the return value is always - * a multiple of 1, and at most 4 bytes are left unfiltered. - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_x86_encode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; - -/** - * \brief Raw x86 BCJ decoder - * - * See lzma_bcj_x86_encode(). - * - * \since 5.7.1alpha - */ -extern LZMA_API(size_t) lzma_bcj_x86_decode( - uint32_t start_offset, uint8_t *buf, size_t size) lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/block.h b/software/src/xz/src/liblzma/api/lzma/block.h deleted file mode 100644 index 05b77e5..0000000 --- a/software/src/xz/src/liblzma/api/lzma/block.h +++ /dev/null @@ -1,694 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/block.h - * \brief .xz Block handling - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Options for the Block and Block Header encoders and decoders - * - * Different Block handling functions use different parts of this structure. - * Some read some members, other functions write, and some do both. Only the - * members listed for reading need to be initialized when the specified - * functions are called. The members marked for writing will be assigned - * new values at some point either by calling the given function or by - * later calls to lzma_code(). - */ -typedef struct { - /** - * \brief Block format version - * - * To prevent API and ABI breakages when new features are needed, - * a version number is used to indicate which members in this - * structure are in use: - * - liblzma >= 5.0.0: version = 0 is supported. - * - liblzma >= 5.1.4beta: Support for version = 1 was added, - * which adds the ignore_check member. - * - * If version is greater than one, most Block related functions - * will return LZMA_OPTIONS_ERROR (lzma_block_header_decode() works - * with any version value). - * - * Read by: - * - lzma_block_header_size() - * - lzma_block_header_encode() - * - lzma_block_header_decode() - * - lzma_block_compressed_size() - * - lzma_block_unpadded_size() - * - lzma_block_total_size() - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_uncomp_encode() - * - lzma_block_buffer_decode() - * - * Written by: - * - lzma_block_header_decode() - */ - uint32_t version; - - /** - * \brief Size of the Block Header field in bytes - * - * This is always a multiple of four. - * - * Read by: - * - lzma_block_header_encode() - * - lzma_block_header_decode() - * - lzma_block_compressed_size() - * - lzma_block_unpadded_size() - * - lzma_block_total_size() - * - lzma_block_decoder() - * - lzma_block_buffer_decode() - * - * Written by: - * - lzma_block_header_size() - * - lzma_block_buffer_encode() - * - lzma_block_uncomp_encode() - */ - uint32_t header_size; -# define LZMA_BLOCK_HEADER_SIZE_MIN 8 -# define LZMA_BLOCK_HEADER_SIZE_MAX 1024 - - /** - * \brief Type of integrity Check - * - * The Check ID is not stored into the Block Header, thus its value - * must be provided also when decoding. - * - * Read by: - * - lzma_block_header_encode() - * - lzma_block_header_decode() - * - lzma_block_compressed_size() - * - lzma_block_unpadded_size() - * - lzma_block_total_size() - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_buffer_decode() - */ - lzma_check check; - - /** - * \brief Size of the Compressed Data in bytes - * - * Encoding: If this is not LZMA_VLI_UNKNOWN, Block Header encoder - * will store this value to the Block Header. Block encoder doesn't - * care about this value, but will set it once the encoding has been - * finished. - * - * Decoding: If this is not LZMA_VLI_UNKNOWN, Block decoder will - * verify that the size of the Compressed Data field matches - * compressed_size. - * - * Usually you don't know this value when encoding in streamed mode, - * and thus cannot write this field into the Block Header. - * - * In non-streamed mode you can reserve space for this field before - * encoding the actual Block. After encoding the data, finish the - * Block by encoding the Block Header. Steps in detail: - * - * - Set compressed_size to some big enough value. If you don't know - * better, use LZMA_VLI_MAX, but remember that bigger values take - * more space in Block Header. - * - * - Call lzma_block_header_size() to see how much space you need to - * reserve for the Block Header. - * - * - Encode the Block using lzma_block_encoder() and lzma_code(). - * It sets compressed_size to the correct value. - * - * - Use lzma_block_header_encode() to encode the Block Header. - * Because space was reserved in the first step, you don't need - * to call lzma_block_header_size() anymore, because due to - * reserving, header_size has to be big enough. If it is "too big", - * lzma_block_header_encode() will add enough Header Padding to - * make Block Header to match the size specified by header_size. - * - * Read by: - * - lzma_block_header_size() - * - lzma_block_header_encode() - * - lzma_block_compressed_size() - * - lzma_block_unpadded_size() - * - lzma_block_total_size() - * - lzma_block_decoder() - * - lzma_block_buffer_decode() - * - * Written by: - * - lzma_block_header_decode() - * - lzma_block_compressed_size() - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_uncomp_encode() - * - lzma_block_buffer_decode() - */ - lzma_vli compressed_size; - - /** - * \brief Uncompressed Size in bytes - * - * This is handled very similarly to compressed_size above. - * - * uncompressed_size is needed by fewer functions than - * compressed_size. This is because uncompressed_size isn't - * needed to validate that Block stays within proper limits. - * - * Read by: - * - lzma_block_header_size() - * - lzma_block_header_encode() - * - lzma_block_decoder() - * - lzma_block_buffer_decode() - * - * Written by: - * - lzma_block_header_decode() - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_uncomp_encode() - * - lzma_block_buffer_decode() - */ - lzma_vli uncompressed_size; - - /** - * \brief Array of filters - * - * There can be 1-4 filters. The end of the array is marked with - * .id = LZMA_VLI_UNKNOWN. - * - * Read by: - * - lzma_block_header_size() - * - lzma_block_header_encode() - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_buffer_decode() - * - * Written by: - * - lzma_block_header_decode(): Note that this does NOT free() - * the old filter options structures. All unused filters[] will - * have .id == LZMA_VLI_UNKNOWN and .options == NULL. If - * decoding fails, all filters[] are guaranteed to be - * LZMA_VLI_UNKNOWN and NULL. - * - * \note Because of the array is terminated with - * .id = LZMA_VLI_UNKNOWN, the actual array must - * have LZMA_FILTERS_MAX + 1 members or the Block - * Header decoder will overflow the buffer. - */ - lzma_filter *filters; - - /** - * \brief Raw value stored in the Check field - * - * After successful coding, the first lzma_check_size(check) bytes - * of this array contain the raw value stored in the Check field. - * - * Note that CRC32 and CRC64 are stored in little endian byte order. - * Take it into account if you display the Check values to the user. - * - * Written by: - * - lzma_block_encoder() - * - lzma_block_decoder() - * - lzma_block_buffer_encode() - * - lzma_block_uncomp_encode() - * - lzma_block_buffer_decode() - */ - uint8_t raw_check[LZMA_CHECK_SIZE_MAX]; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * with the currently supported options, so it is safe to leave these - * uninitialized. - */ - - /** \private Reserved member. */ - void *reserved_ptr1; - - /** \private Reserved member. */ - void *reserved_ptr2; - - /** \private Reserved member. */ - void *reserved_ptr3; - - /** \private Reserved member. */ - uint32_t reserved_int1; - - /** \private Reserved member. */ - uint32_t reserved_int2; - - /** \private Reserved member. */ - lzma_vli reserved_int3; - - /** \private Reserved member. */ - lzma_vli reserved_int4; - - /** \private Reserved member. */ - lzma_vli reserved_int5; - - /** \private Reserved member. */ - lzma_vli reserved_int6; - - /** \private Reserved member. */ - lzma_vli reserved_int7; - - /** \private Reserved member. */ - lzma_vli reserved_int8; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum1; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum2; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum3; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum4; - - /** - * \brief A flag to Block decoder to not verify the Check field - * - * This member is supported by liblzma >= 5.1.4beta if .version >= 1. - * - * If this is set to true, the integrity check won't be calculated - * and verified. Unless you know what you are doing, you should - * leave this to false. (A reason to set this to true is when the - * file integrity is verified externally anyway and you want to - * speed up the decompression, which matters mostly when using - * SHA-256 as the integrity check.) - * - * If .version >= 1, read by: - * - lzma_block_decoder() - * - lzma_block_buffer_decode() - * - * Written by (.version is ignored): - * - lzma_block_header_decode() always sets this to false - */ - lzma_bool ignore_check; - - /** \private Reserved member. */ - lzma_bool reserved_bool2; - - /** \private Reserved member. */ - lzma_bool reserved_bool3; - - /** \private Reserved member. */ - lzma_bool reserved_bool4; - - /** \private Reserved member. */ - lzma_bool reserved_bool5; - - /** \private Reserved member. */ - lzma_bool reserved_bool6; - - /** \private Reserved member. */ - lzma_bool reserved_bool7; - - /** \private Reserved member. */ - lzma_bool reserved_bool8; - -} lzma_block; - - -/** - * \brief Decode the Block Header Size field - * - * To decode Block Header using lzma_block_header_decode(), the size of the - * Block Header has to be known and stored into lzma_block.header_size. - * The size can be calculated from the first byte of a Block using this macro. - * Note that if the first byte is 0x00, it indicates beginning of Index; use - * this macro only when the byte is not 0x00. - * - * There is no encoding macro because lzma_block_header_size() and - * lzma_block_header_encode() should be used. - */ -#define lzma_block_header_size_decode(b) (((uint32_t)(b) + 1) * 4) - - -/** - * \brief Calculate Block Header Size - * - * Calculate the minimum size needed for the Block Header field using the - * settings specified in the lzma_block structure. Note that it is OK to - * increase the calculated header_size value as long as it is a multiple of - * four and doesn't exceed LZMA_BLOCK_HEADER_SIZE_MAX. Increasing header_size - * just means that lzma_block_header_encode() will add Header Padding. - * - * \note This doesn't check that all the options are valid i.e. this - * may return LZMA_OK even if lzma_block_header_encode() or - * lzma_block_encoder() would fail. If you want to validate the - * filter chain, consider using lzma_memlimit_encoder() which as - * a side-effect validates the filter chain. - * - * \param block Block options - * - * \return Possible lzma_ret values: - * - LZMA_OK: Size calculated successfully and stored to - * block->header_size. - * - LZMA_OPTIONS_ERROR: Unsupported version, filters or - * filter options. - * - LZMA_PROG_ERROR: Invalid values like compressed_size == 0. - */ -extern LZMA_API(lzma_ret) lzma_block_header_size(lzma_block *block) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Encode Block Header - * - * The caller must have calculated the size of the Block Header already with - * lzma_block_header_size(). If a value larger than the one calculated by - * lzma_block_header_size() is used, the Block Header will be padded to the - * specified size. - * - * \param block Block options to be encoded. - * \param[out] out Beginning of the output buffer. This must be - * at least block->header_size bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. block->header_size - * bytes were written to output buffer. - * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. - * - LZMA_PROG_ERROR: Invalid arguments, for example - * block->header_size is invalid or block->filters is NULL. - */ -extern LZMA_API(lzma_ret) lzma_block_header_encode( - const lzma_block *block, uint8_t *out) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode Block Header - * - * block->version should (usually) be set to the highest value supported - * by the application. If the application sets block->version to a value - * higher than supported by the current liblzma version, this function will - * downgrade block->version to the highest value supported by it. Thus one - * should check the value of block->version after calling this function if - * block->version was set to a non-zero value and the application doesn't - * otherwise know that the liblzma version being used is new enough to - * support the specified block->version. - * - * The size of the Block Header must have already been decoded with - * lzma_block_header_size_decode() macro and stored to block->header_size. - * - * The integrity check type from Stream Header must have been stored - * to block->check. - * - * block->filters must have been allocated, but they don't need to be - * initialized (possible existing filter options are not freed). - * - * \param[out] block Destination for Block options - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() (and also free() - * if an error occurs). - * \param in Beginning of the input buffer. This must be - * at least block->header_size bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. block->header_size - * bytes were read from the input buffer. - * - LZMA_OPTIONS_ERROR: The Block Header specifies some - * unsupported options such as unsupported filters. This can - * happen also if block->version was set to a too low value - * compared to what would be required to properly represent - * the information stored in the Block Header. - * - LZMA_DATA_ERROR: Block Header is corrupt, for example, - * the CRC32 doesn't match. - * - LZMA_PROG_ERROR: Invalid arguments, for example - * block->header_size is invalid or block->filters is NULL. - */ -extern LZMA_API(lzma_ret) lzma_block_header_decode(lzma_block *block, - const lzma_allocator *allocator, const uint8_t *in) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Validate and set Compressed Size according to Unpadded Size - * - * Block Header stores Compressed Size, but Index has Unpadded Size. If the - * application has already parsed the Index and is now decoding Blocks, - * it can calculate Compressed Size from Unpadded Size. This function does - * exactly that with error checking: - * - * - Compressed Size calculated from Unpadded Size must be positive integer, - * that is, Unpadded Size must be big enough that after Block Header and - * Check fields there's still at least one byte for Compressed Size. - * - * - If Compressed Size was present in Block Header, the new value - * calculated from Unpadded Size is compared against the value - * from Block Header. - * - * \note This function must be called _after_ decoding the Block Header - * field so that it can properly validate Compressed Size if it - * was present in Block Header. - * - * \param block Block options: block->header_size must - * already be set with lzma_block_header_size(). - * \param unpadded_size Unpadded Size from the Index field in bytes - * - * \return Possible lzma_ret values: - * - LZMA_OK: block->compressed_size was set successfully. - * - LZMA_DATA_ERROR: unpadded_size is too small compared to - * block->header_size and lzma_check_size(block->check). - * - LZMA_PROG_ERROR: Some values are invalid. For example, - * block->header_size must be a multiple of four and - * between 8 and 1024 inclusive. - */ -extern LZMA_API(lzma_ret) lzma_block_compressed_size( - lzma_block *block, lzma_vli unpadded_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate Unpadded Size - * - * The Index field stores Unpadded Size and Uncompressed Size. The latter - * can be taken directly from the lzma_block structure after coding a Block, - * but Unpadded Size needs to be calculated from Block Header Size, - * Compressed Size, and size of the Check field. This is where this function - * is needed. - * - * \param block Block options: block->header_size must already be - * set with lzma_block_header_size(). - * - * \return Unpadded Size on success, or zero on error. - */ -extern LZMA_API(lzma_vli) lzma_block_unpadded_size(const lzma_block *block) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate the total encoded size of a Block - * - * This is equivalent to lzma_block_unpadded_size() except that the returned - * value includes the size of the Block Padding field. - * - * \param block Block options: block->header_size must already be - * set with lzma_block_header_size(). - * - * \return On success, total encoded size of the Block. On error, - * zero is returned. - */ -extern LZMA_API(lzma_vli) lzma_block_total_size(const lzma_block *block) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize .xz Block encoder - * - * Valid actions for lzma_code() are LZMA_RUN, LZMA_SYNC_FLUSH (only if the - * filter chain supports it), and LZMA_FINISH. - * - * The Block encoder encodes the Block Data, Block Padding, and Check value. - * It does NOT encode the Block Header which can be encoded with - * lzma_block_header_encode(). - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param block Block options: block->version, block->check, - * and block->filters must have been initialized. - * - * \return Possible lzma_ret values: - * - LZMA_OK: All good, continue with lzma_code(). - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_UNSUPPORTED_CHECK: block->check specifies a Check ID - * that is not supported by this build of liblzma. Initializing - * the encoder failed. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_block_encoder( - lzma_stream *strm, lzma_block *block) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .xz Block decoder - * - * Valid actions for lzma_code() are LZMA_RUN and LZMA_FINISH. Using - * LZMA_FINISH is not required. It is supported only for convenience. - * - * The Block decoder decodes the Block Data, Block Padding, and Check value. - * It does NOT decode the Block Header which can be decoded with - * lzma_block_header_decode(). - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param block Block options - * - * \return Possible lzma_ret values: - * - LZMA_OK: All good, continue with lzma_code(). - * - LZMA_PROG_ERROR - * - LZMA_MEM_ERROR - */ -extern LZMA_API(lzma_ret) lzma_block_decoder( - lzma_stream *strm, lzma_block *block) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate maximum output size for single-call Block encoding - * - * This is equivalent to lzma_stream_buffer_bound() but for .xz Blocks. - * See the documentation of lzma_stream_buffer_bound(). - * - * \param uncompressed_size Size of the data to be encoded with the - * single-call Block encoder. - * - * \return Maximum output size in bytes for single-call Block encoding. - */ -extern LZMA_API(size_t) lzma_block_buffer_bound(size_t uncompressed_size) - lzma_nothrow; - - -/** - * \brief Single-call .xz Block encoder - * - * In contrast to the multi-call encoder initialized with - * lzma_block_encoder(), this function encodes also the Block Header. This - * is required to make it possible to write appropriate Block Header also - * in case the data isn't compressible, and different filter chain has to be - * used to encode the data in uncompressed form using uncompressed chunks - * of the LZMA2 filter. - * - * When the data isn't compressible, header_size, compressed_size, and - * uncompressed_size are set just like when the data was compressible, but - * it is possible that header_size is too small to hold the filter chain - * specified in block->filters, because that isn't necessarily the filter - * chain that was actually used to encode the data. lzma_block_unpadded_size() - * still works normally, because it doesn't read the filters array. - * - * \param block Block options: block->version, block->check, - * and block->filters must have been initialized. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_block_buffer_encode( - lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call uncompressed .xz Block encoder - * - * This is like lzma_block_buffer_encode() except this doesn't try to - * compress the data and instead encodes the data using LZMA2 uncompressed - * chunks. The required output buffer size can be determined with - * lzma_block_buffer_bound(). - * - * Since the data won't be compressed, this function ignores block->filters. - * This function doesn't take lzma_allocator because this function doesn't - * allocate any memory from the heap. - * - * \param block Block options: block->version, block->check, - * and block->filters must have been initialized. - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_block_uncomp_encode(lzma_block *block, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Block decoder - * - * This is single-call equivalent of lzma_block_decoder(), and requires that - * the caller has already decoded Block Header and checked its memory usage. - * - * \param block Block options - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_OPTIONS_ERROR - * - LZMA_DATA_ERROR - * - LZMA_MEM_ERROR - * - LZMA_BUF_ERROR: Output buffer was too small. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_block_buffer_decode( - lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/check.h b/software/src/xz/src/liblzma/api/lzma/check.h deleted file mode 100644 index e7a50ed..0000000 --- a/software/src/xz/src/liblzma/api/lzma/check.h +++ /dev/null @@ -1,163 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/check.h - * \brief Integrity checks - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Type of the integrity check (Check ID) - * - * The .xz format supports multiple types of checks that are calculated - * from the uncompressed data. They vary in both speed and ability to - * detect errors. - */ -typedef enum { - LZMA_CHECK_NONE = 0, - /**< - * No Check is calculated. - * - * Size of the Check field: 0 bytes - */ - - LZMA_CHECK_CRC32 = 1, - /**< - * CRC32 using the polynomial from the IEEE 802.3 standard - * - * Size of the Check field: 4 bytes - */ - - LZMA_CHECK_CRC64 = 4, - /**< - * CRC64 using the polynomial from the ECMA-182 standard - * - * Size of the Check field: 8 bytes - */ - - LZMA_CHECK_SHA256 = 10 - /**< - * SHA-256 - * - * Size of the Check field: 32 bytes - */ -} lzma_check; - - -/** - * \brief Maximum valid Check ID - * - * The .xz file format specification specifies 16 Check IDs (0-15). Some - * of them are only reserved, that is, no actual Check algorithm has been - * assigned. When decoding, liblzma still accepts unknown Check IDs for - * future compatibility. If a valid but unsupported Check ID is detected, - * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, - * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. - */ -#define LZMA_CHECK_ID_MAX 15 - - -/** - * \brief Test if the given Check ID is supported - * - * LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always supported (even if - * liblzma is built with limited features). - * - * \note It is safe to call this with a value that is not in the - * range [0, 15]; in that case the return value is always false. - * - * \param check Check ID - * - * \return lzma_bool: - * - true if Check ID is supported by this liblzma build. - * - false otherwise. - */ -extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Get the size of the Check field with the given Check ID - * - * Although not all Check IDs have a check algorithm associated, the size of - * every Check is already frozen. This function returns the size (in bytes) of - * the Check field with the specified Check ID. The values are: - * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } - * - * \param check Check ID - * - * \return Size of the Check field in bytes. If the argument is not in - * the range [0, 15], UINT32_MAX is returned. - */ -extern LZMA_API(uint32_t) lzma_check_size(lzma_check check) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Maximum size of a Check field - */ -#define LZMA_CHECK_SIZE_MAX 64 - - -/** - * \brief Calculate CRC32 - * - * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. - * - * \param buf Pointer to the input buffer - * \param size Size of the input buffer - * \param crc Previously returned CRC value. This is used to - * calculate the CRC of a big buffer in smaller chunks. - * Set to zero when starting a new calculation. - * - * \return Updated CRC value, which can be passed to this function - * again to continue CRC calculation. - */ -extern LZMA_API(uint32_t) lzma_crc32( - const uint8_t *buf, size_t size, uint32_t crc) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate CRC64 - * - * Calculate CRC64 using the polynomial from the ECMA-182 standard. - * - * This function is used similarly to lzma_crc32(). - * - * \param buf Pointer to the input buffer - * \param size Size of the input buffer - * \param crc Previously returned CRC value. This is used to - * calculate the CRC of a big buffer in smaller chunks. - * Set to zero when starting a new calculation. - * - * \return Updated CRC value, which can be passed to this function - * again to continue CRC calculation. - */ -extern LZMA_API(uint64_t) lzma_crc64( - const uint8_t *buf, size_t size, uint64_t crc) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the type of the integrity check - * - * This function can be called only immediately after lzma_code() has - * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. - * Calling this function in any other situation has undefined behavior. - * - * \param strm Pointer to lzma_stream meeting the above conditions. - * - * \return Check ID in the lzma_stream, or undefined if called improperly. - */ -extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) - lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/container.h b/software/src/xz/src/liblzma/api/lzma/container.h deleted file mode 100644 index dbd414c..0000000 --- a/software/src/xz/src/liblzma/api/lzma/container.h +++ /dev/null @@ -1,995 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/container.h - * \brief File formats - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/************ - * Encoding * - ************/ - -/** - * \brief Default compression preset - * - * It's not straightforward to recommend a default preset, because in some - * cases keeping the resource usage relatively low is more important that - * getting the maximum compression ratio. - */ -#define LZMA_PRESET_DEFAULT UINT32_C(6) - - -/** - * \brief Mask for preset level - * - * This is useful only if you need to extract the level from the preset - * variable. That should be rare. - */ -#define LZMA_PRESET_LEVEL_MASK UINT32_C(0x1F) - - -/* - * Preset flags - * - * Currently only one flag is defined. - */ - -/** - * \brief Extreme compression preset - * - * This flag modifies the preset to make the encoding significantly slower - * while improving the compression ratio only marginally. This is useful - * when you don't mind spending time to get as small result as possible. - * - * This flag doesn't affect the memory usage requirements of the decoder (at - * least not significantly). The memory usage of the encoder may be increased - * a little but only at the lowest preset levels (0-3). - */ -#define LZMA_PRESET_EXTREME (UINT32_C(1) << 31) - - -/** - * \brief Multithreading options - */ -typedef struct { - /** - * \brief Flags - * - * Set this to zero if no flags are wanted. - * - * Encoder: No flags are currently supported. - * - * Decoder: Bitwise-or of zero or more of the decoder flags: - * - LZMA_TELL_NO_CHECK - * - LZMA_TELL_UNSUPPORTED_CHECK - * - LZMA_TELL_ANY_CHECK - * - LZMA_IGNORE_CHECK - * - LZMA_CONCATENATED - * - LZMA_FAIL_FAST - */ - uint32_t flags; - - /** - * \brief Number of worker threads to use - */ - uint32_t threads; - - /** - * \brief Encoder only: Maximum uncompressed size of a Block - * - * The encoder will start a new .xz Block every block_size bytes. - * Using LZMA_FULL_FLUSH or LZMA_FULL_BARRIER with lzma_code() - * the caller may tell liblzma to start a new Block earlier. - * - * With LZMA2, a recommended block size is 2-4 times the LZMA2 - * dictionary size. With very small dictionaries, it is recommended - * to use at least 1 MiB block size for good compression ratio, even - * if this is more than four times the dictionary size. Note that - * these are only recommendations for typical use cases; feel free - * to use other values. Just keep in mind that using a block size - * less than the LZMA2 dictionary size is waste of RAM. - * - * Set this to 0 to let liblzma choose the block size depending - * on the compression options. For LZMA2 it will be 3*dict_size - * or 1 MiB, whichever is more. - * - * For each thread, about 3 * block_size bytes of memory will be - * allocated. This may change in later liblzma versions. If so, - * the memory usage will probably be reduced, not increased. - */ - uint64_t block_size; - - /** - * \brief Timeout to allow lzma_code() to return early - * - * Multithreading can make liblzma consume input and produce - * output in a very bursty way: it may first read a lot of input - * to fill internal buffers, then no input or output occurs for - * a while. - * - * In single-threaded mode, lzma_code() won't return until it has - * either consumed all the input or filled the output buffer. If - * this is done in multithreaded mode, it may cause a call - * lzma_code() to take even tens of seconds, which isn't acceptable - * in all applications. - * - * To avoid very long blocking times in lzma_code(), a timeout - * (in milliseconds) may be set here. If lzma_code() would block - * longer than this number of milliseconds, it will return with - * LZMA_OK. Reasonable values are 100 ms or more. The xz command - * line tool uses 300 ms. - * - * If long blocking times are acceptable, set timeout to a special - * value of 0. This will disable the timeout mechanism and will make - * lzma_code() block until all the input is consumed or the output - * buffer has been filled. - * - * \note Even with a timeout, lzma_code() might sometimes take - * a long time to return. No timing guarantees are made. - */ - uint32_t timeout; - - /** - * \brief Encoder only: Compression preset - * - * The preset is set just like with lzma_easy_encoder(). - * The preset is ignored if filters below is non-NULL. - */ - uint32_t preset; - - /** - * \brief Encoder only: Filter chain (alternative to a preset) - * - * If this is NULL, the preset above is used. Otherwise the preset - * is ignored and the filter chain specified here is used. - */ - const lzma_filter *filters; - - /** - * \brief Encoder only: Integrity check type - * - * See check.h for available checks. The xz command line tool - * defaults to LZMA_CHECK_CRC64, which is a good choice if you - * are unsure. - */ - lzma_check check; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * with the currently supported options, so it is safe to leave these - * uninitialized. - */ - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum1; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum2; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum3; - - /** \private Reserved member. */ - uint32_t reserved_int1; - - /** \private Reserved member. */ - uint32_t reserved_int2; - - /** \private Reserved member. */ - uint32_t reserved_int3; - - /** \private Reserved member. */ - uint32_t reserved_int4; - - /** - * \brief Memory usage limit to reduce the number of threads - * - * Encoder: Ignored. - * - * Decoder: - * - * If the number of threads has been set so high that more than - * memlimit_threading bytes of memory would be needed, the number - * of threads will be reduced so that the memory usage will not exceed - * memlimit_threading bytes. However, if memlimit_threading cannot - * be met even in single-threaded mode, then decoding will continue - * in single-threaded mode and memlimit_threading may be exceeded - * even by a large amount. That is, memlimit_threading will never make - * lzma_code() return LZMA_MEMLIMIT_ERROR. To truly cap the memory - * usage, see memlimit_stop below. - * - * Setting memlimit_threading to UINT64_MAX or a similar huge value - * means that liblzma is allowed to keep the whole compressed file - * and the whole uncompressed file in memory in addition to the memory - * needed by the decompressor data structures used by each thread! - * In other words, a reasonable value limit must be set here or it - * will cause problems sooner or later. If you have no idea what - * a reasonable value could be, try lzma_physmem() / 4 as a starting - * point. Setting this limit will never prevent decompression of - * a file; this will only reduce the number of threads. - * - * If memlimit_threading is greater than memlimit_stop, then the value - * of memlimit_stop will be used for both. - */ - uint64_t memlimit_threading; - - /** - * \brief Memory usage limit that should never be exceeded - * - * Encoder: Ignored. - * - * Decoder: If decompressing will need more than this amount of - * memory even in the single-threaded mode, then lzma_code() will - * return LZMA_MEMLIMIT_ERROR. - */ - uint64_t memlimit_stop; - - /** \private Reserved member. */ - uint64_t reserved_int7; - - /** \private Reserved member. */ - uint64_t reserved_int8; - - /** \private Reserved member. */ - void *reserved_ptr1; - - /** \private Reserved member. */ - void *reserved_ptr2; - - /** \private Reserved member. */ - void *reserved_ptr3; - - /** \private Reserved member. */ - void *reserved_ptr4; - -} lzma_mt; - - -/** - * \brief Calculate approximate memory usage of easy encoder - * - * This function is a wrapper for lzma_raw_encoder_memusage(). - * - * \param preset Compression preset (level and possible flags) - * - * \return Number of bytes of memory required for the given - * preset when encoding or UINT64_MAX on error. - */ -extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate approximate decoder memory usage of a preset - * - * This function is a wrapper for lzma_raw_decoder_memusage(). - * - * \param preset Compression preset (level and possible flags) - * - * \return Number of bytes of memory required to decompress a file - * that was compressed using the given preset or UINT64_MAX - * on error. - */ -extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize .xz Stream encoder using a preset number - * - * This function is intended for those who just want to use the basic features - * of liblzma (that is, most developers out there). - * - * If initialization fails (return value is not LZMA_OK), all the memory - * allocated for *strm by liblzma is always freed. Thus, there is no need - * to call lzma_end() after failed initialization. - * - * If initialization succeeds, use lzma_code() to do the actual encoding. - * Valid values for 'action' (the second argument of lzma_code()) are - * LZMA_RUN, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, and LZMA_FINISH. In future, - * there may be compression levels or flags that don't support LZMA_SYNC_FLUSH. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param preset Compression preset to use. A preset consist of level - * number and zero or more flags. Usually flags aren't - * used, so preset is simply a number [0, 9] which match - * the options -0 ... -9 of the xz command line tool. - * Additional flags can be set using bitwise-or with - * the preset level number, e.g. 6 | LZMA_PRESET_EXTREME. - * \param check Integrity check type to use. See check.h for available - * checks. The xz command line tool defaults to - * LZMA_CHECK_CRC64, which is a good choice if you are - * unsure. LZMA_CHECK_CRC32 is good too as long as the - * uncompressed file is not many gigabytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization succeeded. Use lzma_code() to - * encode your data. - * - LZMA_MEM_ERROR: Memory allocation failed. - * - LZMA_OPTIONS_ERROR: The given compression preset is not - * supported by this build of liblzma. - * - LZMA_UNSUPPORTED_CHECK: The given check type is not - * supported by this liblzma build. - * - LZMA_PROG_ERROR: One or more of the parameters have values - * that will never be valid. For example, strm == NULL. - */ -extern LZMA_API(lzma_ret) lzma_easy_encoder( - lzma_stream *strm, uint32_t preset, lzma_check check) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Stream encoding using a preset number - * - * The maximum required output buffer size can be calculated with - * lzma_stream_buffer_bound(). - * - * \param preset Compression preset to use. See the description - * in lzma_easy_encoder(). - * \param check Type of the integrity check to calculate from - * uncompressed data. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_easy_buffer_encode( - uint32_t preset, lzma_check check, - const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Initialize .xz Stream encoder using a custom filter chain - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. See filters.h for more - * information. - * \param check Type of the integrity check to calculate from - * uncompressed data. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_encoder(lzma_stream *strm, - const lzma_filter *filters, lzma_check check) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate approximate memory usage of multithreaded .xz encoder - * - * Since doing the encoding in threaded mode doesn't affect the memory - * requirements of single-threaded decompressor, you can use - * lzma_easy_decoder_memusage(options->preset) or - * lzma_raw_decoder_memusage(options->filters) to calculate - * the decompressor memory requirements. - * - * \param options Compression options - * - * \return Number of bytes of memory required for encoding with the - * given options. If an error occurs, for example due to - * unsupported preset or filter chain, UINT64_MAX is returned. - */ -extern LZMA_API(uint64_t) lzma_stream_encoder_mt_memusage( - const lzma_mt *options) lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize multithreaded .xz Stream encoder - * - * This provides the functionality of lzma_easy_encoder() and - * lzma_stream_encoder() as a single function for multithreaded use. - * - * The supported actions for lzma_code() are LZMA_RUN, LZMA_FULL_FLUSH, - * LZMA_FULL_BARRIER, and LZMA_FINISH. Support for LZMA_SYNC_FLUSH might be - * added in the future. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param options Pointer to multithreaded compression options - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_encoder_mt( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate recommended Block size for multithreaded .xz encoder - * - * This calculates a recommended Block size for multithreaded encoding given - * a filter chain. This is used internally by lzma_stream_encoder_mt() to - * determine the Block size if the block_size member is not set to the - * special value of 0 in the lzma_mt options struct. - * - * If one wishes to change the filters between Blocks, this function is - * helpful to set the block_size member of the lzma_mt struct before calling - * lzma_stream_encoder_mt(). Since the block_size member represents the - * maximum possible Block size for the multithreaded .xz encoder, one can - * use this function to find the maximum recommended Block size based on - * all planned filter chains. Otherwise, the multithreaded encoder will - * base its maximum Block size on the first filter chain used (if the - * block_size member is not set), which may unnecessarily limit the Block - * size for a later filter chain. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Recommended Block size in bytes, or UINT64_MAX if - * an error occurred. - */ -extern LZMA_API(uint64_t) lzma_mt_block_size(const lzma_filter *filters) - lzma_nothrow; - - -/** - * \brief Initialize .lzma encoder (legacy file format) - * - * The .lzma format is sometimes called the LZMA_Alone format, which is the - * reason for the name of this function. The .lzma format supports only the - * LZMA1 filter. There is no support for integrity checks like CRC32. - * - * Use this function if and only if you need to create files readable by - * legacy LZMA tools such as LZMA Utils 4.32.x. Moving to the .xz format - * is strongly recommended. - * - * The valid action values for lzma_code() are LZMA_RUN and LZMA_FINISH. - * No kind of flushing is supported, because the file format doesn't make - * it possible. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param options Pointer to encoder options - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_alone_encoder( - lzma_stream *strm, const lzma_options_lzma *options) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate output buffer size for single-call Stream encoder - * - * When trying to compress incompressible data, the encoded size will be - * slightly bigger than the input data. This function calculates how much - * output buffer space is required to be sure that lzma_stream_buffer_encode() - * doesn't return LZMA_BUF_ERROR. - * - * The calculated value is not exact, but it is guaranteed to be big enough. - * The actual maximum output space required may be slightly smaller (up to - * about 100 bytes). This should not be a problem in practice. - * - * If the calculated maximum size doesn't fit into size_t or would make the - * Stream grow past LZMA_VLI_MAX (which should never happen in practice), - * zero is returned to indicate the error. - * - * \note The limit calculated by this function applies only to - * single-call encoding. Multi-call encoding may (and probably - * will) have larger maximum expansion when encoding - * incompressible data. Currently there is no function to - * calculate the maximum expansion of multi-call encoding. - * - * \param uncompressed_size Size in bytes of the uncompressed - * input data - * - * \return Maximum number of bytes needed to store the compressed data. - */ -extern LZMA_API(size_t) lzma_stream_buffer_bound(size_t uncompressed_size) - lzma_nothrow; - - -/** - * \brief Single-call .xz Stream encoder - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. See filters.h for more - * information. - * \param check Type of the integrity check to calculate from - * uncompressed data. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_buffer_encode( - lzma_filter *filters, lzma_check check, - const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief MicroLZMA encoder - * - * The MicroLZMA format is a raw LZMA stream whose first byte (always 0x00) - * has been replaced with bitwise-negation of the LZMA properties (lc/lp/pb). - * This encoding ensures that the first byte of MicroLZMA stream is never - * 0x00. There is no end of payload marker and thus the uncompressed size - * must be stored separately. For the best error detection the dictionary - * size should be stored separately as well but alternatively one may use - * the uncompressed size as the dictionary size when decoding. - * - * With the MicroLZMA encoder, lzma_code() behaves slightly unusually. - * The action argument must be LZMA_FINISH and the return value will never be - * LZMA_OK. Thus the encoding is always done with a single lzma_code() after - * the initialization. The benefit of the combination of initialization - * function and lzma_code() is that memory allocations can be reused for - * better performance. - * - * lzma_code() will try to encode as much input as is possible to fit into - * the given output buffer. If not all input can be encoded, the stream will - * be finished without encoding all the input. The caller must check both - * input and output buffer usage after lzma_code() (total_in and total_out - * in lzma_stream can be convenient). Often lzma_code() can fill the output - * buffer completely if there is a lot of input, but sometimes a few bytes - * may remain unused because the next LZMA symbol would require more space. - * - * lzma_stream.avail_out must be at least 6. Otherwise LZMA_PROG_ERROR - * will be returned. - * - * The LZMA dictionary should be reasonably low to speed up the encoder - * re-initialization. A good value is bigger than the resulting - * uncompressed size of most of the output chunks. For example, if output - * size is 4 KiB, dictionary size of 32 KiB or 64 KiB is good. If the - * data compresses extremely well, even 128 KiB may be useful. - * - * The MicroLZMA format and this encoder variant were made with the EROFS - * file system in mind. This format may be convenient in other embedded - * uses too where many small streams are needed. XZ Embedded includes a - * decoder for this format. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param options Pointer to encoder options - * - * \return Possible lzma_ret values: - * - LZMA_STREAM_END: All good. Check the amounts of input used - * and output produced. Store the amount of input used - * (uncompressed size) as it needs to be known to decompress - * the data. - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR: In addition to the generic reasons for this - * error code, this may also be returned if there isn't enough - * output space (6 bytes) to create a valid MicroLZMA stream. - */ -extern LZMA_API(lzma_ret) lzma_microlzma_encoder( - lzma_stream *strm, const lzma_options_lzma *options) - lzma_nothrow; - - -/************ - * Decoding * - ************/ - -/** - * This flag makes lzma_code() return LZMA_NO_CHECK if the input stream - * being decoded has no integrity check. Note that when used with - * lzma_auto_decoder(), all .lzma files will trigger LZMA_NO_CHECK - * if LZMA_TELL_NO_CHECK is used. - */ -#define LZMA_TELL_NO_CHECK UINT32_C(0x01) - - -/** - * This flag makes lzma_code() return LZMA_UNSUPPORTED_CHECK if the input - * stream has an integrity check, but the type of the integrity check is not - * supported by this liblzma version or build. Such files can still be - * decoded, but the integrity check cannot be verified. - */ -#define LZMA_TELL_UNSUPPORTED_CHECK UINT32_C(0x02) - - -/** - * This flag makes lzma_code() return LZMA_GET_CHECK as soon as the type - * of the integrity check is known. The type can then be got with - * lzma_get_check(). - */ -#define LZMA_TELL_ANY_CHECK UINT32_C(0x04) - - -/** - * This flag makes lzma_code() not calculate and verify the integrity check - * of the compressed data in .xz files. This means that invalid integrity - * check values won't be detected and LZMA_DATA_ERROR won't be returned in - * such cases. - * - * This flag only affects the checks of the compressed data itself; the CRC32 - * values in the .xz headers will still be verified normally. - * - * Don't use this flag unless you know what you are doing. Possible reasons - * to use this flag: - * - * - Trying to recover data from a corrupt .xz file. - * - * - Speeding up decompression, which matters mostly with SHA-256 - * or with files that have compressed extremely well. It's recommended - * to not use this flag for this purpose unless the file integrity is - * verified externally in some other way. - * - * Support for this flag was added in liblzma 5.1.4beta. - */ -#define LZMA_IGNORE_CHECK UINT32_C(0x10) - - -/** - * This flag enables decoding of concatenated files with file formats that - * allow concatenating compressed files as is. From the formats currently - * supported by liblzma, only the .xz and .lz formats allow concatenated - * files. Concatenated files are not allowed with the legacy .lzma format. - * - * This flag also affects the usage of the 'action' argument for lzma_code(). - * When LZMA_CONCATENATED is used, lzma_code() won't return LZMA_STREAM_END - * unless LZMA_FINISH is used as 'action'. Thus, the application has to set - * LZMA_FINISH in the same way as it does when encoding. - * - * If LZMA_CONCATENATED is not used, the decoders still accept LZMA_FINISH - * as 'action' for lzma_code(), but the usage of LZMA_FINISH isn't required. - */ -#define LZMA_CONCATENATED UINT32_C(0x08) - - -/** - * This flag makes the threaded decoder report errors (like LZMA_DATA_ERROR) - * as soon as they are detected. This saves time when the application has no - * interest in a partially decompressed truncated or corrupt file. Note that - * due to timing randomness, if the same truncated or corrupt input is - * decompressed multiple times with this flag, a different amount of output - * may be produced by different runs, and even the error code might vary. - * - * When using LZMA_FAIL_FAST, it is recommended to use LZMA_FINISH to tell - * the decoder when no more input will be coming because it can help fast - * detection and reporting of truncated files. Note that in this situation - * truncated files might be diagnosed with LZMA_DATA_ERROR instead of - * LZMA_OK or LZMA_BUF_ERROR! - * - * Without this flag the threaded decoder will provide as much output as - * possible at first and then report the pending error. This default behavior - * matches the single-threaded decoder and provides repeatable behavior - * with truncated or corrupt input. There are a few special cases where the - * behavior can still differ like memory allocation failures (LZMA_MEM_ERROR). - * - * Single-threaded decoders currently ignore this flag. - * - * Support for this flag was added in liblzma 5.3.3alpha. Note that in older - * versions this flag isn't supported (LZMA_OPTIONS_ERROR) even by functions - * that ignore this flag in newer liblzma versions. - */ -#define LZMA_FAIL_FAST UINT32_C(0x20) - - -/** - * \brief Initialize .xz Stream decoder - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. liblzma - * 5.2.3 and earlier don't allow 0 here and return - * LZMA_PROG_ERROR; later versions treat 0 as if 1 - * had been specified. - * \param flags Bitwise-or of zero or more of the decoder flags: - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * LZMA_TELL_ANY_CHECK, LZMA_IGNORE_CHECK, - * LZMA_CONCATENATED, LZMA_FAIL_FAST - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_OPTIONS_ERROR: Unsupported flags - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_decoder( - lzma_stream *strm, uint64_t memlimit, uint32_t flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize multithreaded .xz Stream decoder - * - * The decoder can decode multiple Blocks in parallel. This requires that each - * Block Header contains the Compressed Size and Uncompressed size fields - * which are added by the multi-threaded encoder, see lzma_stream_encoder_mt(). - * - * A Stream with one Block will only utilize one thread. A Stream with multiple - * Blocks but without size information in Block Headers will be processed in - * single-threaded mode in the same way as done by lzma_stream_decoder(). - * Concatenated Streams are processed one Stream at a time; no inter-Stream - * parallelization is done. - * - * This function behaves like lzma_stream_decoder() when options->threads == 1 - * and options->memlimit_threading <= 1. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param options Pointer to multithreaded compression options - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. - * - LZMA_OPTIONS_ERROR: Unsupported flags. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_decoder_mt( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode .xz, .lzma, and .lz (lzip) files with autodetection - * - * This decoder autodetects between the .xz, .lzma, and .lz file formats, - * and calls lzma_stream_decoder(), lzma_alone_decoder(), or - * lzma_lzip_decoder() once the type of the input file has been detected. - * - * Support for .lz was added in 5.4.0. - * - * If the flag LZMA_CONCATENATED is used and the input is a .lzma file: - * For historical reasons concatenated .lzma files aren't supported. - * If there is trailing data after one .lzma stream, lzma_code() will - * return LZMA_DATA_ERROR. (lzma_alone_decoder() doesn't have such a check - * as it doesn't support any decoder flags. It will return LZMA_STREAM_END - * after one .lzma stream.) - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. liblzma - * 5.2.3 and earlier don't allow 0 here and return - * LZMA_PROG_ERROR; later versions treat 0 as if 1 - * had been specified. - * \param flags Bitwise-or of zero or more of the decoder flags: - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * LZMA_TELL_ANY_CHECK, LZMA_IGNORE_CHECK, - * LZMA_CONCATENATED, LZMA_FAIL_FAST - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_OPTIONS_ERROR: Unsupported flags - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_auto_decoder( - lzma_stream *strm, uint64_t memlimit, uint32_t flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .lzma decoder (legacy file format) - * - * Valid 'action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH. - * There is no need to use LZMA_FINISH, but it's allowed because it may - * simplify certain types of applications. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. liblzma - * 5.2.3 and earlier don't allow 0 here and return - * LZMA_PROG_ERROR; later versions treat 0 as if 1 - * had been specified. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_alone_decoder( - lzma_stream *strm, uint64_t memlimit) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .lz (lzip) decoder (a foreign file format) - * - * This decoder supports the .lz format version 0 and the unextended .lz - * format version 1: - * - * - Files in the format version 0 were produced by lzip 1.3 and older. - * Such files aren't common but may be found from file archives - * as a few source packages were released in this format. People - * might have old personal files in this format too. Decompression - * support for the format version 0 was removed in lzip 1.18. - * - * - lzip 1.3 added decompression support for .lz format version 1 files. - * Compression support was added in lzip 1.4. In lzip 1.6 the .lz format - * version 1 was extended to support the Sync Flush marker. This extension - * is not supported by liblzma. lzma_code() will return LZMA_DATA_ERROR - * at the location of the Sync Flush marker. In practice files with - * the Sync Flush marker are very rare and thus liblzma can decompress - * almost all .lz files. - * - * Just like with lzma_stream_decoder() for .xz files, LZMA_CONCATENATED - * should be used when decompressing normal standalone .lz files. - * - * The .lz format allows putting non-.lz data at the end of a file after at - * least one valid .lz member. That is, one can append custom data at the end - * of a .lz file and the decoder is required to ignore it. In liblzma this - * is relevant only when LZMA_CONCATENATED is used. In that case lzma_code() - * will return LZMA_STREAM_END and leave lzma_stream.next_in pointing to - * the first byte of the non-.lz data. An exception to this is if the first - * 1-3 bytes of the non-.lz data are identical to the .lz magic bytes - * (0x4C, 0x5A, 0x49, 0x50; "LZIP" in US-ASCII). In such a case the 1-3 bytes - * will have been ignored by lzma_code(). If one wishes to locate the non-.lz - * data reliably, one must ensure that the first byte isn't 0x4C. Actually - * one should ensure that none of the first four bytes of trailing data are - * equal to the magic bytes because lzip >= 1.20 requires it by default. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. - * \param flags Bitwise-or of flags, or zero for no flags. - * All decoder flags listed above are supported - * although only LZMA_CONCATENATED and (in very rare - * cases) LZMA_IGNORE_CHECK are actually useful. - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * and LZMA_FAIL_FAST do nothing. LZMA_TELL_ANY_CHECK - * is supported for consistency only as CRC32 is - * always used in the .lz format. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_OPTIONS_ERROR: Unsupported flags - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_lzip_decoder( - lzma_stream *strm, uint64_t memlimit, uint32_t flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Stream decoder - * - * \param memlimit Pointer to how much memory the decoder is allowed - * to allocate. The value pointed by this pointer is - * modified if and only if LZMA_MEMLIMIT_ERROR is - * returned. - * \param flags Bitwise-or of zero or more of the decoder flags: - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * LZMA_IGNORE_CHECK, LZMA_CONCATENATED, - * LZMA_FAIL_FAST. Note that LZMA_TELL_ANY_CHECK - * is not allowed and will return LZMA_PROG_ERROR. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if decoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_FORMAT_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_DATA_ERROR - * - LZMA_NO_CHECK: This can be returned only if using - * the LZMA_TELL_NO_CHECK flag. - * - LZMA_UNSUPPORTED_CHECK: This can be returned only if using - * the LZMA_TELL_UNSUPPORTED_CHECK flag. - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. - * The minimum required memlimit value was stored to *memlimit. - * - LZMA_BUF_ERROR: Output buffer was too small. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_buffer_decode( - uint64_t *memlimit, uint32_t flags, - const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief MicroLZMA decoder - * - * See lzma_microlzma_encoder() for more information. - * - * The lzma_code() usage with this decoder is completely normal. The - * special behavior of lzma_code() applies to lzma_microlzma_encoder() only. - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param comp_size Compressed size of the MicroLZMA stream. - * The caller must somehow know this exactly. - * \param uncomp_size Uncompressed size of the MicroLZMA stream. - * If the exact uncompressed size isn't known, this - * can be set to a value that is at most as big as - * the exact uncompressed size would be, but then the - * next argument uncomp_size_is_exact must be false. - * \param uncomp_size_is_exact - * If true, uncomp_size must be exactly correct. - * This will improve error detection at the end of - * the stream. If the exact uncompressed size isn't - * known, this must be false. uncomp_size must still - * be at most as big as the exact uncompressed size - * is. Setting this to false when the exact size is - * known will work but error detection at the end of - * the stream will be weaker. - * \param dict_size LZMA dictionary size that was used when - * compressing the data. It is OK to use a bigger - * value too but liblzma will then allocate more - * memory than would actually be required and error - * detection will be slightly worse. (Note that with - * the implementation in XZ Embedded it doesn't - * affect the memory usage if one specifies bigger - * dictionary than actually required.) - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_microlzma_decoder( - lzma_stream *strm, uint64_t comp_size, - uint64_t uncomp_size, lzma_bool uncomp_size_is_exact, - uint32_t dict_size) lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/delta.h b/software/src/xz/src/liblzma/api/lzma/delta.h deleted file mode 100644 index 5ebacef..0000000 --- a/software/src/xz/src/liblzma/api/lzma/delta.h +++ /dev/null @@ -1,95 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/delta.h - * \brief Delta filter - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Filter ID - * - * Filter ID of the Delta filter. This is used as lzma_filter.id. - */ -#define LZMA_FILTER_DELTA LZMA_VLI_C(0x03) - - -/** - * \brief Type of the delta calculation - * - * Currently only byte-wise delta is supported. Other possible types could - * be, for example, delta of 16/32/64-bit little/big endian integers, but - * these are not currently planned since byte-wise delta is almost as good. - */ -typedef enum { - LZMA_DELTA_TYPE_BYTE -} lzma_delta_type; - - -/** - * \brief Options for the Delta filter - * - * These options are needed by both encoder and decoder. - */ -typedef struct { - /** For now, this must always be LZMA_DELTA_TYPE_BYTE. */ - lzma_delta_type type; - - /** - * \brief Delta distance - * - * With the only currently supported type, LZMA_DELTA_TYPE_BYTE, - * the distance is as bytes. - * - * Examples: - * - 16-bit stereo audio: distance = 4 bytes - * - 24-bit RGB image data: distance = 3 bytes - */ - uint32_t dist; - - /** - * \brief Minimum value for lzma_options_delta.dist. - */ -# define LZMA_DELTA_DIST_MIN 1 - - /** - * \brief Maximum value for lzma_options_delta.dist. - */ -# define LZMA_DELTA_DIST_MAX 256 - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * when type is LZMA_DELTA_TYPE_BYTE, so it is safe to leave these - * uninitialized. - */ - - /** \private Reserved member. */ - uint32_t reserved_int1; - - /** \private Reserved member. */ - uint32_t reserved_int2; - - /** \private Reserved member. */ - uint32_t reserved_int3; - - /** \private Reserved member. */ - uint32_t reserved_int4; - - /** \private Reserved member. */ - void *reserved_ptr1; - - /** \private Reserved member. */ - void *reserved_ptr2; - -} lzma_options_delta; diff --git a/software/src/xz/src/liblzma/api/lzma/filter.h b/software/src/xz/src/liblzma/api/lzma/filter.h deleted file mode 100644 index e86809c..0000000 --- a/software/src/xz/src/liblzma/api/lzma/filter.h +++ /dev/null @@ -1,769 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/filter.h - * \brief Common filter related types and functions - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Maximum number of filters in a chain - * - * A filter chain can have 1-4 filters, of which three are allowed to change - * the size of the data. Usually only one or two filters are needed. - */ -#define LZMA_FILTERS_MAX 4 - - -/** - * \brief Filter options - * - * This structure is used to pass a Filter ID and a pointer to the filter's - * options to liblzma. A few functions work with a single lzma_filter - * structure, while most functions expect a filter chain. - * - * A filter chain is indicated with an array of lzma_filter structures. - * The array is terminated with .id = LZMA_VLI_UNKNOWN. Thus, the filter - * array must have LZMA_FILTERS_MAX + 1 elements (that is, five) to - * be able to hold any arbitrary filter chain. This is important when - * using lzma_block_header_decode() from block.h, because a filter array - * that is too small would make liblzma write past the end of the array. - */ -typedef struct { - /** - * \brief Filter ID - * - * Use constants whose name begin with 'LZMA_FILTER_' to specify - * different filters. In an array of lzma_filter structures, use - * LZMA_VLI_UNKNOWN to indicate end of filters. - * - * \note This is not an enum, because on some systems enums - * cannot be 64-bit. - */ - lzma_vli id; - - /** - * \brief Pointer to filter-specific options structure - * - * If the filter doesn't need options, set this to NULL. If id is - * set to LZMA_VLI_UNKNOWN, options is ignored, and thus - * doesn't need be initialized. - */ - void *options; - -} lzma_filter; - - -/** - * \brief Test if the given Filter ID is supported for encoding - * - * \param id Filter ID - * - * \return lzma_bool: - * - true if the Filter ID is supported for encoding by this - * liblzma build. - * - false otherwise. - */ -extern LZMA_API(lzma_bool) lzma_filter_encoder_is_supported(lzma_vli id) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Test if the given Filter ID is supported for decoding - * - * \param id Filter ID - * - * \return lzma_bool: - * - true if the Filter ID is supported for decoding by this - * liblzma build. - * - false otherwise. - */ -extern LZMA_API(lzma_bool) lzma_filter_decoder_is_supported(lzma_vli id) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Copy the filters array - * - * Copy the Filter IDs and filter-specific options from src to dest. - * Up to LZMA_FILTERS_MAX filters are copied, plus the terminating - * .id == LZMA_VLI_UNKNOWN. Thus, dest should have at least - * LZMA_FILTERS_MAX + 1 elements space unless the caller knows that - * src is smaller than that. - * - * Unless the filter-specific options is NULL, the Filter ID has to be - * supported by liblzma, because liblzma needs to know the size of every - * filter-specific options structure. The filter-specific options are not - * validated. If options is NULL, any unsupported Filter IDs are copied - * without returning an error. - * - * Old filter-specific options in dest are not freed, so dest doesn't - * need to be initialized by the caller in any way. - * - * If an error occurs, memory possibly already allocated by this function - * is always freed. liblzma versions older than 5.2.7 may modify the dest - * array and leave its contents in an undefined state if an error occurs. - * liblzma 5.2.7 and newer only modify the dest array when returning LZMA_OK. - * - * \param src Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * \param[out] dest Destination filter array - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR: Unsupported Filter ID and its options - * is not NULL. - * - LZMA_PROG_ERROR: src or dest is NULL. - */ -extern LZMA_API(lzma_ret) lzma_filters_copy( - const lzma_filter *src, lzma_filter *dest, - const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Free the options in the array of lzma_filter structures - * - * This frees the filter chain options. The filters array itself is not freed. - * - * The filters array must have at most LZMA_FILTERS_MAX + 1 elements - * including the terminating element which must have .id = LZMA_VLI_UNKNOWN. - * For all elements before the terminating element: - * - options will be freed using the given lzma_allocator or, - * if allocator is NULL, using free(). - * - options will be set to NULL. - * - id will be set to LZMA_VLI_UNKNOWN. - * - * If filters is NULL, this does nothing. Again, this never frees the - * filters array itself. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - */ -extern LZMA_API(void) lzma_filters_free( - lzma_filter *filters, const lzma_allocator *allocator) - lzma_nothrow; - - -/** - * \brief Calculate approximate memory requirements for raw encoder - * - * This function can be used to calculate the memory requirements for - * Block and Stream encoders too because Block and Stream encoders don't - * need significantly more memory than raw encoder. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Number of bytes of memory required for the given - * filter chain when encoding or UINT64_MAX on error. - */ -extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate approximate memory requirements for raw decoder - * - * This function can be used to calculate the memory requirements for - * Block and Stream decoders too because Block and Stream decoders don't - * need significantly more memory than raw decoder. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Number of bytes of memory required for the given - * filter chain when decoding or UINT64_MAX on error. - */ -extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize raw encoder - * - * This function may be useful when implementing custom file formats. - * - * The 'action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the - * filter chain supports it), or LZMA_FINISH. - * - * \param strm Pointer to lzma_stream that is at least - * initialized with LZMA_STREAM_INIT. - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_encoder( - lzma_stream *strm, const lzma_filter *filters) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize raw decoder - * - * The initialization of raw decoder goes similarly to raw encoder. - * - * The 'action' with lzma_code() can be LZMA_RUN or LZMA_FINISH. Using - * LZMA_FINISH is not required, it is supported just for convenience. - * - * \param strm Pointer to lzma_stream that is at least - * initialized with LZMA_STREAM_INIT. - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_decoder( - lzma_stream *strm, const lzma_filter *filters) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Update the filter chain in the encoder - * - * This function may be called after lzma_code() has returned LZMA_STREAM_END - * when LZMA_FULL_BARRIER, LZMA_FULL_FLUSH, or LZMA_SYNC_FLUSH was used: - * - * - After LZMA_FULL_BARRIER or LZMA_FULL_FLUSH: Single-threaded .xz Stream - * encoder (lzma_stream_encoder()) and (since liblzma 5.4.0) multi-threaded - * Stream encoder (lzma_stream_encoder_mt()) allow setting a new filter - * chain to be used for the next Block(s). - * - * - After LZMA_SYNC_FLUSH: Raw encoder (lzma_raw_encoder()), - * Block encoder (lzma_block_encoder()), and single-threaded .xz Stream - * encoder (lzma_stream_encoder()) allow changing certain filter-specific - * options in the middle of encoding. The actual filters in the chain - * (Filter IDs) must not be changed! Currently only the lc, lp, and pb - * options of LZMA2 (not LZMA1) can be changed this way. - * - * - In the future some filters might allow changing some of their options - * without any barrier or flushing but currently such filters don't exist. - * - * This function may also be called when no data has been compressed yet - * although this is rarely useful. In that case, this function will behave - * as if LZMA_FULL_FLUSH (Stream encoders) or LZMA_SYNC_FLUSH (Raw or Block - * encoder) had been used right before calling this function. - * - * \param strm Pointer to lzma_stream that is at least - * initialized with LZMA_STREAM_INIT. - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_filters_update( - lzma_stream *strm, const lzma_filter *filters) lzma_nothrow; - - -/** - * \brief Single-call raw encoder - * - * \note There is no function to calculate how big output buffer - * would surely be big enough. (lzma_stream_buffer_bound() - * works only for lzma_stream_buffer_encode(); raw encoder - * won't necessarily meet that bound.) - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, uint8_t *out, - size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Single-call raw decoder - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_buffer_decode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Get the size of the Filter Properties field - * - * This function may be useful when implementing custom file formats - * using the raw encoder and decoder. - * - * \note This function validates the Filter ID, but does not - * necessarily validate the options. Thus, it is possible - * that this returns LZMA_OK while the following call to - * lzma_properties_encode() returns LZMA_OPTIONS_ERROR. - * - * \param[out] size Pointer to uint32_t to hold the size of the properties - * \param filter Filter ID and options (the size of the properties may - * vary depending on the options) - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_properties_size( - uint32_t *size, const lzma_filter *filter) lzma_nothrow; - - -/** - * \brief Encode the Filter Properties field - * - * \note Even this function won't validate more options than actually - * necessary. Thus, it is possible that encoding the properties - * succeeds but using the same options to initialize the encoder - * will fail. - * - * \note If lzma_properties_size() indicated that the size - * of the Filter Properties field is zero, calling - * lzma_properties_encode() is not required, but it - * won't do any harm either. - * - * \param filter Filter ID and options - * \param[out] props Buffer to hold the encoded options. The size of - * the buffer must have been already determined with - * lzma_properties_size(). - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_properties_encode( - const lzma_filter *filter, uint8_t *props) lzma_nothrow; - - -/** - * \brief Decode the Filter Properties field - * - * \param filter filter->id must have been set to the correct - * Filter ID. filter->options doesn't need to be - * initialized (it's not freed by this function). The - * decoded options will be stored in filter->options; - * it's application's responsibility to free it when - * appropriate. filter->options is set to NULL if - * there are no properties or if an error occurs. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * and in case of an error, also free(). - * \param props Input buffer containing the properties. - * \param props_size Size of the properties. This must be the exact - * size; giving too much or too little input will - * return LZMA_OPTIONS_ERROR. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - */ -extern LZMA_API(lzma_ret) lzma_properties_decode( - lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) lzma_nothrow; - - -/** - * \brief Calculate encoded size of a Filter Flags field - * - * Knowing the size of Filter Flags is useful to know when allocating - * memory to hold the encoded Filter Flags. - * - * \note If you need to calculate size of List of Filter Flags, - * you need to loop over every lzma_filter entry. - * - * \param[out] size Pointer to integer to hold the calculated size - * \param filter Filter ID and associated options whose encoded - * size is to be calculated - * - * \return Possible lzma_ret values: - * - LZMA_OK: *size set successfully. Note that this doesn't - * guarantee that filter->options is valid, thus - * lzma_filter_flags_encode() may still fail. - * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options. - * - LZMA_PROG_ERROR: Invalid options - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_size( - uint32_t *size, const lzma_filter *filter) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Encode Filter Flags into given buffer - * - * In contrast to some functions, this doesn't allocate the needed buffer. - * This is due to how this function is used internally by liblzma. - * - * \param filter Filter ID and options to be encoded - * \param[out] out Beginning of the output buffer - * \param[out] out_pos out[*out_pos] is the next write position. This - * is updated by the encoder. - * \param out_size out[out_size] is the first byte to not write. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. - * - LZMA_PROG_ERROR: Invalid options or not enough output - * buffer space (you should have checked it with - * lzma_filter_flags_size()). - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode Filter Flags from given buffer - * - * The decoded result is stored into *filter. The old value of - * filter->options is not free()d. If anything other than LZMA_OK - * is returned, filter->options is set to NULL. - * - * \param[out] filter Destination filter. The decoded Filter ID will - * be stored in filter->id. If options are needed - * they will be allocated and the pointer will be - * stored in filter->options. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param[out] in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_decode( - lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/*********** - * Strings * - ***********/ - -/** - * \brief Allow or show all filters - * - * By default only the filters supported in the .xz format are accept by - * lzma_str_to_filters() or shown by lzma_str_list_filters(). - */ -#define LZMA_STR_ALL_FILTERS UINT32_C(0x01) - - -/** - * \brief Do not validate the filter chain in lzma_str_to_filters() - * - * By default lzma_str_to_filters() can return an error if the filter chain - * as a whole isn't usable in the .xz format or in the raw encoder or decoder. - * With this flag, this validation is skipped. This flag doesn't affect the - * handling of the individual filter options. To allow non-.xz filters also - * LZMA_STR_ALL_FILTERS is needed. - */ -#define LZMA_STR_NO_VALIDATION UINT32_C(0x02) - - -/** - * \brief Stringify encoder options - * - * Show the filter-specific options that the encoder will use. - * This may be useful for verbose diagnostic messages. - * - * Note that if options were decoded from .xz headers then the encoder options - * may be undefined. This flag shouldn't be used in such a situation. - */ -#define LZMA_STR_ENCODER UINT32_C(0x10) - - -/** - * \brief Stringify decoder options - * - * Show the filter-specific options that the decoder will use. - * This may be useful for showing what filter options were decoded - * from file headers. - */ -#define LZMA_STR_DECODER UINT32_C(0x20) - - -/** - * \brief Produce xz-compatible getopt_long() syntax - * - * That is, "delta:dist=2 lzma2:dict=4MiB,pb=1,lp=1" becomes - * "--delta=dist=2 --lzma2=dict=4MiB,pb=1,lp=1". - * - * This syntax is compatible with xz 5.0.0 as long as the filters and - * their options are supported too. - */ -#define LZMA_STR_GETOPT_LONG UINT32_C(0x40) - - -/** - * \brief Use two dashes "--" instead of a space to separate filters - * - * That is, "delta:dist=2 lzma2:pb=1,lp=1" becomes - * "delta:dist=2--lzma2:pb=1,lp=1". This looks slightly odd but this - * kind of strings should be usable on the command line without quoting. - * However, it is possible that future versions with new filter options - * might produce strings that require shell quoting anyway as the exact - * set of possible characters isn't frozen for now. - * - * It is guaranteed that the single quote (') will never be used in - * filter chain strings (even if LZMA_STR_NO_SPACES isn't used). - */ -#define LZMA_STR_NO_SPACES UINT32_C(0x80) - - -/** - * \brief Convert a string to a filter chain - * - * This tries to make it easier to write applications that allow users - * to set custom compression options. This only handles the filter - * configuration (including presets) but not the number of threads, - * block size, check type, or memory limits. - * - * The input string can be either a preset or a filter chain. Presets - * begin with a digit 0-9 and may be followed by zero or more flags - * which are lower-case letters. Currently only "e" is supported, matching - * LZMA_PRESET_EXTREME. For partial xz command line syntax compatibility, - * a preset string may start with a single dash "-". - * - * A filter chain consists of one or more "filtername:opt1=value1,opt2=value2" - * strings separated by one or more spaces. Leading and trailing spaces are - * ignored. All names and values must be lower-case. Extra commas in the - * option list are ignored. The order of filters is significant: when - * encoding, the uncompressed input data goes to the leftmost filter first. - * Normally "lzma2" is the last filter in the chain. - * - * If one wishes to avoid spaces, for example, to avoid shell quoting, - * it is possible to use two dashes "--" instead of spaces to separate - * the filters. - * - * For xz command line compatibility, each filter may be prefixed with - * two dashes "--" and the colon ":" separating the filter name from - * the options may be replaced with an equals sign "=". - * - * By default, only filters that can be used in the .xz format are accepted. - * To allow all filters (LZMA1) use the flag LZMA_STR_ALL_FILTERS. - * - * By default, very basic validation is done for the filter chain as a whole, - * for example, that LZMA2 is only used as the last filter in the chain. - * The validation isn't perfect though and it's possible that this function - * succeeds but using the filter chain for encoding or decoding will still - * result in LZMA_OPTIONS_ERROR. To disable this validation, use the flag - * LZMA_STR_NO_VALIDATION. - * - * The available filter names and their options are available via - * lzma_str_list_filters(). See the xz man page for the description - * of filter names and options. - * - * For command line applications, below is an example how an error message - * can be displayed. Note the use of an empty string for the field width. - * If "^" was used there it would create an off-by-one error except at - * the very beginning of the line. - * - * \code{.c} - * const char *str = ...; // From user - * lzma_filter filters[LZMA_FILTERS_MAX + 1]; - * int pos; - * const char *msg = lzma_str_to_filters(str, &pos, filters, 0, NULL); - * if (msg != NULL) { - * printf("%s: Error in XZ compression options:\n", argv[0]); - * printf("%s: %s\n", argv[0], str); - * printf("%s: %*s^\n", argv[0], errpos, ""); - * printf("%s: %s\n", argv[0], msg); - * } - * \endcode - * - * \param str User-supplied string describing a preset or - * a filter chain. If a default value is needed and - * you don't know what would be good, use "6" since - * that is the default preset in xz too. - * \param[out] error_pos If this isn't NULL, this value will be set on - * both success and on all errors. This tells the - * location of the error in the string. This is - * an int to make it straightforward to use this - * as printf() field width. The value is guaranteed - * to be in the range [0, INT_MAX] even if strlen(str) - * somehow was greater than INT_MAX. - * \param[out] filters An array of lzma_filter structures. There must - * be LZMA_FILTERS_MAX + 1 (that is, five) elements - * in the array. The old contents are ignored so it - * doesn't need to be initialized. This array is - * modified only if this function returns NULL. - * Once the allocated filter options are no longer - * needed, lzma_filters_free() can be used to free the - * options (it doesn't free the filters array itself). - * \param flags Bitwise-or of zero or more of the flags - * LZMA_STR_ALL_FILTERS and LZMA_STR_NO_VALIDATION. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return On success, NULL is returned. On error, a statically-allocated - * error message is returned which together with the error_pos - * should give some idea what is wrong. - */ -extern LZMA_API(const char *) lzma_str_to_filters( - const char *str, int *error_pos, lzma_filter *filters, - uint32_t flags, const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Convert a filter chain to a string - * - * Use cases: - * - * - Verbose output showing the full encoder options to the user - * (use LZMA_STR_ENCODER in flags) - * - * - Showing the filters and options that are required to decode a file - * (use LZMA_STR_DECODER in flags) - * - * - Showing the filter names without any options in informational messages - * where the technical details aren't important (no flags). In this case - * the .options in the filters array are ignored and may be NULL even if - * a filter has a mandatory options structure. - * - * Note that even if the filter chain was specified using a preset, - * the resulting filter chain isn't reversed to a preset. So if you - * specify "6" to lzma_str_to_filters() then lzma_str_from_filters() - * will produce a string containing "lzma2". - * - * \param[out] str On success *str will be set to point to an - * allocated string describing the given filter - * chain. Old value is ignored. On error *str is - * always set to NULL. - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * \param flags Bitwise-or of zero or more of the flags - * LZMA_STR_ENCODER, LZMA_STR_DECODER, - * LZMA_STR_GETOPT_LONG, and LZMA_STR_NO_SPACES. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR: Empty filter chain - * (filters[0].id == LZMA_VLI_UNKNOWN) or the filter chain - * includes a Filter ID that is not supported by this function. - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_str_from_filters( - char **str, const lzma_filter *filters, uint32_t flags, - const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief List available filters and/or their options (for help message) - * - * If a filter_id is given then only one line is created which contains the - * filter name. If LZMA_STR_ENCODER or LZMA_STR_DECODER is used then the - * options read by the encoder or decoder are printed on the same line. - * - * If filter_id is LZMA_VLI_UNKNOWN then all supported .xz-compatible filters - * are listed: - * - * - If neither LZMA_STR_ENCODER nor LZMA_STR_DECODER is used then - * the supported filter names are listed on a single line separated - * by spaces. - * - * - If LZMA_STR_ENCODER or LZMA_STR_DECODER is used then filters and - * the supported options are listed one filter per line. There won't - * be a newline after the last filter. - * - * - If LZMA_STR_ALL_FILTERS is used then the list will include also - * those filters that cannot be used in the .xz format (LZMA1). - * - * \param str On success *str will be set to point to an - * allocated string listing the filters and options. - * Old value is ignored. On error *str is always set - * to NULL. - * \param filter_id Filter ID or LZMA_VLI_UNKNOWN. - * \param flags Bitwise-or of zero or more of the flags - * LZMA_STR_ALL_FILTERS, LZMA_STR_ENCODER, - * LZMA_STR_DECODER, and LZMA_STR_GETOPT_LONG. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR: Unsupported filter_id or flags - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_str_list_filters( - char **str, lzma_vli filter_id, uint32_t flags, - const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; diff --git a/software/src/xz/src/liblzma/api/lzma/hardware.h b/software/src/xz/src/liblzma/api/lzma/hardware.h deleted file mode 100644 index 7a1a84f..0000000 --- a/software/src/xz/src/liblzma/api/lzma/hardware.h +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/hardware.h - * \brief Hardware information - * \note Never include this file directly. Use instead. - * - * Since liblzma can consume a lot of system resources, it also provides - * ways to limit the resource usage. Applications linking against liblzma - * need to do the actual decisions how much resources to let liblzma to use. - * To ease making these decisions, liblzma provides functions to find out - * the relevant capabilities of the underlying hardware. Currently there - * is only a function to find out the amount of RAM, but in the future there - * will be also a function to detect how many concurrent threads the system - * can run. - * - * \note On some operating systems, these function may temporarily - * load a shared library or open file descriptor(s) to find out - * the requested hardware information. Unless the application - * assumes that specific file descriptors are not touched by - * other threads, this should have no effect on thread safety. - * Possible operations involving file descriptors will restart - * the syscalls if they return EINTR. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Get the total amount of physical memory (RAM) in bytes - * - * This function may be useful when determining a reasonable memory - * usage limit for decompressing or how much memory it is OK to use - * for compressing. - * - * \return On success, the total amount of physical memory in bytes - * is returned. If the amount of RAM cannot be determined, - * zero is returned. This can happen if an error occurs - * or if there is no code in liblzma to detect the amount - * of RAM on the specific operating system. - */ -extern LZMA_API(uint64_t) lzma_physmem(void) lzma_nothrow; - - -/** - * \brief Get the number of processor cores or threads - * - * This function may be useful when determining how many threads to use. - * If the hardware supports more than one thread per CPU core, the number - * of hardware threads is returned if that information is available. - * - * \return On success, the number of available CPU threads or cores is - * returned. If this information isn't available or an error - * occurs, zero is returned. - */ -extern LZMA_API(uint32_t) lzma_cputhreads(void) lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/index.h b/software/src/xz/src/liblzma/api/lzma/index.h deleted file mode 100644 index b17025e..0000000 --- a/software/src/xz/src/liblzma/api/lzma/index.h +++ /dev/null @@ -1,882 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/index.h - * \brief Handling of .xz Index and related information - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Opaque data type to hold the Index(es) and other information - * - * lzma_index often holds just one .xz Index and possibly the Stream Flags - * of the same Stream and size of the Stream Padding field. However, - * multiple lzma_indexes can be concatenated with lzma_index_cat() and then - * there may be information about multiple Streams in the same lzma_index. - * - * Notes about thread safety: Only one thread may modify lzma_index at - * a time. All functions that take non-const pointer to lzma_index - * modify it. As long as no thread is modifying the lzma_index, getting - * information from the same lzma_index can be done from multiple threads - * at the same time with functions that take a const pointer to - * lzma_index or use lzma_index_iter. The same iterator must be used - * only by one thread at a time, of course, but there can be as many - * iterators for the same lzma_index as needed. - */ -typedef struct lzma_index_s lzma_index; - - -/** - * \brief Iterator to get information about Blocks and Streams - */ -typedef struct { - struct { - /** - * \brief Pointer to Stream Flags - * - * This is NULL if Stream Flags have not been set for - * this Stream with lzma_index_stream_flags(). - */ - const lzma_stream_flags *flags; - - /** \private Reserved member. */ - const void *reserved_ptr1; - - /** \private Reserved member. */ - const void *reserved_ptr2; - - /** \private Reserved member. */ - const void *reserved_ptr3; - - /** - * \brief Stream number in the lzma_index - * - * The first Stream is 1. - */ - lzma_vli number; - - /** - * \brief Number of Blocks in the Stream - * - * If this is zero, the block structure below has - * undefined values. - */ - lzma_vli block_count; - - /** - * \brief Compressed start offset of this Stream - * - * The offset is relative to the beginning of the lzma_index - * (i.e. usually the beginning of the .xz file). - */ - lzma_vli compressed_offset; - - /** - * \brief Uncompressed start offset of this Stream - * - * The offset is relative to the beginning of the lzma_index - * (i.e. usually the beginning of the .xz file). - */ - lzma_vli uncompressed_offset; - - /** - * \brief Compressed size of this Stream - * - * This includes all headers except the possible - * Stream Padding after this Stream. - */ - lzma_vli compressed_size; - - /** - * \brief Uncompressed size of this Stream - */ - lzma_vli uncompressed_size; - - /** - * \brief Size of Stream Padding after this Stream - * - * If it hasn't been set with lzma_index_stream_padding(), - * this defaults to zero. Stream Padding is always - * a multiple of four bytes. - */ - lzma_vli padding; - - - /** \private Reserved member. */ - lzma_vli reserved_vli1; - - /** \private Reserved member. */ - lzma_vli reserved_vli2; - - /** \private Reserved member. */ - lzma_vli reserved_vli3; - - /** \private Reserved member. */ - lzma_vli reserved_vli4; - } stream; - - struct { - /** - * \brief Block number in the file - * - * The first Block is 1. - */ - lzma_vli number_in_file; - - /** - * \brief Compressed start offset of this Block - * - * This offset is relative to the beginning of the - * lzma_index (i.e. usually the beginning of the .xz file). - * Normally this is where you should seek in the .xz file - * to start decompressing this Block. - */ - lzma_vli compressed_file_offset; - - /** - * \brief Uncompressed start offset of this Block - * - * This offset is relative to the beginning of the lzma_index - * (i.e. usually the beginning of the .xz file). - * - * When doing random-access reading, it is possible that - * the target offset is not exactly at Block boundary. One - * will need to compare the target offset against - * uncompressed_file_offset or uncompressed_stream_offset, - * and possibly decode and throw away some amount of data - * before reaching the target offset. - */ - lzma_vli uncompressed_file_offset; - - /** - * \brief Block number in this Stream - * - * The first Block is 1. - */ - lzma_vli number_in_stream; - - /** - * \brief Compressed start offset of this Block - * - * This offset is relative to the beginning of the Stream - * containing this Block. - */ - lzma_vli compressed_stream_offset; - - /** - * \brief Uncompressed start offset of this Block - * - * This offset is relative to the beginning of the Stream - * containing this Block. - */ - lzma_vli uncompressed_stream_offset; - - /** - * \brief Uncompressed size of this Block - * - * You should pass this to the Block decoder if you will - * decode this Block. It will allow the Block decoder to - * validate the uncompressed size. - */ - lzma_vli uncompressed_size; - - /** - * \brief Unpadded size of this Block - * - * You should pass this to the Block decoder if you will - * decode this Block. It will allow the Block decoder to - * validate the unpadded size. - */ - lzma_vli unpadded_size; - - /** - * \brief Total compressed size - * - * This includes all headers and padding in this Block. - * This is useful if you need to know how many bytes - * the Block decoder will actually read. - */ - lzma_vli total_size; - - /** \private Reserved member. */ - lzma_vli reserved_vli1; - - /** \private Reserved member. */ - lzma_vli reserved_vli2; - - /** \private Reserved member. */ - lzma_vli reserved_vli3; - - /** \private Reserved member. */ - lzma_vli reserved_vli4; - - /** \private Reserved member. */ - const void *reserved_ptr1; - - /** \private Reserved member. */ - const void *reserved_ptr2; - - /** \private Reserved member. */ - const void *reserved_ptr3; - - /** \private Reserved member. */ - const void *reserved_ptr4; - } block; - - /** - * \private Internal data - * - * Internal data which is used to store the state of the iterator. - * The exact format may vary between liblzma versions, so don't - * touch these in any way. - */ - union { - /** \private Internal member. */ - const void *p; - - /** \private Internal member. */ - size_t s; - - /** \private Internal member. */ - lzma_vli v; - } internal[6]; -} lzma_index_iter; - - -/** - * \brief Operation mode for lzma_index_iter_next() - */ -typedef enum { - LZMA_INDEX_ITER_ANY = 0, - /**< - * \brief Get the next Block or Stream - * - * Go to the next Block if the current Stream has at least - * one Block left. Otherwise go to the next Stream even if - * it has no Blocks. If the Stream has no Blocks - * (lzma_index_iter.stream.block_count == 0), - * lzma_index_iter.block will have undefined values. - */ - - LZMA_INDEX_ITER_STREAM = 1, - /**< - * \brief Get the next Stream - * - * Go to the next Stream even if the current Stream has - * unread Blocks left. If the next Stream has at least one - * Block, the iterator will point to the first Block. - * If there are no Blocks, lzma_index_iter.block will have - * undefined values. - */ - - LZMA_INDEX_ITER_BLOCK = 2, - /**< - * \brief Get the next Block - * - * Go to the next Block if the current Stream has at least - * one Block left. If the current Stream has no Blocks left, - * the next Stream with at least one Block is located and - * the iterator will be made to point to the first Block of - * that Stream. - */ - - LZMA_INDEX_ITER_NONEMPTY_BLOCK = 3 - /**< - * \brief Get the next non-empty Block - * - * This is like LZMA_INDEX_ITER_BLOCK except that it will - * skip Blocks whose Uncompressed Size is zero. - */ - -} lzma_index_iter_mode; - - -/** - * \brief Mask for return value from lzma_index_checks() for check none - * - * \note This and the other CHECK_MASK macros were added in 5.5.1alpha. - */ -#define LZMA_INDEX_CHECK_MASK_NONE (UINT32_C(1) << LZMA_CHECK_NONE) - -/** - * \brief Mask for return value from lzma_index_checks() for check CRC32 - */ -#define LZMA_INDEX_CHECK_MASK_CRC32 (UINT32_C(1) << LZMA_CHECK_CRC32) - -/** - * \brief Mask for return value from lzma_index_checks() for check CRC64 - */ -#define LZMA_INDEX_CHECK_MASK_CRC64 (UINT32_C(1) << LZMA_CHECK_CRC64) - -/** - * \brief Mask for return value from lzma_index_checks() for check SHA256 - */ -#define LZMA_INDEX_CHECK_MASK_SHA256 (UINT32_C(1) << LZMA_CHECK_SHA256) - -/** - * \brief Calculate memory usage of lzma_index - * - * On disk, the size of the Index field depends on both the number of Records - * stored and the size of the Records (due to variable-length integer - * encoding). When the Index is kept in lzma_index structure, the memory usage - * depends only on the number of Records/Blocks stored in the Index(es), and - * in case of concatenated lzma_indexes, the number of Streams. The size in - * RAM is almost always significantly bigger than in the encoded form on disk. - * - * This function calculates an approximate amount of memory needed to hold - * the given number of Streams and Blocks in lzma_index structure. This - * value may vary between CPU architectures and also between liblzma versions - * if the internal implementation is modified. - * - * \param streams Number of Streams - * \param blocks Number of Blocks - * - * \return Approximate memory in bytes needed in a lzma_index structure. - */ -extern LZMA_API(uint64_t) lzma_index_memusage( - lzma_vli streams, lzma_vli blocks) lzma_nothrow; - - -/** - * \brief Calculate the memory usage of an existing lzma_index - * - * This is a shorthand for lzma_index_memusage(lzma_index_stream_count(i), - * lzma_index_block_count(i)). - * - * \param i Pointer to lzma_index structure - * - * \return Approximate memory in bytes used by the lzma_index structure. - */ -extern LZMA_API(uint64_t) lzma_index_memused(const lzma_index *i) - lzma_nothrow; - - -/** - * \brief Allocate and initialize a new lzma_index structure - * - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return On success, a pointer to an empty initialized lzma_index is - * returned. If allocation fails, NULL is returned. - */ -extern LZMA_API(lzma_index *) lzma_index_init(const lzma_allocator *allocator) - lzma_nothrow; - - -/** - * \brief Deallocate lzma_index - * - * If i is NULL, this does nothing. - * - * \param i Pointer to lzma_index structure to deallocate - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - */ -extern LZMA_API(void) lzma_index_end( - lzma_index *i, const lzma_allocator *allocator) lzma_nothrow; - - -/** - * \brief Add a new Block to lzma_index - * - * \param i Pointer to a lzma_index structure - * \param allocator lzma_allocator for custom allocator - * functions. Set to NULL to use malloc() - * and free(). - * \param unpadded_size Unpadded Size of a Block. This can be - * calculated with lzma_block_unpadded_size() - * after encoding or decoding the Block. - * \param uncompressed_size Uncompressed Size of a Block. This can be - * taken directly from lzma_block structure - * after encoding or decoding the Block. - * - * Appending a new Block does not invalidate iterators. For example, - * if an iterator was pointing to the end of the lzma_index, after - * lzma_index_append() it is possible to read the next Block with - * an existing iterator. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR: Compressed or uncompressed size of the - * Stream or size of the Index field would grow too big. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_append( - lzma_index *i, const lzma_allocator *allocator, - lzma_vli unpadded_size, lzma_vli uncompressed_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Set the Stream Flags - * - * Set the Stream Flags of the last (and typically the only) Stream - * in lzma_index. This can be useful when reading information from the - * lzma_index, because to decode Blocks, knowing the integrity check type - * is needed. - * - * \param i Pointer to lzma_index structure - * \param stream_flags Pointer to lzma_stream_flags structure. This - * is copied into the internal preallocated - * structure, so the caller doesn't need to keep - * the flags' data available after calling this - * function. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_OPTIONS_ERROR: Unsupported stream_flags->version. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_stream_flags( - lzma_index *i, const lzma_stream_flags *stream_flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Get the types of integrity Checks - * - * If lzma_index_stream_flags() is used to set the Stream Flags for - * every Stream, lzma_index_checks() can be used to get a bitmask to - * indicate which Check types have been used. It can be useful e.g. if - * showing the Check types to the user. - * - * The bitmask is 1 << check_id, e.g. CRC32 is 1 << 1 and SHA-256 is 1 << 10. - * These masks are defined for convenience as LZMA_INDEX_CHECK_MASK_XXX - * - * \param i Pointer to lzma_index structure - * - * \return Bitmask indicating which Check types are used in the lzma_index - */ -extern LZMA_API(uint32_t) lzma_index_checks(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Set the amount of Stream Padding - * - * Set the amount of Stream Padding of the last (and typically the only) - * Stream in the lzma_index. This is needed when planning to do random-access - * reading within multiple concatenated Streams. - * - * By default, the amount of Stream Padding is assumed to be zero bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_DATA_ERROR: The file size would grow too big. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_stream_padding( - lzma_index *i, lzma_vli stream_padding) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Get the number of Streams - * - * \param i Pointer to lzma_index structure - * - * \return Number of Streams in the lzma_index - */ -extern LZMA_API(lzma_vli) lzma_index_stream_count(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the number of Blocks - * - * This returns the total number of Blocks in lzma_index. To get number - * of Blocks in individual Streams, use lzma_index_iter. - * - * \param i Pointer to lzma_index structure - * - * \return Number of blocks in the lzma_index - */ -extern LZMA_API(lzma_vli) lzma_index_block_count(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the size of the Index field as bytes - * - * This is needed to verify the Backward Size field in the Stream Footer. - * - * \param i Pointer to lzma_index structure - * - * \return Size in bytes of the Index - */ -extern LZMA_API(lzma_vli) lzma_index_size(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the total size of the Stream - * - * If multiple lzma_indexes have been combined, this works as if the Blocks - * were in a single Stream. This is useful if you are going to combine - * Blocks from multiple Streams into a single new Stream. - * - * \param i Pointer to lzma_index structure - * - * \return Size in bytes of the Stream (if all Blocks are combined - * into one Stream). - */ -extern LZMA_API(lzma_vli) lzma_index_stream_size(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the total size of the Blocks - * - * This doesn't include the Stream Header, Stream Footer, Stream Padding, - * or Index fields. - * - * \param i Pointer to lzma_index structure - * - * \return Size in bytes of all Blocks in the Stream(s) - */ -extern LZMA_API(lzma_vli) lzma_index_total_size(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the total size of the file - * - * When no lzma_indexes have been combined with lzma_index_cat() and there is - * no Stream Padding, this function is identical to lzma_index_stream_size(). - * If multiple lzma_indexes have been combined, this includes also the headers - * of each separate Stream and the possible Stream Padding fields. - * - * \param i Pointer to lzma_index structure - * - * \return Total size of the .xz file in bytes - */ -extern LZMA_API(lzma_vli) lzma_index_file_size(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the uncompressed size of the file - * - * \param i Pointer to lzma_index structure - * - * \return Size in bytes of the uncompressed data in the file - */ -extern LZMA_API(lzma_vli) lzma_index_uncompressed_size(const lzma_index *i) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize an iterator - * - * This function associates the iterator with the given lzma_index, and calls - * lzma_index_iter_rewind() on the iterator. - * - * This function doesn't allocate any memory, thus there is no - * lzma_index_iter_end(). The iterator is valid as long as the - * associated lzma_index is valid, that is, until lzma_index_end() or - * using it as source in lzma_index_cat(). Specifically, lzma_index doesn't - * become invalid if new Blocks are added to it with lzma_index_append() or - * if it is used as the destination in lzma_index_cat(). - * - * It is safe to make copies of an initialized lzma_index_iter, for example, - * to easily restart reading at some particular position. - * - * \param iter Pointer to a lzma_index_iter structure - * \param i lzma_index to which the iterator will be associated - */ -extern LZMA_API(void) lzma_index_iter_init( - lzma_index_iter *iter, const lzma_index *i) lzma_nothrow; - - -/** - * \brief Rewind the iterator - * - * Rewind the iterator so that next call to lzma_index_iter_next() will - * return the first Block or Stream. - * - * \param iter Pointer to a lzma_index_iter structure - */ -extern LZMA_API(void) lzma_index_iter_rewind(lzma_index_iter *iter) - lzma_nothrow; - - -/** - * \brief Get the next Block or Stream - * - * \param iter Iterator initialized with lzma_index_iter_init() - * \param mode Specify what kind of information the caller wants - * to get. See lzma_index_iter_mode for details. - * - * \return lzma_bool: - * - true if no Block or Stream matching the mode is found. - * *iter is not updated (failure). - * - false if the next Block or Stream matching the mode was - * found. *iter is updated (success). - */ -extern LZMA_API(lzma_bool) lzma_index_iter_next( - lzma_index_iter *iter, lzma_index_iter_mode mode) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Locate a Block - * - * If it is possible to seek in the .xz file, it is possible to parse - * the Index field(s) and use lzma_index_iter_locate() to do random-access - * reading with granularity of Block size. - * - * If the target is smaller than the uncompressed size of the Stream (can be - * checked with lzma_index_uncompressed_size()): - * - Information about the Stream and Block containing the requested - * uncompressed offset is stored into *iter. - * - Internal state of the iterator is adjusted so that - * lzma_index_iter_next() can be used to read subsequent Blocks or Streams. - * - * If the target is greater than the uncompressed size of the Stream, *iter - * is not modified. - * - * \param iter Iterator that was earlier initialized with - * lzma_index_iter_init(). - * \param target Uncompressed target offset which the caller would - * like to locate from the Stream - * - * \return lzma_bool: - * - true if the target is greater than or equal to the - * uncompressed size of the Stream (failure) - * - false if the target is smaller than the uncompressed size - * of the Stream (success) - */ -extern LZMA_API(lzma_bool) lzma_index_iter_locate( - lzma_index_iter *iter, lzma_vli target) lzma_nothrow; - - -/** - * \brief Concatenate lzma_indexes - * - * Concatenating lzma_indexes is useful when doing random-access reading in - * multi-Stream .xz file, or when combining multiple Streams into single - * Stream. - * - * \param[out] dest lzma_index after which src is appended - * \param src lzma_index to be appended after dest. If this - * function succeeds, the memory allocated for src - * is freed or moved to be part of dest, and all - * iterators pointing to src will become invalid. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return Possible lzma_ret values: - * - LZMA_OK: lzma_indexes were concatenated successfully. - * src is now a dangling pointer. - * - LZMA_DATA_ERROR: *dest would grow too big. - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_cat(lzma_index *dest, lzma_index *src, - const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Duplicate lzma_index - * - * \param i Pointer to lzma_index structure to be duplicated - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return A copy of the lzma_index, or NULL if memory allocation failed. - */ -extern LZMA_API(lzma_index *) lzma_index_dup( - const lzma_index *i, const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .xz Index encoder - * - * \param strm Pointer to properly prepared lzma_stream - * \param i Pointer to lzma_index which should be encoded. - * - * The valid 'action' values for lzma_code() are LZMA_RUN and LZMA_FINISH. - * It is enough to use only one of them (you can choose freely). - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization succeeded, continue with lzma_code(). - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_encoder( - lzma_stream *strm, const lzma_index *i) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .xz Index decoder - * - * \param strm Pointer to properly prepared lzma_stream - * \param[out] i The decoded Index will be made available via - * this pointer. Initially this function will - * set *i to NULL (the old value is ignored). If - * decoding succeeds (lzma_code() returns - * LZMA_STREAM_END), *i will be set to point - * to a new lzma_index, which the application - * has to later free with lzma_index_end(). - * \param memlimit How much memory the resulting lzma_index is - * allowed to require. liblzma 5.2.3 and earlier - * don't allow 0 here and return LZMA_PROG_ERROR; - * later versions treat 0 as if 1 had been specified. - * - * Valid 'action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH. - * There is no need to use LZMA_FINISH, but it's allowed because it may - * simplify certain types of applications. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Initialization succeeded, continue with lzma_code(). - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - * - * \note liblzma 5.2.3 and older list also LZMA_MEMLIMIT_ERROR here - * but that error code has never been possible from this - * initialization function. - */ -extern LZMA_API(lzma_ret) lzma_index_decoder( - lzma_stream *strm, lzma_index **i, uint64_t memlimit) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Index encoder - * - * \note This function doesn't take allocator argument since all - * the internal data is allocated on stack. - * - * \param i lzma_index to be encoded - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Output buffer is too small. Use - * lzma_index_size() to find out how much output - * space is needed. - * - LZMA_PROG_ERROR - * - */ -extern LZMA_API(lzma_ret) lzma_index_buffer_encode(const lzma_index *i, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Single-call .xz Index decoder - * - * \param[out] i If decoding succeeds, *i will point to a new - * lzma_index, which the application has to - * later free with lzma_index_end(). If an error - * occurs, *i will be NULL. The old value of *i - * is always ignored and thus doesn't need to be - * initialized by the caller. - * \param[out] memlimit Pointer to how much memory the resulting - * lzma_index is allowed to require. The value - * pointed by this pointer is modified if and only - * if LZMA_MEMLIMIT_ERROR is returned. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. - * The minimum required memlimit value was stored to *memlimit. - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_buffer_decode(lzma_index **i, - uint64_t *memlimit, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow; - - -/** - * \brief Initialize a .xz file information decoder - * - * This decoder decodes the Stream Header, Stream Footer, Index, and - * Stream Padding field(s) from the input .xz file and stores the resulting - * combined index in *dest_index. This information can be used to get the - * uncompressed file size with lzma_index_uncompressed_size(*dest_index) or, - * for example, to implement random access reading by locating the Blocks - * in the Streams. - * - * To get the required information from the .xz file, lzma_code() may ask - * the application to seek in the input file by returning LZMA_SEEK_NEEDED - * and having the target file position specified in lzma_stream.seek_pos. - * The number of seeks required depends on the input file and how big buffers - * the application provides. When possible, the decoder will seek backward - * and forward in the given buffer to avoid useless seek requests. Thus, if - * the application provides the whole file at once, no external seeking will - * be required (that is, lzma_code() won't return LZMA_SEEK_NEEDED). - * - * The value in lzma_stream.total_in can be used to estimate how much data - * liblzma had to read to get the file information. However, due to seeking - * and the way total_in is updated, the value of total_in will be somewhat - * inaccurate (a little too big). Thus, total_in is a good estimate but don't - * expect to see the same exact value for the same file if you change the - * input buffer size or switch to a different liblzma version. - * - * Valid 'action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH. - * You only need to use LZMA_RUN; LZMA_FINISH is only supported because it - * might be convenient for some applications. If you use LZMA_FINISH and if - * lzma_code() asks the application to seek, remember to reset 'action' back - * to LZMA_RUN unless you hit the end of the file again. - * - * Possible return values from lzma_code(): - * - LZMA_OK: All OK so far, more input needed - * - LZMA_SEEK_NEEDED: Provide more input starting from the absolute - * file position strm->seek_pos - * - LZMA_STREAM_END: Decoding was successful, *dest_index has been set - * - LZMA_FORMAT_ERROR: The input file is not in the .xz format (the - * expected magic bytes were not found from the beginning of the file) - * - LZMA_OPTIONS_ERROR: File looks valid but contains headers that aren't - * supported by this version of liblzma - * - LZMA_DATA_ERROR: File is corrupt - * - LZMA_BUF_ERROR - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR - * - LZMA_PROG_ERROR - * - * \param strm Pointer to a properly prepared lzma_stream - * \param[out] dest_index Pointer to a pointer where the decoder will put - * the decoded lzma_index. The old value - * of *dest_index is ignored (not freed). - * \param memlimit How much memory the resulting lzma_index is - * allowed to require. Use UINT64_MAX to - * effectively disable the limiter. - * \param file_size Size of the input .xz file - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_file_info_decoder( - lzma_stream *strm, lzma_index **dest_index, - uint64_t memlimit, uint64_t file_size) - lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/index_hash.h b/software/src/xz/src/liblzma/api/lzma/index_hash.h deleted file mode 100644 index 68f9024..0000000 --- a/software/src/xz/src/liblzma/api/lzma/index_hash.h +++ /dev/null @@ -1,123 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/index_hash.h - * \brief Validate Index by using a hash function - * \note Never include this file directly. Use instead. - * - * Hashing makes it possible to use constant amount of memory to validate - * Index of arbitrary size. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - -/** - * \brief Opaque data type to hold the Index hash - */ -typedef struct lzma_index_hash_s lzma_index_hash; - - -/** - * \brief Allocate and initialize a new lzma_index_hash structure - * - * If index_hash is NULL, this function allocates and initializes a new - * lzma_index_hash structure and returns a pointer to it. If allocation - * fails, NULL is returned. - * - * If index_hash is non-NULL, this function reinitializes the lzma_index_hash - * structure and returns the same pointer. In this case, return value cannot - * be NULL or a different pointer than the index_hash that was given as - * an argument. - * - * \param index_hash Pointer to a lzma_index_hash structure or NULL. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * - * \return Initialized lzma_index_hash structure on success or - * NULL on failure. - */ -extern LZMA_API(lzma_index_hash *) lzma_index_hash_init( - lzma_index_hash *index_hash, const lzma_allocator *allocator) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Deallocate lzma_index_hash structure - * - * \param index_hash Pointer to a lzma_index_hash structure to free. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - */ -extern LZMA_API(void) lzma_index_hash_end( - lzma_index_hash *index_hash, const lzma_allocator *allocator) - lzma_nothrow; - - -/** - * \brief Add a new Record to an Index hash - * - * \param index_hash Pointer to a lzma_index_hash structure - * \param unpadded_size Unpadded Size of a Block - * \param uncompressed_size Uncompressed Size of a Block - * - * \return Possible lzma_ret values: - * - LZMA_OK - * - LZMA_DATA_ERROR: Compressed or uncompressed size of the - * Stream or size of the Index field would grow too big. - * - LZMA_PROG_ERROR: Invalid arguments or this function is being - * used when lzma_index_hash_decode() has already been used. - */ -extern LZMA_API(lzma_ret) lzma_index_hash_append(lzma_index_hash *index_hash, - lzma_vli unpadded_size, lzma_vli uncompressed_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode and validate the Index field - * - * After telling the sizes of all Blocks with lzma_index_hash_append(), - * the actual Index field is decoded with this function. Specifically, - * once decoding of the Index field has been started, no more Records - * can be added using lzma_index_hash_append(). - * - * This function doesn't use lzma_stream structure to pass the input data. - * Instead, the input buffer is specified using three arguments. This is - * because it matches better the internal APIs of liblzma. - * - * \param index_hash Pointer to a lzma_index_hash structure - * \param in Pointer to the beginning of the input buffer - * \param[out] in_pos in[*in_pos] is the next byte to process - * \param in_size in[in_size] is the first byte not to process - * - * \return Possible lzma_ret values: - * - LZMA_OK: So far good, but more input is needed. - * - LZMA_STREAM_END: Index decoded successfully and it matches - * the Records given with lzma_index_hash_append(). - * - LZMA_DATA_ERROR: Index is corrupt or doesn't match the - * information given with lzma_index_hash_append(). - * - LZMA_BUF_ERROR: Cannot progress because *in_pos >= in_size. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_index_hash_decode(lzma_index_hash *index_hash, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Get the size of the Index field as bytes - * - * This is needed to verify the Backward Size field in the Stream Footer. - * - * \param index_hash Pointer to a lzma_index_hash structure - * - * \return Size of the Index field in bytes. - */ -extern LZMA_API(lzma_vli) lzma_index_hash_size( - const lzma_index_hash *index_hash) - lzma_nothrow lzma_attr_pure; diff --git a/software/src/xz/src/liblzma/api/lzma/lzma12.h b/software/src/xz/src/liblzma/api/lzma/lzma12.h deleted file mode 100644 index fec3e0d..0000000 --- a/software/src/xz/src/liblzma/api/lzma/lzma12.h +++ /dev/null @@ -1,568 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/lzma12.h - * \brief LZMA1 and LZMA2 filters - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief LZMA1 Filter ID (for raw encoder/decoder only, not in .xz) - * - * LZMA1 is the very same thing as what was called just LZMA in LZMA Utils, - * 7-Zip, and LZMA SDK. It's called LZMA1 here to prevent developers from - * accidentally using LZMA when they actually want LZMA2. - */ -#define LZMA_FILTER_LZMA1 LZMA_VLI_C(0x4000000000000001) - -/** - * \brief LZMA1 Filter ID with extended options (for raw encoder/decoder) - * - * This is like LZMA_FILTER_LZMA1 but with this ID a few extra options - * are supported in the lzma_options_lzma structure: - * - * - A flag to tell the encoder if the end of payload marker (EOPM) alias - * end of stream (EOS) marker must be written at the end of the stream. - * In contrast, LZMA_FILTER_LZMA1 always writes the end marker. - * - * - Decoder needs to be told the uncompressed size of the stream - * or that it is unknown (using the special value UINT64_MAX). - * If the size is known, a flag can be set to allow the presence of - * the end marker anyway. In contrast, LZMA_FILTER_LZMA1 always - * behaves as if the uncompressed size was unknown. - * - * This allows handling file formats where LZMA1 streams are used but where - * the end marker isn't allowed or where it might not (always) be present. - * This extended LZMA1 functionality is provided as a Filter ID for raw - * encoder and decoder instead of adding new encoder and decoder initialization - * functions because this way it is possible to also use extra filters, - * for example, LZMA_FILTER_X86 in a filter chain with LZMA_FILTER_LZMA1EXT, - * which might be needed to handle some file formats. - */ -#define LZMA_FILTER_LZMA1EXT LZMA_VLI_C(0x4000000000000002) - -/** - * \brief LZMA2 Filter ID - * - * Usually you want this instead of LZMA1. Compared to LZMA1, LZMA2 adds - * support for LZMA_SYNC_FLUSH, uncompressed chunks (smaller expansion - * when trying to compress incompressible data), possibility to change - * lc/lp/pb in the middle of encoding, and some other internal improvements. - */ -#define LZMA_FILTER_LZMA2 LZMA_VLI_C(0x21) - - -/** - * \brief Match finders - * - * Match finder has major effect on both speed and compression ratio. - * Usually hash chains are faster than binary trees. - * - * If you will use LZMA_SYNC_FLUSH often, the hash chains may be a better - * choice, because binary trees get much higher compression ratio penalty - * with LZMA_SYNC_FLUSH. - * - * The memory usage formulas are only rough estimates, which are closest to - * reality when dict_size is a power of two. The formulas are more complex - * in reality, and can also change a little between liblzma versions. Use - * lzma_raw_encoder_memusage() to get more accurate estimate of memory usage. - */ -typedef enum { - LZMA_MF_HC3 = 0x03, - /**< - * \brief Hash Chain with 2- and 3-byte hashing - * - * Minimum nice_len: 3 - * - * Memory usage: - * - dict_size <= 16 MiB: dict_size * 7.5 - * - dict_size > 16 MiB: dict_size * 5.5 + 64 MiB - */ - - LZMA_MF_HC4 = 0x04, - /**< - * \brief Hash Chain with 2-, 3-, and 4-byte hashing - * - * Minimum nice_len: 4 - * - * Memory usage: - * - dict_size <= 32 MiB: dict_size * 7.5 - * - dict_size > 32 MiB: dict_size * 6.5 - */ - - LZMA_MF_BT2 = 0x12, - /**< - * \brief Binary Tree with 2-byte hashing - * - * Minimum nice_len: 2 - * - * Memory usage: dict_size * 9.5 - */ - - LZMA_MF_BT3 = 0x13, - /**< - * \brief Binary Tree with 2- and 3-byte hashing - * - * Minimum nice_len: 3 - * - * Memory usage: - * - dict_size <= 16 MiB: dict_size * 11.5 - * - dict_size > 16 MiB: dict_size * 9.5 + 64 MiB - */ - - LZMA_MF_BT4 = 0x14 - /**< - * \brief Binary Tree with 2-, 3-, and 4-byte hashing - * - * Minimum nice_len: 4 - * - * Memory usage: - * - dict_size <= 32 MiB: dict_size * 11.5 - * - dict_size > 32 MiB: dict_size * 10.5 - */ -} lzma_match_finder; - - -/** - * \brief Test if given match finder is supported - * - * It is safe to call this with a value that isn't listed in - * lzma_match_finder enumeration; the return value will be false. - * - * There is no way to list which match finders are available in this - * particular liblzma version and build. It would be useless, because - * a new match finder, which the application developer wasn't aware, - * could require giving additional options to the encoder that the older - * match finders don't need. - * - * \param match_finder Match finder ID - * - * \return lzma_bool: - * - true if the match finder is supported by this liblzma build. - * - false otherwise. - */ -extern LZMA_API(lzma_bool) lzma_mf_is_supported(lzma_match_finder match_finder) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Compression modes - * - * This selects the function used to analyze the data produced by the match - * finder. - */ -typedef enum { - LZMA_MODE_FAST = 1, - /**< - * \brief Fast compression - * - * Fast mode is usually at its best when combined with - * a hash chain match finder. - */ - - LZMA_MODE_NORMAL = 2 - /**< - * \brief Normal compression - * - * This is usually notably slower than fast mode. Use this - * together with binary tree match finders to expose the - * full potential of the LZMA1 or LZMA2 encoder. - */ -} lzma_mode; - - -/** - * \brief Test if given compression mode is supported - * - * It is safe to call this with a value that isn't listed in lzma_mode - * enumeration; the return value will be false. - * - * There is no way to list which modes are available in this particular - * liblzma version and build. It would be useless, because a new compression - * mode, which the application developer wasn't aware, could require giving - * additional options to the encoder that the older modes don't need. - * - * \param mode Mode ID. - * - * \return lzma_bool: - * - true if the compression mode is supported by this liblzma - * build. - * - false otherwise. - */ -extern LZMA_API(lzma_bool) lzma_mode_is_supported(lzma_mode mode) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Options specific to the LZMA1 and LZMA2 filters - * - * Since LZMA1 and LZMA2 share most of the code, it's simplest to share - * the options structure too. For encoding, all but the reserved variables - * need to be initialized unless specifically mentioned otherwise. - * lzma_lzma_preset() can be used to get a good starting point. - * - * For raw decoding, both LZMA1 and LZMA2 need dict_size, preset_dict, and - * preset_dict_size (if preset_dict != NULL). LZMA1 needs also lc, lp, and pb. - */ -typedef struct { - /** - * \brief Dictionary size in bytes - * - * Dictionary size indicates how many bytes of the recently processed - * uncompressed data is kept in memory. One method to reduce size of - * the uncompressed data is to store distance-length pairs, which - * indicate what data to repeat from the dictionary buffer. Thus, - * the bigger the dictionary, the better the compression ratio - * usually is. - * - * Maximum size of the dictionary depends on multiple things: - * - Memory usage limit - * - Available address space (not a problem on 64-bit systems) - * - Selected match finder (encoder only) - * - * Currently the maximum dictionary size for encoding is 1.5 GiB - * (i.e. (UINT32_C(1) << 30) + (UINT32_C(1) << 29)) even on 64-bit - * systems for certain match finder implementation reasons. In the - * future, there may be match finders that support bigger - * dictionaries. - * - * Decoder already supports dictionaries up to 4 GiB - 1 B (i.e. - * UINT32_MAX), so increasing the maximum dictionary size of the - * encoder won't cause problems for old decoders. - * - * Because extremely small dictionaries sizes would have unneeded - * overhead in the decoder, the minimum dictionary size is 4096 bytes. - * - * \note When decoding, too big dictionary does no other harm - * than wasting memory. - */ - uint32_t dict_size; -# define LZMA_DICT_SIZE_MIN UINT32_C(4096) -# define LZMA_DICT_SIZE_DEFAULT (UINT32_C(1) << 23) - - /** - * \brief Pointer to an initial dictionary - * - * It is possible to initialize the LZ77 history window using - * a preset dictionary. It is useful when compressing many - * similar, relatively small chunks of data independently from - * each other. The preset dictionary should contain typical - * strings that occur in the files being compressed. The most - * probable strings should be near the end of the preset dictionary. - * - * This feature should be used only in special situations. For - * now, it works correctly only with raw encoding and decoding. - * Currently none of the container formats supported by - * liblzma allow preset dictionary when decoding, thus if - * you create a .xz or .lzma file with preset dictionary, it - * cannot be decoded with the regular decoder functions. In the - * future, the .xz format will likely get support for preset - * dictionary though. - */ - const uint8_t *preset_dict; - - /** - * \brief Size of the preset dictionary - * - * Specifies the size of the preset dictionary. If the size is - * bigger than dict_size, only the last dict_size bytes are - * processed. - * - * This variable is read only when preset_dict is not NULL. - * If preset_dict is not NULL but preset_dict_size is zero, - * no preset dictionary is used (identical to only setting - * preset_dict to NULL). - */ - uint32_t preset_dict_size; - - /** - * \brief Number of literal context bits - * - * How many of the highest bits of the previous uncompressed - * eight-bit byte (also known as 'literal') are taken into - * account when predicting the bits of the next literal. - * - * E.g. in typical English text, an upper-case letter is - * often followed by a lower-case letter, and a lower-case - * letter is usually followed by another lower-case letter. - * In the US-ASCII character set, the highest three bits are 010 - * for upper-case letters and 011 for lower-case letters. - * When lc is at least 3, the literal coding can take advantage of - * this property in the uncompressed data. - * - * There is a limit that applies to literal context bits and literal - * position bits together: lc + lp <= 4. Without this limit the - * decoding could become very slow, which could have security related - * results in some cases like email servers doing virus scanning. - * This limit also simplifies the internal implementation in liblzma. - * - * There may be LZMA1 streams that have lc + lp > 4 (maximum possible - * lc would be 8). It is not possible to decode such streams with - * liblzma. - */ - uint32_t lc; -# define LZMA_LCLP_MIN 0 -# define LZMA_LCLP_MAX 4 -# define LZMA_LC_DEFAULT 3 - - /** - * \brief Number of literal position bits - * - * lp affects what kind of alignment in the uncompressed data is - * assumed when encoding literals. A literal is a single 8-bit byte. - * See pb below for more information about alignment. - */ - uint32_t lp; -# define LZMA_LP_DEFAULT 0 - - /** - * \brief Number of position bits - * - * pb affects what kind of alignment in the uncompressed data is - * assumed in general. The default means four-byte alignment - * (2^ pb =2^2=4), which is often a good choice when there's - * no better guess. - * - * When the alignment is known, setting pb accordingly may reduce - * the file size a little. E.g. with text files having one-byte - * alignment (US-ASCII, ISO-8859-*, UTF-8), setting pb=0 can - * improve compression slightly. For UTF-16 text, pb=1 is a good - * choice. If the alignment is an odd number like 3 bytes, pb=0 - * might be the best choice. - * - * Even though the assumed alignment can be adjusted with pb and - * lp, LZMA1 and LZMA2 still slightly favor 16-byte alignment. - * It might be worth taking into account when designing file formats - * that are likely to be often compressed with LZMA1 or LZMA2. - */ - uint32_t pb; -# define LZMA_PB_MIN 0 -# define LZMA_PB_MAX 4 -# define LZMA_PB_DEFAULT 2 - - /** Compression mode */ - lzma_mode mode; - - /** - * \brief Nice length of a match - * - * This determines how many bytes the encoder compares from the match - * candidates when looking for the best match. Once a match of at - * least nice_len bytes long is found, the encoder stops looking for - * better candidates and encodes the match. (Naturally, if the found - * match is actually longer than nice_len, the actual length is - * encoded; it's not truncated to nice_len.) - * - * Bigger values usually increase the compression ratio and - * compression time. For most files, 32 to 128 is a good value, - * which gives very good compression ratio at good speed. - * - * The exact minimum value depends on the match finder. The maximum - * is 273, which is the maximum length of a match that LZMA1 and - * LZMA2 can encode. - */ - uint32_t nice_len; - - /** Match finder ID */ - lzma_match_finder mf; - - /** - * \brief Maximum search depth in the match finder - * - * For every input byte, match finder searches through the hash chain - * or binary tree in a loop, each iteration going one step deeper in - * the chain or tree. The searching stops if - * - a match of at least nice_len bytes long is found; - * - all match candidates from the hash chain or binary tree have - * been checked; or - * - maximum search depth is reached. - * - * Maximum search depth is needed to prevent the match finder from - * wasting too much time in case there are lots of short match - * candidates. On the other hand, stopping the search before all - * candidates have been checked can reduce compression ratio. - * - * Setting depth to zero tells liblzma to use an automatic default - * value, that depends on the selected match finder and nice_len. - * The default is in the range [4, 200] or so (it may vary between - * liblzma versions). - * - * Using a bigger depth value than the default can increase - * compression ratio in some cases. There is no strict maximum value, - * but high values (thousands or millions) should be used with care: - * the encoder could remain fast enough with typical input, but - * malicious input could cause the match finder to slow down - * dramatically, possibly creating a denial of service attack. - */ - uint32_t depth; - - /** - * \brief For LZMA_FILTER_LZMA1EXT: Extended flags - * - * This is used only with LZMA_FILTER_LZMA1EXT. - * - * Currently only one flag is supported, LZMA_LZMA1EXT_ALLOW_EOPM: - * - * - Encoder: If the flag is set, then end marker is written just - * like it is with LZMA_FILTER_LZMA1. Without this flag the - * end marker isn't written and the application has to store - * the uncompressed size somewhere outside the compressed stream. - * To decompress streams without the end marker, the application - * has to set the correct uncompressed size in ext_size_low and - * ext_size_high. - * - * - Decoder: If the uncompressed size in ext_size_low and - * ext_size_high is set to the special value UINT64_MAX - * (indicating unknown uncompressed size) then this flag is - * ignored and the end marker must always be present, that is, - * the behavior is identical to LZMA_FILTER_LZMA1. - * - * Otherwise, if this flag isn't set, then the input stream - * must not have the end marker; if the end marker is detected - * then it will result in LZMA_DATA_ERROR. This is useful when - * it is known that the stream must not have the end marker and - * strict validation is wanted. - * - * If this flag is set, then it is autodetected if the end marker - * is present after the specified number of uncompressed bytes - * has been decompressed (ext_size_low and ext_size_high). The - * end marker isn't allowed in any other position. This behavior - * is useful when uncompressed size is known but the end marker - * may or may not be present. This is the case, for example, - * in .7z files (valid .7z files that have the end marker in - * LZMA1 streams are rare but they do exist). - */ - uint32_t ext_flags; -# define LZMA_LZMA1EXT_ALLOW_EOPM UINT32_C(0x01) - - /** - * \brief For LZMA_FILTER_LZMA1EXT: Uncompressed size (low bits) - * - * The 64-bit uncompressed size is needed for decompression with - * LZMA_FILTER_LZMA1EXT. The size is ignored by the encoder. - * - * The special value UINT64_MAX indicates that the uncompressed size - * is unknown and that the end of payload marker (also known as - * end of stream marker) must be present to indicate the end of - * the LZMA1 stream. Any other value indicates the expected - * uncompressed size of the LZMA1 stream. (If LZMA1 was used together - * with filters that change the size of the data then the uncompressed - * size of the LZMA1 stream could be different than the final - * uncompressed size of the filtered stream.) - * - * ext_size_low holds the least significant 32 bits of the - * uncompressed size. The most significant 32 bits must be set - * in ext_size_high. The macro lzma_set_ext_size(opt_lzma, u64size) - * can be used to set these members. - * - * The 64-bit uncompressed size is split into two uint32_t variables - * because there were no reserved uint64_t members and using the - * same options structure for LZMA_FILTER_LZMA1, LZMA_FILTER_LZMA1EXT, - * and LZMA_FILTER_LZMA2 was otherwise more convenient than having - * a new options structure for LZMA_FILTER_LZMA1EXT. (Replacing two - * uint32_t members with one uint64_t changes the ABI on some systems - * as the alignment of this struct can increase from 4 bytes to 8.) - */ - uint32_t ext_size_low; - - /** - * \brief For LZMA_FILTER_LZMA1EXT: Uncompressed size (high bits) - * - * This holds the most significant 32 bits of the uncompressed size. - */ - uint32_t ext_size_high; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * with the currently supported options, so it is safe to leave these - * uninitialized. - */ - - /** \private Reserved member. */ - uint32_t reserved_int4; - - /** \private Reserved member. */ - uint32_t reserved_int5; - - /** \private Reserved member. */ - uint32_t reserved_int6; - - /** \private Reserved member. */ - uint32_t reserved_int7; - - /** \private Reserved member. */ - uint32_t reserved_int8; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum1; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum2; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum3; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum4; - - /** \private Reserved member. */ - void *reserved_ptr1; - - /** \private Reserved member. */ - void *reserved_ptr2; - -} lzma_options_lzma; - - -/** - * \brief Macro to set the 64-bit uncompressed size in ext_size_* - * - * This might be convenient when decoding using LZMA_FILTER_LZMA1EXT. - * This isn't used with LZMA_FILTER_LZMA1 or LZMA_FILTER_LZMA2. - */ -#define lzma_set_ext_size(opt_lzma2, u64size) \ -do { \ - (opt_lzma2).ext_size_low = (uint32_t)(u64size); \ - (opt_lzma2).ext_size_high = (uint32_t)((uint64_t)(u64size) >> 32); \ -} while (0) - - -/** - * \brief Set a compression preset to lzma_options_lzma structure - * - * 0 is the fastest and 9 is the slowest. These match the switches -0 .. -9 - * of the xz command line tool. In addition, it is possible to bitwise-or - * flags to the preset. Currently only LZMA_PRESET_EXTREME is supported. - * The flags are defined in container.h, because the flags are used also - * with lzma_easy_encoder(). - * - * The preset levels are subject to changes between liblzma versions. - * - * This function is available only if LZMA1 or LZMA2 encoder has been enabled - * when building liblzma. - * - * If features (like certain match finders) have been disabled at build time, - * then the function may return success (false) even though the resulting - * LZMA1/LZMA2 options may not be usable for encoder initialization - * (LZMA_OPTIONS_ERROR). - * - * \param[out] options Pointer to LZMA1 or LZMA2 options to be filled - * \param preset Preset level bitwse-ORed with preset flags - * - * \return lzma_bool: - * - true if the preset is not supported (failure). - * - false otherwise (success). - */ -extern LZMA_API(lzma_bool) lzma_lzma_preset( - lzma_options_lzma *options, uint32_t preset) lzma_nothrow; diff --git a/software/src/xz/src/liblzma/api/lzma/stream_flags.h b/software/src/xz/src/liblzma/api/lzma/stream_flags.h deleted file mode 100644 index a33fe46..0000000 --- a/software/src/xz/src/liblzma/api/lzma/stream_flags.h +++ /dev/null @@ -1,265 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/stream_flags.h - * \brief .xz Stream Header and Stream Footer encoder and decoder - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Size of Stream Header and Stream Footer - * - * Stream Header and Stream Footer have the same size and they are not - * going to change even if a newer version of the .xz file format is - * developed in future. - */ -#define LZMA_STREAM_HEADER_SIZE 12 - - -/** - * \brief Options for encoding/decoding Stream Header and Stream Footer - */ -typedef struct { - /** - * \brief Stream Flags format version - * - * To prevent API and ABI breakages if new features are needed in - * Stream Header or Stream Footer, a version number is used to - * indicate which members in this structure are in use. For now, - * version must always be zero. With non-zero version, the - * lzma_stream_header_encode() and lzma_stream_footer_encode() - * will return LZMA_OPTIONS_ERROR. - * - * lzma_stream_header_decode() and lzma_stream_footer_decode() - * will always set this to the lowest value that supports all the - * features indicated by the Stream Flags field. The application - * must check that the version number set by the decoding functions - * is supported by the application. Otherwise it is possible that - * the application will decode the Stream incorrectly. - */ - uint32_t version; - - /** - * \brief Backward Size - * - * Backward Size must be a multiple of four bytes. In this Stream - * format version, Backward Size is the size of the Index field. - * - * Backward Size isn't actually part of the Stream Flags field, but - * it is convenient to include in this structure anyway. Backward - * Size is present only in the Stream Footer. There is no need to - * initialize backward_size when encoding Stream Header. - * - * lzma_stream_header_decode() always sets backward_size to - * LZMA_VLI_UNKNOWN so that it is convenient to use - * lzma_stream_flags_compare() when both Stream Header and Stream - * Footer have been decoded. - */ - lzma_vli backward_size; - - /** - * \brief Minimum value for lzma_stream_flags.backward_size - */ -# define LZMA_BACKWARD_SIZE_MIN 4 - - /** - * \brief Maximum value for lzma_stream_flags.backward_size - */ -# define LZMA_BACKWARD_SIZE_MAX (LZMA_VLI_C(1) << 34) - - /** - * \brief Check ID - * - * This indicates the type of the integrity check calculated from - * uncompressed data. - */ - lzma_check check; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the - * names of these variables may change. - * - * (We will never be able to use all of these since Stream Flags - * is just two bytes plus Backward Size of four bytes. But it's - * nice to have the proper types when they are needed.) - */ - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum1; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum2; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum3; - - /** \private Reserved member. */ - lzma_reserved_enum reserved_enum4; - - /** \private Reserved member. */ - lzma_bool reserved_bool1; - - /** \private Reserved member. */ - lzma_bool reserved_bool2; - - /** \private Reserved member. */ - lzma_bool reserved_bool3; - - /** \private Reserved member. */ - lzma_bool reserved_bool4; - - /** \private Reserved member. */ - lzma_bool reserved_bool5; - - /** \private Reserved member. */ - lzma_bool reserved_bool6; - - /** \private Reserved member. */ - lzma_bool reserved_bool7; - - /** \private Reserved member. */ - lzma_bool reserved_bool8; - - /** \private Reserved member. */ - uint32_t reserved_int1; - - /** \private Reserved member. */ - uint32_t reserved_int2; - -} lzma_stream_flags; - - -/** - * \brief Encode Stream Header - * - * \param options Stream Header options to be encoded. - * options->backward_size is ignored and doesn't - * need to be initialized. - * \param[out] out Beginning of the output buffer of - * LZMA_STREAM_HEADER_SIZE bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_OPTIONS_ERROR: options->version is not supported by - * this liblzma version. - * - LZMA_PROG_ERROR: Invalid options. - */ -extern LZMA_API(lzma_ret) lzma_stream_header_encode( - const lzma_stream_flags *options, uint8_t *out) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Encode Stream Footer - * - * \param options Stream Footer options to be encoded. - * \param[out] out Beginning of the output buffer of - * LZMA_STREAM_HEADER_SIZE bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Encoding was successful. - * - LZMA_OPTIONS_ERROR: options->version is not supported by - * this liblzma version. - * - LZMA_PROG_ERROR: Invalid options. - */ -extern LZMA_API(lzma_ret) lzma_stream_footer_encode( - const lzma_stream_flags *options, uint8_t *out) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode Stream Header - * - * options->backward_size is always set to LZMA_VLI_UNKNOWN. This is to - * help comparing Stream Flags from Stream Header and Stream Footer with - * lzma_stream_flags_compare(). - * - * \note When decoding .xz files that contain multiple Streams, it may - * make sense to print "file format not recognized" only if - * decoding of the Stream Header of the \a first Stream gives - * LZMA_FORMAT_ERROR. If non-first Stream Header gives - * LZMA_FORMAT_ERROR, the message used for LZMA_DATA_ERROR is - * probably more appropriate. - * For example, the Stream decoder in liblzma uses - * LZMA_DATA_ERROR if LZMA_FORMAT_ERROR is returned by - * lzma_stream_header_decode() when decoding non-first Stream. - * - * \param[out] options Target for the decoded Stream Header options. - * \param in Beginning of the input buffer of - * LZMA_STREAM_HEADER_SIZE bytes. - * - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given - * buffer cannot be Stream Header. - * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the header - * is corrupt. - * - LZMA_OPTIONS_ERROR: Unsupported options are present - * in the header. - */ -extern LZMA_API(lzma_ret) lzma_stream_header_decode( - lzma_stream_flags *options, const uint8_t *in) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode Stream Footer - * - * \note If Stream Header was already decoded successfully, but - * decoding Stream Footer returns LZMA_FORMAT_ERROR, the - * application should probably report some other error message - * than "file format not recognized". The file likely - * is corrupt (possibly truncated). The Stream decoder in liblzma - * uses LZMA_DATA_ERROR in this situation. - * - * \param[out] options Target for the decoded Stream Footer options. - * \param in Beginning of the input buffer of - * LZMA_STREAM_HEADER_SIZE bytes. - * - * \return Possible lzma_ret values: - * - LZMA_OK: Decoding was successful. - * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given - * buffer cannot be Stream Footer. - * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the Stream Footer - * is corrupt. - * - LZMA_OPTIONS_ERROR: Unsupported options are present - * in Stream Footer. - */ -extern LZMA_API(lzma_ret) lzma_stream_footer_decode( - lzma_stream_flags *options, const uint8_t *in) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Compare two lzma_stream_flags structures - * - * backward_size values are compared only if both are not - * LZMA_VLI_UNKNOWN. - * - * \param a Pointer to lzma_stream_flags structure - * \param b Pointer to lzma_stream_flags structure - * - * \return Possible lzma_ret values: - * - LZMA_OK: Both are equal. If either had backward_size set - * to LZMA_VLI_UNKNOWN, backward_size values were not - * compared or validated. - * - LZMA_DATA_ERROR: The structures differ. - * - LZMA_OPTIONS_ERROR: version in either structure is greater - * than the maximum supported version (currently zero). - * - LZMA_PROG_ERROR: Invalid value, e.g. invalid check or - * backward_size. - */ -extern LZMA_API(lzma_ret) lzma_stream_flags_compare( - const lzma_stream_flags *a, const lzma_stream_flags *b) - lzma_nothrow lzma_attr_pure; diff --git a/software/src/xz/src/liblzma/api/lzma/version.h b/software/src/xz/src/liblzma/api/lzma/version.h deleted file mode 100644 index 86b3556..0000000 --- a/software/src/xz/src/liblzma/api/lzma/version.h +++ /dev/null @@ -1,134 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/version.h - * \brief Version number - * \note Never include this file directly. Use instead. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** \brief Major version number of the liblzma release. */ -#define LZMA_VERSION_MAJOR 5 - -/** \brief Minor version number of the liblzma release. */ -#define LZMA_VERSION_MINOR 8 - -/** \brief Patch version number of the liblzma release. */ -#define LZMA_VERSION_PATCH 1 - -/** - * \brief Version stability marker - * - * This will always be one of three values: - * - LZMA_VERSION_STABILITY_ALPHA - * - LZMA_VERSION_STABILITY_BETA - * - LZMA_VERSION_STABILITY_STABLE - */ -#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE - -/** \brief Commit version number of the liblzma release */ -#ifndef LZMA_VERSION_COMMIT -# define LZMA_VERSION_COMMIT "" -#endif - - -/* - * Map symbolic stability levels to integers. - */ -#define LZMA_VERSION_STABILITY_ALPHA 0 -#define LZMA_VERSION_STABILITY_BETA 1 -#define LZMA_VERSION_STABILITY_STABLE 2 - - -/** - * \brief Compile-time version number - * - * The version number is of format xyyyzzzs where - * - x = major - * - yyy = minor - * - zzz = revision - * - s indicates stability: 0 = alpha, 1 = beta, 2 = stable - * - * The same xyyyzzz triplet is never reused with different stability levels. - * For example, if 5.1.0alpha has been released, there will never be 5.1.0beta - * or 5.1.0 stable. - * - * \note The version number of liblzma has nothing to with - * the version number of Igor Pavlov's LZMA SDK. - */ -#define LZMA_VERSION (LZMA_VERSION_MAJOR * UINT32_C(10000000) \ - + LZMA_VERSION_MINOR * UINT32_C(10000) \ - + LZMA_VERSION_PATCH * UINT32_C(10) \ - + LZMA_VERSION_STABILITY) - - -/* - * Macros to construct the compile-time version string - */ -#if LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_ALPHA -# define LZMA_VERSION_STABILITY_STRING "alpha" -#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_BETA -# define LZMA_VERSION_STABILITY_STRING "beta" -#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_STABLE -# define LZMA_VERSION_STABILITY_STRING "" -#else -# error Incorrect LZMA_VERSION_STABILITY -#endif - -#define LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) \ - #major "." #minor "." #patch stability commit - -#define LZMA_VERSION_STRING_C(major, minor, patch, stability, commit) \ - LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) - - -/** - * \brief Compile-time version as a string - * - * This can be for example "4.999.5alpha", "4.999.8beta", or "5.0.0" (stable - * versions don't have any "stable" suffix). In future, a snapshot built - * from source code repository may include an additional suffix, for example - * "4.999.8beta-21-g1d92". The commit ID won't be available in numeric form - * in LZMA_VERSION macro. - */ -#define LZMA_VERSION_STRING LZMA_VERSION_STRING_C( \ - LZMA_VERSION_MAJOR, LZMA_VERSION_MINOR, \ - LZMA_VERSION_PATCH, LZMA_VERSION_STABILITY_STRING, \ - LZMA_VERSION_COMMIT) - - -/* #ifndef is needed for use with windres (MinGW-w64 or Cygwin). */ -#ifndef LZMA_H_INTERNAL_RC - -/** - * \brief Run-time version number as an integer - * - * This allows an application to compare if it was built against the same, - * older, or newer version of liblzma that is currently running. - * - * \return The value of LZMA_VERSION macro at the compile time of liblzma - */ -extern LZMA_API(uint32_t) lzma_version_number(void) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Run-time version as a string - * - * This function may be useful to display which version of liblzma an - * application is currently using. - * - * \return Run-time version of liblzma - */ -extern LZMA_API(const char *) lzma_version_string(void) - lzma_nothrow lzma_attr_const; - -#endif diff --git a/software/src/xz/src/liblzma/api/lzma/vli.h b/software/src/xz/src/liblzma/api/lzma/vli.h deleted file mode 100644 index 6b04902..0000000 --- a/software/src/xz/src/liblzma/api/lzma/vli.h +++ /dev/null @@ -1,166 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/** - * \file lzma/vli.h - * \brief Variable-length integer handling - * \note Never include this file directly. Use instead. - * - * In the .xz format, most integers are encoded in a variable-length - * representation, which is sometimes called little endian base-128 encoding. - * This saves space when smaller values are more likely than bigger values. - * - * The encoding scheme encodes seven bits to every byte, using minimum - * number of bytes required to represent the given value. Encodings that use - * non-minimum number of bytes are invalid, thus every integer has exactly - * one encoded representation. The maximum number of bits in a VLI is 63, - * thus the vli argument must be less than or equal to UINT64_MAX / 2. You - * should use LZMA_VLI_MAX for clarity. - */ - -/* - * Author: Lasse Collin - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Maximum supported value of a variable-length integer - */ -#define LZMA_VLI_MAX (UINT64_MAX / 2) - -/** - * \brief VLI value to denote that the value is unknown - */ -#define LZMA_VLI_UNKNOWN UINT64_MAX - -/** - * \brief Maximum supported encoded length of variable length integers - */ -#define LZMA_VLI_BYTES_MAX 9 - -/** - * \brief VLI constant suffix - */ -#define LZMA_VLI_C(n) UINT64_C(n) - - -/** - * \brief Variable-length integer type - * - * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is - * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the - * underlying integer type. - * - * lzma_vli will be uint64_t for the foreseeable future. If a bigger size - * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will - * not overflow lzma_vli. This simplifies integer overflow detection. - */ -typedef uint64_t lzma_vli; - - -/** - * \brief Validate a variable-length integer - * - * This is useful to test that application has given acceptable values - * for example in the uncompressed_size and compressed_size variables. - * - * \return True if the integer is representable as a VLI or if it - * indicates an unknown value. False otherwise. - */ -#define lzma_vli_is_valid(vli) \ - ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) - - -/** - * \brief Encode a variable-length integer - * - * This function has two modes: single-call and multi-call. Single-call mode - * encodes the whole integer at once; it is an error if the output buffer is - * too small. Multi-call mode saves the position in *vli_pos, and thus it is - * possible to continue encoding if the buffer becomes full before the whole - * integer has been encoded. - * - * \param vli Integer to be encoded - * \param[out] vli_pos How many VLI-encoded bytes have already been written - * out. When starting to encode a new integer in - * multi-call mode, *vli_pos must be set to zero. - * To use single-call encoding, set vli_pos to NULL. - * \param[out] out Beginning of the output buffer - * \param[out] out_pos The next byte will be written to out[*out_pos]. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Slightly different return values are used in multi-call and - * single-call modes. - * - * Single-call (vli_pos == NULL): - * - LZMA_OK: Integer successfully encoded. - * - LZMA_PROG_ERROR: Arguments are not sane. This can be due - * to too little output space; single-call mode doesn't use - * LZMA_BUF_ERROR, since the application should have checked - * the encoded size with lzma_vli_size(). - * - * Multi-call (vli_pos != NULL): - * - LZMA_OK: So far all OK, but the integer is not - * completely written out yet. - * - LZMA_STREAM_END: Integer successfully encoded. - * - LZMA_BUF_ERROR: No output space was provided. - * - LZMA_PROG_ERROR: Arguments are not sane. - */ -extern LZMA_API(lzma_ret) lzma_vli_encode(lzma_vli vli, size_t *vli_pos, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Decode a variable-length integer - * - * Like lzma_vli_encode(), this function has single-call and multi-call modes. - * - * \param[out] vli Pointer to decoded integer. The decoder will - * initialize it to zero when *vli_pos == 0, so - * application isn't required to initialize *vli. - * \param[out] vli_pos How many bytes have already been decoded. When - * starting to decode a new integer in multi-call - * mode, *vli_pos must be initialized to zero. To - * use single-call decoding, set vli_pos to NULL. - * \param in Beginning of the input buffer - * \param[out] in_pos The next byte will be read from in[*in_pos]. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * - * \return Slightly different return values are used in multi-call and - * single-call modes. - * - * Single-call (vli_pos == NULL): - * - LZMA_OK: Integer successfully decoded. - * - LZMA_DATA_ERROR: Integer is corrupt. This includes hitting - * the end of the input buffer before the whole integer was - * decoded; providing no input at all will use LZMA_DATA_ERROR. - * - LZMA_PROG_ERROR: Arguments are not sane. - * - * Multi-call (vli_pos != NULL): - * - LZMA_OK: So far all OK, but the integer is not - * completely decoded yet. - * - LZMA_STREAM_END: Integer successfully decoded. - * - LZMA_DATA_ERROR: Integer is corrupt. - * - LZMA_BUF_ERROR: No input was provided. - * - LZMA_PROG_ERROR: Arguments are not sane. - */ -extern LZMA_API(lzma_ret) lzma_vli_decode(lzma_vli *vli, size_t *vli_pos, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow; - - -/** - * \brief Get the number of bytes required to encode a VLI - * - * \param vli Integer whose encoded size is to be determined - * - * \return Number of bytes on success (1-9). If vli isn't valid, - * zero is returned. - */ -extern LZMA_API(uint32_t) lzma_vli_size(lzma_vli vli) - lzma_nothrow lzma_attr_pure; diff --git a/software/src/xz/src/liblzma/check/Makefile.inc b/software/src/xz/src/liblzma/check/Makefile.inc deleted file mode 100644 index 00a26e6..0000000 --- a/software/src/xz/src/liblzma/check/Makefile.inc +++ /dev/null @@ -1,50 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -## Note: There is no check for COND_CHECK_CRC32 because -## currently crc32 is always enabled. - -EXTRA_DIST += \ - check/crc_clmul_consts_gen.c \ - check/crc32_tablegen.c \ - check/crc64_tablegen.c - -liblzma_la_SOURCES += \ - check/check.c \ - check/check.h \ - check/crc_common.h \ - check/crc_x86_clmul.h \ - check/crc32_arm64.h \ - check/crc32_loongarch.h - -if COND_SMALL -liblzma_la_SOURCES += check/crc32_small.c -else -liblzma_la_SOURCES += \ - check/crc32_fast.c \ - check/crc32_table_le.h \ - check/crc32_table_be.h -if COND_ASM_X86 -liblzma_la_SOURCES += check/crc32_x86.S -endif -endif - -if COND_CHECK_CRC64 -if COND_SMALL -liblzma_la_SOURCES += check/crc64_small.c -else -liblzma_la_SOURCES += \ - check/crc64_fast.c \ - check/crc64_table_le.h \ - check/crc64_table_be.h -if COND_ASM_X86 -liblzma_la_SOURCES += check/crc64_x86.S -endif -endif -endif - -if COND_CHECK_SHA256 -if COND_INTERNAL_SHA256 -liblzma_la_SOURCES += check/sha256.c -endif -endif diff --git a/software/src/xz/src/liblzma/check/check.c b/software/src/xz/src/liblzma/check/check.c deleted file mode 100644 index 7734ace..0000000 --- a/software/src/xz/src/liblzma/check/check.c +++ /dev/null @@ -1,173 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file check.c -/// \brief Single API to access different integrity checks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" - - -extern LZMA_API(lzma_bool) -lzma_check_is_supported(lzma_check type) -{ - if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) - return false; - - static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = { - true, // LZMA_CHECK_NONE - -#ifdef HAVE_CHECK_CRC32 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - -#ifdef HAVE_CHECK_CRC64 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - -#ifdef HAVE_CHECK_SHA256 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - }; - - return available_checks[(unsigned int)(type)]; -} - - -extern LZMA_API(uint32_t) -lzma_check_size(lzma_check type) -{ - if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) - return UINT32_MAX; - - // See file-format.txt section 2.1.1.2. - static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = { - 0, - 4, 4, 4, - 8, 8, 8, - 16, 16, 16, - 32, 32, 32, - 64, 64, 64 - }; - - return check_sizes[(unsigned int)(type)]; -} - - -extern void -lzma_check_init(lzma_check_state *check, lzma_check type) -{ - switch (type) { - case LZMA_CHECK_NONE: - break; - -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->state.crc32 = 0; - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->state.crc64 = 0; - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_init(check); - break; -#endif - - default: - break; - } - - return; -} - - -extern void -lzma_check_update(lzma_check_state *check, lzma_check type, - const uint8_t *buf, size_t size) -{ - switch (type) { -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->state.crc32 = lzma_crc32(buf, size, check->state.crc32); - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->state.crc64 = lzma_crc64(buf, size, check->state.crc64); - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_update(buf, size, check); - break; -#endif - - default: - break; - } - - return; -} - - -extern void -lzma_check_finish(lzma_check_state *check, lzma_check type) -{ - switch (type) { -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->buffer.u32[0] = conv32le(check->state.crc32); - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->buffer.u64[0] = conv64le(check->state.crc64); - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_finish(check); - break; -#endif - - default: - break; - } - - return; -} diff --git a/software/src/xz/src/liblzma/check/check.h b/software/src/xz/src/liblzma/check/check.h deleted file mode 100644 index 16a5633..0000000 --- a/software/src/xz/src/liblzma/check/check.h +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file check.h -/// \brief Internal API to different integrity check functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_CHECK_H -#define LZMA_CHECK_H - -#include "common.h" - -// If the function for external SHA-256 is missing, use the internal SHA-256 -// code. Due to how configure works, these defines can only get defined when -// both a usable header and a type have already been found. -#if !(defined(HAVE_CC_SHA256_INIT) \ - || defined(HAVE_SHA256_INIT) \ - || defined(HAVE_SHA256INIT)) -# define HAVE_INTERNAL_SHA256 1 -#endif - -#if defined(HAVE_INTERNAL_SHA256) -// Nothing -#elif defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H) -# include -#elif defined(HAVE_SHA256_H) -# include -# include -#elif defined(HAVE_SHA2_H) -# include -# include -#endif - -#if defined(HAVE_INTERNAL_SHA256) -/// State for the internal SHA-256 implementation -typedef struct { - /// Internal state - uint32_t state[8]; - - /// Size of the message excluding padding - uint64_t size; -} lzma_sha256_state; -#elif defined(HAVE_CC_SHA256_CTX) -typedef CC_SHA256_CTX lzma_sha256_state; -#elif defined(HAVE_SHA256_CTX) -typedef SHA256_CTX lzma_sha256_state; -#elif defined(HAVE_SHA2_CTX) -typedef SHA2_CTX lzma_sha256_state; -#endif - -#if defined(HAVE_INTERNAL_SHA256) -// Nothing -#elif defined(HAVE_CC_SHA256_INIT) -# define LZMA_SHA256FUNC(x) CC_SHA256_ ## x -#elif defined(HAVE_SHA256_INIT) -# define LZMA_SHA256FUNC(x) SHA256_ ## x -#elif defined(HAVE_SHA256INIT) -# define LZMA_SHA256FUNC(x) SHA256 ## x -#endif - -// Index hashing needs the best possible hash function (preferably -// a cryptographic hash) for maximum reliability. -#if defined(HAVE_CHECK_SHA256) -# define LZMA_CHECK_BEST LZMA_CHECK_SHA256 -#elif defined(HAVE_CHECK_CRC64) -# define LZMA_CHECK_BEST LZMA_CHECK_CRC64 -#else -# define LZMA_CHECK_BEST LZMA_CHECK_CRC32 -#endif - - -/// \brief Structure to hold internal state of the check being calculated -/// -/// \note This is not in the public API because this structure may -/// change in future if new integrity check algorithms are added. -typedef struct { - /// Buffer to hold the final result and a temporary buffer for SHA256. - union { - uint8_t u8[64]; - uint32_t u32[16]; - uint64_t u64[8]; - } buffer; - - /// Check-specific data - union { - uint32_t crc32; - uint64_t crc64; - lzma_sha256_state sha256; - } state; - -} lzma_check_state; - - -/// \brief Initialize *check depending on type -extern void lzma_check_init(lzma_check_state *check, lzma_check type); - -/// Update the check state -extern void lzma_check_update(lzma_check_state *check, lzma_check type, - const uint8_t *buf, size_t size); - -/// Finish the check calculation and store the result to check->buffer.u8. -extern void lzma_check_finish(lzma_check_state *check, lzma_check type); - - -#ifndef LZMA_SHA256FUNC - -/// Prepare SHA-256 state for new input. -extern void lzma_sha256_init(lzma_check_state *check); - -/// Update the SHA-256 hash state -extern void lzma_sha256_update( - const uint8_t *buf, size_t size, lzma_check_state *check); - -/// Finish the SHA-256 calculation and store the result to check->buffer.u8. -extern void lzma_sha256_finish(lzma_check_state *check); - - -#else - -static inline void -lzma_sha256_init(lzma_check_state *check) -{ - LZMA_SHA256FUNC(Init)(&check->state.sha256); -} - - -static inline void -lzma_sha256_update(const uint8_t *buf, size_t size, lzma_check_state *check) -{ -#if defined(HAVE_CC_SHA256_INIT) && SIZE_MAX > UINT32_MAX - // Darwin's CC_SHA256_Update takes uint32_t as the buffer size, - // so use a loop to support size_t. - while (size > UINT32_MAX) { - LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, UINT32_MAX); - buf += UINT32_MAX; - size -= UINT32_MAX; - } -#endif - - LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, size); -} - - -static inline void -lzma_sha256_finish(lzma_check_state *check) -{ - LZMA_SHA256FUNC(Final)(check->buffer.u8, &check->state.sha256); -} - -#endif - -#endif diff --git a/software/src/xz/src/liblzma/check/crc32_arm64.h b/software/src/xz/src/liblzma/check/crc32_arm64.h deleted file mode 100644 index fb0e8f0..0000000 --- a/software/src/xz/src/liblzma/check/crc32_arm64.h +++ /dev/null @@ -1,147 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32_arm64.h -/// \brief CRC32 calculation with ARM64 optimization -// -// Authors: Chenxi Mao -// Jia Tan -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_CRC32_ARM64_H -#define LZMA_CRC32_ARM64_H - -// MSVC always has the CRC intrinsics available when building for ARM64 -// there is no need to include any header files. -#ifndef _MSC_VER -# include -#endif - -// If both versions are going to be built, we need runtime detection -// to check if the instructions are supported. -#if defined(CRC32_GENERIC) && defined(CRC32_ARCH_OPTIMIZED) -# if defined(HAVE_GETAUXVAL) || defined(HAVE_ELF_AUX_INFO) -# include -# elif defined(_WIN32) -# include -# elif defined(__APPLE__) && defined(HAVE_SYSCTLBYNAME) -# include -# endif -#endif - -// Some EDG-based compilers support ARM64 and define __GNUC__ -// (such as Nvidia's nvcc), but do not support function attributes. -// -// NOTE: Build systems check for this too, keep them in sync with this. -#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) -# define crc_attr_target __attribute__((__target__("+crc"))) -#else -# define crc_attr_target -#endif - - -crc_attr_target -static uint32_t -crc32_arch_optimized(const uint8_t *buf, size_t size, uint32_t crc) -{ - crc = ~crc; - - if (size >= 8) { - // Align the input buffer because this was shown to be - // significantly faster than unaligned accesses. - const size_t align = (0 - (uintptr_t)buf) & 7; - - if (align & 1) - crc = __crc32b(crc, *buf++); - - if (align & 2) { - crc = __crc32h(crc, aligned_read16le(buf)); - buf += 2; - } - - if (align & 4) { - crc = __crc32w(crc, aligned_read32le(buf)); - buf += 4; - } - - size -= align; - - // Process 8 bytes at a time. The end point is determined by - // ignoring the least significant three bits of size to - // ensure we do not process past the bounds of the buffer. - // This guarantees that limit is a multiple of 8 and is - // strictly less than size. - for (const uint8_t *limit = buf + (size & ~(size_t)7); - buf < limit; buf += 8) - crc = __crc32d(crc, aligned_read64le(buf)); - - size &= 7; - } - - // Process the remaining bytes that are not 8 byte aligned. - if (size & 4) { - crc = __crc32w(crc, aligned_read32le(buf)); - buf += 4; - } - - if (size & 2) { - crc = __crc32h(crc, aligned_read16le(buf)); - buf += 2; - } - - if (size & 1) - crc = __crc32b(crc, *buf); - - return ~crc; -} - - -#if defined(CRC32_GENERIC) && defined(CRC32_ARCH_OPTIMIZED) -static inline bool -is_arch_extension_supported(void) -{ -#if defined(HAVE_GETAUXVAL) - return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0; - -#elif defined(HAVE_ELF_AUX_INFO) - unsigned long feature_flags; - - if (elf_aux_info(AT_HWCAP, &feature_flags, sizeof(feature_flags)) != 0) - return false; - - return (feature_flags & HWCAP_CRC32) != 0; - -#elif defined(_WIN32) - return IsProcessorFeaturePresent( - PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE); - -#elif defined(__APPLE__) && defined(HAVE_SYSCTLBYNAME) - int has_crc32 = 0; - size_t size = sizeof(has_crc32); - - // The sysctlbyname() function requires a string identifier for the - // CPU feature it tests. The Apple documentation lists the string - // "hw.optional.armv8_crc32", which can be found here: - // https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics#3915619 - if (sysctlbyname("hw.optional.armv8_crc32", &has_crc32, - &size, NULL, 0) != 0) - return false; - - return has_crc32; - -#else - // If a runtime detection method cannot be found, then this must - // be a compile time error. The checks in crc_common.h should ensure - // a runtime detection method is always found if this function is - // built. It would be possible to just return false here, but this - // is inefficient for binary size and runtime since only the generic - // method could ever be used. -# error Runtime detection method unavailable. -#endif -} -#endif - -#endif // LZMA_CRC32_ARM64_H diff --git a/software/src/xz/src/liblzma/check/crc32_fast.c b/software/src/xz/src/liblzma/check/crc32_fast.c deleted file mode 100644 index 3c7cb95..0000000 --- a/software/src/xz/src/liblzma/check/crc32_fast.c +++ /dev/null @@ -1,196 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32.c -/// \brief CRC32 calculation -// -// Authors: Lasse Collin -// Ilya Kurdyukov -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" -#include "crc_common.h" - -#if defined(CRC_X86_CLMUL) -# define BUILDING_CRC_CLMUL 32 -# include "crc_x86_clmul.h" -#elif defined(CRC32_ARM64) -# include "crc32_arm64.h" -#elif defined(CRC32_LOONGARCH) -# include "crc32_loongarch.h" -#endif - - -#ifdef CRC32_GENERIC - -/////////////////// -// Generic CRC32 // -/////////////////// - -#ifdef WORDS_BIGENDIAN -# include "crc32_table_be.h" -#else -# include "crc32_table_le.h" -#endif - - -#ifdef HAVE_CRC_X86_ASM -extern uint32_t lzma_crc32_generic( - const uint8_t *buf, size_t size, uint32_t crc); -#else -static uint32_t -lzma_crc32_generic(const uint8_t *buf, size_t size, uint32_t crc) -{ - crc = ~crc; - -#ifdef WORDS_BIGENDIAN - crc = byteswap32(crc); -#endif - - if (size > 8) { - // Fix the alignment, if needed. The if statement above - // ensures that this won't read past the end of buf[]. - while ((uintptr_t)(buf) & 7) { - crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); - --size; - } - - // Calculate the position where to stop. - const uint8_t *const limit = buf + (size & ~(size_t)(7)); - - // Calculate how many bytes must be calculated separately - // before returning the result. - size &= (size_t)(7); - - // Calculate the CRC32 using the slice-by-eight algorithm. - while (buf < limit) { - crc ^= aligned_read32ne(buf); - buf += 4; - - crc = lzma_crc32_table[7][A(crc)] - ^ lzma_crc32_table[6][B(crc)] - ^ lzma_crc32_table[5][C(crc)] - ^ lzma_crc32_table[4][D(crc)]; - - const uint32_t tmp = aligned_read32ne(buf); - buf += 4; - - // At least with some compilers, it is critical for - // performance, that the crc variable is XORed - // between the two table-lookup pairs. - crc = lzma_crc32_table[3][A(tmp)] - ^ lzma_crc32_table[2][B(tmp)] - ^ crc - ^ lzma_crc32_table[1][C(tmp)] - ^ lzma_crc32_table[0][D(tmp)]; - } - } - - while (size-- != 0) - crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); - -#ifdef WORDS_BIGENDIAN - crc = byteswap32(crc); -#endif - - return ~crc; -} -#endif // HAVE_CRC_X86_ASM -#endif // CRC32_GENERIC - - -#if defined(CRC32_GENERIC) && defined(CRC32_ARCH_OPTIMIZED) - -////////////////////////// -// Function dispatching // -////////////////////////// - -// If both the generic and arch-optimized implementations are built, then -// the function to use is selected at runtime because the system running -// the binary might not have the arch-specific instruction set extension(s) -// available. The dispatch methods in order of priority: -// -// 1. Constructor. This method uses __attribute__((__constructor__)) to -// set crc32_func at load time. This avoids extra computation (and any -// unlikely threading bugs) on the first call to lzma_crc32() to decide -// which implementation should be used. -// -// 2. First Call Resolution. On the very first call to lzma_crc32(), the -// call will be directed to crc32_dispatch() instead. This will set the -// appropriate implementation function and will not be called again. -// This method does not use any kind of locking but is safe because if -// multiple threads run the dispatcher simultaneously then they will all -// set crc32_func to the same value. - -typedef uint32_t (*crc32_func_type)( - const uint8_t *buf, size_t size, uint32_t crc); - -// This resolver is shared between all dispatch methods. -static crc32_func_type -crc32_resolve(void) -{ - return is_arch_extension_supported() - ? &crc32_arch_optimized : &lzma_crc32_generic; -} - - -#ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -// Constructor method. -# define CRC32_SET_FUNC_ATTR __attribute__((__constructor__)) -static crc32_func_type crc32_func; -#else -// First Call Resolution method. -# define CRC32_SET_FUNC_ATTR -static uint32_t crc32_dispatch(const uint8_t *buf, size_t size, uint32_t crc); -static crc32_func_type crc32_func = &crc32_dispatch; -#endif - -CRC32_SET_FUNC_ATTR -static void -crc32_set_func(void) -{ - crc32_func = crc32_resolve(); - return; -} - -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -static uint32_t -crc32_dispatch(const uint8_t *buf, size_t size, uint32_t crc) -{ - // When __attribute__((__constructor__)) isn't supported, set the - // function pointer without any locking. If multiple threads run - // the detection code in parallel, they will all end up setting - // the pointer to the same value. This avoids the use of - // mythread_once() on every call to lzma_crc32() but this likely - // isn't strictly standards compliant. Let's change it if it breaks. - crc32_set_func(); - return crc32_func(buf, size, crc); -} - -#endif -#endif - - -extern LZMA_API(uint32_t) -lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) -{ -#if defined(CRC32_GENERIC) && defined(CRC32_ARCH_OPTIMIZED) -/* -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR - // See crc32_dispatch(). This would be the alternative which uses - // locking and doesn't use crc32_dispatch(). Note that on Windows - // this method needs Vista threads. - mythread_once(crc64_set_func); -#endif -*/ - return crc32_func(buf, size, crc); - -#elif defined(CRC32_ARCH_OPTIMIZED) - return crc32_arch_optimized(buf, size, crc); - -#else - return lzma_crc32_generic(buf, size, crc); -#endif -} diff --git a/software/src/xz/src/liblzma/check/crc32_loongarch.h b/software/src/xz/src/liblzma/check/crc32_loongarch.h deleted file mode 100644 index ec738b8..0000000 --- a/software/src/xz/src/liblzma/check/crc32_loongarch.h +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32_loongarch.h -/// \brief CRC32 calculation with LoongArch optimization -// -// Authors: Xi Ruoyao -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_CRC32_LOONGARCH_H -#define LZMA_CRC32_LOONGARCH_H - -#include - - -static uint32_t -crc32_arch_optimized(const uint8_t *buf, size_t size, uint32_t crc_unsigned) -{ - int32_t crc = (int32_t)~crc_unsigned; - - if (size >= 8) { - const size_t align = (0 - (uintptr_t)buf) & 7; - - if (align & 1) - crc = __crc_w_b_w((int8_t)*buf++, crc); - - if (align & 2) { - crc = __crc_w_h_w((int16_t)aligned_read16le(buf), crc); - buf += 2; - } - - if (align & 4) { - crc = __crc_w_w_w((int32_t)aligned_read32le(buf), crc); - buf += 4; - } - - size -= align; - - for (const uint8_t *limit = buf + (size & ~(size_t)7); - buf < limit; buf += 8) - crc = __crc_w_d_w((int64_t)aligned_read64le(buf), crc); - - size &= 7; - } - - if (size & 4) { - crc = __crc_w_w_w((int32_t)aligned_read32le(buf), crc); - buf += 4; - } - - if (size & 2) { - crc = __crc_w_h_w((int16_t)aligned_read16le(buf), crc); - buf += 2; - } - - if (size & 1) - crc = __crc_w_b_w((int8_t)*buf, crc); - - return (uint32_t)~crc; -} - -#endif // LZMA_CRC32_LOONGARCH_H diff --git a/software/src/xz/src/liblzma/check/crc32_small.c b/software/src/xz/src/liblzma/check/crc32_small.c deleted file mode 100644 index 4a62830..0000000 --- a/software/src/xz/src/liblzma/check/crc32_small.c +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32_small.c -/// \brief CRC32 calculation (size-optimized) -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" -#include "crc_common.h" - - -// The table is used by the LZ encoder too, thus it's not static like -// in crc64_small.c. -uint32_t lzma_crc32_table[1][256]; - - -#ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -__attribute__((__constructor__)) -#endif -static void -crc32_init(void) -{ - static const uint32_t poly32 = UINT32_C(0xEDB88320); - - for (size_t b = 0; b < 256; ++b) { - uint32_t r = b; - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly32; - else - r >>= 1; - } - - lzma_crc32_table[0][b] = r; - } - - return; -} - - -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -extern void -lzma_crc32_init(void) -{ - mythread_once(crc32_init); - return; -} -#endif - - -extern LZMA_API(uint32_t) -lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) -{ -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR - lzma_crc32_init(); -#endif - - crc = ~crc; - - while (size != 0) { - crc = lzma_crc32_table[0][*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); - --size; - } - - return ~crc; -} diff --git a/software/src/xz/src/liblzma/check/crc32_table_be.h b/software/src/xz/src/liblzma/check/crc32_table_be.h deleted file mode 100644 index 505c230..0000000 --- a/software/src/xz/src/liblzma/check/crc32_table_be.h +++ /dev/null @@ -1,527 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by crc32_tablegen.c. - -const uint32_t lzma_crc32_table[8][256] = { - { - 0x00000000, 0x96300777, 0x2C610EEE, 0xBA510999, - 0x19C46D07, 0x8FF46A70, 0x35A563E9, 0xA395649E, - 0x3288DB0E, 0xA4B8DC79, 0x1EE9D5E0, 0x88D9D297, - 0x2B4CB609, 0xBD7CB17E, 0x072DB8E7, 0x911DBF90, - 0x6410B71D, 0xF220B06A, 0x4871B9F3, 0xDE41BE84, - 0x7DD4DA1A, 0xEBE4DD6D, 0x51B5D4F4, 0xC785D383, - 0x56986C13, 0xC0A86B64, 0x7AF962FD, 0xECC9658A, - 0x4F5C0114, 0xD96C0663, 0x633D0FFA, 0xF50D088D, - 0xC8206E3B, 0x5E10694C, 0xE44160D5, 0x727167A2, - 0xD1E4033C, 0x47D4044B, 0xFD850DD2, 0x6BB50AA5, - 0xFAA8B535, 0x6C98B242, 0xD6C9BBDB, 0x40F9BCAC, - 0xE36CD832, 0x755CDF45, 0xCF0DD6DC, 0x593DD1AB, - 0xAC30D926, 0x3A00DE51, 0x8051D7C8, 0x1661D0BF, - 0xB5F4B421, 0x23C4B356, 0x9995BACF, 0x0FA5BDB8, - 0x9EB80228, 0x0888055F, 0xB2D90CC6, 0x24E90BB1, - 0x877C6F2F, 0x114C6858, 0xAB1D61C1, 0x3D2D66B6, - 0x9041DC76, 0x0671DB01, 0xBC20D298, 0x2A10D5EF, - 0x8985B171, 0x1FB5B606, 0xA5E4BF9F, 0x33D4B8E8, - 0xA2C90778, 0x34F9000F, 0x8EA80996, 0x18980EE1, - 0xBB0D6A7F, 0x2D3D6D08, 0x976C6491, 0x015C63E6, - 0xF4516B6B, 0x62616C1C, 0xD8306585, 0x4E0062F2, - 0xED95066C, 0x7BA5011B, 0xC1F40882, 0x57C40FF5, - 0xC6D9B065, 0x50E9B712, 0xEAB8BE8B, 0x7C88B9FC, - 0xDF1DDD62, 0x492DDA15, 0xF37CD38C, 0x654CD4FB, - 0x5861B24D, 0xCE51B53A, 0x7400BCA3, 0xE230BBD4, - 0x41A5DF4A, 0xD795D83D, 0x6DC4D1A4, 0xFBF4D6D3, - 0x6AE96943, 0xFCD96E34, 0x468867AD, 0xD0B860DA, - 0x732D0444, 0xE51D0333, 0x5F4C0AAA, 0xC97C0DDD, - 0x3C710550, 0xAA410227, 0x10100BBE, 0x86200CC9, - 0x25B56857, 0xB3856F20, 0x09D466B9, 0x9FE461CE, - 0x0EF9DE5E, 0x98C9D929, 0x2298D0B0, 0xB4A8D7C7, - 0x173DB359, 0x810DB42E, 0x3B5CBDB7, 0xAD6CBAC0, - 0x2083B8ED, 0xB6B3BF9A, 0x0CE2B603, 0x9AD2B174, - 0x3947D5EA, 0xAF77D29D, 0x1526DB04, 0x8316DC73, - 0x120B63E3, 0x843B6494, 0x3E6A6D0D, 0xA85A6A7A, - 0x0BCF0EE4, 0x9DFF0993, 0x27AE000A, 0xB19E077D, - 0x44930FF0, 0xD2A30887, 0x68F2011E, 0xFEC20669, - 0x5D5762F7, 0xCB676580, 0x71366C19, 0xE7066B6E, - 0x761BD4FE, 0xE02BD389, 0x5A7ADA10, 0xCC4ADD67, - 0x6FDFB9F9, 0xF9EFBE8E, 0x43BEB717, 0xD58EB060, - 0xE8A3D6D6, 0x7E93D1A1, 0xC4C2D838, 0x52F2DF4F, - 0xF167BBD1, 0x6757BCA6, 0xDD06B53F, 0x4B36B248, - 0xDA2B0DD8, 0x4C1B0AAF, 0xF64A0336, 0x607A0441, - 0xC3EF60DF, 0x55DF67A8, 0xEF8E6E31, 0x79BE6946, - 0x8CB361CB, 0x1A8366BC, 0xA0D26F25, 0x36E26852, - 0x95770CCC, 0x03470BBB, 0xB9160222, 0x2F260555, - 0xBE3BBAC5, 0x280BBDB2, 0x925AB42B, 0x046AB35C, - 0xA7FFD7C2, 0x31CFD0B5, 0x8B9ED92C, 0x1DAEDE5B, - 0xB0C2649B, 0x26F263EC, 0x9CA36A75, 0x0A936D02, - 0xA906099C, 0x3F360EEB, 0x85670772, 0x13570005, - 0x824ABF95, 0x147AB8E2, 0xAE2BB17B, 0x381BB60C, - 0x9B8ED292, 0x0DBED5E5, 0xB7EFDC7C, 0x21DFDB0B, - 0xD4D2D386, 0x42E2D4F1, 0xF8B3DD68, 0x6E83DA1F, - 0xCD16BE81, 0x5B26B9F6, 0xE177B06F, 0x7747B718, - 0xE65A0888, 0x706A0FFF, 0xCA3B0666, 0x5C0B0111, - 0xFF9E658F, 0x69AE62F8, 0xD3FF6B61, 0x45CF6C16, - 0x78E20AA0, 0xEED20DD7, 0x5483044E, 0xC2B30339, - 0x612667A7, 0xF71660D0, 0x4D476949, 0xDB776E3E, - 0x4A6AD1AE, 0xDC5AD6D9, 0x660BDF40, 0xF03BD837, - 0x53AEBCA9, 0xC59EBBDE, 0x7FCFB247, 0xE9FFB530, - 0x1CF2BDBD, 0x8AC2BACA, 0x3093B353, 0xA6A3B424, - 0x0536D0BA, 0x9306D7CD, 0x2957DE54, 0xBF67D923, - 0x2E7A66B3, 0xB84A61C4, 0x021B685D, 0x942B6F2A, - 0x37BE0BB4, 0xA18E0CC3, 0x1BDF055A, 0x8DEF022D - }, { - 0x00000000, 0x41311B19, 0x82623632, 0xC3532D2B, - 0x04C56C64, 0x45F4777D, 0x86A75A56, 0xC796414F, - 0x088AD9C8, 0x49BBC2D1, 0x8AE8EFFA, 0xCBD9F4E3, - 0x0C4FB5AC, 0x4D7EAEB5, 0x8E2D839E, 0xCF1C9887, - 0x5112C24A, 0x1023D953, 0xD370F478, 0x9241EF61, - 0x55D7AE2E, 0x14E6B537, 0xD7B5981C, 0x96848305, - 0x59981B82, 0x18A9009B, 0xDBFA2DB0, 0x9ACB36A9, - 0x5D5D77E6, 0x1C6C6CFF, 0xDF3F41D4, 0x9E0E5ACD, - 0xA2248495, 0xE3159F8C, 0x2046B2A7, 0x6177A9BE, - 0xA6E1E8F1, 0xE7D0F3E8, 0x2483DEC3, 0x65B2C5DA, - 0xAAAE5D5D, 0xEB9F4644, 0x28CC6B6F, 0x69FD7076, - 0xAE6B3139, 0xEF5A2A20, 0x2C09070B, 0x6D381C12, - 0xF33646DF, 0xB2075DC6, 0x715470ED, 0x30656BF4, - 0xF7F32ABB, 0xB6C231A2, 0x75911C89, 0x34A00790, - 0xFBBC9F17, 0xBA8D840E, 0x79DEA925, 0x38EFB23C, - 0xFF79F373, 0xBE48E86A, 0x7D1BC541, 0x3C2ADE58, - 0x054F79F0, 0x447E62E9, 0x872D4FC2, 0xC61C54DB, - 0x018A1594, 0x40BB0E8D, 0x83E823A6, 0xC2D938BF, - 0x0DC5A038, 0x4CF4BB21, 0x8FA7960A, 0xCE968D13, - 0x0900CC5C, 0x4831D745, 0x8B62FA6E, 0xCA53E177, - 0x545DBBBA, 0x156CA0A3, 0xD63F8D88, 0x970E9691, - 0x5098D7DE, 0x11A9CCC7, 0xD2FAE1EC, 0x93CBFAF5, - 0x5CD76272, 0x1DE6796B, 0xDEB55440, 0x9F844F59, - 0x58120E16, 0x1923150F, 0xDA703824, 0x9B41233D, - 0xA76BFD65, 0xE65AE67C, 0x2509CB57, 0x6438D04E, - 0xA3AE9101, 0xE29F8A18, 0x21CCA733, 0x60FDBC2A, - 0xAFE124AD, 0xEED03FB4, 0x2D83129F, 0x6CB20986, - 0xAB2448C9, 0xEA1553D0, 0x29467EFB, 0x687765E2, - 0xF6793F2F, 0xB7482436, 0x741B091D, 0x352A1204, - 0xF2BC534B, 0xB38D4852, 0x70DE6579, 0x31EF7E60, - 0xFEF3E6E7, 0xBFC2FDFE, 0x7C91D0D5, 0x3DA0CBCC, - 0xFA368A83, 0xBB07919A, 0x7854BCB1, 0x3965A7A8, - 0x4B98833B, 0x0AA99822, 0xC9FAB509, 0x88CBAE10, - 0x4F5DEF5F, 0x0E6CF446, 0xCD3FD96D, 0x8C0EC274, - 0x43125AF3, 0x022341EA, 0xC1706CC1, 0x804177D8, - 0x47D73697, 0x06E62D8E, 0xC5B500A5, 0x84841BBC, - 0x1A8A4171, 0x5BBB5A68, 0x98E87743, 0xD9D96C5A, - 0x1E4F2D15, 0x5F7E360C, 0x9C2D1B27, 0xDD1C003E, - 0x120098B9, 0x533183A0, 0x9062AE8B, 0xD153B592, - 0x16C5F4DD, 0x57F4EFC4, 0x94A7C2EF, 0xD596D9F6, - 0xE9BC07AE, 0xA88D1CB7, 0x6BDE319C, 0x2AEF2A85, - 0xED796BCA, 0xAC4870D3, 0x6F1B5DF8, 0x2E2A46E1, - 0xE136DE66, 0xA007C57F, 0x6354E854, 0x2265F34D, - 0xE5F3B202, 0xA4C2A91B, 0x67918430, 0x26A09F29, - 0xB8AEC5E4, 0xF99FDEFD, 0x3ACCF3D6, 0x7BFDE8CF, - 0xBC6BA980, 0xFD5AB299, 0x3E099FB2, 0x7F3884AB, - 0xB0241C2C, 0xF1150735, 0x32462A1E, 0x73773107, - 0xB4E17048, 0xF5D06B51, 0x3683467A, 0x77B25D63, - 0x4ED7FACB, 0x0FE6E1D2, 0xCCB5CCF9, 0x8D84D7E0, - 0x4A1296AF, 0x0B238DB6, 0xC870A09D, 0x8941BB84, - 0x465D2303, 0x076C381A, 0xC43F1531, 0x850E0E28, - 0x42984F67, 0x03A9547E, 0xC0FA7955, 0x81CB624C, - 0x1FC53881, 0x5EF42398, 0x9DA70EB3, 0xDC9615AA, - 0x1B0054E5, 0x5A314FFC, 0x996262D7, 0xD85379CE, - 0x174FE149, 0x567EFA50, 0x952DD77B, 0xD41CCC62, - 0x138A8D2D, 0x52BB9634, 0x91E8BB1F, 0xD0D9A006, - 0xECF37E5E, 0xADC26547, 0x6E91486C, 0x2FA05375, - 0xE836123A, 0xA9070923, 0x6A542408, 0x2B653F11, - 0xE479A796, 0xA548BC8F, 0x661B91A4, 0x272A8ABD, - 0xE0BCCBF2, 0xA18DD0EB, 0x62DEFDC0, 0x23EFE6D9, - 0xBDE1BC14, 0xFCD0A70D, 0x3F838A26, 0x7EB2913F, - 0xB924D070, 0xF815CB69, 0x3B46E642, 0x7A77FD5B, - 0xB56B65DC, 0xF45A7EC5, 0x370953EE, 0x763848F7, - 0xB1AE09B8, 0xF09F12A1, 0x33CC3F8A, 0x72FD2493 - }, { - 0x00000000, 0x376AC201, 0x6ED48403, 0x59BE4602, - 0xDCA80907, 0xEBC2CB06, 0xB27C8D04, 0x85164F05, - 0xB851130E, 0x8F3BD10F, 0xD685970D, 0xE1EF550C, - 0x64F91A09, 0x5393D808, 0x0A2D9E0A, 0x3D475C0B, - 0x70A3261C, 0x47C9E41D, 0x1E77A21F, 0x291D601E, - 0xAC0B2F1B, 0x9B61ED1A, 0xC2DFAB18, 0xF5B56919, - 0xC8F23512, 0xFF98F713, 0xA626B111, 0x914C7310, - 0x145A3C15, 0x2330FE14, 0x7A8EB816, 0x4DE47A17, - 0xE0464D38, 0xD72C8F39, 0x8E92C93B, 0xB9F80B3A, - 0x3CEE443F, 0x0B84863E, 0x523AC03C, 0x6550023D, - 0x58175E36, 0x6F7D9C37, 0x36C3DA35, 0x01A91834, - 0x84BF5731, 0xB3D59530, 0xEA6BD332, 0xDD011133, - 0x90E56B24, 0xA78FA925, 0xFE31EF27, 0xC95B2D26, - 0x4C4D6223, 0x7B27A022, 0x2299E620, 0x15F32421, - 0x28B4782A, 0x1FDEBA2B, 0x4660FC29, 0x710A3E28, - 0xF41C712D, 0xC376B32C, 0x9AC8F52E, 0xADA2372F, - 0xC08D9A70, 0xF7E75871, 0xAE591E73, 0x9933DC72, - 0x1C259377, 0x2B4F5176, 0x72F11774, 0x459BD575, - 0x78DC897E, 0x4FB64B7F, 0x16080D7D, 0x2162CF7C, - 0xA4748079, 0x931E4278, 0xCAA0047A, 0xFDCAC67B, - 0xB02EBC6C, 0x87447E6D, 0xDEFA386F, 0xE990FA6E, - 0x6C86B56B, 0x5BEC776A, 0x02523168, 0x3538F369, - 0x087FAF62, 0x3F156D63, 0x66AB2B61, 0x51C1E960, - 0xD4D7A665, 0xE3BD6464, 0xBA032266, 0x8D69E067, - 0x20CBD748, 0x17A11549, 0x4E1F534B, 0x7975914A, - 0xFC63DE4F, 0xCB091C4E, 0x92B75A4C, 0xA5DD984D, - 0x989AC446, 0xAFF00647, 0xF64E4045, 0xC1248244, - 0x4432CD41, 0x73580F40, 0x2AE64942, 0x1D8C8B43, - 0x5068F154, 0x67023355, 0x3EBC7557, 0x09D6B756, - 0x8CC0F853, 0xBBAA3A52, 0xE2147C50, 0xD57EBE51, - 0xE839E25A, 0xDF53205B, 0x86ED6659, 0xB187A458, - 0x3491EB5D, 0x03FB295C, 0x5A456F5E, 0x6D2FAD5F, - 0x801B35E1, 0xB771F7E0, 0xEECFB1E2, 0xD9A573E3, - 0x5CB33CE6, 0x6BD9FEE7, 0x3267B8E5, 0x050D7AE4, - 0x384A26EF, 0x0F20E4EE, 0x569EA2EC, 0x61F460ED, - 0xE4E22FE8, 0xD388EDE9, 0x8A36ABEB, 0xBD5C69EA, - 0xF0B813FD, 0xC7D2D1FC, 0x9E6C97FE, 0xA90655FF, - 0x2C101AFA, 0x1B7AD8FB, 0x42C49EF9, 0x75AE5CF8, - 0x48E900F3, 0x7F83C2F2, 0x263D84F0, 0x115746F1, - 0x944109F4, 0xA32BCBF5, 0xFA958DF7, 0xCDFF4FF6, - 0x605D78D9, 0x5737BAD8, 0x0E89FCDA, 0x39E33EDB, - 0xBCF571DE, 0x8B9FB3DF, 0xD221F5DD, 0xE54B37DC, - 0xD80C6BD7, 0xEF66A9D6, 0xB6D8EFD4, 0x81B22DD5, - 0x04A462D0, 0x33CEA0D1, 0x6A70E6D3, 0x5D1A24D2, - 0x10FE5EC5, 0x27949CC4, 0x7E2ADAC6, 0x494018C7, - 0xCC5657C2, 0xFB3C95C3, 0xA282D3C1, 0x95E811C0, - 0xA8AF4DCB, 0x9FC58FCA, 0xC67BC9C8, 0xF1110BC9, - 0x740744CC, 0x436D86CD, 0x1AD3C0CF, 0x2DB902CE, - 0x4096AF91, 0x77FC6D90, 0x2E422B92, 0x1928E993, - 0x9C3EA696, 0xAB546497, 0xF2EA2295, 0xC580E094, - 0xF8C7BC9F, 0xCFAD7E9E, 0x9613389C, 0xA179FA9D, - 0x246FB598, 0x13057799, 0x4ABB319B, 0x7DD1F39A, - 0x3035898D, 0x075F4B8C, 0x5EE10D8E, 0x698BCF8F, - 0xEC9D808A, 0xDBF7428B, 0x82490489, 0xB523C688, - 0x88649A83, 0xBF0E5882, 0xE6B01E80, 0xD1DADC81, - 0x54CC9384, 0x63A65185, 0x3A181787, 0x0D72D586, - 0xA0D0E2A9, 0x97BA20A8, 0xCE0466AA, 0xF96EA4AB, - 0x7C78EBAE, 0x4B1229AF, 0x12AC6FAD, 0x25C6ADAC, - 0x1881F1A7, 0x2FEB33A6, 0x765575A4, 0x413FB7A5, - 0xC429F8A0, 0xF3433AA1, 0xAAFD7CA3, 0x9D97BEA2, - 0xD073C4B5, 0xE71906B4, 0xBEA740B6, 0x89CD82B7, - 0x0CDBCDB2, 0x3BB10FB3, 0x620F49B1, 0x55658BB0, - 0x6822D7BB, 0x5F4815BA, 0x06F653B8, 0x319C91B9, - 0xB48ADEBC, 0x83E01CBD, 0xDA5E5ABF, 0xED3498BE - }, { - 0x00000000, 0x6567BCB8, 0x8BC809AA, 0xEEAFB512, - 0x5797628F, 0x32F0DE37, 0xDC5F6B25, 0xB938D79D, - 0xEF28B4C5, 0x8A4F087D, 0x64E0BD6F, 0x018701D7, - 0xB8BFD64A, 0xDDD86AF2, 0x3377DFE0, 0x56106358, - 0x9F571950, 0xFA30A5E8, 0x149F10FA, 0x71F8AC42, - 0xC8C07BDF, 0xADA7C767, 0x43087275, 0x266FCECD, - 0x707FAD95, 0x1518112D, 0xFBB7A43F, 0x9ED01887, - 0x27E8CF1A, 0x428F73A2, 0xAC20C6B0, 0xC9477A08, - 0x3EAF32A0, 0x5BC88E18, 0xB5673B0A, 0xD00087B2, - 0x6938502F, 0x0C5FEC97, 0xE2F05985, 0x8797E53D, - 0xD1878665, 0xB4E03ADD, 0x5A4F8FCF, 0x3F283377, - 0x8610E4EA, 0xE3775852, 0x0DD8ED40, 0x68BF51F8, - 0xA1F82BF0, 0xC49F9748, 0x2A30225A, 0x4F579EE2, - 0xF66F497F, 0x9308F5C7, 0x7DA740D5, 0x18C0FC6D, - 0x4ED09F35, 0x2BB7238D, 0xC518969F, 0xA07F2A27, - 0x1947FDBA, 0x7C204102, 0x928FF410, 0xF7E848A8, - 0x3D58149B, 0x583FA823, 0xB6901D31, 0xD3F7A189, - 0x6ACF7614, 0x0FA8CAAC, 0xE1077FBE, 0x8460C306, - 0xD270A05E, 0xB7171CE6, 0x59B8A9F4, 0x3CDF154C, - 0x85E7C2D1, 0xE0807E69, 0x0E2FCB7B, 0x6B4877C3, - 0xA20F0DCB, 0xC768B173, 0x29C70461, 0x4CA0B8D9, - 0xF5986F44, 0x90FFD3FC, 0x7E5066EE, 0x1B37DA56, - 0x4D27B90E, 0x284005B6, 0xC6EFB0A4, 0xA3880C1C, - 0x1AB0DB81, 0x7FD76739, 0x9178D22B, 0xF41F6E93, - 0x03F7263B, 0x66909A83, 0x883F2F91, 0xED589329, - 0x546044B4, 0x3107F80C, 0xDFA84D1E, 0xBACFF1A6, - 0xECDF92FE, 0x89B82E46, 0x67179B54, 0x027027EC, - 0xBB48F071, 0xDE2F4CC9, 0x3080F9DB, 0x55E74563, - 0x9CA03F6B, 0xF9C783D3, 0x176836C1, 0x720F8A79, - 0xCB375DE4, 0xAE50E15C, 0x40FF544E, 0x2598E8F6, - 0x73888BAE, 0x16EF3716, 0xF8408204, 0x9D273EBC, - 0x241FE921, 0x41785599, 0xAFD7E08B, 0xCAB05C33, - 0x3BB659ED, 0x5ED1E555, 0xB07E5047, 0xD519ECFF, - 0x6C213B62, 0x094687DA, 0xE7E932C8, 0x828E8E70, - 0xD49EED28, 0xB1F95190, 0x5F56E482, 0x3A31583A, - 0x83098FA7, 0xE66E331F, 0x08C1860D, 0x6DA63AB5, - 0xA4E140BD, 0xC186FC05, 0x2F294917, 0x4A4EF5AF, - 0xF3762232, 0x96119E8A, 0x78BE2B98, 0x1DD99720, - 0x4BC9F478, 0x2EAE48C0, 0xC001FDD2, 0xA566416A, - 0x1C5E96F7, 0x79392A4F, 0x97969F5D, 0xF2F123E5, - 0x05196B4D, 0x607ED7F5, 0x8ED162E7, 0xEBB6DE5F, - 0x528E09C2, 0x37E9B57A, 0xD9460068, 0xBC21BCD0, - 0xEA31DF88, 0x8F566330, 0x61F9D622, 0x049E6A9A, - 0xBDA6BD07, 0xD8C101BF, 0x366EB4AD, 0x53090815, - 0x9A4E721D, 0xFF29CEA5, 0x11867BB7, 0x74E1C70F, - 0xCDD91092, 0xA8BEAC2A, 0x46111938, 0x2376A580, - 0x7566C6D8, 0x10017A60, 0xFEAECF72, 0x9BC973CA, - 0x22F1A457, 0x479618EF, 0xA939ADFD, 0xCC5E1145, - 0x06EE4D76, 0x6389F1CE, 0x8D2644DC, 0xE841F864, - 0x51792FF9, 0x341E9341, 0xDAB12653, 0xBFD69AEB, - 0xE9C6F9B3, 0x8CA1450B, 0x620EF019, 0x07694CA1, - 0xBE519B3C, 0xDB362784, 0x35999296, 0x50FE2E2E, - 0x99B95426, 0xFCDEE89E, 0x12715D8C, 0x7716E134, - 0xCE2E36A9, 0xAB498A11, 0x45E63F03, 0x208183BB, - 0x7691E0E3, 0x13F65C5B, 0xFD59E949, 0x983E55F1, - 0x2106826C, 0x44613ED4, 0xAACE8BC6, 0xCFA9377E, - 0x38417FD6, 0x5D26C36E, 0xB389767C, 0xD6EECAC4, - 0x6FD61D59, 0x0AB1A1E1, 0xE41E14F3, 0x8179A84B, - 0xD769CB13, 0xB20E77AB, 0x5CA1C2B9, 0x39C67E01, - 0x80FEA99C, 0xE5991524, 0x0B36A036, 0x6E511C8E, - 0xA7166686, 0xC271DA3E, 0x2CDE6F2C, 0x49B9D394, - 0xF0810409, 0x95E6B8B1, 0x7B490DA3, 0x1E2EB11B, - 0x483ED243, 0x2D596EFB, 0xC3F6DBE9, 0xA6916751, - 0x1FA9B0CC, 0x7ACE0C74, 0x9461B966, 0xF10605DE - }, { - 0x00000000, 0xB029603D, 0x6053C07A, 0xD07AA047, - 0xC0A680F5, 0x708FE0C8, 0xA0F5408F, 0x10DC20B2, - 0xC14B7030, 0x7162100D, 0xA118B04A, 0x1131D077, - 0x01EDF0C5, 0xB1C490F8, 0x61BE30BF, 0xD1975082, - 0x8297E060, 0x32BE805D, 0xE2C4201A, 0x52ED4027, - 0x42316095, 0xF21800A8, 0x2262A0EF, 0x924BC0D2, - 0x43DC9050, 0xF3F5F06D, 0x238F502A, 0x93A63017, - 0x837A10A5, 0x33537098, 0xE329D0DF, 0x5300B0E2, - 0x042FC1C1, 0xB406A1FC, 0x647C01BB, 0xD4556186, - 0xC4894134, 0x74A02109, 0xA4DA814E, 0x14F3E173, - 0xC564B1F1, 0x754DD1CC, 0xA537718B, 0x151E11B6, - 0x05C23104, 0xB5EB5139, 0x6591F17E, 0xD5B89143, - 0x86B821A1, 0x3691419C, 0xE6EBE1DB, 0x56C281E6, - 0x461EA154, 0xF637C169, 0x264D612E, 0x96640113, - 0x47F35191, 0xF7DA31AC, 0x27A091EB, 0x9789F1D6, - 0x8755D164, 0x377CB159, 0xE706111E, 0x572F7123, - 0x4958F358, 0xF9719365, 0x290B3322, 0x9922531F, - 0x89FE73AD, 0x39D71390, 0xE9ADB3D7, 0x5984D3EA, - 0x88138368, 0x383AE355, 0xE8404312, 0x5869232F, - 0x48B5039D, 0xF89C63A0, 0x28E6C3E7, 0x98CFA3DA, - 0xCBCF1338, 0x7BE67305, 0xAB9CD342, 0x1BB5B37F, - 0x0B6993CD, 0xBB40F3F0, 0x6B3A53B7, 0xDB13338A, - 0x0A846308, 0xBAAD0335, 0x6AD7A372, 0xDAFEC34F, - 0xCA22E3FD, 0x7A0B83C0, 0xAA712387, 0x1A5843BA, - 0x4D773299, 0xFD5E52A4, 0x2D24F2E3, 0x9D0D92DE, - 0x8DD1B26C, 0x3DF8D251, 0xED827216, 0x5DAB122B, - 0x8C3C42A9, 0x3C152294, 0xEC6F82D3, 0x5C46E2EE, - 0x4C9AC25C, 0xFCB3A261, 0x2CC90226, 0x9CE0621B, - 0xCFE0D2F9, 0x7FC9B2C4, 0xAFB31283, 0x1F9A72BE, - 0x0F46520C, 0xBF6F3231, 0x6F159276, 0xDF3CF24B, - 0x0EABA2C9, 0xBE82C2F4, 0x6EF862B3, 0xDED1028E, - 0xCE0D223C, 0x7E244201, 0xAE5EE246, 0x1E77827B, - 0x92B0E6B1, 0x2299868C, 0xF2E326CB, 0x42CA46F6, - 0x52166644, 0xE23F0679, 0x3245A63E, 0x826CC603, - 0x53FB9681, 0xE3D2F6BC, 0x33A856FB, 0x838136C6, - 0x935D1674, 0x23747649, 0xF30ED60E, 0x4327B633, - 0x102706D1, 0xA00E66EC, 0x7074C6AB, 0xC05DA696, - 0xD0818624, 0x60A8E619, 0xB0D2465E, 0x00FB2663, - 0xD16C76E1, 0x614516DC, 0xB13FB69B, 0x0116D6A6, - 0x11CAF614, 0xA1E39629, 0x7199366E, 0xC1B05653, - 0x969F2770, 0x26B6474D, 0xF6CCE70A, 0x46E58737, - 0x5639A785, 0xE610C7B8, 0x366A67FF, 0x864307C2, - 0x57D45740, 0xE7FD377D, 0x3787973A, 0x87AEF707, - 0x9772D7B5, 0x275BB788, 0xF72117CF, 0x470877F2, - 0x1408C710, 0xA421A72D, 0x745B076A, 0xC4726757, - 0xD4AE47E5, 0x648727D8, 0xB4FD879F, 0x04D4E7A2, - 0xD543B720, 0x656AD71D, 0xB510775A, 0x05391767, - 0x15E537D5, 0xA5CC57E8, 0x75B6F7AF, 0xC59F9792, - 0xDBE815E9, 0x6BC175D4, 0xBBBBD593, 0x0B92B5AE, - 0x1B4E951C, 0xAB67F521, 0x7B1D5566, 0xCB34355B, - 0x1AA365D9, 0xAA8A05E4, 0x7AF0A5A3, 0xCAD9C59E, - 0xDA05E52C, 0x6A2C8511, 0xBA562556, 0x0A7F456B, - 0x597FF589, 0xE95695B4, 0x392C35F3, 0x890555CE, - 0x99D9757C, 0x29F01541, 0xF98AB506, 0x49A3D53B, - 0x983485B9, 0x281DE584, 0xF86745C3, 0x484E25FE, - 0x5892054C, 0xE8BB6571, 0x38C1C536, 0x88E8A50B, - 0xDFC7D428, 0x6FEEB415, 0xBF941452, 0x0FBD746F, - 0x1F6154DD, 0xAF4834E0, 0x7F3294A7, 0xCF1BF49A, - 0x1E8CA418, 0xAEA5C425, 0x7EDF6462, 0xCEF6045F, - 0xDE2A24ED, 0x6E0344D0, 0xBE79E497, 0x0E5084AA, - 0x5D503448, 0xED795475, 0x3D03F432, 0x8D2A940F, - 0x9DF6B4BD, 0x2DDFD480, 0xFDA574C7, 0x4D8C14FA, - 0x9C1B4478, 0x2C322445, 0xFC488402, 0x4C61E43F, - 0x5CBDC48D, 0xEC94A4B0, 0x3CEE04F7, 0x8CC764CA - }, { - 0x00000000, 0xA5D35CCB, 0x0BA1C84D, 0xAE729486, - 0x1642919B, 0xB391CD50, 0x1DE359D6, 0xB830051D, - 0x6D8253EC, 0xC8510F27, 0x66239BA1, 0xC3F0C76A, - 0x7BC0C277, 0xDE139EBC, 0x70610A3A, 0xD5B256F1, - 0x9B02D603, 0x3ED18AC8, 0x90A31E4E, 0x35704285, - 0x8D404798, 0x28931B53, 0x86E18FD5, 0x2332D31E, - 0xF68085EF, 0x5353D924, 0xFD214DA2, 0x58F21169, - 0xE0C21474, 0x451148BF, 0xEB63DC39, 0x4EB080F2, - 0x3605AC07, 0x93D6F0CC, 0x3DA4644A, 0x98773881, - 0x20473D9C, 0x85946157, 0x2BE6F5D1, 0x8E35A91A, - 0x5B87FFEB, 0xFE54A320, 0x502637A6, 0xF5F56B6D, - 0x4DC56E70, 0xE81632BB, 0x4664A63D, 0xE3B7FAF6, - 0xAD077A04, 0x08D426CF, 0xA6A6B249, 0x0375EE82, - 0xBB45EB9F, 0x1E96B754, 0xB0E423D2, 0x15377F19, - 0xC08529E8, 0x65567523, 0xCB24E1A5, 0x6EF7BD6E, - 0xD6C7B873, 0x7314E4B8, 0xDD66703E, 0x78B52CF5, - 0x6C0A580F, 0xC9D904C4, 0x67AB9042, 0xC278CC89, - 0x7A48C994, 0xDF9B955F, 0x71E901D9, 0xD43A5D12, - 0x01880BE3, 0xA45B5728, 0x0A29C3AE, 0xAFFA9F65, - 0x17CA9A78, 0xB219C6B3, 0x1C6B5235, 0xB9B80EFE, - 0xF7088E0C, 0x52DBD2C7, 0xFCA94641, 0x597A1A8A, - 0xE14A1F97, 0x4499435C, 0xEAEBD7DA, 0x4F388B11, - 0x9A8ADDE0, 0x3F59812B, 0x912B15AD, 0x34F84966, - 0x8CC84C7B, 0x291B10B0, 0x87698436, 0x22BAD8FD, - 0x5A0FF408, 0xFFDCA8C3, 0x51AE3C45, 0xF47D608E, - 0x4C4D6593, 0xE99E3958, 0x47ECADDE, 0xE23FF115, - 0x378DA7E4, 0x925EFB2F, 0x3C2C6FA9, 0x99FF3362, - 0x21CF367F, 0x841C6AB4, 0x2A6EFE32, 0x8FBDA2F9, - 0xC10D220B, 0x64DE7EC0, 0xCAACEA46, 0x6F7FB68D, - 0xD74FB390, 0x729CEF5B, 0xDCEE7BDD, 0x793D2716, - 0xAC8F71E7, 0x095C2D2C, 0xA72EB9AA, 0x02FDE561, - 0xBACDE07C, 0x1F1EBCB7, 0xB16C2831, 0x14BF74FA, - 0xD814B01E, 0x7DC7ECD5, 0xD3B57853, 0x76662498, - 0xCE562185, 0x6B857D4E, 0xC5F7E9C8, 0x6024B503, - 0xB596E3F2, 0x1045BF39, 0xBE372BBF, 0x1BE47774, - 0xA3D47269, 0x06072EA2, 0xA875BA24, 0x0DA6E6EF, - 0x4316661D, 0xE6C53AD6, 0x48B7AE50, 0xED64F29B, - 0x5554F786, 0xF087AB4D, 0x5EF53FCB, 0xFB266300, - 0x2E9435F1, 0x8B47693A, 0x2535FDBC, 0x80E6A177, - 0x38D6A46A, 0x9D05F8A1, 0x33776C27, 0x96A430EC, - 0xEE111C19, 0x4BC240D2, 0xE5B0D454, 0x4063889F, - 0xF8538D82, 0x5D80D149, 0xF3F245CF, 0x56211904, - 0x83934FF5, 0x2640133E, 0x883287B8, 0x2DE1DB73, - 0x95D1DE6E, 0x300282A5, 0x9E701623, 0x3BA34AE8, - 0x7513CA1A, 0xD0C096D1, 0x7EB20257, 0xDB615E9C, - 0x63515B81, 0xC682074A, 0x68F093CC, 0xCD23CF07, - 0x189199F6, 0xBD42C53D, 0x133051BB, 0xB6E30D70, - 0x0ED3086D, 0xAB0054A6, 0x0572C020, 0xA0A19CEB, - 0xB41EE811, 0x11CDB4DA, 0xBFBF205C, 0x1A6C7C97, - 0xA25C798A, 0x078F2541, 0xA9FDB1C7, 0x0C2EED0C, - 0xD99CBBFD, 0x7C4FE736, 0xD23D73B0, 0x77EE2F7B, - 0xCFDE2A66, 0x6A0D76AD, 0xC47FE22B, 0x61ACBEE0, - 0x2F1C3E12, 0x8ACF62D9, 0x24BDF65F, 0x816EAA94, - 0x395EAF89, 0x9C8DF342, 0x32FF67C4, 0x972C3B0F, - 0x429E6DFE, 0xE74D3135, 0x493FA5B3, 0xECECF978, - 0x54DCFC65, 0xF10FA0AE, 0x5F7D3428, 0xFAAE68E3, - 0x821B4416, 0x27C818DD, 0x89BA8C5B, 0x2C69D090, - 0x9459D58D, 0x318A8946, 0x9FF81DC0, 0x3A2B410B, - 0xEF9917FA, 0x4A4A4B31, 0xE438DFB7, 0x41EB837C, - 0xF9DB8661, 0x5C08DAAA, 0xF27A4E2C, 0x57A912E7, - 0x19199215, 0xBCCACEDE, 0x12B85A58, 0xB76B0693, - 0x0F5B038E, 0xAA885F45, 0x04FACBC3, 0xA1299708, - 0x749BC1F9, 0xD1489D32, 0x7F3A09B4, 0xDAE9557F, - 0x62D95062, 0xC70A0CA9, 0x6978982F, 0xCCABC4E4 - }, { - 0x00000000, 0xB40B77A6, 0x29119F97, 0x9D1AE831, - 0x13244FF4, 0xA72F3852, 0x3A35D063, 0x8E3EA7C5, - 0x674EEF33, 0xD3459895, 0x4E5F70A4, 0xFA540702, - 0x746AA0C7, 0xC061D761, 0x5D7B3F50, 0xE97048F6, - 0xCE9CDE67, 0x7A97A9C1, 0xE78D41F0, 0x53863656, - 0xDDB89193, 0x69B3E635, 0xF4A90E04, 0x40A279A2, - 0xA9D23154, 0x1DD946F2, 0x80C3AEC3, 0x34C8D965, - 0xBAF67EA0, 0x0EFD0906, 0x93E7E137, 0x27EC9691, - 0x9C39BDCF, 0x2832CA69, 0xB5282258, 0x012355FE, - 0x8F1DF23B, 0x3B16859D, 0xA60C6DAC, 0x12071A0A, - 0xFB7752FC, 0x4F7C255A, 0xD266CD6B, 0x666DBACD, - 0xE8531D08, 0x5C586AAE, 0xC142829F, 0x7549F539, - 0x52A563A8, 0xE6AE140E, 0x7BB4FC3F, 0xCFBF8B99, - 0x41812C5C, 0xF58A5BFA, 0x6890B3CB, 0xDC9BC46D, - 0x35EB8C9B, 0x81E0FB3D, 0x1CFA130C, 0xA8F164AA, - 0x26CFC36F, 0x92C4B4C9, 0x0FDE5CF8, 0xBBD52B5E, - 0x79750B44, 0xCD7E7CE2, 0x506494D3, 0xE46FE375, - 0x6A5144B0, 0xDE5A3316, 0x4340DB27, 0xF74BAC81, - 0x1E3BE477, 0xAA3093D1, 0x372A7BE0, 0x83210C46, - 0x0D1FAB83, 0xB914DC25, 0x240E3414, 0x900543B2, - 0xB7E9D523, 0x03E2A285, 0x9EF84AB4, 0x2AF33D12, - 0xA4CD9AD7, 0x10C6ED71, 0x8DDC0540, 0x39D772E6, - 0xD0A73A10, 0x64AC4DB6, 0xF9B6A587, 0x4DBDD221, - 0xC38375E4, 0x77880242, 0xEA92EA73, 0x5E999DD5, - 0xE54CB68B, 0x5147C12D, 0xCC5D291C, 0x78565EBA, - 0xF668F97F, 0x42638ED9, 0xDF7966E8, 0x6B72114E, - 0x820259B8, 0x36092E1E, 0xAB13C62F, 0x1F18B189, - 0x9126164C, 0x252D61EA, 0xB83789DB, 0x0C3CFE7D, - 0x2BD068EC, 0x9FDB1F4A, 0x02C1F77B, 0xB6CA80DD, - 0x38F42718, 0x8CFF50BE, 0x11E5B88F, 0xA5EECF29, - 0x4C9E87DF, 0xF895F079, 0x658F1848, 0xD1846FEE, - 0x5FBAC82B, 0xEBB1BF8D, 0x76AB57BC, 0xC2A0201A, - 0xF2EA1688, 0x46E1612E, 0xDBFB891F, 0x6FF0FEB9, - 0xE1CE597C, 0x55C52EDA, 0xC8DFC6EB, 0x7CD4B14D, - 0x95A4F9BB, 0x21AF8E1D, 0xBCB5662C, 0x08BE118A, - 0x8680B64F, 0x328BC1E9, 0xAF9129D8, 0x1B9A5E7E, - 0x3C76C8EF, 0x887DBF49, 0x15675778, 0xA16C20DE, - 0x2F52871B, 0x9B59F0BD, 0x0643188C, 0xB2486F2A, - 0x5B3827DC, 0xEF33507A, 0x7229B84B, 0xC622CFED, - 0x481C6828, 0xFC171F8E, 0x610DF7BF, 0xD5068019, - 0x6ED3AB47, 0xDAD8DCE1, 0x47C234D0, 0xF3C94376, - 0x7DF7E4B3, 0xC9FC9315, 0x54E67B24, 0xE0ED0C82, - 0x099D4474, 0xBD9633D2, 0x208CDBE3, 0x9487AC45, - 0x1AB90B80, 0xAEB27C26, 0x33A89417, 0x87A3E3B1, - 0xA04F7520, 0x14440286, 0x895EEAB7, 0x3D559D11, - 0xB36B3AD4, 0x07604D72, 0x9A7AA543, 0x2E71D2E5, - 0xC7019A13, 0x730AEDB5, 0xEE100584, 0x5A1B7222, - 0xD425D5E7, 0x602EA241, 0xFD344A70, 0x493F3DD6, - 0x8B9F1DCC, 0x3F946A6A, 0xA28E825B, 0x1685F5FD, - 0x98BB5238, 0x2CB0259E, 0xB1AACDAF, 0x05A1BA09, - 0xECD1F2FF, 0x58DA8559, 0xC5C06D68, 0x71CB1ACE, - 0xFFF5BD0B, 0x4BFECAAD, 0xD6E4229C, 0x62EF553A, - 0x4503C3AB, 0xF108B40D, 0x6C125C3C, 0xD8192B9A, - 0x56278C5F, 0xE22CFBF9, 0x7F3613C8, 0xCB3D646E, - 0x224D2C98, 0x96465B3E, 0x0B5CB30F, 0xBF57C4A9, - 0x3169636C, 0x856214CA, 0x1878FCFB, 0xAC738B5D, - 0x17A6A003, 0xA3ADD7A5, 0x3EB73F94, 0x8ABC4832, - 0x0482EFF7, 0xB0899851, 0x2D937060, 0x999807C6, - 0x70E84F30, 0xC4E33896, 0x59F9D0A7, 0xEDF2A701, - 0x63CC00C4, 0xD7C77762, 0x4ADD9F53, 0xFED6E8F5, - 0xD93A7E64, 0x6D3109C2, 0xF02BE1F3, 0x44209655, - 0xCA1E3190, 0x7E154636, 0xE30FAE07, 0x5704D9A1, - 0xBE749157, 0x0A7FE6F1, 0x97650EC0, 0x236E7966, - 0xAD50DEA3, 0x195BA905, 0x84414134, 0x304A3692 - }, { - 0x00000000, 0x9E00AACC, 0x7D072542, 0xE3078F8E, - 0xFA0E4A84, 0x640EE048, 0x87096FC6, 0x1909C50A, - 0xB51BE5D3, 0x2B1B4F1F, 0xC81CC091, 0x561C6A5D, - 0x4F15AF57, 0xD115059B, 0x32128A15, 0xAC1220D9, - 0x2B31BB7C, 0xB53111B0, 0x56369E3E, 0xC83634F2, - 0xD13FF1F8, 0x4F3F5B34, 0xAC38D4BA, 0x32387E76, - 0x9E2A5EAF, 0x002AF463, 0xE32D7BED, 0x7D2DD121, - 0x6424142B, 0xFA24BEE7, 0x19233169, 0x87239BA5, - 0x566276F9, 0xC862DC35, 0x2B6553BB, 0xB565F977, - 0xAC6C3C7D, 0x326C96B1, 0xD16B193F, 0x4F6BB3F3, - 0xE379932A, 0x7D7939E6, 0x9E7EB668, 0x007E1CA4, - 0x1977D9AE, 0x87777362, 0x6470FCEC, 0xFA705620, - 0x7D53CD85, 0xE3536749, 0x0054E8C7, 0x9E54420B, - 0x875D8701, 0x195D2DCD, 0xFA5AA243, 0x645A088F, - 0xC8482856, 0x5648829A, 0xB54F0D14, 0x2B4FA7D8, - 0x324662D2, 0xAC46C81E, 0x4F414790, 0xD141ED5C, - 0xEDC29D29, 0x73C237E5, 0x90C5B86B, 0x0EC512A7, - 0x17CCD7AD, 0x89CC7D61, 0x6ACBF2EF, 0xF4CB5823, - 0x58D978FA, 0xC6D9D236, 0x25DE5DB8, 0xBBDEF774, - 0xA2D7327E, 0x3CD798B2, 0xDFD0173C, 0x41D0BDF0, - 0xC6F32655, 0x58F38C99, 0xBBF40317, 0x25F4A9DB, - 0x3CFD6CD1, 0xA2FDC61D, 0x41FA4993, 0xDFFAE35F, - 0x73E8C386, 0xEDE8694A, 0x0EEFE6C4, 0x90EF4C08, - 0x89E68902, 0x17E623CE, 0xF4E1AC40, 0x6AE1068C, - 0xBBA0EBD0, 0x25A0411C, 0xC6A7CE92, 0x58A7645E, - 0x41AEA154, 0xDFAE0B98, 0x3CA98416, 0xA2A92EDA, - 0x0EBB0E03, 0x90BBA4CF, 0x73BC2B41, 0xEDBC818D, - 0xF4B54487, 0x6AB5EE4B, 0x89B261C5, 0x17B2CB09, - 0x909150AC, 0x0E91FA60, 0xED9675EE, 0x7396DF22, - 0x6A9F1A28, 0xF49FB0E4, 0x17983F6A, 0x899895A6, - 0x258AB57F, 0xBB8A1FB3, 0x588D903D, 0xC68D3AF1, - 0xDF84FFFB, 0x41845537, 0xA283DAB9, 0x3C837075, - 0xDA853B53, 0x4485919F, 0xA7821E11, 0x3982B4DD, - 0x208B71D7, 0xBE8BDB1B, 0x5D8C5495, 0xC38CFE59, - 0x6F9EDE80, 0xF19E744C, 0x1299FBC2, 0x8C99510E, - 0x95909404, 0x0B903EC8, 0xE897B146, 0x76971B8A, - 0xF1B4802F, 0x6FB42AE3, 0x8CB3A56D, 0x12B30FA1, - 0x0BBACAAB, 0x95BA6067, 0x76BDEFE9, 0xE8BD4525, - 0x44AF65FC, 0xDAAFCF30, 0x39A840BE, 0xA7A8EA72, - 0xBEA12F78, 0x20A185B4, 0xC3A60A3A, 0x5DA6A0F6, - 0x8CE74DAA, 0x12E7E766, 0xF1E068E8, 0x6FE0C224, - 0x76E9072E, 0xE8E9ADE2, 0x0BEE226C, 0x95EE88A0, - 0x39FCA879, 0xA7FC02B5, 0x44FB8D3B, 0xDAFB27F7, - 0xC3F2E2FD, 0x5DF24831, 0xBEF5C7BF, 0x20F56D73, - 0xA7D6F6D6, 0x39D65C1A, 0xDAD1D394, 0x44D17958, - 0x5DD8BC52, 0xC3D8169E, 0x20DF9910, 0xBEDF33DC, - 0x12CD1305, 0x8CCDB9C9, 0x6FCA3647, 0xF1CA9C8B, - 0xE8C35981, 0x76C3F34D, 0x95C47CC3, 0x0BC4D60F, - 0x3747A67A, 0xA9470CB6, 0x4A408338, 0xD44029F4, - 0xCD49ECFE, 0x53494632, 0xB04EC9BC, 0x2E4E6370, - 0x825C43A9, 0x1C5CE965, 0xFF5B66EB, 0x615BCC27, - 0x7852092D, 0xE652A3E1, 0x05552C6F, 0x9B5586A3, - 0x1C761D06, 0x8276B7CA, 0x61713844, 0xFF719288, - 0xE6785782, 0x7878FD4E, 0x9B7F72C0, 0x057FD80C, - 0xA96DF8D5, 0x376D5219, 0xD46ADD97, 0x4A6A775B, - 0x5363B251, 0xCD63189D, 0x2E649713, 0xB0643DDF, - 0x6125D083, 0xFF257A4F, 0x1C22F5C1, 0x82225F0D, - 0x9B2B9A07, 0x052B30CB, 0xE62CBF45, 0x782C1589, - 0xD43E3550, 0x4A3E9F9C, 0xA9391012, 0x3739BADE, - 0x2E307FD4, 0xB030D518, 0x53375A96, 0xCD37F05A, - 0x4A146BFF, 0xD414C133, 0x37134EBD, 0xA913E471, - 0xB01A217B, 0x2E1A8BB7, 0xCD1D0439, 0x531DAEF5, - 0xFF0F8E2C, 0x610F24E0, 0x8208AB6E, 0x1C0801A2, - 0x0501C4A8, 0x9B016E64, 0x7806E1EA, 0xE6064B26 - } -}; diff --git a/software/src/xz/src/liblzma/check/crc32_table_le.h b/software/src/xz/src/liblzma/check/crc32_table_le.h deleted file mode 100644 index e89c21a..0000000 --- a/software/src/xz/src/liblzma/check/crc32_table_le.h +++ /dev/null @@ -1,527 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by crc32_tablegen.c. - -const uint32_t lzma_crc32_table[8][256] = { - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }, { - 0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3, - 0x646CC504, 0x7D77F445, 0x565AA786, 0x4F4196C7, - 0xC8D98A08, 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB, - 0xACB54F0C, 0xB5AE7E4D, 0x9E832D8E, 0x87981CCF, - 0x4AC21251, 0x53D92310, 0x78F470D3, 0x61EF4192, - 0x2EAED755, 0x37B5E614, 0x1C98B5D7, 0x05838496, - 0x821B9859, 0x9B00A918, 0xB02DFADB, 0xA936CB9A, - 0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E, - 0x958424A2, 0x8C9F15E3, 0xA7B24620, 0xBEA97761, - 0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265, - 0x5D5DAEAA, 0x44469FEB, 0x6F6BCC28, 0x7670FD69, - 0x39316BAE, 0x202A5AEF, 0x0B07092C, 0x121C386D, - 0xDF4636F3, 0xC65D07B2, 0xED705471, 0xF46B6530, - 0xBB2AF3F7, 0xA231C2B6, 0x891C9175, 0x9007A034, - 0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38, - 0x73F379FF, 0x6AE848BE, 0x41C51B7D, 0x58DE2A3C, - 0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6, - 0x94158A01, 0x8D0EBB40, 0xA623E883, 0xBF38D9C2, - 0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE, - 0x5CCC0009, 0x45D73148, 0x6EFA628B, 0x77E153CA, - 0xBABB5D54, 0xA3A06C15, 0x888D3FD6, 0x91960E97, - 0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93, - 0x7262D75C, 0x6B79E61D, 0x4054B5DE, 0x594F849F, - 0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B, - 0x65FD6BA7, 0x7CE65AE6, 0x57CB0925, 0x4ED03864, - 0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60, - 0xAD24E1AF, 0xB43FD0EE, 0x9F12832D, 0x8609B26C, - 0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768, - 0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35, - 0x4B53BCF2, 0x52488DB3, 0x7965DE70, 0x607EEF31, - 0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D, - 0x838A36FA, 0x9A9107BB, 0xB1BC5478, 0xA8A76539, - 0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88, - 0x5FEF5D4F, 0x46F46C0E, 0x6DD93FCD, 0x74C20E8C, - 0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180, - 0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484, - 0x71418A1A, 0x685ABB5B, 0x4377E898, 0x5A6CD9D9, - 0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD, - 0xB9980012, 0xA0833153, 0x8BAE6290, 0x92B553D1, - 0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5, - 0xAE07BCE9, 0xB71C8DA8, 0x9C31DE6B, 0x852AEF2A, - 0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E, - 0x66DE36E1, 0x7FC507A0, 0x54E85463, 0x4DF36522, - 0x02B2F3E5, 0x1BA9C2A4, 0x30849167, 0x299FA026, - 0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B, - 0x80A96BBC, 0x99B25AFD, 0xB29F093E, 0xAB84387F, - 0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773, - 0x4870E1B4, 0x516BD0F5, 0x7A468336, 0x635DB277, - 0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D, - 0xAF96124A, 0xB68D230B, 0x9DA070C8, 0x84BB4189, - 0x03235D46, 0x1A386C07, 0x31153FC4, 0x280E0E85, - 0x674F9842, 0x7E54A903, 0x5579FAC0, 0x4C62CB81, - 0x8138C51F, 0x9823F45E, 0xB30EA79D, 0xAA1596DC, - 0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8, - 0x49E14F17, 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4, - 0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0, - 0x5E7EF3EC, 0x4765C2AD, 0x6C48916E, 0x7553A02F, - 0x3A1236E8, 0x230907A9, 0x0824546A, 0x113F652B, - 0x96A779E4, 0x8FBC48A5, 0xA4911B66, 0xBD8A2A27, - 0xF2CBBCE0, 0xEBD08DA1, 0xC0FDDE62, 0xD9E6EF23, - 0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, 0x3F91B27E, - 0x70D024B9, 0x69CB15F8, 0x42E6463B, 0x5BFD777A, - 0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876, - 0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72 - }, { - 0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59, - 0x0709A8DC, 0x06CBC2EB, 0x048D7CB2, 0x054F1685, - 0x0E1351B8, 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1, - 0x091AF964, 0x08D89353, 0x0A9E2D0A, 0x0B5C473D, - 0x1C26A370, 0x1DE4C947, 0x1FA2771E, 0x1E601D29, - 0x1B2F0BAC, 0x1AED619B, 0x18ABDFC2, 0x1969B5F5, - 0x1235F2C8, 0x13F798FF, 0x11B126A6, 0x10734C91, - 0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D, - 0x384D46E0, 0x398F2CD7, 0x3BC9928E, 0x3A0BF8B9, - 0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065, - 0x365E1758, 0x379C7D6F, 0x35DAC336, 0x3418A901, - 0x3157BF84, 0x3095D5B3, 0x32D36BEA, 0x331101DD, - 0x246BE590, 0x25A98FA7, 0x27EF31FE, 0x262D5BC9, - 0x23624D4C, 0x22A0277B, 0x20E69922, 0x2124F315, - 0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71, - 0x2D711CF4, 0x2CB376C3, 0x2EF5C89A, 0x2F37A2AD, - 0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399, - 0x7793251C, 0x76514F2B, 0x7417F172, 0x75D59B45, - 0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221, - 0x798074A4, 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD, - 0x6CBC2EB0, 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9, - 0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835, - 0x62AF7F08, 0x636D153F, 0x612BAB66, 0x60E9C151, - 0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D, - 0x48D7CB20, 0x4915A117, 0x4B531F4E, 0x4A917579, - 0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5, - 0x46C49A98, 0x4706F0AF, 0x45404EF6, 0x448224C1, - 0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D, - 0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609, - 0x53F8C08C, 0x523AAABB, 0x507C14E2, 0x51BE7ED5, - 0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1, - 0x5DEB9134, 0x5C29FB03, 0x5E6F455A, 0x5FAD2F6D, - 0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9, - 0xE63CB35C, 0xE7FED96B, 0xE5B86732, 0xE47A0D05, - 0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461, - 0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD, - 0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E, 0xFF5506A9, - 0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75, - 0xF300E948, 0xF2C2837F, 0xF0843D26, 0xF1465711, - 0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD, - 0xD9785D60, 0xD8BA3757, 0xDAFC890E, 0xDB3EE339, - 0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5, - 0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, 0xD52DB281, - 0xD062A404, 0xD1A0CE33, 0xD3E6706A, 0xD2241A5D, - 0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049, - 0xC25756CC, 0xC3953CFB, 0xC1D382A2, 0xC011E895, - 0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1, - 0xCC440774, 0xCD866D43, 0xCFC0D31A, 0xCE02B92D, - 0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819, - 0x96A63E9C, 0x976454AB, 0x9522EAF2, 0x94E080C5, - 0x9FBCC7F8, 0x9E7EADCF, 0x9C381396, 0x9DFA79A1, - 0x98B56F24, 0x99770513, 0x9B31BB4A, 0x9AF3D17D, - 0x8D893530, 0x8C4B5F07, 0x8E0DE15E, 0x8FCF8B69, - 0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5, - 0x839A6488, 0x82580EBF, 0x801EB0E6, 0x81DCDAD1, - 0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D, - 0xA9E2D0A0, 0xA820BA97, 0xAA6604CE, 0xABA46EF9, - 0xAEEB787C, 0xAF29124B, 0xAD6FAC12, 0xACADC625, - 0xA7F18118, 0xA633EB2F, 0xA4755576, 0xA5B73F41, - 0xA0F829C4, 0xA13A43F3, 0xA37CFDAA, 0xA2BE979D, - 0xB5C473D0, 0xB40619E7, 0xB640A7BE, 0xB782CD89, - 0xB2CDDB0C, 0xB30FB13B, 0xB1490F62, 0xB08B6555, - 0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31, - 0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED - }, { - 0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE, - 0x8F629757, 0x37DEF032, 0x256B5FDC, 0x9DD738B9, - 0xC5B428EF, 0x7D084F8A, 0x6FBDE064, 0xD7018701, - 0x4AD6BFB8, 0xF26AD8DD, 0xE0DF7733, 0x58631056, - 0x5019579F, 0xE8A530FA, 0xFA109F14, 0x42ACF871, - 0xDF7BC0C8, 0x67C7A7AD, 0x75720843, 0xCDCE6F26, - 0x95AD7F70, 0x2D111815, 0x3FA4B7FB, 0x8718D09E, - 0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9, - 0xA032AF3E, 0x188EC85B, 0x0A3B67B5, 0xB28700D0, - 0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787, - 0x658687D1, 0xDD3AE0B4, 0xCF8F4F5A, 0x7733283F, - 0xEAE41086, 0x525877E3, 0x40EDD80D, 0xF851BF68, - 0xF02BF8A1, 0x48979FC4, 0x5A22302A, 0xE29E574F, - 0x7F496FF6, 0xC7F50893, 0xD540A77D, 0x6DFCC018, - 0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0, - 0xBAFD4719, 0x0241207C, 0x10F48F92, 0xA848E8F7, - 0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3, - 0x1476CF6A, 0xACCAA80F, 0xBE7F07E1, 0x06C36084, - 0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C, - 0xD1C2E785, 0x697E80E0, 0x7BCB2F0E, 0xC377486B, - 0xCB0D0FA2, 0x73B168C7, 0x6104C729, 0xD9B8A04C, - 0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B, - 0x0EB9274D, 0xB6054028, 0xA4B0EFC6, 0x1C0C88A3, - 0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4, - 0x3B26F703, 0x839A9066, 0x912F3F88, 0x299358ED, - 0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA, - 0xFE92DFEC, 0x462EB889, 0x549B1767, 0xEC277002, - 0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755, - 0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72, - 0xE45D37CB, 0x5CE150AE, 0x4E54FF40, 0xF6E89825, - 0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D, - 0x21E91F24, 0x99557841, 0x8BE0D7AF, 0x335CB0CA, - 0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5, - 0x623B216C, 0xDA874609, 0xC832E9E7, 0x708E8E82, - 0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A, - 0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D, - 0xBD40E1A4, 0x05FC86C1, 0x1749292F, 0xAFF54E4A, - 0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D, - 0x78F4C94B, 0xC048AE2E, 0xD2FD01C0, 0x6A4166A5, - 0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2, - 0x4D6B1905, 0xF5D77E60, 0xE762D18E, 0x5FDEB6EB, - 0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC, - 0x88DF31EA, 0x3063568F, 0x22D6F961, 0x9A6A9E04, - 0x07BDA6BD, 0xBF01C1D8, 0xADB46E36, 0x15080953, - 0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174, - 0x9210D9CD, 0x2AACBEA8, 0x38191146, 0x80A57623, - 0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B, - 0x57A4F122, 0xEF189647, 0xFDAD39A9, 0x45115ECC, - 0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8, - 0xF92F7951, 0x41931E34, 0x5326B1DA, 0xEB9AD6BF, - 0xB3F9C6E9, 0x0B45A18C, 0x19F00E62, 0xA14C6907, - 0x3C9B51BE, 0x842736DB, 0x96929935, 0x2E2EFE50, - 0x2654B999, 0x9EE8DEFC, 0x8C5D7112, 0x34E11677, - 0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120, - 0xE3E09176, 0x5B5CF613, 0x49E959FD, 0xF1553E98, - 0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF, - 0xD67F4138, 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6, - 0x591DD66F, 0xE1A1B10A, 0xF3141EE4, 0x4BA87981, - 0x13CB69D7, 0xAB770EB2, 0xB9C2A15C, 0x017EC639, - 0x9CA9FE80, 0x241599E5, 0x36A0360B, 0x8E1C516E, - 0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, 0x94D3B949, - 0x090481F0, 0xB1B8E695, 0xA30D497B, 0x1BB12E1E, - 0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6, - 0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1 - }, { - 0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0, - 0xF580A6C0, 0xC8E08F70, 0x8F40F5A0, 0xB220DC10, - 0x30704BC1, 0x0D106271, 0x4AB018A1, 0x77D03111, - 0xC5F0ED01, 0xF890C4B1, 0xBF30BE61, 0x825097D1, - 0x60E09782, 0x5D80BE32, 0x1A20C4E2, 0x2740ED52, - 0x95603142, 0xA80018F2, 0xEFA06222, 0xD2C04B92, - 0x5090DC43, 0x6DF0F5F3, 0x2A508F23, 0x1730A693, - 0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053, - 0xC1C12F04, 0xFCA106B4, 0xBB017C64, 0x866155D4, - 0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314, - 0xF1B164C5, 0xCCD14D75, 0x8B7137A5, 0xB6111E15, - 0x0431C205, 0x3951EBB5, 0x7EF19165, 0x4391B8D5, - 0xA121B886, 0x9C419136, 0xDBE1EBE6, 0xE681C256, - 0x54A11E46, 0x69C137F6, 0x2E614D26, 0x13016496, - 0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997, - 0x64D15587, 0x59B17C37, 0x1E1106E7, 0x23712F57, - 0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299, - 0xAD73FE89, 0x9013D739, 0xD7B3ADE9, 0xEAD38459, - 0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958, - 0x9D03B548, 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98, - 0x3813CFCB, 0x0573E67B, 0x42D39CAB, 0x7FB3B51B, - 0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB, - 0x0863840A, 0x3503ADBA, 0x72A3D76A, 0x4FC3FEDA, - 0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A, - 0x9932774D, 0xA4525EFD, 0xE3F2242D, 0xDE920D9D, - 0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D, - 0xA9423C8C, 0x9422153C, 0xD3826FEC, 0xEEE2465C, - 0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C, - 0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F, - 0x0C52460F, 0x31326FBF, 0x7692156F, 0x4BF23CDF, - 0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE, - 0x3C220DCE, 0x0142247E, 0x46E25EAE, 0x7B82771E, - 0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42, - 0x44661652, 0x79063FE2, 0x3EA64532, 0x03C66C82, - 0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183, - 0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743, - 0xD1062710, 0xEC660EA0, 0xABC67470, 0x96A65DC0, - 0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00, - 0xE1766CD1, 0xDC164561, 0x9BB63FB1, 0xA6D61601, - 0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1, - 0x70279F96, 0x4D47B626, 0x0AE7CCF6, 0x3787E546, - 0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386, - 0x4057D457, 0x7D37FDE7, 0x3A978737, 0x07F7AE87, - 0xB5D77297, 0x88B75B27, 0xCF1721F7, 0xF2770847, - 0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4, - 0xE547AED4, 0xD8278764, 0x9F87FDB4, 0xA2E7D404, - 0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905, - 0xD537E515, 0xE857CCA5, 0xAFF7B675, 0x92979FC5, - 0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B, - 0x1C954E1B, 0x21F567AB, 0x66551D7B, 0x5B3534CB, - 0xD965A31A, 0xE4058AAA, 0xA3A5F07A, 0x9EC5D9CA, - 0x2CE505DA, 0x11852C6A, 0x562556BA, 0x6B457F0A, - 0x89F57F59, 0xB49556E9, 0xF3352C39, 0xCE550589, - 0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349, - 0xB9853498, 0x84E51D28, 0xC34567F8, 0xFE254E48, - 0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888, - 0x28D4C7DF, 0x15B4EE6F, 0x521494BF, 0x6F74BD0F, - 0xDD54611F, 0xE03448AF, 0xA794327F, 0x9AF41BCF, - 0x18A48C1E, 0x25C4A5AE, 0x6264DF7E, 0x5F04F6CE, - 0xED242ADE, 0xD044036E, 0x97E479BE, 0xAA84500E, - 0x4834505D, 0x755479ED, 0x32F4033D, 0x0F942A8D, - 0xBDB4F69D, 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D, - 0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C, - 0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C - }, { - 0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE, - 0x9B914216, 0x50CD91B3, 0xD659E31D, 0x1D0530B8, - 0xEC53826D, 0x270F51C8, 0xA19B2366, 0x6AC7F0C3, - 0x77C2C07B, 0xBC9E13DE, 0x3A0A6170, 0xF156B2D5, - 0x03D6029B, 0xC88AD13E, 0x4E1EA390, 0x85427035, - 0x9847408D, 0x531B9328, 0xD58FE186, 0x1ED33223, - 0xEF8580F6, 0x24D95353, 0xA24D21FD, 0x6911F258, - 0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E, - 0x07AC0536, 0xCCF0D693, 0x4A64A43D, 0x81387798, - 0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E, - 0xEBFF875B, 0x20A354FE, 0xA6372650, 0x6D6BF5F5, - 0x706EC54D, 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3, - 0x047A07AD, 0xCF26D408, 0x49B2A6A6, 0x82EE7503, - 0x9FEB45BB, 0x54B7961E, 0xD223E4B0, 0x197F3715, - 0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E, - 0x73B8C7D6, 0xB8E41473, 0x3E7066DD, 0xF52CB578, - 0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2, - 0x94C9487A, 0x5F959BDF, 0xD901E971, 0x125D3AD4, - 0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF, - 0x789ACA17, 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9, - 0x0C8E08F7, 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59, - 0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F, - 0xE0DD8A9A, 0x2B81593F, 0xAD152B91, 0x6649F834, - 0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22, - 0x08F40F5A, 0xC3A8DCFF, 0x453CAE51, 0x8E607DF4, - 0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2, - 0xE4A78D37, 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99, - 0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F, - 0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F, - 0x90B34FD7, 0x5BEF9C72, 0xDD7BEEDC, 0x16273D79, - 0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02, - 0x7CE0CDBA, 0xB7BC1E1F, 0x31286CB1, 0xFA74BF14, - 0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676, - 0x852156CE, 0x4E7D856B, 0xC8E9F7C5, 0x03B52460, - 0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B, - 0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D, - 0x1D661643, 0xD63AC5E6, 0x50AEB748, 0x9BF264ED, - 0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB, - 0xF135942E, 0x3A69478B, 0xBCFD3525, 0x77A1E680, - 0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496, - 0x191C11EE, 0xD240C24B, 0x54D4B0E5, 0x9F886340, - 0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156, - 0xF54F9383, 0x3E134026, 0xB8873288, 0x73DBE12D, - 0x6EDED195, 0xA5820230, 0x2316709E, 0xE84AA33B, - 0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB, - 0x815B5163, 0x4A0782C6, 0xCC93F068, 0x07CF23CD, - 0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6, - 0x6D08D30E, 0xA65400AB, 0x20C07205, 0xEB9CA1A0, - 0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A, - 0x8A795CA2, 0x41258F07, 0xC7B1FDA9, 0x0CED2E0C, - 0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2, 0x7B2FEE77, - 0x662ADECF, 0xAD760D6A, 0x2BE27FC4, 0xE0BEAC61, - 0x123E1C2F, 0xD962CF8A, 0x5FF6BD24, 0x94AA6E81, - 0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97, - 0xFE6D9E42, 0x35314DE7, 0xB3A53F49, 0x78F9ECEC, - 0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA, - 0x16441B82, 0xDD18C827, 0x5B8CBA89, 0x90D0692C, - 0x8DD55994, 0x46898A31, 0xC01DF89F, 0x0B412B3A, - 0xFA1799EF, 0x314B4A4A, 0xB7DF38E4, 0x7C83EB41, - 0x6186DBF9, 0xAADA085C, 0x2C4E7AF2, 0xE712A957, - 0x15921919, 0xDECECABC, 0x585AB812, 0x93066BB7, - 0x8E035B0F, 0x455F88AA, 0xC3CBFA04, 0x089729A1, - 0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA, - 0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC - }, { - 0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D, - 0xF44F2413, 0x52382FA7, 0x63D0353A, 0xC5A73E8E, - 0x33EF4E67, 0x959845D3, 0xA4705F4E, 0x020754FA, - 0xC7A06A74, 0x61D761C0, 0x503F7B5D, 0xF64870E9, - 0x67DE9CCE, 0xC1A9977A, 0xF0418DE7, 0x56368653, - 0x9391B8DD, 0x35E6B369, 0x040EA9F4, 0xA279A240, - 0x5431D2A9, 0xF246D91D, 0xC3AEC380, 0x65D9C834, - 0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27, - 0xCFBD399C, 0x69CA3228, 0x582228B5, 0xFE552301, - 0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712, - 0xFC5277FB, 0x5A257C4F, 0x6BCD66D2, 0xCDBA6D66, - 0x081D53E8, 0xAE6A585C, 0x9F8242C1, 0x39F54975, - 0xA863A552, 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF, - 0x5C2C8141, 0xFA5B8AF5, 0xCBB39068, 0x6DC49BDC, - 0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8, - 0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F, 0x5E2BD5BB, - 0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4, - 0xB044516A, 0x16335ADE, 0x27DB4043, 0x81AC4BF7, - 0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183, - 0x83AB1F0D, 0x25DC14B9, 0x14340E24, 0xB2430590, - 0x23D5E9B7, 0x85A2E203, 0xB44AF89E, 0x123DF32A, - 0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739, - 0x103AA7D0, 0xB64DAC64, 0x87A5B6F9, 0x21D2BD4D, - 0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E, - 0x8BB64CE5, 0x2DC14751, 0x1C295DCC, 0xBA5E5678, - 0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B, - 0xB8590282, 0x1E2E0936, 0x2FC613AB, 0x89B1181F, - 0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C, - 0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6, - 0x1827F438, 0xBE50FF8C, 0x8FB8E511, 0x29CFEEA5, - 0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1, - 0x2BC8BA5F, 0x8DBFB1EB, 0xBC57AB76, 0x1A20A0C2, - 0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F, - 0x7C59CEE1, 0xDA2EC555, 0xEBC6DFC8, 0x4DB1D47C, - 0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08, - 0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B, - 0xEFC8763C, 0x49BF7D88, 0x78576715, 0xDE206CA1, - 0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2, - 0xDC27385B, 0x7A5033EF, 0x4BB82972, 0xEDCF22C6, - 0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5, - 0x47ABD36E, 0xE1DCD8DA, 0xD034C247, 0x7643C9F3, - 0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0, - 0x74449D09, 0xD23396BD, 0xE3DB8C20, 0x45AC8794, - 0x800BB91A, 0x267CB2AE, 0x1794A833, 0xB1E3A387, - 0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D, - 0xD43A6BB3, 0x724D6007, 0x43A57A9A, 0xE5D2712E, - 0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A, - 0xE7D525D4, 0x41A22E60, 0x704A34FD, 0xD63D3F49, - 0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516, - 0x3852BB98, 0x9E25B02C, 0xAFCDAAB1, 0x09BAA105, - 0xFFF2D1EC, 0x5985DA58, 0x686DC0C5, 0xCE1ACB71, - 0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, 0x3A55EF62, - 0xABC30345, 0x0DB408F1, 0x3C5C126C, 0x9A2B19D8, - 0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB, - 0x982C4D22, 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF, - 0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC, - 0x03A0A617, 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A, - 0xF7EF8204, 0x519889B0, 0x6070932D, 0xC6079899, - 0x304FE870, 0x9638E3C4, 0xA7D0F959, 0x01A7F2ED, - 0xC400CC63, 0x6277C7D7, 0x539FDD4A, 0xF5E8D6FE, - 0x647E3AD9, 0xC209316D, 0xF3E12BF0, 0x55962044, - 0x90311ECA, 0x3646157E, 0x07AE0FE3, 0xA1D90457, - 0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23, - 0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30 - }, { - 0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3, - 0x844A0EFA, 0x48E00E64, 0xC66F0987, 0x0AC50919, - 0xD3E51BB5, 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56, - 0x57AF154F, 0x9B0515D1, 0x158A1232, 0xD92012AC, - 0x7CBB312B, 0xB01131B5, 0x3E9E3656, 0xF23436C8, - 0xF8F13FD1, 0x345B3F4F, 0xBAD438AC, 0x767E3832, - 0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, 0x21D12D7D, - 0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387, - 0xF9766256, 0x35DC62C8, 0xBB53652B, 0x77F965B5, - 0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F, - 0x2A9379E3, 0xE639797D, 0x68B67E9E, 0xA41C7E00, - 0xAED97719, 0x62737787, 0xECFC7064, 0x205670FA, - 0x85CD537D, 0x496753E3, 0xC7E85400, 0x0B42549E, - 0x01875D87, 0xCD2D5D19, 0x43A25AFA, 0x8F085A64, - 0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B, - 0xD2624632, 0x1EC846AC, 0x9047414F, 0x5CED41D1, - 0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E, - 0xADD7CC17, 0x617DCC89, 0xEFF2CB6A, 0x2358CBF4, - 0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB, - 0x7E32D7A2, 0xB298D73C, 0x3C17D0DF, 0xF0BDD041, - 0x5526F3C6, 0x998CF358, 0x1703F4BB, 0xDBA9F425, - 0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF, - 0x86C3E873, 0x4A69E8ED, 0xC4E6EF0E, 0x084CEF90, - 0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A, - 0xD0EBA0BB, 0x1C41A025, 0x92CEA7C6, 0x5E64A758, - 0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2, - 0x030EBB0E, 0xCFA4BB90, 0x412BBC73, 0x8D81BCED, - 0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217, - 0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673, - 0x281A9F6A, 0xE4B09FF4, 0x6A3F9817, 0xA6959889, - 0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6, - 0xFBFF84DF, 0x37558441, 0xB9DA83A2, 0x7570833C, - 0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239, - 0xD7718B20, 0x1BDB8BBE, 0x95548C5D, 0x59FE8CC3, - 0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C, - 0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776, - 0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C, 0xA10FB312, - 0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8, - 0xFC65AF44, 0x30CFAFDA, 0xBE40A839, 0x72EAA8A7, - 0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D, - 0xAA4DE78C, 0x66E7E712, 0xE868E0F1, 0x24C2E06F, - 0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95, - 0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, 0xF727FBDA, - 0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE, 0x736DF520, - 0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144, - 0x52BCD85D, 0x9E16D8C3, 0x1099DF20, 0xDC33DFBE, - 0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1, - 0x8159C3E8, 0x4DF3C376, 0xC37CC495, 0x0FD6C40B, - 0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4, - 0xFEEC49CD, 0x32464953, 0xBCC94EB0, 0x70634E2E, - 0xA9435C82, 0x65E95C1C, 0xEB665BFF, 0x27CC5B61, - 0x2D095278, 0xE1A352E6, 0x6F2C5505, 0xA386559B, - 0x061D761C, 0xCAB77682, 0x44387161, 0x889271FF, - 0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05, - 0xD5F86DA9, 0x19526D37, 0x97DD6AD4, 0x5B776A4A, - 0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0, - 0x83D02561, 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282, - 0x079A2B9B, 0xCB302B05, 0x45BF2CE6, 0x89152C78, - 0x50353ED4, 0x9C9F3E4A, 0x121039A9, 0xDEBA3937, - 0xD47F302E, 0x18D530B0, 0x965A3753, 0x5AF037CD, - 0xFF6B144A, 0x33C114D4, 0xBD4E1337, 0x71E413A9, - 0x7B211AB0, 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53, - 0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C, - 0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6 - } -}; diff --git a/software/src/xz/src/liblzma/check/crc32_tablegen.c b/software/src/xz/src/liblzma/check/crc32_tablegen.c deleted file mode 100644 index b8cf459..0000000 --- a/software/src/xz/src/liblzma/check/crc32_tablegen.c +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32_tablegen.c -/// \brief Generate crc32_table_le.h and crc32_table_be.h -/// -/// Compiling: gcc -std=c99 -o crc32_tablegen crc32_tablegen.c -/// Add -DWORDS_BIGENDIAN to generate big endian table. -/// Add -DLZ_HASH_TABLE to generate lz_encoder_hash_table.h (little endian). -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include -#include "../../common/tuklib_integer.h" - - -static uint32_t crc32_table[8][256]; - - -static void -init_crc32_table(void) -{ - static const uint32_t poly32 = UINT32_C(0xEDB88320); - - for (size_t s = 0; s < 8; ++s) { - for (size_t b = 0; b < 256; ++b) { - uint32_t r = s == 0 ? b : crc32_table[s - 1][b]; - - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly32; - else - r >>= 1; - } - - crc32_table[s][b] = r; - } - } - -#ifdef WORDS_BIGENDIAN - for (size_t s = 0; s < 8; ++s) - for (size_t b = 0; b < 256; ++b) - crc32_table[s][b] = byteswap32(crc32_table[s][b]); -#endif - - return; -} - - -static void -print_crc32_table(void) -{ - // Split the SPDX string so that it won't accidentally match - // when tools search for the string. - printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" - "// This file has been generated by crc32_tablegen.c.\n\n" - "const uint32_t lzma_crc32_table[8][256] = {\n\t{"); - - for (size_t s = 0; s < 8; ++s) { - for (size_t b = 0; b < 256; ++b) { - if ((b % 4) == 0) - printf("\n\t\t"); - - printf("0x%08" PRIX32, crc32_table[s][b]); - - if (b != 255) - printf(",%s", (b+1) % 4 == 0 ? "" : " "); - } - - if (s == 7) - printf("\n\t}\n};\n"); - else - printf("\n\t}, {"); - } - - return; -} - - -static void -print_lz_table(void) -{ - // Split the SPDX string so that it won't accidentally match - // when tools search for the string. - printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" - "// This file has been generated by crc32_tablegen.c.\n\n" - "const uint32_t lzma_lz_hash_table[256] = {"); - - for (size_t b = 0; b < 256; ++b) { - if ((b % 4) == 0) - printf("\n\t"); - - printf("0x%08" PRIX32, crc32_table[0][b]); - - if (b != 255) - printf(",%s", (b+1) % 4 == 0 ? "" : " "); - } - - printf("\n};\n"); - - return; -} - - -int -main(void) -{ - init_crc32_table(); - -#ifdef LZ_HASH_TABLE - print_lz_table(); -#else - print_crc32_table(); -#endif - - return 0; -} diff --git a/software/src/xz/src/liblzma/check/crc32_x86.S b/software/src/xz/src/liblzma/check/crc32_x86.S deleted file mode 100644 index 37ee063..0000000 --- a/software/src/xz/src/liblzma/check/crc32_x86.S +++ /dev/null @@ -1,308 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/* - * Speed-optimized CRC32 using slicing-by-eight algorithm - * - * This uses only i386 instructions, but it is optimized for i686 and later - * (including e.g. Pentium II/III/IV, Athlon XP, and Core 2). For i586 - * (e.g. Pentium), slicing-by-four would be better, and even the C version - * of slicing-by-eight built with gcc -march=i586 tends to be a little bit - * better than this. Very few probably run this code on i586 or older x86 - * so this shouldn't be a problem in practice. - * - * Authors: Igor Pavlov (original version) - * Lasse Collin (AT&T syntax, PIC support, better portability) - * - * This code needs lzma_crc32_table, which can be created using the - * following C code: - -uint32_t lzma_crc32_table[8][256]; - -void -init_table(void) -{ - // IEEE-802.3 - static const uint32_t poly32 = UINT32_C(0xEDB88320); - - // Castagnoli - // static const uint32_t poly32 = UINT32_C(0x82F63B78); - - // Koopman - // static const uint32_t poly32 = UINT32_C(0xEB31D82E); - - for (size_t s = 0; s < 8; ++s) { - for (size_t b = 0; b < 256; ++b) { - uint32_t r = s == 0 ? b : lzma_crc32_table[s - 1][b]; - - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly32; - else - r >>= 1; - } - - lzma_crc32_table[s][b] = r; - } - } -} - - * The prototype of the CRC32 function: - * extern uint32_t lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc); - */ - -/* When Intel CET is enabled, include in assembly code to mark - Intel CET support. */ -#ifdef __CET__ -# include -#else -# define _CET_ENDBR -#endif - -/* - * On some systems, the functions need to be prefixed. The prefix is - * usually an underscore. - */ -#ifndef __USER_LABEL_PREFIX__ -# define __USER_LABEL_PREFIX__ -#endif -#define MAKE_SYM_CAT(prefix, sym) prefix ## sym -#define MAKE_SYM(prefix, sym) MAKE_SYM_CAT(prefix, sym) -#define LZMA_CRC32 MAKE_SYM(__USER_LABEL_PREFIX__, lzma_crc32_generic) -#define LZMA_CRC32_TABLE MAKE_SYM(__USER_LABEL_PREFIX__, lzma_crc32_table) - -/* - * Solaris assembler doesn't have .p2align, and Darwin uses .align - * differently than GNU/Linux and Solaris. - */ -#if defined(__APPLE__) || defined(__MSDOS__) -# define ALIGN(pow2, abs) .align pow2 -#else -# define ALIGN(pow2, abs) .align abs -#endif - - .text - .globl LZMA_CRC32 -#ifdef __ELF__ - .hidden LZMA_CRC32 -#endif - -#if !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) \ - && !defined(__MSDOS__) - .type LZMA_CRC32, @function -#endif - - ALIGN(4, 16) -LZMA_CRC32: - _CET_ENDBR - /* - * Register usage: - * %eax crc - * %esi buf - * %edi size or buf + size - * %ebx lzma_crc32_table - * %ebp Table index - * %ecx Temporary - * %edx Temporary - */ - pushl %ebx - pushl %esi - pushl %edi - pushl %ebp - movl 0x14(%esp), %esi /* buf */ - movl 0x18(%esp), %edi /* size */ - movl 0x1C(%esp), %eax /* crc */ - - /* - * Store the address of lzma_crc32_table to %ebx. This is needed to - * get position-independent code (PIC). - * - * The PIC macro is defined by libtool, while __PIC__ is defined - * by GCC but only on some systems. Testing for both makes it simpler - * to test this code without libtool, and keeps the code working also - * when built with libtool but using something else than GCC. - * - * I understood that libtool may define PIC on Windows even though - * the code in Windows DLLs is not PIC in sense that it is in ELF - * binaries, so we need a separate check to always use the non-PIC - * code on Windows. - */ -#if (!defined(PIC) && !defined(__PIC__)) \ - || (defined(_WIN32) || defined(__CYGWIN__)) - /* Not PIC */ - movl $ LZMA_CRC32_TABLE, %ebx -#elif defined(__APPLE__) - /* Mach-O */ - call .L_get_pc -.L_pic: - leal .L_lzma_crc32_table$non_lazy_ptr-.L_pic(%ebx), %ebx - movl (%ebx), %ebx -#else - /* ELF */ - call .L_get_pc - addl $_GLOBAL_OFFSET_TABLE_, %ebx - movl LZMA_CRC32_TABLE@GOT(%ebx), %ebx -#endif - - /* Complement the initial value. */ - notl %eax - - ALIGN(4, 16) -.L_align: - /* - * Check if there is enough input to use slicing-by-eight. - * We need 16 bytes, because the loop pre-reads eight bytes. - */ - cmpl $16, %edi - jb .L_rest - - /* Check if we have reached alignment of eight bytes. */ - testl $7, %esi - jz .L_slice - - /* Calculate CRC of the next input byte. */ - movzbl (%esi), %ebp - incl %esi - movzbl %al, %ecx - xorl %ecx, %ebp - shrl $8, %eax - xorl (%ebx, %ebp, 4), %eax - decl %edi - jmp .L_align - - ALIGN(2, 4) -.L_slice: - /* - * If we get here, there's at least 16 bytes of aligned input - * available. Make %edi multiple of eight bytes. Store the possible - * remainder over the "size" variable in the argument stack. - */ - movl %edi, 0x18(%esp) - andl $-8, %edi - subl %edi, 0x18(%esp) - - /* - * Let %edi be buf + size - 8 while running the main loop. This way - * we can compare for equality to determine when exit the loop. - */ - addl %esi, %edi - subl $8, %edi - - /* Read in the first eight aligned bytes. */ - xorl (%esi), %eax - movl 4(%esi), %ecx - movzbl %cl, %ebp - -.L_loop: - movl 0x0C00(%ebx, %ebp, 4), %edx - movzbl %ch, %ebp - xorl 0x0800(%ebx, %ebp, 4), %edx - shrl $16, %ecx - xorl 8(%esi), %edx - movzbl %cl, %ebp - xorl 0x0400(%ebx, %ebp, 4), %edx - movzbl %ch, %ebp - xorl (%ebx, %ebp, 4), %edx - movzbl %al, %ebp - - /* - * Read the next four bytes, for which the CRC is calculated - * on the next iteration of the loop. - */ - movl 12(%esi), %ecx - - xorl 0x1C00(%ebx, %ebp, 4), %edx - movzbl %ah, %ebp - shrl $16, %eax - xorl 0x1800(%ebx, %ebp, 4), %edx - movzbl %ah, %ebp - movzbl %al, %eax - movl 0x1400(%ebx, %eax, 4), %eax - addl $8, %esi - xorl %edx, %eax - xorl 0x1000(%ebx, %ebp, 4), %eax - - /* Check for end of aligned input. */ - cmpl %edi, %esi - movzbl %cl, %ebp - jne .L_loop - - /* - * Process the remaining eight bytes, which we have already - * copied to %ecx and %edx. - */ - movl 0x0C00(%ebx, %ebp, 4), %edx - movzbl %ch, %ebp - xorl 0x0800(%ebx, %ebp, 4), %edx - shrl $16, %ecx - movzbl %cl, %ebp - xorl 0x0400(%ebx, %ebp, 4), %edx - movzbl %ch, %ebp - xorl (%ebx, %ebp, 4), %edx - movzbl %al, %ebp - - xorl 0x1C00(%ebx, %ebp, 4), %edx - movzbl %ah, %ebp - shrl $16, %eax - xorl 0x1800(%ebx, %ebp, 4), %edx - movzbl %ah, %ebp - movzbl %al, %eax - movl 0x1400(%ebx, %eax, 4), %eax - addl $8, %esi - xorl %edx, %eax - xorl 0x1000(%ebx, %ebp, 4), %eax - - /* Copy the number of remaining bytes to %edi. */ - movl 0x18(%esp), %edi - -.L_rest: - /* Check for end of input. */ - testl %edi, %edi - jz .L_return - - /* Calculate CRC of the next input byte. */ - movzbl (%esi), %ebp - incl %esi - movzbl %al, %ecx - xorl %ecx, %ebp - shrl $8, %eax - xorl (%ebx, %ebp, 4), %eax - decl %edi - jmp .L_rest - -.L_return: - /* Complement the final value. */ - notl %eax - - popl %ebp - popl %edi - popl %esi - popl %ebx - ret - -#if defined(PIC) || defined(__PIC__) - ALIGN(4, 16) -.L_get_pc: - movl (%esp), %ebx - ret -#endif - -#if defined(__APPLE__) && (defined(PIC) || defined(__PIC__)) - /* Mach-O PIC */ - .section __IMPORT,__pointers,non_lazy_symbol_pointers -.L_lzma_crc32_table$non_lazy_ptr: - .indirect_symbol LZMA_CRC32_TABLE - .long 0 - -#elif !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSDOS__) - /* ELF */ - .size LZMA_CRC32, .-LZMA_CRC32 -#endif - -/* - * This is needed to support non-executable stack. It's ugly to - * use __FreeBSD__ and __linux__ here, but I don't know a way to detect when - * we are using GNU assembler. - */ -#if defined(__ELF__) && (defined(__FreeBSD__) || defined(__linux__)) - .section .note.GNU-stack,"",@progbits -#endif diff --git a/software/src/xz/src/liblzma/check/crc64_fast.c b/software/src/xz/src/liblzma/check/crc64_fast.c deleted file mode 100644 index 8a6770a..0000000 --- a/software/src/xz/src/liblzma/check/crc64_fast.c +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc64.c -/// \brief CRC64 calculation -// -// Authors: Lasse Collin -// Ilya Kurdyukov -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" -#include "crc_common.h" - -#if defined(CRC_X86_CLMUL) -# define BUILDING_CRC_CLMUL 64 -# include "crc_x86_clmul.h" -#endif - - -#ifdef CRC64_GENERIC - -///////////////////////////////// -// Generic slice-by-four CRC64 // -///////////////////////////////// - -#if defined(WORDS_BIGENDIAN) -# include "crc64_table_be.h" -#else -# include "crc64_table_le.h" -#endif - - -#ifdef HAVE_CRC_X86_ASM -extern uint64_t lzma_crc64_generic( - const uint8_t *buf, size_t size, uint64_t crc); -#else - -#ifdef WORDS_BIGENDIAN -# define A1(x) ((x) >> 56) -#else -# define A1 A -#endif - - -// See the comments in crc32_fast.c. They aren't duplicated here. -static uint64_t -lzma_crc64_generic(const uint8_t *buf, size_t size, uint64_t crc) -{ - crc = ~crc; - -#ifdef WORDS_BIGENDIAN - crc = byteswap64(crc); -#endif - - if (size > 4) { - while ((uintptr_t)(buf) & 3) { - crc = lzma_crc64_table[0][*buf++ ^ A1(crc)] ^ S8(crc); - --size; - } - - const uint8_t *const limit = buf + (size & ~(size_t)(3)); - size &= (size_t)(3); - - while (buf < limit) { -#ifdef WORDS_BIGENDIAN - const uint32_t tmp = (uint32_t)(crc >> 32) - ^ aligned_read32ne(buf); -#else - const uint32_t tmp = (uint32_t)crc - ^ aligned_read32ne(buf); -#endif - buf += 4; - - crc = lzma_crc64_table[3][A(tmp)] - ^ lzma_crc64_table[2][B(tmp)] - ^ S32(crc) - ^ lzma_crc64_table[1][C(tmp)] - ^ lzma_crc64_table[0][D(tmp)]; - } - } - - while (size-- != 0) - crc = lzma_crc64_table[0][*buf++ ^ A1(crc)] ^ S8(crc); - -#ifdef WORDS_BIGENDIAN - crc = byteswap64(crc); -#endif - - return ~crc; -} -#endif // HAVE_CRC_X86_ASM -#endif // CRC64_GENERIC - - -#if defined(CRC64_GENERIC) && defined(CRC64_ARCH_OPTIMIZED) - -////////////////////////// -// Function dispatching // -////////////////////////// - -// If both the generic and arch-optimized implementations are usable, then -// the function that is used is selected at runtime. See crc32_fast.c. - -typedef uint64_t (*crc64_func_type)( - const uint8_t *buf, size_t size, uint64_t crc); - -static crc64_func_type -crc64_resolve(void) -{ - return is_arch_extension_supported() - ? &crc64_arch_optimized : &lzma_crc64_generic; -} - -#ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -# define CRC64_SET_FUNC_ATTR __attribute__((__constructor__)) -static crc64_func_type crc64_func; -#else -# define CRC64_SET_FUNC_ATTR -static uint64_t crc64_dispatch(const uint8_t *buf, size_t size, uint64_t crc); -static crc64_func_type crc64_func = &crc64_dispatch; -#endif - - -CRC64_SET_FUNC_ATTR -static void -crc64_set_func(void) -{ - crc64_func = crc64_resolve(); - return; -} - - -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -static uint64_t -crc64_dispatch(const uint8_t *buf, size_t size, uint64_t crc) -{ - crc64_set_func(); - return crc64_func(buf, size, crc); -} -#endif -#endif - - -extern LZMA_API(uint64_t) -lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc) -{ -#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__clang__) \ - && defined(_M_IX86) && defined(CRC64_ARCH_OPTIMIZED) - // VS2015-2022 might corrupt the ebx register on 32-bit x86 when - // the CLMUL code is enabled. This hack forces MSVC to store and - // restore ebx. This is only needed here, not in lzma_crc32(). - __asm mov ebx, ebx -#endif - -#if defined(CRC64_GENERIC) && defined(CRC64_ARCH_OPTIMIZED) - return crc64_func(buf, size, crc); - -#elif defined(CRC64_ARCH_OPTIMIZED) - // If arch-optimized version is used unconditionally without runtime - // CPU detection then omitting the generic version and its 8 KiB - // lookup table makes the library smaller. - return crc64_arch_optimized(buf, size, crc); - -#else - return lzma_crc64_generic(buf, size, crc); -#endif -} diff --git a/software/src/xz/src/liblzma/check/crc64_small.c b/software/src/xz/src/liblzma/check/crc64_small.c deleted file mode 100644 index ee4ea26..0000000 --- a/software/src/xz/src/liblzma/check/crc64_small.c +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc64_small.c -/// \brief CRC64 calculation (size-optimized) -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" - - -static uint64_t crc64_table[256]; - - -#ifdef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR -__attribute__((__constructor__)) -#endif -static void -crc64_init(void) -{ - static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); - - for (size_t b = 0; b < 256; ++b) { - uint64_t r = b; - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly64; - else - r >>= 1; - } - - crc64_table[b] = r; - } - - return; -} - - -extern LZMA_API(uint64_t) -lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc) -{ -#ifndef HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR - mythread_once(crc64_init); -#endif - - crc = ~crc; - - while (size != 0) { - crc = crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); - --size; - } - - return ~crc; -} diff --git a/software/src/xz/src/liblzma/check/crc64_table_be.h b/software/src/xz/src/liblzma/check/crc64_table_be.h deleted file mode 100644 index db76cc7..0000000 --- a/software/src/xz/src/liblzma/check/crc64_table_be.h +++ /dev/null @@ -1,523 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by crc64_tablegen.c. - -const uint64_t lzma_crc64_table[4][256] = { - { - UINT64_C(0x0000000000000000), UINT64_C(0x6F5FA703BE4C2EB3), - UINT64_C(0x5BA040A8573684F4), UINT64_C(0x34FFE7ABE97AAA47), - UINT64_C(0x335E8FFF84C3D07B), UINT64_C(0x5C0128FC3A8FFEC8), - UINT64_C(0x68FECF57D3F5548F), UINT64_C(0x07A168546DB97A3C), - UINT64_C(0x66BC1EFF0987A1F7), UINT64_C(0x09E3B9FCB7CB8F44), - UINT64_C(0x3D1C5E575EB12503), UINT64_C(0x5243F954E0FD0BB0), - UINT64_C(0x55E291008D44718C), UINT64_C(0x3ABD360333085F3F), - UINT64_C(0x0E42D1A8DA72F578), UINT64_C(0x611D76AB643EDBCB), - UINT64_C(0x4966335138A19B7D), UINT64_C(0x2639945286EDB5CE), - UINT64_C(0x12C673F96F971F89), UINT64_C(0x7D99D4FAD1DB313A), - UINT64_C(0x7A38BCAEBC624B06), UINT64_C(0x15671BAD022E65B5), - UINT64_C(0x2198FC06EB54CFF2), UINT64_C(0x4EC75B055518E141), - UINT64_C(0x2FDA2DAE31263A8A), UINT64_C(0x40858AAD8F6A1439), - UINT64_C(0x747A6D066610BE7E), UINT64_C(0x1B25CA05D85C90CD), - UINT64_C(0x1C84A251B5E5EAF1), UINT64_C(0x73DB05520BA9C442), - UINT64_C(0x4724E2F9E2D36E05), UINT64_C(0x287B45FA5C9F40B6), - UINT64_C(0x92CC66A2704237FB), UINT64_C(0xFD93C1A1CE0E1948), - UINT64_C(0xC96C260A2774B30F), UINT64_C(0xA633810999389DBC), - UINT64_C(0xA192E95DF481E780), UINT64_C(0xCECD4E5E4ACDC933), - UINT64_C(0xFA32A9F5A3B76374), UINT64_C(0x956D0EF61DFB4DC7), - UINT64_C(0xF470785D79C5960C), UINT64_C(0x9B2FDF5EC789B8BF), - UINT64_C(0xAFD038F52EF312F8), UINT64_C(0xC08F9FF690BF3C4B), - UINT64_C(0xC72EF7A2FD064677), UINT64_C(0xA87150A1434A68C4), - UINT64_C(0x9C8EB70AAA30C283), UINT64_C(0xF3D11009147CEC30), - UINT64_C(0xDBAA55F348E3AC86), UINT64_C(0xB4F5F2F0F6AF8235), - UINT64_C(0x800A155B1FD52872), UINT64_C(0xEF55B258A19906C1), - UINT64_C(0xE8F4DA0CCC207CFD), UINT64_C(0x87AB7D0F726C524E), - UINT64_C(0xB3549AA49B16F809), UINT64_C(0xDC0B3DA7255AD6BA), - UINT64_C(0xBD164B0C41640D71), UINT64_C(0xD249EC0FFF2823C2), - UINT64_C(0xE6B60BA416528985), UINT64_C(0x89E9ACA7A81EA736), - UINT64_C(0x8E48C4F3C5A7DD0A), UINT64_C(0xE11763F07BEBF3B9), - UINT64_C(0xD5E8845B929159FE), UINT64_C(0xBAB723582CDD774D), - UINT64_C(0xA187C3EBCA2BB664), UINT64_C(0xCED864E8746798D7), - UINT64_C(0xFA2783439D1D3290), UINT64_C(0x9578244023511C23), - UINT64_C(0x92D94C144EE8661F), UINT64_C(0xFD86EB17F0A448AC), - UINT64_C(0xC9790CBC19DEE2EB), UINT64_C(0xA626ABBFA792CC58), - UINT64_C(0xC73BDD14C3AC1793), UINT64_C(0xA8647A177DE03920), - UINT64_C(0x9C9B9DBC949A9367), UINT64_C(0xF3C43ABF2AD6BDD4), - UINT64_C(0xF46552EB476FC7E8), UINT64_C(0x9B3AF5E8F923E95B), - UINT64_C(0xAFC512431059431C), UINT64_C(0xC09AB540AE156DAF), - UINT64_C(0xE8E1F0BAF28A2D19), UINT64_C(0x87BE57B94CC603AA), - UINT64_C(0xB341B012A5BCA9ED), UINT64_C(0xDC1E17111BF0875E), - UINT64_C(0xDBBF7F457649FD62), UINT64_C(0xB4E0D846C805D3D1), - UINT64_C(0x801F3FED217F7996), UINT64_C(0xEF4098EE9F335725), - UINT64_C(0x8E5DEE45FB0D8CEE), UINT64_C(0xE10249464541A25D), - UINT64_C(0xD5FDAEEDAC3B081A), UINT64_C(0xBAA209EE127726A9), - UINT64_C(0xBD0361BA7FCE5C95), UINT64_C(0xD25CC6B9C1827226), - UINT64_C(0xE6A3211228F8D861), UINT64_C(0x89FC861196B4F6D2), - UINT64_C(0x334BA549BA69819F), UINT64_C(0x5C14024A0425AF2C), - UINT64_C(0x68EBE5E1ED5F056B), UINT64_C(0x07B442E253132BD8), - UINT64_C(0x00152AB63EAA51E4), UINT64_C(0x6F4A8DB580E67F57), - UINT64_C(0x5BB56A1E699CD510), UINT64_C(0x34EACD1DD7D0FBA3), - UINT64_C(0x55F7BBB6B3EE2068), UINT64_C(0x3AA81CB50DA20EDB), - UINT64_C(0x0E57FB1EE4D8A49C), UINT64_C(0x61085C1D5A948A2F), - UINT64_C(0x66A93449372DF013), UINT64_C(0x09F6934A8961DEA0), - UINT64_C(0x3D0974E1601B74E7), UINT64_C(0x5256D3E2DE575A54), - UINT64_C(0x7A2D961882C81AE2), UINT64_C(0x1572311B3C843451), - UINT64_C(0x218DD6B0D5FE9E16), UINT64_C(0x4ED271B36BB2B0A5), - UINT64_C(0x497319E7060BCA99), UINT64_C(0x262CBEE4B847E42A), - UINT64_C(0x12D3594F513D4E6D), UINT64_C(0x7D8CFE4CEF7160DE), - UINT64_C(0x1C9188E78B4FBB15), UINT64_C(0x73CE2FE4350395A6), - UINT64_C(0x4731C84FDC793FE1), UINT64_C(0x286E6F4C62351152), - UINT64_C(0x2FCF07180F8C6B6E), UINT64_C(0x4090A01BB1C045DD), - UINT64_C(0x746F47B058BAEF9A), UINT64_C(0x1B30E0B3E6F6C129), - UINT64_C(0x420F87D795576CC9), UINT64_C(0x2D5020D42B1B427A), - UINT64_C(0x19AFC77FC261E83D), UINT64_C(0x76F0607C7C2DC68E), - UINT64_C(0x715108281194BCB2), UINT64_C(0x1E0EAF2BAFD89201), - UINT64_C(0x2AF1488046A23846), UINT64_C(0x45AEEF83F8EE16F5), - UINT64_C(0x24B399289CD0CD3E), UINT64_C(0x4BEC3E2B229CE38D), - UINT64_C(0x7F13D980CBE649CA), UINT64_C(0x104C7E8375AA6779), - UINT64_C(0x17ED16D718131D45), UINT64_C(0x78B2B1D4A65F33F6), - UINT64_C(0x4C4D567F4F2599B1), UINT64_C(0x2312F17CF169B702), - UINT64_C(0x0B69B486ADF6F7B4), UINT64_C(0x6436138513BAD907), - UINT64_C(0x50C9F42EFAC07340), UINT64_C(0x3F96532D448C5DF3), - UINT64_C(0x38373B79293527CF), UINT64_C(0x57689C7A9779097C), - UINT64_C(0x63977BD17E03A33B), UINT64_C(0x0CC8DCD2C04F8D88), - UINT64_C(0x6DD5AA79A4715643), UINT64_C(0x028A0D7A1A3D78F0), - UINT64_C(0x3675EAD1F347D2B7), UINT64_C(0x592A4DD24D0BFC04), - UINT64_C(0x5E8B258620B28638), UINT64_C(0x31D482859EFEA88B), - UINT64_C(0x052B652E778402CC), UINT64_C(0x6A74C22DC9C82C7F), - UINT64_C(0xD0C3E175E5155B32), UINT64_C(0xBF9C46765B597581), - UINT64_C(0x8B63A1DDB223DFC6), UINT64_C(0xE43C06DE0C6FF175), - UINT64_C(0xE39D6E8A61D68B49), UINT64_C(0x8CC2C989DF9AA5FA), - UINT64_C(0xB83D2E2236E00FBD), UINT64_C(0xD762892188AC210E), - UINT64_C(0xB67FFF8AEC92FAC5), UINT64_C(0xD920588952DED476), - UINT64_C(0xEDDFBF22BBA47E31), UINT64_C(0x8280182105E85082), - UINT64_C(0x8521707568512ABE), UINT64_C(0xEA7ED776D61D040D), - UINT64_C(0xDE8130DD3F67AE4A), UINT64_C(0xB1DE97DE812B80F9), - UINT64_C(0x99A5D224DDB4C04F), UINT64_C(0xF6FA752763F8EEFC), - UINT64_C(0xC205928C8A8244BB), UINT64_C(0xAD5A358F34CE6A08), - UINT64_C(0xAAFB5DDB59771034), UINT64_C(0xC5A4FAD8E73B3E87), - UINT64_C(0xF15B1D730E4194C0), UINT64_C(0x9E04BA70B00DBA73), - UINT64_C(0xFF19CCDBD43361B8), UINT64_C(0x90466BD86A7F4F0B), - UINT64_C(0xA4B98C738305E54C), UINT64_C(0xCBE62B703D49CBFF), - UINT64_C(0xCC47432450F0B1C3), UINT64_C(0xA318E427EEBC9F70), - UINT64_C(0x97E7038C07C63537), UINT64_C(0xF8B8A48FB98A1B84), - UINT64_C(0xE388443C5F7CDAAD), UINT64_C(0x8CD7E33FE130F41E), - UINT64_C(0xB8280494084A5E59), UINT64_C(0xD777A397B60670EA), - UINT64_C(0xD0D6CBC3DBBF0AD6), UINT64_C(0xBF896CC065F32465), - UINT64_C(0x8B768B6B8C898E22), UINT64_C(0xE4292C6832C5A091), - UINT64_C(0x85345AC356FB7B5A), UINT64_C(0xEA6BFDC0E8B755E9), - UINT64_C(0xDE941A6B01CDFFAE), UINT64_C(0xB1CBBD68BF81D11D), - UINT64_C(0xB66AD53CD238AB21), UINT64_C(0xD935723F6C748592), - UINT64_C(0xEDCA9594850E2FD5), UINT64_C(0x829532973B420166), - UINT64_C(0xAAEE776D67DD41D0), UINT64_C(0xC5B1D06ED9916F63), - UINT64_C(0xF14E37C530EBC524), UINT64_C(0x9E1190C68EA7EB97), - UINT64_C(0x99B0F892E31E91AB), UINT64_C(0xF6EF5F915D52BF18), - UINT64_C(0xC210B83AB428155F), UINT64_C(0xAD4F1F390A643BEC), - UINT64_C(0xCC5269926E5AE027), UINT64_C(0xA30DCE91D016CE94), - UINT64_C(0x97F2293A396C64D3), UINT64_C(0xF8AD8E3987204A60), - UINT64_C(0xFF0CE66DEA99305C), UINT64_C(0x9053416E54D51EEF), - UINT64_C(0xA4ACA6C5BDAFB4A8), UINT64_C(0xCBF301C603E39A1B), - UINT64_C(0x7144229E2F3EED56), UINT64_C(0x1E1B859D9172C3E5), - UINT64_C(0x2AE46236780869A2), UINT64_C(0x45BBC535C6444711), - UINT64_C(0x421AAD61ABFD3D2D), UINT64_C(0x2D450A6215B1139E), - UINT64_C(0x19BAEDC9FCCBB9D9), UINT64_C(0x76E54ACA4287976A), - UINT64_C(0x17F83C6126B94CA1), UINT64_C(0x78A79B6298F56212), - UINT64_C(0x4C587CC9718FC855), UINT64_C(0x2307DBCACFC3E6E6), - UINT64_C(0x24A6B39EA27A9CDA), UINT64_C(0x4BF9149D1C36B269), - UINT64_C(0x7F06F336F54C182E), UINT64_C(0x105954354B00369D), - UINT64_C(0x382211CF179F762B), UINT64_C(0x577DB6CCA9D35898), - UINT64_C(0x6382516740A9F2DF), UINT64_C(0x0CDDF664FEE5DC6C), - UINT64_C(0x0B7C9E30935CA650), UINT64_C(0x642339332D1088E3), - UINT64_C(0x50DCDE98C46A22A4), UINT64_C(0x3F83799B7A260C17), - UINT64_C(0x5E9E0F301E18D7DC), UINT64_C(0x31C1A833A054F96F), - UINT64_C(0x053E4F98492E5328), UINT64_C(0x6A61E89BF7627D9B), - UINT64_C(0x6DC080CF9ADB07A7), UINT64_C(0x029F27CC24972914), - UINT64_C(0x3660C067CDED8353), UINT64_C(0x593F676473A1ADE0) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0x0DF1D05C9279E954), - UINT64_C(0x1AE2A1B924F3D2A9), UINT64_C(0x171371E5B68A3BFD), - UINT64_C(0xB1DA4DDC62497DC1), UINT64_C(0xBC2B9D80F0309495), - UINT64_C(0xAB38EC6546BAAF68), UINT64_C(0xA6C93C39D4C3463C), - UINT64_C(0xE7AB9517EE3D2210), UINT64_C(0xEA5A454B7C44CB44), - UINT64_C(0xFD4934AECACEF0B9), UINT64_C(0xF0B8E4F258B719ED), - UINT64_C(0x5671D8CB8C745FD1), UINT64_C(0x5B8008971E0DB685), - UINT64_C(0x4C937972A8878D78), UINT64_C(0x4162A92E3AFE642C), - UINT64_C(0xCE572B2FDC7B4420), UINT64_C(0xC3A6FB734E02AD74), - UINT64_C(0xD4B58A96F8889689), UINT64_C(0xD9445ACA6AF17FDD), - UINT64_C(0x7F8D66F3BE3239E1), UINT64_C(0x727CB6AF2C4BD0B5), - UINT64_C(0x656FC74A9AC1EB48), UINT64_C(0x689E171608B8021C), - UINT64_C(0x29FCBE3832466630), UINT64_C(0x240D6E64A03F8F64), - UINT64_C(0x331E1F8116B5B499), UINT64_C(0x3EEFCFDD84CC5DCD), - UINT64_C(0x9826F3E4500F1BF1), UINT64_C(0x95D723B8C276F2A5), - UINT64_C(0x82C4525D74FCC958), UINT64_C(0x8F358201E685200C), - UINT64_C(0x9CAF565EB8F78840), UINT64_C(0x915E86022A8E6114), - UINT64_C(0x864DF7E79C045AE9), UINT64_C(0x8BBC27BB0E7DB3BD), - UINT64_C(0x2D751B82DABEF581), UINT64_C(0x2084CBDE48C71CD5), - UINT64_C(0x3797BA3BFE4D2728), UINT64_C(0x3A666A676C34CE7C), - UINT64_C(0x7B04C34956CAAA50), UINT64_C(0x76F51315C4B34304), - UINT64_C(0x61E662F0723978F9), UINT64_C(0x6C17B2ACE04091AD), - UINT64_C(0xCADE8E953483D791), UINT64_C(0xC72F5EC9A6FA3EC5), - UINT64_C(0xD03C2F2C10700538), UINT64_C(0xDDCDFF708209EC6C), - UINT64_C(0x52F87D71648CCC60), UINT64_C(0x5F09AD2DF6F52534), - UINT64_C(0x481ADCC8407F1EC9), UINT64_C(0x45EB0C94D206F79D), - UINT64_C(0xE32230AD06C5B1A1), UINT64_C(0xEED3E0F194BC58F5), - UINT64_C(0xF9C0911422366308), UINT64_C(0xF4314148B04F8A5C), - UINT64_C(0xB553E8668AB1EE70), UINT64_C(0xB8A2383A18C80724), - UINT64_C(0xAFB149DFAE423CD9), UINT64_C(0xA24099833C3BD58D), - UINT64_C(0x0489A5BAE8F893B1), UINT64_C(0x097875E67A817AE5), - UINT64_C(0x1E6B0403CC0B4118), UINT64_C(0x139AD45F5E72A84C), - UINT64_C(0x385FADBC70EF1181), UINT64_C(0x35AE7DE0E296F8D5), - UINT64_C(0x22BD0C05541CC328), UINT64_C(0x2F4CDC59C6652A7C), - UINT64_C(0x8985E06012A66C40), UINT64_C(0x8474303C80DF8514), - UINT64_C(0x936741D93655BEE9), UINT64_C(0x9E969185A42C57BD), - UINT64_C(0xDFF438AB9ED23391), UINT64_C(0xD205E8F70CABDAC5), - UINT64_C(0xC5169912BA21E138), UINT64_C(0xC8E7494E2858086C), - UINT64_C(0x6E2E7577FC9B4E50), UINT64_C(0x63DFA52B6EE2A704), - UINT64_C(0x74CCD4CED8689CF9), UINT64_C(0x793D04924A1175AD), - UINT64_C(0xF6088693AC9455A1), UINT64_C(0xFBF956CF3EEDBCF5), - UINT64_C(0xECEA272A88678708), UINT64_C(0xE11BF7761A1E6E5C), - UINT64_C(0x47D2CB4FCEDD2860), UINT64_C(0x4A231B135CA4C134), - UINT64_C(0x5D306AF6EA2EFAC9), UINT64_C(0x50C1BAAA7857139D), - UINT64_C(0x11A3138442A977B1), UINT64_C(0x1C52C3D8D0D09EE5), - UINT64_C(0x0B41B23D665AA518), UINT64_C(0x06B06261F4234C4C), - UINT64_C(0xA0795E5820E00A70), UINT64_C(0xAD888E04B299E324), - UINT64_C(0xBA9BFFE10413D8D9), UINT64_C(0xB76A2FBD966A318D), - UINT64_C(0xA4F0FBE2C81899C1), UINT64_C(0xA9012BBE5A617095), - UINT64_C(0xBE125A5BECEB4B68), UINT64_C(0xB3E38A077E92A23C), - UINT64_C(0x152AB63EAA51E400), UINT64_C(0x18DB666238280D54), - UINT64_C(0x0FC817878EA236A9), UINT64_C(0x0239C7DB1CDBDFFD), - UINT64_C(0x435B6EF52625BBD1), UINT64_C(0x4EAABEA9B45C5285), - UINT64_C(0x59B9CF4C02D66978), UINT64_C(0x54481F1090AF802C), - UINT64_C(0xF2812329446CC610), UINT64_C(0xFF70F375D6152F44), - UINT64_C(0xE8638290609F14B9), UINT64_C(0xE59252CCF2E6FDED), - UINT64_C(0x6AA7D0CD1463DDE1), UINT64_C(0x67560091861A34B5), - UINT64_C(0x7045717430900F48), UINT64_C(0x7DB4A128A2E9E61C), - UINT64_C(0xDB7D9D11762AA020), UINT64_C(0xD68C4D4DE4534974), - UINT64_C(0xC19F3CA852D97289), UINT64_C(0xCC6EECF4C0A09BDD), - UINT64_C(0x8D0C45DAFA5EFFF1), UINT64_C(0x80FD9586682716A5), - UINT64_C(0x97EEE463DEAD2D58), UINT64_C(0x9A1F343F4CD4C40C), - UINT64_C(0x3CD6080698178230), UINT64_C(0x3127D85A0A6E6B64), - UINT64_C(0x2634A9BFBCE45099), UINT64_C(0x2BC579E32E9DB9CD), - UINT64_C(0xF5A054D6CA71FB90), UINT64_C(0xF851848A580812C4), - UINT64_C(0xEF42F56FEE822939), UINT64_C(0xE2B325337CFBC06D), - UINT64_C(0x447A190AA8388651), UINT64_C(0x498BC9563A416F05), - UINT64_C(0x5E98B8B38CCB54F8), UINT64_C(0x536968EF1EB2BDAC), - UINT64_C(0x120BC1C1244CD980), UINT64_C(0x1FFA119DB63530D4), - UINT64_C(0x08E9607800BF0B29), UINT64_C(0x0518B02492C6E27D), - UINT64_C(0xA3D18C1D4605A441), UINT64_C(0xAE205C41D47C4D15), - UINT64_C(0xB9332DA462F676E8), UINT64_C(0xB4C2FDF8F08F9FBC), - UINT64_C(0x3BF77FF9160ABFB0), UINT64_C(0x3606AFA5847356E4), - UINT64_C(0x2115DE4032F96D19), UINT64_C(0x2CE40E1CA080844D), - UINT64_C(0x8A2D32257443C271), UINT64_C(0x87DCE279E63A2B25), - UINT64_C(0x90CF939C50B010D8), UINT64_C(0x9D3E43C0C2C9F98C), - UINT64_C(0xDC5CEAEEF8379DA0), UINT64_C(0xD1AD3AB26A4E74F4), - UINT64_C(0xC6BE4B57DCC44F09), UINT64_C(0xCB4F9B0B4EBDA65D), - UINT64_C(0x6D86A7329A7EE061), UINT64_C(0x6077776E08070935), - UINT64_C(0x7764068BBE8D32C8), UINT64_C(0x7A95D6D72CF4DB9C), - UINT64_C(0x690F0288728673D0), UINT64_C(0x64FED2D4E0FF9A84), - UINT64_C(0x73EDA3315675A179), UINT64_C(0x7E1C736DC40C482D), - UINT64_C(0xD8D54F5410CF0E11), UINT64_C(0xD5249F0882B6E745), - UINT64_C(0xC237EEED343CDCB8), UINT64_C(0xCFC63EB1A64535EC), - UINT64_C(0x8EA4979F9CBB51C0), UINT64_C(0x835547C30EC2B894), - UINT64_C(0x94463626B8488369), UINT64_C(0x99B7E67A2A316A3D), - UINT64_C(0x3F7EDA43FEF22C01), UINT64_C(0x328F0A1F6C8BC555), - UINT64_C(0x259C7BFADA01FEA8), UINT64_C(0x286DABA6487817FC), - UINT64_C(0xA75829A7AEFD37F0), UINT64_C(0xAAA9F9FB3C84DEA4), - UINT64_C(0xBDBA881E8A0EE559), UINT64_C(0xB04B584218770C0D), - UINT64_C(0x1682647BCCB44A31), UINT64_C(0x1B73B4275ECDA365), - UINT64_C(0x0C60C5C2E8479898), UINT64_C(0x0191159E7A3E71CC), - UINT64_C(0x40F3BCB040C015E0), UINT64_C(0x4D026CECD2B9FCB4), - UINT64_C(0x5A111D096433C749), UINT64_C(0x57E0CD55F64A2E1D), - UINT64_C(0xF129F16C22896821), UINT64_C(0xFCD82130B0F08175), - UINT64_C(0xEBCB50D5067ABA88), UINT64_C(0xE63A8089940353DC), - UINT64_C(0xCDFFF96ABA9EEA11), UINT64_C(0xC00E293628E70345), - UINT64_C(0xD71D58D39E6D38B8), UINT64_C(0xDAEC888F0C14D1EC), - UINT64_C(0x7C25B4B6D8D797D0), UINT64_C(0x71D464EA4AAE7E84), - UINT64_C(0x66C7150FFC244579), UINT64_C(0x6B36C5536E5DAC2D), - UINT64_C(0x2A546C7D54A3C801), UINT64_C(0x27A5BC21C6DA2155), - UINT64_C(0x30B6CDC470501AA8), UINT64_C(0x3D471D98E229F3FC), - UINT64_C(0x9B8E21A136EAB5C0), UINT64_C(0x967FF1FDA4935C94), - UINT64_C(0x816C801812196769), UINT64_C(0x8C9D504480608E3D), - UINT64_C(0x03A8D24566E5AE31), UINT64_C(0x0E590219F49C4765), - UINT64_C(0x194A73FC42167C98), UINT64_C(0x14BBA3A0D06F95CC), - UINT64_C(0xB2729F9904ACD3F0), UINT64_C(0xBF834FC596D53AA4), - UINT64_C(0xA8903E20205F0159), UINT64_C(0xA561EE7CB226E80D), - UINT64_C(0xE403475288D88C21), UINT64_C(0xE9F2970E1AA16575), - UINT64_C(0xFEE1E6EBAC2B5E88), UINT64_C(0xF31036B73E52B7DC), - UINT64_C(0x55D90A8EEA91F1E0), UINT64_C(0x5828DAD278E818B4), - UINT64_C(0x4F3BAB37CE622349), UINT64_C(0x42CA7B6B5C1BCA1D), - UINT64_C(0x5150AF3402696251), UINT64_C(0x5CA17F6890108B05), - UINT64_C(0x4BB20E8D269AB0F8), UINT64_C(0x4643DED1B4E359AC), - UINT64_C(0xE08AE2E860201F90), UINT64_C(0xED7B32B4F259F6C4), - UINT64_C(0xFA68435144D3CD39), UINT64_C(0xF799930DD6AA246D), - UINT64_C(0xB6FB3A23EC544041), UINT64_C(0xBB0AEA7F7E2DA915), - UINT64_C(0xAC199B9AC8A792E8), UINT64_C(0xA1E84BC65ADE7BBC), - UINT64_C(0x072177FF8E1D3D80), UINT64_C(0x0AD0A7A31C64D4D4), - UINT64_C(0x1DC3D646AAEEEF29), UINT64_C(0x1032061A3897067D), - UINT64_C(0x9F07841BDE122671), UINT64_C(0x92F654474C6BCF25), - UINT64_C(0x85E525A2FAE1F4D8), UINT64_C(0x8814F5FE68981D8C), - UINT64_C(0x2EDDC9C7BC5B5BB0), UINT64_C(0x232C199B2E22B2E4), - UINT64_C(0x343F687E98A88919), UINT64_C(0x39CEB8220AD1604D), - UINT64_C(0x78AC110C302F0461), UINT64_C(0x755DC150A256ED35), - UINT64_C(0x624EB0B514DCD6C8), UINT64_C(0x6FBF60E986A53F9C), - UINT64_C(0xC9765CD0526679A0), UINT64_C(0xC4878C8CC01F90F4), - UINT64_C(0xD394FD697695AB09), UINT64_C(0xDE652D35E4EC425D) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0xCB6D6A914AE10B3F), - UINT64_C(0x96DBD42295C2177E), UINT64_C(0x5DB6BEB3DF231C41), - UINT64_C(0x2CB7A9452A852FFC), UINT64_C(0xE7DAC3D4606424C3), - UINT64_C(0xBA6C7D67BF473882), UINT64_C(0x710117F6F5A633BD), - UINT64_C(0xDD705D247FA5876A), UINT64_C(0x161D37B535448C55), - UINT64_C(0x4BAB8906EA679014), UINT64_C(0x80C6E397A0869B2B), - UINT64_C(0xF1C7F4615520A896), UINT64_C(0x3AAA9EF01FC1A3A9), - UINT64_C(0x671C2043C0E2BFE8), UINT64_C(0xAC714AD28A03B4D7), - UINT64_C(0xBAE1BA48FE4A0FD5), UINT64_C(0x718CD0D9B4AB04EA), - UINT64_C(0x2C3A6E6A6B8818AB), UINT64_C(0xE75704FB21691394), - UINT64_C(0x9656130DD4CF2029), UINT64_C(0x5D3B799C9E2E2B16), - UINT64_C(0x008DC72F410D3757), UINT64_C(0xCBE0ADBE0BEC3C68), - UINT64_C(0x6791E76C81EF88BF), UINT64_C(0xACFC8DFDCB0E8380), - UINT64_C(0xF14A334E142D9FC1), UINT64_C(0x3A2759DF5ECC94FE), - UINT64_C(0x4B264E29AB6AA743), UINT64_C(0x804B24B8E18BAC7C), - UINT64_C(0xDDFD9A0B3EA8B03D), UINT64_C(0x1690F09A7449BB02), - UINT64_C(0xF1DD7B3ED73AC638), UINT64_C(0x3AB011AF9DDBCD07), - UINT64_C(0x6706AF1C42F8D146), UINT64_C(0xAC6BC58D0819DA79), - UINT64_C(0xDD6AD27BFDBFE9C4), UINT64_C(0x1607B8EAB75EE2FB), - UINT64_C(0x4BB10659687DFEBA), UINT64_C(0x80DC6CC8229CF585), - UINT64_C(0x2CAD261AA89F4152), UINT64_C(0xE7C04C8BE27E4A6D), - UINT64_C(0xBA76F2383D5D562C), UINT64_C(0x711B98A977BC5D13), - UINT64_C(0x001A8F5F821A6EAE), UINT64_C(0xCB77E5CEC8FB6591), - UINT64_C(0x96C15B7D17D879D0), UINT64_C(0x5DAC31EC5D3972EF), - UINT64_C(0x4B3CC1762970C9ED), UINT64_C(0x8051ABE76391C2D2), - UINT64_C(0xDDE71554BCB2DE93), UINT64_C(0x168A7FC5F653D5AC), - UINT64_C(0x678B683303F5E611), UINT64_C(0xACE602A24914ED2E), - UINT64_C(0xF150BC119637F16F), UINT64_C(0x3A3DD680DCD6FA50), - UINT64_C(0x964C9C5256D54E87), UINT64_C(0x5D21F6C31C3445B8), - UINT64_C(0x00974870C31759F9), UINT64_C(0xCBFA22E189F652C6), - UINT64_C(0xBAFB35177C50617B), UINT64_C(0x71965F8636B16A44), - UINT64_C(0x2C20E135E9927605), UINT64_C(0xE74D8BA4A3737D3A), - UINT64_C(0xE2BBF77CAE758C71), UINT64_C(0x29D69DEDE494874E), - UINT64_C(0x7460235E3BB79B0F), UINT64_C(0xBF0D49CF71569030), - UINT64_C(0xCE0C5E3984F0A38D), UINT64_C(0x056134A8CE11A8B2), - UINT64_C(0x58D78A1B1132B4F3), UINT64_C(0x93BAE08A5BD3BFCC), - UINT64_C(0x3FCBAA58D1D00B1B), UINT64_C(0xF4A6C0C99B310024), - UINT64_C(0xA9107E7A44121C65), UINT64_C(0x627D14EB0EF3175A), - UINT64_C(0x137C031DFB5524E7), UINT64_C(0xD811698CB1B42FD8), - UINT64_C(0x85A7D73F6E973399), UINT64_C(0x4ECABDAE247638A6), - UINT64_C(0x585A4D34503F83A4), UINT64_C(0x933727A51ADE889B), - UINT64_C(0xCE819916C5FD94DA), UINT64_C(0x05ECF3878F1C9FE5), - UINT64_C(0x74EDE4717ABAAC58), UINT64_C(0xBF808EE0305BA767), - UINT64_C(0xE2363053EF78BB26), UINT64_C(0x295B5AC2A599B019), - UINT64_C(0x852A10102F9A04CE), UINT64_C(0x4E477A81657B0FF1), - UINT64_C(0x13F1C432BA5813B0), UINT64_C(0xD89CAEA3F0B9188F), - UINT64_C(0xA99DB955051F2B32), UINT64_C(0x62F0D3C44FFE200D), - UINT64_C(0x3F466D7790DD3C4C), UINT64_C(0xF42B07E6DA3C3773), - UINT64_C(0x13668C42794F4A49), UINT64_C(0xD80BE6D333AE4176), - UINT64_C(0x85BD5860EC8D5D37), UINT64_C(0x4ED032F1A66C5608), - UINT64_C(0x3FD1250753CA65B5), UINT64_C(0xF4BC4F96192B6E8A), - UINT64_C(0xA90AF125C60872CB), UINT64_C(0x62679BB48CE979F4), - UINT64_C(0xCE16D16606EACD23), UINT64_C(0x057BBBF74C0BC61C), - UINT64_C(0x58CD05449328DA5D), UINT64_C(0x93A06FD5D9C9D162), - UINT64_C(0xE2A178232C6FE2DF), UINT64_C(0x29CC12B2668EE9E0), - UINT64_C(0x747AAC01B9ADF5A1), UINT64_C(0xBF17C690F34CFE9E), - UINT64_C(0xA987360A8705459C), UINT64_C(0x62EA5C9BCDE44EA3), - UINT64_C(0x3F5CE22812C752E2), UINT64_C(0xF43188B9582659DD), - UINT64_C(0x85309F4FAD806A60), UINT64_C(0x4E5DF5DEE761615F), - UINT64_C(0x13EB4B6D38427D1E), UINT64_C(0xD88621FC72A37621), - UINT64_C(0x74F76B2EF8A0C2F6), UINT64_C(0xBF9A01BFB241C9C9), - UINT64_C(0xE22CBF0C6D62D588), UINT64_C(0x2941D59D2783DEB7), - UINT64_C(0x5840C26BD225ED0A), UINT64_C(0x932DA8FA98C4E635), - UINT64_C(0xCE9B164947E7FA74), UINT64_C(0x05F67CD80D06F14B), - UINT64_C(0xC477EFF95CEB18E3), UINT64_C(0x0F1A8568160A13DC), - UINT64_C(0x52AC3BDBC9290F9D), UINT64_C(0x99C1514A83C804A2), - UINT64_C(0xE8C046BC766E371F), UINT64_C(0x23AD2C2D3C8F3C20), - UINT64_C(0x7E1B929EE3AC2061), UINT64_C(0xB576F80FA94D2B5E), - UINT64_C(0x1907B2DD234E9F89), UINT64_C(0xD26AD84C69AF94B6), - UINT64_C(0x8FDC66FFB68C88F7), UINT64_C(0x44B10C6EFC6D83C8), - UINT64_C(0x35B01B9809CBB075), UINT64_C(0xFEDD7109432ABB4A), - UINT64_C(0xA36BCFBA9C09A70B), UINT64_C(0x6806A52BD6E8AC34), - UINT64_C(0x7E9655B1A2A11736), UINT64_C(0xB5FB3F20E8401C09), - UINT64_C(0xE84D819337630048), UINT64_C(0x2320EB027D820B77), - UINT64_C(0x5221FCF4882438CA), UINT64_C(0x994C9665C2C533F5), - UINT64_C(0xC4FA28D61DE62FB4), UINT64_C(0x0F9742475707248B), - UINT64_C(0xA3E60895DD04905C), UINT64_C(0x688B620497E59B63), - UINT64_C(0x353DDCB748C68722), UINT64_C(0xFE50B62602278C1D), - UINT64_C(0x8F51A1D0F781BFA0), UINT64_C(0x443CCB41BD60B49F), - UINT64_C(0x198A75F26243A8DE), UINT64_C(0xD2E71F6328A2A3E1), - UINT64_C(0x35AA94C78BD1DEDB), UINT64_C(0xFEC7FE56C130D5E4), - UINT64_C(0xA37140E51E13C9A5), UINT64_C(0x681C2A7454F2C29A), - UINT64_C(0x191D3D82A154F127), UINT64_C(0xD2705713EBB5FA18), - UINT64_C(0x8FC6E9A03496E659), UINT64_C(0x44AB83317E77ED66), - UINT64_C(0xE8DAC9E3F47459B1), UINT64_C(0x23B7A372BE95528E), - UINT64_C(0x7E011DC161B64ECF), UINT64_C(0xB56C77502B5745F0), - UINT64_C(0xC46D60A6DEF1764D), UINT64_C(0x0F000A3794107D72), - UINT64_C(0x52B6B4844B336133), UINT64_C(0x99DBDE1501D26A0C), - UINT64_C(0x8F4B2E8F759BD10E), UINT64_C(0x4426441E3F7ADA31), - UINT64_C(0x1990FAADE059C670), UINT64_C(0xD2FD903CAAB8CD4F), - UINT64_C(0xA3FC87CA5F1EFEF2), UINT64_C(0x6891ED5B15FFF5CD), - UINT64_C(0x352753E8CADCE98C), UINT64_C(0xFE4A3979803DE2B3), - UINT64_C(0x523B73AB0A3E5664), UINT64_C(0x9956193A40DF5D5B), - UINT64_C(0xC4E0A7899FFC411A), UINT64_C(0x0F8DCD18D51D4A25), - UINT64_C(0x7E8CDAEE20BB7998), UINT64_C(0xB5E1B07F6A5A72A7), - UINT64_C(0xE8570ECCB5796EE6), UINT64_C(0x233A645DFF9865D9), - UINT64_C(0x26CC1885F29E9492), UINT64_C(0xEDA17214B87F9FAD), - UINT64_C(0xB017CCA7675C83EC), UINT64_C(0x7B7AA6362DBD88D3), - UINT64_C(0x0A7BB1C0D81BBB6E), UINT64_C(0xC116DB5192FAB051), - UINT64_C(0x9CA065E24DD9AC10), UINT64_C(0x57CD0F730738A72F), - UINT64_C(0xFBBC45A18D3B13F8), UINT64_C(0x30D12F30C7DA18C7), - UINT64_C(0x6D67918318F90486), UINT64_C(0xA60AFB1252180FB9), - UINT64_C(0xD70BECE4A7BE3C04), UINT64_C(0x1C668675ED5F373B), - UINT64_C(0x41D038C6327C2B7A), UINT64_C(0x8ABD5257789D2045), - UINT64_C(0x9C2DA2CD0CD49B47), UINT64_C(0x5740C85C46359078), - UINT64_C(0x0AF676EF99168C39), UINT64_C(0xC19B1C7ED3F78706), - UINT64_C(0xB09A0B882651B4BB), UINT64_C(0x7BF761196CB0BF84), - UINT64_C(0x2641DFAAB393A3C5), UINT64_C(0xED2CB53BF972A8FA), - UINT64_C(0x415DFFE973711C2D), UINT64_C(0x8A30957839901712), - UINT64_C(0xD7862BCBE6B30B53), UINT64_C(0x1CEB415AAC52006C), - UINT64_C(0x6DEA56AC59F433D1), UINT64_C(0xA6873C3D131538EE), - UINT64_C(0xFB31828ECC3624AF), UINT64_C(0x305CE81F86D72F90), - UINT64_C(0xD71163BB25A452AA), UINT64_C(0x1C7C092A6F455995), - UINT64_C(0x41CAB799B06645D4), UINT64_C(0x8AA7DD08FA874EEB), - UINT64_C(0xFBA6CAFE0F217D56), UINT64_C(0x30CBA06F45C07669), - UINT64_C(0x6D7D1EDC9AE36A28), UINT64_C(0xA610744DD0026117), - UINT64_C(0x0A613E9F5A01D5C0), UINT64_C(0xC10C540E10E0DEFF), - UINT64_C(0x9CBAEABDCFC3C2BE), UINT64_C(0x57D7802C8522C981), - UINT64_C(0x26D697DA7084FA3C), UINT64_C(0xEDBBFD4B3A65F103), - UINT64_C(0xB00D43F8E546ED42), UINT64_C(0x7B602969AFA7E67D), - UINT64_C(0x6DF0D9F3DBEE5D7F), UINT64_C(0xA69DB362910F5640), - UINT64_C(0xFB2B0DD14E2C4A01), UINT64_C(0x3046674004CD413E), - UINT64_C(0x414770B6F16B7283), UINT64_C(0x8A2A1A27BB8A79BC), - UINT64_C(0xD79CA49464A965FD), UINT64_C(0x1CF1CE052E486EC2), - UINT64_C(0xB08084D7A44BDA15), UINT64_C(0x7BEDEE46EEAAD12A), - UINT64_C(0x265B50F53189CD6B), UINT64_C(0xED363A647B68C654), - UINT64_C(0x9C372D928ECEF5E9), UINT64_C(0x575A4703C42FFED6), - UINT64_C(0x0AECF9B01B0CE297), UINT64_C(0xC181932151EDE9A8) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0xDCA12C225E8AEE1D), - UINT64_C(0xB8435944BC14DD3B), UINT64_C(0x64E27566E29E3326), - UINT64_C(0x7087B2887829BA77), UINT64_C(0xAC269EAA26A3546A), - UINT64_C(0xC8C4EBCCC43D674C), UINT64_C(0x1465C7EE9AB78951), - UINT64_C(0xE00E6511F15274EF), UINT64_C(0x3CAF4933AFD89AF2), - UINT64_C(0x584D3C554D46A9D4), UINT64_C(0x84EC107713CC47C9), - UINT64_C(0x9089D799897BCE98), UINT64_C(0x4C28FBBBD7F12085), - UINT64_C(0x28CA8EDD356F13A3), UINT64_C(0xF46BA2FF6BE5FDBE), - UINT64_C(0x4503C48DC90A304C), UINT64_C(0x99A2E8AF9780DE51), - UINT64_C(0xFD409DC9751EED77), UINT64_C(0x21E1B1EB2B94036A), - UINT64_C(0x35847605B1238A3B), UINT64_C(0xE9255A27EFA96426), - UINT64_C(0x8DC72F410D375700), UINT64_C(0x5166036353BDB91D), - UINT64_C(0xA50DA19C385844A3), UINT64_C(0x79AC8DBE66D2AABE), - UINT64_C(0x1D4EF8D8844C9998), UINT64_C(0xC1EFD4FADAC67785), - UINT64_C(0xD58A13144071FED4), UINT64_C(0x092B3F361EFB10C9), - UINT64_C(0x6DC94A50FC6523EF), UINT64_C(0xB1686672A2EFCDF2), - UINT64_C(0x8A06881B93156098), UINT64_C(0x56A7A439CD9F8E85), - UINT64_C(0x3245D15F2F01BDA3), UINT64_C(0xEEE4FD7D718B53BE), - UINT64_C(0xFA813A93EB3CDAEF), UINT64_C(0x262016B1B5B634F2), - UINT64_C(0x42C263D7572807D4), UINT64_C(0x9E634FF509A2E9C9), - UINT64_C(0x6A08ED0A62471477), UINT64_C(0xB6A9C1283CCDFA6A), - UINT64_C(0xD24BB44EDE53C94C), UINT64_C(0x0EEA986C80D92751), - UINT64_C(0x1A8F5F821A6EAE00), UINT64_C(0xC62E73A044E4401D), - UINT64_C(0xA2CC06C6A67A733B), UINT64_C(0x7E6D2AE4F8F09D26), - UINT64_C(0xCF054C965A1F50D4), UINT64_C(0x13A460B40495BEC9), - UINT64_C(0x774615D2E60B8DEF), UINT64_C(0xABE739F0B88163F2), - UINT64_C(0xBF82FE1E2236EAA3), UINT64_C(0x6323D23C7CBC04BE), - UINT64_C(0x07C1A75A9E223798), UINT64_C(0xDB608B78C0A8D985), - UINT64_C(0x2F0B2987AB4D243B), UINT64_C(0xF3AA05A5F5C7CA26), - UINT64_C(0x974870C31759F900), UINT64_C(0x4BE95CE149D3171D), - UINT64_C(0x5F8C9B0FD3649E4C), UINT64_C(0x832DB72D8DEE7051), - UINT64_C(0xE7CFC24B6F704377), UINT64_C(0x3B6EEE6931FAAD6A), - UINT64_C(0x91131E980D8418A2), UINT64_C(0x4DB232BA530EF6BF), - UINT64_C(0x295047DCB190C599), UINT64_C(0xF5F16BFEEF1A2B84), - UINT64_C(0xE194AC1075ADA2D5), UINT64_C(0x3D3580322B274CC8), - UINT64_C(0x59D7F554C9B97FEE), UINT64_C(0x8576D976973391F3), - UINT64_C(0x711D7B89FCD66C4D), UINT64_C(0xADBC57ABA25C8250), - UINT64_C(0xC95E22CD40C2B176), UINT64_C(0x15FF0EEF1E485F6B), - UINT64_C(0x019AC90184FFD63A), UINT64_C(0xDD3BE523DA753827), - UINT64_C(0xB9D9904538EB0B01), UINT64_C(0x6578BC676661E51C), - UINT64_C(0xD410DA15C48E28EE), UINT64_C(0x08B1F6379A04C6F3), - UINT64_C(0x6C538351789AF5D5), UINT64_C(0xB0F2AF7326101BC8), - UINT64_C(0xA497689DBCA79299), UINT64_C(0x783644BFE22D7C84), - UINT64_C(0x1CD431D900B34FA2), UINT64_C(0xC0751DFB5E39A1BF), - UINT64_C(0x341EBF0435DC5C01), UINT64_C(0xE8BF93266B56B21C), - UINT64_C(0x8C5DE64089C8813A), UINT64_C(0x50FCCA62D7426F27), - UINT64_C(0x44990D8C4DF5E676), UINT64_C(0x983821AE137F086B), - UINT64_C(0xFCDA54C8F1E13B4D), UINT64_C(0x207B78EAAF6BD550), - UINT64_C(0x1B1596839E91783A), UINT64_C(0xC7B4BAA1C01B9627), - UINT64_C(0xA356CFC72285A501), UINT64_C(0x7FF7E3E57C0F4B1C), - UINT64_C(0x6B92240BE6B8C24D), UINT64_C(0xB7330829B8322C50), - UINT64_C(0xD3D17D4F5AAC1F76), UINT64_C(0x0F70516D0426F16B), - UINT64_C(0xFB1BF3926FC30CD5), UINT64_C(0x27BADFB03149E2C8), - UINT64_C(0x4358AAD6D3D7D1EE), UINT64_C(0x9FF986F48D5D3FF3), - UINT64_C(0x8B9C411A17EAB6A2), UINT64_C(0x573D6D38496058BF), - UINT64_C(0x33DF185EABFE6B99), UINT64_C(0xEF7E347CF5748584), - UINT64_C(0x5E16520E579B4876), UINT64_C(0x82B77E2C0911A66B), - UINT64_C(0xE6550B4AEB8F954D), UINT64_C(0x3AF42768B5057B50), - UINT64_C(0x2E91E0862FB2F201), UINT64_C(0xF230CCA471381C1C), - UINT64_C(0x96D2B9C293A62F3A), UINT64_C(0x4A7395E0CD2CC127), - UINT64_C(0xBE18371FA6C93C99), UINT64_C(0x62B91B3DF843D284), - UINT64_C(0x065B6E5B1ADDE1A2), UINT64_C(0xDAFA427944570FBF), - UINT64_C(0xCE9F8597DEE086EE), UINT64_C(0x123EA9B5806A68F3), - UINT64_C(0x76DCDCD362F45BD5), UINT64_C(0xAA7DF0F13C7EB5C8), - UINT64_C(0xA739329F30A7E9D6), UINT64_C(0x7B981EBD6E2D07CB), - UINT64_C(0x1F7A6BDB8CB334ED), UINT64_C(0xC3DB47F9D239DAF0), - UINT64_C(0xD7BE8017488E53A1), UINT64_C(0x0B1FAC351604BDBC), - UINT64_C(0x6FFDD953F49A8E9A), UINT64_C(0xB35CF571AA106087), - UINT64_C(0x4737578EC1F59D39), UINT64_C(0x9B967BAC9F7F7324), - UINT64_C(0xFF740ECA7DE14002), UINT64_C(0x23D522E8236BAE1F), - UINT64_C(0x37B0E506B9DC274E), UINT64_C(0xEB11C924E756C953), - UINT64_C(0x8FF3BC4205C8FA75), UINT64_C(0x535290605B421468), - UINT64_C(0xE23AF612F9ADD99A), UINT64_C(0x3E9BDA30A7273787), - UINT64_C(0x5A79AF5645B904A1), UINT64_C(0x86D883741B33EABC), - UINT64_C(0x92BD449A818463ED), UINT64_C(0x4E1C68B8DF0E8DF0), - UINT64_C(0x2AFE1DDE3D90BED6), UINT64_C(0xF65F31FC631A50CB), - UINT64_C(0x0234930308FFAD75), UINT64_C(0xDE95BF2156754368), - UINT64_C(0xBA77CA47B4EB704E), UINT64_C(0x66D6E665EA619E53), - UINT64_C(0x72B3218B70D61702), UINT64_C(0xAE120DA92E5CF91F), - UINT64_C(0xCAF078CFCCC2CA39), UINT64_C(0x165154ED92482424), - UINT64_C(0x2D3FBA84A3B2894E), UINT64_C(0xF19E96A6FD386753), - UINT64_C(0x957CE3C01FA65475), UINT64_C(0x49DDCFE2412CBA68), - UINT64_C(0x5DB8080CDB9B3339), UINT64_C(0x8119242E8511DD24), - UINT64_C(0xE5FB5148678FEE02), UINT64_C(0x395A7D6A3905001F), - UINT64_C(0xCD31DF9552E0FDA1), UINT64_C(0x1190F3B70C6A13BC), - UINT64_C(0x757286D1EEF4209A), UINT64_C(0xA9D3AAF3B07ECE87), - UINT64_C(0xBDB66D1D2AC947D6), UINT64_C(0x6117413F7443A9CB), - UINT64_C(0x05F5345996DD9AED), UINT64_C(0xD954187BC85774F0), - UINT64_C(0x683C7E096AB8B902), UINT64_C(0xB49D522B3432571F), - UINT64_C(0xD07F274DD6AC6439), UINT64_C(0x0CDE0B6F88268A24), - UINT64_C(0x18BBCC8112910375), UINT64_C(0xC41AE0A34C1BED68), - UINT64_C(0xA0F895C5AE85DE4E), UINT64_C(0x7C59B9E7F00F3053), - UINT64_C(0x88321B189BEACDED), UINT64_C(0x5493373AC56023F0), - UINT64_C(0x3071425C27FE10D6), UINT64_C(0xECD06E7E7974FECB), - UINT64_C(0xF8B5A990E3C3779A), UINT64_C(0x241485B2BD499987), - UINT64_C(0x40F6F0D45FD7AAA1), UINT64_C(0x9C57DCF6015D44BC), - UINT64_C(0x362A2C073D23F174), UINT64_C(0xEA8B002563A91F69), - UINT64_C(0x8E69754381372C4F), UINT64_C(0x52C85961DFBDC252), - UINT64_C(0x46AD9E8F450A4B03), UINT64_C(0x9A0CB2AD1B80A51E), - UINT64_C(0xFEEEC7CBF91E9638), UINT64_C(0x224FEBE9A7947825), - UINT64_C(0xD6244916CC71859B), UINT64_C(0x0A85653492FB6B86), - UINT64_C(0x6E671052706558A0), UINT64_C(0xB2C63C702EEFB6BD), - UINT64_C(0xA6A3FB9EB4583FEC), UINT64_C(0x7A02D7BCEAD2D1F1), - UINT64_C(0x1EE0A2DA084CE2D7), UINT64_C(0xC2418EF856C60CCA), - UINT64_C(0x7329E88AF429C138), UINT64_C(0xAF88C4A8AAA32F25), - UINT64_C(0xCB6AB1CE483D1C03), UINT64_C(0x17CB9DEC16B7F21E), - UINT64_C(0x03AE5A028C007B4F), UINT64_C(0xDF0F7620D28A9552), - UINT64_C(0xBBED03463014A674), UINT64_C(0x674C2F646E9E4869), - UINT64_C(0x93278D9B057BB5D7), UINT64_C(0x4F86A1B95BF15BCA), - UINT64_C(0x2B64D4DFB96F68EC), UINT64_C(0xF7C5F8FDE7E586F1), - UINT64_C(0xE3A03F137D520FA0), UINT64_C(0x3F01133123D8E1BD), - UINT64_C(0x5BE36657C146D29B), UINT64_C(0x87424A759FCC3C86), - UINT64_C(0xBC2CA41CAE3691EC), UINT64_C(0x608D883EF0BC7FF1), - UINT64_C(0x046FFD5812224CD7), UINT64_C(0xD8CED17A4CA8A2CA), - UINT64_C(0xCCAB1694D61F2B9B), UINT64_C(0x100A3AB68895C586), - UINT64_C(0x74E84FD06A0BF6A0), UINT64_C(0xA84963F2348118BD), - UINT64_C(0x5C22C10D5F64E503), UINT64_C(0x8083ED2F01EE0B1E), - UINT64_C(0xE4619849E3703838), UINT64_C(0x38C0B46BBDFAD625), - UINT64_C(0x2CA57385274D5F74), UINT64_C(0xF0045FA779C7B169), - UINT64_C(0x94E62AC19B59824F), UINT64_C(0x484706E3C5D36C52), - UINT64_C(0xF92F6091673CA1A0), UINT64_C(0x258E4CB339B64FBD), - UINT64_C(0x416C39D5DB287C9B), UINT64_C(0x9DCD15F785A29286), - UINT64_C(0x89A8D2191F151BD7), UINT64_C(0x5509FE3B419FF5CA), - UINT64_C(0x31EB8B5DA301C6EC), UINT64_C(0xED4AA77FFD8B28F1), - UINT64_C(0x19210580966ED54F), UINT64_C(0xC58029A2C8E43B52), - UINT64_C(0xA1625CC42A7A0874), UINT64_C(0x7DC370E674F0E669), - UINT64_C(0x69A6B708EE476F38), UINT64_C(0xB5079B2AB0CD8125), - UINT64_C(0xD1E5EE4C5253B203), UINT64_C(0x0D44C26E0CD95C1E) - } -}; diff --git a/software/src/xz/src/liblzma/check/crc64_table_le.h b/software/src/xz/src/liblzma/check/crc64_table_le.h deleted file mode 100644 index e40a8c8..0000000 --- a/software/src/xz/src/liblzma/check/crc64_table_le.h +++ /dev/null @@ -1,523 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by crc64_tablegen.c. - -const uint64_t lzma_crc64_table[4][256] = { - { - UINT64_C(0x0000000000000000), UINT64_C(0xB32E4CBE03A75F6F), - UINT64_C(0xF4843657A840A05B), UINT64_C(0x47AA7AE9ABE7FF34), - UINT64_C(0x7BD0C384FF8F5E33), UINT64_C(0xC8FE8F3AFC28015C), - UINT64_C(0x8F54F5D357CFFE68), UINT64_C(0x3C7AB96D5468A107), - UINT64_C(0xF7A18709FF1EBC66), UINT64_C(0x448FCBB7FCB9E309), - UINT64_C(0x0325B15E575E1C3D), UINT64_C(0xB00BFDE054F94352), - UINT64_C(0x8C71448D0091E255), UINT64_C(0x3F5F08330336BD3A), - UINT64_C(0x78F572DAA8D1420E), UINT64_C(0xCBDB3E64AB761D61), - UINT64_C(0x7D9BA13851336649), UINT64_C(0xCEB5ED8652943926), - UINT64_C(0x891F976FF973C612), UINT64_C(0x3A31DBD1FAD4997D), - UINT64_C(0x064B62BCAEBC387A), UINT64_C(0xB5652E02AD1B6715), - UINT64_C(0xF2CF54EB06FC9821), UINT64_C(0x41E11855055BC74E), - UINT64_C(0x8A3A2631AE2DDA2F), UINT64_C(0x39146A8FAD8A8540), - UINT64_C(0x7EBE1066066D7A74), UINT64_C(0xCD905CD805CA251B), - UINT64_C(0xF1EAE5B551A2841C), UINT64_C(0x42C4A90B5205DB73), - UINT64_C(0x056ED3E2F9E22447), UINT64_C(0xB6409F5CFA457B28), - UINT64_C(0xFB374270A266CC92), UINT64_C(0x48190ECEA1C193FD), - UINT64_C(0x0FB374270A266CC9), UINT64_C(0xBC9D3899098133A6), - UINT64_C(0x80E781F45DE992A1), UINT64_C(0x33C9CD4A5E4ECDCE), - UINT64_C(0x7463B7A3F5A932FA), UINT64_C(0xC74DFB1DF60E6D95), - UINT64_C(0x0C96C5795D7870F4), UINT64_C(0xBFB889C75EDF2F9B), - UINT64_C(0xF812F32EF538D0AF), UINT64_C(0x4B3CBF90F69F8FC0), - UINT64_C(0x774606FDA2F72EC7), UINT64_C(0xC4684A43A15071A8), - UINT64_C(0x83C230AA0AB78E9C), UINT64_C(0x30EC7C140910D1F3), - UINT64_C(0x86ACE348F355AADB), UINT64_C(0x3582AFF6F0F2F5B4), - UINT64_C(0x7228D51F5B150A80), UINT64_C(0xC10699A158B255EF), - UINT64_C(0xFD7C20CC0CDAF4E8), UINT64_C(0x4E526C720F7DAB87), - UINT64_C(0x09F8169BA49A54B3), UINT64_C(0xBAD65A25A73D0BDC), - UINT64_C(0x710D64410C4B16BD), UINT64_C(0xC22328FF0FEC49D2), - UINT64_C(0x85895216A40BB6E6), UINT64_C(0x36A71EA8A7ACE989), - UINT64_C(0x0ADDA7C5F3C4488E), UINT64_C(0xB9F3EB7BF06317E1), - UINT64_C(0xFE5991925B84E8D5), UINT64_C(0x4D77DD2C5823B7BA), - UINT64_C(0x64B62BCAEBC387A1), UINT64_C(0xD7986774E864D8CE), - UINT64_C(0x90321D9D438327FA), UINT64_C(0x231C512340247895), - UINT64_C(0x1F66E84E144CD992), UINT64_C(0xAC48A4F017EB86FD), - UINT64_C(0xEBE2DE19BC0C79C9), UINT64_C(0x58CC92A7BFAB26A6), - UINT64_C(0x9317ACC314DD3BC7), UINT64_C(0x2039E07D177A64A8), - UINT64_C(0x67939A94BC9D9B9C), UINT64_C(0xD4BDD62ABF3AC4F3), - UINT64_C(0xE8C76F47EB5265F4), UINT64_C(0x5BE923F9E8F53A9B), - UINT64_C(0x1C4359104312C5AF), UINT64_C(0xAF6D15AE40B59AC0), - UINT64_C(0x192D8AF2BAF0E1E8), UINT64_C(0xAA03C64CB957BE87), - UINT64_C(0xEDA9BCA512B041B3), UINT64_C(0x5E87F01B11171EDC), - UINT64_C(0x62FD4976457FBFDB), UINT64_C(0xD1D305C846D8E0B4), - UINT64_C(0x96797F21ED3F1F80), UINT64_C(0x2557339FEE9840EF), - UINT64_C(0xEE8C0DFB45EE5D8E), UINT64_C(0x5DA24145464902E1), - UINT64_C(0x1A083BACEDAEFDD5), UINT64_C(0xA9267712EE09A2BA), - UINT64_C(0x955CCE7FBA6103BD), UINT64_C(0x267282C1B9C65CD2), - UINT64_C(0x61D8F8281221A3E6), UINT64_C(0xD2F6B4961186FC89), - UINT64_C(0x9F8169BA49A54B33), UINT64_C(0x2CAF25044A02145C), - UINT64_C(0x6B055FEDE1E5EB68), UINT64_C(0xD82B1353E242B407), - UINT64_C(0xE451AA3EB62A1500), UINT64_C(0x577FE680B58D4A6F), - UINT64_C(0x10D59C691E6AB55B), UINT64_C(0xA3FBD0D71DCDEA34), - UINT64_C(0x6820EEB3B6BBF755), UINT64_C(0xDB0EA20DB51CA83A), - UINT64_C(0x9CA4D8E41EFB570E), UINT64_C(0x2F8A945A1D5C0861), - UINT64_C(0x13F02D374934A966), UINT64_C(0xA0DE61894A93F609), - UINT64_C(0xE7741B60E174093D), UINT64_C(0x545A57DEE2D35652), - UINT64_C(0xE21AC88218962D7A), UINT64_C(0x5134843C1B317215), - UINT64_C(0x169EFED5B0D68D21), UINT64_C(0xA5B0B26BB371D24E), - UINT64_C(0x99CA0B06E7197349), UINT64_C(0x2AE447B8E4BE2C26), - UINT64_C(0x6D4E3D514F59D312), UINT64_C(0xDE6071EF4CFE8C7D), - UINT64_C(0x15BB4F8BE788911C), UINT64_C(0xA6950335E42FCE73), - UINT64_C(0xE13F79DC4FC83147), UINT64_C(0x521135624C6F6E28), - UINT64_C(0x6E6B8C0F1807CF2F), UINT64_C(0xDD45C0B11BA09040), - UINT64_C(0x9AEFBA58B0476F74), UINT64_C(0x29C1F6E6B3E0301B), - UINT64_C(0xC96C5795D7870F42), UINT64_C(0x7A421B2BD420502D), - UINT64_C(0x3DE861C27FC7AF19), UINT64_C(0x8EC62D7C7C60F076), - UINT64_C(0xB2BC941128085171), UINT64_C(0x0192D8AF2BAF0E1E), - UINT64_C(0x4638A2468048F12A), UINT64_C(0xF516EEF883EFAE45), - UINT64_C(0x3ECDD09C2899B324), UINT64_C(0x8DE39C222B3EEC4B), - UINT64_C(0xCA49E6CB80D9137F), UINT64_C(0x7967AA75837E4C10), - UINT64_C(0x451D1318D716ED17), UINT64_C(0xF6335FA6D4B1B278), - UINT64_C(0xB199254F7F564D4C), UINT64_C(0x02B769F17CF11223), - UINT64_C(0xB4F7F6AD86B4690B), UINT64_C(0x07D9BA1385133664), - UINT64_C(0x4073C0FA2EF4C950), UINT64_C(0xF35D8C442D53963F), - UINT64_C(0xCF273529793B3738), UINT64_C(0x7C0979977A9C6857), - UINT64_C(0x3BA3037ED17B9763), UINT64_C(0x888D4FC0D2DCC80C), - UINT64_C(0x435671A479AAD56D), UINT64_C(0xF0783D1A7A0D8A02), - UINT64_C(0xB7D247F3D1EA7536), UINT64_C(0x04FC0B4DD24D2A59), - UINT64_C(0x3886B22086258B5E), UINT64_C(0x8BA8FE9E8582D431), - UINT64_C(0xCC0284772E652B05), UINT64_C(0x7F2CC8C92DC2746A), - UINT64_C(0x325B15E575E1C3D0), UINT64_C(0x8175595B76469CBF), - UINT64_C(0xC6DF23B2DDA1638B), UINT64_C(0x75F16F0CDE063CE4), - UINT64_C(0x498BD6618A6E9DE3), UINT64_C(0xFAA59ADF89C9C28C), - UINT64_C(0xBD0FE036222E3DB8), UINT64_C(0x0E21AC88218962D7), - UINT64_C(0xC5FA92EC8AFF7FB6), UINT64_C(0x76D4DE52895820D9), - UINT64_C(0x317EA4BB22BFDFED), UINT64_C(0x8250E80521188082), - UINT64_C(0xBE2A516875702185), UINT64_C(0x0D041DD676D77EEA), - UINT64_C(0x4AAE673FDD3081DE), UINT64_C(0xF9802B81DE97DEB1), - UINT64_C(0x4FC0B4DD24D2A599), UINT64_C(0xFCEEF8632775FAF6), - UINT64_C(0xBB44828A8C9205C2), UINT64_C(0x086ACE348F355AAD), - UINT64_C(0x34107759DB5DFBAA), UINT64_C(0x873E3BE7D8FAA4C5), - UINT64_C(0xC094410E731D5BF1), UINT64_C(0x73BA0DB070BA049E), - UINT64_C(0xB86133D4DBCC19FF), UINT64_C(0x0B4F7F6AD86B4690), - UINT64_C(0x4CE50583738CB9A4), UINT64_C(0xFFCB493D702BE6CB), - UINT64_C(0xC3B1F050244347CC), UINT64_C(0x709FBCEE27E418A3), - UINT64_C(0x3735C6078C03E797), UINT64_C(0x841B8AB98FA4B8F8), - UINT64_C(0xADDA7C5F3C4488E3), UINT64_C(0x1EF430E13FE3D78C), - UINT64_C(0x595E4A08940428B8), UINT64_C(0xEA7006B697A377D7), - UINT64_C(0xD60ABFDBC3CBD6D0), UINT64_C(0x6524F365C06C89BF), - UINT64_C(0x228E898C6B8B768B), UINT64_C(0x91A0C532682C29E4), - UINT64_C(0x5A7BFB56C35A3485), UINT64_C(0xE955B7E8C0FD6BEA), - UINT64_C(0xAEFFCD016B1A94DE), UINT64_C(0x1DD181BF68BDCBB1), - UINT64_C(0x21AB38D23CD56AB6), UINT64_C(0x9285746C3F7235D9), - UINT64_C(0xD52F0E859495CAED), UINT64_C(0x6601423B97329582), - UINT64_C(0xD041DD676D77EEAA), UINT64_C(0x636F91D96ED0B1C5), - UINT64_C(0x24C5EB30C5374EF1), UINT64_C(0x97EBA78EC690119E), - UINT64_C(0xAB911EE392F8B099), UINT64_C(0x18BF525D915FEFF6), - UINT64_C(0x5F1528B43AB810C2), UINT64_C(0xEC3B640A391F4FAD), - UINT64_C(0x27E05A6E926952CC), UINT64_C(0x94CE16D091CE0DA3), - UINT64_C(0xD3646C393A29F297), UINT64_C(0x604A2087398EADF8), - UINT64_C(0x5C3099EA6DE60CFF), UINT64_C(0xEF1ED5546E415390), - UINT64_C(0xA8B4AFBDC5A6ACA4), UINT64_C(0x1B9AE303C601F3CB), - UINT64_C(0x56ED3E2F9E224471), UINT64_C(0xE5C372919D851B1E), - UINT64_C(0xA26908783662E42A), UINT64_C(0x114744C635C5BB45), - UINT64_C(0x2D3DFDAB61AD1A42), UINT64_C(0x9E13B115620A452D), - UINT64_C(0xD9B9CBFCC9EDBA19), UINT64_C(0x6A978742CA4AE576), - UINT64_C(0xA14CB926613CF817), UINT64_C(0x1262F598629BA778), - UINT64_C(0x55C88F71C97C584C), UINT64_C(0xE6E6C3CFCADB0723), - UINT64_C(0xDA9C7AA29EB3A624), UINT64_C(0x69B2361C9D14F94B), - UINT64_C(0x2E184CF536F3067F), UINT64_C(0x9D36004B35545910), - UINT64_C(0x2B769F17CF112238), UINT64_C(0x9858D3A9CCB67D57), - UINT64_C(0xDFF2A94067518263), UINT64_C(0x6CDCE5FE64F6DD0C), - UINT64_C(0x50A65C93309E7C0B), UINT64_C(0xE388102D33392364), - UINT64_C(0xA4226AC498DEDC50), UINT64_C(0x170C267A9B79833F), - UINT64_C(0xDCD7181E300F9E5E), UINT64_C(0x6FF954A033A8C131), - UINT64_C(0x28532E49984F3E05), UINT64_C(0x9B7D62F79BE8616A), - UINT64_C(0xA707DB9ACF80C06D), UINT64_C(0x14299724CC279F02), - UINT64_C(0x5383EDCD67C06036), UINT64_C(0xE0ADA17364673F59) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0x54E979925CD0F10D), - UINT64_C(0xA9D2F324B9A1E21A), UINT64_C(0xFD3B8AB6E5711317), - UINT64_C(0xC17D4962DC4DDAB1), UINT64_C(0x959430F0809D2BBC), - UINT64_C(0x68AFBA4665EC38AB), UINT64_C(0x3C46C3D4393CC9A6), - UINT64_C(0x10223DEE1795ABE7), UINT64_C(0x44CB447C4B455AEA), - UINT64_C(0xB9F0CECAAE3449FD), UINT64_C(0xED19B758F2E4B8F0), - UINT64_C(0xD15F748CCBD87156), UINT64_C(0x85B60D1E9708805B), - UINT64_C(0x788D87A87279934C), UINT64_C(0x2C64FE3A2EA96241), - UINT64_C(0x20447BDC2F2B57CE), UINT64_C(0x74AD024E73FBA6C3), - UINT64_C(0x899688F8968AB5D4), UINT64_C(0xDD7FF16ACA5A44D9), - UINT64_C(0xE13932BEF3668D7F), UINT64_C(0xB5D04B2CAFB67C72), - UINT64_C(0x48EBC19A4AC76F65), UINT64_C(0x1C02B80816179E68), - UINT64_C(0x3066463238BEFC29), UINT64_C(0x648F3FA0646E0D24), - UINT64_C(0x99B4B516811F1E33), UINT64_C(0xCD5DCC84DDCFEF3E), - UINT64_C(0xF11B0F50E4F32698), UINT64_C(0xA5F276C2B823D795), - UINT64_C(0x58C9FC745D52C482), UINT64_C(0x0C2085E60182358F), - UINT64_C(0x4088F7B85E56AF9C), UINT64_C(0x14618E2A02865E91), - UINT64_C(0xE95A049CE7F74D86), UINT64_C(0xBDB37D0EBB27BC8B), - UINT64_C(0x81F5BEDA821B752D), UINT64_C(0xD51CC748DECB8420), - UINT64_C(0x28274DFE3BBA9737), UINT64_C(0x7CCE346C676A663A), - UINT64_C(0x50AACA5649C3047B), UINT64_C(0x0443B3C41513F576), - UINT64_C(0xF9783972F062E661), UINT64_C(0xAD9140E0ACB2176C), - UINT64_C(0x91D78334958EDECA), UINT64_C(0xC53EFAA6C95E2FC7), - UINT64_C(0x380570102C2F3CD0), UINT64_C(0x6CEC098270FFCDDD), - UINT64_C(0x60CC8C64717DF852), UINT64_C(0x3425F5F62DAD095F), - UINT64_C(0xC91E7F40C8DC1A48), UINT64_C(0x9DF706D2940CEB45), - UINT64_C(0xA1B1C506AD3022E3), UINT64_C(0xF558BC94F1E0D3EE), - UINT64_C(0x086336221491C0F9), UINT64_C(0x5C8A4FB0484131F4), - UINT64_C(0x70EEB18A66E853B5), UINT64_C(0x2407C8183A38A2B8), - UINT64_C(0xD93C42AEDF49B1AF), UINT64_C(0x8DD53B3C839940A2), - UINT64_C(0xB193F8E8BAA58904), UINT64_C(0xE57A817AE6757809), - UINT64_C(0x18410BCC03046B1E), UINT64_C(0x4CA8725E5FD49A13), - UINT64_C(0x8111EF70BCAD5F38), UINT64_C(0xD5F896E2E07DAE35), - UINT64_C(0x28C31C54050CBD22), UINT64_C(0x7C2A65C659DC4C2F), - UINT64_C(0x406CA61260E08589), UINT64_C(0x1485DF803C307484), - UINT64_C(0xE9BE5536D9416793), UINT64_C(0xBD572CA48591969E), - UINT64_C(0x9133D29EAB38F4DF), UINT64_C(0xC5DAAB0CF7E805D2), - UINT64_C(0x38E121BA129916C5), UINT64_C(0x6C0858284E49E7C8), - UINT64_C(0x504E9BFC77752E6E), UINT64_C(0x04A7E26E2BA5DF63), - UINT64_C(0xF99C68D8CED4CC74), UINT64_C(0xAD75114A92043D79), - UINT64_C(0xA15594AC938608F6), UINT64_C(0xF5BCED3ECF56F9FB), - UINT64_C(0x088767882A27EAEC), UINT64_C(0x5C6E1E1A76F71BE1), - UINT64_C(0x6028DDCE4FCBD247), UINT64_C(0x34C1A45C131B234A), - UINT64_C(0xC9FA2EEAF66A305D), UINT64_C(0x9D135778AABAC150), - UINT64_C(0xB177A9428413A311), UINT64_C(0xE59ED0D0D8C3521C), - UINT64_C(0x18A55A663DB2410B), UINT64_C(0x4C4C23F46162B006), - UINT64_C(0x700AE020585E79A0), UINT64_C(0x24E399B2048E88AD), - UINT64_C(0xD9D81304E1FF9BBA), UINT64_C(0x8D316A96BD2F6AB7), - UINT64_C(0xC19918C8E2FBF0A4), UINT64_C(0x9570615ABE2B01A9), - UINT64_C(0x684BEBEC5B5A12BE), UINT64_C(0x3CA2927E078AE3B3), - UINT64_C(0x00E451AA3EB62A15), UINT64_C(0x540D28386266DB18), - UINT64_C(0xA936A28E8717C80F), UINT64_C(0xFDDFDB1CDBC73902), - UINT64_C(0xD1BB2526F56E5B43), UINT64_C(0x85525CB4A9BEAA4E), - UINT64_C(0x7869D6024CCFB959), UINT64_C(0x2C80AF90101F4854), - UINT64_C(0x10C66C44292381F2), UINT64_C(0x442F15D675F370FF), - UINT64_C(0xB9149F60908263E8), UINT64_C(0xEDFDE6F2CC5292E5), - UINT64_C(0xE1DD6314CDD0A76A), UINT64_C(0xB5341A8691005667), - UINT64_C(0x480F903074714570), UINT64_C(0x1CE6E9A228A1B47D), - UINT64_C(0x20A02A76119D7DDB), UINT64_C(0x744953E44D4D8CD6), - UINT64_C(0x8972D952A83C9FC1), UINT64_C(0xDD9BA0C0F4EC6ECC), - UINT64_C(0xF1FF5EFADA450C8D), UINT64_C(0xA51627688695FD80), - UINT64_C(0x582DADDE63E4EE97), UINT64_C(0x0CC4D44C3F341F9A), - UINT64_C(0x308217980608D63C), UINT64_C(0x646B6E0A5AD82731), - UINT64_C(0x9950E4BCBFA93426), UINT64_C(0xCDB99D2EE379C52B), - UINT64_C(0x90FB71CAD654A0F5), UINT64_C(0xC41208588A8451F8), - UINT64_C(0x392982EE6FF542EF), UINT64_C(0x6DC0FB7C3325B3E2), - UINT64_C(0x518638A80A197A44), UINT64_C(0x056F413A56C98B49), - UINT64_C(0xF854CB8CB3B8985E), UINT64_C(0xACBDB21EEF686953), - UINT64_C(0x80D94C24C1C10B12), UINT64_C(0xD43035B69D11FA1F), - UINT64_C(0x290BBF007860E908), UINT64_C(0x7DE2C69224B01805), - UINT64_C(0x41A405461D8CD1A3), UINT64_C(0x154D7CD4415C20AE), - UINT64_C(0xE876F662A42D33B9), UINT64_C(0xBC9F8FF0F8FDC2B4), - UINT64_C(0xB0BF0A16F97FF73B), UINT64_C(0xE4567384A5AF0636), - UINT64_C(0x196DF93240DE1521), UINT64_C(0x4D8480A01C0EE42C), - UINT64_C(0x71C2437425322D8A), UINT64_C(0x252B3AE679E2DC87), - UINT64_C(0xD810B0509C93CF90), UINT64_C(0x8CF9C9C2C0433E9D), - UINT64_C(0xA09D37F8EEEA5CDC), UINT64_C(0xF4744E6AB23AADD1), - UINT64_C(0x094FC4DC574BBEC6), UINT64_C(0x5DA6BD4E0B9B4FCB), - UINT64_C(0x61E07E9A32A7866D), UINT64_C(0x350907086E777760), - UINT64_C(0xC8328DBE8B066477), UINT64_C(0x9CDBF42CD7D6957A), - UINT64_C(0xD073867288020F69), UINT64_C(0x849AFFE0D4D2FE64), - UINT64_C(0x79A1755631A3ED73), UINT64_C(0x2D480CC46D731C7E), - UINT64_C(0x110ECF10544FD5D8), UINT64_C(0x45E7B682089F24D5), - UINT64_C(0xB8DC3C34EDEE37C2), UINT64_C(0xEC3545A6B13EC6CF), - UINT64_C(0xC051BB9C9F97A48E), UINT64_C(0x94B8C20EC3475583), - UINT64_C(0x698348B826364694), UINT64_C(0x3D6A312A7AE6B799), - UINT64_C(0x012CF2FE43DA7E3F), UINT64_C(0x55C58B6C1F0A8F32), - UINT64_C(0xA8FE01DAFA7B9C25), UINT64_C(0xFC177848A6AB6D28), - UINT64_C(0xF037FDAEA72958A7), UINT64_C(0xA4DE843CFBF9A9AA), - UINT64_C(0x59E50E8A1E88BABD), UINT64_C(0x0D0C771842584BB0), - UINT64_C(0x314AB4CC7B648216), UINT64_C(0x65A3CD5E27B4731B), - UINT64_C(0x989847E8C2C5600C), UINT64_C(0xCC713E7A9E159101), - UINT64_C(0xE015C040B0BCF340), UINT64_C(0xB4FCB9D2EC6C024D), - UINT64_C(0x49C73364091D115A), UINT64_C(0x1D2E4AF655CDE057), - UINT64_C(0x216889226CF129F1), UINT64_C(0x7581F0B03021D8FC), - UINT64_C(0x88BA7A06D550CBEB), UINT64_C(0xDC53039489803AE6), - UINT64_C(0x11EA9EBA6AF9FFCD), UINT64_C(0x4503E72836290EC0), - UINT64_C(0xB8386D9ED3581DD7), UINT64_C(0xECD1140C8F88ECDA), - UINT64_C(0xD097D7D8B6B4257C), UINT64_C(0x847EAE4AEA64D471), - UINT64_C(0x794524FC0F15C766), UINT64_C(0x2DAC5D6E53C5366B), - UINT64_C(0x01C8A3547D6C542A), UINT64_C(0x5521DAC621BCA527), - UINT64_C(0xA81A5070C4CDB630), UINT64_C(0xFCF329E2981D473D), - UINT64_C(0xC0B5EA36A1218E9B), UINT64_C(0x945C93A4FDF17F96), - UINT64_C(0x6967191218806C81), UINT64_C(0x3D8E608044509D8C), - UINT64_C(0x31AEE56645D2A803), UINT64_C(0x65479CF41902590E), - UINT64_C(0x987C1642FC734A19), UINT64_C(0xCC956FD0A0A3BB14), - UINT64_C(0xF0D3AC04999F72B2), UINT64_C(0xA43AD596C54F83BF), - UINT64_C(0x59015F20203E90A8), UINT64_C(0x0DE826B27CEE61A5), - UINT64_C(0x218CD888524703E4), UINT64_C(0x7565A11A0E97F2E9), - UINT64_C(0x885E2BACEBE6E1FE), UINT64_C(0xDCB7523EB73610F3), - UINT64_C(0xE0F191EA8E0AD955), UINT64_C(0xB418E878D2DA2858), - UINT64_C(0x492362CE37AB3B4F), UINT64_C(0x1DCA1B5C6B7BCA42), - UINT64_C(0x5162690234AF5051), UINT64_C(0x058B1090687FA15C), - UINT64_C(0xF8B09A268D0EB24B), UINT64_C(0xAC59E3B4D1DE4346), - UINT64_C(0x901F2060E8E28AE0), UINT64_C(0xC4F659F2B4327BED), - UINT64_C(0x39CDD344514368FA), UINT64_C(0x6D24AAD60D9399F7), - UINT64_C(0x414054EC233AFBB6), UINT64_C(0x15A92D7E7FEA0ABB), - UINT64_C(0xE892A7C89A9B19AC), UINT64_C(0xBC7BDE5AC64BE8A1), - UINT64_C(0x803D1D8EFF772107), UINT64_C(0xD4D4641CA3A7D00A), - UINT64_C(0x29EFEEAA46D6C31D), UINT64_C(0x7D0697381A063210), - UINT64_C(0x712612DE1B84079F), UINT64_C(0x25CF6B4C4754F692), - UINT64_C(0xD8F4E1FAA225E585), UINT64_C(0x8C1D9868FEF51488), - UINT64_C(0xB05B5BBCC7C9DD2E), UINT64_C(0xE4B2222E9B192C23), - UINT64_C(0x1989A8987E683F34), UINT64_C(0x4D60D10A22B8CE39), - UINT64_C(0x61042F300C11AC78), UINT64_C(0x35ED56A250C15D75), - UINT64_C(0xC8D6DC14B5B04E62), UINT64_C(0x9C3FA586E960BF6F), - UINT64_C(0xA0796652D05C76C9), UINT64_C(0xF4901FC08C8C87C4), - UINT64_C(0x09AB957669FD94D3), UINT64_C(0x5D42ECE4352D65DE) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0x3F0BE14A916A6DCB), - UINT64_C(0x7E17C29522D4DB96), UINT64_C(0x411C23DFB3BEB65D), - UINT64_C(0xFC2F852A45A9B72C), UINT64_C(0xC3246460D4C3DAE7), - UINT64_C(0x823847BF677D6CBA), UINT64_C(0xBD33A6F5F6170171), - UINT64_C(0x6A87A57F245D70DD), UINT64_C(0x558C4435B5371D16), - UINT64_C(0x149067EA0689AB4B), UINT64_C(0x2B9B86A097E3C680), - UINT64_C(0x96A8205561F4C7F1), UINT64_C(0xA9A3C11FF09EAA3A), - UINT64_C(0xE8BFE2C043201C67), UINT64_C(0xD7B4038AD24A71AC), - UINT64_C(0xD50F4AFE48BAE1BA), UINT64_C(0xEA04ABB4D9D08C71), - UINT64_C(0xAB18886B6A6E3A2C), UINT64_C(0x94136921FB0457E7), - UINT64_C(0x2920CFD40D135696), UINT64_C(0x162B2E9E9C793B5D), - UINT64_C(0x57370D412FC78D00), UINT64_C(0x683CEC0BBEADE0CB), - UINT64_C(0xBF88EF816CE79167), UINT64_C(0x80830ECBFD8DFCAC), - UINT64_C(0xC19F2D144E334AF1), UINT64_C(0xFE94CC5EDF59273A), - UINT64_C(0x43A76AAB294E264B), UINT64_C(0x7CAC8BE1B8244B80), - UINT64_C(0x3DB0A83E0B9AFDDD), UINT64_C(0x02BB49749AF09016), - UINT64_C(0x38C63AD73E7BDDF1), UINT64_C(0x07CDDB9DAF11B03A), - UINT64_C(0x46D1F8421CAF0667), UINT64_C(0x79DA19088DC56BAC), - UINT64_C(0xC4E9BFFD7BD26ADD), UINT64_C(0xFBE25EB7EAB80716), - UINT64_C(0xBAFE7D685906B14B), UINT64_C(0x85F59C22C86CDC80), - UINT64_C(0x52419FA81A26AD2C), UINT64_C(0x6D4A7EE28B4CC0E7), - UINT64_C(0x2C565D3D38F276BA), UINT64_C(0x135DBC77A9981B71), - UINT64_C(0xAE6E1A825F8F1A00), UINT64_C(0x9165FBC8CEE577CB), - UINT64_C(0xD079D8177D5BC196), UINT64_C(0xEF72395DEC31AC5D), - UINT64_C(0xEDC9702976C13C4B), UINT64_C(0xD2C29163E7AB5180), - UINT64_C(0x93DEB2BC5415E7DD), UINT64_C(0xACD553F6C57F8A16), - UINT64_C(0x11E6F50333688B67), UINT64_C(0x2EED1449A202E6AC), - UINT64_C(0x6FF1379611BC50F1), UINT64_C(0x50FAD6DC80D63D3A), - UINT64_C(0x874ED556529C4C96), UINT64_C(0xB845341CC3F6215D), - UINT64_C(0xF95917C370489700), UINT64_C(0xC652F689E122FACB), - UINT64_C(0x7B61507C1735FBBA), UINT64_C(0x446AB136865F9671), - UINT64_C(0x057692E935E1202C), UINT64_C(0x3A7D73A3A48B4DE7), - UINT64_C(0x718C75AE7CF7BBE2), UINT64_C(0x4E8794E4ED9DD629), - UINT64_C(0x0F9BB73B5E236074), UINT64_C(0x30905671CF490DBF), - UINT64_C(0x8DA3F084395E0CCE), UINT64_C(0xB2A811CEA8346105), - UINT64_C(0xF3B432111B8AD758), UINT64_C(0xCCBFD35B8AE0BA93), - UINT64_C(0x1B0BD0D158AACB3F), UINT64_C(0x2400319BC9C0A6F4), - UINT64_C(0x651C12447A7E10A9), UINT64_C(0x5A17F30EEB147D62), - UINT64_C(0xE72455FB1D037C13), UINT64_C(0xD82FB4B18C6911D8), - UINT64_C(0x9933976E3FD7A785), UINT64_C(0xA6387624AEBDCA4E), - UINT64_C(0xA4833F50344D5A58), UINT64_C(0x9B88DE1AA5273793), - UINT64_C(0xDA94FDC5169981CE), UINT64_C(0xE59F1C8F87F3EC05), - UINT64_C(0x58ACBA7A71E4ED74), UINT64_C(0x67A75B30E08E80BF), - UINT64_C(0x26BB78EF533036E2), UINT64_C(0x19B099A5C25A5B29), - UINT64_C(0xCE049A2F10102A85), UINT64_C(0xF10F7B65817A474E), - UINT64_C(0xB01358BA32C4F113), UINT64_C(0x8F18B9F0A3AE9CD8), - UINT64_C(0x322B1F0555B99DA9), UINT64_C(0x0D20FE4FC4D3F062), - UINT64_C(0x4C3CDD90776D463F), UINT64_C(0x73373CDAE6072BF4), - UINT64_C(0x494A4F79428C6613), UINT64_C(0x7641AE33D3E60BD8), - UINT64_C(0x375D8DEC6058BD85), UINT64_C(0x08566CA6F132D04E), - UINT64_C(0xB565CA530725D13F), UINT64_C(0x8A6E2B19964FBCF4), - UINT64_C(0xCB7208C625F10AA9), UINT64_C(0xF479E98CB49B6762), - UINT64_C(0x23CDEA0666D116CE), UINT64_C(0x1CC60B4CF7BB7B05), - UINT64_C(0x5DDA28934405CD58), UINT64_C(0x62D1C9D9D56FA093), - UINT64_C(0xDFE26F2C2378A1E2), UINT64_C(0xE0E98E66B212CC29), - UINT64_C(0xA1F5ADB901AC7A74), UINT64_C(0x9EFE4CF390C617BF), - UINT64_C(0x9C4505870A3687A9), UINT64_C(0xA34EE4CD9B5CEA62), - UINT64_C(0xE252C71228E25C3F), UINT64_C(0xDD592658B98831F4), - UINT64_C(0x606A80AD4F9F3085), UINT64_C(0x5F6161E7DEF55D4E), - UINT64_C(0x1E7D42386D4BEB13), UINT64_C(0x2176A372FC2186D8), - UINT64_C(0xF6C2A0F82E6BF774), UINT64_C(0xC9C941B2BF019ABF), - UINT64_C(0x88D5626D0CBF2CE2), UINT64_C(0xB7DE83279DD54129), - UINT64_C(0x0AED25D26BC24058), UINT64_C(0x35E6C498FAA82D93), - UINT64_C(0x74FAE74749169BCE), UINT64_C(0x4BF1060DD87CF605), - UINT64_C(0xE318EB5CF9EF77C4), UINT64_C(0xDC130A1668851A0F), - UINT64_C(0x9D0F29C9DB3BAC52), UINT64_C(0xA204C8834A51C199), - UINT64_C(0x1F376E76BC46C0E8), UINT64_C(0x203C8F3C2D2CAD23), - UINT64_C(0x6120ACE39E921B7E), UINT64_C(0x5E2B4DA90FF876B5), - UINT64_C(0x899F4E23DDB20719), UINT64_C(0xB694AF694CD86AD2), - UINT64_C(0xF7888CB6FF66DC8F), UINT64_C(0xC8836DFC6E0CB144), - UINT64_C(0x75B0CB09981BB035), UINT64_C(0x4ABB2A430971DDFE), - UINT64_C(0x0BA7099CBACF6BA3), UINT64_C(0x34ACE8D62BA50668), - UINT64_C(0x3617A1A2B155967E), UINT64_C(0x091C40E8203FFBB5), - UINT64_C(0x4800633793814DE8), UINT64_C(0x770B827D02EB2023), - UINT64_C(0xCA382488F4FC2152), UINT64_C(0xF533C5C265964C99), - UINT64_C(0xB42FE61DD628FAC4), UINT64_C(0x8B2407574742970F), - UINT64_C(0x5C9004DD9508E6A3), UINT64_C(0x639BE59704628B68), - UINT64_C(0x2287C648B7DC3D35), UINT64_C(0x1D8C270226B650FE), - UINT64_C(0xA0BF81F7D0A1518F), UINT64_C(0x9FB460BD41CB3C44), - UINT64_C(0xDEA84362F2758A19), UINT64_C(0xE1A3A228631FE7D2), - UINT64_C(0xDBDED18BC794AA35), UINT64_C(0xE4D530C156FEC7FE), - UINT64_C(0xA5C9131EE54071A3), UINT64_C(0x9AC2F254742A1C68), - UINT64_C(0x27F154A1823D1D19), UINT64_C(0x18FAB5EB135770D2), - UINT64_C(0x59E69634A0E9C68F), UINT64_C(0x66ED777E3183AB44), - UINT64_C(0xB15974F4E3C9DAE8), UINT64_C(0x8E5295BE72A3B723), - UINT64_C(0xCF4EB661C11D017E), UINT64_C(0xF045572B50776CB5), - UINT64_C(0x4D76F1DEA6606DC4), UINT64_C(0x727D1094370A000F), - UINT64_C(0x3361334B84B4B652), UINT64_C(0x0C6AD20115DEDB99), - UINT64_C(0x0ED19B758F2E4B8F), UINT64_C(0x31DA7A3F1E442644), - UINT64_C(0x70C659E0ADFA9019), UINT64_C(0x4FCDB8AA3C90FDD2), - UINT64_C(0xF2FE1E5FCA87FCA3), UINT64_C(0xCDF5FF155BED9168), - UINT64_C(0x8CE9DCCAE8532735), UINT64_C(0xB3E23D8079394AFE), - UINT64_C(0x64563E0AAB733B52), UINT64_C(0x5B5DDF403A195699), - UINT64_C(0x1A41FC9F89A7E0C4), UINT64_C(0x254A1DD518CD8D0F), - UINT64_C(0x9879BB20EEDA8C7E), UINT64_C(0xA7725A6A7FB0E1B5), - UINT64_C(0xE66E79B5CC0E57E8), UINT64_C(0xD96598FF5D643A23), - UINT64_C(0x92949EF28518CC26), UINT64_C(0xAD9F7FB81472A1ED), - UINT64_C(0xEC835C67A7CC17B0), UINT64_C(0xD388BD2D36A67A7B), - UINT64_C(0x6EBB1BD8C0B17B0A), UINT64_C(0x51B0FA9251DB16C1), - UINT64_C(0x10ACD94DE265A09C), UINT64_C(0x2FA73807730FCD57), - UINT64_C(0xF8133B8DA145BCFB), UINT64_C(0xC718DAC7302FD130), - UINT64_C(0x8604F9188391676D), UINT64_C(0xB90F185212FB0AA6), - UINT64_C(0x043CBEA7E4EC0BD7), UINT64_C(0x3B375FED7586661C), - UINT64_C(0x7A2B7C32C638D041), UINT64_C(0x45209D785752BD8A), - UINT64_C(0x479BD40CCDA22D9C), UINT64_C(0x789035465CC84057), - UINT64_C(0x398C1699EF76F60A), UINT64_C(0x0687F7D37E1C9BC1), - UINT64_C(0xBBB45126880B9AB0), UINT64_C(0x84BFB06C1961F77B), - UINT64_C(0xC5A393B3AADF4126), UINT64_C(0xFAA872F93BB52CED), - UINT64_C(0x2D1C7173E9FF5D41), UINT64_C(0x121790397895308A), - UINT64_C(0x530BB3E6CB2B86D7), UINT64_C(0x6C0052AC5A41EB1C), - UINT64_C(0xD133F459AC56EA6D), UINT64_C(0xEE3815133D3C87A6), - UINT64_C(0xAF2436CC8E8231FB), UINT64_C(0x902FD7861FE85C30), - UINT64_C(0xAA52A425BB6311D7), UINT64_C(0x9559456F2A097C1C), - UINT64_C(0xD44566B099B7CA41), UINT64_C(0xEB4E87FA08DDA78A), - UINT64_C(0x567D210FFECAA6FB), UINT64_C(0x6976C0456FA0CB30), - UINT64_C(0x286AE39ADC1E7D6D), UINT64_C(0x176102D04D7410A6), - UINT64_C(0xC0D5015A9F3E610A), UINT64_C(0xFFDEE0100E540CC1), - UINT64_C(0xBEC2C3CFBDEABA9C), UINT64_C(0x81C922852C80D757), - UINT64_C(0x3CFA8470DA97D626), UINT64_C(0x03F1653A4BFDBBED), - UINT64_C(0x42ED46E5F8430DB0), UINT64_C(0x7DE6A7AF6929607B), - UINT64_C(0x7F5DEEDBF3D9F06D), UINT64_C(0x40560F9162B39DA6), - UINT64_C(0x014A2C4ED10D2BFB), UINT64_C(0x3E41CD0440674630), - UINT64_C(0x83726BF1B6704741), UINT64_C(0xBC798ABB271A2A8A), - UINT64_C(0xFD65A96494A49CD7), UINT64_C(0xC26E482E05CEF11C), - UINT64_C(0x15DA4BA4D78480B0), UINT64_C(0x2AD1AAEE46EEED7B), - UINT64_C(0x6BCD8931F5505B26), UINT64_C(0x54C6687B643A36ED), - UINT64_C(0xE9F5CE8E922D379C), UINT64_C(0xD6FE2FC403475A57), - UINT64_C(0x97E20C1BB0F9EC0A), UINT64_C(0xA8E9ED51219381C1) - }, { - UINT64_C(0x0000000000000000), UINT64_C(0x1DEE8A5E222CA1DC), - UINT64_C(0x3BDD14BC445943B8), UINT64_C(0x26339EE26675E264), - UINT64_C(0x77BA297888B28770), UINT64_C(0x6A54A326AA9E26AC), - UINT64_C(0x4C673DC4CCEBC4C8), UINT64_C(0x5189B79AEEC76514), - UINT64_C(0xEF7452F111650EE0), UINT64_C(0xF29AD8AF3349AF3C), - UINT64_C(0xD4A9464D553C4D58), UINT64_C(0xC947CC137710EC84), - UINT64_C(0x98CE7B8999D78990), UINT64_C(0x8520F1D7BBFB284C), - UINT64_C(0xA3136F35DD8ECA28), UINT64_C(0xBEFDE56BFFA26BF4), - UINT64_C(0x4C300AC98DC40345), UINT64_C(0x51DE8097AFE8A299), - UINT64_C(0x77ED1E75C99D40FD), UINT64_C(0x6A03942BEBB1E121), - UINT64_C(0x3B8A23B105768435), UINT64_C(0x2664A9EF275A25E9), - UINT64_C(0x0057370D412FC78D), UINT64_C(0x1DB9BD5363036651), - UINT64_C(0xA34458389CA10DA5), UINT64_C(0xBEAAD266BE8DAC79), - UINT64_C(0x98994C84D8F84E1D), UINT64_C(0x8577C6DAFAD4EFC1), - UINT64_C(0xD4FE714014138AD5), UINT64_C(0xC910FB1E363F2B09), - UINT64_C(0xEF2365FC504AC96D), UINT64_C(0xF2CDEFA2726668B1), - UINT64_C(0x986015931B88068A), UINT64_C(0x858E9FCD39A4A756), - UINT64_C(0xA3BD012F5FD14532), UINT64_C(0xBE538B717DFDE4EE), - UINT64_C(0xEFDA3CEB933A81FA), UINT64_C(0xF234B6B5B1162026), - UINT64_C(0xD4072857D763C242), UINT64_C(0xC9E9A209F54F639E), - UINT64_C(0x771447620AED086A), UINT64_C(0x6AFACD3C28C1A9B6), - UINT64_C(0x4CC953DE4EB44BD2), UINT64_C(0x5127D9806C98EA0E), - UINT64_C(0x00AE6E1A825F8F1A), UINT64_C(0x1D40E444A0732EC6), - UINT64_C(0x3B737AA6C606CCA2), UINT64_C(0x269DF0F8E42A6D7E), - UINT64_C(0xD4501F5A964C05CF), UINT64_C(0xC9BE9504B460A413), - UINT64_C(0xEF8D0BE6D2154677), UINT64_C(0xF26381B8F039E7AB), - UINT64_C(0xA3EA36221EFE82BF), UINT64_C(0xBE04BC7C3CD22363), - UINT64_C(0x9837229E5AA7C107), UINT64_C(0x85D9A8C0788B60DB), - UINT64_C(0x3B244DAB87290B2F), UINT64_C(0x26CAC7F5A505AAF3), - UINT64_C(0x00F95917C3704897), UINT64_C(0x1D17D349E15CE94B), - UINT64_C(0x4C9E64D30F9B8C5F), UINT64_C(0x5170EE8D2DB72D83), - UINT64_C(0x7743706F4BC2CFE7), UINT64_C(0x6AADFA3169EE6E3B), - UINT64_C(0xA218840D981E1391), UINT64_C(0xBFF60E53BA32B24D), - UINT64_C(0x99C590B1DC475029), UINT64_C(0x842B1AEFFE6BF1F5), - UINT64_C(0xD5A2AD7510AC94E1), UINT64_C(0xC84C272B3280353D), - UINT64_C(0xEE7FB9C954F5D759), UINT64_C(0xF391339776D97685), - UINT64_C(0x4D6CD6FC897B1D71), UINT64_C(0x50825CA2AB57BCAD), - UINT64_C(0x76B1C240CD225EC9), UINT64_C(0x6B5F481EEF0EFF15), - UINT64_C(0x3AD6FF8401C99A01), UINT64_C(0x273875DA23E53BDD), - UINT64_C(0x010BEB384590D9B9), UINT64_C(0x1CE5616667BC7865), - UINT64_C(0xEE288EC415DA10D4), UINT64_C(0xF3C6049A37F6B108), - UINT64_C(0xD5F59A785183536C), UINT64_C(0xC81B102673AFF2B0), - UINT64_C(0x9992A7BC9D6897A4), UINT64_C(0x847C2DE2BF443678), - UINT64_C(0xA24FB300D931D41C), UINT64_C(0xBFA1395EFB1D75C0), - UINT64_C(0x015CDC3504BF1E34), UINT64_C(0x1CB2566B2693BFE8), - UINT64_C(0x3A81C88940E65D8C), UINT64_C(0x276F42D762CAFC50), - UINT64_C(0x76E6F54D8C0D9944), UINT64_C(0x6B087F13AE213898), - UINT64_C(0x4D3BE1F1C854DAFC), UINT64_C(0x50D56BAFEA787B20), - UINT64_C(0x3A78919E8396151B), UINT64_C(0x27961BC0A1BAB4C7), - UINT64_C(0x01A58522C7CF56A3), UINT64_C(0x1C4B0F7CE5E3F77F), - UINT64_C(0x4DC2B8E60B24926B), UINT64_C(0x502C32B8290833B7), - UINT64_C(0x761FAC5A4F7DD1D3), UINT64_C(0x6BF126046D51700F), - UINT64_C(0xD50CC36F92F31BFB), UINT64_C(0xC8E24931B0DFBA27), - UINT64_C(0xEED1D7D3D6AA5843), UINT64_C(0xF33F5D8DF486F99F), - UINT64_C(0xA2B6EA171A419C8B), UINT64_C(0xBF586049386D3D57), - UINT64_C(0x996BFEAB5E18DF33), UINT64_C(0x848574F57C347EEF), - UINT64_C(0x76489B570E52165E), UINT64_C(0x6BA611092C7EB782), - UINT64_C(0x4D958FEB4A0B55E6), UINT64_C(0x507B05B56827F43A), - UINT64_C(0x01F2B22F86E0912E), UINT64_C(0x1C1C3871A4CC30F2), - UINT64_C(0x3A2FA693C2B9D296), UINT64_C(0x27C12CCDE095734A), - UINT64_C(0x993CC9A61F3718BE), UINT64_C(0x84D243F83D1BB962), - UINT64_C(0xA2E1DD1A5B6E5B06), UINT64_C(0xBF0F57447942FADA), - UINT64_C(0xEE86E0DE97859FCE), UINT64_C(0xF3686A80B5A93E12), - UINT64_C(0xD55BF462D3DCDC76), UINT64_C(0xC8B57E3CF1F07DAA), - UINT64_C(0xD6E9A7309F3239A7), UINT64_C(0xCB072D6EBD1E987B), - UINT64_C(0xED34B38CDB6B7A1F), UINT64_C(0xF0DA39D2F947DBC3), - UINT64_C(0xA1538E481780BED7), UINT64_C(0xBCBD041635AC1F0B), - UINT64_C(0x9A8E9AF453D9FD6F), UINT64_C(0x876010AA71F55CB3), - UINT64_C(0x399DF5C18E573747), UINT64_C(0x24737F9FAC7B969B), - UINT64_C(0x0240E17DCA0E74FF), UINT64_C(0x1FAE6B23E822D523), - UINT64_C(0x4E27DCB906E5B037), UINT64_C(0x53C956E724C911EB), - UINT64_C(0x75FAC80542BCF38F), UINT64_C(0x6814425B60905253), - UINT64_C(0x9AD9ADF912F63AE2), UINT64_C(0x873727A730DA9B3E), - UINT64_C(0xA104B94556AF795A), UINT64_C(0xBCEA331B7483D886), - UINT64_C(0xED6384819A44BD92), UINT64_C(0xF08D0EDFB8681C4E), - UINT64_C(0xD6BE903DDE1DFE2A), UINT64_C(0xCB501A63FC315FF6), - UINT64_C(0x75ADFF0803933402), UINT64_C(0x6843755621BF95DE), - UINT64_C(0x4E70EBB447CA77BA), UINT64_C(0x539E61EA65E6D666), - UINT64_C(0x0217D6708B21B372), UINT64_C(0x1FF95C2EA90D12AE), - UINT64_C(0x39CAC2CCCF78F0CA), UINT64_C(0x24244892ED545116), - UINT64_C(0x4E89B2A384BA3F2D), UINT64_C(0x536738FDA6969EF1), - UINT64_C(0x7554A61FC0E37C95), UINT64_C(0x68BA2C41E2CFDD49), - UINT64_C(0x39339BDB0C08B85D), UINT64_C(0x24DD11852E241981), - UINT64_C(0x02EE8F674851FBE5), UINT64_C(0x1F0005396A7D5A39), - UINT64_C(0xA1FDE05295DF31CD), UINT64_C(0xBC136A0CB7F39011), - UINT64_C(0x9A20F4EED1867275), UINT64_C(0x87CE7EB0F3AAD3A9), - UINT64_C(0xD647C92A1D6DB6BD), UINT64_C(0xCBA943743F411761), - UINT64_C(0xED9ADD965934F505), UINT64_C(0xF07457C87B1854D9), - UINT64_C(0x02B9B86A097E3C68), UINT64_C(0x1F5732342B529DB4), - UINT64_C(0x3964ACD64D277FD0), UINT64_C(0x248A26886F0BDE0C), - UINT64_C(0x7503911281CCBB18), UINT64_C(0x68ED1B4CA3E01AC4), - UINT64_C(0x4EDE85AEC595F8A0), UINT64_C(0x53300FF0E7B9597C), - UINT64_C(0xEDCDEA9B181B3288), UINT64_C(0xF02360C53A379354), - UINT64_C(0xD610FE275C427130), UINT64_C(0xCBFE74797E6ED0EC), - UINT64_C(0x9A77C3E390A9B5F8), UINT64_C(0x879949BDB2851424), - UINT64_C(0xA1AAD75FD4F0F640), UINT64_C(0xBC445D01F6DC579C), - UINT64_C(0x74F1233D072C2A36), UINT64_C(0x691FA96325008BEA), - UINT64_C(0x4F2C37814375698E), UINT64_C(0x52C2BDDF6159C852), - UINT64_C(0x034B0A458F9EAD46), UINT64_C(0x1EA5801BADB20C9A), - UINT64_C(0x38961EF9CBC7EEFE), UINT64_C(0x257894A7E9EB4F22), - UINT64_C(0x9B8571CC164924D6), UINT64_C(0x866BFB923465850A), - UINT64_C(0xA05865705210676E), UINT64_C(0xBDB6EF2E703CC6B2), - UINT64_C(0xEC3F58B49EFBA3A6), UINT64_C(0xF1D1D2EABCD7027A), - UINT64_C(0xD7E24C08DAA2E01E), UINT64_C(0xCA0CC656F88E41C2), - UINT64_C(0x38C129F48AE82973), UINT64_C(0x252FA3AAA8C488AF), - UINT64_C(0x031C3D48CEB16ACB), UINT64_C(0x1EF2B716EC9DCB17), - UINT64_C(0x4F7B008C025AAE03), UINT64_C(0x52958AD220760FDF), - UINT64_C(0x74A614304603EDBB), UINT64_C(0x69489E6E642F4C67), - UINT64_C(0xD7B57B059B8D2793), UINT64_C(0xCA5BF15BB9A1864F), - UINT64_C(0xEC686FB9DFD4642B), UINT64_C(0xF186E5E7FDF8C5F7), - UINT64_C(0xA00F527D133FA0E3), UINT64_C(0xBDE1D8233113013F), - UINT64_C(0x9BD246C15766E35B), UINT64_C(0x863CCC9F754A4287), - UINT64_C(0xEC9136AE1CA42CBC), UINT64_C(0xF17FBCF03E888D60), - UINT64_C(0xD74C221258FD6F04), UINT64_C(0xCAA2A84C7AD1CED8), - UINT64_C(0x9B2B1FD69416ABCC), UINT64_C(0x86C59588B63A0A10), - UINT64_C(0xA0F60B6AD04FE874), UINT64_C(0xBD188134F26349A8), - UINT64_C(0x03E5645F0DC1225C), UINT64_C(0x1E0BEE012FED8380), - UINT64_C(0x383870E3499861E4), UINT64_C(0x25D6FABD6BB4C038), - UINT64_C(0x745F4D278573A52C), UINT64_C(0x69B1C779A75F04F0), - UINT64_C(0x4F82599BC12AE694), UINT64_C(0x526CD3C5E3064748), - UINT64_C(0xA0A13C6791602FF9), UINT64_C(0xBD4FB639B34C8E25), - UINT64_C(0x9B7C28DBD5396C41), UINT64_C(0x8692A285F715CD9D), - UINT64_C(0xD71B151F19D2A889), UINT64_C(0xCAF59F413BFE0955), - UINT64_C(0xECC601A35D8BEB31), UINT64_C(0xF1288BFD7FA74AED), - UINT64_C(0x4FD56E9680052119), UINT64_C(0x523BE4C8A22980C5), - UINT64_C(0x74087A2AC45C62A1), UINT64_C(0x69E6F074E670C37D), - UINT64_C(0x386F47EE08B7A669), UINT64_C(0x2581CDB02A9B07B5), - UINT64_C(0x03B253524CEEE5D1), UINT64_C(0x1E5CD90C6EC2440D) - } -}; diff --git a/software/src/xz/src/liblzma/check/crc64_tablegen.c b/software/src/xz/src/liblzma/check/crc64_tablegen.c deleted file mode 100644 index 2035127..0000000 --- a/software/src/xz/src/liblzma/check/crc64_tablegen.c +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc64_tablegen.c -/// \brief Generate crc64_table_le.h and crc64_table_be.h -/// -/// Compiling: gcc -std=c99 -o crc64_tablegen crc64_tablegen.c -/// Add -DWORDS_BIGENDIAN to generate big endian table. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include -#include "../../common/tuklib_integer.h" - - -static uint64_t crc64_table[4][256]; - - -extern void -init_crc64_table(void) -{ - static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); - - for (size_t s = 0; s < 4; ++s) { - for (size_t b = 0; b < 256; ++b) { - uint64_t r = s == 0 ? b : crc64_table[s - 1][b]; - - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly64; - else - r >>= 1; - } - - crc64_table[s][b] = r; - } - } - -#ifdef WORDS_BIGENDIAN - for (size_t s = 0; s < 4; ++s) - for (size_t b = 0; b < 256; ++b) - crc64_table[s][b] = byteswap64(crc64_table[s][b]); -#endif - - return; -} - - -static void -print_crc64_table(void) -{ - // Split the SPDX string so that it won't accidentally match - // when tools search for the string. - printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" - "// This file has been generated by crc64_tablegen.c.\n\n" - "const uint64_t lzma_crc64_table[4][256] = {\n\t{"); - - for (size_t s = 0; s < 4; ++s) { - for (size_t b = 0; b < 256; ++b) { - if ((b % 2) == 0) - printf("\n\t\t"); - - printf("UINT64_C(0x%016" PRIX64 ")", - crc64_table[s][b]); - - if (b != 255) - printf(",%s", (b+1) % 2 == 0 ? "" : " "); - } - - if (s == 3) - printf("\n\t}\n};\n"); - else - printf("\n\t}, {"); - } - - return; -} - - -int -main(void) -{ - init_crc64_table(); - print_crc64_table(); - return 0; -} diff --git a/software/src/xz/src/liblzma/check/crc64_x86.S b/software/src/xz/src/liblzma/check/crc64_x86.S deleted file mode 100644 index df50018..0000000 --- a/software/src/xz/src/liblzma/check/crc64_x86.S +++ /dev/null @@ -1,291 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/* - * Speed-optimized CRC64 using slicing-by-four algorithm - * - * This uses only i386 instructions, but it is optimized for i686 and later - * (including e.g. Pentium II/III/IV, Athlon XP, and Core 2). - * - * Authors: Igor Pavlov (original CRC32 assembly code) - * Lasse Collin (CRC64 adaptation of the modified CRC32 code) - * - * This code needs lzma_crc64_table, which can be created using the - * following C code: - -uint64_t lzma_crc64_table[4][256]; - -void -init_table(void) -{ - // ECMA-182 - static const uint64_t poly64 = UINT64_C(0xC96C5795D7870F42); - - for (size_t s = 0; s < 4; ++s) { - for (size_t b = 0; b < 256; ++b) { - uint64_t r = s == 0 ? b : lzma_crc64_table[s - 1][b]; - - for (size_t i = 0; i < 8; ++i) { - if (r & 1) - r = (r >> 1) ^ poly64; - else - r >>= 1; - } - - lzma_crc64_table[s][b] = r; - } - } -} - - * The prototype of the CRC64 function: - * extern uint64_t lzma_crc64(const uint8_t *buf, size_t size, uint64_t crc); - */ - -/* When Intel CET is enabled, include in assembly code to mark - Intel CET support. */ -#ifdef __CET__ -# include -#else -# define _CET_ENDBR -#endif - -/* - * On some systems, the functions need to be prefixed. The prefix is - * usually an underscore. - */ -#ifndef __USER_LABEL_PREFIX__ -# define __USER_LABEL_PREFIX__ -#endif -#define MAKE_SYM_CAT(prefix, sym) prefix ## sym -#define MAKE_SYM(prefix, sym) MAKE_SYM_CAT(prefix, sym) -#define LZMA_CRC64 MAKE_SYM(__USER_LABEL_PREFIX__, lzma_crc64_generic) -#define LZMA_CRC64_TABLE MAKE_SYM(__USER_LABEL_PREFIX__, lzma_crc64_table) - -/* - * Solaris assembler doesn't have .p2align, and Darwin uses .align - * differently than GNU/Linux and Solaris. - */ -#if defined(__APPLE__) || defined(__MSDOS__) -# define ALIGN(pow2, abs) .align pow2 -#else -# define ALIGN(pow2, abs) .align abs -#endif - - .text - .globl LZMA_CRC64 -#ifdef __ELF__ - .hidden LZMA_CRC64 -#endif - -#if !defined(__APPLE__) && !defined(_WIN32) && !defined(__CYGWIN__) \ - && !defined(__MSDOS__) - .type LZMA_CRC64, @function -#endif - - ALIGN(4, 16) -LZMA_CRC64: - _CET_ENDBR - /* - * Register usage: - * %eax crc LSB - * %edx crc MSB - * %esi buf - * %edi size or buf + size - * %ebx lzma_crc64_table - * %ebp Table index - * %ecx Temporary - */ - pushl %ebx - pushl %esi - pushl %edi - pushl %ebp - movl 0x14(%esp), %esi /* buf */ - movl 0x18(%esp), %edi /* size */ - movl 0x1C(%esp), %eax /* crc LSB */ - movl 0x20(%esp), %edx /* crc MSB */ - - /* - * Store the address of lzma_crc64_table to %ebx. This is needed to - * get position-independent code (PIC). - * - * The PIC macro is defined by libtool, while __PIC__ is defined - * by GCC but only on some systems. Testing for both makes it simpler - * to test this code without libtool, and keeps the code working also - * when built with libtool but using something else than GCC. - * - * I understood that libtool may define PIC on Windows even though - * the code in Windows DLLs is not PIC in sense that it is in ELF - * binaries, so we need a separate check to always use the non-PIC - * code on Windows. - */ -#if (!defined(PIC) && !defined(__PIC__)) \ - || (defined(_WIN32) || defined(__CYGWIN__)) - /* Not PIC */ - movl $ LZMA_CRC64_TABLE, %ebx -#elif defined(__APPLE__) - /* Mach-O */ - call .L_get_pc -.L_pic: - leal .L_lzma_crc64_table$non_lazy_ptr-.L_pic(%ebx), %ebx - movl (%ebx), %ebx -#else - /* ELF */ - call .L_get_pc - addl $_GLOBAL_OFFSET_TABLE_, %ebx - movl LZMA_CRC64_TABLE@GOT(%ebx), %ebx -#endif - - /* Complement the initial value. */ - notl %eax - notl %edx - -.L_align: - /* - * Check if there is enough input to use slicing-by-four. - * We need eight bytes, because the loop pre-reads four bytes. - */ - cmpl $8, %edi - jb .L_rest - - /* Check if we have reached alignment of four bytes. */ - testl $3, %esi - jz .L_slice - - /* Calculate CRC of the next input byte. */ - movzbl (%esi), %ebp - incl %esi - movzbl %al, %ecx - xorl %ecx, %ebp - shrdl $8, %edx, %eax - xorl (%ebx, %ebp, 8), %eax - shrl $8, %edx - xorl 4(%ebx, %ebp, 8), %edx - decl %edi - jmp .L_align - -.L_slice: - /* - * If we get here, there's at least eight bytes of aligned input - * available. Make %edi multiple of four bytes. Store the possible - * remainder over the "size" variable in the argument stack. - */ - movl %edi, 0x18(%esp) - andl $-4, %edi - subl %edi, 0x18(%esp) - - /* - * Let %edi be buf + size - 4 while running the main loop. This way - * we can compare for equality to determine when exit the loop. - */ - addl %esi, %edi - subl $4, %edi - - /* Read in the first four aligned bytes. */ - movl (%esi), %ecx - -.L_loop: - xorl %eax, %ecx - movzbl %cl, %ebp - movl 0x1800(%ebx, %ebp, 8), %eax - xorl %edx, %eax - movl 0x1804(%ebx, %ebp, 8), %edx - movzbl %ch, %ebp - xorl 0x1000(%ebx, %ebp, 8), %eax - xorl 0x1004(%ebx, %ebp, 8), %edx - shrl $16, %ecx - movzbl %cl, %ebp - xorl 0x0800(%ebx, %ebp, 8), %eax - xorl 0x0804(%ebx, %ebp, 8), %edx - movzbl %ch, %ebp - addl $4, %esi - xorl (%ebx, %ebp, 8), %eax - xorl 4(%ebx, %ebp, 8), %edx - - /* Check for end of aligned input. */ - cmpl %edi, %esi - - /* - * Copy the next input byte to %ecx. It is slightly faster to - * read it here than at the top of the loop. - */ - movl (%esi), %ecx - jb .L_loop - - /* - * Process the remaining four bytes, which we have already - * copied to %ecx. - */ - xorl %eax, %ecx - movzbl %cl, %ebp - movl 0x1800(%ebx, %ebp, 8), %eax - xorl %edx, %eax - movl 0x1804(%ebx, %ebp, 8), %edx - movzbl %ch, %ebp - xorl 0x1000(%ebx, %ebp, 8), %eax - xorl 0x1004(%ebx, %ebp, 8), %edx - shrl $16, %ecx - movzbl %cl, %ebp - xorl 0x0800(%ebx, %ebp, 8), %eax - xorl 0x0804(%ebx, %ebp, 8), %edx - movzbl %ch, %ebp - addl $4, %esi - xorl (%ebx, %ebp, 8), %eax - xorl 4(%ebx, %ebp, 8), %edx - - /* Copy the number of remaining bytes to %edi. */ - movl 0x18(%esp), %edi - -.L_rest: - /* Check for end of input. */ - testl %edi, %edi - jz .L_return - - /* Calculate CRC of the next input byte. */ - movzbl (%esi), %ebp - incl %esi - movzbl %al, %ecx - xorl %ecx, %ebp - shrdl $8, %edx, %eax - xorl (%ebx, %ebp, 8), %eax - shrl $8, %edx - xorl 4(%ebx, %ebp, 8), %edx - decl %edi - jmp .L_rest - -.L_return: - /* Complement the final value. */ - notl %eax - notl %edx - - popl %ebp - popl %edi - popl %esi - popl %ebx - ret - -#if defined(PIC) || defined(__PIC__) - ALIGN(4, 16) -.L_get_pc: - movl (%esp), %ebx - ret -#endif - -#if defined(__APPLE__) && (defined(PIC) || defined(__PIC__)) - /* Mach-O PIC */ - .section __IMPORT,__pointers,non_lazy_symbol_pointers -.L_lzma_crc64_table$non_lazy_ptr: - .indirect_symbol LZMA_CRC64_TABLE - .long 0 - -#elif !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSDOS__) - /* ELF */ - .size LZMA_CRC64, .-LZMA_CRC64 -#endif - -/* - * This is needed to support non-executable stack. It's ugly to - * use __FreeBSD__ and __linux__ here, but I don't know a way to detect when - * we are using GNU assembler. - */ -#if defined(__ELF__) && (defined(__FreeBSD__) || defined(__linux__)) - .section .note.GNU-stack,"",@progbits -#endif diff --git a/software/src/xz/src/liblzma/check/crc_clmul_consts_gen.c b/software/src/xz/src/liblzma/check/crc_clmul_consts_gen.c deleted file mode 100644 index 5fe14bd..0000000 --- a/software/src/xz/src/liblzma/check/crc_clmul_consts_gen.c +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc_clmul_consts_gen.c -/// \brief Generate constants for CLMUL CRC code -/// -/// Compiling: gcc -std=c99 -o crc_clmul_consts_gen crc_clmul_consts_gen.c -/// -/// This is for CRCs that use reversed bit order (bit reflection). -/// The same CLMUL CRC code can be used with CRC64 and smaller ones like -/// CRC32 apart from one special case: CRC64 needs an extra step in the -/// Barrett reduction to handle the 65th bit; the smaller ones don't. -/// Otherwise it's enough to just change the polynomial and the derived -/// constants and use the same code. -/// -/// See the Intel white paper "Fast CRC Computation for Generic Polynomials -/// Using PCLMULQDQ Instruction" from 2009. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include -#include - - -/// CRC32 (Ethernet) polynomial in reversed representation -static const uint64_t p32 = 0xedb88320; - -// CRC64 (ECMA-182) polynomial in reversed representation -static const uint64_t p64 = 0xc96c5795d7870f42; - - -/// Calculates floor(x^128 / p) where p is a CRC64 polynomial in -/// reversed representation. The result is in reversed representation too. -static uint64_t -calc_cldiv(uint64_t p) -{ - // Quotient - uint64_t q = 0; - - // Align the x^64 term with the x^128 (the implied high bits of the - // divisor and the dividend) and do the first step of polynomial long - // division, calculating the first remainder. The variable q remains - // zero because the highest bit of the quotient is an implied bit 1 - // (we kind of set q = 1 << -1). - uint64_t r = p; - - // Then process the remaining 64 terms. Note that r has no implied - // high bit, only q and p do. (And remember that a high bit in the - // polynomial is stored at a low bit in the variable due to the - // reversed bit order.) - for (unsigned i = 0; i < 64; ++i) { - q |= (r & 1) << i; - r = (r >> 1) ^ (r & 1 ? p : 0); - } - - return q; -} - - -/// Calculate the remainder of carryless division: -/// -/// x^(bits + n - 1) % p, where n=64 (for CRC64) -/// -/// p must be in reversed representation which omits the bit of -/// the highest term of the polynomial. Instead, it is an implied bit -/// at kind of like "1 << -1" position, as if it had just been shifted out. -/// -/// The return value is in the reversed bit order. (There are no implied bits.) -static uint64_t -calc_clrem(uint64_t p, unsigned bits) -{ - // Do the first step of polynomial long division. - uint64_t r = p; - - // Then process the remaining terms. Start with i = 1 instead of i = 0 - // to account for the -1 in x^(bits + n - 1). This -1 is convenient - // with the reversed bit order. See the "Bit-Reflection" section in - // the Intel white paper. - for (unsigned i = 1; i < bits; ++i) - r = (r >> 1) ^ (r & 1 ? p : 0); - - return r; -} - - -extern int -main(void) -{ - puts("// CRC64"); - - // The order of the two 64-bit constants in a vector don't matter. - // It feels logical to put them in this order as it matches the - // order in which the input bytes are read. - printf("const __m128i fold512 = _mm_set_epi64x(" - "0x%016" PRIx64 ", 0x%016" PRIx64 ");\n", - calc_clrem(p64, 4 * 128 - 64), - calc_clrem(p64, 4 * 128)); - - printf("const __m128i fold128 = _mm_set_epi64x(" - "0x%016" PRIx64 ", 0x%016" PRIx64 ");\n", - calc_clrem(p64, 128 - 64), - calc_clrem(p64, 128)); - - // When we multiply by mu, we care about the high bits of the result - // (in reversed bit order!). It doesn't matter that the low bit gets - // shifted out because the affected output bits will be ignored. - // Below we add the implied high bit with "| 1" after the shifting - // so that the high bits of the multiplication will be correct. - // - // p64 is shifted left by one so that the final multiplication - // in Barrett reduction won't be misaligned by one bit. We could - // use "(p64 << 1) | 1" instead of "p64 << 1" too but it makes - // no difference as that bit won't affect the relevant output bits - // (we only care about the lowest 64 bits of the result, that is, - // lowest in the reversed bit order). - // - // NOTE: The 65rd bit of p64 gets shifted out. It needs to be - // compensated with 64-bit shift and xor in the CRC64 code. - printf("const __m128i mu_p = _mm_set_epi64x(" - "0x%016" PRIx64 ", 0x%016" PRIx64 ");\n", - (calc_cldiv(p64) << 1) | 1, - p64 << 1); - - puts(""); - - puts("// CRC32"); - - printf("const __m128i fold512 = _mm_set_epi64x(" - "0x%08" PRIx64 ", 0x%08" PRIx64 ");\n", - calc_clrem(p32, 4 * 128 - 64), - calc_clrem(p32, 4 * 128)); - - printf("const __m128i fold128 = _mm_set_epi64x(" - "0x%08" PRIx64 ", 0x%08" PRIx64 ");\n", - calc_clrem(p32, 128 - 64), - calc_clrem(p32, 128)); - - // CRC32 calculation is done by modulus scaling it to a CRC64. - // Since the CRC is in reversed representation, only the mu - // constant changes with the modulus scaling. This method avoids - // one additional constant and one additional clmul in the final - // reduction steps, making the code both simpler and faster. - // - // p32 is shifted left by one so that the final multiplication - // in Barrett reduction won't be misaligned by one bit. We could - // use "(p32 << 1) | 1" instead of "p32 << 1" too but it makes - // no difference as that bit won't affect the relevant output bits. - // - // NOTE: The 33-bit value fits in 64 bits so, unlike with CRC64, - // there is no need to compensate for any missing bits in the code. - printf("const __m128i mu_p = _mm_set_epi64x(" - "0x%016" PRIx64 ", 0x%" PRIx64 ");\n", - (calc_cldiv(p32) << 1) | 1, - p32 << 1); - - return 0; -} diff --git a/software/src/xz/src/liblzma/check/crc_common.h b/software/src/xz/src/liblzma/check/crc_common.h deleted file mode 100644 index 7ea1e60..0000000 --- a/software/src/xz/src/liblzma/check/crc_common.h +++ /dev/null @@ -1,170 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc_common.h -/// \brief Macros and declarations for CRC32 and CRC64 -// -// Authors: Lasse Collin -// Ilya Kurdyukov -// Jia Tan -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_CRC_COMMON_H -#define LZMA_CRC_COMMON_H - -#include "common.h" - - -///////////// -// Generic // -///////////// - -#ifdef WORDS_BIGENDIAN -# define A(x) ((x) >> 24) -# define B(x) (((x) >> 16) & 0xFF) -# define C(x) (((x) >> 8) & 0xFF) -# define D(x) ((x) & 0xFF) - -# define S8(x) ((x) << 8) -# define S32(x) ((x) << 32) - -#else -# define A(x) ((x) & 0xFF) -# define B(x) (((x) >> 8) & 0xFF) -# define C(x) (((x) >> 16) & 0xFF) -# define D(x) ((x) >> 24) - -# define S8(x) ((x) >> 8) -# define S32(x) ((x) >> 32) -#endif - - -/// lzma_crc32_table[0] is needed by LZ encoder so we need to keep -/// the array two-dimensional. -#ifdef HAVE_SMALL -lzma_attr_visibility_hidden -extern uint32_t lzma_crc32_table[1][256]; - -extern void lzma_crc32_init(void); - -#else - -lzma_attr_visibility_hidden -extern const uint32_t lzma_crc32_table[8][256]; - -lzma_attr_visibility_hidden -extern const uint64_t lzma_crc64_table[4][256]; -#endif - - -/////////////////// -// Configuration // -/////////////////// - -// NOTE: This config isn't used if HAVE_SMALL is defined! - -// These are defined if the generic slicing-by-n implementations and their -// lookup tables are built. -#undef CRC32_GENERIC -#undef CRC64_GENERIC - -// These are defined if an arch-specific version is built. If both this -// and matching _GENERIC is defined then runtime detection must be used. -#undef CRC32_ARCH_OPTIMIZED -#undef CRC64_ARCH_OPTIMIZED - -// The x86 CLMUL is used for both CRC32 and CRC64. -#undef CRC_X86_CLMUL - -// Many ARM64 processor have CRC32 instructions. -// CRC64 could be done with CLMUL but it's not implemented yet. -#undef CRC32_ARM64 - -// 64-bit LoongArch has CRC32 instructions. -#undef CRC32_LOONGARCH - - -// ARM64 -// -// Keep this in sync with changes to crc32_arm64.h -#if defined(_WIN32) || defined(HAVE_GETAUXVAL) \ - || defined(HAVE_ELF_AUX_INFO) \ - || (defined(__APPLE__) && defined(HAVE_SYSCTLBYNAME)) -# define CRC_ARM64_RUNTIME_DETECTION 1 -#endif - -// ARM64 CRC32 instruction is only useful for CRC32. Currently, only -// little endian is supported since we were unable to test on a big -// endian machine. -#if defined(HAVE_ARM64_CRC32) && !defined(WORDS_BIGENDIAN) - // Allow ARM64 CRC32 instruction without a runtime check if - // __ARM_FEATURE_CRC32 is defined. GCC and Clang only define - // this if the proper compiler options are used. -# if defined(__ARM_FEATURE_CRC32) -# define CRC32_ARCH_OPTIMIZED 1 -# define CRC32_ARM64 1 -# elif defined(CRC_ARM64_RUNTIME_DETECTION) -# define CRC32_ARCH_OPTIMIZED 1 -# define CRC32_ARM64 1 -# define CRC32_GENERIC 1 -# endif -#endif - - -// LoongArch -// -// Only 64-bit LoongArch is supported for now. No runtime detection -// is needed because the LoongArch specification says that the CRC32 -// instructions are a part of the Basic Integer Instructions and -// they shall be implemented by 64-bit LoongArch implementations. -#ifdef HAVE_LOONGARCH_CRC32 -# define CRC32_ARCH_OPTIMIZED 1 -# define CRC32_LOONGARCH 1 -#endif - - -// x86 and E2K -#if defined(HAVE_USABLE_CLMUL) - // If CLMUL is allowed unconditionally in the compiler options then - // the generic version and the tables can be omitted. Exceptions: - // - // - If 32-bit x86 assembly files are enabled then those are always - // built and runtime detection is used even if compiler flags - // were set to allow CLMUL unconditionally. - // - // - This doesn't work with MSVC as I don't know how to detect - // the features here. - // -# if (defined(__SSSE3__) && defined(__SSE4_1__) && defined(__PCLMUL__) \ - && !defined(HAVE_CRC_X86_ASM)) \ - || (defined(__e2k__) && __iset__ >= 6) -# define CRC32_ARCH_OPTIMIZED 1 -# define CRC64_ARCH_OPTIMIZED 1 -# define CRC_X86_CLMUL 1 -# else -# define CRC32_GENERIC 1 -# define CRC64_GENERIC 1 -# define CRC32_ARCH_OPTIMIZED 1 -# define CRC64_ARCH_OPTIMIZED 1 -# define CRC_X86_CLMUL 1 -# endif -#endif - - -// Fallback configuration -// -// For CRC32 use the generic slice-by-eight implementation if no optimized -// version is available. -#if !defined(CRC32_ARCH_OPTIMIZED) && !defined(CRC32_GENERIC) -# define CRC32_GENERIC 1 -#endif - -// For CRC64 use the generic slice-by-four implementation if no optimized -// version is available. -#if !defined(CRC64_ARCH_OPTIMIZED) && !defined(CRC64_GENERIC) -# define CRC64_GENERIC 1 -#endif - -#endif diff --git a/software/src/xz/src/liblzma/check/crc_x86_clmul.h b/software/src/xz/src/liblzma/check/crc_x86_clmul.h deleted file mode 100644 index b302d6c..0000000 --- a/software/src/xz/src/liblzma/check/crc_x86_clmul.h +++ /dev/null @@ -1,377 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc_x86_clmul.h -/// \brief CRC32 and CRC64 implementations using CLMUL instructions. -/// -/// The CRC32 and CRC64 implementations use 32/64-bit x86 SSSE3, SSE4.1, and -/// CLMUL instructions. This is compatible with Elbrus 2000 (E2K) too. -/// -/// See the Intel white paper "Fast CRC Computation for Generic Polynomials -/// Using PCLMULQDQ Instruction" from 2009. The original file seems to be -/// gone from Intel's website but a version is available here: -/// https://www.researchgate.net/publication/263424619_Fast_CRC_computation -/// (The link was checked on 2024-06-11.) -/// -/// While this file has both CRC32 and CRC64 implementations, only one -/// can be built at a time. The version to build is selected by defining -/// BUILDING_CRC_CLMUL to 32 or 64 before including this file. -/// -/// NOTE: The x86 CLMUL CRC implementation was rewritten for XZ Utils 5.8.0. -// -// Authors: Lasse Collin -// Ilya Kurdyukov -// -/////////////////////////////////////////////////////////////////////////////// - -// This file must not be included more than once. -#ifdef LZMA_CRC_X86_CLMUL_H -# error crc_x86_clmul.h was included twice. -#endif -#define LZMA_CRC_X86_CLMUL_H - -#if BUILDING_CRC_CLMUL != 32 && BUILDING_CRC_CLMUL != 64 -# error BUILDING_CRC_CLMUL is undefined or has an invalid value -#endif - -#include - -#if defined(_MSC_VER) -# include -#elif defined(HAVE_CPUID_H) -# include -#endif - - -// EDG-based compilers (Intel's classic compiler and compiler for E2K) can -// define __GNUC__ but the attribute must not be used with them. -// The new Clang-based ICX needs the attribute. -// -// NOTE: Build systems check for this too, keep them in sync with this. -#if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__) -# define crc_attr_target \ - __attribute__((__target__("ssse3,sse4.1,pclmul"))) -#else -# define crc_attr_target -#endif - - -// GCC and Clang would produce good code with _mm_set_epi64x -// but MSVC needs _mm_cvtsi64_si128 on x86-64. -#if defined(__i386__) || defined(_M_IX86) -# define my_set_low64(a) _mm_set_epi64x(0, (a)) -#else -# define my_set_low64(a) _mm_cvtsi64_si128(a) -#endif - - -// Align it so that the whole array is within the same cache line. -// More than one unaligned load can be done from this during the -// same CRC function call. -// -// The bytes [0] to [31] are used with AND to clear the low bytes. (With ANDN -// those could be used to clear the high bytes too but it's not needed here.) -// -// The bytes [16] to [47] are for left shifts. -// The bytes [32] to [63] are for right shifts. -alignas(64) -static uint8_t vmasks[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -}; - - -// *Unaligned* 128-bit load -crc_attr_target -static inline __m128i -my_load128(const uint8_t *p) -{ - return _mm_loadu_si128((const __m128i *)p); -} - - -// Keep the highest "count" bytes as is and clear the remaining low bytes. -crc_attr_target -static inline __m128i -keep_high_bytes(__m128i v, size_t count) -{ - return _mm_and_si128(my_load128((vmasks + count)), v); -} - - -// Shift the 128-bit value left by "amount" bytes (not bits). -crc_attr_target -static inline __m128i -shift_left(__m128i v, size_t amount) -{ - return _mm_shuffle_epi8(v, my_load128((vmasks + 32 - amount))); -} - - -// Shift the 128-bit value right by "amount" bytes (not bits). -crc_attr_target -static inline __m128i -shift_right(__m128i v, size_t amount) -{ - return _mm_shuffle_epi8(v, my_load128((vmasks + 32 + amount))); -} - - -crc_attr_target -static inline __m128i -fold(__m128i v, __m128i k) -{ - __m128i a = _mm_clmulepi64_si128(v, k, 0x00); - __m128i b = _mm_clmulepi64_si128(v, k, 0x11); - return _mm_xor_si128(a, b); -} - - -crc_attr_target -static inline __m128i -fold_xor(__m128i v, __m128i k, const uint8_t *buf) -{ - return _mm_xor_si128(my_load128(buf), fold(v, k)); -} - - -#if BUILDING_CRC_CLMUL == 32 -crc_attr_target -static uint32_t -crc32_arch_optimized(const uint8_t *buf, size_t size, uint32_t crc) -#else -crc_attr_target -static uint64_t -crc64_arch_optimized(const uint8_t *buf, size_t size, uint64_t crc) -#endif -{ - // We will assume that there is at least one byte of input. - if (size == 0) - return crc; - - // See crc_clmul_consts_gen.c. -#if BUILDING_CRC_CLMUL == 32 - const __m128i fold512 = _mm_set_epi64x(0x1d9513d7, 0x8f352d95); - const __m128i fold128 = _mm_set_epi64x(0xccaa009e, 0xae689191); - const __m128i mu_p = _mm_set_epi64x( - (int64_t)0xb4e5b025f7011641, 0x1db710640); -#else - const __m128i fold512 = _mm_set_epi64x( - (int64_t)0x081f6054a7842df4, (int64_t)0x6ae3efbb9dd441f3); - - const __m128i fold128 = _mm_set_epi64x( - (int64_t)0xdabe95afc7875f40, (int64_t)0xe05dd497ca393ae4); - - const __m128i mu_p = _mm_set_epi64x( - (int64_t)0x9c3e466c172963d5, (int64_t)0x92d8af2baf0e1e84); -#endif - - __m128i v0, v1, v2, v3; - - crc = ~crc; - - if (size < 8) { - uint64_t x = crc; - size_t i = 0; - - // Checking the bit instead of comparing the size means - // that we don't need to update the size between the steps. - if (size & 4) { - x ^= read32le(buf); - buf += 4; - i = 32; - } - - if (size & 2) { - x ^= (uint64_t)read16le(buf) << i; - buf += 2; - i += 16; - } - - if (size & 1) - x ^= (uint64_t)*buf << i; - - v0 = my_set_low64((int64_t)x); - v0 = shift_left(v0, 8 - size); - - } else if (size < 16) { - v0 = my_set_low64((int64_t)(crc ^ read64le(buf))); - - // NOTE: buf is intentionally left 8 bytes behind so that - // we can read the last 1-7 bytes with read64le(buf + size). - size -= 8; - - // Handling 8-byte input specially is a speed optimization - // as the clmul can be skipped. A branch is also needed to - // avoid a too high shift amount. - if (size > 0) { - const size_t padding = 8 - size; - uint64_t high = read64le(buf + size) >> (padding * 8); - -#if defined(__i386__) || defined(_M_IX86) - // Simple but likely not the best code for 32-bit x86. - v0 = _mm_insert_epi32(v0, (int32_t)high, 2); - v0 = _mm_insert_epi32(v0, (int32_t)(high >> 32), 3); -#else - v0 = _mm_insert_epi64(v0, (int64_t)high, 1); -#endif - - v0 = shift_left(v0, padding); - - v1 = _mm_srli_si128(v0, 8); - v0 = _mm_clmulepi64_si128(v0, fold128, 0x10); - v0 = _mm_xor_si128(v0, v1); - } - } else { - v0 = my_set_low64((int64_t)crc); - - // To align or not to align the buf pointer? If the end of - // the buffer isn't aligned, aligning the pointer here would - // make us do an extra folding step with the associated byte - // shuffling overhead. The cost of that would need to be - // lower than the benefit of aligned reads. Testing on an old - // Intel Ivy Bridge processor suggested that aligning isn't - // worth the cost but it likely depends on the processor and - // buffer size. Unaligned loads (MOVDQU) should be fast on - // x86 processors that support PCLMULQDQ, so we don't align - // the buf pointer here. - - // Read the first (and possibly the only) full 16 bytes. - v0 = _mm_xor_si128(v0, my_load128(buf)); - buf += 16; - size -= 16; - - if (size >= 48) { - v1 = my_load128(buf); - v2 = my_load128(buf + 16); - v3 = my_load128(buf + 32); - buf += 48; - size -= 48; - - while (size >= 64) { - v0 = fold_xor(v0, fold512, buf); - v1 = fold_xor(v1, fold512, buf + 16); - v2 = fold_xor(v2, fold512, buf + 32); - v3 = fold_xor(v3, fold512, buf + 48); - buf += 64; - size -= 64; - } - - v0 = _mm_xor_si128(v1, fold(v0, fold128)); - v0 = _mm_xor_si128(v2, fold(v0, fold128)); - v0 = _mm_xor_si128(v3, fold(v0, fold128)); - } - - while (size >= 16) { - v0 = fold_xor(v0, fold128, buf); - buf += 16; - size -= 16; - } - - if (size > 0) { - // We want the last "size" number of input bytes to - // be at the high bits of v1. First do a full 16-byte - // load and then mask the low bytes to zeros. - v1 = my_load128(buf + size - 16); - v1 = keep_high_bytes(v1, size); - - // Shift high bytes from v0 to the low bytes of v1. - // - // Alternatively we could replace the combination - // keep_high_bytes + shift_right + _mm_or_si128 with - // _mm_shuffle_epi8 + _mm_blendv_epi8 but that would - // require larger tables for the masks. Now there are - // three loads (instead of two) from the mask tables - // but they all are from the same cache line. - v1 = _mm_or_si128(v1, shift_right(v0, size)); - - // Shift high bytes of v0 away, padding the - // low bytes with zeros. - v0 = shift_left(v0, 16 - size); - - v0 = _mm_xor_si128(v1, fold(v0, fold128)); - } - - v1 = _mm_srli_si128(v0, 8); - v0 = _mm_clmulepi64_si128(v0, fold128, 0x10); - v0 = _mm_xor_si128(v0, v1); - } - - // Barrett reduction - -#if BUILDING_CRC_CLMUL == 32 - v1 = _mm_clmulepi64_si128(v0, mu_p, 0x10); // v0 * mu - v1 = _mm_clmulepi64_si128(v1, mu_p, 0x00); // v1 * p - v0 = _mm_xor_si128(v0, v1); - return ~(uint32_t)_mm_extract_epi32(v0, 2); -#else - // Because p is 65 bits but one bit doesn't fit into the 64-bit - // half of __m128i, finish the second clmul by shifting v1 left - // by 64 bits and xorring it to the final result. - v1 = _mm_clmulepi64_si128(v0, mu_p, 0x10); // v0 * mu - v2 = _mm_slli_si128(v1, 8); - v1 = _mm_clmulepi64_si128(v1, mu_p, 0x00); // v1 * p - v0 = _mm_xor_si128(v0, v2); - v0 = _mm_xor_si128(v0, v1); -#if defined(__i386__) || defined(_M_IX86) - return ~(((uint64_t)(uint32_t)_mm_extract_epi32(v0, 3) << 32) | - (uint64_t)(uint32_t)_mm_extract_epi32(v0, 2)); -#else - return ~(uint64_t)_mm_extract_epi64(v0, 1); -#endif -#endif -} - - -// Even though this is an inline function, compile it only when needed. -// This way it won't appear in E2K builds at all. -#if defined(CRC32_GENERIC) || defined(CRC64_GENERIC) -// Inlining this function duplicates the function body in crc32_resolve() and -// crc64_resolve(), but this is acceptable because this is a tiny function. -static inline bool -is_arch_extension_supported(void) -{ - int success = 1; - uint32_t r[4]; // eax, ebx, ecx, edx - -#if defined(_MSC_VER) - // This needs with MSVC. ICC has it as a built-in - // on all platforms. - __cpuid(r, 1); -#elif defined(HAVE_CPUID_H) - // Compared to just using __asm__ to run CPUID, this also checks - // that CPUID is supported and saves and restores ebx as that is - // needed with GCC < 5 with position-independent code (PIC). - success = __get_cpuid(1, &r[0], &r[1], &r[2], &r[3]); -#else - // Just a fallback that shouldn't be needed. - __asm__("cpuid\n\t" - : "=a"(r[0]), "=b"(r[1]), "=c"(r[2]), "=d"(r[3]) - : "a"(1), "c"(0)); -#endif - - // Returns true if these are supported: - // CLMUL (bit 1 in ecx) - // SSSE3 (bit 9 in ecx) - // SSE4.1 (bit 19 in ecx) - const uint32_t ecx_mask = (1 << 1) | (1 << 9) | (1 << 19); - return success && (r[2] & ecx_mask) == ecx_mask; - - // Alternative methods that weren't used: - // - ICC's _may_i_use_cpu_feature: the other methods should work too. - // - GCC >= 6 / Clang / ICX __builtin_cpu_supports("pclmul") - // - // CPUID decoding is needed with MSVC anyway and older GCC. This keeps - // the feature checks in the build system simpler too. The nice thing - // about __builtin_cpu_supports would be that it generates very short - // code as is it only reads a variable set at startup but a few bytes - // doesn't matter here. -} -#endif diff --git a/software/src/xz/src/liblzma/check/sha256.c b/software/src/xz/src/liblzma/check/sha256.c deleted file mode 100644 index c067a3a..0000000 --- a/software/src/xz/src/liblzma/check/sha256.c +++ /dev/null @@ -1,189 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file sha256.c -/// \brief SHA-256 -// -// The C code is based on the public domain SHA-256 code found from -// Crypto++ Library 5.5.1 released in 2007: https://www.cryptopp.com/ -// A few minor tweaks have been made in liblzma. -// -// Authors: Wei Dai -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" - -// Rotate a uint32_t. GCC can optimize this to a rotate instruction -// at least on x86. -static inline uint32_t -rotr_32(uint32_t num, unsigned amount) -{ - return (num >> amount) | (num << (32 - amount)); -} - -#define blk0(i) (W[i] = conv32be(data[i])) -#define blk2(i) (W[i & 15] += s1(W[(i - 2) & 15]) + W[(i - 7) & 15] \ - + s0(W[(i - 15) & 15])) - -#define Ch(x, y, z) (z ^ (x & (y ^ z))) -#define Maj(x, y, z) ((x & (y ^ z)) + (y & z)) - -#define a(i) T[(0 - i) & 7] -#define b(i) T[(1 - i) & 7] -#define c(i) T[(2 - i) & 7] -#define d(i) T[(3 - i) & 7] -#define e(i) T[(4 - i) & 7] -#define f(i) T[(5 - i) & 7] -#define g(i) T[(6 - i) & 7] -#define h(i) T[(7 - i) & 7] - -#define R(i, j, blk) \ - h(i) += S1(e(i)) + Ch(e(i), f(i), g(i)) + SHA256_K[i + j] + blk; \ - d(i) += h(i); \ - h(i) += S0(a(i)) + Maj(a(i), b(i), c(i)) -#define R0(i) R(i, 0, blk0(i)) -#define R2(i) R(i, j, blk2(i)) - -#define S0(x) rotr_32(x ^ rotr_32(x ^ rotr_32(x, 9), 11), 2) -#define S1(x) rotr_32(x ^ rotr_32(x ^ rotr_32(x, 14), 5), 6) -#define s0(x) (rotr_32(x ^ rotr_32(x, 11), 7) ^ (x >> 3)) -#define s1(x) (rotr_32(x ^ rotr_32(x, 2), 17) ^ (x >> 10)) - - -static const uint32_t SHA256_K[64] = { - 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, - 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, - 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, - 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, - 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, - 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, - 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, - 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, - 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, - 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, - 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, - 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, - 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, - 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, - 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, - 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, -}; - - -static void -transform(uint32_t state[8], const uint32_t data[16]) -{ - uint32_t W[16]; - uint32_t T[8]; - - // Copy state[] to working vars. - memcpy(T, state, sizeof(T)); - - // The first 16 operations unrolled - R0( 0); R0( 1); R0( 2); R0( 3); - R0( 4); R0( 5); R0( 6); R0( 7); - R0( 8); R0( 9); R0(10); R0(11); - R0(12); R0(13); R0(14); R0(15); - - // The remaining 48 operations partially unrolled - for (unsigned int j = 16; j < 64; j += 16) { - R2( 0); R2( 1); R2( 2); R2( 3); - R2( 4); R2( 5); R2( 6); R2( 7); - R2( 8); R2( 9); R2(10); R2(11); - R2(12); R2(13); R2(14); R2(15); - } - - // Add the working vars back into state[]. - state[0] += a(0); - state[1] += b(0); - state[2] += c(0); - state[3] += d(0); - state[4] += e(0); - state[5] += f(0); - state[6] += g(0); - state[7] += h(0); -} - - -static void -process(lzma_check_state *check) -{ - transform(check->state.sha256.state, check->buffer.u32); - return; -} - - -extern void -lzma_sha256_init(lzma_check_state *check) -{ - static const uint32_t s[8] = { - 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, - 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19, - }; - - memcpy(check->state.sha256.state, s, sizeof(s)); - check->state.sha256.size = 0; - - return; -} - - -extern void -lzma_sha256_update(const uint8_t *buf, size_t size, lzma_check_state *check) -{ - // Copy the input data into a properly aligned temporary buffer. - // This way we can be called with arbitrarily sized buffers - // (no need to be multiple of 64 bytes), and the code works also - // on architectures that don't allow unaligned memory access. - while (size > 0) { - const size_t copy_start = check->state.sha256.size & 0x3F; - size_t copy_size = 64 - copy_start; - if (copy_size > size) - copy_size = size; - - memcpy(check->buffer.u8 + copy_start, buf, copy_size); - - buf += copy_size; - size -= copy_size; - check->state.sha256.size += copy_size; - - if ((check->state.sha256.size & 0x3F) == 0) - process(check); - } - - return; -} - - -extern void -lzma_sha256_finish(lzma_check_state *check) -{ - // Add padding as described in RFC 3174 (it describes SHA-1 but - // the same padding style is used for SHA-256 too). - size_t pos = check->state.sha256.size & 0x3F; - check->buffer.u8[pos++] = 0x80; - - while (pos != 64 - 8) { - if (pos == 64) { - process(check); - pos = 0; - } - - check->buffer.u8[pos++] = 0x00; - } - - // Convert the message size from bytes to bits. - check->state.sha256.size *= 8; - - check->buffer.u64[(64 - 8) / 8] = conv64be(check->state.sha256.size); - - process(check); - - for (size_t i = 0; i < 8; ++i) - check->buffer.u32[i] = conv32be(check->state.sha256.state[i]); - - return; -} diff --git a/software/src/xz/src/liblzma/common/Makefile.inc b/software/src/xz/src/liblzma/common/Makefile.inc deleted file mode 100644 index 51b1aae..0000000 --- a/software/src/xz/src/liblzma/common/Makefile.inc +++ /dev/null @@ -1,100 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -liblzma_la_SOURCES += \ - common/common.c \ - common/common.h \ - common/memcmplen.h \ - common/block_util.c \ - common/easy_preset.c \ - common/easy_preset.h \ - common/filter_common.c \ - common/filter_common.h \ - common/hardware_physmem.c \ - common/index.c \ - common/index.h \ - common/stream_flags_common.c \ - common/stream_flags_common.h \ - common/string_conversion.c \ - common/vli_size.c - -if COND_THREADS -liblzma_la_SOURCES += \ - common/hardware_cputhreads.c \ - common/outqueue.c \ - common/outqueue.h -endif - -if COND_MAIN_ENCODER -liblzma_la_SOURCES += \ - common/alone_encoder.c \ - common/block_buffer_encoder.c \ - common/block_buffer_encoder.h \ - common/block_encoder.c \ - common/block_encoder.h \ - common/block_header_encoder.c \ - common/easy_buffer_encoder.c \ - common/easy_encoder.c \ - common/easy_encoder_memusage.c \ - common/filter_buffer_encoder.c \ - common/filter_encoder.c \ - common/filter_encoder.h \ - common/filter_flags_encoder.c \ - common/index_encoder.c \ - common/index_encoder.h \ - common/stream_buffer_encoder.c \ - common/stream_encoder.c \ - common/stream_flags_encoder.c \ - common/vli_encoder.c - -if COND_THREADS -liblzma_la_SOURCES += \ - common/stream_encoder_mt.c -endif - -if COND_MICROLZMA -liblzma_la_SOURCES += \ - common/microlzma_encoder.c -endif -endif - -if COND_MAIN_DECODER -liblzma_la_SOURCES += \ - common/alone_decoder.c \ - common/alone_decoder.h \ - common/auto_decoder.c \ - common/block_buffer_decoder.c \ - common/block_decoder.c \ - common/block_decoder.h \ - common/block_header_decoder.c \ - common/easy_decoder_memusage.c \ - common/file_info.c \ - common/filter_buffer_decoder.c \ - common/filter_decoder.c \ - common/filter_decoder.h \ - common/filter_flags_decoder.c \ - common/index_decoder.c \ - common/index_decoder.h \ - common/index_hash.c \ - common/stream_buffer_decoder.c \ - common/stream_decoder.c \ - common/stream_decoder.h \ - common/stream_flags_decoder.c \ - common/vli_decoder.c - -if COND_THREADS -liblzma_la_SOURCES += \ - common/stream_decoder_mt.c -endif - -if COND_MICROLZMA -liblzma_la_SOURCES += \ - common/microlzma_decoder.c -endif - -if COND_LZIP_DECODER -liblzma_la_SOURCES += \ - common/lzip_decoder.c \ - common/lzip_decoder.h -endif -endif diff --git a/software/src/xz/src/liblzma/common/alone_decoder.c b/software/src/xz/src/liblzma/common/alone_decoder.c deleted file mode 100644 index e2b58e1..0000000 --- a/software/src/xz/src/liblzma/common/alone_decoder.c +++ /dev/null @@ -1,247 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_decoder.c -/// \brief Decoder for LZMA_Alone files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "alone_decoder.h" -#include "lzma_decoder.h" -#include "lz_decoder.h" - - -typedef struct { - lzma_next_coder next; - - enum { - SEQ_PROPERTIES, - SEQ_DICTIONARY_SIZE, - SEQ_UNCOMPRESSED_SIZE, - SEQ_CODER_INIT, - SEQ_CODE, - } sequence; - - /// If true, reject files that are unlikely to be .lzma files. - /// If false, more non-.lzma files get accepted and will give - /// LZMA_DATA_ERROR either immediately or after a few output bytes. - bool picky; - - /// Position in the header fields - size_t pos; - - /// Uncompressed size decoded from the header - lzma_vli uncompressed_size; - - /// Memory usage limit - uint64_t memlimit; - - /// Amount of memory actually needed (only an estimate) - uint64_t memusage; - - /// Options decoded from the header needed to initialize - /// the LZMA decoder - lzma_options_lzma options; -} lzma_alone_coder; - - -static lzma_ret -alone_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_alone_coder *coder = coder_ptr; - - while (*out_pos < out_size - && (coder->sequence == SEQ_CODE || *in_pos < in_size)) - switch (coder->sequence) { - case SEQ_PROPERTIES: - if (lzma_lzma_lclppb_decode(&coder->options, in[*in_pos])) - return LZMA_FORMAT_ERROR; - - coder->sequence = SEQ_DICTIONARY_SIZE; - ++*in_pos; - break; - - case SEQ_DICTIONARY_SIZE: - coder->options.dict_size - |= (size_t)(in[*in_pos]) << (coder->pos * 8); - - if (++coder->pos == 4) { - if (coder->picky && coder->options.dict_size - != UINT32_MAX) { - // A hack to ditch tons of false positives: - // We allow only dictionary sizes that are - // 2^n or 2^n + 2^(n-1). LZMA_Alone created - // only files with 2^n, but accepts any - // dictionary size. - uint32_t d = coder->options.dict_size - 1; - d |= d >> 2; - d |= d >> 3; - d |= d >> 4; - d |= d >> 8; - d |= d >> 16; - ++d; - - if (d != coder->options.dict_size) - return LZMA_FORMAT_ERROR; - } - - coder->pos = 0; - coder->sequence = SEQ_UNCOMPRESSED_SIZE; - } - - ++*in_pos; - break; - - case SEQ_UNCOMPRESSED_SIZE: - coder->uncompressed_size - |= (lzma_vli)(in[*in_pos]) << (coder->pos * 8); - ++*in_pos; - if (++coder->pos < 8) - break; - - // Another hack to ditch false positives: Assume that - // if the uncompressed size is known, it must be less - // than 256 GiB. - // - // FIXME? Without picky we allow > LZMA_VLI_MAX which doesn't - // really matter in this specific situation (> LZMA_VLI_MAX is - // safe in the LZMA decoder) but it's somewhat weird still. - if (coder->picky - && coder->uncompressed_size != LZMA_VLI_UNKNOWN - && coder->uncompressed_size - >= (LZMA_VLI_C(1) << 38)) - return LZMA_FORMAT_ERROR; - - // Use LZMA_FILTER_LZMA1EXT features to specify the - // uncompressed size and that the end marker is allowed - // even when the uncompressed size is known. Both .lzma - // header and LZMA1EXT use UINT64_MAX indicate that size - // is unknown. - coder->options.ext_flags = LZMA_LZMA1EXT_ALLOW_EOPM; - lzma_set_ext_size(coder->options, coder->uncompressed_size); - - // Calculate the memory usage so that it is ready - // for SEQ_CODER_INIT. - coder->memusage = lzma_lzma_decoder_memusage(&coder->options) - + LZMA_MEMUSAGE_BASE; - - coder->pos = 0; - coder->sequence = SEQ_CODER_INIT; - FALLTHROUGH; - - case SEQ_CODER_INIT: { - if (coder->memusage > coder->memlimit) - return LZMA_MEMLIMIT_ERROR; - - lzma_filter_info filters[2] = { - { - .id = LZMA_FILTER_LZMA1EXT, - .init = &lzma_lzma_decoder_init, - .options = &coder->options, - }, { - .init = NULL, - } - }; - - return_if_error(lzma_next_filter_init(&coder->next, - allocator, filters)); - - coder->sequence = SEQ_CODE; - break; - } - - case SEQ_CODE: { - return coder->next.code(coder->next.coder, - allocator, in, in_pos, in_size, - out, out_pos, out_size, action); - } - - default: - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -alone_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_alone_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -alone_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_alone_coder *coder = coder_ptr; - - *memusage = coder->memusage; - *old_memlimit = coder->memlimit; - - if (new_memlimit != 0) { - if (new_memlimit < coder->memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -extern lzma_ret -lzma_alone_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, bool picky) -{ - lzma_next_coder_init(&lzma_alone_decoder_init, next, allocator); - - lzma_alone_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_alone_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &alone_decode; - next->end = &alone_decoder_end; - next->memconfig = &alone_decoder_memconfig; - coder->next = LZMA_NEXT_CODER_INIT; - } - - coder->sequence = SEQ_PROPERTIES; - coder->picky = picky; - coder->pos = 0; - coder->options.dict_size = 0; - coder->options.preset_dict = NULL; - coder->options.preset_dict_size = 0; - coder->uncompressed_size = 0; - coder->memlimit = my_max(1, memlimit); - coder->memusage = LZMA_MEMUSAGE_BASE; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_alone_decoder(lzma_stream *strm, uint64_t memlimit) -{ - lzma_next_strm_init(lzma_alone_decoder_init, strm, memlimit, false); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/alone_decoder.h b/software/src/xz/src/liblzma/common/alone_decoder.h deleted file mode 100644 index 61ee24d..0000000 --- a/software/src/xz/src/liblzma/common/alone_decoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_decoder.h -/// \brief Decoder for LZMA_Alone files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_ALONE_DECODER_H -#define LZMA_ALONE_DECODER_H - -#include "common.h" - - -extern lzma_ret lzma_alone_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, bool picky); - -#endif diff --git a/software/src/xz/src/liblzma/common/alone_encoder.c b/software/src/xz/src/liblzma/common/alone_encoder.c deleted file mode 100644 index 21b0395..0000000 --- a/software/src/xz/src/liblzma/common/alone_encoder.c +++ /dev/null @@ -1,151 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_encoder.c -/// \brief Encoder for LZMA_Alone files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "lzma_encoder.h" - - -#define ALONE_HEADER_SIZE (1 + 4 + 8) - - -typedef struct { - lzma_next_coder next; - - enum { - SEQ_HEADER, - SEQ_CODE, - } sequence; - - size_t header_pos; - uint8_t header[ALONE_HEADER_SIZE]; -} lzma_alone_coder; - - -static lzma_ret -alone_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_alone_coder *coder = coder_ptr; - - while (*out_pos < out_size) - switch (coder->sequence) { - case SEQ_HEADER: - lzma_bufcpy(coder->header, &coder->header_pos, - ALONE_HEADER_SIZE, - out, out_pos, out_size); - if (coder->header_pos < ALONE_HEADER_SIZE) - return LZMA_OK; - - coder->sequence = SEQ_CODE; - break; - - case SEQ_CODE: - return coder->next.code(coder->next.coder, - allocator, in, in_pos, in_size, - out, out_pos, out_size, action); - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -alone_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_alone_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_options_lzma *options) -{ - lzma_next_coder_init(&alone_encoder_init, next, allocator); - - lzma_alone_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_alone_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &alone_encode; - next->end = &alone_encoder_end; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Basic initializations - coder->sequence = SEQ_HEADER; - coder->header_pos = 0; - - // Encode the header: - // - Properties (1 byte) - if (lzma_lzma_lclppb_encode(options, coder->header)) - return LZMA_OPTIONS_ERROR; - - // - Dictionary size (4 bytes) - if (options->dict_size < LZMA_DICT_SIZE_MIN) - return LZMA_OPTIONS_ERROR; - - // Round up to the next 2^n or 2^n + 2^(n - 1) depending on which - // one is the next unless it is UINT32_MAX. While the header would - // allow any 32-bit integer, we do this to keep the decoder of liblzma - // accepting the resulting files. - uint32_t d = options->dict_size - 1; - d |= d >> 2; - d |= d >> 3; - d |= d >> 4; - d |= d >> 8; - d |= d >> 16; - if (d != UINT32_MAX) - ++d; - - write32le(coder->header + 1, d); - - // - Uncompressed size (always unknown and using EOPM) - memset(coder->header + 1 + 4, 0xFF, 8); - - // Initialize the LZMA encoder. - const lzma_filter_info filters[2] = { - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_encoder_init, - .options = (void *)(options), - }, { - .init = NULL, - } - }; - - return lzma_next_filter_init(&coder->next, allocator, filters); -} - - -extern LZMA_API(lzma_ret) -lzma_alone_encoder(lzma_stream *strm, const lzma_options_lzma *options) -{ - lzma_next_strm_init(alone_encoder_init, strm, options); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/auto_decoder.c b/software/src/xz/src/liblzma/common/auto_decoder.c deleted file mode 100644 index da49345..0000000 --- a/software/src/xz/src/liblzma/common/auto_decoder.c +++ /dev/null @@ -1,204 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file auto_decoder.c -/// \brief Autodetect between .xz, .lzma (LZMA_Alone), and .lz (lzip) -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_decoder.h" -#include "alone_decoder.h" -#ifdef HAVE_LZIP_DECODER -# include "lzip_decoder.h" -#endif - - -typedef struct { - /// .xz Stream decoder, LZMA_Alone decoder, or lzip decoder - lzma_next_coder next; - - uint64_t memlimit; - uint32_t flags; - - enum { - SEQ_INIT, - SEQ_CODE, - SEQ_FINISH, - } sequence; -} lzma_auto_coder; - - -static lzma_ret -auto_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_auto_coder *coder = coder_ptr; - - switch (coder->sequence) { - case SEQ_INIT: - if (*in_pos >= in_size) - return LZMA_OK; - - // Update the sequence now, because we want to continue from - // SEQ_CODE even if we return some LZMA_*_CHECK. - coder->sequence = SEQ_CODE; - - // Detect the file format. .xz files start with 0xFD which - // cannot be the first byte of .lzma (LZMA_Alone) format. - // The .lz format starts with 0x4C which could be the - // first byte of a .lzma file but luckily it would mean - // lc/lp/pb being 4/3/1 which liblzma doesn't support because - // lc + lp > 4. So using just 0x4C to detect .lz is OK here. - if (in[*in_pos] == 0xFD) { - return_if_error(lzma_stream_decoder_init( - &coder->next, allocator, - coder->memlimit, coder->flags)); -#ifdef HAVE_LZIP_DECODER - } else if (in[*in_pos] == 0x4C) { - return_if_error(lzma_lzip_decoder_init( - &coder->next, allocator, - coder->memlimit, coder->flags)); -#endif - } else { - return_if_error(lzma_alone_decoder_init(&coder->next, - allocator, coder->memlimit, true)); - - // If the application wants to know about missing - // integrity check or about the check in general, we - // need to handle it here, because LZMA_Alone decoder - // doesn't accept any flags. - if (coder->flags & LZMA_TELL_NO_CHECK) - return LZMA_NO_CHECK; - - if (coder->flags & LZMA_TELL_ANY_CHECK) - return LZMA_GET_CHECK; - } - - FALLTHROUGH; - - case SEQ_CODE: { - const lzma_ret ret = coder->next.code( - coder->next.coder, allocator, - in, in_pos, in_size, - out, out_pos, out_size, action); - if (ret != LZMA_STREAM_END - || (coder->flags & LZMA_CONCATENATED) == 0) - return ret; - - coder->sequence = SEQ_FINISH; - FALLTHROUGH; - } - - case SEQ_FINISH: - // When LZMA_CONCATENATED was used and we were decoding - // a LZMA_Alone file, we need to check that there is no - // trailing garbage and wait for LZMA_FINISH. - if (*in_pos < in_size) - return LZMA_DATA_ERROR; - - return action == LZMA_FINISH ? LZMA_STREAM_END : LZMA_OK; - - default: - assert(0); - return LZMA_PROG_ERROR; - } -} - - -static void -auto_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_auto_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_check -auto_decoder_get_check(const void *coder_ptr) -{ - const lzma_auto_coder *coder = coder_ptr; - - // It is LZMA_Alone if get_check is NULL. - return coder->next.get_check == NULL ? LZMA_CHECK_NONE - : coder->next.get_check(coder->next.coder); -} - - -static lzma_ret -auto_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_auto_coder *coder = coder_ptr; - - lzma_ret ret; - - if (coder->next.memconfig != NULL) { - ret = coder->next.memconfig(coder->next.coder, - memusage, old_memlimit, new_memlimit); - assert(*old_memlimit == coder->memlimit); - } else { - // No coder is configured yet. Use the base value as - // the current memory usage. - *memusage = LZMA_MEMUSAGE_BASE; - *old_memlimit = coder->memlimit; - - ret = LZMA_OK; - if (new_memlimit != 0 && new_memlimit < *memusage) - ret = LZMA_MEMLIMIT_ERROR; - } - - if (ret == LZMA_OK && new_memlimit != 0) - coder->memlimit = new_memlimit; - - return ret; -} - - -static lzma_ret -auto_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, uint32_t flags) -{ - lzma_next_coder_init(&auto_decoder_init, next, allocator); - - if (flags & ~LZMA_SUPPORTED_FLAGS) - return LZMA_OPTIONS_ERROR; - - lzma_auto_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_auto_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &auto_decode; - next->end = &auto_decoder_end; - next->get_check = &auto_decoder_get_check; - next->memconfig = &auto_decoder_memconfig; - coder->next = LZMA_NEXT_CODER_INIT; - } - - coder->memlimit = my_max(1, memlimit); - coder->flags = flags; - coder->sequence = SEQ_INIT; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_auto_decoder(lzma_stream *strm, uint64_t memlimit, uint32_t flags) -{ - lzma_next_strm_init(auto_decoder_init, strm, memlimit, flags); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/block_buffer_decoder.c b/software/src/xz/src/liblzma/common/block_buffer_decoder.c deleted file mode 100644 index 55566cd..0000000 --- a/software/src/xz/src/liblzma/common/block_buffer_decoder.c +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_buffer_decoder.c -/// \brief Single-call .xz Block decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "block_decoder.h" - - -extern LZMA_API(lzma_ret) -lzma_block_buffer_decode(lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - if (in_pos == NULL || (in == NULL && *in_pos != in_size) - || *in_pos > in_size || out_pos == NULL - || (out == NULL && *out_pos != out_size) - || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // Initialize the Block decoder. - lzma_next_coder block_decoder = LZMA_NEXT_CODER_INIT; - lzma_ret ret = lzma_block_decoder_init( - &block_decoder, allocator, block); - - if (ret == LZMA_OK) { - // Save the positions so that we can restore them in case - // an error occurs. - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - // Do the actual decoding. - ret = block_decoder.code(block_decoder.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - LZMA_FINISH); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - if (ret == LZMA_OK) { - // Either the input was truncated or the - // output buffer was too small. - assert(*in_pos == in_size - || *out_pos == out_size); - - // If all the input was consumed, then the - // input is truncated, even if the output - // buffer is also full. This is because - // processing the last byte of the Block - // never produces output. - // - // NOTE: This assumption may break when new - // filters are added, if the end marker of - // the filter doesn't consume at least one - // complete byte. - if (*in_pos == in_size) - ret = LZMA_DATA_ERROR; - else - ret = LZMA_BUF_ERROR; - } - - // Restore the positions. - *in_pos = in_start; - *out_pos = out_start; - } - } - - // Free the decoder memory. This needs to be done even if - // initialization fails, because the internal API doesn't - // require the initialization function to free its memory on error. - lzma_next_end(&block_decoder, allocator); - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/block_buffer_encoder.c b/software/src/xz/src/liblzma/common/block_buffer_encoder.c deleted file mode 100644 index df3b90e..0000000 --- a/software/src/xz/src/liblzma/common/block_buffer_encoder.c +++ /dev/null @@ -1,354 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_buffer_encoder.c -/// \brief Single-call .xz Block encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "block_buffer_encoder.h" -#include "block_encoder.h" -#include "filter_encoder.h" -#include "lzma2_encoder.h" -#include "check.h" - - -/// Estimate the maximum size of the Block Header and Check fields for -/// a Block that uses LZMA2 uncompressed chunks. We could use -/// lzma_block_header_size() but this is simpler. -/// -/// Block Header Size + Block Flags + Compressed Size -/// + Uncompressed Size + Filter Flags for LZMA2 + CRC32 + Check -/// and round up to the next multiple of four to take Header Padding -/// into account. -#define HEADERS_BOUND ((1 + 1 + 2 * LZMA_VLI_BYTES_MAX + 3 + 4 \ - + LZMA_CHECK_SIZE_MAX + 3) & ~3) - - -static uint64_t -lzma2_bound(uint64_t uncompressed_size) -{ - // Prevent integer overflow in overhead calculation. - if (uncompressed_size > COMPRESSED_SIZE_MAX) - return 0; - - // Calculate the exact overhead of the LZMA2 headers: Round - // uncompressed_size up to the next multiple of LZMA2_CHUNK_MAX, - // multiply by the size of per-chunk header, and add one byte for - // the end marker. - const uint64_t overhead = ((uncompressed_size + LZMA2_CHUNK_MAX - 1) - / LZMA2_CHUNK_MAX) - * LZMA2_HEADER_UNCOMPRESSED + 1; - - // Catch the possible integer overflow. - if (COMPRESSED_SIZE_MAX - overhead < uncompressed_size) - return 0; - - return uncompressed_size + overhead; -} - - -extern uint64_t -lzma_block_buffer_bound64(uint64_t uncompressed_size) -{ - // If the data doesn't compress, we always use uncompressed - // LZMA2 chunks. - uint64_t lzma2_size = lzma2_bound(uncompressed_size); - if (lzma2_size == 0) - return 0; - - // Take Block Padding into account. - lzma2_size = (lzma2_size + 3) & ~UINT64_C(3); - - // No risk of integer overflow because lzma2_bound() already takes - // into account the size of the headers in the Block. - return HEADERS_BOUND + lzma2_size; -} - - -extern LZMA_API(size_t) -lzma_block_buffer_bound(size_t uncompressed_size) -{ - uint64_t ret = lzma_block_buffer_bound64(uncompressed_size); - -#if SIZE_MAX < UINT64_MAX - // Catch the possible integer overflow on 32-bit systems. - if (ret > SIZE_MAX) - return 0; -#endif - - return ret; -} - - -static lzma_ret -block_encode_uncompressed(lzma_block *block, const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Use LZMA2 uncompressed chunks. We wouldn't need a dictionary at - // all, but LZMA2 always requires a dictionary, so use the minimum - // value to minimize memory usage of the decoder. - lzma_options_lzma lzma2 = { - .dict_size = LZMA_DICT_SIZE_MIN, - }; - - lzma_filter filters[2]; - filters[0].id = LZMA_FILTER_LZMA2; - filters[0].options = &lzma2; - filters[1].id = LZMA_VLI_UNKNOWN; - - // Set the above filter options to *block temporarily so that we can - // encode the Block Header. - lzma_filter *filters_orig = block->filters; - block->filters = filters; - - if (lzma_block_header_size(block) != LZMA_OK) { - block->filters = filters_orig; - return LZMA_PROG_ERROR; - } - - // Check that there's enough output space. The caller has already - // set block->compressed_size to what lzma2_bound() has returned, - // so we can reuse that value. We know that compressed_size is a - // known valid VLI and header_size is a small value so their sum - // will never overflow. - assert(block->compressed_size == lzma2_bound(in_size)); - if (out_size - *out_pos - < block->header_size + block->compressed_size) { - block->filters = filters_orig; - return LZMA_BUF_ERROR; - } - - if (lzma_block_header_encode(block, out + *out_pos) != LZMA_OK) { - block->filters = filters_orig; - return LZMA_PROG_ERROR; - } - - block->filters = filters_orig; - *out_pos += block->header_size; - - // Encode the data using LZMA2 uncompressed chunks. - size_t in_pos = 0; - uint8_t control = 0x01; // Dictionary reset - - while (in_pos < in_size) { - // Control byte: Indicate uncompressed chunk, of which - // the first resets the dictionary. - out[(*out_pos)++] = control; - control = 0x02; // No dictionary reset - - // Size of the uncompressed chunk - const size_t copy_size - = my_min(in_size - in_pos, LZMA2_CHUNK_MAX); - out[(*out_pos)++] = (copy_size - 1) >> 8; - out[(*out_pos)++] = (copy_size - 1) & 0xFF; - - // The actual data - assert(*out_pos + copy_size <= out_size); - memcpy(out + *out_pos, in + in_pos, copy_size); - - in_pos += copy_size; - *out_pos += copy_size; - } - - // End marker - out[(*out_pos)++] = 0x00; - assert(*out_pos <= out_size); - - return LZMA_OK; -} - - -static lzma_ret -block_encode_normal(lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Find out the size of the Block Header. - return_if_error(lzma_block_header_size(block)); - - // Reserve space for the Block Header and skip it for now. - if (out_size - *out_pos <= block->header_size) - return LZMA_BUF_ERROR; - - const size_t out_start = *out_pos; - *out_pos += block->header_size; - - // Limit out_size so that we stop encoding if the output would grow - // bigger than what uncompressed Block would be. - if (out_size - *out_pos > block->compressed_size) - out_size = *out_pos + block->compressed_size; - - // TODO: In many common cases this could be optimized to use - // significantly less memory. - lzma_next_coder raw_encoder = LZMA_NEXT_CODER_INIT; - lzma_ret ret = lzma_raw_encoder_init( - &raw_encoder, allocator, block->filters); - - if (ret == LZMA_OK) { - size_t in_pos = 0; - ret = raw_encoder.code(raw_encoder.coder, allocator, - in, &in_pos, in_size, out, out_pos, out_size, - LZMA_FINISH); - } - - // NOTE: This needs to be run even if lzma_raw_encoder_init() failed. - lzma_next_end(&raw_encoder, allocator); - - if (ret == LZMA_STREAM_END) { - // Compression was successful. Write the Block Header. - block->compressed_size - = *out_pos - (out_start + block->header_size); - ret = lzma_block_header_encode(block, out + out_start); - if (ret != LZMA_OK) - ret = LZMA_PROG_ERROR; - - } else if (ret == LZMA_OK) { - // Output buffer became full. - ret = LZMA_BUF_ERROR; - } - - // Reset *out_pos if something went wrong. - if (ret != LZMA_OK) - *out_pos = out_start; - - return ret; -} - - -static lzma_ret -block_buffer_encode(lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size, - bool try_to_compress) -{ - // Validate the arguments. - if (block == NULL || (in == NULL && in_size != 0) || out == NULL - || out_pos == NULL || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // The contents of the structure may depend on the version so - // check the version before validating the contents of *block. - if (block->version > 1) - return LZMA_OPTIONS_ERROR; - - if ((unsigned int)(block->check) > LZMA_CHECK_ID_MAX - || (try_to_compress && block->filters == NULL)) - return LZMA_PROG_ERROR; - - if (!lzma_check_is_supported(block->check)) - return LZMA_UNSUPPORTED_CHECK; - - // Size of a Block has to be a multiple of four, so limit the size - // here already. This way we don't need to check it again when adding - // Block Padding. - out_size -= (out_size - *out_pos) & 3; - - // Get the size of the Check field. - const size_t check_size = lzma_check_size(block->check); - assert(check_size != UINT32_MAX); - - // Reserve space for the Check field. - if (out_size - *out_pos <= check_size) - return LZMA_BUF_ERROR; - - out_size -= check_size; - - // Initialize block->uncompressed_size and calculate the worst-case - // value for block->compressed_size. - block->uncompressed_size = in_size; - block->compressed_size = lzma2_bound(in_size); - if (block->compressed_size == 0) - return LZMA_DATA_ERROR; - - // Do the actual compression. - lzma_ret ret = LZMA_BUF_ERROR; - if (try_to_compress) - ret = block_encode_normal(block, allocator, - in, in_size, out, out_pos, out_size); - - if (ret != LZMA_OK) { - // If the error was something else than output buffer - // becoming full, return the error now. - if (ret != LZMA_BUF_ERROR) - return ret; - - // The data was incompressible (at least with the options - // given to us) or the output buffer was too small. Use the - // uncompressed chunks of LZMA2 to wrap the data into a valid - // Block. If we haven't been given enough output space, even - // this may fail. - return_if_error(block_encode_uncompressed(block, in, in_size, - out, out_pos, out_size)); - } - - assert(*out_pos <= out_size); - - // Block Padding. No buffer overflow here, because we already adjusted - // out_size so that (out_size - out_start) is a multiple of four. - // Thus, if the buffer is full, the loop body can never run. - for (size_t i = (size_t)(block->compressed_size); i & 3; ++i) { - assert(*out_pos < out_size); - out[(*out_pos)++] = 0x00; - } - - // If there's no Check field, we are done now. - if (check_size > 0) { - // Calculate the integrity check. We reserved space for - // the Check field earlier so we don't need to check for - // available output space here. - lzma_check_state check; - lzma_check_init(&check, block->check); - lzma_check_update(&check, block->check, in, in_size); - lzma_check_finish(&check, block->check); - - memcpy(block->raw_check, check.buffer.u8, check_size); - memcpy(out + *out_pos, check.buffer.u8, check_size); - *out_pos += check_size; - } - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_block_buffer_encode(lzma_block *block, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - return block_buffer_encode(block, allocator, - in, in_size, out, out_pos, out_size, true); -} - - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -// This is for compatibility with binaries linked against liblzma that -// has been patched with xz-5.2.2-compat-libs.patch from RHEL/CentOS 7. -LZMA_SYMVER_API("lzma_block_uncomp_encode@XZ_5.2.2", - lzma_ret, lzma_block_uncomp_encode_522)(lzma_block *block, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result - __attribute__((__alias__("lzma_block_uncomp_encode_52"))); - -LZMA_SYMVER_API("lzma_block_uncomp_encode@@XZ_5.2", - lzma_ret, lzma_block_uncomp_encode_52)(lzma_block *block, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - -#define lzma_block_uncomp_encode lzma_block_uncomp_encode_52 -#endif -extern LZMA_API(lzma_ret) -lzma_block_uncomp_encode(lzma_block *block, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // It won't allocate any memory from heap so no need - // for lzma_allocator. - return block_buffer_encode(block, NULL, - in, in_size, out, out_pos, out_size, false); -} diff --git a/software/src/xz/src/liblzma/common/block_buffer_encoder.h b/software/src/xz/src/liblzma/common/block_buffer_encoder.h deleted file mode 100644 index 5274ac4..0000000 --- a/software/src/xz/src/liblzma/common/block_buffer_encoder.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_buffer_encoder.h -/// \brief Single-call .xz Block encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_BLOCK_BUFFER_ENCODER_H -#define LZMA_BLOCK_BUFFER_ENCODER_H - -#include "common.h" - - -/// uint64_t version of lzma_block_buffer_bound(). It is used by -/// stream_encoder_mt.c. Probably the original lzma_block_buffer_bound() -/// should have been 64-bit, but fixing it would break the ABI. -extern uint64_t lzma_block_buffer_bound64(uint64_t uncompressed_size); - -#endif diff --git a/software/src/xz/src/liblzma/common/block_decoder.c b/software/src/xz/src/liblzma/common/block_decoder.c deleted file mode 100644 index bbc9f55..0000000 --- a/software/src/xz/src/liblzma/common/block_decoder.c +++ /dev/null @@ -1,286 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_decoder.c -/// \brief Decodes .xz Blocks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "block_decoder.h" -#include "filter_decoder.h" -#include "check.h" - - -typedef struct { - enum { - SEQ_CODE, - SEQ_PADDING, - SEQ_CHECK, - } sequence; - - /// The filters in the chain; initialized with lzma_raw_decoder_init(). - lzma_next_coder next; - - /// Decoding options; we also write Compressed Size and Uncompressed - /// Size back to this structure when the decoding has been finished. - lzma_block *block; - - /// Compressed Size calculated while decoding - lzma_vli compressed_size; - - /// Uncompressed Size calculated while decoding - lzma_vli uncompressed_size; - - /// Maximum allowed Compressed Size; this takes into account the - /// size of the Block Header and Check fields when Compressed Size - /// is unknown. - lzma_vli compressed_limit; - - /// Maximum allowed Uncompressed Size. - lzma_vli uncompressed_limit; - - /// Position when reading the Check field - size_t check_pos; - - /// Check of the uncompressed data - lzma_check_state check; - - /// True if the integrity check won't be calculated and verified. - bool ignore_check; -} lzma_block_coder; - - -static inline bool -is_size_valid(lzma_vli size, lzma_vli reference) -{ - return reference == LZMA_VLI_UNKNOWN || reference == size; -} - - -static lzma_ret -block_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_block_coder *coder = coder_ptr; - - switch (coder->sequence) { - case SEQ_CODE: { - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - // Limit the amount of input and output space that we give - // to the raw decoder based on the information we have - // (or don't have) from Block Header. - const size_t in_stop = *in_pos + (size_t)my_min( - in_size - *in_pos, - coder->compressed_limit - coder->compressed_size); - const size_t out_stop = *out_pos + (size_t)my_min( - out_size - *out_pos, - coder->uncompressed_limit - coder->uncompressed_size); - - const lzma_ret ret = coder->next.code(coder->next.coder, - allocator, in, in_pos, in_stop, - out, out_pos, out_stop, action); - - const size_t in_used = *in_pos - in_start; - const size_t out_used = *out_pos - out_start; - - // Because we have limited the input and output sizes, - // we know that these cannot grow too big or overflow. - coder->compressed_size += in_used; - coder->uncompressed_size += out_used; - - if (ret == LZMA_OK) { - const bool comp_done = coder->compressed_size - == coder->block->compressed_size; - const bool uncomp_done = coder->uncompressed_size - == coder->block->uncompressed_size; - - // If both input and output amounts match the sizes - // in Block Header but we still got LZMA_OK instead - // of LZMA_STREAM_END, the file is broken. - if (comp_done && uncomp_done) - return LZMA_DATA_ERROR; - - // If the decoder has consumed all the input that it - // needs but it still couldn't fill the output buffer - // or return LZMA_STREAM_END, the file is broken. - if (comp_done && *out_pos < out_size) - return LZMA_DATA_ERROR; - - // If the decoder has produced all the output but - // it still didn't return LZMA_STREAM_END or consume - // more input (for example, detecting an end of - // payload marker may need more input but produce - // no output) the file is broken. - if (uncomp_done && *in_pos < in_size) - return LZMA_DATA_ERROR; - } - - // Don't waste time updating the integrity check if it will be - // ignored. Also skip it if no new output was produced. This - // avoids null pointer + 0 (undefined behavior) when out == 0. - if (!coder->ignore_check && out_used > 0) - lzma_check_update(&coder->check, coder->block->check, - out + out_start, out_used); - - if (ret != LZMA_STREAM_END) - return ret; - - // Compressed and Uncompressed Sizes are now at their final - // values. Verify that they match the values given to us. - if (!is_size_valid(coder->compressed_size, - coder->block->compressed_size) - || !is_size_valid(coder->uncompressed_size, - coder->block->uncompressed_size)) - return LZMA_DATA_ERROR; - - // Copy the values into coder->block. The caller - // may use this information to construct Index. - coder->block->compressed_size = coder->compressed_size; - coder->block->uncompressed_size = coder->uncompressed_size; - - coder->sequence = SEQ_PADDING; - FALLTHROUGH; - } - - case SEQ_PADDING: - // Compressed Data is padded to a multiple of four bytes. - while (coder->compressed_size & 3) { - if (*in_pos >= in_size) - return LZMA_OK; - - // We use compressed_size here just get the Padding - // right. The actual Compressed Size was stored to - // coder->block already, and won't be modified by - // us anymore. - ++coder->compressed_size; - - if (in[(*in_pos)++] != 0x00) - return LZMA_DATA_ERROR; - } - - if (coder->block->check == LZMA_CHECK_NONE) - return LZMA_STREAM_END; - - if (!coder->ignore_check) - lzma_check_finish(&coder->check, coder->block->check); - - coder->sequence = SEQ_CHECK; - FALLTHROUGH; - - case SEQ_CHECK: { - const size_t check_size = lzma_check_size(coder->block->check); - lzma_bufcpy(in, in_pos, in_size, coder->block->raw_check, - &coder->check_pos, check_size); - if (coder->check_pos < check_size) - return LZMA_OK; - - // Validate the Check only if we support it. - // coder->check.buffer may be uninitialized - // when the Check ID is not supported. - if (!coder->ignore_check - && lzma_check_is_supported(coder->block->check) - && memcmp(coder->block->raw_check, - coder->check.buffer.u8, - check_size) != 0) - return LZMA_DATA_ERROR; - - return LZMA_STREAM_END; - } - } - - return LZMA_PROG_ERROR; -} - - -static void -block_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_block_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -extern lzma_ret -lzma_block_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - lzma_block *block) -{ - lzma_next_coder_init(&lzma_block_decoder_init, next, allocator); - - // Validate the options. lzma_block_unpadded_size() does that for us - // except for Uncompressed Size and filters. Filters are validated - // by the raw decoder. - if (lzma_block_unpadded_size(block) == 0 - || !lzma_vli_is_valid(block->uncompressed_size)) - return LZMA_PROG_ERROR; - - // Allocate *next->coder if needed. - lzma_block_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_block_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &block_decode; - next->end = &block_decoder_end; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Basic initializations - coder->sequence = SEQ_CODE; - coder->block = block; - coder->compressed_size = 0; - coder->uncompressed_size = 0; - - // If Compressed Size is not known, we calculate the maximum allowed - // value so that encoded size of the Block (including Block Padding) - // is still a valid VLI and a multiple of four. - coder->compressed_limit - = block->compressed_size == LZMA_VLI_UNKNOWN - ? (LZMA_VLI_MAX & ~LZMA_VLI_C(3)) - - block->header_size - - lzma_check_size(block->check) - : block->compressed_size; - - // With Uncompressed Size this is simpler. If Block Header lacks - // the size info, then LZMA_VLI_MAX is the maximum possible - // Uncompressed Size. - coder->uncompressed_limit - = block->uncompressed_size == LZMA_VLI_UNKNOWN - ? LZMA_VLI_MAX - : block->uncompressed_size; - - // Initialize the check. It's caller's problem if the Check ID is not - // supported, and the Block decoder cannot verify the Check field. - // Caller can test lzma_check_is_supported(block->check). - coder->check_pos = 0; - lzma_check_init(&coder->check, block->check); - - coder->ignore_check = block->version >= 1 - ? block->ignore_check : false; - - // Initialize the filter chain. - return lzma_raw_decoder_init(&coder->next, allocator, - block->filters); -} - - -extern LZMA_API(lzma_ret) -lzma_block_decoder(lzma_stream *strm, lzma_block *block) -{ - lzma_next_strm_init(lzma_block_decoder_init, strm, block); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/block_decoder.h b/software/src/xz/src/liblzma/common/block_decoder.h deleted file mode 100644 index 2cbf9ba..0000000 --- a/software/src/xz/src/liblzma/common/block_decoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_decoder.h -/// \brief Decodes .xz Blocks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_BLOCK_DECODER_H -#define LZMA_BLOCK_DECODER_H - -#include "common.h" - - -extern lzma_ret lzma_block_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, lzma_block *block); - -#endif diff --git a/software/src/xz/src/liblzma/common/block_encoder.c b/software/src/xz/src/liblzma/common/block_encoder.c deleted file mode 100644 index eb7997a..0000000 --- a/software/src/xz/src/liblzma/common/block_encoder.c +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_encoder.c -/// \brief Encodes .xz Blocks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "block_encoder.h" -#include "filter_encoder.h" -#include "check.h" - - -typedef struct { - /// The filters in the chain; initialized with lzma_raw_decoder_init(). - lzma_next_coder next; - - /// Encoding options; we also write Unpadded Size, Compressed Size, - /// and Uncompressed Size back to this structure when the encoding - /// has been finished. - lzma_block *block; - - enum { - SEQ_CODE, - SEQ_PADDING, - SEQ_CHECK, - } sequence; - - /// Compressed Size calculated while encoding - lzma_vli compressed_size; - - /// Uncompressed Size calculated while encoding - lzma_vli uncompressed_size; - - /// Position in the Check field - size_t pos; - - /// Check of the uncompressed data - lzma_check_state check; -} lzma_block_coder; - - -static lzma_ret -block_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_block_coder *coder = coder_ptr; - - // Check that our amount of input stays in proper limits. - if (LZMA_VLI_MAX - coder->uncompressed_size < in_size - *in_pos) - return LZMA_DATA_ERROR; - - switch (coder->sequence) { - case SEQ_CODE: { - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - const lzma_ret ret = coder->next.code(coder->next.coder, - allocator, in, in_pos, in_size, - out, out_pos, out_size, action); - - const size_t in_used = *in_pos - in_start; - const size_t out_used = *out_pos - out_start; - - if (COMPRESSED_SIZE_MAX - coder->compressed_size < out_used) - return LZMA_DATA_ERROR; - - coder->compressed_size += out_used; - - // No need to check for overflow because we have already - // checked it at the beginning of this function. - coder->uncompressed_size += in_used; - - // Call lzma_check_update() only if input was consumed. This - // avoids null pointer + 0 (undefined behavior) when in == 0. - if (in_used > 0) - lzma_check_update(&coder->check, coder->block->check, - in + in_start, in_used); - - if (ret != LZMA_STREAM_END || action == LZMA_SYNC_FLUSH) - return ret; - - assert(*in_pos == in_size); - assert(action == LZMA_FINISH); - - // Copy the values into coder->block. The caller - // may use this information to construct Index. - coder->block->compressed_size = coder->compressed_size; - coder->block->uncompressed_size = coder->uncompressed_size; - - coder->sequence = SEQ_PADDING; - FALLTHROUGH; - } - - case SEQ_PADDING: - // Pad Compressed Data to a multiple of four bytes. We can - // use coder->compressed_size for this since we don't need - // it for anything else anymore. - while (coder->compressed_size & 3) { - if (*out_pos >= out_size) - return LZMA_OK; - - out[*out_pos] = 0x00; - ++*out_pos; - ++coder->compressed_size; - } - - if (coder->block->check == LZMA_CHECK_NONE) - return LZMA_STREAM_END; - - lzma_check_finish(&coder->check, coder->block->check); - - coder->sequence = SEQ_CHECK; - FALLTHROUGH; - - case SEQ_CHECK: { - const size_t check_size = lzma_check_size(coder->block->check); - lzma_bufcpy(coder->check.buffer.u8, &coder->pos, check_size, - out, out_pos, out_size); - if (coder->pos < check_size) - return LZMA_OK; - - memcpy(coder->block->raw_check, coder->check.buffer.u8, - check_size); - return LZMA_STREAM_END; - } - } - - return LZMA_PROG_ERROR; -} - - -static void -block_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_block_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -block_encoder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters lzma_attribute((__unused__)), - const lzma_filter *reversed_filters) -{ - lzma_block_coder *coder = coder_ptr; - - if (coder->sequence != SEQ_CODE) - return LZMA_PROG_ERROR; - - return lzma_next_filter_update( - &coder->next, allocator, reversed_filters); -} - - -extern lzma_ret -lzma_block_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - lzma_block *block) -{ - lzma_next_coder_init(&lzma_block_encoder_init, next, allocator); - - if (block == NULL) - return LZMA_PROG_ERROR; - - // The contents of the structure may depend on the version so - // check the version first. - if (block->version > 1) - return LZMA_OPTIONS_ERROR; - - // If the Check ID is not supported, we cannot calculate the check and - // thus not create a proper Block. - if ((unsigned int)(block->check) > LZMA_CHECK_ID_MAX) - return LZMA_PROG_ERROR; - - if (!lzma_check_is_supported(block->check)) - return LZMA_UNSUPPORTED_CHECK; - - // Allocate and initialize *next->coder if needed. - lzma_block_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_block_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &block_encode; - next->end = &block_encoder_end; - next->update = &block_encoder_update; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Basic initializations - coder->sequence = SEQ_CODE; - coder->block = block; - coder->compressed_size = 0; - coder->uncompressed_size = 0; - coder->pos = 0; - - // Initialize the check - lzma_check_init(&coder->check, block->check); - - // Initialize the requested filters. - return lzma_raw_encoder_init(&coder->next, allocator, block->filters); -} - - -extern LZMA_API(lzma_ret) -lzma_block_encoder(lzma_stream *strm, lzma_block *block) -{ - lzma_next_strm_init(lzma_block_encoder_init, strm, block); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/block_encoder.h b/software/src/xz/src/liblzma/common/block_encoder.h deleted file mode 100644 index b7dfe9a..0000000 --- a/software/src/xz/src/liblzma/common/block_encoder.h +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_encoder.h -/// \brief Encodes .xz Blocks -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_BLOCK_ENCODER_H -#define LZMA_BLOCK_ENCODER_H - -#include "common.h" - - -/// \brief Biggest Compressed Size value that the Block encoder supports -/// -/// The maximum size of a single Block is limited by the maximum size of -/// a Stream, which in theory is 2^63 - 3 bytes (i.e. LZMA_VLI_MAX - 3). -/// While the size is really big and no one should hit it in practice, we -/// take it into account in some places anyway to catch some errors e.g. if -/// application passes insanely big value to some function. -/// -/// We could take into account the headers etc. to determine the exact -/// maximum size of the Compressed Data field, but the complexity would give -/// us nothing useful. Instead, limit the size of Compressed Data so that -/// even with biggest possible Block Header and Check fields the total -/// encoded size of the Block stays as a valid VLI. This doesn't guarantee -/// that the size of the Stream doesn't grow too big, but that problem is -/// taken care outside the Block handling code. -/// -/// ~LZMA_VLI_C(3) is to guarantee that if we need padding at the end of -/// the Compressed Data field, it will still stay in the proper limit. -/// -/// This constant is in this file because it is needed in both -/// block_encoder.c and block_buffer_encoder.c. -#define COMPRESSED_SIZE_MAX ((LZMA_VLI_MAX - LZMA_BLOCK_HEADER_SIZE_MAX \ - - LZMA_CHECK_SIZE_MAX) & ~LZMA_VLI_C(3)) - - -extern lzma_ret lzma_block_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, lzma_block *block); - -#endif diff --git a/software/src/xz/src/liblzma/common/block_header_decoder.c b/software/src/xz/src/liblzma/common/block_header_decoder.c deleted file mode 100644 index f0b2fbe..0000000 --- a/software/src/xz/src/liblzma/common/block_header_decoder.c +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_header_decoder.c -/// \brief Decodes Block Header from .xz files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "check.h" - - -extern LZMA_API(lzma_ret) -lzma_block_header_decode(lzma_block *block, - const lzma_allocator *allocator, const uint8_t *in) -{ - // NOTE: We consider the header to be corrupt not only when the - // CRC32 doesn't match, but also when variable-length integers - // are invalid or over 63 bits, or if the header is too small - // to contain the claimed information. - - // Catch unexpected NULL pointers. - if (block == NULL || block->filters == NULL || in == NULL) - return LZMA_PROG_ERROR; - - // Initialize the filter options array. This way the caller can - // safely free() the options even if an error occurs in this function. - for (size_t i = 0; i <= LZMA_FILTERS_MAX; ++i) { - block->filters[i].id = LZMA_VLI_UNKNOWN; - block->filters[i].options = NULL; - } - - // Versions 0 and 1 are supported. If a newer version was specified, - // we need to downgrade it. - if (block->version > 1) - block->version = 1; - - // This isn't a Block Header option, but since the decompressor will - // read it if version >= 1, it's better to initialize it here than - // to expect the caller to do it since in almost all cases this - // should be false. - block->ignore_check = false; - - // Validate Block Header Size and Check type. The caller must have - // already set these, so it is a programming error if this test fails. - if (lzma_block_header_size_decode(in[0]) != block->header_size - || (unsigned int)(block->check) > LZMA_CHECK_ID_MAX) - return LZMA_PROG_ERROR; - - // Exclude the CRC32 field. - const size_t in_size = block->header_size - 4; - - // Verify CRC32 - if (lzma_crc32(in, in_size, 0) != read32le(in + in_size)) { -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - return LZMA_DATA_ERROR; -#endif - } - - // Check for unsupported flags. - if (in[1] & 0x3C) - return LZMA_OPTIONS_ERROR; - - // Start after the Block Header Size and Block Flags fields. - size_t in_pos = 2; - - // Compressed Size - if (in[1] & 0x40) { - return_if_error(lzma_vli_decode(&block->compressed_size, - NULL, in, &in_pos, in_size)); - - // Validate Compressed Size. This checks that it isn't zero - // and that the total size of the Block is a valid VLI. - if (lzma_block_unpadded_size(block) == 0) - return LZMA_DATA_ERROR; - } else { - block->compressed_size = LZMA_VLI_UNKNOWN; - } - - // Uncompressed Size - if (in[1] & 0x80) - return_if_error(lzma_vli_decode(&block->uncompressed_size, - NULL, in, &in_pos, in_size)); - else - block->uncompressed_size = LZMA_VLI_UNKNOWN; - - // Filter Flags - const size_t filter_count = (in[1] & 3U) + 1; - for (size_t i = 0; i < filter_count; ++i) { - const lzma_ret ret = lzma_filter_flags_decode( - &block->filters[i], allocator, - in, &in_pos, in_size); - if (ret != LZMA_OK) { - lzma_filters_free(block->filters, allocator); - return ret; - } - } - - // Padding - while (in_pos < in_size) { - if (in[in_pos++] != 0x00) { - lzma_filters_free(block->filters, allocator); - - // Possibly some new field present so use - // LZMA_OPTIONS_ERROR instead of LZMA_DATA_ERROR. - return LZMA_OPTIONS_ERROR; - } - } - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/block_header_encoder.c b/software/src/xz/src/liblzma/common/block_header_encoder.c deleted file mode 100644 index 45e57a2..0000000 --- a/software/src/xz/src/liblzma/common/block_header_encoder.c +++ /dev/null @@ -1,131 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_header_encoder.c -/// \brief Encodes Block Header for .xz files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "check.h" - - -extern LZMA_API(lzma_ret) -lzma_block_header_size(lzma_block *block) -{ - if (block->version > 1) - return LZMA_OPTIONS_ERROR; - - // Block Header Size + Block Flags + CRC32. - uint32_t size = 1 + 1 + 4; - - // Compressed Size - if (block->compressed_size != LZMA_VLI_UNKNOWN) { - const uint32_t add = lzma_vli_size(block->compressed_size); - if (add == 0 || block->compressed_size == 0) - return LZMA_PROG_ERROR; - - size += add; - } - - // Uncompressed Size - if (block->uncompressed_size != LZMA_VLI_UNKNOWN) { - const uint32_t add = lzma_vli_size(block->uncompressed_size); - if (add == 0) - return LZMA_PROG_ERROR; - - size += add; - } - - // List of Filter Flags - if (block->filters == NULL || block->filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_PROG_ERROR; - - for (size_t i = 0; block->filters[i].id != LZMA_VLI_UNKNOWN; ++i) { - // Don't allow too many filters. - if (i == LZMA_FILTERS_MAX) - return LZMA_PROG_ERROR; - - uint32_t add; - return_if_error(lzma_filter_flags_size(&add, - block->filters + i)); - - size += add; - } - - // Pad to a multiple of four bytes. - block->header_size = (size + 3) & ~UINT32_C(3); - - // NOTE: We don't verify that the encoded size of the Block stays - // within limits. This is because it is possible that we are called - // with exaggerated Compressed Size (e.g. LZMA_VLI_MAX) to reserve - // space for Block Header, and later called again with lower, - // real values. - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_block_header_encode(const lzma_block *block, uint8_t *out) -{ - // Validate everything but filters. - if (lzma_block_unpadded_size(block) == 0 - || !lzma_vli_is_valid(block->uncompressed_size)) - return LZMA_PROG_ERROR; - - // Indicate the size of the buffer _excluding_ the CRC32 field. - const size_t out_size = block->header_size - 4; - - // Store the Block Header Size. - out[0] = out_size / 4; - - // We write Block Flags in pieces. - out[1] = 0x00; - size_t out_pos = 2; - - // Compressed Size - if (block->compressed_size != LZMA_VLI_UNKNOWN) { - return_if_error(lzma_vli_encode(block->compressed_size, NULL, - out, &out_pos, out_size)); - - out[1] |= 0x40; - } - - // Uncompressed Size - if (block->uncompressed_size != LZMA_VLI_UNKNOWN) { - return_if_error(lzma_vli_encode(block->uncompressed_size, NULL, - out, &out_pos, out_size)); - - out[1] |= 0x80; - } - - // Filter Flags - if (block->filters == NULL || block->filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_PROG_ERROR; - - size_t filter_count = 0; - do { - // There can be a maximum of four filters. - if (filter_count == LZMA_FILTERS_MAX) - return LZMA_PROG_ERROR; - - return_if_error(lzma_filter_flags_encode( - block->filters + filter_count, - out, &out_pos, out_size)); - - } while (block->filters[++filter_count].id != LZMA_VLI_UNKNOWN); - - out[1] |= filter_count - 1; - - // Padding - memzero(out + out_pos, out_size - out_pos); - - // CRC32 - write32le(out + out_size, lzma_crc32(out, out_size, 0)); - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/block_util.c b/software/src/xz/src/liblzma/common/block_util.c deleted file mode 100644 index 191f6d4..0000000 --- a/software/src/xz/src/liblzma/common/block_util.c +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file block_util.c -/// \brief Utility functions to handle lzma_block -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "index.h" - - -extern LZMA_API(lzma_ret) -lzma_block_compressed_size(lzma_block *block, lzma_vli unpadded_size) -{ - // Validate everything but Uncompressed Size and filters. - if (lzma_block_unpadded_size(block) == 0) - return LZMA_PROG_ERROR; - - const uint32_t container_size = block->header_size - + lzma_check_size(block->check); - - // Validate that Compressed Size will be greater than zero. - if (unpadded_size <= container_size) - return LZMA_DATA_ERROR; - - // Calculate what Compressed Size is supposed to be. - // If Compressed Size was present in Block Header, - // compare that the new value matches it. - const lzma_vli compressed_size = unpadded_size - container_size; - if (block->compressed_size != LZMA_VLI_UNKNOWN - && block->compressed_size != compressed_size) - return LZMA_DATA_ERROR; - - block->compressed_size = compressed_size; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_vli) -lzma_block_unpadded_size(const lzma_block *block) -{ - // Validate the values that we are interested in i.e. all but - // Uncompressed Size and the filters. - // - // NOTE: This function is used for validation too, so it is - // essential that these checks are always done even if - // Compressed Size is unknown. - if (block == NULL || block->version > 1 - || block->header_size < LZMA_BLOCK_HEADER_SIZE_MIN - || block->header_size > LZMA_BLOCK_HEADER_SIZE_MAX - || (block->header_size & 3) - || !lzma_vli_is_valid(block->compressed_size) - || block->compressed_size == 0 - || (unsigned int)(block->check) > LZMA_CHECK_ID_MAX) - return 0; - - // If Compressed Size is unknown, return that we cannot know - // size of the Block either. - if (block->compressed_size == LZMA_VLI_UNKNOWN) - return LZMA_VLI_UNKNOWN; - - // Calculate Unpadded Size and validate it. - const lzma_vli unpadded_size = block->compressed_size - + block->header_size - + lzma_check_size(block->check); - - assert(unpadded_size >= UNPADDED_SIZE_MIN); - if (unpadded_size > UNPADDED_SIZE_MAX) - return 0; - - return unpadded_size; -} - - -extern LZMA_API(lzma_vli) -lzma_block_total_size(const lzma_block *block) -{ - lzma_vli unpadded_size = lzma_block_unpadded_size(block); - - if (unpadded_size != LZMA_VLI_UNKNOWN) - unpadded_size = vli_ceil4(unpadded_size); - - return unpadded_size; -} diff --git a/software/src/xz/src/liblzma/common/common.c b/software/src/xz/src/liblzma/common/common.c deleted file mode 100644 index 6e031a5..0000000 --- a/software/src/xz/src/liblzma/common/common.c +++ /dev/null @@ -1,486 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file common.c -/// \brief Common functions needed in many places in liblzma -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -///////////// -// Version // -///////////// - -extern LZMA_API(uint32_t) -lzma_version_number(void) -{ - return LZMA_VERSION; -} - - -extern LZMA_API(const char *) -lzma_version_string(void) -{ - return LZMA_VERSION_STRING; -} - - -/////////////////////// -// Memory allocation // -/////////////////////// - -lzma_attr_alloc_size(1) -extern void * -lzma_alloc(size_t size, const lzma_allocator *allocator) -{ - // Some malloc() variants return NULL if called with size == 0. - if (size == 0) - size = 1; - - void *ptr; - - if (allocator != NULL && allocator->alloc != NULL) - ptr = allocator->alloc(allocator->opaque, 1, size); - else - ptr = malloc(size); - - return ptr; -} - - -lzma_attr_alloc_size(1) -extern void * -lzma_alloc_zero(size_t size, const lzma_allocator *allocator) -{ - // Some calloc() variants return NULL if called with size == 0. - if (size == 0) - size = 1; - - void *ptr; - - if (allocator != NULL && allocator->alloc != NULL) { - ptr = allocator->alloc(allocator->opaque, 1, size); - if (ptr != NULL) - memzero(ptr, size); - } else { - ptr = calloc(1, size); - } - - return ptr; -} - - -extern void -lzma_free(void *ptr, const lzma_allocator *allocator) -{ - if (allocator != NULL && allocator->free != NULL) - allocator->free(allocator->opaque, ptr); - else - free(ptr); - - return; -} - - -////////// -// Misc // -////////// - -extern size_t -lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size) -{ - assert(in != NULL || *in_pos == in_size); - assert(out != NULL || *out_pos == out_size); - - assert(*in_pos <= in_size); - assert(*out_pos <= out_size); - - const size_t in_avail = in_size - *in_pos; - const size_t out_avail = out_size - *out_pos; - const size_t copy_size = my_min(in_avail, out_avail); - - // Call memcpy() only if there is something to copy. If there is - // nothing to copy, in or out might be NULL and then the memcpy() - // call would trigger undefined behavior. - if (copy_size > 0) - memcpy(out + *out_pos, in + *in_pos, copy_size); - - *in_pos += copy_size; - *out_pos += copy_size; - - return copy_size; -} - - -extern lzma_ret -lzma_next_filter_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - lzma_next_coder_init(filters[0].init, next, allocator); - next->id = filters[0].id; - return filters[0].init == NULL - ? LZMA_OK : filters[0].init(next, allocator, filters); -} - - -extern lzma_ret -lzma_next_filter_update(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *reversed_filters) -{ - // Check that the application isn't trying to change the Filter ID. - // End of filters is indicated with LZMA_VLI_UNKNOWN in both - // reversed_filters[0].id and next->id. - if (reversed_filters[0].id != next->id) - return LZMA_PROG_ERROR; - - if (reversed_filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_OK; - - assert(next->update != NULL); - return next->update(next->coder, allocator, NULL, reversed_filters); -} - - -extern void -lzma_next_end(lzma_next_coder *next, const lzma_allocator *allocator) -{ - if (next->init != (uintptr_t)(NULL)) { - // To avoid tiny end functions that simply call - // lzma_free(coder, allocator), we allow leaving next->end - // NULL and call lzma_free() here. - if (next->end != NULL) - next->end(next->coder, allocator); - else - lzma_free(next->coder, allocator); - - // Reset the variables so the we don't accidentally think - // that it is an already initialized coder. - *next = LZMA_NEXT_CODER_INIT; - } - - return; -} - - -////////////////////////////////////// -// External to internal API wrapper // -////////////////////////////////////// - -extern lzma_ret -lzma_strm_init(lzma_stream *strm) -{ - if (strm == NULL) - return LZMA_PROG_ERROR; - - if (strm->internal == NULL) { - strm->internal = lzma_alloc(sizeof(lzma_internal), - strm->allocator); - if (strm->internal == NULL) - return LZMA_MEM_ERROR; - - strm->internal->next = LZMA_NEXT_CODER_INIT; - } - - memzero(strm->internal->supported_actions, - sizeof(strm->internal->supported_actions)); - strm->internal->sequence = ISEQ_RUN; - strm->internal->allow_buf_error = false; - - strm->total_in = 0; - strm->total_out = 0; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_code(lzma_stream *strm, lzma_action action) -{ - // Sanity checks - if ((strm->next_in == NULL && strm->avail_in != 0) - || (strm->next_out == NULL && strm->avail_out != 0) - || strm->internal == NULL - || strm->internal->next.code == NULL - || (unsigned int)(action) > LZMA_ACTION_MAX - || !strm->internal->supported_actions[action]) - return LZMA_PROG_ERROR; - - // Check if unsupported members have been set to non-zero or non-NULL, - // which would indicate that some new feature is wanted. - if (strm->reserved_ptr1 != NULL - || strm->reserved_ptr2 != NULL - || strm->reserved_ptr3 != NULL - || strm->reserved_ptr4 != NULL - || strm->reserved_int2 != 0 - || strm->reserved_int3 != 0 - || strm->reserved_int4 != 0 - || strm->reserved_enum1 != LZMA_RESERVED_ENUM - || strm->reserved_enum2 != LZMA_RESERVED_ENUM) - return LZMA_OPTIONS_ERROR; - - switch (strm->internal->sequence) { - case ISEQ_RUN: - switch (action) { - case LZMA_RUN: - break; - - case LZMA_SYNC_FLUSH: - strm->internal->sequence = ISEQ_SYNC_FLUSH; - break; - - case LZMA_FULL_FLUSH: - strm->internal->sequence = ISEQ_FULL_FLUSH; - break; - - case LZMA_FINISH: - strm->internal->sequence = ISEQ_FINISH; - break; - - case LZMA_FULL_BARRIER: - strm->internal->sequence = ISEQ_FULL_BARRIER; - break; - } - - break; - - case ISEQ_SYNC_FLUSH: - // The same action must be used until we return - // LZMA_STREAM_END, and the amount of input must not change. - if (action != LZMA_SYNC_FLUSH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FULL_FLUSH: - if (action != LZMA_FULL_FLUSH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FINISH: - if (action != LZMA_FINISH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FULL_BARRIER: - if (action != LZMA_FULL_BARRIER - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_END: - return LZMA_STREAM_END; - - case ISEQ_ERROR: - default: - return LZMA_PROG_ERROR; - } - - size_t in_pos = 0; - size_t out_pos = 0; - lzma_ret ret = strm->internal->next.code( - strm->internal->next.coder, strm->allocator, - strm->next_in, &in_pos, strm->avail_in, - strm->next_out, &out_pos, strm->avail_out, action); - - // Updating next_in and next_out has to be skipped when they are NULL - // to avoid null pointer + 0 (undefined behavior). Do this by checking - // in_pos > 0 and out_pos > 0 because this way NULL + non-zero (a bug) - // will get caught one way or other. - if (in_pos > 0) { - strm->next_in += in_pos; - strm->avail_in -= in_pos; - strm->total_in += in_pos; - } - - if (out_pos > 0) { - strm->next_out += out_pos; - strm->avail_out -= out_pos; - strm->total_out += out_pos; - } - - strm->internal->avail_in = strm->avail_in; - - switch (ret) { - case LZMA_OK: - // Don't return LZMA_BUF_ERROR when it happens the first time. - // This is to avoid returning LZMA_BUF_ERROR when avail_out - // was zero but still there was no more data left to written - // to next_out. - if (out_pos == 0 && in_pos == 0) { - if (strm->internal->allow_buf_error) - ret = LZMA_BUF_ERROR; - else - strm->internal->allow_buf_error = true; - } else { - strm->internal->allow_buf_error = false; - } - break; - - case LZMA_TIMED_OUT: - strm->internal->allow_buf_error = false; - ret = LZMA_OK; - break; - - case LZMA_SEEK_NEEDED: - strm->internal->allow_buf_error = false; - - // If LZMA_FINISH was used, reset it back to the - // LZMA_RUN-based state so that new input can be supplied - // by the application. - if (strm->internal->sequence == ISEQ_FINISH) - strm->internal->sequence = ISEQ_RUN; - - break; - - case LZMA_STREAM_END: - if (strm->internal->sequence == ISEQ_SYNC_FLUSH - || strm->internal->sequence == ISEQ_FULL_FLUSH - || strm->internal->sequence - == ISEQ_FULL_BARRIER) - strm->internal->sequence = ISEQ_RUN; - else - strm->internal->sequence = ISEQ_END; - - FALLTHROUGH; - - case LZMA_NO_CHECK: - case LZMA_UNSUPPORTED_CHECK: - case LZMA_GET_CHECK: - case LZMA_MEMLIMIT_ERROR: - // Something else than LZMA_OK, but not a fatal error, - // that is, coding may be continued (except if ISEQ_END). - strm->internal->allow_buf_error = false; - break; - - default: - // All the other errors are fatal; coding cannot be continued. - assert(ret != LZMA_BUF_ERROR); - strm->internal->sequence = ISEQ_ERROR; - break; - } - - return ret; -} - - -extern LZMA_API(void) -lzma_end(lzma_stream *strm) -{ - if (strm != NULL && strm->internal != NULL) { - lzma_next_end(&strm->internal->next, strm->allocator); - lzma_free(strm->internal, strm->allocator); - strm->internal = NULL; - } - - return; -} - - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -// This is for compatibility with binaries linked against liblzma that -// has been patched with xz-5.2.2-compat-libs.patch from RHEL/CentOS 7. -LZMA_SYMVER_API("lzma_get_progress@XZ_5.2.2", - void, lzma_get_progress_522)(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) lzma_nothrow - __attribute__((__alias__("lzma_get_progress_52"))); - -LZMA_SYMVER_API("lzma_get_progress@@XZ_5.2", - void, lzma_get_progress_52)(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) lzma_nothrow; - -#define lzma_get_progress lzma_get_progress_52 -#endif -extern LZMA_API(void) -lzma_get_progress(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) -{ - if (strm->internal->next.get_progress != NULL) { - strm->internal->next.get_progress(strm->internal->next.coder, - progress_in, progress_out); - } else { - *progress_in = strm->total_in; - *progress_out = strm->total_out; - } - - return; -} - - -extern LZMA_API(lzma_check) -lzma_get_check(const lzma_stream *strm) -{ - // Return LZMA_CHECK_NONE if we cannot know the check type. - // It's a bug in the application if this happens. - if (strm->internal->next.get_check == NULL) - return LZMA_CHECK_NONE; - - return strm->internal->next.get_check(strm->internal->next.coder); -} - - -extern LZMA_API(uint64_t) -lzma_memusage(const lzma_stream *strm) -{ - uint64_t memusage; - uint64_t old_memlimit; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL - || strm->internal->next.memconfig( - strm->internal->next.coder, - &memusage, &old_memlimit, 0) != LZMA_OK) - return 0; - - return memusage; -} - - -extern LZMA_API(uint64_t) -lzma_memlimit_get(const lzma_stream *strm) -{ - uint64_t old_memlimit; - uint64_t memusage; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL - || strm->internal->next.memconfig( - strm->internal->next.coder, - &memusage, &old_memlimit, 0) != LZMA_OK) - return 0; - - return old_memlimit; -} - - -extern LZMA_API(lzma_ret) -lzma_memlimit_set(lzma_stream *strm, uint64_t new_memlimit) -{ - // Dummy variables to simplify memconfig functions - uint64_t old_memlimit; - uint64_t memusage; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL) - return LZMA_PROG_ERROR; - - // Zero is a special value that cannot be used as an actual limit. - // If 0 was specified, use 1 instead. - if (new_memlimit == 0) - new_memlimit = 1; - - return strm->internal->next.memconfig(strm->internal->next.coder, - &memusage, &old_memlimit, new_memlimit); -} diff --git a/software/src/xz/src/liblzma/common/common.h b/software/src/xz/src/liblzma/common/common.h deleted file mode 100644 index 20af32f..0000000 --- a/software/src/xz/src/liblzma/common/common.h +++ /dev/null @@ -1,412 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file common.h -/// \brief Definitions common to the whole liblzma library -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_COMMON_H -#define LZMA_COMMON_H - -#include "sysdefs.h" -#include "mythread.h" -#include "tuklib_integer.h" - -// LZMA_API_EXPORT is used to mark the exported API functions. -// It's used to define the LZMA_API macro. -// -// lzma_attr_visibility_hidden is used for marking *declarations* of extern -// variables that are internal to liblzma (-fvisibility=hidden alone is -// enough to hide the *definitions*). Such markings allow slightly more -// efficient code to accesses those variables in ELF shared libraries. -#if defined(_WIN32) || defined(__CYGWIN__) -# ifdef DLL_EXPORT -# define LZMA_API_EXPORT __declspec(dllexport) -# else -# define LZMA_API_EXPORT -# endif -# define lzma_attr_visibility_hidden -// Don't use ifdef or defined() below. -#elif HAVE_VISIBILITY -# define LZMA_API_EXPORT __attribute__((__visibility__("default"))) -# define lzma_attr_visibility_hidden \ - __attribute__((__visibility__("hidden"))) -#else -# define LZMA_API_EXPORT -# define lzma_attr_visibility_hidden -#endif - -#define LZMA_API(type) LZMA_API_EXPORT type LZMA_API_CALL - -#include "lzma.h" - -// This is for detecting modern GCC and Clang attributes -// like __symver__ in GCC >= 10. -#ifdef __has_attribute -# define lzma_has_attribute(attr) __has_attribute(attr) -#else -# define lzma_has_attribute(attr) 0 -#endif - -// The extra symbol versioning in the C files may only be used when -// building a shared library. If HAVE_SYMBOL_VERSIONS_LINUX is defined -// to 2 then symbol versioning is done only if also PIC is defined. -// By default Libtool defines PIC when building a shared library and -// doesn't define it when building a static library but it can be -// overridden with --with-pic and --without-pic. configure let's rely -// on PIC if neither --with-pic or --without-pic was used. -#if defined(HAVE_SYMBOL_VERSIONS_LINUX) \ - && (HAVE_SYMBOL_VERSIONS_LINUX == 2 && !defined(PIC)) -# undef HAVE_SYMBOL_VERSIONS_LINUX -#endif - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -// To keep link-time optimization (LTO, -flto) working with GCC, -// the __symver__ attribute must be used instead of __asm__(".symver ..."). -// Otherwise the symbol versions may be lost, resulting in broken liblzma -// that has wrong default versions in the exported symbol list! -// The attribute was added in GCC 10; LTO with older GCC is not supported. -// -// To keep -Wmissing-prototypes happy, use LZMA_SYMVER_API only with function -// declarations (including those with __alias__ attribute) and LZMA_API with -// the function definitions. This means a little bit of silly copy-and-paste -// between declarations and definitions though. -// -// As of GCC 12.2, the __symver__ attribute supports only @ and @@ but the -// very convenient @@@ isn't supported (it's supported by GNU assembler -// since 2000). When using @@ instead of @@@, the internal name must not be -// the same as the external name to avoid problems in some situations. This -// is why "#define foo_52 foo" is needed for the default symbol versions. -// -// __has_attribute is supported before GCC 10 and it is supported in Clang 14 -// too (which doesn't support __symver__) so use it to detect if __symver__ -// is available. This should be far more reliable than looking at compiler -// version macros as nowadays especially __GNUC__ is defined by many compilers. -# if lzma_has_attribute(__symver__) -# define LZMA_SYMVER_API(extnamever, type, intname) \ - extern __attribute__((__symver__(extnamever))) \ - LZMA_API(type) intname -# else -# define LZMA_SYMVER_API(extnamever, type, intname) \ - __asm__(".symver " #intname "," extnamever); \ - extern LZMA_API(type) intname -# endif -#endif - -// MSVC has __forceinline which shouldn't be combined with the inline keyword -// (results in a warning). -// -// GCC 3.1 added always_inline attribute so we don't need to check -// for __GNUC__ version. Similarly, all relevant Clang versions -// support it (at least Clang 3.0.0 does already). -// Other compilers might support too which also support __has_attribute -// (Solaris Studio) so do that check too. -#if defined(_MSC_VER) -# define lzma_always_inline __forceinline -#elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) \ - || lzma_has_attribute(__always_inline__) -# define lzma_always_inline inline __attribute__((__always_inline__)) -#else -# define lzma_always_inline inline -#endif - -// These allow helping the compiler in some often-executed branches, whose -// result is almost always the same. -#ifdef __GNUC__ -# define likely(expr) __builtin_expect(expr, true) -# define unlikely(expr) __builtin_expect(expr, false) -#else -# define likely(expr) (expr) -# define unlikely(expr) (expr) -#endif - - -/// Size of temporary buffers needed in some filters -#define LZMA_BUFFER_SIZE 4096 - - -/// Maximum number of worker threads within one multithreaded component. -/// The limit exists solely to make it simpler to prevent integer overflows -/// when allocating structures etc. This should be big enough for now... -/// the code won't scale anywhere close to this number anyway. -#define LZMA_THREADS_MAX 16384 - - -/// Starting value for memory usage estimates. Instead of calculating size -/// of _every_ structure and taking into account malloc() overhead etc., we -/// add a base size to all memory usage estimates. It's not very accurate -/// but should be easily good enough. -#define LZMA_MEMUSAGE_BASE (UINT64_C(1) << 15) - -/// Start of internal Filter ID space. These IDs must never be used -/// in Streams. -#define LZMA_FILTER_RESERVED_START (LZMA_VLI_C(1) << 62) - - -/// Supported flags that can be passed to lzma_stream_decoder(), -/// lzma_auto_decoder(), or lzma_stream_decoder_mt(). -#define LZMA_SUPPORTED_FLAGS \ - ( LZMA_TELL_NO_CHECK \ - | LZMA_TELL_UNSUPPORTED_CHECK \ - | LZMA_TELL_ANY_CHECK \ - | LZMA_IGNORE_CHECK \ - | LZMA_CONCATENATED \ - | LZMA_FAIL_FAST ) - - -/// Largest valid lzma_action value as unsigned integer. -#define LZMA_ACTION_MAX ((unsigned int)(LZMA_FULL_BARRIER)) - - -/// Special return value (lzma_ret) to indicate that a timeout was reached -/// and lzma_code() must not return LZMA_BUF_ERROR. This is converted to -/// LZMA_OK in lzma_code(). -#define LZMA_TIMED_OUT LZMA_RET_INTERNAL1 - -/// Special return value (lzma_ret) for use in stream_decoder_mt.c to -/// indicate Index was detected instead of a Block Header. -#define LZMA_INDEX_DETECTED LZMA_RET_INTERNAL2 - - -typedef struct lzma_next_coder_s lzma_next_coder; - -typedef struct lzma_filter_info_s lzma_filter_info; - - -/// Type of a function used to initialize a filter encoder or decoder -typedef lzma_ret (*lzma_init_function)( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters); - -/// Type of a function to do some kind of coding work (filters, Stream, -/// Block encoders/decoders etc.). Some special coders use don't use both -/// input and output buffers, but for simplicity they still use this same -/// function prototype. -typedef lzma_ret (*lzma_code_function)( - void *coder, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action); - -/// Type of a function to free the memory allocated for the coder -typedef void (*lzma_end_function)( - void *coder, const lzma_allocator *allocator); - - -/// Raw coder validates and converts an array of lzma_filter structures to -/// an array of lzma_filter_info structures. This array is used with -/// lzma_next_filter_init to initialize the filter chain. -struct lzma_filter_info_s { - /// Filter ID. This can be used to share the same initiazation - /// function *and* data structures with different Filter IDs - /// (LZMA_FILTER_LZMA1EXT does it), and also by the encoder - /// with lzma_filters_update() if filter chain is updated - /// in the middle of a raw stream or Block (LZMA_SYNC_FLUSH). - lzma_vli id; - - /// Pointer to function used to initialize the filter. - /// This is NULL to indicate end of array. - lzma_init_function init; - - /// Pointer to filter's options structure - void *options; -}; - - -/// Hold data and function pointers of the next filter in the chain. -struct lzma_next_coder_s { - /// Pointer to coder-specific data - void *coder; - - /// Filter ID. This is LZMA_VLI_UNKNOWN when this structure doesn't - /// point to a filter coder. - lzma_vli id; - - /// "Pointer" to init function. This is never called here. - /// We need only to detect if we are initializing a coder - /// that was allocated earlier. See lzma_next_coder_init and - /// lzma_next_strm_init macros in this file. - uintptr_t init; - - /// Pointer to function to do the actual coding - lzma_code_function code; - - /// Pointer to function to free lzma_next_coder.coder. This can - /// be NULL; in that case, lzma_free is called to free - /// lzma_next_coder.coder. - lzma_end_function end; - - /// Pointer to a function to get progress information. If this is NULL, - /// lzma_stream.total_in and .total_out are used instead. - void (*get_progress)(void *coder, - uint64_t *progress_in, uint64_t *progress_out); - - /// Pointer to function to return the type of the integrity check. - /// Most coders won't support this. - lzma_check (*get_check)(const void *coder); - - /// Pointer to function to get and/or change the memory usage limit. - /// If new_memlimit == 0, the limit is not changed. - lzma_ret (*memconfig)(void *coder, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit); - - /// Update the filter-specific options or the whole filter chain - /// in the encoder. - lzma_ret (*update)(void *coder, const lzma_allocator *allocator, - const lzma_filter *filters, - const lzma_filter *reversed_filters); - - /// Set how many bytes of output this coder may produce at maximum. - /// On success LZMA_OK must be returned. - /// If the filter chain as a whole cannot support this feature, - /// this must return LZMA_OPTIONS_ERROR. - /// If no input has been given to the coder and the requested limit - /// is too small, this must return LZMA_BUF_ERROR. If input has been - /// seen, LZMA_OK is allowed too. - lzma_ret (*set_out_limit)(void *coder, uint64_t *uncomp_size, - uint64_t out_limit); -}; - - -/// Macro to initialize lzma_next_coder structure -#define LZMA_NEXT_CODER_INIT \ - (lzma_next_coder){ \ - .coder = NULL, \ - .init = (uintptr_t)(NULL), \ - .id = LZMA_VLI_UNKNOWN, \ - .code = NULL, \ - .end = NULL, \ - .get_progress = NULL, \ - .get_check = NULL, \ - .memconfig = NULL, \ - .update = NULL, \ - .set_out_limit = NULL, \ - } - - -/// Internal data for lzma_strm_init, lzma_code, and lzma_end. A pointer to -/// this is stored in lzma_stream. -struct lzma_internal_s { - /// The actual coder that should do something useful - lzma_next_coder next; - - /// Track the state of the coder. This is used to validate arguments - /// so that the actual coders can rely on e.g. that LZMA_SYNC_FLUSH - /// is used on every call to lzma_code until next.code has returned - /// LZMA_STREAM_END. - enum { - ISEQ_RUN, - ISEQ_SYNC_FLUSH, - ISEQ_FULL_FLUSH, - ISEQ_FINISH, - ISEQ_FULL_BARRIER, - ISEQ_END, - ISEQ_ERROR, - } sequence; - - /// A copy of lzma_stream avail_in. This is used to verify that the - /// amount of input doesn't change once e.g. LZMA_FINISH has been - /// used. - size_t avail_in; - - /// Indicates which lzma_action values are allowed by next.code. - bool supported_actions[LZMA_ACTION_MAX + 1]; - - /// If true, lzma_code will return LZMA_BUF_ERROR if no progress was - /// made (no input consumed and no output produced by next.code). - bool allow_buf_error; -}; - - -/// Allocates memory -lzma_attr_alloc_size(1) -extern void *lzma_alloc(size_t size, const lzma_allocator *allocator); - -/// Allocates memory and zeroes it (like calloc()). This can be faster -/// than lzma_alloc() + memzero() while being backward compatible with -/// custom allocators. -lzma_attr_alloc_size(1) -extern void *lzma_alloc_zero(size_t size, const lzma_allocator *allocator); - -/// Frees memory -extern void lzma_free(void *ptr, const lzma_allocator *allocator); - - -/// Allocates strm->internal if it is NULL, and initializes *strm and -/// strm->internal. This function is only called via lzma_next_strm_init macro. -extern lzma_ret lzma_strm_init(lzma_stream *strm); - -/// Initializes the next filter in the chain, if any. This takes care of -/// freeing the memory of previously initialized filter if it is different -/// than the filter being initialized now. This way the actual filter -/// initialization functions don't need to use lzma_next_coder_init macro. -extern lzma_ret lzma_next_filter_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -/// Update the next filter in the chain, if any. This checks that -/// the application is not trying to change the Filter IDs. -extern lzma_ret lzma_next_filter_update( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *reversed_filters); - -/// Frees the memory allocated for next->coder either using next->end or, -/// if next->end is NULL, using lzma_free. -extern void lzma_next_end(lzma_next_coder *next, - const lzma_allocator *allocator); - - -/// Copy as much data as possible from in[] to out[] and update *in_pos -/// and *out_pos accordingly. Returns the number of bytes copied. -extern size_t lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size); - - -/// \brief Return if expression doesn't evaluate to LZMA_OK -/// -/// There are several situations where we want to return immediately -/// with the value of expr if it isn't LZMA_OK. This macro shortens -/// the code a little. -#define return_if_error(expr) \ -do { \ - const lzma_ret ret_ = (expr); \ - if (ret_ != LZMA_OK) \ - return ret_; \ -} while (0) - - -/// If next isn't already initialized, free the previous coder. Then mark -/// that next is _possibly_ initialized for the coder using this macro. -/// "Possibly" means that if e.g. allocation of next->coder fails, the -/// structure isn't actually initialized for this coder, but leaving -/// next->init to func is still OK. -#define lzma_next_coder_init(func, next, allocator) \ -do { \ - if ((uintptr_t)(func) != (next)->init) \ - lzma_next_end(next, allocator); \ - (next)->init = (uintptr_t)(func); \ -} while (0) - - -/// Initializes lzma_strm and calls func() to initialize strm->internal->next. -/// (The function being called will use lzma_next_coder_init()). If -/// initialization fails, memory that wasn't freed by func() is freed -/// along strm->internal. -#define lzma_next_strm_init(func, strm, ...) \ -do { \ - return_if_error(lzma_strm_init(strm)); \ - const lzma_ret ret_ = func(&(strm)->internal->next, \ - (strm)->allocator, __VA_ARGS__); \ - if (ret_ != LZMA_OK) { \ - lzma_end(strm); \ - return ret_; \ - } \ -} while (0) - -#endif diff --git a/software/src/xz/src/liblzma/common/easy_buffer_encoder.c b/software/src/xz/src/liblzma/common/easy_buffer_encoder.c deleted file mode 100644 index da610ce..0000000 --- a/software/src/xz/src/liblzma/common/easy_buffer_encoder.c +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_buffer_encoder.c -/// \brief Easy single-call .xz Stream encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "easy_preset.h" - - -extern LZMA_API(lzma_ret) -lzma_easy_buffer_encode(uint32_t preset, lzma_check check, - const lzma_allocator *allocator, const uint8_t *in, - size_t in_size, uint8_t *out, size_t *out_pos, size_t out_size) -{ - lzma_options_easy opt_easy; - if (lzma_easy_preset(&opt_easy, preset)) - return LZMA_OPTIONS_ERROR; - - return lzma_stream_buffer_encode(opt_easy.filters, check, - allocator, in, in_size, out, out_pos, out_size); -} diff --git a/software/src/xz/src/liblzma/common/easy_decoder_memusage.c b/software/src/xz/src/liblzma/common/easy_decoder_memusage.c deleted file mode 100644 index 0c76f10..0000000 --- a/software/src/xz/src/liblzma/common/easy_decoder_memusage.c +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_decoder_memusage.c -/// \brief Decoder memory usage calculation to match easy encoder presets -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "easy_preset.h" - - -extern LZMA_API(uint64_t) -lzma_easy_decoder_memusage(uint32_t preset) -{ - lzma_options_easy opt_easy; - if (lzma_easy_preset(&opt_easy, preset)) - return UINT32_MAX; - - return lzma_raw_decoder_memusage(opt_easy.filters); -} diff --git a/software/src/xz/src/liblzma/common/easy_encoder.c b/software/src/xz/src/liblzma/common/easy_encoder.c deleted file mode 100644 index 8dfe296..0000000 --- a/software/src/xz/src/liblzma/common/easy_encoder.c +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_encoder.c -/// \brief Easy .xz Stream encoder initialization -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "easy_preset.h" - - -extern LZMA_API(lzma_ret) -lzma_easy_encoder(lzma_stream *strm, uint32_t preset, lzma_check check) -{ - lzma_options_easy opt_easy; - if (lzma_easy_preset(&opt_easy, preset)) - return LZMA_OPTIONS_ERROR; - - return lzma_stream_encoder(strm, opt_easy.filters, check); -} diff --git a/software/src/xz/src/liblzma/common/easy_encoder_memusage.c b/software/src/xz/src/liblzma/common/easy_encoder_memusage.c deleted file mode 100644 index 1184ac6..0000000 --- a/software/src/xz/src/liblzma/common/easy_encoder_memusage.c +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_encoder_memusage.c -/// \brief Easy .xz Stream encoder memory usage calculation -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "easy_preset.h" - - -extern LZMA_API(uint64_t) -lzma_easy_encoder_memusage(uint32_t preset) -{ - lzma_options_easy opt_easy; - if (lzma_easy_preset(&opt_easy, preset)) - return UINT32_MAX; - - return lzma_raw_encoder_memusage(opt_easy.filters); -} diff --git a/software/src/xz/src/liblzma/common/easy_preset.c b/software/src/xz/src/liblzma/common/easy_preset.c deleted file mode 100644 index 7908a2b..0000000 --- a/software/src/xz/src/liblzma/common/easy_preset.c +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_preset.c -/// \brief Preset handling for easy encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "easy_preset.h" - - -extern bool -lzma_easy_preset(lzma_options_easy *opt_easy, uint32_t preset) -{ - if (lzma_lzma_preset(&opt_easy->opt_lzma, preset)) - return true; - - opt_easy->filters[0].id = LZMA_FILTER_LZMA2; - opt_easy->filters[0].options = &opt_easy->opt_lzma; - opt_easy->filters[1].id = LZMA_VLI_UNKNOWN; - - return false; -} diff --git a/software/src/xz/src/liblzma/common/easy_preset.h b/software/src/xz/src/liblzma/common/easy_preset.h deleted file mode 100644 index 4ef6d04..0000000 --- a/software/src/xz/src/liblzma/common/easy_preset.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file easy_preset.h -/// \brief Preset handling for easy encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_EASY_PRESET_H -#define LZMA_EASY_PRESET_H - -#include "common.h" - - -typedef struct { - /// We need to keep the filters array available in case - /// LZMA_FULL_FLUSH is used. - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - - /// Options for LZMA2 - lzma_options_lzma opt_lzma; - - // Options for more filters can be added later, so this struct - // is not ready to be put into the public API. - -} lzma_options_easy; - - -/// Set *easy to the settings given by the preset. Returns true on error, -/// false on success. -extern bool lzma_easy_preset(lzma_options_easy *easy, uint32_t preset); - -#endif diff --git a/software/src/xz/src/liblzma/common/file_info.c b/software/src/xz/src/liblzma/common/file_info.c deleted file mode 100644 index 4b2eb5d..0000000 --- a/software/src/xz/src/liblzma/common/file_info.c +++ /dev/null @@ -1,850 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file file_info.c -/// \brief Decode .xz file information into a lzma_index structure -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "index_decoder.h" - - -typedef struct { - enum { - SEQ_MAGIC_BYTES, - SEQ_PADDING_SEEK, - SEQ_PADDING_DECODE, - SEQ_FOOTER, - SEQ_INDEX_INIT, - SEQ_INDEX_DECODE, - SEQ_HEADER_DECODE, - SEQ_HEADER_COMPARE, - } sequence; - - /// Absolute position of in[*in_pos] in the file. All code that - /// modifies *in_pos also updates this. seek_to_pos() needs this - /// to determine if we need to request the application to seek for - /// us or if we can do the seeking internally by adjusting *in_pos. - uint64_t file_cur_pos; - - /// This refers to absolute positions of interesting parts of the - /// input file. Sometimes it points to the *beginning* of a specific - /// field and sometimes to the *end* of a field. The current target - /// position at each moment is explained in the comments. - uint64_t file_target_pos; - - /// Size of the .xz file (from the application). - uint64_t file_size; - - /// Index decoder - lzma_next_coder index_decoder; - - /// Number of bytes remaining in the Index field that is currently - /// being decoded. - lzma_vli index_remaining; - - /// The Index decoder will store the decoded Index in this pointer. - lzma_index *this_index; - - /// Amount of Stream Padding in the current Stream. - lzma_vli stream_padding; - - /// The final combined index is collected here. - lzma_index *combined_index; - - /// Pointer from the application where to store the index information - /// after successful decoding. - lzma_index **dest_index; - - /// Pointer to lzma_stream.seek_pos to be used when returning - /// LZMA_SEEK_NEEDED. This is set by seek_to_pos() when needed. - uint64_t *external_seek_pos; - - /// Memory usage limit - uint64_t memlimit; - - /// Stream Flags from the very beginning of the file. - lzma_stream_flags first_header_flags; - - /// Stream Flags from Stream Header of the current Stream. - lzma_stream_flags header_flags; - - /// Stream Flags from Stream Footer of the current Stream. - lzma_stream_flags footer_flags; - - size_t temp_pos; - size_t temp_size; - uint8_t temp[8192]; - -} lzma_file_info_coder; - - -/// Copies data from in[*in_pos] into coder->temp until -/// coder->temp_pos == coder->temp_size. This also keeps coder->file_cur_pos -/// in sync with *in_pos. Returns true if more input is needed. -static bool -fill_temp(lzma_file_info_coder *coder, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - coder->file_cur_pos += lzma_bufcpy(in, in_pos, in_size, - coder->temp, &coder->temp_pos, coder->temp_size); - return coder->temp_pos < coder->temp_size; -} - - -/// Seeks to the absolute file position specified by target_pos. -/// This tries to do the seeking by only modifying *in_pos, if possible. -/// The main benefit of this is that if one passes the whole file at once -/// to lzma_code(), the decoder will never need to return LZMA_SEEK_NEEDED -/// as all the seeking can be done by adjusting *in_pos in this function. -/// -/// Returns true if an external seek is needed and the caller must return -/// LZMA_SEEK_NEEDED. -static bool -seek_to_pos(lzma_file_info_coder *coder, uint64_t target_pos, - size_t in_start, size_t *in_pos, size_t in_size) -{ - // The input buffer doesn't extend beyond the end of the file. - // This has been checked by file_info_decode() already. - assert(coder->file_size - coder->file_cur_pos >= in_size - *in_pos); - - const uint64_t pos_min = coder->file_cur_pos - (*in_pos - in_start); - const uint64_t pos_max = coder->file_cur_pos + (in_size - *in_pos); - - bool external_seek_needed; - - if (target_pos >= pos_min && target_pos <= pos_max) { - // The requested position is available in the current input - // buffer or right after it. That is, in a corner case we - // end up setting *in_pos == in_size and thus will immediately - // need new input bytes from the application. - *in_pos += (size_t)(target_pos - coder->file_cur_pos); - external_seek_needed = false; - } else { - // Ask the application to seek the input file. - *coder->external_seek_pos = target_pos; - external_seek_needed = true; - - // Mark the whole input buffer as used. This way - // lzma_stream.total_in will have a better estimate - // of the amount of data read. It still won't be perfect - // as the value will depend on the input buffer size that - // the application uses, but it should be good enough for - // those few who want an estimate. - *in_pos = in_size; - } - - // After seeking (internal or external) the current position - // will match the requested target position. - coder->file_cur_pos = target_pos; - - return external_seek_needed; -} - - -/// The caller sets coder->file_target_pos so that it points to the *end* -/// of the desired file position. This function then determines how far -/// backwards from that position we can seek. After seeking fill_temp() -/// can be used to read data into coder->temp. When fill_temp() has finished, -/// coder->temp[coder->temp_size] will match coder->file_target_pos. -/// -/// This also validates that coder->target_file_pos is sane in sense that -/// we aren't trying to seek too far backwards (too close or beyond the -/// beginning of the file). -static lzma_ret -reverse_seek(lzma_file_info_coder *coder, - size_t in_start, size_t *in_pos, size_t in_size) -{ - // Check that there is enough data before the target position - // to contain at least Stream Header and Stream Footer. If there - // isn't, the file cannot be valid. - if (coder->file_target_pos < 2 * LZMA_STREAM_HEADER_SIZE) - return LZMA_DATA_ERROR; - - coder->temp_pos = 0; - - // The Stream Header at the very beginning of the file gets handled - // specially in SEQ_MAGIC_BYTES and thus we will never need to seek - // there. By not seeking to the first LZMA_STREAM_HEADER_SIZE bytes - // we avoid a useless external seek after SEQ_MAGIC_BYTES if the - // application uses an extremely small input buffer and the input - // file is very small. - if (coder->file_target_pos - LZMA_STREAM_HEADER_SIZE - < sizeof(coder->temp)) - coder->temp_size = (size_t)(coder->file_target_pos - - LZMA_STREAM_HEADER_SIZE); - else - coder->temp_size = sizeof(coder->temp); - - // The above if-statements guarantee this. This is important because - // the Stream Header/Footer decoders assume that there's at least - // LZMA_STREAM_HEADER_SIZE bytes in coder->temp. - assert(coder->temp_size >= LZMA_STREAM_HEADER_SIZE); - - if (seek_to_pos(coder, coder->file_target_pos - coder->temp_size, - in_start, in_pos, in_size)) - return LZMA_SEEK_NEEDED; - - return LZMA_OK; -} - - -/// Gets the number of zero-bytes at the end of the buffer. -static size_t -get_padding_size(const uint8_t *buf, size_t buf_size) -{ - size_t padding = 0; - while (buf_size > 0 && buf[--buf_size] == 0x00) - ++padding; - - return padding; -} - - -/// With the Stream Header at the very beginning of the file, LZMA_FORMAT_ERROR -/// is used to tell the application that Magic Bytes didn't match. In other -/// Stream Header/Footer fields (in the middle/end of the file) it could be -/// a bit confusing to return LZMA_FORMAT_ERROR as we already know that there -/// is a valid Stream Header at the beginning of the file. For those cases -/// this function is used to convert LZMA_FORMAT_ERROR to LZMA_DATA_ERROR. -static lzma_ret -hide_format_error(lzma_ret ret) -{ - if (ret == LZMA_FORMAT_ERROR) - ret = LZMA_DATA_ERROR; - - return ret; -} - - -/// Calls the Index decoder and updates coder->index_remaining. -/// This is a separate function because the input can be either directly -/// from the application or from coder->temp. -static lzma_ret -decode_index(lzma_file_info_coder *coder, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, bool update_file_cur_pos) -{ - const size_t in_start = *in_pos; - - const lzma_ret ret = coder->index_decoder.code( - coder->index_decoder.coder, - allocator, in, in_pos, in_size, - NULL, NULL, 0, LZMA_RUN); - - coder->index_remaining -= *in_pos - in_start; - - if (update_file_cur_pos) - coder->file_cur_pos += *in_pos - in_start; - - return ret; -} - - -static lzma_ret -file_info_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, - uint8_t *restrict out lzma_attribute((__unused__)), - size_t *restrict out_pos lzma_attribute((__unused__)), - size_t out_size lzma_attribute((__unused__)), - lzma_action action lzma_attribute((__unused__))) -{ - lzma_file_info_coder *coder = coder_ptr; - const size_t in_start = *in_pos; - - // If the caller provides input past the end of the file, trim - // the extra bytes from the buffer so that we won't read too far. - assert(coder->file_size >= coder->file_cur_pos); - if (coder->file_size - coder->file_cur_pos < in_size - in_start) - in_size = in_start - + (size_t)(coder->file_size - coder->file_cur_pos); - - while (true) - switch (coder->sequence) { - case SEQ_MAGIC_BYTES: - // Decode the Stream Header at the beginning of the file - // first to check if the Magic Bytes match. The flags - // are stored in coder->first_header_flags so that we - // don't need to seek to it again. - // - // Check that the file is big enough to contain at least - // Stream Header. - if (coder->file_size < LZMA_STREAM_HEADER_SIZE) - return LZMA_FORMAT_ERROR; - - // Read the Stream Header field into coder->temp. - if (fill_temp(coder, in, in_pos, in_size)) - return LZMA_OK; - - // This is the only Stream Header/Footer decoding where we - // want to return LZMA_FORMAT_ERROR if the Magic Bytes don't - // match. Elsewhere it will be converted to LZMA_DATA_ERROR. - return_if_error(lzma_stream_header_decode( - &coder->first_header_flags, coder->temp)); - - // Now that we know that the Magic Bytes match, check the - // file size. It's better to do this here after checking the - // Magic Bytes since this way we can give LZMA_FORMAT_ERROR - // instead of LZMA_DATA_ERROR when the Magic Bytes don't - // match in a file that is too big or isn't a multiple of - // four bytes. - if (coder->file_size > LZMA_VLI_MAX || (coder->file_size & 3)) - return LZMA_DATA_ERROR; - - // Start looking for Stream Padding and Stream Footer - // at the end of the file. - coder->file_target_pos = coder->file_size; - FALLTHROUGH; - - case SEQ_PADDING_SEEK: - coder->sequence = SEQ_PADDING_DECODE; - return_if_error(reverse_seek( - coder, in_start, in_pos, in_size)); - FALLTHROUGH; - - case SEQ_PADDING_DECODE: { - // Copy to coder->temp first. This keeps the code simpler if - // the application only provides input a few bytes at a time. - if (fill_temp(coder, in, in_pos, in_size)) - return LZMA_OK; - - // Scan the buffer backwards to get the size of the - // Stream Padding field (if any). - const size_t new_padding = get_padding_size( - coder->temp, coder->temp_size); - coder->stream_padding += new_padding; - - // Set the target position to the beginning of Stream Padding - // that has been observed so far. If all Stream Padding has - // been seen, then the target position will be at the end - // of the Stream Footer field. - coder->file_target_pos -= new_padding; - - if (new_padding == coder->temp_size) { - // The whole buffer was padding. Seek backwards in - // the file to get more input. - coder->sequence = SEQ_PADDING_SEEK; - break; - } - - // Size of Stream Padding must be a multiple of 4 bytes. - if (coder->stream_padding & 3) - return LZMA_DATA_ERROR; - - coder->sequence = SEQ_FOOTER; - - // Calculate the amount of non-padding data in coder->temp. - coder->temp_size -= new_padding; - coder->temp_pos = coder->temp_size; - - // We can avoid an external seek if the whole Stream Footer - // is already in coder->temp. In that case SEQ_FOOTER won't - // read more input and will find the Stream Footer from - // coder->temp[coder->temp_size - LZMA_STREAM_HEADER_SIZE]. - // - // Otherwise we will need to seek. The seeking is done so - // that Stream Footer will be at the end of coder->temp. - // This way it's likely that we also get a complete Index - // field into coder->temp without needing a separate seek - // for that (unless the Index field is big). - if (coder->temp_size < LZMA_STREAM_HEADER_SIZE) - return_if_error(reverse_seek( - coder, in_start, in_pos, in_size)); - - FALLTHROUGH; - } - - case SEQ_FOOTER: - // Copy the Stream Footer field into coder->temp. - // If Stream Footer was already available in coder->temp - // in SEQ_PADDING_DECODE, then this does nothing. - if (fill_temp(coder, in, in_pos, in_size)) - return LZMA_OK; - - // Make coder->file_target_pos and coder->temp_size point - // to the beginning of Stream Footer and thus to the end - // of the Index field. coder->temp_pos will be updated - // a bit later. - coder->file_target_pos -= LZMA_STREAM_HEADER_SIZE; - coder->temp_size -= LZMA_STREAM_HEADER_SIZE; - - // Decode Stream Footer. - return_if_error(hide_format_error(lzma_stream_footer_decode( - &coder->footer_flags, - coder->temp + coder->temp_size))); - - // Check that we won't seek past the beginning of the file. - // - // LZMA_STREAM_HEADER_SIZE is added because there must be - // space for Stream Header too even though we won't seek - // there before decoding the Index field. - // - // There's no risk of integer overflow here because - // Backward Size cannot be greater than 2^34. - if (coder->file_target_pos < coder->footer_flags.backward_size - + LZMA_STREAM_HEADER_SIZE) - return LZMA_DATA_ERROR; - - // Set the target position to the beginning of the Index field. - coder->file_target_pos -= coder->footer_flags.backward_size; - coder->sequence = SEQ_INDEX_INIT; - - // We can avoid an external seek if the whole Index field is - // already available in coder->temp. - if (coder->temp_size >= coder->footer_flags.backward_size) { - // Set coder->temp_pos to point to the beginning - // of the Index. - coder->temp_pos = coder->temp_size - - coder->footer_flags.backward_size; - } else { - // These are set to zero to indicate that there's no - // useful data (Index or anything else) in coder->temp. - coder->temp_pos = 0; - coder->temp_size = 0; - - // Seek to the beginning of the Index field. - if (seek_to_pos(coder, coder->file_target_pos, - in_start, in_pos, in_size)) - return LZMA_SEEK_NEEDED; - } - - FALLTHROUGH; - - case SEQ_INDEX_INIT: { - // Calculate the amount of memory already used by the earlier - // Indexes so that we know how big memory limit to pass to - // the Index decoder. - // - // NOTE: When there are multiple Streams, the separate - // lzma_index structures can use more RAM (as measured by - // lzma_index_memused()) than the final combined lzma_index. - // Thus memlimit may need to be slightly higher than the final - // calculated memory usage will be. This is perhaps a bit - // confusing to the application, but I think it shouldn't - // cause problems in practice. - uint64_t memused = 0; - if (coder->combined_index != NULL) { - memused = lzma_index_memused(coder->combined_index); - assert(memused <= coder->memlimit); - if (memused > coder->memlimit) // Extra sanity check - return LZMA_PROG_ERROR; - } - - // Initialize the Index decoder. - return_if_error(lzma_index_decoder_init( - &coder->index_decoder, allocator, - &coder->this_index, - coder->memlimit - memused)); - - coder->index_remaining = coder->footer_flags.backward_size; - coder->sequence = SEQ_INDEX_DECODE; - FALLTHROUGH; - } - - case SEQ_INDEX_DECODE: { - // Decode (a part of) the Index. If the whole Index is already - // in coder->temp, read it from there. Otherwise read from - // in[*in_pos] onwards. Note that index_decode() updates - // coder->index_remaining and optionally coder->file_cur_pos. - lzma_ret ret; - if (coder->temp_size != 0) { - assert(coder->temp_size - coder->temp_pos - == coder->index_remaining); - ret = decode_index(coder, allocator, coder->temp, - &coder->temp_pos, coder->temp_size, - false); - } else { - // Don't give the decoder more input than the known - // remaining size of the Index field. - size_t in_stop = in_size; - if (in_size - *in_pos > coder->index_remaining) - in_stop = *in_pos - + (size_t)(coder->index_remaining); - - ret = decode_index(coder, allocator, - in, in_pos, in_stop, true); - } - - switch (ret) { - case LZMA_OK: - // If the Index docoder asks for more input when we - // have already given it as much input as Backward Size - // indicated, the file is invalid. - if (coder->index_remaining == 0) - return LZMA_DATA_ERROR; - - // We cannot get here if we were reading Index from - // coder->temp because when reading from coder->temp - // we give the Index decoder exactly - // coder->index_remaining bytes of input. - assert(coder->temp_size == 0); - - return LZMA_OK; - - case LZMA_STREAM_END: - // If the decoding seems to be successful, check also - // that the Index decoder consumed as much input as - // indicated by the Backward Size field. - if (coder->index_remaining != 0) - return LZMA_DATA_ERROR; - - break; - - default: - return ret; - } - - // Calculate how much the Index tells us to seek backwards - // (relative to the beginning of the Index): Total size of - // all Blocks plus the size of the Stream Header field. - // No integer overflow here because lzma_index_total_size() - // cannot return a value greater than LZMA_VLI_MAX. - const uint64_t seek_amount - = lzma_index_total_size(coder->this_index) - + LZMA_STREAM_HEADER_SIZE; - - // Check that Index is sane in sense that seek_amount won't - // make us seek past the beginning of the file when locating - // the Stream Header. - // - // coder->file_target_pos still points to the beginning of - // the Index field. - if (coder->file_target_pos < seek_amount) - return LZMA_DATA_ERROR; - - // Set the target to the beginning of Stream Header. - coder->file_target_pos -= seek_amount; - - if (coder->file_target_pos == 0) { - // We would seek to the beginning of the file, but - // since we already decoded that Stream Header in - // SEQ_MAGIC_BYTES, we can use the cached value from - // coder->first_header_flags to avoid the seek. - coder->header_flags = coder->first_header_flags; - coder->sequence = SEQ_HEADER_COMPARE; - break; - } - - coder->sequence = SEQ_HEADER_DECODE; - - // Make coder->file_target_pos point to the end of - // the Stream Header field. - coder->file_target_pos += LZMA_STREAM_HEADER_SIZE; - - // If coder->temp_size is non-zero, it points to the end - // of the Index field. Then the beginning of the Index - // field is at coder->temp[coder->temp_size - // - coder->footer_flags.backward_size]. - assert(coder->temp_size == 0 || coder->temp_size - >= coder->footer_flags.backward_size); - - // If coder->temp contained the whole Index, see if it has - // enough data to contain also the Stream Header. If so, - // we avoid an external seek. - // - // NOTE: This can happen only with small .xz files and only - // for the non-first Stream as the Stream Flags of the first - // Stream are cached and already handled a few lines above. - // So this isn't as useful as the other seek-avoidance cases. - if (coder->temp_size != 0 && coder->temp_size - - coder->footer_flags.backward_size - >= seek_amount) { - // Make temp_pos and temp_size point to the *end* of - // Stream Header so that SEQ_HEADER_DECODE will find - // the start of Stream Header from coder->temp[ - // coder->temp_size - LZMA_STREAM_HEADER_SIZE]. - coder->temp_pos = coder->temp_size - - coder->footer_flags.backward_size - - seek_amount - + LZMA_STREAM_HEADER_SIZE; - coder->temp_size = coder->temp_pos; - } else { - // Seek so that Stream Header will be at the end of - // coder->temp. With typical multi-Stream files we - // will usually also get the Stream Footer and Index - // of the *previous* Stream in coder->temp and thus - // won't need a separate seek for them. - return_if_error(reverse_seek(coder, - in_start, in_pos, in_size)); - } - - FALLTHROUGH; - } - - case SEQ_HEADER_DECODE: - // Copy the Stream Header field into coder->temp. - // If Stream Header was already available in coder->temp - // in SEQ_INDEX_DECODE, then this does nothing. - if (fill_temp(coder, in, in_pos, in_size)) - return LZMA_OK; - - // Make all these point to the beginning of Stream Header. - coder->file_target_pos -= LZMA_STREAM_HEADER_SIZE; - coder->temp_size -= LZMA_STREAM_HEADER_SIZE; - coder->temp_pos = coder->temp_size; - - // Decode the Stream Header. - return_if_error(hide_format_error(lzma_stream_header_decode( - &coder->header_flags, - coder->temp + coder->temp_size))); - - coder->sequence = SEQ_HEADER_COMPARE; - FALLTHROUGH; - - case SEQ_HEADER_COMPARE: - // Compare Stream Header against Stream Footer. They must - // match. - return_if_error(lzma_stream_flags_compare( - &coder->header_flags, &coder->footer_flags)); - - // Store the decoded Stream Flags into the Index. Use the - // Footer Flags because it contains Backward Size, although - // it shouldn't matter in practice. - if (lzma_index_stream_flags(coder->this_index, - &coder->footer_flags) != LZMA_OK) - return LZMA_PROG_ERROR; - - // Store also the size of the Stream Padding field. It is - // needed to calculate the offsets of the Streams correctly. - if (lzma_index_stream_padding(coder->this_index, - coder->stream_padding) != LZMA_OK) - return LZMA_PROG_ERROR; - - // Reset it so that it's ready for the next Stream. - coder->stream_padding = 0; - - // Append the earlier decoded Indexes after this_index. - if (coder->combined_index != NULL) - return_if_error(lzma_index_cat(coder->this_index, - coder->combined_index, allocator)); - - coder->combined_index = coder->this_index; - coder->this_index = NULL; - - // If the whole file was decoded, tell the caller that we - // are finished. - if (coder->file_target_pos == 0) { - // The combined index must indicate the same file - // size as was told to us at initialization. - assert(lzma_index_file_size(coder->combined_index) - == coder->file_size); - - // Make the combined index available to - // the application. - *coder->dest_index = coder->combined_index; - coder->combined_index = NULL; - - // Mark the input buffer as used since we may have - // done internal seeking and thus don't know how - // many input bytes were actually used. This way - // lzma_stream.total_in gets a slightly better - // estimate of the amount of input used. - *in_pos = in_size; - return LZMA_STREAM_END; - } - - // We didn't hit the beginning of the file yet, so continue - // reading backwards in the file. If we have unprocessed - // data in coder->temp, use it before requesting more data - // from the application. - // - // coder->file_target_pos, coder->temp_size, and - // coder->temp_pos all point to the beginning of Stream Header - // and thus the end of the previous Stream in the file. - coder->sequence = coder->temp_size > 0 - ? SEQ_PADDING_DECODE : SEQ_PADDING_SEEK; - break; - - default: - assert(0); - return LZMA_PROG_ERROR; - } -} - - -static lzma_ret -file_info_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_file_info_coder *coder = coder_ptr; - - // The memory usage calculation comes from three things: - // - // (1) The Indexes that have already been decoded and processed into - // coder->combined_index. - // - // (2) The latest Index in coder->this_index that has been decoded but - // not yet put into coder->combined_index. - // - // (3) The latest Index that we have started decoding but haven't - // finished and thus isn't available in coder->this_index yet. - // Memory usage and limit information needs to be communicated - // from/to coder->index_decoder. - // - // Care has to be taken to not do both (2) and (3) when calculating - // the memory usage. - uint64_t combined_index_memusage = 0; - uint64_t this_index_memusage = 0; - - // (1) If we have already successfully decoded one or more Indexes, - // get their memory usage. - if (coder->combined_index != NULL) - combined_index_memusage = lzma_index_memused( - coder->combined_index); - - // Choose between (2), (3), or neither. - if (coder->this_index != NULL) { - // (2) The latest Index is available. Use its memory usage. - this_index_memusage = lzma_index_memused(coder->this_index); - - } else if (coder->sequence == SEQ_INDEX_DECODE) { - // (3) The Index decoder is activate and hasn't yet stored - // the new index in coder->this_index. Get the memory usage - // information from the Index decoder. - // - // NOTE: If the Index decoder doesn't yet know how much memory - // it will eventually need, it will return a tiny value here. - uint64_t dummy; - if (coder->index_decoder.memconfig(coder->index_decoder.coder, - &this_index_memusage, &dummy, 0) - != LZMA_OK) { - assert(0); - return LZMA_PROG_ERROR; - } - } - - // Now we know the total memory usage/requirement. If we had neither - // old Indexes nor a new Index, this will be zero which isn't - // acceptable as lzma_memusage() has to return non-zero on success - // and even with an empty .xz file we will end up with a lzma_index - // that takes some memory. - *memusage = combined_index_memusage + this_index_memusage; - if (*memusage == 0) - *memusage = lzma_index_memusage(1, 0); - - *old_memlimit = coder->memlimit; - - // If requested, set a new memory usage limit. - if (new_memlimit != 0) { - if (new_memlimit < *memusage) - return LZMA_MEMLIMIT_ERROR; - - // In the condition (3) we need to tell the Index decoder - // its new memory usage limit. - if (coder->this_index == NULL - && coder->sequence == SEQ_INDEX_DECODE) { - const uint64_t idec_new_memlimit = new_memlimit - - combined_index_memusage; - - assert(this_index_memusage > 0); - assert(idec_new_memlimit > 0); - - uint64_t dummy1; - uint64_t dummy2; - - if (coder->index_decoder.memconfig( - coder->index_decoder.coder, - &dummy1, &dummy2, idec_new_memlimit) - != LZMA_OK) { - assert(0); - return LZMA_PROG_ERROR; - } - } - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -static void -file_info_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_file_info_coder *coder = coder_ptr; - - lzma_next_end(&coder->index_decoder, allocator); - lzma_index_end(coder->this_index, allocator); - lzma_index_end(coder->combined_index, allocator); - - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -lzma_file_info_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, uint64_t *seek_pos, - lzma_index **dest_index, - uint64_t memlimit, uint64_t file_size) -{ - lzma_next_coder_init(&lzma_file_info_decoder_init, next, allocator); - - if (dest_index == NULL) - return LZMA_PROG_ERROR; - - lzma_file_info_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_file_info_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &file_info_decode; - next->end = &file_info_decoder_end; - next->memconfig = &file_info_decoder_memconfig; - - coder->index_decoder = LZMA_NEXT_CODER_INIT; - coder->this_index = NULL; - coder->combined_index = NULL; - } - - coder->sequence = SEQ_MAGIC_BYTES; - coder->file_cur_pos = 0; - coder->file_target_pos = 0; - coder->file_size = file_size; - - lzma_index_end(coder->this_index, allocator); - coder->this_index = NULL; - - lzma_index_end(coder->combined_index, allocator); - coder->combined_index = NULL; - - coder->stream_padding = 0; - - coder->dest_index = dest_index; - coder->external_seek_pos = seek_pos; - - // If memlimit is 0, make it 1 to ensure that lzma_memlimit_get() - // won't return 0 (which would indicate an error). - coder->memlimit = my_max(1, memlimit); - - // Prepare these for reading the first Stream Header into coder->temp. - coder->temp_pos = 0; - coder->temp_size = LZMA_STREAM_HEADER_SIZE; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_file_info_decoder(lzma_stream *strm, lzma_index **dest_index, - uint64_t memlimit, uint64_t file_size) -{ - lzma_next_strm_init(lzma_file_info_decoder_init, strm, &strm->seek_pos, - dest_index, memlimit, file_size); - - // We allow LZMA_FINISH in addition to LZMA_RUN for convenience. - // lzma_code() is able to handle the LZMA_FINISH + LZMA_SEEK_NEEDED - // combination in a sane way. Applications still need to be careful - // if they use LZMA_FINISH so that they remember to reset it back - // to LZMA_RUN after seeking if needed. - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/filter_buffer_decoder.c b/software/src/xz/src/liblzma/common/filter_buffer_decoder.c deleted file mode 100644 index cc0d88c..0000000 --- a/software/src/xz/src/liblzma/common/filter_buffer_decoder.c +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_buffer_decoder.c -/// \brief Single-call raw decoding -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_decoder.h" - - -extern LZMA_API(lzma_ret) -lzma_raw_buffer_decode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Validate what isn't validated later in filter_common.c. - if (in == NULL || in_pos == NULL || *in_pos > in_size || out == NULL - || out_pos == NULL || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // Initialize the decoder. - lzma_next_coder next = LZMA_NEXT_CODER_INIT; - return_if_error(lzma_raw_decoder_init(&next, allocator, filters)); - - // Store the positions so that we can restore them if something - // goes wrong. - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - // Do the actual decoding and free decoder's memory. - lzma_ret ret = next.code(next.coder, allocator, in, in_pos, in_size, - out, out_pos, out_size, LZMA_FINISH); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - if (ret == LZMA_OK) { - // Either the input was truncated or the - // output buffer was too small. - assert(*in_pos == in_size || *out_pos == out_size); - - if (*in_pos != in_size) { - // Since input wasn't consumed completely, - // the output buffer became full and is - // too small. - ret = LZMA_BUF_ERROR; - - } else if (*out_pos != out_size) { - // Since output didn't became full, the input - // has to be truncated. - ret = LZMA_DATA_ERROR; - - } else { - // All the input was consumed and output - // buffer is full. Now we don't immediately - // know the reason for the error. Try - // decoding one more byte. If it succeeds, - // then the output buffer was too small. If - // we cannot get a new output byte, the input - // is truncated. - uint8_t tmp[1]; - size_t tmp_pos = 0; - (void)next.code(next.coder, allocator, - in, in_pos, in_size, - tmp, &tmp_pos, 1, LZMA_FINISH); - - if (tmp_pos == 1) - ret = LZMA_BUF_ERROR; - else - ret = LZMA_DATA_ERROR; - } - } - - // Restore the positions. - *in_pos = in_start; - *out_pos = out_start; - } - - lzma_next_end(&next, allocator); - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/filter_buffer_encoder.c b/software/src/xz/src/liblzma/common/filter_buffer_encoder.c deleted file mode 100644 index 7fb8922..0000000 --- a/software/src/xz/src/liblzma/common/filter_buffer_encoder.c +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_buffer_encoder.c -/// \brief Single-call raw encoding -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_encoder.h" - - -extern LZMA_API(lzma_ret) -lzma_raw_buffer_encode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Validate what isn't validated later in filter_common.c. - if ((in == NULL && in_size != 0) || out == NULL - || out_pos == NULL || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // Initialize the encoder - lzma_next_coder next = LZMA_NEXT_CODER_INIT; - return_if_error(lzma_raw_encoder_init(&next, allocator, filters)); - - // Store the output position so that we can restore it if - // something goes wrong. - const size_t out_start = *out_pos; - - // Do the actual encoding and free coder's memory. - size_t in_pos = 0; - lzma_ret ret = next.code(next.coder, allocator, in, &in_pos, in_size, - out, out_pos, out_size, LZMA_FINISH); - lzma_next_end(&next, allocator); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - if (ret == LZMA_OK) { - // Output buffer was too small. - assert(*out_pos == out_size); - ret = LZMA_BUF_ERROR; - } - - // Restore the output position. - *out_pos = out_start; - } - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/filter_common.c b/software/src/xz/src/liblzma/common/filter_common.c deleted file mode 100644 index d15d9cc..0000000 --- a/software/src/xz/src/liblzma/common/filter_common.c +++ /dev/null @@ -1,393 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_common.c -/// \brief Filter-specific stuff common for both encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_common.h" - - -static const struct { - /// Filter ID - lzma_vli id; - - /// Size of the filter-specific options structure - size_t options_size; - - /// True if it is OK to use this filter as non-last filter in - /// the chain. - bool non_last_ok; - - /// True if it is OK to use this filter as the last filter in - /// the chain. - bool last_ok; - - /// True if the filter may change the size of the data (that is, the - /// amount of encoded output can be different than the amount of - /// uncompressed input). - bool changes_size; - -} features[] = { -#if defined (HAVE_ENCODER_LZMA1) || defined(HAVE_DECODER_LZMA1) - { - .id = LZMA_FILTER_LZMA1, - .options_size = sizeof(lzma_options_lzma), - .non_last_ok = false, - .last_ok = true, - .changes_size = true, - }, - { - .id = LZMA_FILTER_LZMA1EXT, - .options_size = sizeof(lzma_options_lzma), - .non_last_ok = false, - .last_ok = true, - .changes_size = true, - }, -#endif -#if defined(HAVE_ENCODER_LZMA2) || defined(HAVE_DECODER_LZMA2) - { - .id = LZMA_FILTER_LZMA2, - .options_size = sizeof(lzma_options_lzma), - .non_last_ok = false, - .last_ok = true, - .changes_size = true, - }, -#endif -#if defined(HAVE_ENCODER_X86) || defined(HAVE_DECODER_X86) - { - .id = LZMA_FILTER_X86, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_POWERPC) || defined(HAVE_DECODER_POWERPC) - { - .id = LZMA_FILTER_POWERPC, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_IA64) || defined(HAVE_DECODER_IA64) - { - .id = LZMA_FILTER_IA64, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_ARM) || defined(HAVE_DECODER_ARM) - { - .id = LZMA_FILTER_ARM, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_ARMTHUMB) || defined(HAVE_DECODER_ARMTHUMB) - { - .id = LZMA_FILTER_ARMTHUMB, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_ARM64) || defined(HAVE_DECODER_ARM64) - { - .id = LZMA_FILTER_ARM64, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_SPARC) || defined(HAVE_DECODER_SPARC) - { - .id = LZMA_FILTER_SPARC, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_RISCV) || defined(HAVE_DECODER_RISCV) - { - .id = LZMA_FILTER_RISCV, - .options_size = sizeof(lzma_options_bcj), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif -#if defined(HAVE_ENCODER_DELTA) || defined(HAVE_DECODER_DELTA) - { - .id = LZMA_FILTER_DELTA, - .options_size = sizeof(lzma_options_delta), - .non_last_ok = true, - .last_ok = false, - .changes_size = false, - }, -#endif - { - .id = LZMA_VLI_UNKNOWN - } -}; - - -extern LZMA_API(lzma_ret) -lzma_filters_copy(const lzma_filter *src, lzma_filter *real_dest, - const lzma_allocator *allocator) -{ - if (src == NULL || real_dest == NULL) - return LZMA_PROG_ERROR; - - // Use a temporary destination so that the real destination - // will never be modified if an error occurs. - lzma_filter dest[LZMA_FILTERS_MAX + 1]; - - lzma_ret ret; - size_t i; - for (i = 0; src[i].id != LZMA_VLI_UNKNOWN; ++i) { - // There must be a maximum of four filters plus - // the array terminator. - if (i == LZMA_FILTERS_MAX) { - ret = LZMA_OPTIONS_ERROR; - goto error; - } - - dest[i].id = src[i].id; - - if (src[i].options == NULL) { - dest[i].options = NULL; - } else { - // See if the filter is supported only when the - // options is not NULL. This might be convenient - // sometimes if the app is actually copying only - // a partial filter chain with a place holder ID. - // - // When options is not NULL, the Filter ID must be - // supported by us, because otherwise we don't know - // how big the options are. - size_t j; - for (j = 0; src[i].id != features[j].id; ++j) { - if (features[j].id == LZMA_VLI_UNKNOWN) { - ret = LZMA_OPTIONS_ERROR; - goto error; - } - } - - // Allocate and copy the options. - dest[i].options = lzma_alloc(features[j].options_size, - allocator); - if (dest[i].options == NULL) { - ret = LZMA_MEM_ERROR; - goto error; - } - - memcpy(dest[i].options, src[i].options, - features[j].options_size); - } - } - - // Terminate the filter array. - assert(i < LZMA_FILTERS_MAX + 1); - dest[i].id = LZMA_VLI_UNKNOWN; - dest[i].options = NULL; - - // Copy it to the caller-supplied array now that we know that - // no errors occurred. - memcpy(real_dest, dest, (i + 1) * sizeof(lzma_filter)); - - return LZMA_OK; - -error: - // Free the options which we have already allocated. - while (i-- > 0) - lzma_free(dest[i].options, allocator); - - return ret; -} - - -extern LZMA_API(void) -lzma_filters_free(lzma_filter *filters, const lzma_allocator *allocator) -{ - if (filters == NULL) - return; - - for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i) { - if (i == LZMA_FILTERS_MAX) { - // The API says that LZMA_FILTERS_MAX + 1 is the - // maximum allowed size including the terminating - // element. Thus, we should never get here but in - // case there is a bug and we do anyway, don't go - // past the (probable) end of the array. - assert(0); - break; - } - - lzma_free(filters[i].options, allocator); - filters[i].options = NULL; - filters[i].id = LZMA_VLI_UNKNOWN; - } - - return; -} - - -extern lzma_ret -lzma_validate_chain(const lzma_filter *filters, size_t *count) -{ - // There must be at least one filter. - if (filters == NULL || filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_PROG_ERROR; - - // Number of non-last filters that may change the size of the data - // significantly (that is, more than 1-2 % or so). - size_t changes_size_count = 0; - - // True if it is OK to add a new filter after the current filter. - bool non_last_ok = true; - - // True if the last filter in the given chain is actually usable as - // the last filter. Only filters that support embedding End of Payload - // Marker can be used as the last filter in the chain. - bool last_ok = false; - - size_t i = 0; - do { - size_t j; - for (j = 0; filters[i].id != features[j].id; ++j) - if (features[j].id == LZMA_VLI_UNKNOWN) - return LZMA_OPTIONS_ERROR; - - // If the previous filter in the chain cannot be a non-last - // filter, the chain is invalid. - if (!non_last_ok) - return LZMA_OPTIONS_ERROR; - - non_last_ok = features[j].non_last_ok; - last_ok = features[j].last_ok; - changes_size_count += features[j].changes_size; - - } while (filters[++i].id != LZMA_VLI_UNKNOWN); - - // There must be 1-4 filters. The last filter must be usable as - // the last filter in the chain. A maximum of three filters are - // allowed to change the size of the data. - if (i > LZMA_FILTERS_MAX || !last_ok || changes_size_count > 3) - return LZMA_OPTIONS_ERROR; - - *count = i; - return LZMA_OK; -} - - -extern lzma_ret -lzma_raw_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *options, - lzma_filter_find coder_find, bool is_encoder) -{ - // Do some basic validation and get the number of filters. - size_t count; - return_if_error(lzma_validate_chain(options, &count)); - - // Set the filter functions and copy the options pointer. - lzma_filter_info filters[LZMA_FILTERS_MAX + 1]; - if (is_encoder) { - for (size_t i = 0; i < count; ++i) { - // The order of the filters is reversed in the - // encoder. It allows more efficient handling - // of the uncompressed data. - const size_t j = count - i - 1; - - const lzma_filter_coder *const fc - = coder_find(options[i].id); - if (fc == NULL || fc->init == NULL) - return LZMA_OPTIONS_ERROR; - - filters[j].id = options[i].id; - filters[j].init = fc->init; - filters[j].options = options[i].options; - } - } else { - for (size_t i = 0; i < count; ++i) { - const lzma_filter_coder *const fc - = coder_find(options[i].id); - if (fc == NULL || fc->init == NULL) - return LZMA_OPTIONS_ERROR; - - filters[i].id = options[i].id; - filters[i].init = fc->init; - filters[i].options = options[i].options; - } - } - - // Terminate the array. - filters[count].id = LZMA_VLI_UNKNOWN; - filters[count].init = NULL; - - // Initialize the filters. - const lzma_ret ret = lzma_next_filter_init(next, allocator, filters); - if (ret != LZMA_OK) - lzma_next_end(next, allocator); - - return ret; -} - - -extern uint64_t -lzma_raw_coder_memusage(lzma_filter_find coder_find, - const lzma_filter *filters) -{ - // The chain has to have at least one filter. - { - size_t tmp; - if (lzma_validate_chain(filters, &tmp) != LZMA_OK) - return UINT64_MAX; - } - - uint64_t total = 0; - size_t i = 0; - - do { - const lzma_filter_coder *const fc - = coder_find(filters[i].id); - if (fc == NULL) - return UINT64_MAX; // Unsupported Filter ID - - if (fc->memusage == NULL) { - // This filter doesn't have a function to calculate - // the memory usage and validate the options. Such - // filters need only little memory, so we use 1 KiB - // as a good estimate. They also accept all possible - // options, so there's no need to worry about lack - // of validation. - total += 1024; - } else { - // Call the filter-specific memory usage calculation - // function. - const uint64_t usage - = fc->memusage(filters[i].options); - if (usage == UINT64_MAX) - return UINT64_MAX; // Invalid options - - total += usage; - } - } while (filters[++i].id != LZMA_VLI_UNKNOWN); - - // Add some fixed amount of extra. It's to compensate memory usage - // of Stream, Block etc. coders, malloc() overhead, stack etc. - return total + LZMA_MEMUSAGE_BASE; -} diff --git a/software/src/xz/src/liblzma/common/filter_common.h b/software/src/xz/src/liblzma/common/filter_common.h deleted file mode 100644 index 95f9fe2..0000000 --- a/software/src/xz/src/liblzma/common/filter_common.h +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_common.h -/// \brief Filter-specific stuff common for both encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FILTER_COMMON_H -#define LZMA_FILTER_COMMON_H - -#include "common.h" - - -/// Both lzma_filter_encoder and lzma_filter_decoder begin with these members. -typedef struct { - /// Filter ID - lzma_vli id; - - /// Initializes the filter encoder and calls lzma_next_filter_init() - /// for filters + 1. - lzma_init_function init; - - /// Calculates memory usage of the encoder. If the options are - /// invalid, UINT64_MAX is returned. - uint64_t (*memusage)(const void *options); - -} lzma_filter_coder; - - -typedef const lzma_filter_coder *(*lzma_filter_find)(lzma_vli id); - - -extern lzma_ret lzma_validate_chain(const lzma_filter *filters, size_t *count); - - -extern lzma_ret lzma_raw_coder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *filters, - lzma_filter_find coder_find, bool is_encoder); - - -extern uint64_t lzma_raw_coder_memusage(lzma_filter_find coder_find, - const lzma_filter *filters); - - -#endif diff --git a/software/src/xz/src/liblzma/common/filter_decoder.c b/software/src/xz/src/liblzma/common/filter_decoder.c deleted file mode 100644 index cbdeb58..0000000 --- a/software/src/xz/src/liblzma/common/filter_decoder.c +++ /dev/null @@ -1,214 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_decoder.c -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_decoder.h" -#include "filter_common.h" -#include "lzma_decoder.h" -#include "lzma2_decoder.h" -#include "simple_decoder.h" -#include "delta_decoder.h" - - -typedef struct { - /// Filter ID - lzma_vli id; - - /// Initializes the filter encoder and calls lzma_next_filter_init() - /// for filters + 1. - lzma_init_function init; - - /// Calculates memory usage of the encoder. If the options are - /// invalid, UINT64_MAX is returned. - uint64_t (*memusage)(const void *options); - - /// Decodes Filter Properties. - /// - /// \return - LZMA_OK: Properties decoded successfully. - /// - LZMA_OPTIONS_ERROR: Unsupported properties - /// - LZMA_MEM_ERROR: Memory allocation failed. - lzma_ret (*props_decode)( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - -} lzma_filter_decoder; - - -static const lzma_filter_decoder decoders[] = { -#ifdef HAVE_DECODER_LZMA1 - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_decoder_init, - .memusage = &lzma_lzma_decoder_memusage, - .props_decode = &lzma_lzma_props_decode, - }, - { - .id = LZMA_FILTER_LZMA1EXT, - .init = &lzma_lzma_decoder_init, - .memusage = &lzma_lzma_decoder_memusage, - .props_decode = &lzma_lzma_props_decode, - }, -#endif -#ifdef HAVE_DECODER_LZMA2 - { - .id = LZMA_FILTER_LZMA2, - .init = &lzma_lzma2_decoder_init, - .memusage = &lzma_lzma2_decoder_memusage, - .props_decode = &lzma_lzma2_props_decode, - }, -#endif -#ifdef HAVE_DECODER_X86 - { - .id = LZMA_FILTER_X86, - .init = &lzma_simple_x86_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_POWERPC - { - .id = LZMA_FILTER_POWERPC, - .init = &lzma_simple_powerpc_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_IA64 - { - .id = LZMA_FILTER_IA64, - .init = &lzma_simple_ia64_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_ARM - { - .id = LZMA_FILTER_ARM, - .init = &lzma_simple_arm_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_ARMTHUMB - { - .id = LZMA_FILTER_ARMTHUMB, - .init = &lzma_simple_armthumb_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_ARM64 - { - .id = LZMA_FILTER_ARM64, - .init = &lzma_simple_arm64_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_SPARC - { - .id = LZMA_FILTER_SPARC, - .init = &lzma_simple_sparc_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_RISCV - { - .id = LZMA_FILTER_RISCV, - .init = &lzma_simple_riscv_decoder_init, - .memusage = NULL, - .props_decode = &lzma_simple_props_decode, - }, -#endif -#ifdef HAVE_DECODER_DELTA - { - .id = LZMA_FILTER_DELTA, - .init = &lzma_delta_decoder_init, - .memusage = &lzma_delta_coder_memusage, - .props_decode = &lzma_delta_props_decode, - }, -#endif -}; - - -static const lzma_filter_decoder * -decoder_find(lzma_vli id) -{ - for (size_t i = 0; i < ARRAY_SIZE(decoders); ++i) - if (decoders[i].id == id) - return decoders + i; - - return NULL; -} - - -// lzma_filter_coder begins with the same members as lzma_filter_decoder. -// This function is a wrapper with a type that is compatible with the -// typedef of lzma_filter_find in filter_common.h. -static const lzma_filter_coder * -coder_find(lzma_vli id) -{ - return (const lzma_filter_coder *)decoder_find(id); -} - - -extern LZMA_API(lzma_bool) -lzma_filter_decoder_is_supported(lzma_vli id) -{ - return decoder_find(id) != NULL; -} - - -extern lzma_ret -lzma_raw_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *options) -{ - return lzma_raw_coder_init(next, allocator, - options, &coder_find, false); -} - - -extern LZMA_API(lzma_ret) -lzma_raw_decoder(lzma_stream *strm, const lzma_filter *options) -{ - lzma_next_strm_init(lzma_raw_decoder_init, strm, options); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} - - -extern LZMA_API(uint64_t) -lzma_raw_decoder_memusage(const lzma_filter *filters) -{ - return lzma_raw_coder_memusage(&coder_find, filters); -} - - -extern LZMA_API(lzma_ret) -lzma_properties_decode(lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - // Make it always NULL so that the caller can always safely free() it. - filter->options = NULL; - - const lzma_filter_decoder *const fd = decoder_find(filter->id); - if (fd == NULL) - return LZMA_OPTIONS_ERROR; - - if (fd->props_decode == NULL) - return props_size == 0 ? LZMA_OK : LZMA_OPTIONS_ERROR; - - return fd->props_decode( - &filter->options, allocator, props, props_size); -} diff --git a/software/src/xz/src/liblzma/common/filter_decoder.h b/software/src/xz/src/liblzma/common/filter_decoder.h deleted file mode 100644 index e610bc1..0000000 --- a/software/src/xz/src/liblzma/common/filter_decoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_decoder.h -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FILTER_DECODER_H -#define LZMA_FILTER_DECODER_H - -#include "common.h" - - -extern lzma_ret lzma_raw_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *options); - -#endif diff --git a/software/src/xz/src/liblzma/common/filter_encoder.c b/software/src/xz/src/liblzma/common/filter_encoder.c deleted file mode 100644 index bc39444..0000000 --- a/software/src/xz/src/liblzma/common/filter_encoder.c +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_decoder.c -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_encoder.h" -#include "filter_common.h" -#include "lzma_encoder.h" -#include "lzma2_encoder.h" -#include "simple_encoder.h" -#include "delta_encoder.h" - - -typedef struct { - /// Filter ID - lzma_vli id; - - /// Initializes the filter encoder and calls lzma_next_filter_init() - /// for filters + 1. - lzma_init_function init; - - /// Calculates memory usage of the encoder. If the options are - /// invalid, UINT64_MAX is returned. - uint64_t (*memusage)(const void *options); - - /// Calculates the recommended Uncompressed Size for .xz Blocks to - /// which the input data can be split to make multithreaded - /// encoding possible. If this is NULL, it is assumed that - /// the encoder is fast enough with single thread. If the options - /// are invalid, UINT64_MAX is returned. - uint64_t (*block_size)(const void *options); - - /// Tells the size of the Filter Properties field. If options are - /// invalid, LZMA_OPTIONS_ERROR is returned and size is set to - /// UINT32_MAX. - lzma_ret (*props_size_get)(uint32_t *size, const void *options); - - /// Some filters will always have the same size Filter Properties - /// field. If props_size_get is NULL, this value is used. - uint32_t props_size_fixed; - - /// Encodes Filter Properties. - /// - /// \return - LZMA_OK: Properties encoded successfully. - /// - LZMA_OPTIONS_ERROR: Unsupported options - /// - LZMA_PROG_ERROR: Invalid options or not enough - /// output space - lzma_ret (*props_encode)(const void *options, uint8_t *out); - -} lzma_filter_encoder; - - -static const lzma_filter_encoder encoders[] = { -#ifdef HAVE_ENCODER_LZMA1 - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_encoder_init, - .memusage = &lzma_lzma_encoder_memusage, - .block_size = NULL, // Not needed for LZMA1 - .props_size_get = NULL, - .props_size_fixed = 5, - .props_encode = &lzma_lzma_props_encode, - }, - { - .id = LZMA_FILTER_LZMA1EXT, - .init = &lzma_lzma_encoder_init, - .memusage = &lzma_lzma_encoder_memusage, - .block_size = NULL, // Not needed for LZMA1 - .props_size_get = NULL, - .props_size_fixed = 5, - .props_encode = &lzma_lzma_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_LZMA2 - { - .id = LZMA_FILTER_LZMA2, - .init = &lzma_lzma2_encoder_init, - .memusage = &lzma_lzma2_encoder_memusage, - .block_size = &lzma_lzma2_block_size, - .props_size_get = NULL, - .props_size_fixed = 1, - .props_encode = &lzma_lzma2_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_X86 - { - .id = LZMA_FILTER_X86, - .init = &lzma_simple_x86_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_POWERPC - { - .id = LZMA_FILTER_POWERPC, - .init = &lzma_simple_powerpc_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_IA64 - { - .id = LZMA_FILTER_IA64, - .init = &lzma_simple_ia64_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_ARM - { - .id = LZMA_FILTER_ARM, - .init = &lzma_simple_arm_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_ARMTHUMB - { - .id = LZMA_FILTER_ARMTHUMB, - .init = &lzma_simple_armthumb_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_ARM64 - { - .id = LZMA_FILTER_ARM64, - .init = &lzma_simple_arm64_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_SPARC - { - .id = LZMA_FILTER_SPARC, - .init = &lzma_simple_sparc_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_RISCV - { - .id = LZMA_FILTER_RISCV, - .init = &lzma_simple_riscv_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_DELTA - { - .id = LZMA_FILTER_DELTA, - .init = &lzma_delta_encoder_init, - .memusage = &lzma_delta_coder_memusage, - .block_size = NULL, - .props_size_get = NULL, - .props_size_fixed = 1, - .props_encode = &lzma_delta_props_encode, - }, -#endif -}; - - -static const lzma_filter_encoder * -encoder_find(lzma_vli id) -{ - for (size_t i = 0; i < ARRAY_SIZE(encoders); ++i) - if (encoders[i].id == id) - return encoders + i; - - return NULL; -} - - -// lzma_filter_coder begins with the same members as lzma_filter_encoder. -// This function is a wrapper with a type that is compatible with the -// typedef of lzma_filter_find in filter_common.h. -static const lzma_filter_coder * -coder_find(lzma_vli id) -{ - return (const lzma_filter_coder *)encoder_find(id); -} - - -extern LZMA_API(lzma_bool) -lzma_filter_encoder_is_supported(lzma_vli id) -{ - return encoder_find(id) != NULL; -} - - -extern LZMA_API(lzma_ret) -lzma_filters_update(lzma_stream *strm, const lzma_filter *filters) -{ - if (strm->internal->next.update == NULL) - return LZMA_PROG_ERROR; - - // Validate the filter chain. - if (lzma_raw_encoder_memusage(filters) == UINT64_MAX) - return LZMA_OPTIONS_ERROR; - - // The actual filter chain in the encoder is reversed. Some things - // still want the normal order chain, so we provide both. - size_t count = 1; - while (filters[count].id != LZMA_VLI_UNKNOWN) - ++count; - - lzma_filter reversed_filters[LZMA_FILTERS_MAX + 1]; - for (size_t i = 0; i < count; ++i) - reversed_filters[count - i - 1] = filters[i]; - - reversed_filters[count].id = LZMA_VLI_UNKNOWN; - - return strm->internal->next.update(strm->internal->next.coder, - strm->allocator, filters, reversed_filters); -} - - -extern lzma_ret -lzma_raw_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *filters) -{ - return lzma_raw_coder_init(next, allocator, - filters, &coder_find, true); -} - - -extern LZMA_API(lzma_ret) -lzma_raw_encoder(lzma_stream *strm, const lzma_filter *filters) -{ - lzma_next_strm_init(lzma_raw_coder_init, strm, filters, - &coder_find, true); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} - - -extern LZMA_API(uint64_t) -lzma_raw_encoder_memusage(const lzma_filter *filters) -{ - return lzma_raw_coder_memusage(&coder_find, filters); -} - - -extern LZMA_API(uint64_t) -lzma_mt_block_size(const lzma_filter *filters) -{ - if (filters == NULL) - return UINT64_MAX; - - uint64_t max = 0; - - for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i) { - const lzma_filter_encoder *const fe - = encoder_find(filters[i].id); - if (fe == NULL) - return UINT64_MAX; - - if (fe->block_size != NULL) { - const uint64_t size - = fe->block_size(filters[i].options); - if (size > max) - max = size; - } - } - - return max == 0 ? UINT64_MAX : max; -} - - -extern LZMA_API(lzma_ret) -lzma_properties_size(uint32_t *size, const lzma_filter *filter) -{ - const lzma_filter_encoder *const fe = encoder_find(filter->id); - if (fe == NULL) { - // Unknown filter - if the Filter ID is a proper VLI, - // return LZMA_OPTIONS_ERROR instead of LZMA_PROG_ERROR, - // because it's possible that we just don't have support - // compiled in for the requested filter. - return filter->id <= LZMA_VLI_MAX - ? LZMA_OPTIONS_ERROR : LZMA_PROG_ERROR; - } - - if (fe->props_size_get == NULL) { - // No props_size_get() function, use props_size_fixed. - *size = fe->props_size_fixed; - return LZMA_OK; - } - - return fe->props_size_get(size, filter->options); -} - - -extern LZMA_API(lzma_ret) -lzma_properties_encode(const lzma_filter *filter, uint8_t *props) -{ - const lzma_filter_encoder *const fe = encoder_find(filter->id); - if (fe == NULL) - return LZMA_PROG_ERROR; - - if (fe->props_encode == NULL) - return LZMA_OK; - - return fe->props_encode(filter->options, props); -} diff --git a/software/src/xz/src/liblzma/common/filter_encoder.h b/software/src/xz/src/liblzma/common/filter_encoder.h deleted file mode 100644 index 88f2daf..0000000 --- a/software/src/xz/src/liblzma/common/filter_encoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_encoder.h -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FILTER_ENCODER_H -#define LZMA_FILTER_ENCODER_H - -#include "common.h" - - -extern lzma_ret lzma_raw_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *filters); - -#endif diff --git a/software/src/xz/src/liblzma/common/filter_flags_decoder.c b/software/src/xz/src/liblzma/common/filter_flags_decoder.c deleted file mode 100644 index 0f5d204..0000000 --- a/software/src/xz/src/liblzma/common/filter_flags_decoder.c +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_flags_decoder.c -/// \brief Decodes a Filter Flags field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_decoder.h" - - -extern LZMA_API(lzma_ret) -lzma_filter_flags_decode( - lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size) -{ - // Set the pointer to NULL so the caller can always safely free it. - filter->options = NULL; - - // Filter ID - return_if_error(lzma_vli_decode(&filter->id, NULL, - in, in_pos, in_size)); - - if (filter->id >= LZMA_FILTER_RESERVED_START) - return LZMA_DATA_ERROR; - - // Size of Properties - lzma_vli props_size; - return_if_error(lzma_vli_decode(&props_size, NULL, - in, in_pos, in_size)); - - // Filter Properties - if (in_size - *in_pos < props_size) - return LZMA_DATA_ERROR; - - const lzma_ret ret = lzma_properties_decode( - filter, allocator, in + *in_pos, props_size); - - *in_pos += props_size; - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/filter_flags_encoder.c b/software/src/xz/src/liblzma/common/filter_flags_encoder.c deleted file mode 100644 index e1d6588..0000000 --- a/software/src/xz/src/liblzma/common/filter_flags_encoder.c +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_flags_encoder.c -/// \brief Encodes a Filter Flags field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_encoder.h" - - -extern LZMA_API(lzma_ret) -lzma_filter_flags_size(uint32_t *size, const lzma_filter *filter) -{ - if (filter->id >= LZMA_FILTER_RESERVED_START) - return LZMA_PROG_ERROR; - - return_if_error(lzma_properties_size(size, filter)); - - *size += lzma_vli_size(filter->id) + lzma_vli_size(*size); - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_filter_flags_encode(const lzma_filter *filter, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Filter ID - if (filter->id >= LZMA_FILTER_RESERVED_START) - return LZMA_PROG_ERROR; - - return_if_error(lzma_vli_encode(filter->id, NULL, - out, out_pos, out_size)); - - // Size of Properties - uint32_t props_size; - return_if_error(lzma_properties_size(&props_size, filter)); - return_if_error(lzma_vli_encode(props_size, NULL, - out, out_pos, out_size)); - - // Filter Properties - if (out_size - *out_pos < props_size) - return LZMA_PROG_ERROR; - - return_if_error(lzma_properties_encode(filter, out + *out_pos)); - - *out_pos += props_size; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/hardware_cputhreads.c b/software/src/xz/src/liblzma/common/hardware_cputhreads.c deleted file mode 100644 index 4ce852b..0000000 --- a/software/src/xz/src/liblzma/common/hardware_cputhreads.c +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file hardware_cputhreads.c -/// \brief Get the number of CPU threads or cores -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - -#include "tuklib_cpucores.h" - - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -// This is for compatibility with binaries linked against liblzma that -// has been patched with xz-5.2.2-compat-libs.patch from RHEL/CentOS 7. -LZMA_SYMVER_API("lzma_cputhreads@XZ_5.2.2", - uint32_t, lzma_cputhreads_522)(void) lzma_nothrow - __attribute__((__alias__("lzma_cputhreads_52"))); - -LZMA_SYMVER_API("lzma_cputhreads@@XZ_5.2", - uint32_t, lzma_cputhreads_52)(void) lzma_nothrow; - -#define lzma_cputhreads lzma_cputhreads_52 -#endif -extern LZMA_API(uint32_t) -lzma_cputhreads(void) -{ - return tuklib_cpucores(); -} diff --git a/software/src/xz/src/liblzma/common/hardware_physmem.c b/software/src/xz/src/liblzma/common/hardware_physmem.c deleted file mode 100644 index 1bc3486..0000000 --- a/software/src/xz/src/liblzma/common/hardware_physmem.c +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file hardware_physmem.c -/// \brief Get the total amount of physical memory (RAM) -// -// Author: Jonathan Nieder -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - -#include "tuklib_physmem.h" - - -extern LZMA_API(uint64_t) -lzma_physmem(void) -{ - // It is simpler to make lzma_physmem() a wrapper for - // tuklib_physmem() than to hack appropriate symbol visibility - // support for the tuklib modules. - return tuklib_physmem(); -} diff --git a/software/src/xz/src/liblzma/common/index.c b/software/src/xz/src/liblzma/common/index.c deleted file mode 100644 index 6add6a6..0000000 --- a/software/src/xz/src/liblzma/common/index.c +++ /dev/null @@ -1,1268 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index.c -/// \brief Handling of .xz Indexes and some other Stream information -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "index.h" -#include "stream_flags_common.h" - - -/// \brief How many Records to allocate at once -/// -/// This should be big enough to avoid making lots of tiny allocations -/// but small enough to avoid too much unused memory at once. -#define INDEX_GROUP_SIZE 512 - - -/// \brief How many Records can be allocated at once at maximum -#define PREALLOC_MAX ((SIZE_MAX - sizeof(index_group)) / sizeof(index_record)) - - -/// \brief Base structure for index_stream and index_group structures -typedef struct index_tree_node_s index_tree_node; -struct index_tree_node_s { - /// Uncompressed start offset of this Stream (relative to the - /// beginning of the file) or Block (relative to the beginning - /// of the Stream) - lzma_vli uncompressed_base; - - /// Compressed start offset of this Stream or Block - lzma_vli compressed_base; - - index_tree_node *parent; - index_tree_node *left; - index_tree_node *right; -}; - - -/// \brief AVL tree to hold index_stream or index_group structures -typedef struct { - /// Root node - index_tree_node *root; - - /// Leftmost node. Since the tree will be filled sequentially, - /// this won't change after the first node has been added to - /// the tree. - index_tree_node *leftmost; - - /// The rightmost node in the tree. Since the tree is filled - /// sequentially, this is always the node where to add the new data. - index_tree_node *rightmost; - - /// Number of nodes in the tree - uint32_t count; - -} index_tree; - - -typedef struct { - lzma_vli uncompressed_sum; - lzma_vli unpadded_sum; -} index_record; - - -typedef struct { - /// Every Record group is part of index_stream.groups tree. - index_tree_node node; - - /// Number of Blocks in this Stream before this group. - lzma_vli number_base; - - /// Number of Records that can be put in records[]. - size_t allocated; - - /// Index of the last Record in use. - size_t last; - - /// The sizes in this array are stored as cumulative sums relative - /// to the beginning of the Stream. This makes it possible to - /// use binary search in lzma_index_locate(). - /// - /// Note that the cumulative summing is done specially for - /// unpadded_sum: The previous value is rounded up to the next - /// multiple of four before adding the Unpadded Size of the new - /// Block. The total encoded size of the Blocks in the Stream - /// is records[last].unpadded_sum in the last Record group of - /// the Stream. - /// - /// For example, if the Unpadded Sizes are 39, 57, and 81, the - /// stored values are 39, 97 (40 + 57), and 181 (100 + 181). - /// The total encoded size of these Blocks is 184. - /// - /// This is a flexible array, because it makes easy to optimize - /// memory usage in case someone concatenates many Streams that - /// have only one or few Blocks. - index_record records[]; - -} index_group; - - -typedef struct { - /// Every index_stream is a node in the tree of Streams. - index_tree_node node; - - /// Number of this Stream (first one is 1) - uint32_t number; - - /// Total number of Blocks before this Stream - lzma_vli block_number_base; - - /// Record groups of this Stream are stored in a tree. - /// It's a T-tree with AVL-tree balancing. There are - /// INDEX_GROUP_SIZE Records per node by default. - /// This keeps the number of memory allocations reasonable - /// and finding a Record is fast. - index_tree groups; - - /// Number of Records in this Stream - lzma_vli record_count; - - /// Size of the List of Records field in this Stream. This is used - /// together with record_count to calculate the size of the Index - /// field and thus the total size of the Stream. - lzma_vli index_list_size; - - /// Stream Flags of this Stream. This is meaningful only if - /// the Stream Flags have been told us with lzma_index_stream_flags(). - /// Initially stream_flags.version is set to UINT32_MAX to indicate - /// that the Stream Flags are unknown. - lzma_stream_flags stream_flags; - - /// Amount of Stream Padding after this Stream. This defaults to - /// zero and can be set with lzma_index_stream_padding(). - lzma_vli stream_padding; - -} index_stream; - - -struct lzma_index_s { - /// AVL-tree containing the Stream(s). Often there is just one - /// Stream, but using a tree keeps lookups fast even when there - /// are many concatenated Streams. - index_tree streams; - - /// Uncompressed size of all the Blocks in the Stream(s) - lzma_vli uncompressed_size; - - /// Total size of all the Blocks in the Stream(s) - lzma_vli total_size; - - /// Total number of Records in all Streams in this lzma_index - lzma_vli record_count; - - /// Size of the List of Records field if all the Streams in this - /// lzma_index were packed into a single Stream (makes it simpler to - /// take many .xz files and combine them into a single Stream). - /// - /// This value together with record_count is needed to calculate - /// Backward Size that is stored into Stream Footer. - lzma_vli index_list_size; - - /// How many Records to allocate at once in lzma_index_append(). - /// This defaults to INDEX_GROUP_SIZE but can be overridden with - /// lzma_index_prealloc(). - size_t prealloc; - - /// Bitmask indicating what integrity check types have been used - /// as set by lzma_index_stream_flags(). The bit of the last Stream - /// is not included here, since it is possible to change it by - /// calling lzma_index_stream_flags() again. - uint32_t checks; -}; - - -static void -index_tree_init(index_tree *tree) -{ - tree->root = NULL; - tree->leftmost = NULL; - tree->rightmost = NULL; - tree->count = 0; - return; -} - - -/// Helper for index_tree_end() -static void -index_tree_node_end(index_tree_node *node, const lzma_allocator *allocator, - void (*free_func)(void *node, const lzma_allocator *allocator)) -{ - // The tree won't ever be very huge, so recursion should be fine. - // 20 levels in the tree is likely quite a lot already in practice. - if (node->left != NULL) - index_tree_node_end(node->left, allocator, free_func); - - if (node->right != NULL) - index_tree_node_end(node->right, allocator, free_func); - - free_func(node, allocator); - return; -} - - -/// Free the memory allocated for a tree. Each node is freed using the -/// given free_func which is either &lzma_free or &index_stream_end. -/// The latter is used to free the Record groups from each index_stream -/// before freeing the index_stream itself. -static void -index_tree_end(index_tree *tree, const lzma_allocator *allocator, - void (*free_func)(void *node, const lzma_allocator *allocator)) -{ - assert(free_func != NULL); - - if (tree->root != NULL) - index_tree_node_end(tree->root, allocator, free_func); - - return; -} - - -/// Add a new node to the tree. node->uncompressed_base and -/// node->compressed_base must have been set by the caller already. -static void -index_tree_append(index_tree *tree, index_tree_node *node) -{ - node->parent = tree->rightmost; - node->left = NULL; - node->right = NULL; - - ++tree->count; - - // Handle the special case of adding the first node. - if (tree->root == NULL) { - tree->root = node; - tree->leftmost = node; - tree->rightmost = node; - return; - } - - // The tree is always filled sequentially. - assert(tree->rightmost->uncompressed_base <= node->uncompressed_base); - assert(tree->rightmost->compressed_base < node->compressed_base); - - // Add the new node after the rightmost node. It's the correct - // place due to the reason above. - tree->rightmost->right = node; - tree->rightmost = node; - - // Balance the AVL-tree if needed. We don't need to keep the balance - // factors in nodes, because we always fill the tree sequentially, - // and thus know the state of the tree just by looking at the node - // count. From the node count we can calculate how many steps to go - // up in the tree to find the rotation root. - uint32_t up = tree->count ^ (UINT32_C(1) << bsr32(tree->count)); - if (up != 0) { - // Locate the root node for the rotation. - up = ctz32(tree->count) + 2; - do { - node = node->parent; - } while (--up > 0); - - // Rotate left using node as the rotation root. - index_tree_node *pivot = node->right; - - if (node->parent == NULL) { - tree->root = pivot; - } else { - assert(node->parent->right == node); - node->parent->right = pivot; - } - - pivot->parent = node->parent; - - node->right = pivot->left; - if (node->right != NULL) - node->right->parent = node; - - pivot->left = node; - node->parent = pivot; - } - - return; -} - - -/// Get the next node in the tree. Return NULL if there are no more nodes. -static void * -index_tree_next(const index_tree_node *node) -{ - if (node->right != NULL) { - node = node->right; - while (node->left != NULL) - node = node->left; - - return (void *)(node); - } - - while (node->parent != NULL && node->parent->right == node) - node = node->parent; - - return (void *)(node->parent); -} - - -/// Locate a node that contains the given uncompressed offset. It is -/// caller's job to check that target is not bigger than the uncompressed -/// size of the tree (the last node would be returned in that case still). -static void * -index_tree_locate(const index_tree *tree, lzma_vli target) -{ - const index_tree_node *result = NULL; - const index_tree_node *node = tree->root; - - assert(tree->leftmost == NULL - || tree->leftmost->uncompressed_base == 0); - - // Consecutive nodes may have the same uncompressed_base. - // We must pick the rightmost one. - while (node != NULL) { - if (node->uncompressed_base > target) { - node = node->left; - } else { - result = node; - node = node->right; - } - } - - return (void *)(result); -} - - -/// Allocate and initialize a new Stream using the given base offsets. -static index_stream * -index_stream_init(lzma_vli compressed_base, lzma_vli uncompressed_base, - uint32_t stream_number, lzma_vli block_number_base, - const lzma_allocator *allocator) -{ - index_stream *s = lzma_alloc(sizeof(index_stream), allocator); - if (s == NULL) - return NULL; - - s->node.uncompressed_base = uncompressed_base; - s->node.compressed_base = compressed_base; - s->node.parent = NULL; - s->node.left = NULL; - s->node.right = NULL; - - s->number = stream_number; - s->block_number_base = block_number_base; - - index_tree_init(&s->groups); - - s->record_count = 0; - s->index_list_size = 0; - s->stream_flags.version = UINT32_MAX; - s->stream_padding = 0; - - return s; -} - - -/// Free the memory allocated for a Stream and its Record groups. -static void -index_stream_end(void *node, const lzma_allocator *allocator) -{ - index_stream *s = node; - index_tree_end(&s->groups, allocator, &lzma_free); - lzma_free(s, allocator); - return; -} - - -static lzma_index * -index_init_plain(const lzma_allocator *allocator) -{ - lzma_index *i = lzma_alloc(sizeof(lzma_index), allocator); - if (i != NULL) { - index_tree_init(&i->streams); - i->uncompressed_size = 0; - i->total_size = 0; - i->record_count = 0; - i->index_list_size = 0; - i->prealloc = INDEX_GROUP_SIZE; - i->checks = 0; - } - - return i; -} - - -extern LZMA_API(lzma_index *) -lzma_index_init(const lzma_allocator *allocator) -{ - lzma_index *i = index_init_plain(allocator); - if (i == NULL) - return NULL; - - index_stream *s = index_stream_init(0, 0, 1, 0, allocator); - if (s == NULL) { - lzma_free(i, allocator); - return NULL; - } - - index_tree_append(&i->streams, &s->node); - - return i; -} - - -extern LZMA_API(void) -lzma_index_end(lzma_index *i, const lzma_allocator *allocator) -{ - // NOTE: If you modify this function, check also the bottom - // of lzma_index_cat(). - if (i != NULL) { - index_tree_end(&i->streams, allocator, &index_stream_end); - lzma_free(i, allocator); - } - - return; -} - - -extern void -lzma_index_prealloc(lzma_index *i, lzma_vli records) -{ - if (records > PREALLOC_MAX) - records = PREALLOC_MAX; - - i->prealloc = (size_t)(records); - return; -} - - -extern LZMA_API(uint64_t) -lzma_index_memusage(lzma_vli streams, lzma_vli blocks) -{ - // This calculates an upper bound that is only a little bit - // bigger than the exact maximum memory usage with the given - // parameters. - - // Typical malloc() overhead is 2 * sizeof(void *) but we take - // a little bit extra just in case. Using LZMA_MEMUSAGE_BASE - // instead would give too inaccurate estimate. - const size_t alloc_overhead = 4 * sizeof(void *); - - // Amount of memory needed for each Stream base structures. - // We assume that every Stream has at least one Block and - // thus at least one group. - const size_t stream_base = sizeof(index_stream) - + sizeof(index_group) + 2 * alloc_overhead; - - // Amount of memory needed per group. - const size_t group_base = sizeof(index_group) - + INDEX_GROUP_SIZE * sizeof(index_record) - + alloc_overhead; - - // Number of groups. There may actually be more, but that overhead - // has been taken into account in stream_base already. - const lzma_vli groups - = (blocks + INDEX_GROUP_SIZE - 1) / INDEX_GROUP_SIZE; - - // Memory used by index_stream and index_group structures. - const uint64_t streams_mem = streams * stream_base; - const uint64_t groups_mem = groups * group_base; - - // Memory used by the base structure. - const uint64_t index_base = sizeof(lzma_index) + alloc_overhead; - - // Validate the arguments and catch integer overflows. - // Maximum number of Streams is "only" UINT32_MAX, because - // that limit is used by the tree containing the Streams. - const uint64_t limit = UINT64_MAX - index_base; - if (streams == 0 || streams > UINT32_MAX || blocks > LZMA_VLI_MAX - || streams > limit / stream_base - || groups > limit / group_base - || limit - streams_mem < groups_mem) - return UINT64_MAX; - - return index_base + streams_mem + groups_mem; -} - - -extern LZMA_API(uint64_t) -lzma_index_memused(const lzma_index *i) -{ - return lzma_index_memusage(i->streams.count, i->record_count); -} - - -extern LZMA_API(lzma_vli) -lzma_index_block_count(const lzma_index *i) -{ - return i->record_count; -} - - -extern LZMA_API(lzma_vli) -lzma_index_stream_count(const lzma_index *i) -{ - return i->streams.count; -} - - -extern LZMA_API(lzma_vli) -lzma_index_size(const lzma_index *i) -{ - return index_size(i->record_count, i->index_list_size); -} - - -extern LZMA_API(lzma_vli) -lzma_index_total_size(const lzma_index *i) -{ - return i->total_size; -} - - -extern LZMA_API(lzma_vli) -lzma_index_stream_size(const lzma_index *i) -{ - // Stream Header + Blocks + Index + Stream Footer - return LZMA_STREAM_HEADER_SIZE + i->total_size - + index_size(i->record_count, i->index_list_size) - + LZMA_STREAM_HEADER_SIZE; -} - - -static lzma_vli -index_file_size(lzma_vli compressed_base, lzma_vli unpadded_sum, - lzma_vli record_count, lzma_vli index_list_size, - lzma_vli stream_padding) -{ - // Earlier Streams and Stream Paddings + Stream Header - // + Blocks + Index + Stream Footer + Stream Padding - // - // This might go over LZMA_VLI_MAX due to too big unpadded_sum - // when this function is used in lzma_index_append(). - lzma_vli file_size = compressed_base + 2 * LZMA_STREAM_HEADER_SIZE - + stream_padding + vli_ceil4(unpadded_sum); - if (file_size > LZMA_VLI_MAX) - return LZMA_VLI_UNKNOWN; - - // The same applies here. - file_size += index_size(record_count, index_list_size); - if (file_size > LZMA_VLI_MAX) - return LZMA_VLI_UNKNOWN; - - return file_size; -} - - -extern LZMA_API(lzma_vli) -lzma_index_file_size(const lzma_index *i) -{ - const index_stream *s = (const index_stream *)(i->streams.rightmost); - const index_group *g = (const index_group *)(s->groups.rightmost); - return index_file_size(s->node.compressed_base, - g == NULL ? 0 : g->records[g->last].unpadded_sum, - s->record_count, s->index_list_size, - s->stream_padding); -} - - -extern LZMA_API(lzma_vli) -lzma_index_uncompressed_size(const lzma_index *i) -{ - return i->uncompressed_size; -} - - -extern LZMA_API(uint32_t) -lzma_index_checks(const lzma_index *i) -{ - uint32_t checks = i->checks; - - // Get the type of the Check of the last Stream too. - const index_stream *s = (const index_stream *)(i->streams.rightmost); - if (s->stream_flags.version != UINT32_MAX) - checks |= UINT32_C(1) << s->stream_flags.check; - - return checks; -} - - -extern uint32_t -lzma_index_padding_size(const lzma_index *i) -{ - return (LZMA_VLI_C(4) - index_size_unpadded( - i->record_count, i->index_list_size)) & 3; -} - - -extern LZMA_API(lzma_ret) -lzma_index_stream_flags(lzma_index *i, const lzma_stream_flags *stream_flags) -{ - if (i == NULL || stream_flags == NULL) - return LZMA_PROG_ERROR; - - // Validate the Stream Flags. - return_if_error(lzma_stream_flags_compare( - stream_flags, stream_flags)); - - index_stream *s = (index_stream *)(i->streams.rightmost); - s->stream_flags = *stream_flags; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_stream_padding(lzma_index *i, lzma_vli stream_padding) -{ - if (i == NULL || stream_padding > LZMA_VLI_MAX - || (stream_padding & 3) != 0) - return LZMA_PROG_ERROR; - - index_stream *s = (index_stream *)(i->streams.rightmost); - - // Check that the new value won't make the file grow too big. - const lzma_vli old_stream_padding = s->stream_padding; - s->stream_padding = 0; - if (lzma_index_file_size(i) + stream_padding > LZMA_VLI_MAX) { - s->stream_padding = old_stream_padding; - return LZMA_DATA_ERROR; - } - - s->stream_padding = stream_padding; - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_append(lzma_index *i, const lzma_allocator *allocator, - lzma_vli unpadded_size, lzma_vli uncompressed_size) -{ - // Validate. - if (i == NULL || unpadded_size < UNPADDED_SIZE_MIN - || unpadded_size > UNPADDED_SIZE_MAX - || uncompressed_size > LZMA_VLI_MAX) - return LZMA_PROG_ERROR; - - index_stream *s = (index_stream *)(i->streams.rightmost); - index_group *g = (index_group *)(s->groups.rightmost); - - const lzma_vli compressed_base = g == NULL ? 0 - : vli_ceil4(g->records[g->last].unpadded_sum); - const lzma_vli uncompressed_base = g == NULL ? 0 - : g->records[g->last].uncompressed_sum; - const uint32_t index_list_size_add = lzma_vli_size(unpadded_size) - + lzma_vli_size(uncompressed_size); - - // Check that uncompressed size will not overflow. - if (uncompressed_base + uncompressed_size > LZMA_VLI_MAX) - return LZMA_DATA_ERROR; - - // Check that the new unpadded sum will not overflow. This is - // checked again in index_file_size(), but the unpadded sum is - // passed to vli_ceil4() which expects a valid lzma_vli value. - if (compressed_base + unpadded_size > UNPADDED_SIZE_MAX) - return LZMA_DATA_ERROR; - - // Check that the file size will stay within limits. - if (index_file_size(s->node.compressed_base, - compressed_base + unpadded_size, s->record_count + 1, - s->index_list_size + index_list_size_add, - s->stream_padding) == LZMA_VLI_UNKNOWN) - return LZMA_DATA_ERROR; - - // The size of the Index field must not exceed the maximum value - // that can be stored in the Backward Size field. - if (index_size(i->record_count + 1, - i->index_list_size + index_list_size_add) - > LZMA_BACKWARD_SIZE_MAX) - return LZMA_DATA_ERROR; - - if (g != NULL && g->last + 1 < g->allocated) { - // There is space in the last group at least for one Record. - ++g->last; - } else { - // We need to allocate a new group. - g = lzma_alloc(sizeof(index_group) - + i->prealloc * sizeof(index_record), - allocator); - if (g == NULL) - return LZMA_MEM_ERROR; - - g->last = 0; - g->allocated = i->prealloc; - - // Reset prealloc so that if the application happens to - // add new Records, the allocation size will be sane. - i->prealloc = INDEX_GROUP_SIZE; - - // Set the start offsets of this group. - g->node.uncompressed_base = uncompressed_base; - g->node.compressed_base = compressed_base; - g->number_base = s->record_count + 1; - - // Add the new group to the Stream. - index_tree_append(&s->groups, &g->node); - } - - // Add the new Record to the group. - g->records[g->last].uncompressed_sum - = uncompressed_base + uncompressed_size; - g->records[g->last].unpadded_sum - = compressed_base + unpadded_size; - - // Update the totals. - ++s->record_count; - s->index_list_size += index_list_size_add; - - i->total_size += vli_ceil4(unpadded_size); - i->uncompressed_size += uncompressed_size; - ++i->record_count; - i->index_list_size += index_list_size_add; - - return LZMA_OK; -} - - -/// Structure to pass info to index_cat_helper() -typedef struct { - /// Uncompressed size of the destination - lzma_vli uncompressed_size; - - /// Compressed file size of the destination - lzma_vli file_size; - - /// Same as above but for Block numbers - lzma_vli block_number_add; - - /// Number of Streams that were in the destination index before we - /// started appending new Streams from the source index. This is - /// used to fix the Stream numbering. - uint32_t stream_number_add; - - /// Destination index' Stream tree - index_tree *streams; - -} index_cat_info; - - -/// Add the Stream nodes from the source index to dest using recursion. -/// Simplest iterative traversal of the source tree wouldn't work, because -/// we update the pointers in nodes when moving them to the destination tree. -static void -index_cat_helper(const index_cat_info *info, index_stream *this) -{ - index_stream *left = (index_stream *)(this->node.left); - index_stream *right = (index_stream *)(this->node.right); - - if (left != NULL) - index_cat_helper(info, left); - - this->node.uncompressed_base += info->uncompressed_size; - this->node.compressed_base += info->file_size; - this->number += info->stream_number_add; - this->block_number_base += info->block_number_add; - index_tree_append(info->streams, &this->node); - - if (right != NULL) - index_cat_helper(info, right); - - return; -} - - -extern LZMA_API(lzma_ret) -lzma_index_cat(lzma_index *restrict dest, lzma_index *restrict src, - const lzma_allocator *allocator) -{ - if (dest == NULL || src == NULL) - return LZMA_PROG_ERROR; - - const lzma_vli dest_file_size = lzma_index_file_size(dest); - - // Check that we don't exceed the file size limits. - if (dest_file_size + lzma_index_file_size(src) > LZMA_VLI_MAX - || dest->uncompressed_size + src->uncompressed_size - > LZMA_VLI_MAX) - return LZMA_DATA_ERROR; - - // Check that the encoded size of the combined lzma_indexes stays - // within limits. In theory, this should be done only if we know - // that the user plans to actually combine the Streams and thus - // construct a single Index (probably rare). However, exceeding - // this limit is quite theoretical, so we do this check always - // to simplify things elsewhere. - { - const lzma_vli dest_size = index_size_unpadded( - dest->record_count, dest->index_list_size); - const lzma_vli src_size = index_size_unpadded( - src->record_count, src->index_list_size); - if (vli_ceil4(dest_size + src_size) > LZMA_BACKWARD_SIZE_MAX) - return LZMA_DATA_ERROR; - } - - // Optimize the last group to minimize memory usage. Allocation has - // to be done before modifying dest or src. - { - index_stream *s = (index_stream *)(dest->streams.rightmost); - index_group *g = (index_group *)(s->groups.rightmost); - if (g != NULL && g->last + 1 < g->allocated) { - assert(g->node.left == NULL); - assert(g->node.right == NULL); - - index_group *newg = lzma_alloc(sizeof(index_group) - + (g->last + 1) - * sizeof(index_record), - allocator); - if (newg == NULL) - return LZMA_MEM_ERROR; - - newg->node = g->node; - newg->allocated = g->last + 1; - newg->last = g->last; - newg->number_base = g->number_base; - - memcpy(newg->records, g->records, newg->allocated - * sizeof(index_record)); - - if (g->node.parent != NULL) { - assert(g->node.parent->right == &g->node); - g->node.parent->right = &newg->node; - } - - if (s->groups.leftmost == &g->node) { - assert(s->groups.root == &g->node); - s->groups.leftmost = &newg->node; - s->groups.root = &newg->node; - } - - assert(s->groups.rightmost == &g->node); - s->groups.rightmost = &newg->node; - - lzma_free(g, allocator); - - // NOTE: newg isn't leaked here because - // newg == (void *)&newg->node. - } - } - - // dest->checks includes the check types of all except the last Stream - // in dest. Set the bit for the check type of the last Stream now so - // that it won't get lost when Stream(s) from src are appended to dest. - dest->checks = lzma_index_checks(dest); - - // Add all the Streams from src to dest. Update the base offsets - // of each Stream from src. - const index_cat_info info = { - .uncompressed_size = dest->uncompressed_size, - .file_size = dest_file_size, - .stream_number_add = dest->streams.count, - .block_number_add = dest->record_count, - .streams = &dest->streams, - }; - index_cat_helper(&info, (index_stream *)(src->streams.root)); - - // Update info about all the combined Streams. - dest->uncompressed_size += src->uncompressed_size; - dest->total_size += src->total_size; - dest->record_count += src->record_count; - dest->index_list_size += src->index_list_size; - dest->checks |= src->checks; - - // There's nothing else left in src than the base structure. - lzma_free(src, allocator); - - return LZMA_OK; -} - - -/// Duplicate an index_stream. -static index_stream * -index_dup_stream(const index_stream *src, const lzma_allocator *allocator) -{ - // Catch a somewhat theoretical integer overflow. - if (src->record_count > PREALLOC_MAX) - return NULL; - - // Allocate and initialize a new Stream. - index_stream *dest = index_stream_init(src->node.compressed_base, - src->node.uncompressed_base, src->number, - src->block_number_base, allocator); - if (dest == NULL) - return NULL; - - // Copy the overall information. - dest->record_count = src->record_count; - dest->index_list_size = src->index_list_size; - dest->stream_flags = src->stream_flags; - dest->stream_padding = src->stream_padding; - - // Return if there are no groups to duplicate. - if (src->groups.leftmost == NULL) - return dest; - - // Allocate memory for the Records. We put all the Records into - // a single group. It's simplest and also tends to make - // lzma_index_locate() a little bit faster with very big Indexes. - index_group *destg = lzma_alloc(sizeof(index_group) - + src->record_count * sizeof(index_record), - allocator); - if (destg == NULL) { - index_stream_end(dest, allocator); - return NULL; - } - - // Initialize destg. - destg->node.uncompressed_base = 0; - destg->node.compressed_base = 0; - destg->number_base = 1; - destg->allocated = src->record_count; - destg->last = src->record_count - 1; - - // Go through all the groups in src and copy the Records into destg. - const index_group *srcg = (const index_group *)(src->groups.leftmost); - size_t i = 0; - do { - memcpy(destg->records + i, srcg->records, - (srcg->last + 1) * sizeof(index_record)); - i += srcg->last + 1; - srcg = index_tree_next(&srcg->node); - } while (srcg != NULL); - - assert(i == destg->allocated); - - // Add the group to the new Stream. - index_tree_append(&dest->groups, &destg->node); - - return dest; -} - - -extern LZMA_API(lzma_index *) -lzma_index_dup(const lzma_index *src, const lzma_allocator *allocator) -{ - // Allocate the base structure (no initial Stream). - lzma_index *dest = index_init_plain(allocator); - if (dest == NULL) - return NULL; - - // Copy the totals. - dest->uncompressed_size = src->uncompressed_size; - dest->total_size = src->total_size; - dest->record_count = src->record_count; - dest->index_list_size = src->index_list_size; - - // Copy the Streams and the groups in them. - const index_stream *srcstream - = (const index_stream *)(src->streams.leftmost); - do { - index_stream *deststream = index_dup_stream( - srcstream, allocator); - if (deststream == NULL) { - lzma_index_end(dest, allocator); - return NULL; - } - - index_tree_append(&dest->streams, &deststream->node); - - srcstream = index_tree_next(&srcstream->node); - } while (srcstream != NULL); - - return dest; -} - - -/// Indexing for lzma_index_iter.internal[] -enum { - ITER_INDEX, - ITER_STREAM, - ITER_GROUP, - ITER_RECORD, - ITER_METHOD, -}; - - -/// Values for lzma_index_iter.internal[ITER_METHOD].s -enum { - ITER_METHOD_NORMAL, - ITER_METHOD_NEXT, - ITER_METHOD_LEFTMOST, -}; - - -static void -iter_set_info(lzma_index_iter *iter) -{ - const lzma_index *i = iter->internal[ITER_INDEX].p; - const index_stream *stream = iter->internal[ITER_STREAM].p; - const index_group *group = iter->internal[ITER_GROUP].p; - const size_t record = iter->internal[ITER_RECORD].s; - - // lzma_index_iter.internal must not contain a pointer to the last - // group in the index, because that may be reallocated by - // lzma_index_cat(). - if (group == NULL) { - // There are no groups. - assert(stream->groups.root == NULL); - iter->internal[ITER_METHOD].s = ITER_METHOD_LEFTMOST; - - } else if (i->streams.rightmost != &stream->node - || stream->groups.rightmost != &group->node) { - // The group is not not the last group in the index. - iter->internal[ITER_METHOD].s = ITER_METHOD_NORMAL; - - } else if (stream->groups.leftmost != &group->node) { - // The group isn't the only group in the Stream, thus we - // know that it must have a parent group i.e. it's not - // the root node. - assert(stream->groups.root != &group->node); - assert(group->node.parent->right == &group->node); - iter->internal[ITER_METHOD].s = ITER_METHOD_NEXT; - iter->internal[ITER_GROUP].p = group->node.parent; - - } else { - // The Stream has only one group. - assert(stream->groups.root == &group->node); - assert(group->node.parent == NULL); - iter->internal[ITER_METHOD].s = ITER_METHOD_LEFTMOST; - iter->internal[ITER_GROUP].p = NULL; - } - - // NOTE: lzma_index_iter.stream.number is lzma_vli but we use uint32_t - // internally. - iter->stream.number = stream->number; - iter->stream.block_count = stream->record_count; - iter->stream.compressed_offset = stream->node.compressed_base; - iter->stream.uncompressed_offset = stream->node.uncompressed_base; - - // iter->stream.flags will be NULL if the Stream Flags haven't been - // set with lzma_index_stream_flags(). - iter->stream.flags = stream->stream_flags.version == UINT32_MAX - ? NULL : &stream->stream_flags; - iter->stream.padding = stream->stream_padding; - - if (stream->groups.rightmost == NULL) { - // Stream has no Blocks. - iter->stream.compressed_size = index_size(0, 0) - + 2 * LZMA_STREAM_HEADER_SIZE; - iter->stream.uncompressed_size = 0; - } else { - const index_group *g = (const index_group *)( - stream->groups.rightmost); - - // Stream Header + Stream Footer + Index + Blocks - iter->stream.compressed_size = 2 * LZMA_STREAM_HEADER_SIZE - + index_size(stream->record_count, - stream->index_list_size) - + vli_ceil4(g->records[g->last].unpadded_sum); - iter->stream.uncompressed_size - = g->records[g->last].uncompressed_sum; - } - - if (group != NULL) { - iter->block.number_in_stream = group->number_base + record; - iter->block.number_in_file = iter->block.number_in_stream - + stream->block_number_base; - - iter->block.compressed_stream_offset - = record == 0 ? group->node.compressed_base - : vli_ceil4(group->records[ - record - 1].unpadded_sum); - iter->block.uncompressed_stream_offset - = record == 0 ? group->node.uncompressed_base - : group->records[record - 1].uncompressed_sum; - - iter->block.uncompressed_size - = group->records[record].uncompressed_sum - - iter->block.uncompressed_stream_offset; - iter->block.unpadded_size - = group->records[record].unpadded_sum - - iter->block.compressed_stream_offset; - iter->block.total_size = vli_ceil4(iter->block.unpadded_size); - - iter->block.compressed_stream_offset - += LZMA_STREAM_HEADER_SIZE; - - iter->block.compressed_file_offset - = iter->block.compressed_stream_offset - + iter->stream.compressed_offset; - iter->block.uncompressed_file_offset - = iter->block.uncompressed_stream_offset - + iter->stream.uncompressed_offset; - } - - return; -} - - -extern LZMA_API(void) -lzma_index_iter_init(lzma_index_iter *iter, const lzma_index *i) -{ - iter->internal[ITER_INDEX].p = i; - lzma_index_iter_rewind(iter); - return; -} - - -extern LZMA_API(void) -lzma_index_iter_rewind(lzma_index_iter *iter) -{ - iter->internal[ITER_STREAM].p = NULL; - iter->internal[ITER_GROUP].p = NULL; - iter->internal[ITER_RECORD].s = 0; - iter->internal[ITER_METHOD].s = ITER_METHOD_NORMAL; - return; -} - - -extern LZMA_API(lzma_bool) -lzma_index_iter_next(lzma_index_iter *iter, lzma_index_iter_mode mode) -{ - // Catch unsupported mode values. - if ((unsigned int)(mode) > LZMA_INDEX_ITER_NONEMPTY_BLOCK) - return true; - - const lzma_index *i = iter->internal[ITER_INDEX].p; - const index_stream *stream = iter->internal[ITER_STREAM].p; - const index_group *group = NULL; - size_t record = iter->internal[ITER_RECORD].s; - - // If we are being asked for the next Stream, leave group to NULL - // so that the rest of the this function thinks that this Stream - // has no groups and will thus go to the next Stream. - if (mode != LZMA_INDEX_ITER_STREAM) { - // Get the pointer to the current group. See iter_set_inf() - // for explanation. - switch (iter->internal[ITER_METHOD].s) { - case ITER_METHOD_NORMAL: - group = iter->internal[ITER_GROUP].p; - break; - - case ITER_METHOD_NEXT: - group = index_tree_next(iter->internal[ITER_GROUP].p); - break; - - case ITER_METHOD_LEFTMOST: - group = (const index_group *)( - stream->groups.leftmost); - break; - } - } - -again: - if (stream == NULL) { - // We at the beginning of the lzma_index. - // Locate the first Stream. - stream = (const index_stream *)(i->streams.leftmost); - if (mode >= LZMA_INDEX_ITER_BLOCK) { - // Since we are being asked to return information - // about the first a Block, skip Streams that have - // no Blocks. - while (stream->groups.leftmost == NULL) { - stream = index_tree_next(&stream->node); - if (stream == NULL) - return true; - } - } - - // Start from the first Record in the Stream. - group = (const index_group *)(stream->groups.leftmost); - record = 0; - - } else if (group != NULL && record < group->last) { - // The next Record is in the same group. - ++record; - - } else { - // This group has no more Records or this Stream has - // no Blocks at all. - record = 0; - - // If group is not NULL, this Stream has at least one Block - // and thus at least one group. Find the next group. - if (group != NULL) - group = index_tree_next(&group->node); - - if (group == NULL) { - // This Stream has no more Records. Find the next - // Stream. If we are being asked to return information - // about a Block, we skip empty Streams. - do { - stream = index_tree_next(&stream->node); - if (stream == NULL) - return true; - } while (mode >= LZMA_INDEX_ITER_BLOCK - && stream->groups.leftmost == NULL); - - group = (const index_group *)( - stream->groups.leftmost); - } - } - - if (mode == LZMA_INDEX_ITER_NONEMPTY_BLOCK) { - // We need to look for the next Block again if this Block - // is empty. - if (record == 0) { - if (group->node.uncompressed_base - == group->records[0].uncompressed_sum) - goto again; - } else if (group->records[record - 1].uncompressed_sum - == group->records[record].uncompressed_sum) { - goto again; - } - } - - iter->internal[ITER_STREAM].p = stream; - iter->internal[ITER_GROUP].p = group; - iter->internal[ITER_RECORD].s = record; - - iter_set_info(iter); - - return false; -} - - -extern LZMA_API(lzma_bool) -lzma_index_iter_locate(lzma_index_iter *iter, lzma_vli target) -{ - const lzma_index *i = iter->internal[ITER_INDEX].p; - - // If the target is past the end of the file, return immediately. - if (i->uncompressed_size <= target) - return true; - - // Locate the Stream containing the target offset. - const index_stream *stream = index_tree_locate(&i->streams, target); - assert(stream != NULL); - target -= stream->node.uncompressed_base; - - // Locate the group containing the target offset. - const index_group *group = index_tree_locate(&stream->groups, target); - assert(group != NULL); - - // Use binary search to locate the exact Record. It is the first - // Record whose uncompressed_sum is greater than target. - // This is because we want the rightmost Record that fulfills the - // search criterion. It is possible that there are empty Blocks; - // we don't want to return them. - size_t left = 0; - size_t right = group->last; - - while (left < right) { - const size_t pos = left + (right - left) / 2; - if (group->records[pos].uncompressed_sum <= target) - left = pos + 1; - else - right = pos; - } - - iter->internal[ITER_STREAM].p = stream; - iter->internal[ITER_GROUP].p = group; - iter->internal[ITER_RECORD].s = left; - - iter_set_info(iter); - - return false; -} diff --git a/software/src/xz/src/liblzma/common/index.h b/software/src/xz/src/liblzma/common/index.h deleted file mode 100644 index 007e118..0000000 --- a/software/src/xz/src/liblzma/common/index.h +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index.h -/// \brief Handling of Index -/// \note This header file does not include common.h or lzma.h because -/// this file is needed by both liblzma internally and by the -/// tests. Including common.h will include and define many things -/// the tests do not need and prevents issues with header file -/// include order. This way, if lzma.h or common.h are not -/// included before this file it will break on every OS instead -/// of causing more subtle errors. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_INDEX_H -#define LZMA_INDEX_H - - -/// Minimum Unpadded Size -#define UNPADDED_SIZE_MIN LZMA_VLI_C(5) - -/// Maximum Unpadded Size -#define UNPADDED_SIZE_MAX (LZMA_VLI_MAX & ~LZMA_VLI_C(3)) - -/// Index Indicator based on xz specification -#define INDEX_INDICATOR 0 - - -/// Get the size of the Index Padding field. This is needed by Index encoder -/// and decoder, but applications should have no use for this. -extern uint32_t lzma_index_padding_size(const lzma_index *i); - - -/// Set for how many Records to allocate memory the next time -/// lzma_index_append() needs to allocate space for a new Record. -/// This is used only by the Index decoder. -extern void lzma_index_prealloc(lzma_index *i, lzma_vli records); - - -/// Round the variable-length integer to the next multiple of four. -static inline lzma_vli -vli_ceil4(lzma_vli vli) -{ - assert(vli <= UNPADDED_SIZE_MAX); - return (vli + 3) & ~LZMA_VLI_C(3); -} - - -/// Calculate the size of the Index field excluding Index Padding -static inline lzma_vli -index_size_unpadded(lzma_vli count, lzma_vli index_list_size) -{ - // Index Indicator + Number of Records + List of Records + CRC32 - return 1 + lzma_vli_size(count) + index_list_size + 4; -} - - -/// Calculate the size of the Index field including Index Padding -static inline lzma_vli -index_size(lzma_vli count, lzma_vli index_list_size) -{ - return vli_ceil4(index_size_unpadded(count, index_list_size)); -} - - -/// Calculate the total size of the Stream -static inline lzma_vli -index_stream_size(lzma_vli blocks_size, - lzma_vli count, lzma_vli index_list_size) -{ - return LZMA_STREAM_HEADER_SIZE + blocks_size - + index_size(count, index_list_size) - + LZMA_STREAM_HEADER_SIZE; -} - -#endif diff --git a/software/src/xz/src/liblzma/common/index_decoder.c b/software/src/xz/src/liblzma/common/index_decoder.c deleted file mode 100644 index 4eab56d..0000000 --- a/software/src/xz/src/liblzma/common/index_decoder.c +++ /dev/null @@ -1,369 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index_decoder.c -/// \brief Decodes the Index field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "index_decoder.h" -#include "check.h" - - -typedef struct { - enum { - SEQ_INDICATOR, - SEQ_COUNT, - SEQ_MEMUSAGE, - SEQ_UNPADDED, - SEQ_UNCOMPRESSED, - SEQ_PADDING_INIT, - SEQ_PADDING, - SEQ_CRC32, - } sequence; - - /// Memory usage limit - uint64_t memlimit; - - /// Target Index - lzma_index *index; - - /// Pointer give by the application, which is set after - /// successful decoding. - lzma_index **index_ptr; - - /// Number of Records left to decode. - lzma_vli count; - - /// The most recent Unpadded Size field - lzma_vli unpadded_size; - - /// The most recent Uncompressed Size field - lzma_vli uncompressed_size; - - /// Position in integers - size_t pos; - - /// CRC32 of the List of Records field - uint32_t crc32; -} lzma_index_coder; - - -static lzma_ret -index_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, - uint8_t *restrict out lzma_attribute((__unused__)), - size_t *restrict out_pos lzma_attribute((__unused__)), - size_t out_size lzma_attribute((__unused__)), - lzma_action action lzma_attribute((__unused__))) -{ - lzma_index_coder *coder = coder_ptr; - - // Similar optimization as in index_encoder.c - const size_t in_start = *in_pos; - lzma_ret ret = LZMA_OK; - - while (*in_pos < in_size) - switch (coder->sequence) { - case SEQ_INDICATOR: - // Return LZMA_DATA_ERROR instead of e.g. LZMA_PROG_ERROR or - // LZMA_FORMAT_ERROR, because a typical usage case for Index - // decoder is when parsing the Stream backwards. If seeking - // backward from the Stream Footer gives us something that - // doesn't begin with Index Indicator, the file is considered - // corrupt, not "programming error" or "unrecognized file - // format". One could argue that the application should - // verify the Index Indicator before trying to decode the - // Index, but well, I suppose it is simpler this way. - if (in[(*in_pos)++] != INDEX_INDICATOR) - return LZMA_DATA_ERROR; - - coder->sequence = SEQ_COUNT; - break; - - case SEQ_COUNT: - ret = lzma_vli_decode(&coder->count, &coder->pos, - in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - goto out; - - coder->pos = 0; - coder->sequence = SEQ_MEMUSAGE; - FALLTHROUGH; - - case SEQ_MEMUSAGE: - if (lzma_index_memusage(1, coder->count) > coder->memlimit) { - ret = LZMA_MEMLIMIT_ERROR; - goto out; - } - - // Tell the Index handling code how many Records this - // Index has to allow it to allocate memory more efficiently. - lzma_index_prealloc(coder->index, coder->count); - - ret = LZMA_OK; - coder->sequence = coder->count == 0 - ? SEQ_PADDING_INIT : SEQ_UNPADDED; - break; - - case SEQ_UNPADDED: - case SEQ_UNCOMPRESSED: { - lzma_vli *size = coder->sequence == SEQ_UNPADDED - ? &coder->unpadded_size - : &coder->uncompressed_size; - - ret = lzma_vli_decode(size, &coder->pos, - in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - goto out; - - ret = LZMA_OK; - coder->pos = 0; - - if (coder->sequence == SEQ_UNPADDED) { - // Validate that encoded Unpadded Size isn't too small - // or too big. - if (coder->unpadded_size < UNPADDED_SIZE_MIN - || coder->unpadded_size - > UNPADDED_SIZE_MAX) - return LZMA_DATA_ERROR; - - coder->sequence = SEQ_UNCOMPRESSED; - } else { - // Add the decoded Record to the Index. - return_if_error(lzma_index_append( - coder->index, allocator, - coder->unpadded_size, - coder->uncompressed_size)); - - // Check if this was the last Record. - coder->sequence = --coder->count == 0 - ? SEQ_PADDING_INIT - : SEQ_UNPADDED; - } - - break; - } - - case SEQ_PADDING_INIT: - coder->pos = lzma_index_padding_size(coder->index); - coder->sequence = SEQ_PADDING; - FALLTHROUGH; - - case SEQ_PADDING: - if (coder->pos > 0) { - --coder->pos; - if (in[(*in_pos)++] != 0x00) - return LZMA_DATA_ERROR; - - break; - } - - // Finish the CRC32 calculation. - coder->crc32 = lzma_crc32(in + in_start, - *in_pos - in_start, coder->crc32); - - coder->sequence = SEQ_CRC32; - FALLTHROUGH; - - case SEQ_CRC32: - do { - if (*in_pos == in_size) - return LZMA_OK; - - if (((coder->crc32 >> (coder->pos * 8)) & 0xFF) - != in[(*in_pos)++]) { -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - return LZMA_DATA_ERROR; -#endif - } - - } while (++coder->pos < 4); - - // Decoding was successful, now we can let the application - // see the decoded Index. - *coder->index_ptr = coder->index; - - // Make index NULL so we don't free it unintentionally. - coder->index = NULL; - - return LZMA_STREAM_END; - - default: - assert(0); - return LZMA_PROG_ERROR; - } - -out: - // Update the CRC32. - // - // Avoid null pointer + 0 (undefined behavior) in "in + in_start". - // In such a case we had no input and thus in_used == 0. - { - const size_t in_used = *in_pos - in_start; - if (in_used > 0) - coder->crc32 = lzma_crc32(in + in_start, - in_used, coder->crc32); - } - - return ret; -} - - -static void -index_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_index_coder *coder = coder_ptr; - lzma_index_end(coder->index, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -index_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_index_coder *coder = coder_ptr; - - *memusage = lzma_index_memusage(1, coder->count); - *old_memlimit = coder->memlimit; - - if (new_memlimit != 0) { - if (new_memlimit < *memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -static lzma_ret -index_decoder_reset(lzma_index_coder *coder, const lzma_allocator *allocator, - lzma_index **i, uint64_t memlimit) -{ - // Remember the pointer given by the application. We will set it - // to point to the decoded Index only if decoding is successful. - // Before that, keep it NULL so that applications can always safely - // pass it to lzma_index_end() no matter did decoding succeed or not. - coder->index_ptr = i; - *i = NULL; - - // We always allocate a new lzma_index. - coder->index = lzma_index_init(allocator); - if (coder->index == NULL) - return LZMA_MEM_ERROR; - - // Initialize the rest. - coder->sequence = SEQ_INDICATOR; - coder->memlimit = my_max(1, memlimit); - coder->count = 0; // Needs to be initialized due to _memconfig(). - coder->pos = 0; - coder->crc32 = 0; - - return LZMA_OK; -} - - -extern lzma_ret -lzma_index_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - lzma_index **i, uint64_t memlimit) -{ - lzma_next_coder_init(&lzma_index_decoder_init, next, allocator); - - if (i == NULL) - return LZMA_PROG_ERROR; - - lzma_index_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_index_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &index_decode; - next->end = &index_decoder_end; - next->memconfig = &index_decoder_memconfig; - coder->index = NULL; - } else { - lzma_index_end(coder->index, allocator); - } - - return index_decoder_reset(coder, allocator, i, memlimit); -} - - -extern LZMA_API(lzma_ret) -lzma_index_decoder(lzma_stream *strm, lzma_index **i, uint64_t memlimit) -{ - // If i isn't NULL, *i must always be initialized due to - // the wording in the API docs. This way it is initialized - // if we return LZMA_PROG_ERROR due to strm == NULL. - if (i != NULL) - *i = NULL; - - lzma_next_strm_init(lzma_index_decoder_init, strm, i, memlimit); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_buffer_decode(lzma_index **i, uint64_t *memlimit, - const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size) -{ - // If i isn't NULL, *i must always be initialized due to - // the wording in the API docs. - if (i != NULL) - *i = NULL; - - // Sanity checks - if (i == NULL || memlimit == NULL - || in == NULL || in_pos == NULL || *in_pos > in_size) - return LZMA_PROG_ERROR; - - // Initialize the decoder. - lzma_index_coder coder; - return_if_error(index_decoder_reset(&coder, allocator, i, *memlimit)); - - // Store the input start position so that we can restore it in case - // of an error. - const size_t in_start = *in_pos; - - // Do the actual decoding. - lzma_ret ret = index_decode(&coder, allocator, in, in_pos, in_size, - NULL, NULL, 0, LZMA_RUN); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - // Something went wrong, free the Index structure and restore - // the input position. - lzma_index_end(coder.index, allocator); - *in_pos = in_start; - - if (ret == LZMA_OK) { - // The input is truncated or otherwise corrupt. - // Use LZMA_DATA_ERROR instead of LZMA_BUF_ERROR - // like lzma_vli_decode() does in single-call mode. - ret = LZMA_DATA_ERROR; - - } else if (ret == LZMA_MEMLIMIT_ERROR) { - // Tell the caller how much memory would have - // been needed. - *memlimit = lzma_index_memusage(1, coder.count); - } - } - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/index_decoder.h b/software/src/xz/src/liblzma/common/index_decoder.h deleted file mode 100644 index 5351d2f..0000000 --- a/software/src/xz/src/liblzma/common/index_decoder.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index_decoder.h -/// \brief Decodes the Index field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_INDEX_DECODER_H -#define LZMA_INDEX_DECODER_H - -#include "common.h" -#include "index.h" - - -extern lzma_ret lzma_index_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - lzma_index **i, uint64_t memlimit); - - -#endif diff --git a/software/src/xz/src/liblzma/common/index_encoder.c b/software/src/xz/src/liblzma/common/index_encoder.c deleted file mode 100644 index 80f1be1..0000000 --- a/software/src/xz/src/liblzma/common/index_encoder.c +++ /dev/null @@ -1,260 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index_encoder.c -/// \brief Encodes the Index field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "index_encoder.h" -#include "index.h" -#include "check.h" - - -typedef struct { - enum { - SEQ_INDICATOR, - SEQ_COUNT, - SEQ_UNPADDED, - SEQ_UNCOMPRESSED, - SEQ_NEXT, - SEQ_PADDING, - SEQ_CRC32, - } sequence; - - /// Index being encoded - const lzma_index *index; - - /// Iterator for the Index being encoded - lzma_index_iter iter; - - /// Position in integers - size_t pos; - - /// CRC32 of the List of Records field - uint32_t crc32; -} lzma_index_coder; - - -static lzma_ret -index_encode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), - const uint8_t *restrict in lzma_attribute((__unused__)), - size_t *restrict in_pos lzma_attribute((__unused__)), - size_t in_size lzma_attribute((__unused__)), - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, - lzma_action action lzma_attribute((__unused__))) -{ - lzma_index_coder *coder = coder_ptr; - - // Position where to start calculating CRC32. The idea is that we - // need to call lzma_crc32() only once per call to index_encode(). - const size_t out_start = *out_pos; - - // Return value to use if we return at the end of this function. - // We use "goto out" to jump out of the while-switch construct - // instead of returning directly, because that way we don't need - // to copypaste the lzma_crc32() call to many places. - lzma_ret ret = LZMA_OK; - - while (*out_pos < out_size) - switch (coder->sequence) { - case SEQ_INDICATOR: - out[*out_pos] = INDEX_INDICATOR; - ++*out_pos; - coder->sequence = SEQ_COUNT; - break; - - case SEQ_COUNT: { - const lzma_vli count = lzma_index_block_count(coder->index); - ret = lzma_vli_encode(count, &coder->pos, - out, out_pos, out_size); - if (ret != LZMA_STREAM_END) - goto out; - - ret = LZMA_OK; - coder->pos = 0; - coder->sequence = SEQ_NEXT; - break; - } - - case SEQ_NEXT: - if (lzma_index_iter_next( - &coder->iter, LZMA_INDEX_ITER_BLOCK)) { - // Get the size of the Index Padding field. - coder->pos = lzma_index_padding_size(coder->index); - assert(coder->pos <= 3); - coder->sequence = SEQ_PADDING; - break; - } - - coder->sequence = SEQ_UNPADDED; - FALLTHROUGH; - - case SEQ_UNPADDED: - case SEQ_UNCOMPRESSED: { - const lzma_vli size = coder->sequence == SEQ_UNPADDED - ? coder->iter.block.unpadded_size - : coder->iter.block.uncompressed_size; - - ret = lzma_vli_encode(size, &coder->pos, - out, out_pos, out_size); - if (ret != LZMA_STREAM_END) - goto out; - - ret = LZMA_OK; - coder->pos = 0; - - // Advance to SEQ_UNCOMPRESSED or SEQ_NEXT. - ++coder->sequence; - break; - } - - case SEQ_PADDING: - if (coder->pos > 0) { - --coder->pos; - out[(*out_pos)++] = 0x00; - break; - } - - // Finish the CRC32 calculation. - coder->crc32 = lzma_crc32(out + out_start, - *out_pos - out_start, coder->crc32); - - coder->sequence = SEQ_CRC32; - FALLTHROUGH; - - case SEQ_CRC32: - // We don't use the main loop, because we don't want - // coder->crc32 to be touched anymore. - do { - if (*out_pos == out_size) - return LZMA_OK; - - out[*out_pos] = (coder->crc32 >> (coder->pos * 8)) - & 0xFF; - ++*out_pos; - - } while (++coder->pos < 4); - - return LZMA_STREAM_END; - - default: - assert(0); - return LZMA_PROG_ERROR; - } - -out: - // Update the CRC32. - // - // Avoid null pointer + 0 (undefined behavior) in "out + out_start". - // In such a case we had no input and thus out_used == 0. - { - const size_t out_used = *out_pos - out_start; - if (out_used > 0) - coder->crc32 = lzma_crc32(out + out_start, - out_used, coder->crc32); - } - - return ret; -} - - -static void -index_encoder_end(void *coder, const lzma_allocator *allocator) -{ - lzma_free(coder, allocator); - return; -} - - -static void -index_encoder_reset(lzma_index_coder *coder, const lzma_index *i) -{ - lzma_index_iter_init(&coder->iter, i); - - coder->sequence = SEQ_INDICATOR; - coder->index = i; - coder->pos = 0; - coder->crc32 = 0; - - return; -} - - -extern lzma_ret -lzma_index_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_index *i) -{ - lzma_next_coder_init(&lzma_index_encoder_init, next, allocator); - - if (i == NULL) - return LZMA_PROG_ERROR; - - if (next->coder == NULL) { - next->coder = lzma_alloc(sizeof(lzma_index_coder), allocator); - if (next->coder == NULL) - return LZMA_MEM_ERROR; - - next->code = &index_encode; - next->end = &index_encoder_end; - } - - index_encoder_reset(next->coder, i); - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_encoder(lzma_stream *strm, const lzma_index *i) -{ - lzma_next_strm_init(lzma_index_encoder_init, strm, i); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_buffer_encode(const lzma_index *i, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Validate the arguments. - if (i == NULL || out == NULL || out_pos == NULL || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // Don't try to encode if there's not enough output space. - if (out_size - *out_pos < lzma_index_size(i)) - return LZMA_BUF_ERROR; - - // The Index encoder needs just one small data structure so we can - // allocate it on stack. - lzma_index_coder coder; - index_encoder_reset(&coder, i); - - // Do the actual encoding. This should never fail, but store - // the original *out_pos just in case. - const size_t out_start = *out_pos; - lzma_ret ret = index_encode(&coder, NULL, NULL, NULL, 0, - out, out_pos, out_size, LZMA_RUN); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - // We should never get here, but just in case, restore the - // output position and set the error accordingly if something - // goes wrong and debugging isn't enabled. - assert(0); - *out_pos = out_start; - ret = LZMA_PROG_ERROR; - } - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/index_encoder.h b/software/src/xz/src/liblzma/common/index_encoder.h deleted file mode 100644 index 29ba110..0000000 --- a/software/src/xz/src/liblzma/common/index_encoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index_encoder.h -/// \brief Encodes the Index field -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_INDEX_ENCODER_H -#define LZMA_INDEX_ENCODER_H - -#include "common.h" - - -extern lzma_ret lzma_index_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, const lzma_index *i); - - -#endif diff --git a/software/src/xz/src/liblzma/common/index_hash.c b/software/src/xz/src/liblzma/common/index_hash.c deleted file mode 100644 index b7f1b6b..0000000 --- a/software/src/xz/src/liblzma/common/index_hash.c +++ /dev/null @@ -1,341 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index_hash.c -/// \brief Validates Index by using a hash function -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "index.h" -#include "check.h" - - -typedef struct { - /// Sum of the Block sizes (including Block Padding) - lzma_vli blocks_size; - - /// Sum of the Uncompressed Size fields - lzma_vli uncompressed_size; - - /// Number of Records - lzma_vli count; - - /// Size of the List of Index Records as bytes - lzma_vli index_list_size; - - /// Check calculated from Unpadded Sizes and Uncompressed Sizes. - lzma_check_state check; - -} lzma_index_hash_info; - - -struct lzma_index_hash_s { - enum { - SEQ_BLOCK, - SEQ_COUNT, - SEQ_UNPADDED, - SEQ_UNCOMPRESSED, - SEQ_PADDING_INIT, - SEQ_PADDING, - SEQ_CRC32, - } sequence; - - /// Information collected while decoding the actual Blocks. - lzma_index_hash_info blocks; - - /// Information collected from the Index field. - lzma_index_hash_info records; - - /// Number of Records not fully decoded - lzma_vli remaining; - - /// Unpadded Size currently being read from an Index Record. - lzma_vli unpadded_size; - - /// Uncompressed Size currently being read from an Index Record. - lzma_vli uncompressed_size; - - /// Position in variable-length integers when decoding them from - /// the List of Records. - size_t pos; - - /// CRC32 of the Index - uint32_t crc32; -}; - - -extern LZMA_API(lzma_index_hash *) -lzma_index_hash_init(lzma_index_hash *index_hash, - const lzma_allocator *allocator) -{ - if (index_hash == NULL) { - index_hash = lzma_alloc(sizeof(lzma_index_hash), allocator); - if (index_hash == NULL) - return NULL; - } - - index_hash->sequence = SEQ_BLOCK; - index_hash->blocks.blocks_size = 0; - index_hash->blocks.uncompressed_size = 0; - index_hash->blocks.count = 0; - index_hash->blocks.index_list_size = 0; - index_hash->records.blocks_size = 0; - index_hash->records.uncompressed_size = 0; - index_hash->records.count = 0; - index_hash->records.index_list_size = 0; - index_hash->unpadded_size = 0; - index_hash->uncompressed_size = 0; - index_hash->pos = 0; - index_hash->crc32 = 0; - - // These cannot fail because LZMA_CHECK_BEST is known to be supported. - (void)lzma_check_init(&index_hash->blocks.check, LZMA_CHECK_BEST); - (void)lzma_check_init(&index_hash->records.check, LZMA_CHECK_BEST); - - return index_hash; -} - - -extern LZMA_API(void) -lzma_index_hash_end(lzma_index_hash *index_hash, - const lzma_allocator *allocator) -{ - lzma_free(index_hash, allocator); - return; -} - - -extern LZMA_API(lzma_vli) -lzma_index_hash_size(const lzma_index_hash *index_hash) -{ - // Get the size of the Index from ->blocks instead of ->records for - // cases where application wants to know the Index Size before - // decoding the Index. - return index_size(index_hash->blocks.count, - index_hash->blocks.index_list_size); -} - - -/// Updates the sizes and the hash without any validation. -static void -hash_append(lzma_index_hash_info *info, lzma_vli unpadded_size, - lzma_vli uncompressed_size) -{ - info->blocks_size += vli_ceil4(unpadded_size); - info->uncompressed_size += uncompressed_size; - info->index_list_size += lzma_vli_size(unpadded_size) - + lzma_vli_size(uncompressed_size); - ++info->count; - - const lzma_vli sizes[2] = { unpadded_size, uncompressed_size }; - lzma_check_update(&info->check, LZMA_CHECK_BEST, - (const uint8_t *)(sizes), sizeof(sizes)); - - return; -} - - -extern LZMA_API(lzma_ret) -lzma_index_hash_append(lzma_index_hash *index_hash, lzma_vli unpadded_size, - lzma_vli uncompressed_size) -{ - // Validate the arguments. - if (index_hash == NULL || index_hash->sequence != SEQ_BLOCK - || unpadded_size < UNPADDED_SIZE_MIN - || unpadded_size > UNPADDED_SIZE_MAX - || uncompressed_size > LZMA_VLI_MAX) - return LZMA_PROG_ERROR; - - // Update the hash. - hash_append(&index_hash->blocks, unpadded_size, uncompressed_size); - - // Validate the properties of *info are still in allowed limits. - if (index_hash->blocks.blocks_size > LZMA_VLI_MAX - || index_hash->blocks.uncompressed_size > LZMA_VLI_MAX - || index_size(index_hash->blocks.count, - index_hash->blocks.index_list_size) - > LZMA_BACKWARD_SIZE_MAX - || index_stream_size(index_hash->blocks.blocks_size, - index_hash->blocks.count, - index_hash->blocks.index_list_size) - > LZMA_VLI_MAX) - return LZMA_DATA_ERROR; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_index_hash_decode(lzma_index_hash *index_hash, const uint8_t *in, - size_t *in_pos, size_t in_size) -{ - // Catch zero input buffer here, because in contrast to Index encoder - // and decoder functions, applications call this function directly - // instead of via lzma_code(), which does the buffer checking. - if (*in_pos >= in_size) - return LZMA_BUF_ERROR; - - // NOTE: This function has many similarities to index_encode() and - // index_decode() functions found from index_encoder.c and - // index_decoder.c. See the comments especially in index_encoder.c. - const size_t in_start = *in_pos; - lzma_ret ret = LZMA_OK; - - while (*in_pos < in_size) - switch (index_hash->sequence) { - case SEQ_BLOCK: - // Check the Index Indicator is present. - if (in[(*in_pos)++] != INDEX_INDICATOR) - return LZMA_DATA_ERROR; - - index_hash->sequence = SEQ_COUNT; - break; - - case SEQ_COUNT: { - ret = lzma_vli_decode(&index_hash->remaining, - &index_hash->pos, in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - goto out; - - // The count must match the count of the Blocks decoded. - if (index_hash->remaining != index_hash->blocks.count) - return LZMA_DATA_ERROR; - - ret = LZMA_OK; - index_hash->pos = 0; - - // Handle the special case when there are no Blocks. - index_hash->sequence = index_hash->remaining == 0 - ? SEQ_PADDING_INIT : SEQ_UNPADDED; - break; - } - - case SEQ_UNPADDED: - case SEQ_UNCOMPRESSED: { - lzma_vli *size = index_hash->sequence == SEQ_UNPADDED - ? &index_hash->unpadded_size - : &index_hash->uncompressed_size; - - ret = lzma_vli_decode(size, &index_hash->pos, - in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - goto out; - - ret = LZMA_OK; - index_hash->pos = 0; - - if (index_hash->sequence == SEQ_UNPADDED) { - if (index_hash->unpadded_size < UNPADDED_SIZE_MIN - || index_hash->unpadded_size - > UNPADDED_SIZE_MAX) - return LZMA_DATA_ERROR; - - index_hash->sequence = SEQ_UNCOMPRESSED; - } else { - // Update the hash. - hash_append(&index_hash->records, - index_hash->unpadded_size, - index_hash->uncompressed_size); - - // Verify that we don't go over the known sizes. Note - // that this validation is simpler than the one used - // in lzma_index_hash_append(), because here we know - // that values in index_hash->blocks are already - // validated and we are fine as long as we don't - // exceed them in index_hash->records. - if (index_hash->blocks.blocks_size - < index_hash->records.blocks_size - || index_hash->blocks.uncompressed_size - < index_hash->records.uncompressed_size - || index_hash->blocks.index_list_size - < index_hash->records.index_list_size) - return LZMA_DATA_ERROR; - - // Check if this was the last Record. - index_hash->sequence = --index_hash->remaining == 0 - ? SEQ_PADDING_INIT : SEQ_UNPADDED; - } - - break; - } - - case SEQ_PADDING_INIT: - index_hash->pos = (LZMA_VLI_C(4) - index_size_unpadded( - index_hash->records.count, - index_hash->records.index_list_size)) & 3; - - index_hash->sequence = SEQ_PADDING; - FALLTHROUGH; - - case SEQ_PADDING: - if (index_hash->pos > 0) { - --index_hash->pos; - if (in[(*in_pos)++] != 0x00) - return LZMA_DATA_ERROR; - - break; - } - - // Compare the sizes. - if (index_hash->blocks.blocks_size - != index_hash->records.blocks_size - || index_hash->blocks.uncompressed_size - != index_hash->records.uncompressed_size - || index_hash->blocks.index_list_size - != index_hash->records.index_list_size) - return LZMA_DATA_ERROR; - - // Finish the hashes and compare them. - lzma_check_finish(&index_hash->blocks.check, LZMA_CHECK_BEST); - lzma_check_finish(&index_hash->records.check, LZMA_CHECK_BEST); - if (memcmp(index_hash->blocks.check.buffer.u8, - index_hash->records.check.buffer.u8, - lzma_check_size(LZMA_CHECK_BEST)) != 0) - return LZMA_DATA_ERROR; - - // Finish the CRC32 calculation. - index_hash->crc32 = lzma_crc32(in + in_start, - *in_pos - in_start, index_hash->crc32); - - index_hash->sequence = SEQ_CRC32; - FALLTHROUGH; - - case SEQ_CRC32: - do { - if (*in_pos == in_size) - return LZMA_OK; - - if (((index_hash->crc32 >> (index_hash->pos * 8)) - & 0xFF) != in[(*in_pos)++]) { -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - return LZMA_DATA_ERROR; -#endif - } - - } while (++index_hash->pos < 4); - - return LZMA_STREAM_END; - - default: - assert(0); - return LZMA_PROG_ERROR; - } - -out: - // Update the CRC32. - // - // Avoid null pointer + 0 (undefined behavior) in "in + in_start". - // In such a case we had no input and thus in_used == 0. - { - const size_t in_used = *in_pos - in_start; - if (in_used > 0) - index_hash->crc32 = lzma_crc32(in + in_start, - in_used, index_hash->crc32); - } - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/lzip_decoder.c b/software/src/xz/src/liblzma/common/lzip_decoder.c deleted file mode 100644 index 4dff2d5..0000000 --- a/software/src/xz/src/liblzma/common/lzip_decoder.c +++ /dev/null @@ -1,413 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzip_decoder.c -/// \brief Decodes .lz (lzip) files -// -// Author: MichaÅ‚ Górny -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzip_decoder.h" -#include "lzma_decoder.h" -#include "check.h" - - -// .lz format version 0 lacks the 64-bit Member size field in the footer. -#define LZIP_V0_FOOTER_SIZE 12 -#define LZIP_V1_FOOTER_SIZE 20 -#define LZIP_FOOTER_SIZE_MAX LZIP_V1_FOOTER_SIZE - -// lc/lp/pb are hardcoded in the .lz format. -#define LZIP_LC 3 -#define LZIP_LP 0 -#define LZIP_PB 2 - - -typedef struct { - enum { - SEQ_ID_STRING, - SEQ_VERSION, - SEQ_DICT_SIZE, - SEQ_CODER_INIT, - SEQ_LZMA_STREAM, - SEQ_MEMBER_FOOTER, - } sequence; - - /// .lz member format version - uint32_t version; - - /// CRC32 of the uncompressed data in the .lz member - uint32_t crc32; - - /// Uncompressed size of the .lz member - uint64_t uncompressed_size; - - /// Compressed size of the .lz member - uint64_t member_size; - - /// Memory usage limit - uint64_t memlimit; - - /// Amount of memory actually needed - uint64_t memusage; - - /// If true, LZMA_GET_CHECK is returned after decoding the header - /// fields. As all files use CRC32 this is redundant but it's - /// implemented anyway since the initialization functions supports - /// all other flags in addition to LZMA_TELL_ANY_CHECK. - bool tell_any_check; - - /// If true, we won't calculate or verify the CRC32 of - /// the uncompressed data. - bool ignore_check; - - /// If true, we will decode concatenated .lz members and stop if - /// non-.lz data is seen after at least one member has been - /// successfully decoded. - bool concatenated; - - /// When decoding concatenated .lz members, this is true as long as - /// we are decoding the first .lz member. This is needed to avoid - /// incorrect LZMA_FORMAT_ERROR in case there is non-.lz data at - /// the end of the file. - bool first_member; - - /// Reading position in the header and footer fields - size_t pos; - - /// Buffer to hold the .lz footer fields - uint8_t buffer[LZIP_FOOTER_SIZE_MAX]; - - /// Options decoded from the .lz header that needed to initialize - /// the LZMA1 decoder. - lzma_options_lzma options; - - /// LZMA1 decoder - lzma_next_coder lzma_decoder; - -} lzma_lzip_coder; - - -static lzma_ret -lzip_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_lzip_coder *coder = coder_ptr; - - while (true) - switch (coder->sequence) { - case SEQ_ID_STRING: { - // The "ID string" or magic bytes are "LZIP" in US-ASCII. - const uint8_t lzip_id_string[4] = { 0x4C, 0x5A, 0x49, 0x50 }; - - while (coder->pos < sizeof(lzip_id_string)) { - if (*in_pos >= in_size) { - // If we are on the 2nd+ concatenated member - // and the input ends before we can read - // the magic bytes, we discard the bytes that - // were already read (up to 3) and finish. - // See the reasoning below. - return !coder->first_member - && action == LZMA_FINISH - ? LZMA_STREAM_END : LZMA_OK; - } - - if (in[*in_pos] != lzip_id_string[coder->pos]) { - // The .lz format allows putting non-.lz data - // at the end of the file. If we have seen - // at least one valid .lz member already, - // then we won't consume the byte at *in_pos - // and will return LZMA_STREAM_END. This way - // apps can easily locate and read the non-.lz - // data after the .lz member(s). - // - // NOTE: If the first 1-3 bytes of the non-.lz - // data match the .lz ID string then the first - // 1-3 bytes of the junk will get ignored by - // us. If apps want to properly locate the - // trailing data they must ensure that the - // first byte of their custom data isn't the - // same as the first byte of .lz ID string. - // With the liblzma API we cannot rewind the - // input position across calls to lzma_code(). - return !coder->first_member - ? LZMA_STREAM_END : LZMA_FORMAT_ERROR; - } - - ++*in_pos; - ++coder->pos; - } - - coder->pos = 0; - - coder->crc32 = 0; - coder->uncompressed_size = 0; - coder->member_size = sizeof(lzip_id_string); - - coder->sequence = SEQ_VERSION; - FALLTHROUGH; - } - - case SEQ_VERSION: - if (*in_pos >= in_size) - return LZMA_OK; - - coder->version = in[(*in_pos)++]; - - // We support version 0 and unextended version 1. - if (coder->version > 1) - return LZMA_OPTIONS_ERROR; - - ++coder->member_size; - coder->sequence = SEQ_DICT_SIZE; - - // .lz versions 0 and 1 use CRC32 as the integrity check - // so if the application wanted to know that - // (LZMA_TELL_ANY_CHECK) we can tell it now. - if (coder->tell_any_check) - return LZMA_GET_CHECK; - - FALLTHROUGH; - - case SEQ_DICT_SIZE: { - if (*in_pos >= in_size) - return LZMA_OK; - - const uint32_t ds = in[(*in_pos)++]; - ++coder->member_size; - - // The five lowest bits are for the base-2 logarithm of - // the dictionary size and the highest three bits are - // the fractional part (0/16 to 7/16) that will be - // subtracted to get the final value. - // - // For example, with 0xB5: - // b2log = 21 - // fracnum = 5 - // dict_size = 2^21 - 2^21 * 5 / 16 = 1408 KiB - const uint32_t b2log = ds & 0x1F; - const uint32_t fracnum = ds >> 5; - - // The format versions 0 and 1 allow dictionary size in the - // range [4 KiB, 512 MiB]. - if (b2log < 12 || b2log > 29 || (b2log == 12 && fracnum > 0)) - return LZMA_DATA_ERROR; - - // 2^[b2log] - 2^[b2log] * [fracnum] / 16 - // = 2^[b2log] - [fracnum] * 2^([b2log] - 4) - coder->options.dict_size = (UINT32_C(1) << b2log) - - (fracnum << (b2log - 4)); - - assert(coder->options.dict_size >= 4096); - assert(coder->options.dict_size <= (UINT32_C(512) << 20)); - - coder->options.preset_dict = NULL; - coder->options.lc = LZIP_LC; - coder->options.lp = LZIP_LP; - coder->options.pb = LZIP_PB; - - // Calculate the memory usage. - coder->memusage = lzma_lzma_decoder_memusage(&coder->options) - + LZMA_MEMUSAGE_BASE; - - // Initialization is a separate step because if we return - // LZMA_MEMLIMIT_ERROR we need to be able to restart after - // the memlimit has been increased. - coder->sequence = SEQ_CODER_INIT; - FALLTHROUGH; - } - - case SEQ_CODER_INIT: { - if (coder->memusage > coder->memlimit) - return LZMA_MEMLIMIT_ERROR; - - const lzma_filter_info filters[2] = { - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_decoder_init, - .options = &coder->options, - }, { - .init = NULL, - } - }; - - return_if_error(lzma_next_filter_init(&coder->lzma_decoder, - allocator, filters)); - - coder->crc32 = 0; - coder->sequence = SEQ_LZMA_STREAM; - FALLTHROUGH; - } - - case SEQ_LZMA_STREAM: { - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - const lzma_ret ret = coder->lzma_decoder.code( - coder->lzma_decoder.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - action); - - const size_t out_used = *out_pos - out_start; - - coder->member_size += *in_pos - in_start; - coder->uncompressed_size += out_used; - - // Don't update the CRC32 if the integrity check will be - // ignored or if there was no new output. The latter is - // important in case out == NULL to avoid null pointer + 0 - // which is undefined behavior. - if (!coder->ignore_check && out_used > 0) - coder->crc32 = lzma_crc32(out + out_start, out_used, - coder->crc32); - - if (ret != LZMA_STREAM_END) - return ret; - - coder->sequence = SEQ_MEMBER_FOOTER; - FALLTHROUGH; - } - - case SEQ_MEMBER_FOOTER: { - // The footer of .lz version 0 lacks the Member size field. - // This is the only difference between version 0 and - // unextended version 1 formats. - const size_t footer_size = coder->version == 0 - ? LZIP_V0_FOOTER_SIZE - : LZIP_V1_FOOTER_SIZE; - - // Copy the CRC32, Data size, and Member size fields to - // the internal buffer. - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - footer_size); - - // Return if we didn't get the whole footer yet. - if (coder->pos < footer_size) - return LZMA_OK; - - coder->pos = 0; - coder->member_size += footer_size; - - // Check that the footer fields match the observed data. - if (!coder->ignore_check - && coder->crc32 != read32le(&coder->buffer[0])) - return LZMA_DATA_ERROR; - - if (coder->uncompressed_size != read64le(&coder->buffer[4])) - return LZMA_DATA_ERROR; - - if (coder->version > 0) { - // .lz version 0 has no Member size field. - if (coder->member_size != read64le(&coder->buffer[12])) - return LZMA_DATA_ERROR; - } - - // Decoding is finished if we weren't requested to decode - // more than one .lz member. - if (!coder->concatenated) - return LZMA_STREAM_END; - - coder->first_member = false; - coder->sequence = SEQ_ID_STRING; - break; - } - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - // Never reached -} - - -static void -lzip_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_lzip_coder *coder = coder_ptr; - lzma_next_end(&coder->lzma_decoder, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_check -lzip_decoder_get_check(const void *coder_ptr lzma_attribute((__unused__))) -{ - return LZMA_CHECK_CRC32; -} - - -static lzma_ret -lzip_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_lzip_coder *coder = coder_ptr; - - *memusage = coder->memusage; - *old_memlimit = coder->memlimit; - - if (new_memlimit != 0) { - if (new_memlimit < coder->memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzip_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, uint32_t flags) -{ - lzma_next_coder_init(&lzma_lzip_decoder_init, next, allocator); - - if (flags & ~LZMA_SUPPORTED_FLAGS) - return LZMA_OPTIONS_ERROR; - - lzma_lzip_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_lzip_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &lzip_decode; - next->end = &lzip_decoder_end; - next->get_check = &lzip_decoder_get_check; - next->memconfig = &lzip_decoder_memconfig; - - coder->lzma_decoder = LZMA_NEXT_CODER_INIT; - } - - coder->sequence = SEQ_ID_STRING; - coder->memlimit = my_max(1, memlimit); - coder->memusage = LZMA_MEMUSAGE_BASE; - coder->tell_any_check = (flags & LZMA_TELL_ANY_CHECK) != 0; - coder->ignore_check = (flags & LZMA_IGNORE_CHECK) != 0; - coder->concatenated = (flags & LZMA_CONCATENATED) != 0; - coder->first_member = true; - coder->pos = 0; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_lzip_decoder(lzma_stream *strm, uint64_t memlimit, uint32_t flags) -{ - lzma_next_strm_init(lzma_lzip_decoder_init, strm, memlimit, flags); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/lzip_decoder.h b/software/src/xz/src/liblzma/common/lzip_decoder.h deleted file mode 100644 index 0e1f7be..0000000 --- a/software/src/xz/src/liblzma/common/lzip_decoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzip_decoder.h -/// \brief Decodes .lz (lzip) files -// -// Author: MichaÅ‚ Górny -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZIP_DECODER_H -#define LZMA_LZIP_DECODER_H - -#include "common.h" - -extern lzma_ret lzma_lzip_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, uint32_t flags); - -#endif diff --git a/software/src/xz/src/liblzma/common/memcmplen.h b/software/src/xz/src/liblzma/common/memcmplen.h deleted file mode 100644 index 82e9085..0000000 --- a/software/src/xz/src/liblzma/common/memcmplen.h +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file memcmplen.h -/// \brief Optimized comparison of two buffers -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_MEMCMPLEN_H -#define LZMA_MEMCMPLEN_H - -#include "common.h" - -#ifdef HAVE_IMMINTRIN_H -# include -#endif - -// Only include if it is needed. The header is only needed -// on Windows when using an MSVC compatible compiler. The Intel compiler -// can use the intrinsics without the header file. -#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && defined(_MSC_VER) \ - && (defined(_M_X64) \ - || defined(_M_ARM64) || defined(_M_ARM64EC)) \ - && !defined(__INTEL_COMPILER) -# include -#endif - - -/// Find out how many equal bytes the two buffers have. -/// -/// \param buf1 First buffer -/// \param buf2 Second buffer -/// \param len How many bytes have already been compared and will -/// be assumed to match -/// \param limit How many bytes to compare at most, including the -/// already-compared bytes. This must be significantly -/// smaller than UINT32_MAX to avoid integer overflows. -/// Up to LZMA_MEMCMPLEN_EXTRA bytes may be read past -/// the specified limit from both buf1 and buf2. -/// -/// \return Number of equal bytes in the buffers is returned. -/// This is always at least len and at most limit. -/// -/// \note LZMA_MEMCMPLEN_EXTRA defines how many extra bytes may be read. -/// It's rounded up to 2^n. This extra amount needs to be -/// allocated in the buffers being used. It needs to be -/// initialized too to keep Valgrind quiet. -static lzma_always_inline uint32_t -lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, - uint32_t len, uint32_t limit) -{ - assert(len <= limit); - assert(limit <= UINT32_MAX / 2); - -#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && (((TUKLIB_GNUC_REQ(3, 4) || defined(__clang__)) \ - && SIZE_MAX == UINT64_MAX) \ - || (defined(__INTEL_COMPILER) && defined(__x86_64__)) \ - || (defined(__INTEL_COMPILER) && defined(_M_X64)) \ - || (defined(_MSC_VER) && (defined(_M_X64) \ - || defined(_M_ARM64) || defined(_M_ARM64EC)))) - // This is only for x86-64 and ARM64 for now. This might be fine on - // other 64-bit processors too. - // - // Reasons to use subtraction instead of xor: - // - // - On some x86-64 processors (Intel Sandy Bridge to Tiger Lake), - // sub+jz and sub+jnz can be fused but xor+jz or xor+jnz cannot. - // Thus using subtraction has potential to be a tiny amount faster - // since the code checks if the quotient is non-zero. - // - // - Some processors (Intel Pentium 4) used to have more ALU - // resources for add/sub instructions than and/or/xor. - // - // The processor info is based on Agner Fog's microarchitecture.pdf - // version 2023-05-26. https://www.agner.org/optimize/ -#define LZMA_MEMCMPLEN_EXTRA 8 - while (len < limit) { -# ifdef WORDS_BIGENDIAN - const uint64_t x = read64ne(buf1 + len) ^ read64ne(buf2 + len); -# else - const uint64_t x = read64ne(buf1 + len) - read64ne(buf2 + len); -# endif - if (x != 0) { - // MSVC or Intel C compiler on Windows -# if defined(_MSC_VER) || defined(__INTEL_COMPILER) - unsigned long tmp; - _BitScanForward64(&tmp, x); - len += (uint32_t)tmp >> 3; - // GCC, Clang, or Intel C compiler -# elif defined(WORDS_BIGENDIAN) - len += (uint32_t)__builtin_clzll(x) >> 3; -# else - len += (uint32_t)__builtin_ctzll(x) >> 3; -# endif - return my_min(len, limit); - } - - len += 8; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && defined(HAVE__MM_MOVEMASK_EPI8) \ - && (defined(__SSE2__) \ - || (defined(_MSC_VER) && defined(_M_IX86_FP) \ - && _M_IX86_FP >= 2)) - // NOTE: This will use 128-bit unaligned access which - // TUKLIB_FAST_UNALIGNED_ACCESS wasn't meant to permit, - // but it's convenient here since this is x86-only. - // - // SSE2 version for 32-bit and 64-bit x86. On x86-64 the above - // version is sometimes significantly faster and sometimes - // slightly slower than this SSE2 version, so this SSE2 - // version isn't used on x86-64. -# define LZMA_MEMCMPLEN_EXTRA 16 - while (len < limit) { - const uint32_t x = 0xFFFF ^ (uint32_t)_mm_movemask_epi8( - _mm_cmpeq_epi8( - _mm_loadu_si128((const __m128i *)(buf1 + len)), - _mm_loadu_si128((const __m128i *)(buf2 + len)))); - - if (x != 0) { - len += ctz32(x); - return my_min(len, limit); - } - - len += 16; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) && !defined(WORDS_BIGENDIAN) - // Generic 32-bit little endian method -# define LZMA_MEMCMPLEN_EXTRA 4 - while (len < limit) { - uint32_t x = read32ne(buf1 + len) - read32ne(buf2 + len); - if (x != 0) { - if ((x & 0xFFFF) == 0) { - len += 2; - x >>= 16; - } - - if ((x & 0xFF) == 0) - ++len; - - return my_min(len, limit); - } - - len += 4; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) && defined(WORDS_BIGENDIAN) - // Generic 32-bit big endian method -# define LZMA_MEMCMPLEN_EXTRA 4 - while (len < limit) { - uint32_t x = read32ne(buf1 + len) ^ read32ne(buf2 + len); - if (x != 0) { - if ((x & 0xFFFF0000) == 0) { - len += 2; - x <<= 16; - } - - if ((x & 0xFF000000) == 0) - ++len; - - return my_min(len, limit); - } - - len += 4; - } - - return limit; - -#else - // Simple portable version that doesn't use unaligned access. -# define LZMA_MEMCMPLEN_EXTRA 0 - while (len < limit && buf1[len] == buf2[len]) - ++len; - - return len; -#endif -} - -#endif diff --git a/software/src/xz/src/liblzma/common/microlzma_decoder.c b/software/src/xz/src/liblzma/common/microlzma_decoder.c deleted file mode 100644 index 882cb2c..0000000 --- a/software/src/xz/src/liblzma/common/microlzma_decoder.c +++ /dev/null @@ -1,220 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file microlzma_decoder.c -/// \brief Decode MicroLZMA format -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_decoder.h" -#include "lz_decoder.h" - - -typedef struct { - /// LZMA1 decoder - lzma_next_coder lzma; - - /// Compressed size of the stream as given by the application. - /// This must be exactly correct. - /// - /// This will be decremented when input is read. - uint64_t comp_size; - - /// Uncompressed size of the stream as given by the application. - /// This may be less than the actual uncompressed size if - /// uncomp_size_is_exact is false. - /// - /// This will be decremented when output is produced. - lzma_vli uncomp_size; - - /// LZMA dictionary size as given by the application - uint32_t dict_size; - - /// If true, the exact uncompressed size is known. If false, - /// uncomp_size may be smaller than the real uncompressed size; - /// uncomp_size may never be bigger than the real uncompressed size. - bool uncomp_size_is_exact; - - /// True once the first byte of the MicroLZMA stream - /// has been processed. - bool props_decoded; -} lzma_microlzma_coder; - - -static lzma_ret -microlzma_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_microlzma_coder *coder = coder_ptr; - - // Remember the in start position so that we can update comp_size. - const size_t in_start = *in_pos; - - // Remember the out start position so that we can update uncomp_size. - const size_t out_start = *out_pos; - - // Limit the amount of input so that the decoder won't read more than - // comp_size. This is required when uncomp_size isn't exact because - // in that case the LZMA decoder will try to decode more input even - // when it has no output space (it can be looking for EOPM). - if (in_size - *in_pos > coder->comp_size) - in_size = *in_pos + (size_t)(coder->comp_size); - - // When the exact uncompressed size isn't known, we must limit - // the available output space to prevent the LZMA decoder from - // trying to decode too much. - if (!coder->uncomp_size_is_exact - && out_size - *out_pos > coder->uncomp_size) - out_size = *out_pos + (size_t)(coder->uncomp_size); - - if (!coder->props_decoded) { - // There must be at least one byte of input to decode - // the properties byte. - if (*in_pos >= in_size) - return LZMA_OK; - - lzma_options_lzma options = { - .dict_size = coder->dict_size, - .preset_dict = NULL, - .preset_dict_size = 0, - .ext_flags = 0, // EOPM not allowed when size is known - .ext_size_low = UINT32_MAX, // Unknown size by default - .ext_size_high = UINT32_MAX, - }; - - if (coder->uncomp_size_is_exact) - lzma_set_ext_size(options, coder->uncomp_size); - - // The properties are stored as bitwise-negation - // of the typical encoding. - if (lzma_lzma_lclppb_decode(&options, ~in[*in_pos])) - return LZMA_OPTIONS_ERROR; - - ++*in_pos; - - // Initialize the decoder. - lzma_filter_info filters[2] = { - { - .id = LZMA_FILTER_LZMA1EXT, - .init = &lzma_lzma_decoder_init, - .options = &options, - }, { - .init = NULL, - } - }; - - return_if_error(lzma_next_filter_init(&coder->lzma, - allocator, filters)); - - // Pass one dummy 0x00 byte to the LZMA decoder since that - // is what it expects the first byte to be. - const uint8_t dummy_in = 0; - size_t dummy_in_pos = 0; - if (coder->lzma.code(coder->lzma.coder, allocator, - &dummy_in, &dummy_in_pos, 1, - out, out_pos, out_size, LZMA_RUN) != LZMA_OK) - return LZMA_PROG_ERROR; - - assert(dummy_in_pos == 1); - coder->props_decoded = true; - } - - // The rest is normal LZMA decoding. - lzma_ret ret = coder->lzma.code(coder->lzma.coder, allocator, - in, in_pos, in_size, - out, out_pos, out_size, action); - - // Update the remaining compressed size. - assert(coder->comp_size >= *in_pos - in_start); - coder->comp_size -= *in_pos - in_start; - - if (coder->uncomp_size_is_exact) { - // After successful decompression of the complete stream - // the compressed size must match. - if (ret == LZMA_STREAM_END && coder->comp_size != 0) - ret = LZMA_DATA_ERROR; - } else { - // Update the amount of output remaining. - assert(coder->uncomp_size >= *out_pos - out_start); - coder->uncomp_size -= *out_pos - out_start; - - // - We must not get LZMA_STREAM_END because the stream - // shouldn't have EOPM. - // - We must use uncomp_size to determine when to - // return LZMA_STREAM_END. - if (ret == LZMA_STREAM_END) - ret = LZMA_DATA_ERROR; - else if (coder->uncomp_size == 0) - ret = LZMA_STREAM_END; - } - - return ret; -} - - -static void -microlzma_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_microlzma_coder *coder = coder_ptr; - lzma_next_end(&coder->lzma, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -microlzma_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t comp_size, - uint64_t uncomp_size, bool uncomp_size_is_exact, - uint32_t dict_size) -{ - lzma_next_coder_init(µlzma_decoder_init, next, allocator); - - lzma_microlzma_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_microlzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = µlzma_decode; - next->end = µlzma_decoder_end; - - coder->lzma = LZMA_NEXT_CODER_INIT; - } - - // The public API is uint64_t but the internal LZ decoder API uses - // lzma_vli. - if (uncomp_size > LZMA_VLI_MAX) - return LZMA_OPTIONS_ERROR; - - coder->comp_size = comp_size; - coder->uncomp_size = uncomp_size; - coder->uncomp_size_is_exact = uncomp_size_is_exact; - coder->dict_size = dict_size; - - coder->props_decoded = false; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_microlzma_decoder(lzma_stream *strm, uint64_t comp_size, - uint64_t uncomp_size, lzma_bool uncomp_size_is_exact, - uint32_t dict_size) -{ - lzma_next_strm_init(microlzma_decoder_init, strm, comp_size, - uncomp_size, uncomp_size_is_exact, dict_size); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/microlzma_encoder.c b/software/src/xz/src/liblzma/common/microlzma_encoder.c deleted file mode 100644 index 45ec0b1..0000000 --- a/software/src/xz/src/liblzma/common/microlzma_encoder.c +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file microlzma_encoder.c -/// \brief Encode into MicroLZMA format -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_encoder.h" - - -typedef struct { - /// LZMA1 encoder - lzma_next_coder lzma; - - /// LZMA properties byte (lc/lp/pb) - uint8_t props; -} lzma_microlzma_coder; - - -static lzma_ret -microlzma_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_microlzma_coder *coder = coder_ptr; - - // Remember *out_pos so that we can overwrite the first byte with - // the LZMA properties byte. - const size_t out_start = *out_pos; - - // Remember *in_pos so that we can set it based on how many - // uncompressed bytes were actually encoded. - const size_t in_start = *in_pos; - - // Set the output size limit based on the available output space. - // We know that the encoder supports set_out_limit() so - // LZMA_OPTIONS_ERROR isn't possible. LZMA_BUF_ERROR is possible - // but lzma_code() has an assertion to not allow it to be returned - // from here and I don't want to change that for now, so - // LZMA_BUF_ERROR becomes LZMA_PROG_ERROR. - uint64_t uncomp_size; - if (coder->lzma.set_out_limit(coder->lzma.coder, - &uncomp_size, out_size - *out_pos) != LZMA_OK) - return LZMA_PROG_ERROR; - - // set_out_limit fails if this isn't true. - assert(out_size - *out_pos >= 6); - - // Encode as much as possible. - const lzma_ret ret = coder->lzma.code(coder->lzma.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, action); - - if (ret != LZMA_STREAM_END) { - if (ret == LZMA_OK) { - assert(0); - return LZMA_PROG_ERROR; - } - - return ret; - } - - // The first output byte is bitwise-negation of the properties byte. - // We know that there is space for this byte because set_out_limit - // and the actual encoding succeeded. - out[out_start] = (uint8_t)(~coder->props); - - // The LZMA encoder likely read more input than it was able to encode. - // Set *in_pos based on uncomp_size. - assert(uncomp_size <= in_size - in_start); - *in_pos = in_start + (size_t)(uncomp_size); - - return ret; -} - - -static void -microlzma_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_microlzma_coder *coder = coder_ptr; - lzma_next_end(&coder->lzma, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -microlzma_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_options_lzma *options) -{ - lzma_next_coder_init(µlzma_encoder_init, next, allocator); - - lzma_microlzma_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_microlzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = µlzma_encode; - next->end = µlzma_encoder_end; - - coder->lzma = LZMA_NEXT_CODER_INIT; - } - - // Encode the properties byte. Bitwise-negation of it will be the - // first output byte. - if (lzma_lzma_lclppb_encode(options, &coder->props)) - return LZMA_OPTIONS_ERROR; - - // Initialize the LZMA encoder. - const lzma_filter_info filters[2] = { - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_encoder_init, - .options = (void *)(options), - }, { - .init = NULL, - } - }; - - return lzma_next_filter_init(&coder->lzma, allocator, filters); -} - - -extern LZMA_API(lzma_ret) -lzma_microlzma_encoder(lzma_stream *strm, const lzma_options_lzma *options) -{ - lzma_next_strm_init(microlzma_encoder_init, strm, options); - - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; - -} diff --git a/software/src/xz/src/liblzma/common/outqueue.c b/software/src/xz/src/liblzma/common/outqueue.c deleted file mode 100644 index eb018eb..0000000 --- a/software/src/xz/src/liblzma/common/outqueue.c +++ /dev/null @@ -1,286 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file outqueue.c -/// \brief Output queue handling in multithreaded coding -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "outqueue.h" - - -/// Get the maximum number of buffers that may be allocated based -/// on the number of threads. For now this is twice the number of threads. -/// It's a compromise between RAM usage and keeping the worker threads busy -/// when buffers finish out of order. -#define GET_BUFS_LIMIT(threads) (2 * (threads)) - - -extern uint64_t -lzma_outq_memusage(uint64_t buf_size_max, uint32_t threads) -{ - // This is to ease integer overflow checking: We may allocate up to - // GET_BUFS_LIMIT(LZMA_THREADS_MAX) buffers and we need some extra - // memory for other data structures too (that's the /2). - // - // lzma_outq_prealloc_buf() will still accept bigger buffers than this. - const uint64_t limit - = UINT64_MAX / GET_BUFS_LIMIT(LZMA_THREADS_MAX) / 2; - - if (threads > LZMA_THREADS_MAX || buf_size_max > limit) - return UINT64_MAX; - - return GET_BUFS_LIMIT(threads) - * lzma_outq_outbuf_memusage(buf_size_max); -} - - -static void -move_head_to_cache(lzma_outq *outq, const lzma_allocator *allocator) -{ - assert(outq->head != NULL); - assert(outq->tail != NULL); - assert(outq->bufs_in_use > 0); - - lzma_outbuf *buf = outq->head; - outq->head = buf->next; - if (outq->head == NULL) - outq->tail = NULL; - - if (outq->cache != NULL && outq->cache->allocated != buf->allocated) - lzma_outq_clear_cache(outq, allocator); - - buf->next = outq->cache; - outq->cache = buf; - - --outq->bufs_in_use; - outq->mem_in_use -= lzma_outq_outbuf_memusage(buf->allocated); - - return; -} - - -static void -free_one_cached_buffer(lzma_outq *outq, const lzma_allocator *allocator) -{ - assert(outq->cache != NULL); - - lzma_outbuf *buf = outq->cache; - outq->cache = buf->next; - - --outq->bufs_allocated; - outq->mem_allocated -= lzma_outq_outbuf_memusage(buf->allocated); - - lzma_free(buf, allocator); - return; -} - - -extern void -lzma_outq_clear_cache(lzma_outq *outq, const lzma_allocator *allocator) -{ - while (outq->cache != NULL) - free_one_cached_buffer(outq, allocator); - - return; -} - - -extern void -lzma_outq_clear_cache2(lzma_outq *outq, const lzma_allocator *allocator, - size_t keep_size) -{ - if (outq->cache == NULL) - return; - - // Free all but one. - while (outq->cache->next != NULL) - free_one_cached_buffer(outq, allocator); - - // Free the last one only if its size doesn't equal to keep_size. - if (outq->cache->allocated != keep_size) - free_one_cached_buffer(outq, allocator); - - return; -} - - -extern lzma_ret -lzma_outq_init(lzma_outq *outq, const lzma_allocator *allocator, - uint32_t threads) -{ - if (threads > LZMA_THREADS_MAX) - return LZMA_OPTIONS_ERROR; - - const uint32_t bufs_limit = GET_BUFS_LIMIT(threads); - - // Clear head/tail. - while (outq->head != NULL) - move_head_to_cache(outq, allocator); - - // If new buf_limit is lower than the old one, we may need to free - // a few cached buffers. - while (bufs_limit < outq->bufs_allocated) - free_one_cached_buffer(outq, allocator); - - outq->bufs_limit = bufs_limit; - outq->read_pos = 0; - - return LZMA_OK; -} - - -extern void -lzma_outq_end(lzma_outq *outq, const lzma_allocator *allocator) -{ - while (outq->head != NULL) - move_head_to_cache(outq, allocator); - - lzma_outq_clear_cache(outq, allocator); - return; -} - - -extern lzma_ret -lzma_outq_prealloc_buf(lzma_outq *outq, const lzma_allocator *allocator, - size_t size) -{ - // Caller must have checked it with lzma_outq_has_buf(). - assert(outq->bufs_in_use < outq->bufs_limit); - - // If there already is appropriately-sized buffer in the cache, - // we need to do nothing. - if (outq->cache != NULL && outq->cache->allocated == size) - return LZMA_OK; - - if (size > SIZE_MAX - sizeof(lzma_outbuf)) - return LZMA_MEM_ERROR; - - const size_t alloc_size = lzma_outq_outbuf_memusage(size); - - // The cache may have buffers but their size is wrong. - lzma_outq_clear_cache(outq, allocator); - - outq->cache = lzma_alloc(alloc_size, allocator); - if (outq->cache == NULL) - return LZMA_MEM_ERROR; - - outq->cache->next = NULL; - outq->cache->allocated = size; - - ++outq->bufs_allocated; - outq->mem_allocated += alloc_size; - - return LZMA_OK; -} - - -extern lzma_outbuf * -lzma_outq_get_buf(lzma_outq *outq, void *worker) -{ - // Caller must have used lzma_outq_prealloc_buf() to ensure these. - assert(outq->bufs_in_use < outq->bufs_limit); - assert(outq->bufs_in_use < outq->bufs_allocated); - assert(outq->cache != NULL); - - lzma_outbuf *buf = outq->cache; - outq->cache = buf->next; - buf->next = NULL; - - if (outq->tail != NULL) { - assert(outq->head != NULL); - outq->tail->next = buf; - } else { - assert(outq->head == NULL); - outq->head = buf; - } - - outq->tail = buf; - - buf->worker = worker; - buf->finished = false; - buf->finish_ret = LZMA_STREAM_END; - buf->pos = 0; - buf->decoder_in_pos = 0; - - buf->unpadded_size = 0; - buf->uncompressed_size = 0; - - ++outq->bufs_in_use; - outq->mem_in_use += lzma_outq_outbuf_memusage(buf->allocated); - - return buf; -} - - -extern bool -lzma_outq_is_readable(const lzma_outq *outq) -{ - if (outq->head == NULL) - return false; - - return outq->read_pos < outq->head->pos || outq->head->finished; -} - - -extern lzma_ret -lzma_outq_read(lzma_outq *restrict outq, - const lzma_allocator *restrict allocator, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, - lzma_vli *restrict unpadded_size, - lzma_vli *restrict uncompressed_size) -{ - // There must be at least one buffer from which to read. - if (outq->bufs_in_use == 0) - return LZMA_OK; - - // Get the buffer. - lzma_outbuf *buf = outq->head; - - // Copy from the buffer to output. - // - // FIXME? In threaded decoder it may be bad to do this copy while - // the mutex is being held. - lzma_bufcpy(buf->buf, &outq->read_pos, buf->pos, - out, out_pos, out_size); - - // Return if we didn't get all the data from the buffer. - if (!buf->finished || outq->read_pos < buf->pos) - return LZMA_OK; - - // The buffer was finished. Tell the caller its size information. - if (unpadded_size != NULL) - *unpadded_size = buf->unpadded_size; - - if (uncompressed_size != NULL) - *uncompressed_size = buf->uncompressed_size; - - // Remember the return value. - const lzma_ret finish_ret = buf->finish_ret; - - // Free this buffer for further use. - move_head_to_cache(outq, allocator); - outq->read_pos = 0; - - return finish_ret; -} - - -extern void -lzma_outq_enable_partial_output(lzma_outq *outq, - void (*enable_partial_output)(void *worker)) -{ - if (outq->head != NULL && !outq->head->finished - && outq->head->worker != NULL) { - enable_partial_output(outq->head->worker); - - // Set it to NULL since calling it twice is pointless. - outq->head->worker = NULL; - } - - return; -} diff --git a/software/src/xz/src/liblzma/common/outqueue.h b/software/src/xz/src/liblzma/common/outqueue.h deleted file mode 100644 index 25f0719..0000000 --- a/software/src/xz/src/liblzma/common/outqueue.h +++ /dev/null @@ -1,258 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file outqueue.h -/// \brief Output queue handling in multithreaded coding -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_OUTQUEUE_H -#define LZMA_OUTQUEUE_H - -#include "common.h" - - -/// Output buffer for a single thread -typedef struct lzma_outbuf_s lzma_outbuf; -struct lzma_outbuf_s { - /// Pointer to the next buffer. This is used for the cached buffers. - /// The worker thread must not modify this. - lzma_outbuf *next; - - /// This initialized by lzma_outq_get_buf() and - /// is used by lzma_outq_enable_partial_output(). - /// The worker thread must not modify this. - void *worker; - - /// Amount of memory allocated for buf[]. - /// The worker thread must not modify this. - size_t allocated; - - /// Writing position in the worker thread or, in other words, the - /// amount of finished data written to buf[] which can be copied out - /// - /// \note This is read by another thread and thus access - /// to this variable needs a mutex. - size_t pos; - - /// Decompression: Position in the input buffer in the worker thread - /// that matches the output "pos" above. This is used to detect if - /// more output might be possible from the worker thread: if it has - /// consumed all its input, then more output isn't possible. - /// - /// \note This is read by another thread and thus access - /// to this variable needs a mutex. - size_t decoder_in_pos; - - /// True when no more data will be written into this buffer. - /// - /// \note This is read by another thread and thus access - /// to this variable needs a mutex. - bool finished; - - /// Return value for lzma_outq_read() when the last byte from - /// a finished buffer has been read. Defaults to LZMA_STREAM_END. - /// This must *not* be LZMA_OK. The idea is to allow a decoder to - /// pass an error code to the main thread, setting the code here - /// together with finished = true. - lzma_ret finish_ret; - - /// Additional size information. lzma_outq_read() may read these - /// when "finished" is true. - lzma_vli unpadded_size; - lzma_vli uncompressed_size; - - /// Buffer of "allocated" bytes - uint8_t buf[]; -}; - - -typedef struct { - /// Linked list of buffers in use. The next output byte will be - /// read from the head and buffers for the next thread will be - /// appended to the tail. tail->next is always NULL. - lzma_outbuf *head; - lzma_outbuf *tail; - - /// Number of bytes read from head->buf[] in lzma_outq_read() - size_t read_pos; - - /// Linked list of allocated buffers that aren't currently used. - /// This way buffers of similar size can be reused and don't - /// need to be reallocated every time. For simplicity, all - /// cached buffers in the list have the same allocated size. - lzma_outbuf *cache; - - /// Total amount of memory allocated for buffers - uint64_t mem_allocated; - - /// Amount of memory used by the buffers that are in use in - /// the head...tail linked list. - uint64_t mem_in_use; - - /// Number of buffers in use in the head...tail list. If and only if - /// this is zero, the pointers head and tail above are NULL. - uint32_t bufs_in_use; - - /// Number of buffers allocated (in use + cached) - uint32_t bufs_allocated; - - /// Maximum allowed number of allocated buffers - uint32_t bufs_limit; -} lzma_outq; - - -/** - * \brief Calculate the memory usage of an output queue - * - * \return Approximate memory usage in bytes or UINT64_MAX on error. - */ -extern uint64_t lzma_outq_memusage(uint64_t buf_size_max, uint32_t threads); - - -/// \brief Initialize an output queue -/// -/// \param outq Pointer to an output queue. Before calling -/// this function the first time, *outq should -/// have been zeroed with memzero() so that this -/// function knows that there are no previous -/// allocations to free. -/// \param allocator Pointer to allocator or NULL -/// \param threads Number of buffers that may be in use -/// concurrently. Note that more than this number -/// of buffers may actually get allocated to -/// improve performance when buffers finish -/// out of order. The actual maximum number of -/// allocated buffers is derived from the number -/// of threads. -/// -/// \return - LZMA_OK -/// - LZMA_MEM_ERROR -/// -extern lzma_ret lzma_outq_init(lzma_outq *outq, - const lzma_allocator *allocator, uint32_t threads); - - -/// \brief Free the memory associated with the output queue -extern void lzma_outq_end(lzma_outq *outq, const lzma_allocator *allocator); - - -/// \brief Free all cached buffers that consume memory but aren't in use -extern void lzma_outq_clear_cache( - lzma_outq *outq, const lzma_allocator *allocator); - - -/// \brief Like lzma_outq_clear_cache() but might keep one buffer -/// -/// One buffer is not freed if its size is equal to keep_size. -/// This is useful if the caller knows that it will soon need a buffer of -/// keep_size bytes. This way it won't be freed and immediately reallocated. -extern void lzma_outq_clear_cache2( - lzma_outq *outq, const lzma_allocator *allocator, - size_t keep_size); - - -/// \brief Preallocate a new buffer into cache -/// -/// Splitting the buffer allocation into a separate function makes it -/// possible to ensure that way lzma_outq_get_buf() cannot fail. -/// If the preallocated buffer isn't actually used (for example, some -/// other error occurs), the caller has to do nothing as the buffer will -/// be used later or cleared from the cache when not needed. -/// -/// \return LZMA_OK on success, LZMA_MEM_ERROR if allocation fails -/// -extern lzma_ret lzma_outq_prealloc_buf( - lzma_outq *outq, const lzma_allocator *allocator, size_t size); - - -/// \brief Get a new buffer -/// -/// lzma_outq_prealloc_buf() must be used to ensure that there is a buffer -/// available before calling lzma_outq_get_buf(). -/// -extern lzma_outbuf *lzma_outq_get_buf(lzma_outq *outq, void *worker); - - -/// \brief Test if there is data ready to be read -/// -/// Call to this function must be protected with the same mutex that -/// is used to protect lzma_outbuf.finished. -/// -extern bool lzma_outq_is_readable(const lzma_outq *outq); - - -/// \brief Read finished data -/// -/// \param outq Pointer to an output queue -/// \param out Beginning of the output buffer -/// \param out_pos The next byte will be written to -/// out[*out_pos]. -/// \param out_size Size of the out buffer; the first byte into -/// which no data is written to is out[out_size]. -/// \param unpadded_size Unpadded Size from the Block encoder -/// \param uncompressed_size Uncompressed Size from the Block encoder -/// -/// \return - LZMA: All OK. Either no data was available or the buffer -/// being read didn't become empty yet. -/// - LZMA_STREAM_END: The buffer being read was finished. -/// *unpadded_size and *uncompressed_size were set if they -/// were not NULL. -/// -/// \note This reads lzma_outbuf.finished and .pos variables and thus -/// calls to this function need to be protected with a mutex. -/// -extern lzma_ret lzma_outq_read(lzma_outq *restrict outq, - const lzma_allocator *restrict allocator, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, lzma_vli *restrict unpadded_size, - lzma_vli *restrict uncompressed_size); - - -/// \brief Enable partial output from a worker thread -/// -/// If the buffer at the head of the output queue isn't finished, -/// this will call enable_partial_output on the worker associated with -/// that output buffer. -/// -/// \note This reads a lzma_outbuf.finished variable and thus -/// calls to this function need to be protected with a mutex. -/// -extern void lzma_outq_enable_partial_output(lzma_outq *outq, - void (*enable_partial_output)(void *worker)); - - -/// \brief Test if there is at least one buffer free -/// -/// This must be used before getting a new buffer with lzma_outq_get_buf(). -/// -static inline bool -lzma_outq_has_buf(const lzma_outq *outq) -{ - return outq->bufs_in_use < outq->bufs_limit; -} - - -/// \brief Test if the queue is completely empty -static inline bool -lzma_outq_is_empty(const lzma_outq *outq) -{ - return outq->bufs_in_use == 0; -} - - -/// \brief Get the amount of memory needed for a single lzma_outbuf -/// -/// \note Caller must check that the argument is significantly less -/// than SIZE_MAX to avoid an integer overflow! -static inline uint64_t -lzma_outq_outbuf_memusage(size_t buf_size) -{ - assert(buf_size <= SIZE_MAX - sizeof(lzma_outbuf)); - return sizeof(lzma_outbuf) + buf_size; -} - -#endif diff --git a/software/src/xz/src/liblzma/common/stream_buffer_decoder.c b/software/src/xz/src/liblzma/common/stream_buffer_decoder.c deleted file mode 100644 index c4f91fb..0000000 --- a/software/src/xz/src/liblzma/common/stream_buffer_decoder.c +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_buffer_decoder.c -/// \brief Single-call .xz Stream decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_decoder.h" - - -extern LZMA_API(lzma_ret) -lzma_stream_buffer_decode(uint64_t *memlimit, uint32_t flags, - const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - // Sanity checks - if (in_pos == NULL || (in == NULL && *in_pos != in_size) - || *in_pos > in_size || out_pos == NULL - || (out == NULL && *out_pos != out_size) - || *out_pos > out_size) - return LZMA_PROG_ERROR; - - // Catch flags that are not allowed in buffer-to-buffer decoding. - if (flags & LZMA_TELL_ANY_CHECK) - return LZMA_PROG_ERROR; - - // Initialize the Stream decoder. - // TODO: We need something to tell the decoder that it can use the - // output buffer as workspace, and thus save significant amount of RAM. - lzma_next_coder stream_decoder = LZMA_NEXT_CODER_INIT; - lzma_ret ret = lzma_stream_decoder_init( - &stream_decoder, allocator, *memlimit, flags); - - if (ret == LZMA_OK) { - // Save the positions so that we can restore them in case - // an error occurs. - const size_t in_start = *in_pos; - const size_t out_start = *out_pos; - - // Do the actual decoding. - ret = stream_decoder.code(stream_decoder.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - LZMA_FINISH); - - if (ret == LZMA_STREAM_END) { - ret = LZMA_OK; - } else { - // Something went wrong, restore the positions. - *in_pos = in_start; - *out_pos = out_start; - - if (ret == LZMA_OK) { - // Either the input was truncated or the - // output buffer was too small. - assert(*in_pos == in_size - || *out_pos == out_size); - - // If all the input was consumed, then the - // input is truncated, even if the output - // buffer is also full. This is because - // processing the last byte of the Stream - // never produces output. - if (*in_pos == in_size) - ret = LZMA_DATA_ERROR; - else - ret = LZMA_BUF_ERROR; - - } else if (ret == LZMA_MEMLIMIT_ERROR) { - // Let the caller know how much memory would - // have been needed. - uint64_t memusage; - (void)stream_decoder.memconfig( - stream_decoder.coder, - memlimit, &memusage, 0); - } - } - } - - // Free the decoder memory. This needs to be done even if - // initialization fails, because the internal API doesn't - // require the initialization function to free its memory on error. - lzma_next_end(&stream_decoder, allocator); - - return ret; -} diff --git a/software/src/xz/src/liblzma/common/stream_buffer_encoder.c b/software/src/xz/src/liblzma/common/stream_buffer_encoder.c deleted file mode 100644 index 04d5869..0000000 --- a/software/src/xz/src/liblzma/common/stream_buffer_encoder.c +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_buffer_encoder.c -/// \brief Single-call .xz Stream encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "index.h" - - -/// Maximum size of Index that has exactly one Record. -/// Index Indicator + Number of Records + Record + CRC32 rounded up to -/// the next multiple of four. -#define INDEX_BOUND ((1 + 1 + 2 * LZMA_VLI_BYTES_MAX + 4 + 3) & ~3) - -/// Stream Header, Stream Footer, and Index -#define HEADERS_BOUND (2 * LZMA_STREAM_HEADER_SIZE + INDEX_BOUND) - - -extern LZMA_API(size_t) -lzma_stream_buffer_bound(size_t uncompressed_size) -{ - // Get the maximum possible size of a Block. - const size_t block_bound = lzma_block_buffer_bound(uncompressed_size); - if (block_bound == 0) - return 0; - - // Catch the possible integer overflow and also prevent the size of - // the Stream exceeding LZMA_VLI_MAX (theoretically possible on - // 64-bit systems). - if (my_min(SIZE_MAX, LZMA_VLI_MAX) - block_bound < HEADERS_BOUND) - return 0; - - return block_bound + HEADERS_BOUND; -} - - -extern LZMA_API(lzma_ret) -lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check, - const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos_ptr, size_t out_size) -{ - // Sanity checks - if (filters == NULL || (unsigned int)(check) > LZMA_CHECK_ID_MAX - || (in == NULL && in_size != 0) || out == NULL - || out_pos_ptr == NULL || *out_pos_ptr > out_size) - return LZMA_PROG_ERROR; - - if (!lzma_check_is_supported(check)) - return LZMA_UNSUPPORTED_CHECK; - - // Note for the paranoids: Index encoder prevents the Stream from - // getting too big and still being accepted with LZMA_OK, and Block - // encoder catches if the input is too big. So we don't need to - // separately check if the buffers are too big. - - // Use a local copy. We update *out_pos_ptr only if everything - // succeeds. - size_t out_pos = *out_pos_ptr; - - // Check that there's enough space for both Stream Header and - // Stream Footer. - if (out_size - out_pos <= 2 * LZMA_STREAM_HEADER_SIZE) - return LZMA_BUF_ERROR; - - // Reserve space for Stream Footer so we don't need to check for - // available space again before encoding Stream Footer. - out_size -= LZMA_STREAM_HEADER_SIZE; - - // Encode the Stream Header. - lzma_stream_flags stream_flags = { - .version = 0, - .check = check, - }; - - if (lzma_stream_header_encode(&stream_flags, out + out_pos) - != LZMA_OK) - return LZMA_PROG_ERROR; - - out_pos += LZMA_STREAM_HEADER_SIZE; - - // Encode a Block but only if there is at least one byte of input. - lzma_block block = { - .version = 0, - .check = check, - .filters = filters, - }; - - if (in_size > 0) - return_if_error(lzma_block_buffer_encode(&block, allocator, - in, in_size, out, &out_pos, out_size)); - - // Index - { - // Create an Index. It will have one Record if there was - // at least one byte of input to encode. Otherwise the - // Index will be empty. - lzma_index *i = lzma_index_init(allocator); - if (i == NULL) - return LZMA_MEM_ERROR; - - lzma_ret ret = LZMA_OK; - - if (in_size > 0) - ret = lzma_index_append(i, allocator, - lzma_block_unpadded_size(&block), - block.uncompressed_size); - - // If adding the Record was successful, encode the Index - // and get its size which will be stored into Stream Footer. - if (ret == LZMA_OK) { - ret = lzma_index_buffer_encode( - i, out, &out_pos, out_size); - - stream_flags.backward_size = lzma_index_size(i); - } - - lzma_index_end(i, allocator); - - if (ret != LZMA_OK) - return ret; - } - - // Stream Footer. We have already reserved space for this. - if (lzma_stream_footer_encode(&stream_flags, out + out_pos) - != LZMA_OK) - return LZMA_PROG_ERROR; - - out_pos += LZMA_STREAM_HEADER_SIZE; - - // Everything went fine, make the new output position available - // to the application. - *out_pos_ptr = out_pos; - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_decoder.c b/software/src/xz/src/liblzma/common/stream_decoder.c deleted file mode 100644 index 94004b7..0000000 --- a/software/src/xz/src/liblzma/common/stream_decoder.c +++ /dev/null @@ -1,469 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_decoder.c -/// \brief Decodes .xz Streams -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_decoder.h" -#include "block_decoder.h" -#include "index.h" - - -typedef struct { - enum { - SEQ_STREAM_HEADER, - SEQ_BLOCK_HEADER, - SEQ_BLOCK_INIT, - SEQ_BLOCK_RUN, - SEQ_INDEX, - SEQ_STREAM_FOOTER, - SEQ_STREAM_PADDING, - } sequence; - - /// Block decoder - lzma_next_coder block_decoder; - - /// Block options decoded by the Block Header decoder and used by - /// the Block decoder. - lzma_block block_options; - - /// Stream Flags from Stream Header - lzma_stream_flags stream_flags; - - /// Index is hashed so that it can be compared to the sizes of Blocks - /// with O(1) memory usage. - lzma_index_hash *index_hash; - - /// Memory usage limit - uint64_t memlimit; - - /// Amount of memory actually needed (only an estimate) - uint64_t memusage; - - /// If true, LZMA_NO_CHECK is returned if the Stream has - /// no integrity check. - bool tell_no_check; - - /// If true, LZMA_UNSUPPORTED_CHECK is returned if the Stream has - /// an integrity check that isn't supported by this liblzma build. - bool tell_unsupported_check; - - /// If true, LZMA_GET_CHECK is returned after decoding Stream Header. - bool tell_any_check; - - /// If true, we will tell the Block decoder to skip calculating - /// and verifying the integrity check. - bool ignore_check; - - /// If true, we will decode concatenated Streams that possibly have - /// Stream Padding between or after them. LZMA_STREAM_END is returned - /// once the application isn't giving us any new input (LZMA_FINISH), - /// and we aren't in the middle of a Stream, and possible - /// Stream Padding is a multiple of four bytes. - bool concatenated; - - /// When decoding concatenated Streams, this is true as long as we - /// are decoding the first Stream. This is needed to avoid misleading - /// LZMA_FORMAT_ERROR in case the later Streams don't have valid magic - /// bytes. - bool first_stream; - - /// Write position in buffer[] and position in Stream Padding - size_t pos; - - /// Buffer to hold Stream Header, Block Header, and Stream Footer. - /// Block Header has biggest maximum size. - uint8_t buffer[LZMA_BLOCK_HEADER_SIZE_MAX]; -} lzma_stream_coder; - - -static lzma_ret -stream_decoder_reset(lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - // Initialize the Index hash used to verify the Index. - coder->index_hash = lzma_index_hash_init(coder->index_hash, allocator); - if (coder->index_hash == NULL) - return LZMA_MEM_ERROR; - - // Reset the rest of the variables. - coder->sequence = SEQ_STREAM_HEADER; - coder->pos = 0; - - return LZMA_OK; -} - - -static lzma_ret -stream_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_stream_coder *coder = coder_ptr; - - // When decoding the actual Block, it may be able to produce more - // output even if we don't give it any new input. - while (true) - switch (coder->sequence) { - case SEQ_STREAM_HEADER: { - // Copy the Stream Header to the internal buffer. - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - LZMA_STREAM_HEADER_SIZE); - - // Return if we didn't get the whole Stream Header yet. - if (coder->pos < LZMA_STREAM_HEADER_SIZE) - return LZMA_OK; - - coder->pos = 0; - - // Decode the Stream Header. - const lzma_ret ret = lzma_stream_header_decode( - &coder->stream_flags, coder->buffer); - if (ret != LZMA_OK) - return ret == LZMA_FORMAT_ERROR && !coder->first_stream - ? LZMA_DATA_ERROR : ret; - - // If we are decoding concatenated Streams, and the later - // Streams have invalid Header Magic Bytes, we give - // LZMA_DATA_ERROR instead of LZMA_FORMAT_ERROR. - coder->first_stream = false; - - // Copy the type of the Check so that Block Header and Block - // decoders see it. - coder->block_options.check = coder->stream_flags.check; - - // Even if we return LZMA_*_CHECK below, we want - // to continue from Block Header decoding. - coder->sequence = SEQ_BLOCK_HEADER; - - // Detect if there's no integrity check or if it is - // unsupported if those were requested by the application. - if (coder->tell_no_check && coder->stream_flags.check - == LZMA_CHECK_NONE) - return LZMA_NO_CHECK; - - if (coder->tell_unsupported_check - && !lzma_check_is_supported( - coder->stream_flags.check)) - return LZMA_UNSUPPORTED_CHECK; - - if (coder->tell_any_check) - return LZMA_GET_CHECK; - - FALLTHROUGH; - } - - case SEQ_BLOCK_HEADER: { - if (*in_pos >= in_size) - return LZMA_OK; - - if (coder->pos == 0) { - // Detect if it's Index. - if (in[*in_pos] == INDEX_INDICATOR) { - coder->sequence = SEQ_INDEX; - break; - } - - // Calculate the size of the Block Header. Note that - // Block Header decoder wants to see this byte too - // so don't advance *in_pos. - coder->block_options.header_size - = lzma_block_header_size_decode( - in[*in_pos]); - } - - // Copy the Block Header to the internal buffer. - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - coder->block_options.header_size); - - // Return if we didn't get the whole Block Header yet. - if (coder->pos < coder->block_options.header_size) - return LZMA_OK; - - coder->pos = 0; - coder->sequence = SEQ_BLOCK_INIT; - FALLTHROUGH; - } - - case SEQ_BLOCK_INIT: { - // Checking memusage and doing the initialization needs - // its own sequence point because we need to be able to - // retry if we return LZMA_MEMLIMIT_ERROR. - - // Version 1 is needed to support the .ignore_check option. - coder->block_options.version = 1; - - // Set up a buffer to hold the filter chain. Block Header - // decoder will initialize all members of this array so - // we don't need to do it here. - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - coder->block_options.filters = filters; - - // Decode the Block Header. - return_if_error(lzma_block_header_decode(&coder->block_options, - allocator, coder->buffer)); - - // If LZMA_IGNORE_CHECK was used, this flag needs to be set. - // It has to be set after lzma_block_header_decode() because - // it always resets this to false. - coder->block_options.ignore_check = coder->ignore_check; - - // Check the memory usage limit. - const uint64_t memusage = lzma_raw_decoder_memusage(filters); - lzma_ret ret; - - if (memusage == UINT64_MAX) { - // One or more unknown Filter IDs. - ret = LZMA_OPTIONS_ERROR; - } else { - // Now we can set coder->memusage since we know that - // the filter chain is valid. We don't want - // lzma_memusage() to return UINT64_MAX in case of - // invalid filter chain. - coder->memusage = memusage; - - if (memusage > coder->memlimit) { - // The chain would need too much memory. - ret = LZMA_MEMLIMIT_ERROR; - } else { - // Memory usage is OK. - // Initialize the Block decoder. - ret = lzma_block_decoder_init( - &coder->block_decoder, - allocator, - &coder->block_options); - } - } - - // Free the allocated filter options since they are needed - // only to initialize the Block decoder. - lzma_filters_free(filters, allocator); - coder->block_options.filters = NULL; - - // Check if memory usage calculation and Block decoder - // initialization succeeded. - if (ret != LZMA_OK) - return ret; - - coder->sequence = SEQ_BLOCK_RUN; - FALLTHROUGH; - } - - case SEQ_BLOCK_RUN: { - const lzma_ret ret = coder->block_decoder.code( - coder->block_decoder.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - action); - - if (ret != LZMA_STREAM_END) - return ret; - - // Block decoded successfully. Add the new size pair to - // the Index hash. - return_if_error(lzma_index_hash_append(coder->index_hash, - lzma_block_unpadded_size( - &coder->block_options), - coder->block_options.uncompressed_size)); - - coder->sequence = SEQ_BLOCK_HEADER; - break; - } - - case SEQ_INDEX: { - // If we don't have any input, don't call - // lzma_index_hash_decode() since it would return - // LZMA_BUF_ERROR, which we must not do here. - if (*in_pos >= in_size) - return LZMA_OK; - - // Decode the Index and compare it to the hash calculated - // from the sizes of the Blocks (if any). - const lzma_ret ret = lzma_index_hash_decode(coder->index_hash, - in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - return ret; - - coder->sequence = SEQ_STREAM_FOOTER; - FALLTHROUGH; - } - - case SEQ_STREAM_FOOTER: { - // Copy the Stream Footer to the internal buffer. - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - LZMA_STREAM_HEADER_SIZE); - - // Return if we didn't get the whole Stream Footer yet. - if (coder->pos < LZMA_STREAM_HEADER_SIZE) - return LZMA_OK; - - coder->pos = 0; - - // Decode the Stream Footer. The decoder gives - // LZMA_FORMAT_ERROR if the magic bytes don't match, - // so convert that return code to LZMA_DATA_ERROR. - lzma_stream_flags footer_flags; - const lzma_ret ret = lzma_stream_footer_decode( - &footer_flags, coder->buffer); - if (ret != LZMA_OK) - return ret == LZMA_FORMAT_ERROR - ? LZMA_DATA_ERROR : ret; - - // Check that Index Size stored in the Stream Footer matches - // the real size of the Index field. - if (lzma_index_hash_size(coder->index_hash) - != footer_flags.backward_size) - return LZMA_DATA_ERROR; - - // Compare that the Stream Flags fields are identical in - // both Stream Header and Stream Footer. - return_if_error(lzma_stream_flags_compare( - &coder->stream_flags, &footer_flags)); - - if (!coder->concatenated) - return LZMA_STREAM_END; - - coder->sequence = SEQ_STREAM_PADDING; - FALLTHROUGH; - } - - case SEQ_STREAM_PADDING: - assert(coder->concatenated); - - // Skip over possible Stream Padding. - while (true) { - if (*in_pos >= in_size) { - // Unless LZMA_FINISH was used, we cannot - // know if there's more input coming later. - if (action != LZMA_FINISH) - return LZMA_OK; - - // Stream Padding must be a multiple of - // four bytes. - return coder->pos == 0 - ? LZMA_STREAM_END - : LZMA_DATA_ERROR; - } - - // If the byte is not zero, it probably indicates - // beginning of a new Stream (or the file is corrupt). - if (in[*in_pos] != 0x00) - break; - - ++*in_pos; - coder->pos = (coder->pos + 1) & 3; - } - - // Stream Padding must be a multiple of four bytes (empty - // Stream Padding is OK). - if (coder->pos != 0) { - ++*in_pos; - return LZMA_DATA_ERROR; - } - - // Prepare to decode the next Stream. - return_if_error(stream_decoder_reset(coder, allocator)); - break; - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - // Never reached -} - - -static void -stream_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_stream_coder *coder = coder_ptr; - lzma_next_end(&coder->block_decoder, allocator); - lzma_index_hash_end(coder->index_hash, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_check -stream_decoder_get_check(const void *coder_ptr) -{ - const lzma_stream_coder *coder = coder_ptr; - return coder->stream_flags.check; -} - - -static lzma_ret -stream_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_stream_coder *coder = coder_ptr; - - *memusage = coder->memusage; - *old_memlimit = coder->memlimit; - - if (new_memlimit != 0) { - if (new_memlimit < coder->memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -extern lzma_ret -lzma_stream_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, uint32_t flags) -{ - lzma_next_coder_init(&lzma_stream_decoder_init, next, allocator); - - if (flags & ~LZMA_SUPPORTED_FLAGS) - return LZMA_OPTIONS_ERROR; - - lzma_stream_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_stream_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &stream_decode; - next->end = &stream_decoder_end; - next->get_check = &stream_decoder_get_check; - next->memconfig = &stream_decoder_memconfig; - - coder->block_decoder = LZMA_NEXT_CODER_INIT; - coder->index_hash = NULL; - } - - coder->memlimit = my_max(1, memlimit); - coder->memusage = LZMA_MEMUSAGE_BASE; - coder->tell_no_check = (flags & LZMA_TELL_NO_CHECK) != 0; - coder->tell_unsupported_check - = (flags & LZMA_TELL_UNSUPPORTED_CHECK) != 0; - coder->tell_any_check = (flags & LZMA_TELL_ANY_CHECK) != 0; - coder->ignore_check = (flags & LZMA_IGNORE_CHECK) != 0; - coder->concatenated = (flags & LZMA_CONCATENATED) != 0; - coder->first_stream = true; - - return stream_decoder_reset(coder, allocator); -} - - -extern LZMA_API(lzma_ret) -lzma_stream_decoder(lzma_stream *strm, uint64_t memlimit, uint32_t flags) -{ - lzma_next_strm_init(lzma_stream_decoder_init, strm, memlimit, flags); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_decoder.h b/software/src/xz/src/liblzma/common/stream_decoder.h deleted file mode 100644 index 5803715..0000000 --- a/software/src/xz/src/liblzma/common/stream_decoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_decoder.h -/// \brief Decodes .xz Streams -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_STREAM_DECODER_H -#define LZMA_STREAM_DECODER_H - -#include "common.h" - -extern lzma_ret lzma_stream_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, uint32_t flags); - -#endif diff --git a/software/src/xz/src/liblzma/common/stream_decoder_mt.c b/software/src/xz/src/liblzma/common/stream_decoder_mt.c deleted file mode 100644 index 271f9b0..0000000 --- a/software/src/xz/src/liblzma/common/stream_decoder_mt.c +++ /dev/null @@ -1,2015 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_decoder_mt.c -/// \brief Multithreaded .xz Stream decoder -// -// Authors: Sebastian Andrzej Siewior -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "block_decoder.h" -#include "stream_decoder.h" -#include "index.h" -#include "outqueue.h" - - -typedef enum { - /// Waiting for work. - /// Main thread may change this to THR_RUN or THR_EXIT. - THR_IDLE, - - /// Decoding is in progress. - /// Main thread may change this to THR_IDLE or THR_EXIT. - /// The worker thread may change this to THR_IDLE. - THR_RUN, - - /// The main thread wants the thread to exit. - THR_EXIT, - -} worker_state; - - -typedef enum { - /// Partial updates (storing of worker thread progress - /// to lzma_outbuf) are disabled. - PARTIAL_DISABLED, - - /// Main thread requests partial updates to be enabled but - /// no partial update has been done by the worker thread yet. - /// - /// Changing from PARTIAL_DISABLED to PARTIAL_START requires - /// use of the worker-thread mutex. Other transitions don't - /// need a mutex. - PARTIAL_START, - - /// Partial updates are enabled and the worker thread has done - /// at least one partial update. - PARTIAL_ENABLED, - -} partial_update_mode; - - -struct worker_thread { - /// Worker state is protected with our mutex. - worker_state state; - - /// Input buffer that will contain the whole Block except Block Header. - uint8_t *in; - - /// Amount of memory allocated for "in" - size_t in_size; - - /// Number of bytes written to "in" by the main thread - size_t in_filled; - - /// Number of bytes consumed from "in" by the worker thread. - size_t in_pos; - - /// Amount of uncompressed data that has been decoded. This local - /// copy is needed because updating outbuf->pos requires locking - /// the main mutex (coder->mutex). - size_t out_pos; - - /// Pointer to the main structure is needed to (1) lock the main - /// mutex (coder->mutex) when updating outbuf->pos and (2) when - /// putting this thread back to the stack of free threads. - struct lzma_stream_coder *coder; - - /// The allocator is set by the main thread. Since a copy of the - /// pointer is kept here, the application must not change the - /// allocator before calling lzma_end(). - const lzma_allocator *allocator; - - /// Output queue buffer to which the uncompressed data is written. - lzma_outbuf *outbuf; - - /// Amount of compressed data that has already been decompressed. - /// This is updated from in_pos when our mutex is locked. - /// This is size_t, not uint64_t, because per-thread progress - /// is limited to sizes of allocated buffers. - size_t progress_in; - - /// Like progress_in but for uncompressed data. - size_t progress_out; - - /// Updating outbuf->pos requires locking the main mutex - /// (coder->mutex). Since the main thread will only read output - /// from the oldest outbuf in the queue, only the worker thread - /// that is associated with the oldest outbuf needs to update its - /// outbuf->pos. This avoids useless mutex contention that would - /// happen if all worker threads were frequently locking the main - /// mutex to update their outbuf->pos. - /// - /// Only when partial_update is something else than PARTIAL_DISABLED, - /// this worker thread will update outbuf->pos after each call to - /// the Block decoder. - partial_update_mode partial_update; - - /// Block decoder - lzma_next_coder block_decoder; - - /// Thread-specific Block options are needed because the Block - /// decoder modifies the struct given to it at initialization. - lzma_block block_options; - - /// Filter chain memory usage - uint64_t mem_filters; - - /// Next structure in the stack of free worker threads. - struct worker_thread *next; - - mythread_mutex mutex; - mythread_cond cond; - - /// The ID of this thread is used to join the thread - /// when it's not needed anymore. - mythread thread_id; -}; - - -struct lzma_stream_coder { - enum { - SEQ_STREAM_HEADER, - SEQ_BLOCK_HEADER, - SEQ_BLOCK_INIT, - SEQ_BLOCK_THR_INIT, - SEQ_BLOCK_THR_RUN, - SEQ_BLOCK_DIRECT_INIT, - SEQ_BLOCK_DIRECT_RUN, - SEQ_INDEX_WAIT_OUTPUT, - SEQ_INDEX_DECODE, - SEQ_STREAM_FOOTER, - SEQ_STREAM_PADDING, - SEQ_ERROR, - } sequence; - - /// Block decoder - lzma_next_coder block_decoder; - - /// Every Block Header will be decoded into this structure. - /// This is also used to initialize a Block decoder when in - /// direct mode. In threaded mode, a thread-specific copy will - /// be made for decoder initialization because the Block decoder - /// will modify the structure given to it. - lzma_block block_options; - - /// Buffer to hold a filter chain for Block Header decoding and - /// initialization. These are freed after successful Block decoder - /// initialization or at stream_decoder_mt_end(). The thread-specific - /// copy of block_options won't hold a pointer to filters[] after - /// initialization. - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - - /// Stream Flags from Stream Header - lzma_stream_flags stream_flags; - - /// Index is hashed so that it can be compared to the sizes of Blocks - /// with O(1) memory usage. - lzma_index_hash *index_hash; - - - /// Maximum wait time if cannot use all the input and cannot - /// fill the output buffer. This is in milliseconds. - uint32_t timeout; - - - /// Error code from a worker thread. - /// - /// \note Use mutex. - lzma_ret thread_error; - - /// Error code to return after pending output has been copied out. If - /// set in read_output_and_wait(), this is a mirror of thread_error. - /// If set in stream_decode_mt() then it's, for example, error that - /// occurred when decoding Block Header. - lzma_ret pending_error; - - /// Number of threads that will be created at maximum. - uint32_t threads_max; - - /// Number of thread structures that have been initialized from - /// "threads", and thus the number of worker threads actually - /// created so far. - uint32_t threads_initialized; - - /// Array of allocated thread-specific structures. When no threads - /// are in use (direct mode) this is NULL. In threaded mode this - /// points to an array of threads_max number of worker_thread structs. - struct worker_thread *threads; - - /// Stack of free threads. When a thread finishes, it puts itself - /// back into this stack. This starts as empty because threads - /// are created only when actually needed. - /// - /// \note Use mutex. - struct worker_thread *threads_free; - - /// The most recent worker thread to which the main thread writes - /// the new input from the application. - struct worker_thread *thr; - - /// Output buffer queue for decompressed data from the worker threads - /// - /// \note Use mutex with operations that need it. - lzma_outq outq; - - mythread_mutex mutex; - mythread_cond cond; - - - /// Memory usage that will not be exceeded in multi-threaded mode. - /// Single-threaded mode can exceed this even by a large amount. - uint64_t memlimit_threading; - - /// Memory usage limit that should never be exceeded. - /// LZMA_MEMLIMIT_ERROR will be returned if decoding isn't possible - /// even in single-threaded mode without exceeding this limit. - uint64_t memlimit_stop; - - /// Amount of memory in use by the direct mode decoder - /// (coder->block_decoder). In threaded mode this is 0. - uint64_t mem_direct_mode; - - /// Amount of memory needed by the running worker threads. - /// This doesn't include the memory needed by the output buffer. - /// - /// \note Use mutex. - uint64_t mem_in_use; - - /// Amount of memory used by the idle (cached) threads. - /// - /// \note Use mutex. - uint64_t mem_cached; - - - /// Amount of memory needed for the filter chain of the next Block. - uint64_t mem_next_filters; - - /// Amount of memory needed for the thread-specific input buffer - /// for the next Block. - uint64_t mem_next_in; - - /// Amount of memory actually needed to decode the next Block - /// in threaded mode. This is - /// mem_next_filters + mem_next_in + memory needed for lzma_outbuf. - uint64_t mem_next_block; - - - /// Amount of compressed data in Stream Header + Blocks that have - /// already been finished. - /// - /// \note Use mutex. - uint64_t progress_in; - - /// Amount of uncompressed data in Blocks that have already - /// been finished. - /// - /// \note Use mutex. - uint64_t progress_out; - - - /// If true, LZMA_NO_CHECK is returned if the Stream has - /// no integrity check. - bool tell_no_check; - - /// If true, LZMA_UNSUPPORTED_CHECK is returned if the Stream has - /// an integrity check that isn't supported by this liblzma build. - bool tell_unsupported_check; - - /// If true, LZMA_GET_CHECK is returned after decoding Stream Header. - bool tell_any_check; - - /// If true, we will tell the Block decoder to skip calculating - /// and verifying the integrity check. - bool ignore_check; - - /// If true, we will decode concatenated Streams that possibly have - /// Stream Padding between or after them. LZMA_STREAM_END is returned - /// once the application isn't giving us any new input (LZMA_FINISH), - /// and we aren't in the middle of a Stream, and possible - /// Stream Padding is a multiple of four bytes. - bool concatenated; - - /// If true, we will return any errors immediately instead of first - /// producing all output before the location of the error. - bool fail_fast; - - - /// When decoding concatenated Streams, this is true as long as we - /// are decoding the first Stream. This is needed to avoid misleading - /// LZMA_FORMAT_ERROR in case the later Streams don't have valid magic - /// bytes. - bool first_stream; - - /// This is used to track if the previous call to stream_decode_mt() - /// had output space (*out_pos < out_size) and managed to fill the - /// output buffer (*out_pos == out_size). This may be set to true - /// in read_output_and_wait(). This is read and then reset to false - /// at the beginning of stream_decode_mt(). - /// - /// This is needed to support applications that call lzma_code() in - /// such a way that more input is provided only when lzma_code() - /// didn't fill the output buffer completely. Basically, this makes - /// it easier to convert such applications from single-threaded - /// decoder to multi-threaded decoder. - bool out_was_filled; - - /// Write position in buffer[] and position in Stream Padding - size_t pos; - - /// Buffer to hold Stream Header, Block Header, and Stream Footer. - /// Block Header has biggest maximum size. - uint8_t buffer[LZMA_BLOCK_HEADER_SIZE_MAX]; -}; - - -/// Enables updating of outbuf->pos. This is a callback function that is -/// used with lzma_outq_enable_partial_output(). -static void -worker_enable_partial_update(void *thr_ptr) -{ - struct worker_thread *thr = thr_ptr; - - mythread_sync(thr->mutex) { - thr->partial_update = PARTIAL_START; - mythread_cond_signal(&thr->cond); - } -} - - -static MYTHREAD_RET_TYPE -worker_decoder(void *thr_ptr) -{ - struct worker_thread *thr = thr_ptr; - size_t in_filled; - partial_update_mode partial_update; - lzma_ret ret; - -next_loop_lock: - - mythread_mutex_lock(&thr->mutex); -next_loop_unlocked: - - if (thr->state == THR_IDLE) { - mythread_cond_wait(&thr->cond, &thr->mutex); - goto next_loop_unlocked; - } - - if (thr->state == THR_EXIT) { - mythread_mutex_unlock(&thr->mutex); - - lzma_free(thr->in, thr->allocator); - lzma_next_end(&thr->block_decoder, thr->allocator); - - mythread_mutex_destroy(&thr->mutex); - mythread_cond_destroy(&thr->cond); - - return MYTHREAD_RET_VALUE; - } - - assert(thr->state == THR_RUN); - - // Update progress info for get_progress(). - thr->progress_in = thr->in_pos; - thr->progress_out = thr->out_pos; - - // If we don't have any new input, wait for a signal from the main - // thread except if partial output has just been enabled. In that - // case we will do one normal run so that the partial output info - // gets passed to the main thread. The call to block_decoder.code() - // is useless but harmless as it can occur only once per Block. - in_filled = thr->in_filled; - partial_update = thr->partial_update; - - if (in_filled == thr->in_pos && partial_update != PARTIAL_START) { - mythread_cond_wait(&thr->cond, &thr->mutex); - goto next_loop_unlocked; - } - - mythread_mutex_unlock(&thr->mutex); - - // Pass the input in small chunks to the Block decoder. - // This way we react reasonably fast if we are told to stop/exit, - // and (when partial update is enabled) we tell about our progress - // to the main thread frequently enough. - const size_t chunk_size = 16384; - if ((in_filled - thr->in_pos) > chunk_size) - in_filled = thr->in_pos + chunk_size; - - ret = thr->block_decoder.code( - thr->block_decoder.coder, thr->allocator, - thr->in, &thr->in_pos, in_filled, - thr->outbuf->buf, &thr->out_pos, - thr->outbuf->allocated, LZMA_RUN); - - if (ret == LZMA_OK) { - if (partial_update != PARTIAL_DISABLED) { - // The main thread uses thr->mutex to change from - // PARTIAL_DISABLED to PARTIAL_START. The main thread - // doesn't care about this variable after that so we - // can safely change it here to PARTIAL_ENABLED - // without a mutex. - thr->partial_update = PARTIAL_ENABLED; - - // The main thread is reading decompressed data - // from thr->outbuf. Tell the main thread about - // our progress. - // - // NOTE: It's possible that we consumed input without - // producing any new output so it's possible that - // only in_pos has changed. In case of PARTIAL_START - // it is possible that neither in_pos nor out_pos has - // changed. - mythread_sync(thr->coder->mutex) { - thr->outbuf->pos = thr->out_pos; - thr->outbuf->decoder_in_pos = thr->in_pos; - mythread_cond_signal(&thr->coder->cond); - } - } - - goto next_loop_lock; - } - - // Either we finished successfully (LZMA_STREAM_END) or an error - // occurred. - // - // The sizes are in the Block Header and the Block decoder - // checks that they match, thus we know these: - assert(ret != LZMA_STREAM_END || thr->in_pos == thr->in_size); - assert(ret != LZMA_STREAM_END - || thr->out_pos == thr->block_options.uncompressed_size); - - mythread_sync(thr->mutex) { - // Block decoder ensures this, but do a sanity check anyway - // because thr->in_filled < thr->in_size means that the main - // thread is still writing to thr->in. - if (ret == LZMA_STREAM_END && thr->in_filled != thr->in_size) { - assert(0); - ret = LZMA_PROG_ERROR; - } - - if (thr->state != THR_EXIT) - thr->state = THR_IDLE; - } - - // Free the input buffer. Don't update in_size as we need - // it later to update thr->coder->mem_in_use. - // - // This step is skipped if an error occurred because the main thread - // might still be writing to thr->in. The memory will be freed after - // threads_end() sets thr->state = THR_EXIT. - if (ret == LZMA_STREAM_END) { - lzma_free(thr->in, thr->allocator); - thr->in = NULL; - } - - mythread_sync(thr->coder->mutex) { - // Move our progress info to the main thread. - thr->coder->progress_in += thr->in_pos; - thr->coder->progress_out += thr->out_pos; - thr->progress_in = 0; - thr->progress_out = 0; - - // Mark the outbuf as finished. - thr->outbuf->pos = thr->out_pos; - thr->outbuf->decoder_in_pos = thr->in_pos; - thr->outbuf->finished = true; - thr->outbuf->finish_ret = ret; - thr->outbuf = NULL; - - // If an error occurred, tell it to the main thread. - if (ret != LZMA_STREAM_END - && thr->coder->thread_error == LZMA_OK) - thr->coder->thread_error = ret; - - // Return the worker thread to the stack of available - // threads only if no errors occurred. - if (ret == LZMA_STREAM_END) { - // Update memory usage counters. - thr->coder->mem_in_use -= thr->in_size; - thr->coder->mem_in_use -= thr->mem_filters; - thr->coder->mem_cached += thr->mem_filters; - - // Put this thread to the stack of free threads. - thr->next = thr->coder->threads_free; - thr->coder->threads_free = thr; - } - - mythread_cond_signal(&thr->coder->cond); - } - - goto next_loop_lock; -} - - -/// Tells the worker threads to exit and waits for them to terminate. -static void -threads_end(struct lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - coder->threads[i].state = THR_EXIT; - mythread_cond_signal(&coder->threads[i].cond); - } - } - - for (uint32_t i = 0; i < coder->threads_initialized; ++i) - mythread_join(coder->threads[i].thread_id); - - lzma_free(coder->threads, allocator); - coder->threads_initialized = 0; - coder->threads = NULL; - coder->threads_free = NULL; - - // The threads don't update these when they exit. Do it here. - coder->mem_in_use = 0; - coder->mem_cached = 0; - - return; -} - - -/// Tell worker threads to stop without doing any cleaning up. -/// The clean up will be done when threads_exit() is called; -/// it's not possible to reuse the threads after threads_stop(). -/// -/// This is called before returning an unrecoverable error code -/// to the application. It would be waste of processor time -/// to keep the threads running in such a situation. -static void -threads_stop(struct lzma_stream_coder *coder) -{ - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - // The threads that are in the THR_RUN state will stop - // when they check the state the next time. There's no - // need to signal coder->threads[i].cond. - mythread_sync(coder->threads[i].mutex) { - coder->threads[i].state = THR_IDLE; - } - } - - return; -} - - -/// Initialize a new worker_thread structure and create a new thread. -static lzma_ret -initialize_new_thread(struct lzma_stream_coder *coder, - const lzma_allocator *allocator) -{ - // Allocate the coder->threads array if needed. It's done here instead - // of when initializing the decoder because we don't need this if we - // use the direct mode (we may even free coder->threads in the middle - // of the file if we switch from threaded to direct mode). - if (coder->threads == NULL) { - coder->threads = lzma_alloc( - coder->threads_max * sizeof(struct worker_thread), - allocator); - - if (coder->threads == NULL) - return LZMA_MEM_ERROR; - } - - // Pick a free structure. - assert(coder->threads_initialized < coder->threads_max); - struct worker_thread *thr - = &coder->threads[coder->threads_initialized]; - - if (mythread_mutex_init(&thr->mutex)) - goto error_mutex; - - if (mythread_cond_init(&thr->cond)) - goto error_cond; - - thr->state = THR_IDLE; - thr->in = NULL; - thr->in_size = 0; - thr->allocator = allocator; - thr->coder = coder; - thr->outbuf = NULL; - thr->block_decoder = LZMA_NEXT_CODER_INIT; - thr->mem_filters = 0; - - if (mythread_create(&thr->thread_id, worker_decoder, thr)) - goto error_thread; - - ++coder->threads_initialized; - coder->thr = thr; - - return LZMA_OK; - -error_thread: - mythread_cond_destroy(&thr->cond); - -error_cond: - mythread_mutex_destroy(&thr->mutex); - -error_mutex: - return LZMA_MEM_ERROR; -} - - -static lzma_ret -get_thread(struct lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - // If there is a free structure on the stack, use it. - mythread_sync(coder->mutex) { - if (coder->threads_free != NULL) { - coder->thr = coder->threads_free; - coder->threads_free = coder->threads_free->next; - - // The thread is no longer in the cache so subtract - // it from the cached memory usage. Don't add it - // to mem_in_use though; the caller will handle it - // since it knows how much memory it will actually - // use (the filter chain might change). - coder->mem_cached -= coder->thr->mem_filters; - } - } - - if (coder->thr == NULL) { - assert(coder->threads_initialized < coder->threads_max); - - // Initialize a new thread. - return_if_error(initialize_new_thread(coder, allocator)); - } - - coder->thr->in_filled = 0; - coder->thr->in_pos = 0; - coder->thr->out_pos = 0; - - coder->thr->progress_in = 0; - coder->thr->progress_out = 0; - - coder->thr->partial_update = PARTIAL_DISABLED; - - return LZMA_OK; -} - - -static lzma_ret -read_output_and_wait(struct lzma_stream_coder *coder, - const lzma_allocator *allocator, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, - bool *input_is_possible, - bool waiting_allowed, - mythread_condtime *wait_abs, bool *has_blocked) -{ - lzma_ret ret = LZMA_OK; - - mythread_sync(coder->mutex) { - do { - // Get as much output from the queue as is possible - // without blocking. - const size_t out_start = *out_pos; - do { - ret = lzma_outq_read(&coder->outq, allocator, - out, out_pos, out_size, - NULL, NULL); - - // If a Block was finished, tell the worker - // thread of the next Block (if it is still - // running) to start telling the main thread - // when new output is available. - if (ret == LZMA_STREAM_END) - lzma_outq_enable_partial_output( - &coder->outq, - &worker_enable_partial_update); - - // Loop until a Block wasn't finished. - // It's important to loop around even if - // *out_pos == out_size because there could - // be an empty Block that will return - // LZMA_STREAM_END without needing any - // output space. - } while (ret == LZMA_STREAM_END); - - // Check if lzma_outq_read reported an error from - // the Block decoder. - if (ret != LZMA_OK) - break; - - // If the output buffer is now full but it wasn't full - // when this function was called, set out_was_filled. - // This way the next call to stream_decode_mt() knows - // that some output was produced and no output space - // remained in the previous call to stream_decode_mt(). - if (*out_pos == out_size && *out_pos != out_start) - coder->out_was_filled = true; - - // Check if any thread has indicated an error. - if (coder->thread_error != LZMA_OK) { - // If LZMA_FAIL_FAST was used, report errors - // from worker threads immediately. - if (coder->fail_fast) { - ret = coder->thread_error; - break; - } - - // Otherwise set pending_error. The value we - // set here will not actually get used other - // than working as a flag that an error has - // occurred. This is because in SEQ_ERROR - // all output before the error will be read - // first by calling this function, and once we - // reach the location of the (first) error the - // error code from the above lzma_outq_read() - // will be returned to the application. - // - // Use LZMA_PROG_ERROR since the value should - // never leak to the application. It's - // possible that pending_error has already - // been set but that doesn't matter: if we get - // here, pending_error only works as a flag. - coder->pending_error = LZMA_PROG_ERROR; - } - - // Check if decoding of the next Block can be started. - // The memusage of the active threads must be low - // enough, there must be a free buffer slot in the - // output queue, and there must be a free thread - // (that can be either created or an existing one - // reused). - // - // NOTE: This is checked after reading the output - // above because reading the output can free a slot in - // the output queue and also reduce active memusage. - // - // NOTE: If output queue is empty, then input will - // always be possible. - if (input_is_possible != NULL - && coder->memlimit_threading - - coder->mem_in_use - - coder->outq.mem_in_use - >= coder->mem_next_block - && lzma_outq_has_buf(&coder->outq) - && (coder->threads_initialized - < coder->threads_max - || coder->threads_free - != NULL)) { - *input_is_possible = true; - break; - } - - // If the caller doesn't want us to block, return now. - if (!waiting_allowed) - break; - - // This check is needed only when input_is_possible - // is NULL. We must return if we aren't waiting for - // input to become possible and there is no more - // output coming from the queue. - if (lzma_outq_is_empty(&coder->outq)) { - assert(input_is_possible == NULL); - break; - } - - // If there is more data available from the queue, - // our out buffer must be full and we need to return - // so that the application can provide more output - // space. - // - // NOTE: In general lzma_outq_is_readable() can return - // true also when there are no more bytes available. - // This can happen when a Block has finished without - // providing any new output. We know that this is not - // the case because in the beginning of this loop we - // tried to read as much as possible even when we had - // no output space left and the mutex has been locked - // all the time (so worker threads cannot have changed - // anything). Thus there must be actual pending output - // in the queue. - if (lzma_outq_is_readable(&coder->outq)) { - assert(*out_pos == out_size); - break; - } - - // If the application stops providing more input - // in the middle of a Block, there will eventually - // be one worker thread left that is stuck waiting for - // more input (that might never arrive) and a matching - // outbuf which the worker thread cannot finish due - // to lack of input. We must detect this situation, - // otherwise we would end up waiting indefinitely - // (if no timeout is in use) or keep returning - // LZMA_TIMED_OUT while making no progress. Thus, the - // application would never get LZMA_BUF_ERROR from - // lzma_code() which would tell the application that - // no more progress is possible. No LZMA_BUF_ERROR - // means that, for example, truncated .xz files could - // cause an infinite loop. - // - // A worker thread doing partial updates will - // store not only the output position in outbuf->pos - // but also the matching input position in - // outbuf->decoder_in_pos. Here we check if that - // input position matches the amount of input that - // the worker thread has been given (in_filled). - // If so, we must return and not wait as no more - // output will be coming without first getting more - // input to the worker thread. If the application - // keeps calling lzma_code() without providing more - // input, it will eventually get LZMA_BUF_ERROR. - // - // NOTE: We can read partial_update and in_filled - // without thr->mutex as only the main thread - // modifies these variables. decoder_in_pos requires - // coder->mutex which we are already holding. - if (coder->thr != NULL && coder->thr->partial_update - != PARTIAL_DISABLED) { - // There is exactly one outbuf in the queue. - assert(coder->thr->outbuf == coder->outq.head); - assert(coder->thr->outbuf == coder->outq.tail); - - if (coder->thr->outbuf->decoder_in_pos - == coder->thr->in_filled) - break; - } - - // Wait for input or output to become possible. - if (coder->timeout != 0) { - // See the comment in stream_encoder_mt.c - // about why mythread_condtime_set() is used - // like this. - // - // FIXME? - // In contrast to the encoder, this calls - // _condtime_set while the mutex is locked. - if (!*has_blocked) { - *has_blocked = true; - mythread_condtime_set(wait_abs, - &coder->cond, - coder->timeout); - } - - if (mythread_cond_timedwait(&coder->cond, - &coder->mutex, - wait_abs) != 0) { - ret = LZMA_TIMED_OUT; - break; - } - } else { - mythread_cond_wait(&coder->cond, - &coder->mutex); - } - } while (ret == LZMA_OK); - } - - // If we are returning an error, then the application cannot get - // more output from us and thus keeping the threads running is - // useless and waste of CPU time. - if (ret != LZMA_OK && ret != LZMA_TIMED_OUT) - threads_stop(coder); - - return ret; -} - - -static lzma_ret -decode_block_header(struct lzma_stream_coder *coder, - const lzma_allocator *allocator, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - if (*in_pos >= in_size) - return LZMA_OK; - - if (coder->pos == 0) { - // Detect if it's Index. - if (in[*in_pos] == INDEX_INDICATOR) - return LZMA_INDEX_DETECTED; - - // Calculate the size of the Block Header. Note that - // Block Header decoder wants to see this byte too - // so don't advance *in_pos. - coder->block_options.header_size - = lzma_block_header_size_decode( - in[*in_pos]); - } - - // Copy the Block Header to the internal buffer. - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - coder->block_options.header_size); - - // Return if we didn't get the whole Block Header yet. - if (coder->pos < coder->block_options.header_size) - return LZMA_OK; - - coder->pos = 0; - - // Version 1 is needed to support the .ignore_check option. - coder->block_options.version = 1; - - // Block Header decoder will initialize all members of this array - // so we don't need to do it here. - coder->block_options.filters = coder->filters; - - // Decode the Block Header. - return_if_error(lzma_block_header_decode(&coder->block_options, - allocator, coder->buffer)); - - // If LZMA_IGNORE_CHECK was used, this flag needs to be set. - // It has to be set after lzma_block_header_decode() because - // it always resets this to false. - coder->block_options.ignore_check = coder->ignore_check; - - // coder->block_options is ready now. - return LZMA_STREAM_END; -} - - -/// Get the size of the Compressed Data + Block Padding + Check. -static size_t -comp_blk_size(const struct lzma_stream_coder *coder) -{ - return vli_ceil4(coder->block_options.compressed_size) - + lzma_check_size(coder->stream_flags.check); -} - - -/// Returns true if the size (compressed or uncompressed) is such that -/// threaded decompression cannot be used. Sizes that are too big compared -/// to SIZE_MAX must be rejected to avoid integer overflows and truncations -/// when lzma_vli is assigned to a size_t. -static bool -is_direct_mode_needed(lzma_vli size) -{ - return size == LZMA_VLI_UNKNOWN || size > SIZE_MAX / 3; -} - - -static lzma_ret -stream_decoder_reset(struct lzma_stream_coder *coder, - const lzma_allocator *allocator) -{ - // Initialize the Index hash used to verify the Index. - coder->index_hash = lzma_index_hash_init(coder->index_hash, allocator); - if (coder->index_hash == NULL) - return LZMA_MEM_ERROR; - - // Reset the rest of the variables. - coder->sequence = SEQ_STREAM_HEADER; - coder->pos = 0; - - return LZMA_OK; -} - - -static lzma_ret -stream_decode_mt(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, lzma_action action) -{ - struct lzma_stream_coder *coder = coder_ptr; - - mythread_condtime wait_abs; - bool has_blocked = false; - - // Determine if in SEQ_BLOCK_HEADER and SEQ_BLOCK_THR_RUN we should - // tell read_output_and_wait() to wait until it can fill the output - // buffer (or a timeout occurs). Two conditions must be met: - // - // (1) If the caller provided no new input. The reason for this - // can be, for example, the end of the file or that there is - // a pause in the input stream and more input is available - // a little later. In this situation we should wait for output - // because otherwise we would end up in a busy-waiting loop where - // we make no progress and the application just calls us again - // without providing any new input. This would then result in - // LZMA_BUF_ERROR even though more output would be available - // once the worker threads decode more data. - // - // (2) Even if (1) is true, we will not wait if the previous call to - // this function managed to produce some output and the output - // buffer became full. This is for compatibility with applications - // that call lzma_code() in such a way that new input is provided - // only when the output buffer didn't become full. Without this - // trick such applications would have bad performance (bad - // parallelization due to decoder not getting input fast enough). - // - // NOTE: Such loops might require that timeout is disabled (0) - // if they assume that output-not-full implies that all input has - // been consumed. If and only if timeout is enabled, we may return - // when output isn't full *and* not all input has been consumed. - // - // However, if LZMA_FINISH is used, the above is ignored and we always - // wait (timeout can still cause us to return) because we know that - // we won't get any more input. This matters if the input file is - // truncated and we are doing single-shot decoding, that is, - // timeout = 0 and LZMA_FINISH is used on the first call to - // lzma_code() and the output buffer is known to be big enough - // to hold all uncompressed data: - // - // - If LZMA_FINISH wasn't handled specially, we could return - // LZMA_OK before providing all output that is possible with the - // truncated input. The rest would be available if lzma_code() was - // called again but then it's not single-shot decoding anymore. - // - // - By handling LZMA_FINISH specially here, the first call will - // produce all the output, matching the behavior of the - // single-threaded decoder. - // - // So it's a very specific corner case but also easy to avoid. Note - // that this special handling of LZMA_FINISH has no effect for - // single-shot decoding when the input file is valid (not truncated); - // premature LZMA_OK wouldn't be possible as long as timeout = 0. - const bool waiting_allowed = action == LZMA_FINISH - || (*in_pos == in_size && !coder->out_was_filled); - coder->out_was_filled = false; - - while (true) - switch (coder->sequence) { - case SEQ_STREAM_HEADER: { - // Copy the Stream Header to the internal buffer. - const size_t in_old = *in_pos; - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - LZMA_STREAM_HEADER_SIZE); - coder->progress_in += *in_pos - in_old; - - // Return if we didn't get the whole Stream Header yet. - if (coder->pos < LZMA_STREAM_HEADER_SIZE) - return LZMA_OK; - - coder->pos = 0; - - // Decode the Stream Header. - const lzma_ret ret = lzma_stream_header_decode( - &coder->stream_flags, coder->buffer); - if (ret != LZMA_OK) - return ret == LZMA_FORMAT_ERROR && !coder->first_stream - ? LZMA_DATA_ERROR : ret; - - // If we are decoding concatenated Streams, and the later - // Streams have invalid Header Magic Bytes, we give - // LZMA_DATA_ERROR instead of LZMA_FORMAT_ERROR. - coder->first_stream = false; - - // Copy the type of the Check so that Block Header and Block - // decoders see it. - coder->block_options.check = coder->stream_flags.check; - - // Even if we return LZMA_*_CHECK below, we want - // to continue from Block Header decoding. - coder->sequence = SEQ_BLOCK_HEADER; - - // Detect if there's no integrity check or if it is - // unsupported if those were requested by the application. - if (coder->tell_no_check && coder->stream_flags.check - == LZMA_CHECK_NONE) - return LZMA_NO_CHECK; - - if (coder->tell_unsupported_check - && !lzma_check_is_supported( - coder->stream_flags.check)) - return LZMA_UNSUPPORTED_CHECK; - - if (coder->tell_any_check) - return LZMA_GET_CHECK; - - FALLTHROUGH; - } - - case SEQ_BLOCK_HEADER: { - const size_t in_old = *in_pos; - const lzma_ret ret = decode_block_header(coder, allocator, - in, in_pos, in_size); - coder->progress_in += *in_pos - in_old; - - if (ret == LZMA_OK) { - // We didn't decode the whole Block Header yet. - // - // Read output from the queue before returning. This - // is important because it is possible that the - // application doesn't have any new input available - // immediately. If we didn't try to copy output from - // the output queue here, lzma_code() could end up - // returning LZMA_BUF_ERROR even though queued output - // is available. - // - // If the lzma_code() call provided at least one input - // byte, only copy as much data from the output queue - // as is available immediately. This way the - // application will be able to provide more input - // without a delay. - // - // On the other hand, if lzma_code() was called with - // an empty input buffer(*), treat it specially: try - // to fill the output buffer even if it requires - // waiting for the worker threads to provide output - // (timeout, if specified, can still cause us to - // return). - // - // - This way the application will be able to get all - // data that can be decoded from the input provided - // so far. - // - // - We avoid both premature LZMA_BUF_ERROR and - // busy-waiting where the application repeatedly - // calls lzma_code() which immediately returns - // LZMA_OK without providing new data. - // - // - If the queue becomes empty, we won't wait - // anything and will return LZMA_OK immediately - // (coder->timeout is completely ignored). - // - // (*) See the comment at the beginning of this - // function how waiting_allowed is determined - // and why there is an exception to the rule - // of "called with an empty input buffer". - assert(*in_pos == in_size); - - // If LZMA_FINISH was used we know that we won't get - // more input, so the file must be truncated if we - // get here. If worker threads don't detect any - // errors, eventually there will be no more output - // while we keep returning LZMA_OK which gets - // converted to LZMA_BUF_ERROR in lzma_code(). - // - // If fail-fast is enabled then we will return - // immediately using LZMA_DATA_ERROR instead of - // LZMA_OK or LZMA_BUF_ERROR. Rationale for the - // error code: - // - // - Worker threads may have a large amount of - // not-yet-decoded input data and we don't - // know for sure if all data is valid. Bad - // data there would result in LZMA_DATA_ERROR - // when fail-fast isn't used. - // - // - Immediate LZMA_BUF_ERROR would be a bit weird - // considering the older liblzma code. lzma_code() - // even has an assertion to prevent coders from - // returning LZMA_BUF_ERROR directly. - // - // The downside of this is that with fail-fast apps - // cannot always distinguish between corrupt and - // truncated files. - if (action == LZMA_FINISH && coder->fail_fast) { - // We won't produce any more output. Stop - // the unfinished worker threads so they - // won't waste CPU time. - threads_stop(coder); - return LZMA_DATA_ERROR; - } - - // read_output_and_wait() will call threads_stop() - // if needed so with that we can use return_if_error. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, waiting_allowed, - &wait_abs, &has_blocked)); - - if (coder->pending_error != LZMA_OK) { - coder->sequence = SEQ_ERROR; - break; - } - - return LZMA_OK; - } - - if (ret == LZMA_INDEX_DETECTED) { - coder->sequence = SEQ_INDEX_WAIT_OUTPUT; - break; - } - - // See if an error occurred. - if (ret != LZMA_STREAM_END) { - // NOTE: Here and in all other places where - // pending_error is set, it may overwrite the value - // (LZMA_PROG_ERROR) set by read_output_and_wait(). - // That function might overwrite value set here too. - // These are fine because when read_output_and_wait() - // sets pending_error, it actually works as a flag - // variable only ("some error has occurred") and the - // actual value of pending_error is not used in - // SEQ_ERROR. In such cases SEQ_ERROR will eventually - // get the correct error code from the return value of - // a later read_output_and_wait() call. - coder->pending_error = ret; - coder->sequence = SEQ_ERROR; - break; - } - - // Calculate the memory usage of the filters / Block decoder. - coder->mem_next_filters = lzma_raw_decoder_memusage( - coder->filters); - - if (coder->mem_next_filters == UINT64_MAX) { - // One or more unknown Filter IDs. - coder->pending_error = LZMA_OPTIONS_ERROR; - coder->sequence = SEQ_ERROR; - break; - } - - coder->sequence = SEQ_BLOCK_INIT; - FALLTHROUGH; - } - - case SEQ_BLOCK_INIT: { - // Check if decoding is possible at all with the current - // memlimit_stop which we must never exceed. - // - // This needs to be the first thing in SEQ_BLOCK_INIT - // to make it possible to restart decoding after increasing - // memlimit_stop with lzma_memlimit_set(). - if (coder->mem_next_filters > coder->memlimit_stop) { - // Flush pending output before returning - // LZMA_MEMLIMIT_ERROR. If the application doesn't - // want to increase the limit, at least it will get - // all the output possible so far. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, true, &wait_abs, &has_blocked)); - - if (!lzma_outq_is_empty(&coder->outq)) - return LZMA_OK; - - return LZMA_MEMLIMIT_ERROR; - } - - // Check if the size information is available in Block Header. - // If it is, check if the sizes are small enough that we don't - // need to worry *too* much about integer overflows later in - // the code. If these conditions are not met, we must use the - // single-threaded direct mode. - if (is_direct_mode_needed(coder->block_options.compressed_size) - || is_direct_mode_needed( - coder->block_options.uncompressed_size)) { - coder->sequence = SEQ_BLOCK_DIRECT_INIT; - break; - } - - // Calculate the amount of memory needed for the input and - // output buffers in threaded mode. - // - // These cannot overflow because we already checked that - // the sizes are small enough using is_direct_mode_needed(). - coder->mem_next_in = comp_blk_size(coder); - const uint64_t mem_buffers = coder->mem_next_in - + lzma_outq_outbuf_memusage( - coder->block_options.uncompressed_size); - - // Add the amount needed by the filters. - // Avoid integer overflows. - if (UINT64_MAX - mem_buffers < coder->mem_next_filters) { - // Use direct mode if the memusage would overflow. - // This is a theoretical case that shouldn't happen - // in practice unless the input file is weird (broken - // or malicious). - coder->sequence = SEQ_BLOCK_DIRECT_INIT; - break; - } - - // Amount of memory needed to decode this Block in - // threaded mode: - coder->mem_next_block = coder->mem_next_filters + mem_buffers; - - // If this alone would exceed memlimit_threading, then we must - // use the single-threaded direct mode. - if (coder->mem_next_block > coder->memlimit_threading) { - coder->sequence = SEQ_BLOCK_DIRECT_INIT; - break; - } - - // Use the threaded mode. Free the direct mode decoder in - // case it has been initialized. - lzma_next_end(&coder->block_decoder, allocator); - coder->mem_direct_mode = 0; - - // Since we already know what the sizes are supposed to be, - // we can already add them to the Index hash. The Block - // decoder will verify the values while decoding. - const lzma_ret ret = lzma_index_hash_append(coder->index_hash, - lzma_block_unpadded_size( - &coder->block_options), - coder->block_options.uncompressed_size); - if (ret != LZMA_OK) { - coder->pending_error = ret; - coder->sequence = SEQ_ERROR; - break; - } - - coder->sequence = SEQ_BLOCK_THR_INIT; - FALLTHROUGH; - } - - case SEQ_BLOCK_THR_INIT: { - // We need to wait for a multiple conditions to become true - // until we can initialize the Block decoder and let a worker - // thread decode it: - // - // - Wait for the memory usage of the active threads to drop - // so that starting the decoding of this Block won't make - // us go over memlimit_threading. - // - // - Wait for at least one free output queue slot. - // - // - Wait for a free worker thread. - // - // While we wait, we must copy decompressed data to the out - // buffer and catch possible decoder errors. - // - // read_output_and_wait() does all the above. - bool block_can_start = false; - - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - &block_can_start, true, - &wait_abs, &has_blocked)); - - if (coder->pending_error != LZMA_OK) { - coder->sequence = SEQ_ERROR; - break; - } - - if (!block_can_start) { - // It's not a timeout because return_if_error handles - // it already. Output queue cannot be empty either - // because in that case block_can_start would have - // been true. Thus the output buffer must be full and - // the queue isn't empty. - assert(*out_pos == out_size); - assert(!lzma_outq_is_empty(&coder->outq)); - return LZMA_OK; - } - - // We know that we can start decoding this Block without - // exceeding memlimit_threading. However, to stay below - // memlimit_threading may require freeing some of the - // cached memory. - // - // Get a local copy of variables that require locking the - // mutex. It is fine if the worker threads modify the real - // values after we read these as those changes can only be - // towards more favorable conditions (less memory in use, - // more in cache). - // - // These are initialized to silence warnings. - uint64_t mem_in_use = 0; - uint64_t mem_cached = 0; - struct worker_thread *thr = NULL; - - mythread_sync(coder->mutex) { - mem_in_use = coder->mem_in_use; - mem_cached = coder->mem_cached; - thr = coder->threads_free; - } - - // The maximum amount of memory that can be held by other - // threads and cached buffers while allowing us to start - // decoding the next Block. - const uint64_t mem_max = coder->memlimit_threading - - coder->mem_next_block; - - // If the existing allocations are so large that starting - // to decode this Block might exceed memlimit_threads, - // try to free memory from the output queue cache first. - // - // NOTE: This math assumes the worst case. It's possible - // that the limit wouldn't be exceeded if the existing cached - // allocations are reused. - if (mem_in_use + mem_cached + coder->outq.mem_allocated - > mem_max) { - // Clear the outq cache except leave one buffer in - // the cache if its size is correct. That way we - // don't free and almost immediately reallocate - // an identical buffer. - lzma_outq_clear_cache2(&coder->outq, allocator, - coder->block_options.uncompressed_size); - } - - // If there is at least one worker_thread in the cache and - // the existing allocations are so large that starting to - // decode this Block might exceed memlimit_threads, free - // memory by freeing cached Block decoders. - // - // NOTE: The comparison is different here than above. - // Here we don't care about cached buffers in outq anymore - // and only look at memory actually in use. This is because - // if there is something in outq cache, it's a single buffer - // that can be used as is. We ensured this in the above - // if-block. - uint64_t mem_freed = 0; - if (thr != NULL && mem_in_use + mem_cached - + coder->outq.mem_in_use > mem_max) { - // Don't free the first Block decoder if its memory - // usage isn't greater than what this Block will need. - // Typically the same filter chain is used for all - // Blocks so this way the allocations can be reused - // when get_thread() picks the first worker_thread - // from the cache. - if (thr->mem_filters <= coder->mem_next_filters) - thr = thr->next; - - while (thr != NULL) { - lzma_next_end(&thr->block_decoder, allocator); - mem_freed += thr->mem_filters; - thr->mem_filters = 0; - thr = thr->next; - } - } - - // Update the memory usage counters. Note that coder->mem_* - // may have changed since we read them so we must subtract - // or add the changes. - mythread_sync(coder->mutex) { - coder->mem_cached -= mem_freed; - - // Memory needed for the filters and the input buffer. - // The output queue takes care of its own counter so - // we don't touch it here. - // - // NOTE: After this, coder->mem_in_use + - // coder->mem_cached might count the same thing twice. - // If so, this will get corrected in get_thread() when - // a worker_thread is picked from coder->free_threads - // and its memory usage is subtracted from mem_cached. - coder->mem_in_use += coder->mem_next_in - + coder->mem_next_filters; - } - - // Allocate memory for the output buffer in the output queue. - lzma_ret ret = lzma_outq_prealloc_buf( - &coder->outq, allocator, - coder->block_options.uncompressed_size); - if (ret != LZMA_OK) { - threads_stop(coder); - return ret; - } - - // Set up coder->thr. - ret = get_thread(coder, allocator); - if (ret != LZMA_OK) { - threads_stop(coder); - return ret; - } - - // The new Block decoder memory usage is already counted in - // coder->mem_in_use. Store it in the thread too. - coder->thr->mem_filters = coder->mem_next_filters; - - // Initialize the Block decoder. - coder->thr->block_options = coder->block_options; - ret = lzma_block_decoder_init( - &coder->thr->block_decoder, allocator, - &coder->thr->block_options); - - // Free the allocated filter options since they are needed - // only to initialize the Block decoder. - lzma_filters_free(coder->filters, allocator); - coder->thr->block_options.filters = NULL; - - // Check if memory usage calculation and Block encoder - // initialization succeeded. - if (ret != LZMA_OK) { - coder->pending_error = ret; - coder->sequence = SEQ_ERROR; - break; - } - - // Allocate the input buffer. - coder->thr->in_size = coder->mem_next_in; - coder->thr->in = lzma_alloc(coder->thr->in_size, allocator); - if (coder->thr->in == NULL) { - threads_stop(coder); - return LZMA_MEM_ERROR; - } - - // Get the preallocated output buffer. - coder->thr->outbuf = lzma_outq_get_buf( - &coder->outq, coder->thr); - - // Start the decoder. - mythread_sync(coder->thr->mutex) { - assert(coder->thr->state == THR_IDLE); - coder->thr->state = THR_RUN; - mythread_cond_signal(&coder->thr->cond); - } - - // Enable output from the thread that holds the oldest output - // buffer in the output queue (if such a thread exists). - mythread_sync(coder->mutex) { - lzma_outq_enable_partial_output(&coder->outq, - &worker_enable_partial_update); - } - - coder->sequence = SEQ_BLOCK_THR_RUN; - FALLTHROUGH; - } - - case SEQ_BLOCK_THR_RUN: { - if (action == LZMA_FINISH && coder->fail_fast) { - // We know that we won't get more input and that - // the caller wants fail-fast behavior. If we see - // that we don't have enough input to finish this - // Block, return LZMA_DATA_ERROR immediately. - // See SEQ_BLOCK_HEADER for the error code rationale. - const size_t in_avail = in_size - *in_pos; - const size_t in_needed = coder->thr->in_size - - coder->thr->in_filled; - if (in_avail < in_needed) { - threads_stop(coder); - return LZMA_DATA_ERROR; - } - } - - // Copy input to the worker thread. - size_t cur_in_filled = coder->thr->in_filled; - lzma_bufcpy(in, in_pos, in_size, coder->thr->in, - &cur_in_filled, coder->thr->in_size); - - // Tell the thread how much we copied. - mythread_sync(coder->thr->mutex) { - coder->thr->in_filled = cur_in_filled; - - // NOTE: Most of the time we are copying input faster - // than the thread can decode so most of the time - // calling mythread_cond_signal() is useless but - // we cannot make it conditional because thr->in_pos - // is updated without a mutex. And the overhead should - // be very much negligible anyway. - mythread_cond_signal(&coder->thr->cond); - } - - // Read output from the output queue. Just like in - // SEQ_BLOCK_HEADER, we wait to fill the output buffer - // only if waiting_allowed was set to true in the beginning - // of this function (see the comment there) and there is - // no input available. In SEQ_BLOCK_HEADER, there is never - // input available when read_output_and_wait() is called, - // but here there can be when LZMA_FINISH is used, thus we - // need to check if *in_pos == in_size. Otherwise we would - // wait here instead of using the available input to start - // a new thread. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, - waiting_allowed && *in_pos == in_size, - &wait_abs, &has_blocked)); - - if (coder->pending_error != LZMA_OK) { - coder->sequence = SEQ_ERROR; - break; - } - - // Return if the input didn't contain the whole Block. - // - // NOTE: When we updated coder->thr->in_filled a few lines - // above, the worker thread might by now have finished its - // work and returned itself back to the stack of free threads. - if (coder->thr->in_filled < coder->thr->in_size) { - assert(*in_pos == in_size); - return LZMA_OK; - } - - // The whole Block has been copied to the thread-specific - // buffer. Continue from the next Block Header or Index. - coder->thr = NULL; - coder->sequence = SEQ_BLOCK_HEADER; - break; - } - - case SEQ_BLOCK_DIRECT_INIT: { - // Wait for the threads to finish and that all decoded data - // has been copied to the output. That is, wait until the - // output queue becomes empty. - // - // NOTE: No need to check for coder->pending_error as - // we aren't consuming any input until the queue is empty - // and if there is a pending error, read_output_and_wait() - // will eventually return it before the queue is empty. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, true, &wait_abs, &has_blocked)); - if (!lzma_outq_is_empty(&coder->outq)) - return LZMA_OK; - - // Free the cached output buffers. - lzma_outq_clear_cache(&coder->outq, allocator); - - // Get rid of the worker threads, including the coder->threads - // array. - threads_end(coder, allocator); - - // Initialize the Block decoder. - const lzma_ret ret = lzma_block_decoder_init( - &coder->block_decoder, allocator, - &coder->block_options); - - // Free the allocated filter options since they are needed - // only to initialize the Block decoder. - lzma_filters_free(coder->filters, allocator); - coder->block_options.filters = NULL; - - // Check if Block decoder initialization succeeded. - if (ret != LZMA_OK) - return ret; - - // Make the memory usage visible to _memconfig(). - coder->mem_direct_mode = coder->mem_next_filters; - - coder->sequence = SEQ_BLOCK_DIRECT_RUN; - FALLTHROUGH; - } - - case SEQ_BLOCK_DIRECT_RUN: { - const size_t in_old = *in_pos; - const size_t out_old = *out_pos; - const lzma_ret ret = coder->block_decoder.code( - coder->block_decoder.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - action); - coder->progress_in += *in_pos - in_old; - coder->progress_out += *out_pos - out_old; - - if (ret != LZMA_STREAM_END) - return ret; - - // Block decoded successfully. Add the new size pair to - // the Index hash. - return_if_error(lzma_index_hash_append(coder->index_hash, - lzma_block_unpadded_size( - &coder->block_options), - coder->block_options.uncompressed_size)); - - coder->sequence = SEQ_BLOCK_HEADER; - break; - } - - case SEQ_INDEX_WAIT_OUTPUT: - // Flush the output from all worker threads so that we can - // decode the Index without thinking about threading. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, true, &wait_abs, &has_blocked)); - - if (!lzma_outq_is_empty(&coder->outq)) - return LZMA_OK; - - coder->sequence = SEQ_INDEX_DECODE; - FALLTHROUGH; - - case SEQ_INDEX_DECODE: { - // If we don't have any input, don't call - // lzma_index_hash_decode() since it would return - // LZMA_BUF_ERROR, which we must not do here. - if (*in_pos >= in_size) - return LZMA_OK; - - // Decode the Index and compare it to the hash calculated - // from the sizes of the Blocks (if any). - const size_t in_old = *in_pos; - const lzma_ret ret = lzma_index_hash_decode(coder->index_hash, - in, in_pos, in_size); - coder->progress_in += *in_pos - in_old; - if (ret != LZMA_STREAM_END) - return ret; - - coder->sequence = SEQ_STREAM_FOOTER; - FALLTHROUGH; - } - - case SEQ_STREAM_FOOTER: { - // Copy the Stream Footer to the internal buffer. - const size_t in_old = *in_pos; - lzma_bufcpy(in, in_pos, in_size, coder->buffer, &coder->pos, - LZMA_STREAM_HEADER_SIZE); - coder->progress_in += *in_pos - in_old; - - // Return if we didn't get the whole Stream Footer yet. - if (coder->pos < LZMA_STREAM_HEADER_SIZE) - return LZMA_OK; - - coder->pos = 0; - - // Decode the Stream Footer. The decoder gives - // LZMA_FORMAT_ERROR if the magic bytes don't match, - // so convert that return code to LZMA_DATA_ERROR. - lzma_stream_flags footer_flags; - const lzma_ret ret = lzma_stream_footer_decode( - &footer_flags, coder->buffer); - if (ret != LZMA_OK) - return ret == LZMA_FORMAT_ERROR - ? LZMA_DATA_ERROR : ret; - - // Check that Index Size stored in the Stream Footer matches - // the real size of the Index field. - if (lzma_index_hash_size(coder->index_hash) - != footer_flags.backward_size) - return LZMA_DATA_ERROR; - - // Compare that the Stream Flags fields are identical in - // both Stream Header and Stream Footer. - return_if_error(lzma_stream_flags_compare( - &coder->stream_flags, &footer_flags)); - - if (!coder->concatenated) - return LZMA_STREAM_END; - - coder->sequence = SEQ_STREAM_PADDING; - FALLTHROUGH; - } - - case SEQ_STREAM_PADDING: - assert(coder->concatenated); - - // Skip over possible Stream Padding. - while (true) { - if (*in_pos >= in_size) { - // Unless LZMA_FINISH was used, we cannot - // know if there's more input coming later. - if (action != LZMA_FINISH) - return LZMA_OK; - - // Stream Padding must be a multiple of - // four bytes. - return coder->pos == 0 - ? LZMA_STREAM_END - : LZMA_DATA_ERROR; - } - - // If the byte is not zero, it probably indicates - // beginning of a new Stream (or the file is corrupt). - if (in[*in_pos] != 0x00) - break; - - ++*in_pos; - ++coder->progress_in; - coder->pos = (coder->pos + 1) & 3; - } - - // Stream Padding must be a multiple of four bytes (empty - // Stream Padding is OK). - if (coder->pos != 0) { - ++*in_pos; - ++coder->progress_in; - return LZMA_DATA_ERROR; - } - - // Prepare to decode the next Stream. - return_if_error(stream_decoder_reset(coder, allocator)); - break; - - case SEQ_ERROR: - if (!coder->fail_fast) { - // Let the application get all data before the point - // where the error was detected. This matches the - // behavior of single-threaded use. - // - // FIXME? Some errors (LZMA_MEM_ERROR) don't get here, - // they are returned immediately. Thus in rare cases - // the output will be less than in the single-threaded - // mode. Maybe this doesn't matter much in practice. - return_if_error(read_output_and_wait(coder, allocator, - out, out_pos, out_size, - NULL, true, &wait_abs, &has_blocked)); - - // We get here only if the error happened in the main - // thread, for example, unsupported Block Header. - if (!lzma_outq_is_empty(&coder->outq)) - return LZMA_OK; - } - - // We only get here if no errors were detected by the worker - // threads. Errors from worker threads would have already been - // returned by the call to read_output_and_wait() above. - return coder->pending_error; - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - // Never reached -} - - -static void -stream_decoder_mt_end(void *coder_ptr, const lzma_allocator *allocator) -{ - struct lzma_stream_coder *coder = coder_ptr; - - threads_end(coder, allocator); - lzma_outq_end(&coder->outq, allocator); - - lzma_next_end(&coder->block_decoder, allocator); - lzma_filters_free(coder->filters, allocator); - lzma_index_hash_end(coder->index_hash, allocator); - - lzma_free(coder, allocator); - return; -} - - -static lzma_check -stream_decoder_mt_get_check(const void *coder_ptr) -{ - const struct lzma_stream_coder *coder = coder_ptr; - return coder->stream_flags.check; -} - - -static lzma_ret -stream_decoder_mt_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - // NOTE: This function gets/sets memlimit_stop. For now, - // memlimit_threading cannot be modified after initialization. - // - // *memusage will include cached memory too. Excluding cached memory - // would be misleading and it wouldn't help the applications to - // know how much memory is actually needed to decompress the file - // because the higher the number of threads and the memlimits are - // the more memory the decoder may use. - // - // Setting a new limit includes the cached memory too and too low - // limits will be rejected. Alternative could be to free the cached - // memory immediately if that helps to bring the limit down but - // the current way is the simplest. It's unlikely that limit needs - // to be lowered in the middle of a file anyway; the typical reason - // to want a new limit is to increase after LZMA_MEMLIMIT_ERROR - // and even such use isn't common. - struct lzma_stream_coder *coder = coder_ptr; - - mythread_sync(coder->mutex) { - *memusage = coder->mem_direct_mode - + coder->mem_in_use - + coder->mem_cached - + coder->outq.mem_allocated; - } - - // If no filter chains are allocated, *memusage may be zero. - // Always return at least LZMA_MEMUSAGE_BASE. - if (*memusage < LZMA_MEMUSAGE_BASE) - *memusage = LZMA_MEMUSAGE_BASE; - - *old_memlimit = coder->memlimit_stop; - - if (new_memlimit != 0) { - if (new_memlimit < *memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit_stop = new_memlimit; - } - - return LZMA_OK; -} - - -static void -stream_decoder_mt_get_progress(void *coder_ptr, - uint64_t *progress_in, uint64_t *progress_out) -{ - struct lzma_stream_coder *coder = coder_ptr; - - // Lock coder->mutex to prevent finishing threads from moving their - // progress info from the worker_thread structure to lzma_stream_coder. - mythread_sync(coder->mutex) { - *progress_in = coder->progress_in; - *progress_out = coder->progress_out; - - for (size_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - *progress_in += coder->threads[i].progress_in; - *progress_out += coder->threads[i] - .progress_out; - } - } - } - - return; -} - - -static lzma_ret -stream_decoder_mt_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_mt *options) -{ - struct lzma_stream_coder *coder; - - if (options->threads == 0 || options->threads > LZMA_THREADS_MAX) - return LZMA_OPTIONS_ERROR; - - if (options->flags & ~LZMA_SUPPORTED_FLAGS) - return LZMA_OPTIONS_ERROR; - - lzma_next_coder_init(&stream_decoder_mt_init, next, allocator); - - coder = next->coder; - if (!coder) { - coder = lzma_alloc(sizeof(struct lzma_stream_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - - if (mythread_mutex_init(&coder->mutex)) { - lzma_free(coder, allocator); - return LZMA_MEM_ERROR; - } - - if (mythread_cond_init(&coder->cond)) { - mythread_mutex_destroy(&coder->mutex); - lzma_free(coder, allocator); - return LZMA_MEM_ERROR; - } - - next->code = &stream_decode_mt; - next->end = &stream_decoder_mt_end; - next->get_check = &stream_decoder_mt_get_check; - next->memconfig = &stream_decoder_mt_memconfig; - next->get_progress = &stream_decoder_mt_get_progress; - - coder->filters[0].id = LZMA_VLI_UNKNOWN; - memzero(&coder->outq, sizeof(coder->outq)); - - coder->block_decoder = LZMA_NEXT_CODER_INIT; - coder->mem_direct_mode = 0; - - coder->index_hash = NULL; - coder->threads = NULL; - coder->threads_free = NULL; - coder->threads_initialized = 0; - } - - // Cleanup old filter chain if one remains after unfinished decoding - // of a previous Stream. - lzma_filters_free(coder->filters, allocator); - - // By allocating threads from scratch we can start memory-usage - // accounting from scratch, too. Changes in filter and block sizes may - // affect number of threads. - // - // Reusing threads doesn't seem worth it. Unlike the single-threaded - // decoder, with some types of input file combinations reusing - // could leave quite a lot of memory allocated but unused (first - // file could allocate a lot, the next files could use fewer - // threads and some of the allocations from the first file would not - // get freed unless memlimit_threading forces us to clear caches). - // - // NOTE: The direct mode decoder isn't freed here if one exists. - // It will be reused or freed as needed in the main loop. - threads_end(coder, allocator); - - // All memusage counters start at 0 (including mem_direct_mode). - // The little extra that is needed for the structs in this file - // get accounted well enough by the filter chain memory usage - // which adds LZMA_MEMUSAGE_BASE for each chain. However, - // stream_decoder_mt_memconfig() has to handle this specially so that - // it will never return less than LZMA_MEMUSAGE_BASE as memory usage. - coder->mem_in_use = 0; - coder->mem_cached = 0; - coder->mem_next_block = 0; - - coder->progress_in = 0; - coder->progress_out = 0; - - coder->sequence = SEQ_STREAM_HEADER; - coder->thread_error = LZMA_OK; - coder->pending_error = LZMA_OK; - coder->thr = NULL; - - coder->timeout = options->timeout; - - coder->memlimit_threading = my_max(1, options->memlimit_threading); - coder->memlimit_stop = my_max(1, options->memlimit_stop); - if (coder->memlimit_threading > coder->memlimit_stop) - coder->memlimit_threading = coder->memlimit_stop; - - coder->tell_no_check = (options->flags & LZMA_TELL_NO_CHECK) != 0; - coder->tell_unsupported_check - = (options->flags & LZMA_TELL_UNSUPPORTED_CHECK) != 0; - coder->tell_any_check = (options->flags & LZMA_TELL_ANY_CHECK) != 0; - coder->ignore_check = (options->flags & LZMA_IGNORE_CHECK) != 0; - coder->concatenated = (options->flags & LZMA_CONCATENATED) != 0; - coder->fail_fast = (options->flags & LZMA_FAIL_FAST) != 0; - - coder->first_stream = true; - coder->out_was_filled = false; - coder->pos = 0; - - coder->threads_max = options->threads; - - return_if_error(lzma_outq_init(&coder->outq, allocator, - coder->threads_max)); - - return stream_decoder_reset(coder, allocator); -} - - -extern LZMA_API(lzma_ret) -lzma_stream_decoder_mt(lzma_stream *strm, const lzma_mt *options) -{ - lzma_next_strm_init(stream_decoder_mt_init, strm, options); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_encoder.c b/software/src/xz/src/liblzma/common/stream_encoder.c deleted file mode 100644 index e7e5b3f..0000000 --- a/software/src/xz/src/liblzma/common/stream_encoder.c +++ /dev/null @@ -1,354 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_encoder.c -/// \brief Encodes .xz Streams -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "block_encoder.h" -#include "index_encoder.h" - - -typedef struct { - enum { - SEQ_STREAM_HEADER, - SEQ_BLOCK_INIT, - SEQ_BLOCK_HEADER, - SEQ_BLOCK_ENCODE, - SEQ_INDEX_ENCODE, - SEQ_STREAM_FOOTER, - } sequence; - - /// True if Block encoder has been initialized by - /// stream_encoder_init() or stream_encoder_update() - /// and thus doesn't need to be initialized in stream_encode(). - bool block_encoder_is_initialized; - - /// Block - lzma_next_coder block_encoder; - - /// Options for the Block encoder - lzma_block block_options; - - /// The filter chain currently in use - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - - /// Index encoder. This is separate from Block encoder, because this - /// doesn't take much memory, and when encoding multiple Streams - /// with the same encoding options we avoid reallocating memory. - lzma_next_coder index_encoder; - - /// Index to hold sizes of the Blocks - lzma_index *index; - - /// Read position in buffer[] - size_t buffer_pos; - - /// Total number of bytes in buffer[] - size_t buffer_size; - - /// Buffer to hold Stream Header, Block Header, and Stream Footer. - /// Block Header has biggest maximum size. - uint8_t buffer[LZMA_BLOCK_HEADER_SIZE_MAX]; -} lzma_stream_coder; - - -static lzma_ret -block_encoder_init(lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - // Prepare the Block options. Even though Block encoder doesn't need - // compressed_size, uncompressed_size, and header_size to be - // initialized, it is a good idea to do it here, because this way - // we catch if someone gave us Filter ID that cannot be used in - // Blocks/Streams. - coder->block_options.compressed_size = LZMA_VLI_UNKNOWN; - coder->block_options.uncompressed_size = LZMA_VLI_UNKNOWN; - - return_if_error(lzma_block_header_size(&coder->block_options)); - - // Initialize the actual Block encoder. - return lzma_block_encoder_init(&coder->block_encoder, allocator, - &coder->block_options); -} - - -static lzma_ret -stream_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_stream_coder *coder = coder_ptr; - - // Main loop - while (*out_pos < out_size) - switch (coder->sequence) { - case SEQ_STREAM_HEADER: - case SEQ_BLOCK_HEADER: - case SEQ_STREAM_FOOTER: - lzma_bufcpy(coder->buffer, &coder->buffer_pos, - coder->buffer_size, out, out_pos, out_size); - if (coder->buffer_pos < coder->buffer_size) - return LZMA_OK; - - if (coder->sequence == SEQ_STREAM_FOOTER) - return LZMA_STREAM_END; - - coder->buffer_pos = 0; - ++coder->sequence; - break; - - case SEQ_BLOCK_INIT: { - if (*in_pos == in_size) { - // If we are requested to flush or finish the current - // Block, return LZMA_STREAM_END immediately since - // there's nothing to do. - if (action != LZMA_FINISH) - return action == LZMA_RUN - ? LZMA_OK : LZMA_STREAM_END; - - // The application had used LZMA_FULL_FLUSH to finish - // the previous Block, but now wants to finish without - // encoding new data, or it is simply creating an - // empty Stream with no Blocks. - // - // Initialize the Index encoder, and continue to - // actually encoding the Index. - return_if_error(lzma_index_encoder_init( - &coder->index_encoder, allocator, - coder->index)); - coder->sequence = SEQ_INDEX_ENCODE; - break; - } - - // Initialize the Block encoder unless it was already - // initialized by stream_encoder_init() or - // stream_encoder_update(). - if (!coder->block_encoder_is_initialized) - return_if_error(block_encoder_init(coder, allocator)); - - // Make it false so that we don't skip the initialization - // with the next Block. - coder->block_encoder_is_initialized = false; - - // Encode the Block Header. This shouldn't fail since we have - // already initialized the Block encoder. - if (lzma_block_header_encode(&coder->block_options, - coder->buffer) != LZMA_OK) - return LZMA_PROG_ERROR; - - coder->buffer_size = coder->block_options.header_size; - coder->sequence = SEQ_BLOCK_HEADER; - break; - } - - case SEQ_BLOCK_ENCODE: { - static const lzma_action convert[LZMA_ACTION_MAX + 1] = { - LZMA_RUN, - LZMA_SYNC_FLUSH, - LZMA_FINISH, - LZMA_FINISH, - LZMA_FINISH, - }; - - const lzma_ret ret = coder->block_encoder.code( - coder->block_encoder.coder, allocator, - in, in_pos, in_size, - out, out_pos, out_size, convert[action]); - if (ret != LZMA_STREAM_END || action == LZMA_SYNC_FLUSH) - return ret; - - // Add a new Index Record. - const lzma_vli unpadded_size = lzma_block_unpadded_size( - &coder->block_options); - assert(unpadded_size != 0); - return_if_error(lzma_index_append(coder->index, allocator, - unpadded_size, - coder->block_options.uncompressed_size)); - - coder->sequence = SEQ_BLOCK_INIT; - break; - } - - case SEQ_INDEX_ENCODE: { - // Call the Index encoder. It doesn't take any input, so - // those pointers can be NULL. - const lzma_ret ret = coder->index_encoder.code( - coder->index_encoder.coder, allocator, - NULL, NULL, 0, - out, out_pos, out_size, LZMA_RUN); - if (ret != LZMA_STREAM_END) - return ret; - - // Encode the Stream Footer into coder->buffer. - const lzma_stream_flags stream_flags = { - .version = 0, - .backward_size = lzma_index_size(coder->index), - .check = coder->block_options.check, - }; - - if (lzma_stream_footer_encode(&stream_flags, coder->buffer) - != LZMA_OK) - return LZMA_PROG_ERROR; - - coder->buffer_size = LZMA_STREAM_HEADER_SIZE; - coder->sequence = SEQ_STREAM_FOOTER; - break; - } - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -stream_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_stream_coder *coder = coder_ptr; - - lzma_next_end(&coder->block_encoder, allocator); - lzma_next_end(&coder->index_encoder, allocator); - lzma_index_end(coder->index, allocator); - - lzma_filters_free(coder->filters, allocator); - - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -stream_encoder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters, - const lzma_filter *reversed_filters) -{ - lzma_stream_coder *coder = coder_ptr; - lzma_ret ret; - - // Make a copy to a temporary buffer first. This way it is easier - // to keep the encoder state unchanged if an error occurs with - // lzma_filters_copy(). - lzma_filter temp[LZMA_FILTERS_MAX + 1]; - return_if_error(lzma_filters_copy(filters, temp, allocator)); - - if (coder->sequence <= SEQ_BLOCK_INIT) { - // There is no incomplete Block waiting to be finished, - // thus we can change the whole filter chain. Start by - // trying to initialize the Block encoder with the new - // chain. This way we detect if the chain is valid. - coder->block_encoder_is_initialized = false; - coder->block_options.filters = temp; - ret = block_encoder_init(coder, allocator); - coder->block_options.filters = coder->filters; - if (ret != LZMA_OK) - goto error; - - coder->block_encoder_is_initialized = true; - - } else if (coder->sequence <= SEQ_BLOCK_ENCODE) { - // We are in the middle of a Block. Try to update only - // the filter-specific options. - ret = coder->block_encoder.update( - coder->block_encoder.coder, allocator, - filters, reversed_filters); - if (ret != LZMA_OK) - goto error; - } else { - // Trying to update the filter chain when we are already - // encoding Index or Stream Footer. - ret = LZMA_PROG_ERROR; - goto error; - } - - // Free the options of the old chain. - lzma_filters_free(coder->filters, allocator); - - // Copy the new filter chain in place. - memcpy(coder->filters, temp, sizeof(temp)); - - return LZMA_OK; - -error: - lzma_filters_free(temp, allocator); - return ret; -} - - -static lzma_ret -stream_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *filters, lzma_check check) -{ - lzma_next_coder_init(&stream_encoder_init, next, allocator); - - if (filters == NULL) - return LZMA_PROG_ERROR; - - lzma_stream_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_stream_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &stream_encode; - next->end = &stream_encoder_end; - next->update = &stream_encoder_update; - - coder->filters[0].id = LZMA_VLI_UNKNOWN; - coder->block_encoder = LZMA_NEXT_CODER_INIT; - coder->index_encoder = LZMA_NEXT_CODER_INIT; - coder->index = NULL; - } - - // Basic initializations - coder->sequence = SEQ_STREAM_HEADER; - coder->block_options.version = 0; - coder->block_options.check = check; - - // Initialize the Index - lzma_index_end(coder->index, allocator); - coder->index = lzma_index_init(allocator); - if (coder->index == NULL) - return LZMA_MEM_ERROR; - - // Encode the Stream Header - lzma_stream_flags stream_flags = { - .version = 0, - .check = check, - }; - return_if_error(lzma_stream_header_encode( - &stream_flags, coder->buffer)); - - coder->buffer_pos = 0; - coder->buffer_size = LZMA_STREAM_HEADER_SIZE; - - // Initialize the Block encoder. This way we detect unsupported - // filter chains when initializing the Stream encoder instead of - // giving an error after Stream Header has already been written out. - return stream_encoder_update(coder, allocator, filters, NULL); -} - - -extern LZMA_API(lzma_ret) -lzma_stream_encoder(lzma_stream *strm, - const lzma_filter *filters, lzma_check check) -{ - lzma_next_strm_init(stream_encoder_init, strm, filters, check); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true; - strm->internal->supported_actions[LZMA_FULL_FLUSH] = true; - strm->internal->supported_actions[LZMA_FULL_BARRIER] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_encoder_mt.c b/software/src/xz/src/liblzma/common/stream_encoder_mt.c deleted file mode 100644 index fd0eb98..0000000 --- a/software/src/xz/src/liblzma/common/stream_encoder_mt.c +++ /dev/null @@ -1,1278 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_encoder_mt.c -/// \brief Multithreaded .xz Stream encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_encoder.h" -#include "easy_preset.h" -#include "block_encoder.h" -#include "block_buffer_encoder.h" -#include "index_encoder.h" -#include "outqueue.h" - - -/// Maximum supported block size. This makes it simpler to prevent integer -/// overflows if we are given unusually large block size. -#define BLOCK_SIZE_MAX (UINT64_MAX / LZMA_THREADS_MAX) - - -typedef enum { - /// Waiting for work. - THR_IDLE, - - /// Encoding is in progress. - THR_RUN, - - /// Encoding is in progress but no more input data will - /// be read. - THR_FINISH, - - /// The main thread wants the thread to stop whatever it was doing - /// but not exit. - THR_STOP, - - /// The main thread wants the thread to exit. We could use - /// cancellation but since there's stopped anyway, this is lazier. - THR_EXIT, - -} worker_state; - -typedef struct lzma_stream_coder_s lzma_stream_coder; - -typedef struct worker_thread_s worker_thread; -struct worker_thread_s { - worker_state state; - - /// Input buffer of coder->block_size bytes. The main thread will - /// put new input into this and update in_size accordingly. Once - /// no more input is coming, state will be set to THR_FINISH. - uint8_t *in; - - /// Amount of data available in the input buffer. This is modified - /// only by the main thread. - size_t in_size; - - /// Output buffer for this thread. This is set by the main - /// thread every time a new Block is started with this thread - /// structure. - lzma_outbuf *outbuf; - - /// Pointer to the main structure is needed when putting this - /// thread back to the stack of free threads. - lzma_stream_coder *coder; - - /// The allocator is set by the main thread. Since a copy of the - /// pointer is kept here, the application must not change the - /// allocator before calling lzma_end(). - const lzma_allocator *allocator; - - /// Amount of uncompressed data that has already been compressed. - uint64_t progress_in; - - /// Amount of compressed data that is ready. - uint64_t progress_out; - - /// Block encoder - lzma_next_coder block_encoder; - - /// Compression options for this Block - lzma_block block_options; - - /// Filter chain for this thread. By copying the filters array - /// to each thread it is possible to change the filter chain - /// between Blocks using lzma_filters_update(). - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - - /// Next structure in the stack of free worker threads. - worker_thread *next; - - mythread_mutex mutex; - mythread_cond cond; - - /// The ID of this thread is used to join the thread - /// when it's not needed anymore. - mythread thread_id; -}; - - -struct lzma_stream_coder_s { - enum { - SEQ_STREAM_HEADER, - SEQ_BLOCK, - SEQ_INDEX, - SEQ_STREAM_FOOTER, - } sequence; - - /// Start a new Block every block_size bytes of input unless - /// LZMA_FULL_FLUSH or LZMA_FULL_BARRIER is used earlier. - size_t block_size; - - /// The filter chain to use for the next Block. - /// This can be updated using lzma_filters_update() - /// after LZMA_FULL_BARRIER or LZMA_FULL_FLUSH. - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - - /// A copy of filters[] will be put here when attempting to get - /// a new worker thread. This will be copied to a worker thread - /// when a thread becomes free and then this cache is marked as - /// empty by setting [0].id = LZMA_VLI_UNKNOWN. Without this cache - /// the filter options from filters[] would get uselessly copied - /// multiple times (allocated and freed) when waiting for a new free - /// worker thread. - /// - /// This is freed if filters[] is updated via lzma_filters_update(). - lzma_filter filters_cache[LZMA_FILTERS_MAX + 1]; - - - /// Index to hold sizes of the Blocks - lzma_index *index; - - /// Index encoder - lzma_next_coder index_encoder; - - - /// Stream Flags for encoding the Stream Header and Stream Footer. - lzma_stream_flags stream_flags; - - /// Buffer to hold Stream Header and Stream Footer. - uint8_t header[LZMA_STREAM_HEADER_SIZE]; - - /// Read position in header[] - size_t header_pos; - - - /// Output buffer queue for compressed data - lzma_outq outq; - - /// How much memory to allocate for each lzma_outbuf.buf - size_t outbuf_alloc_size; - - - /// Maximum wait time if cannot use all the input and cannot - /// fill the output buffer. This is in milliseconds. - uint32_t timeout; - - - /// Error code from a worker thread - lzma_ret thread_error; - - /// Array of allocated thread-specific structures - worker_thread *threads; - - /// Number of structures in "threads" above. This is also the - /// number of threads that will be created at maximum. - uint32_t threads_max; - - /// Number of thread structures that have been initialized, and - /// thus the number of worker threads actually created so far. - uint32_t threads_initialized; - - /// Stack of free threads. When a thread finishes, it puts itself - /// back into this stack. This starts as empty because threads - /// are created only when actually needed. - worker_thread *threads_free; - - /// The most recent worker thread to which the main thread writes - /// the new input from the application. - worker_thread *thr; - - - /// Amount of uncompressed data in Blocks that have already - /// been finished. - uint64_t progress_in; - - /// Amount of compressed data in Stream Header + Blocks that - /// have already been finished. - uint64_t progress_out; - - - mythread_mutex mutex; - mythread_cond cond; -}; - - -/// Tell the main thread that something has gone wrong. -static void -worker_error(worker_thread *thr, lzma_ret ret) -{ - assert(ret != LZMA_OK); - assert(ret != LZMA_STREAM_END); - - mythread_sync(thr->coder->mutex) { - if (thr->coder->thread_error == LZMA_OK) - thr->coder->thread_error = ret; - - mythread_cond_signal(&thr->coder->cond); - } - - return; -} - - -static worker_state -worker_encode(worker_thread *thr, size_t *out_pos, worker_state state) -{ - assert(thr->progress_in == 0); - assert(thr->progress_out == 0); - - // Set the Block options. - thr->block_options = (lzma_block){ - .version = 0, - .check = thr->coder->stream_flags.check, - .compressed_size = thr->outbuf->allocated, - .uncompressed_size = thr->coder->block_size, - .filters = thr->filters, - }; - - // Calculate maximum size of the Block Header. This amount is - // reserved in the beginning of the buffer so that Block Header - // along with Compressed Size and Uncompressed Size can be - // written there. - lzma_ret ret = lzma_block_header_size(&thr->block_options); - if (ret != LZMA_OK) { - worker_error(thr, ret); - return THR_STOP; - } - - // Initialize the Block encoder. - ret = lzma_block_encoder_init(&thr->block_encoder, - thr->allocator, &thr->block_options); - if (ret != LZMA_OK) { - worker_error(thr, ret); - return THR_STOP; - } - - size_t in_pos = 0; - size_t in_size = 0; - - *out_pos = thr->block_options.header_size; - const size_t out_size = thr->outbuf->allocated; - - do { - mythread_sync(thr->mutex) { - // Store in_pos and *out_pos into *thr so that - // an application may read them via - // lzma_get_progress() to get progress information. - // - // NOTE: These aren't updated when the encoding - // finishes. Instead, the final values are taken - // later from thr->outbuf. - thr->progress_in = in_pos; - thr->progress_out = *out_pos; - - while (in_size == thr->in_size - && thr->state == THR_RUN) - mythread_cond_wait(&thr->cond, &thr->mutex); - - state = thr->state; - in_size = thr->in_size; - } - - // Return if we were asked to stop or exit. - if (state >= THR_STOP) - return state; - - lzma_action action = state == THR_FINISH - ? LZMA_FINISH : LZMA_RUN; - - // Limit the amount of input given to the Block encoder - // at once. This way this thread can react fairly quickly - // if the main thread wants us to stop or exit. - static const size_t in_chunk_max = 16384; - size_t in_limit = in_size; - if (in_size - in_pos > in_chunk_max) { - in_limit = in_pos + in_chunk_max; - action = LZMA_RUN; - } - - ret = thr->block_encoder.code( - thr->block_encoder.coder, thr->allocator, - thr->in, &in_pos, in_limit, thr->outbuf->buf, - out_pos, out_size, action); - } while (ret == LZMA_OK && *out_pos < out_size); - - switch (ret) { - case LZMA_STREAM_END: - assert(state == THR_FINISH); - - // Encode the Block Header. By doing it after - // the compression, we can store the Compressed Size - // and Uncompressed Size fields. - ret = lzma_block_header_encode(&thr->block_options, - thr->outbuf->buf); - if (ret != LZMA_OK) { - worker_error(thr, ret); - return THR_STOP; - } - - break; - - case LZMA_OK: - // The data was incompressible. Encode it using uncompressed - // LZMA2 chunks. - // - // First wait that we have gotten all the input. - mythread_sync(thr->mutex) { - while (thr->state == THR_RUN) - mythread_cond_wait(&thr->cond, &thr->mutex); - - state = thr->state; - in_size = thr->in_size; - } - - if (state >= THR_STOP) - return state; - - // Do the encoding. This takes care of the Block Header too. - *out_pos = 0; - ret = lzma_block_uncomp_encode(&thr->block_options, - thr->in, in_size, thr->outbuf->buf, - out_pos, out_size); - - // It shouldn't fail. - if (ret != LZMA_OK) { - worker_error(thr, LZMA_PROG_ERROR); - return THR_STOP; - } - - break; - - default: - worker_error(thr, ret); - return THR_STOP; - } - - // Set the size information that will be read by the main thread - // to write the Index field. - thr->outbuf->unpadded_size - = lzma_block_unpadded_size(&thr->block_options); - assert(thr->outbuf->unpadded_size != 0); - thr->outbuf->uncompressed_size = thr->block_options.uncompressed_size; - - return THR_FINISH; -} - - -static MYTHREAD_RET_TYPE -worker_start(void *thr_ptr) -{ - worker_thread *thr = thr_ptr; - worker_state state = THR_IDLE; // Init to silence a warning - - while (true) { - // Wait for work. - mythread_sync(thr->mutex) { - while (true) { - // The thread is already idle so if we are - // requested to stop, just set the state. - if (thr->state == THR_STOP) { - thr->state = THR_IDLE; - mythread_cond_signal(&thr->cond); - } - - state = thr->state; - if (state != THR_IDLE) - break; - - mythread_cond_wait(&thr->cond, &thr->mutex); - } - } - - size_t out_pos = 0; - - assert(state != THR_IDLE); - assert(state != THR_STOP); - - if (state <= THR_FINISH) - state = worker_encode(thr, &out_pos, state); - - if (state == THR_EXIT) - break; - - // Mark the thread as idle unless the main thread has - // told us to exit. Signal is needed for the case - // where the main thread is waiting for the threads to stop. - mythread_sync(thr->mutex) { - if (thr->state != THR_EXIT) { - thr->state = THR_IDLE; - mythread_cond_signal(&thr->cond); - } - } - - mythread_sync(thr->coder->mutex) { - // If no errors occurred, make the encoded data - // available to be copied out. - if (state == THR_FINISH) { - thr->outbuf->pos = out_pos; - thr->outbuf->finished = true; - } - - // Update the main progress info. - thr->coder->progress_in - += thr->outbuf->uncompressed_size; - thr->coder->progress_out += out_pos; - thr->progress_in = 0; - thr->progress_out = 0; - - // Return this thread to the stack of free threads. - thr->next = thr->coder->threads_free; - thr->coder->threads_free = thr; - - mythread_cond_signal(&thr->coder->cond); - } - } - - // Exiting, free the resources. - lzma_filters_free(thr->filters, thr->allocator); - - mythread_mutex_destroy(&thr->mutex); - mythread_cond_destroy(&thr->cond); - - lzma_next_end(&thr->block_encoder, thr->allocator); - lzma_free(thr->in, thr->allocator); - return MYTHREAD_RET_VALUE; -} - - -/// Make the threads stop but not exit. Optionally wait for them to stop. -static void -threads_stop(lzma_stream_coder *coder, bool wait_for_threads) -{ - // Tell the threads to stop. - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - coder->threads[i].state = THR_STOP; - mythread_cond_signal(&coder->threads[i].cond); - } - } - - if (!wait_for_threads) - return; - - // Wait for the threads to settle in the idle state. - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - while (coder->threads[i].state != THR_IDLE) - mythread_cond_wait(&coder->threads[i].cond, - &coder->threads[i].mutex); - } - } - - return; -} - - -/// Stop the threads and free the resources associated with them. -/// Wait until the threads have exited. -static void -threads_end(lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - coder->threads[i].state = THR_EXIT; - mythread_cond_signal(&coder->threads[i].cond); - } - } - - for (uint32_t i = 0; i < coder->threads_initialized; ++i) { - int ret = mythread_join(coder->threads[i].thread_id); - assert(ret == 0); - (void)ret; - } - - lzma_free(coder->threads, allocator); - return; -} - - -/// Initialize a new worker_thread structure and create a new thread. -static lzma_ret -initialize_new_thread(lzma_stream_coder *coder, - const lzma_allocator *allocator) -{ - worker_thread *thr = &coder->threads[coder->threads_initialized]; - - thr->in = lzma_alloc(coder->block_size, allocator); - if (thr->in == NULL) - return LZMA_MEM_ERROR; - - if (mythread_mutex_init(&thr->mutex)) - goto error_mutex; - - if (mythread_cond_init(&thr->cond)) - goto error_cond; - - thr->state = THR_IDLE; - thr->allocator = allocator; - thr->coder = coder; - thr->progress_in = 0; - thr->progress_out = 0; - thr->block_encoder = LZMA_NEXT_CODER_INIT; - thr->filters[0].id = LZMA_VLI_UNKNOWN; - - if (mythread_create(&thr->thread_id, &worker_start, thr)) - goto error_thread; - - ++coder->threads_initialized; - coder->thr = thr; - - return LZMA_OK; - -error_thread: - mythread_cond_destroy(&thr->cond); - -error_cond: - mythread_mutex_destroy(&thr->mutex); - -error_mutex: - lzma_free(thr->in, allocator); - return LZMA_MEM_ERROR; -} - - -static lzma_ret -get_thread(lzma_stream_coder *coder, const lzma_allocator *allocator) -{ - // If there are no free output subqueues, there is no - // point to try getting a thread. - if (!lzma_outq_has_buf(&coder->outq)) - return LZMA_OK; - - // That's also true if we cannot allocate memory for the output - // buffer in the output queue. - return_if_error(lzma_outq_prealloc_buf(&coder->outq, allocator, - coder->outbuf_alloc_size)); - - // Make a thread-specific copy of the filter chain. Put it in - // the cache array first so that if we cannot get a new thread yet, - // the allocation is ready when we try again. - if (coder->filters_cache[0].id == LZMA_VLI_UNKNOWN) - return_if_error(lzma_filters_copy( - coder->filters, coder->filters_cache, allocator)); - - // If there is a free structure on the stack, use it. - mythread_sync(coder->mutex) { - if (coder->threads_free != NULL) { - coder->thr = coder->threads_free; - coder->threads_free = coder->threads_free->next; - } - } - - if (coder->thr == NULL) { - // If there are no uninitialized structures left, return. - if (coder->threads_initialized == coder->threads_max) - return LZMA_OK; - - // Initialize a new thread. - return_if_error(initialize_new_thread(coder, allocator)); - } - - // Reset the parts of the thread state that have to be done - // in the main thread. - mythread_sync(coder->thr->mutex) { - coder->thr->state = THR_RUN; - coder->thr->in_size = 0; - coder->thr->outbuf = lzma_outq_get_buf(&coder->outq, NULL); - - // Free the old thread-specific filter options and replace - // them with the already-allocated new options from - // coder->filters_cache[]. Then mark the cache as empty. - lzma_filters_free(coder->thr->filters, allocator); - memcpy(coder->thr->filters, coder->filters_cache, - sizeof(coder->filters_cache)); - coder->filters_cache[0].id = LZMA_VLI_UNKNOWN; - - mythread_cond_signal(&coder->thr->cond); - } - - return LZMA_OK; -} - - -static lzma_ret -stream_encode_in(lzma_stream_coder *coder, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, lzma_action action) -{ - while (*in_pos < in_size - || (coder->thr != NULL && action != LZMA_RUN)) { - if (coder->thr == NULL) { - // Get a new thread. - const lzma_ret ret = get_thread(coder, allocator); - if (coder->thr == NULL) - return ret; - } - - // Copy the input data to thread's buffer. - size_t thr_in_size = coder->thr->in_size; - lzma_bufcpy(in, in_pos, in_size, coder->thr->in, - &thr_in_size, coder->block_size); - - // Tell the Block encoder to finish if - // - it has got block_size bytes of input; or - // - all input was used and LZMA_FINISH, LZMA_FULL_FLUSH, - // or LZMA_FULL_BARRIER was used. - // - // TODO: LZMA_SYNC_FLUSH and LZMA_SYNC_BARRIER. - const bool finish = thr_in_size == coder->block_size - || (*in_pos == in_size && action != LZMA_RUN); - - bool block_error = false; - - mythread_sync(coder->thr->mutex) { - if (coder->thr->state == THR_IDLE) { - // Something has gone wrong with the Block - // encoder. It has set coder->thread_error - // which we will read a few lines later. - block_error = true; - } else { - // Tell the Block encoder its new amount - // of input and update the state if needed. - coder->thr->in_size = thr_in_size; - - if (finish) - coder->thr->state = THR_FINISH; - - mythread_cond_signal(&coder->thr->cond); - } - } - - if (block_error) { - lzma_ret ret = LZMA_OK; // Init to silence a warning. - - mythread_sync(coder->mutex) { - ret = coder->thread_error; - } - - return ret; - } - - if (finish) - coder->thr = NULL; - } - - return LZMA_OK; -} - - -/// Wait until more input can be consumed, more output can be read, or -/// an optional timeout is reached. -static bool -wait_for_work(lzma_stream_coder *coder, mythread_condtime *wait_abs, - bool *has_blocked, bool has_input) -{ - if (coder->timeout != 0 && !*has_blocked) { - // Every time when stream_encode_mt() is called via - // lzma_code(), *has_blocked starts as false. We set it - // to true here and calculate the absolute time when - // we must return if there's nothing to do. - // - // This way if we block multiple times for short moments - // less than "timeout" milliseconds, we will return once - // "timeout" amount of time has passed since the *first* - // blocking occurred. If the absolute time was calculated - // again every time we block, "timeout" would effectively - // be meaningless if we never consecutively block longer - // than "timeout" ms. - *has_blocked = true; - mythread_condtime_set(wait_abs, &coder->cond, coder->timeout); - } - - bool timed_out = false; - - mythread_sync(coder->mutex) { - // There are four things that we wait. If one of them - // becomes possible, we return. - // - If there is input left, we need to get a free - // worker thread and an output buffer for it. - // - Data ready to be read from the output queue. - // - A worker thread indicates an error. - // - Time out occurs. - while ((!has_input || coder->threads_free == NULL - || !lzma_outq_has_buf(&coder->outq)) - && !lzma_outq_is_readable(&coder->outq) - && coder->thread_error == LZMA_OK - && !timed_out) { - if (coder->timeout != 0) - timed_out = mythread_cond_timedwait( - &coder->cond, &coder->mutex, - wait_abs) != 0; - else - mythread_cond_wait(&coder->cond, - &coder->mutex); - } - } - - return timed_out; -} - - -static lzma_ret -stream_encode_mt(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_stream_coder *coder = coder_ptr; - - switch (coder->sequence) { - case SEQ_STREAM_HEADER: - lzma_bufcpy(coder->header, &coder->header_pos, - sizeof(coder->header), - out, out_pos, out_size); - if (coder->header_pos < sizeof(coder->header)) - return LZMA_OK; - - coder->header_pos = 0; - coder->sequence = SEQ_BLOCK; - FALLTHROUGH; - - case SEQ_BLOCK: { - // Initialized to silence warnings. - lzma_vli unpadded_size = 0; - lzma_vli uncompressed_size = 0; - lzma_ret ret = LZMA_OK; - - // These are for wait_for_work(). - bool has_blocked = false; - mythread_condtime wait_abs = { 0 }; - - while (true) { - mythread_sync(coder->mutex) { - // Check for Block encoder errors. - ret = coder->thread_error; - if (ret != LZMA_OK) { - assert(ret != LZMA_STREAM_END); - break; // Break out of mythread_sync. - } - - // Try to read compressed data to out[]. - ret = lzma_outq_read(&coder->outq, allocator, - out, out_pos, out_size, - &unpadded_size, - &uncompressed_size); - } - - if (ret == LZMA_STREAM_END) { - // End of Block. Add it to the Index. - ret = lzma_index_append(coder->index, - allocator, unpadded_size, - uncompressed_size); - if (ret != LZMA_OK) { - threads_stop(coder, false); - return ret; - } - - // If we didn't fill the output buffer yet, - // try to read more data. Maybe the next - // outbuf has been finished already too. - if (*out_pos < out_size) - continue; - } - - if (ret != LZMA_OK) { - // coder->thread_error was set. - threads_stop(coder, false); - return ret; - } - - // Try to give uncompressed data to a worker thread. - ret = stream_encode_in(coder, allocator, - in, in_pos, in_size, action); - if (ret != LZMA_OK) { - threads_stop(coder, false); - return ret; - } - - // See if we should wait or return. - // - // TODO: LZMA_SYNC_FLUSH and LZMA_SYNC_BARRIER. - if (*in_pos == in_size) { - // LZMA_RUN: More data is probably coming - // so return to let the caller fill the - // input buffer. - if (action == LZMA_RUN) - return LZMA_OK; - - // LZMA_FULL_BARRIER: The same as with - // LZMA_RUN but tell the caller that the - // barrier was completed. - if (action == LZMA_FULL_BARRIER) - return LZMA_STREAM_END; - - // Finishing or flushing isn't completed until - // all input data has been encoded and copied - // to the output buffer. - if (lzma_outq_is_empty(&coder->outq)) { - // LZMA_FINISH: Continue to encode - // the Index field. - if (action == LZMA_FINISH) - break; - - // LZMA_FULL_FLUSH: Return to tell - // the caller that flushing was - // completed. - if (action == LZMA_FULL_FLUSH) - return LZMA_STREAM_END; - } - } - - // Return if there is no output space left. - // This check must be done after testing the input - // buffer, because we might want to use a different - // return code. - if (*out_pos == out_size) - return LZMA_OK; - - // Neither in nor out has been used completely. - // Wait until there's something we can do. - if (wait_for_work(coder, &wait_abs, &has_blocked, - *in_pos < in_size)) - return LZMA_TIMED_OUT; - } - - // All Blocks have been encoded and the threads have stopped. - // Prepare to encode the Index field. - return_if_error(lzma_index_encoder_init( - &coder->index_encoder, allocator, - coder->index)); - coder->sequence = SEQ_INDEX; - - // Update the progress info to take the Index and - // Stream Footer into account. Those are very fast to encode - // so in terms of progress information they can be thought - // to be ready to be copied out. - coder->progress_out += lzma_index_size(coder->index) - + LZMA_STREAM_HEADER_SIZE; - - FALLTHROUGH; - } - - case SEQ_INDEX: { - // Call the Index encoder. It doesn't take any input, so - // those pointers can be NULL. - const lzma_ret ret = coder->index_encoder.code( - coder->index_encoder.coder, allocator, - NULL, NULL, 0, - out, out_pos, out_size, LZMA_RUN); - if (ret != LZMA_STREAM_END) - return ret; - - // Encode the Stream Footer into coder->buffer. - coder->stream_flags.backward_size - = lzma_index_size(coder->index); - if (lzma_stream_footer_encode(&coder->stream_flags, - coder->header) != LZMA_OK) - return LZMA_PROG_ERROR; - - coder->sequence = SEQ_STREAM_FOOTER; - FALLTHROUGH; - } - - case SEQ_STREAM_FOOTER: - lzma_bufcpy(coder->header, &coder->header_pos, - sizeof(coder->header), - out, out_pos, out_size); - return coder->header_pos < sizeof(coder->header) - ? LZMA_OK : LZMA_STREAM_END; - } - - assert(0); - return LZMA_PROG_ERROR; -} - - -static void -stream_encoder_mt_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_stream_coder *coder = coder_ptr; - - // Threads must be killed before the output queue can be freed. - threads_end(coder, allocator); - lzma_outq_end(&coder->outq, allocator); - - lzma_filters_free(coder->filters, allocator); - lzma_filters_free(coder->filters_cache, allocator); - - lzma_next_end(&coder->index_encoder, allocator); - lzma_index_end(coder->index, allocator); - - mythread_cond_destroy(&coder->cond); - mythread_mutex_destroy(&coder->mutex); - - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -stream_encoder_mt_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters, - const lzma_filter *reversed_filters - lzma_attribute((__unused__))) -{ - lzma_stream_coder *coder = coder_ptr; - - // Applications shouldn't attempt to change the options when - // we are already encoding the Index or Stream Footer. - if (coder->sequence > SEQ_BLOCK) - return LZMA_PROG_ERROR; - - // For now the threaded encoder doesn't support changing - // the options in the middle of a Block. - if (coder->thr != NULL) - return LZMA_PROG_ERROR; - - // Check if the filter chain seems mostly valid. See the comment - // in stream_encoder_mt_init(). - if (lzma_raw_encoder_memusage(filters) == UINT64_MAX) - return LZMA_OPTIONS_ERROR; - - // Make a copy to a temporary buffer first. This way the encoder - // state stays unchanged if an error occurs in lzma_filters_copy(). - lzma_filter temp[LZMA_FILTERS_MAX + 1]; - return_if_error(lzma_filters_copy(filters, temp, allocator)); - - // Free the options of the old chain as well as the cache. - lzma_filters_free(coder->filters, allocator); - lzma_filters_free(coder->filters_cache, allocator); - - // Copy the new filter chain in place. - memcpy(coder->filters, temp, sizeof(temp)); - - return LZMA_OK; -} - - -/// Options handling for lzma_stream_encoder_mt_init() and -/// lzma_stream_encoder_mt_memusage() -static lzma_ret -get_options(const lzma_mt *options, lzma_options_easy *opt_easy, - const lzma_filter **filters, uint64_t *block_size, - uint64_t *outbuf_size_max) -{ - // Validate some of the options. - if (options == NULL) - return LZMA_PROG_ERROR; - - if (options->flags != 0 || options->threads == 0 - || options->threads > LZMA_THREADS_MAX) - return LZMA_OPTIONS_ERROR; - - if (options->filters != NULL) { - // Filter chain was given, use it as is. - *filters = options->filters; - } else { - // Use a preset. - if (lzma_easy_preset(opt_easy, options->preset)) - return LZMA_OPTIONS_ERROR; - - *filters = opt_easy->filters; - } - - // If the Block size is not set, determine it from the filter chain. - if (options->block_size > 0) - *block_size = options->block_size; - else - *block_size = lzma_mt_block_size(*filters); - - // UINT64_MAX > BLOCK_SIZE_MAX, so the second condition - // should be optimized out by any reasonable compiler. - // The second condition should be there in the unlikely event that - // the macros change and UINT64_MAX < BLOCK_SIZE_MAX. - if (*block_size > BLOCK_SIZE_MAX || *block_size == UINT64_MAX) - return LZMA_OPTIONS_ERROR; - - // Calculate the maximum amount output that a single output buffer - // may need to hold. This is the same as the maximum total size of - // a Block. - *outbuf_size_max = lzma_block_buffer_bound64(*block_size); - if (*outbuf_size_max == 0) - return LZMA_MEM_ERROR; - - return LZMA_OK; -} - - -static void -get_progress(void *coder_ptr, uint64_t *progress_in, uint64_t *progress_out) -{ - lzma_stream_coder *coder = coder_ptr; - - // Lock coder->mutex to prevent finishing threads from moving their - // progress info from the worker_thread structure to lzma_stream_coder. - mythread_sync(coder->mutex) { - *progress_in = coder->progress_in; - *progress_out = coder->progress_out; - - for (size_t i = 0; i < coder->threads_initialized; ++i) { - mythread_sync(coder->threads[i].mutex) { - *progress_in += coder->threads[i].progress_in; - *progress_out += coder->threads[i] - .progress_out; - } - } - } - - return; -} - - -static lzma_ret -stream_encoder_mt_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_mt *options) -{ - lzma_next_coder_init(&stream_encoder_mt_init, next, allocator); - - // Get the filter chain. - lzma_options_easy easy; - const lzma_filter *filters; - uint64_t block_size; - uint64_t outbuf_size_max; - return_if_error(get_options(options, &easy, &filters, - &block_size, &outbuf_size_max)); - -#if SIZE_MAX < UINT64_MAX - if (block_size > SIZE_MAX || outbuf_size_max > SIZE_MAX) - return LZMA_MEM_ERROR; -#endif - - // Validate the filter chain so that we can give an error in this - // function instead of delaying it to the first call to lzma_code(). - // The memory usage calculation verifies the filter chain as - // a side effect so we take advantage of that. It's not a perfect - // check though as raw encoder allows LZMA1 too but such problems - // will be caught eventually with Block Header encoder. - if (lzma_raw_encoder_memusage(filters) == UINT64_MAX) - return LZMA_OPTIONS_ERROR; - - // Validate the Check ID. - if ((unsigned int)(options->check) > LZMA_CHECK_ID_MAX) - return LZMA_PROG_ERROR; - - if (!lzma_check_is_supported(options->check)) - return LZMA_UNSUPPORTED_CHECK; - - // Allocate and initialize the base structure if needed. - lzma_stream_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_stream_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - - // For the mutex and condition variable initializations - // the error handling has to be done here because - // stream_encoder_mt_end() doesn't know if they have - // already been initialized or not. - if (mythread_mutex_init(&coder->mutex)) { - lzma_free(coder, allocator); - next->coder = NULL; - return LZMA_MEM_ERROR; - } - - if (mythread_cond_init(&coder->cond)) { - mythread_mutex_destroy(&coder->mutex); - lzma_free(coder, allocator); - next->coder = NULL; - return LZMA_MEM_ERROR; - } - - next->code = &stream_encode_mt; - next->end = &stream_encoder_mt_end; - next->get_progress = &get_progress; - next->update = &stream_encoder_mt_update; - - coder->filters[0].id = LZMA_VLI_UNKNOWN; - coder->filters_cache[0].id = LZMA_VLI_UNKNOWN; - coder->index_encoder = LZMA_NEXT_CODER_INIT; - coder->index = NULL; - memzero(&coder->outq, sizeof(coder->outq)); - coder->threads = NULL; - coder->threads_max = 0; - coder->threads_initialized = 0; - } - - // Basic initializations - coder->sequence = SEQ_STREAM_HEADER; - coder->block_size = (size_t)(block_size); - coder->outbuf_alloc_size = (size_t)(outbuf_size_max); - coder->thread_error = LZMA_OK; - coder->thr = NULL; - - // Allocate the thread-specific base structures. - assert(options->threads > 0); - if (coder->threads_max != options->threads) { - threads_end(coder, allocator); - - coder->threads = NULL; - coder->threads_max = 0; - - coder->threads_initialized = 0; - coder->threads_free = NULL; - - coder->threads = lzma_alloc( - options->threads * sizeof(worker_thread), - allocator); - if (coder->threads == NULL) - return LZMA_MEM_ERROR; - - coder->threads_max = options->threads; - } else { - // Reuse the old structures and threads. Tell the running - // threads to stop and wait until they have stopped. - threads_stop(coder, true); - } - - // Output queue - return_if_error(lzma_outq_init(&coder->outq, allocator, - options->threads)); - - // Timeout - coder->timeout = options->timeout; - - // Free the old filter chain and the cache. - lzma_filters_free(coder->filters, allocator); - lzma_filters_free(coder->filters_cache, allocator); - - // Copy the new filter chain. - return_if_error(lzma_filters_copy( - filters, coder->filters, allocator)); - - // Index - lzma_index_end(coder->index, allocator); - coder->index = lzma_index_init(allocator); - if (coder->index == NULL) - return LZMA_MEM_ERROR; - - // Stream Header - coder->stream_flags.version = 0; - coder->stream_flags.check = options->check; - return_if_error(lzma_stream_header_encode( - &coder->stream_flags, coder->header)); - - coder->header_pos = 0; - - // Progress info - coder->progress_in = 0; - coder->progress_out = LZMA_STREAM_HEADER_SIZE; - - return LZMA_OK; -} - - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -// These are for compatibility with binaries linked against liblzma that -// has been patched with xz-5.2.2-compat-libs.patch from RHEL/CentOS 7. -// Actually that patch didn't create lzma_stream_encoder_mt@XZ_5.2.2 -// but it has been added here anyway since someone might misread the -// RHEL patch and think both @XZ_5.1.2alpha and @XZ_5.2.2 exist. -LZMA_SYMVER_API("lzma_stream_encoder_mt@XZ_5.1.2alpha", - lzma_ret, lzma_stream_encoder_mt_512a)( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result - __attribute__((__alias__("lzma_stream_encoder_mt_52"))); - -LZMA_SYMVER_API("lzma_stream_encoder_mt@XZ_5.2.2", - lzma_ret, lzma_stream_encoder_mt_522)( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result - __attribute__((__alias__("lzma_stream_encoder_mt_52"))); - -LZMA_SYMVER_API("lzma_stream_encoder_mt@@XZ_5.2", - lzma_ret, lzma_stream_encoder_mt_52)( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result; - -#define lzma_stream_encoder_mt lzma_stream_encoder_mt_52 -#endif -extern LZMA_API(lzma_ret) -lzma_stream_encoder_mt(lzma_stream *strm, const lzma_mt *options) -{ - lzma_next_strm_init(stream_encoder_mt_init, strm, options); - - strm->internal->supported_actions[LZMA_RUN] = true; -// strm->internal->supported_actions[LZMA_SYNC_FLUSH] = true; - strm->internal->supported_actions[LZMA_FULL_FLUSH] = true; - strm->internal->supported_actions[LZMA_FULL_BARRIER] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} - - -#ifdef HAVE_SYMBOL_VERSIONS_LINUX -LZMA_SYMVER_API("lzma_stream_encoder_mt_memusage@XZ_5.1.2alpha", - uint64_t, lzma_stream_encoder_mt_memusage_512a)( - const lzma_mt *options) lzma_nothrow lzma_attr_pure - __attribute__((__alias__("lzma_stream_encoder_mt_memusage_52"))); - -LZMA_SYMVER_API("lzma_stream_encoder_mt_memusage@XZ_5.2.2", - uint64_t, lzma_stream_encoder_mt_memusage_522)( - const lzma_mt *options) lzma_nothrow lzma_attr_pure - __attribute__((__alias__("lzma_stream_encoder_mt_memusage_52"))); - -LZMA_SYMVER_API("lzma_stream_encoder_mt_memusage@@XZ_5.2", - uint64_t, lzma_stream_encoder_mt_memusage_52)( - const lzma_mt *options) lzma_nothrow lzma_attr_pure; - -#define lzma_stream_encoder_mt_memusage lzma_stream_encoder_mt_memusage_52 -#endif -// This function name is a monster but it's consistent with the older -// monster names. :-( 31 chars is the max that C99 requires so in that -// sense it's not too long. ;-) -extern LZMA_API(uint64_t) -lzma_stream_encoder_mt_memusage(const lzma_mt *options) -{ - lzma_options_easy easy; - const lzma_filter *filters; - uint64_t block_size; - uint64_t outbuf_size_max; - - if (get_options(options, &easy, &filters, &block_size, - &outbuf_size_max) != LZMA_OK) - return UINT64_MAX; - - // Memory usage of the input buffers - const uint64_t inbuf_memusage = options->threads * block_size; - - // Memory usage of the filter encoders - uint64_t filters_memusage = lzma_raw_encoder_memusage(filters); - if (filters_memusage == UINT64_MAX) - return UINT64_MAX; - - filters_memusage *= options->threads; - - // Memory usage of the output queue - const uint64_t outq_memusage = lzma_outq_memusage( - outbuf_size_max, options->threads); - if (outq_memusage == UINT64_MAX) - return UINT64_MAX; - - // Sum them with overflow checking. - uint64_t total_memusage = LZMA_MEMUSAGE_BASE - + sizeof(lzma_stream_coder) - + options->threads * sizeof(worker_thread); - - if (UINT64_MAX - total_memusage < inbuf_memusage) - return UINT64_MAX; - - total_memusage += inbuf_memusage; - - if (UINT64_MAX - total_memusage < filters_memusage) - return UINT64_MAX; - - total_memusage += filters_memusage; - - if (UINT64_MAX - total_memusage < outq_memusage) - return UINT64_MAX; - - return total_memusage + outq_memusage; -} diff --git a/software/src/xz/src/liblzma/common/stream_flags_common.c b/software/src/xz/src/liblzma/common/stream_flags_common.c deleted file mode 100644 index 41b8dcb..0000000 --- a/software/src/xz/src/liblzma/common/stream_flags_common.c +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_flags_common.c -/// \brief Common stuff for Stream flags coders -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_flags_common.h" - - -const uint8_t lzma_header_magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 }; -const uint8_t lzma_footer_magic[2] = { 0x59, 0x5A }; - - -extern LZMA_API(lzma_ret) -lzma_stream_flags_compare( - const lzma_stream_flags *a, const lzma_stream_flags *b) -{ - // We can compare only version 0 structures. - if (a->version != 0 || b->version != 0) - return LZMA_OPTIONS_ERROR; - - // Check type - if ((unsigned int)(a->check) > LZMA_CHECK_ID_MAX - || (unsigned int)(b->check) > LZMA_CHECK_ID_MAX) - return LZMA_PROG_ERROR; - - if (a->check != b->check) - return LZMA_DATA_ERROR; - - // Backward Sizes are compared only if they are known in both. - if (a->backward_size != LZMA_VLI_UNKNOWN - && b->backward_size != LZMA_VLI_UNKNOWN) { - if (!is_backward_size_valid(a) || !is_backward_size_valid(b)) - return LZMA_PROG_ERROR; - - if (a->backward_size != b->backward_size) - return LZMA_DATA_ERROR; - } - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_flags_common.h b/software/src/xz/src/liblzma/common/stream_flags_common.h deleted file mode 100644 index 28729db..0000000 --- a/software/src/xz/src/liblzma/common/stream_flags_common.h +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_flags_common.h -/// \brief Common stuff for Stream flags coders -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_STREAM_FLAGS_COMMON_H -#define LZMA_STREAM_FLAGS_COMMON_H - -#include "common.h" - -/// Size of the Stream Flags field -#define LZMA_STREAM_FLAGS_SIZE 2 - -lzma_attr_visibility_hidden -extern const uint8_t lzma_header_magic[6]; - -lzma_attr_visibility_hidden -extern const uint8_t lzma_footer_magic[2]; - - -static inline bool -is_backward_size_valid(const lzma_stream_flags *options) -{ - return options->backward_size >= LZMA_BACKWARD_SIZE_MIN - && options->backward_size <= LZMA_BACKWARD_SIZE_MAX - && (options->backward_size & 3) == 0; -} - -#endif diff --git a/software/src/xz/src/liblzma/common/stream_flags_decoder.c b/software/src/xz/src/liblzma/common/stream_flags_decoder.c deleted file mode 100644 index 522c98b..0000000 --- a/software/src/xz/src/liblzma/common/stream_flags_decoder.c +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_flags_decoder.c -/// \brief Decodes Stream Header and Stream Footer from .xz files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_flags_common.h" - - -static bool -stream_flags_decode(lzma_stream_flags *options, const uint8_t *in) -{ - // Reserved bits must be unset. - if (in[0] != 0x00 || (in[1] & 0xF0)) - return true; - - options->version = 0; - options->check = in[1] & 0x0F; - - return false; -} - - -extern LZMA_API(lzma_ret) -lzma_stream_header_decode(lzma_stream_flags *options, const uint8_t *in) -{ - // Magic - if (memcmp(in, lzma_header_magic, sizeof(lzma_header_magic)) != 0) - return LZMA_FORMAT_ERROR; - - // Verify the CRC32 so we can distinguish between corrupt - // and unsupported files. - const uint32_t crc = lzma_crc32(in + sizeof(lzma_header_magic), - LZMA_STREAM_FLAGS_SIZE, 0); - if (crc != read32le(in + sizeof(lzma_header_magic) - + LZMA_STREAM_FLAGS_SIZE)) { -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - return LZMA_DATA_ERROR; -#endif - } - - // Stream Flags - if (stream_flags_decode(options, in + sizeof(lzma_header_magic))) - return LZMA_OPTIONS_ERROR; - - // Set Backward Size to indicate unknown value. That way - // lzma_stream_flags_compare() can be used to compare Stream Header - // and Stream Footer while keeping it useful also for comparing - // two Stream Footers. - options->backward_size = LZMA_VLI_UNKNOWN; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_stream_footer_decode(lzma_stream_flags *options, const uint8_t *in) -{ - // Magic - if (memcmp(in + sizeof(uint32_t) * 2 + LZMA_STREAM_FLAGS_SIZE, - lzma_footer_magic, sizeof(lzma_footer_magic)) != 0) - return LZMA_FORMAT_ERROR; - - // CRC32 - const uint32_t crc = lzma_crc32(in + sizeof(uint32_t), - sizeof(uint32_t) + LZMA_STREAM_FLAGS_SIZE, 0); - if (crc != read32le(in)) { -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - return LZMA_DATA_ERROR; -#endif - } - - // Stream Flags - if (stream_flags_decode(options, in + sizeof(uint32_t) * 2)) - return LZMA_OPTIONS_ERROR; - - // Backward Size - options->backward_size = read32le(in + sizeof(uint32_t)); - options->backward_size = (options->backward_size + 1) * 4; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/stream_flags_encoder.c b/software/src/xz/src/liblzma/common/stream_flags_encoder.c deleted file mode 100644 index f94b5cd..0000000 --- a/software/src/xz/src/liblzma/common/stream_flags_encoder.c +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file stream_flags_encoder.c -/// \brief Encodes Stream Header and Stream Footer for .xz files -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "stream_flags_common.h" - - -static bool -stream_flags_encode(const lzma_stream_flags *options, uint8_t *out) -{ - if ((unsigned int)(options->check) > LZMA_CHECK_ID_MAX) - return true; - - out[0] = 0x00; - out[1] = options->check; - - return false; -} - - -extern LZMA_API(lzma_ret) -lzma_stream_header_encode(const lzma_stream_flags *options, uint8_t *out) -{ - assert(sizeof(lzma_header_magic) + LZMA_STREAM_FLAGS_SIZE - + 4 == LZMA_STREAM_HEADER_SIZE); - - if (options->version != 0) - return LZMA_OPTIONS_ERROR; - - // Magic - memcpy(out, lzma_header_magic, sizeof(lzma_header_magic)); - - // Stream Flags - if (stream_flags_encode(options, out + sizeof(lzma_header_magic))) - return LZMA_PROG_ERROR; - - // CRC32 of the Stream Header - const uint32_t crc = lzma_crc32(out + sizeof(lzma_header_magic), - LZMA_STREAM_FLAGS_SIZE, 0); - - write32le(out + sizeof(lzma_header_magic) + LZMA_STREAM_FLAGS_SIZE, - crc); - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_stream_footer_encode(const lzma_stream_flags *options, uint8_t *out) -{ - assert(2 * 4 + LZMA_STREAM_FLAGS_SIZE + sizeof(lzma_footer_magic) - == LZMA_STREAM_HEADER_SIZE); - - if (options->version != 0) - return LZMA_OPTIONS_ERROR; - - // Backward Size - if (!is_backward_size_valid(options)) - return LZMA_PROG_ERROR; - - write32le(out + 4, options->backward_size / 4 - 1); - - // Stream Flags - if (stream_flags_encode(options, out + 2 * 4)) - return LZMA_PROG_ERROR; - - // CRC32 - const uint32_t crc = lzma_crc32( - out + 4, 4 + LZMA_STREAM_FLAGS_SIZE, 0); - - write32le(out, crc); - - // Magic - memcpy(out + 2 * 4 + LZMA_STREAM_FLAGS_SIZE, - lzma_footer_magic, sizeof(lzma_footer_magic)); - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/string_conversion.c b/software/src/xz/src/liblzma/common/string_conversion.c deleted file mode 100644 index 015acf2..0000000 --- a/software/src/xz/src/liblzma/common/string_conversion.c +++ /dev/null @@ -1,1363 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file string_conversion.c -/// \brief Conversion of strings to filter chain and vice versa -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_common.h" - - -// liblzma itself doesn't use gettext to translate messages. -// Mark the strings still so that xz can translate them. -#define N_(msgid) msgid - - -///////////////////// -// String building // -///////////////////// - -/// How much memory to allocate for strings. For now, no realloc is used -/// so this needs to be big enough even though there of course is -/// an overflow check still. -/// -/// FIXME? Using a fixed size is wasteful if the application doesn't free -/// the string fairly quickly but this can be improved later if needed. -#define STR_ALLOC_SIZE 800 - - -typedef struct { - char *buf; - size_t pos; -} lzma_str; - - -static lzma_ret -str_init(lzma_str *str, const lzma_allocator *allocator) -{ - str->buf = lzma_alloc(STR_ALLOC_SIZE, allocator); - if (str->buf == NULL) - return LZMA_MEM_ERROR; - - str->pos = 0; - return LZMA_OK; -} - - -static void -str_free(lzma_str *str, const lzma_allocator *allocator) -{ - lzma_free(str->buf, allocator); - return; -} - - -static bool -str_is_full(const lzma_str *str) -{ - return str->pos == STR_ALLOC_SIZE - 1; -} - - -static lzma_ret -str_finish(char **dest, lzma_str *str, const lzma_allocator *allocator) -{ - if (str_is_full(str)) { - // The preallocated buffer was too small. - // This shouldn't happen as STR_ALLOC_SIZE should - // be adjusted if new filters are added. - lzma_free(str->buf, allocator); - *dest = NULL; - assert(0); - return LZMA_PROG_ERROR; - } - - str->buf[str->pos] = '\0'; - *dest = str->buf; - return LZMA_OK; -} - - -static void -str_append_str(lzma_str *str, const char *s) -{ - const size_t len = strlen(s); - const size_t limit = STR_ALLOC_SIZE - 1 - str->pos; - const size_t copy_size = my_min(len, limit); - - memcpy(str->buf + str->pos, s, copy_size); - str->pos += copy_size; - return; -} - - -static void -str_append_u32(lzma_str *str, uint32_t v, bool use_byte_suffix) -{ - if (v == 0) { - str_append_str(str, "0"); - } else { - // NOTE: Don't use plain "B" because xz and the parser in this - // file don't support it and at glance it may look like 8 - // (there cannot be a space before the suffix). - static const char suffixes[4][4] = { "", "KiB", "MiB", "GiB" }; - - size_t suf = 0; - if (use_byte_suffix) { - while ((v & 1023) == 0 - && suf < ARRAY_SIZE(suffixes) - 1) { - v >>= 10; - ++suf; - } - } - - // UINT32_MAX in base 10 would need 10 + 1 bytes. Remember - // that initializing to "" initializes all elements to - // zero so '\0'-termination gets handled by this. - char buf[16] = ""; - size_t pos = sizeof(buf) - 1; - - do { - buf[--pos] = '0' + (v % 10); - v /= 10; - } while (v != 0); - - str_append_str(str, buf + pos); - str_append_str(str, suffixes[suf]); - } - - return; -} - - -////////////////////////////////////////////// -// Parsing and stringification declarations // -////////////////////////////////////////////// - -/// Maximum length for filter and option names. -/// 11 chars + terminating '\0' + sizeof(uint32_t) = 16 bytes -#define NAME_LEN_MAX 11 - - -/// For option_map.flags: Use .u.map to do convert the input value -/// to an integer. Without this flag, .u.range.{min,max} are used -/// as the allowed range for the integer. -#define OPTMAP_USE_NAME_VALUE_MAP 0x01 - -/// For option_map.flags: Allow KiB/MiB/GiB in input string and use them in -/// the stringified output if the value is an exact multiple of these. -/// This is used e.g. for LZMA1/2 dictionary size. -#define OPTMAP_USE_BYTE_SUFFIX 0x02 - -/// For option_map.flags: If the integer value is zero then this option -/// won't be included in the stringified output. It's used e.g. for -/// BCJ filter start offset which usually is zero. -#define OPTMAP_NO_STRFY_ZERO 0x04 - -/// Possible values for option_map.type. Since OPTMAP_TYPE_UINT32 is 0, -/// it doesn't need to be specified in the initializers as it is -/// the implicit value. -enum { - OPTMAP_TYPE_UINT32, - OPTMAP_TYPE_LZMA_MODE, - OPTMAP_TYPE_LZMA_MATCH_FINDER, - OPTMAP_TYPE_LZMA_PRESET, -}; - - -/// This is for mapping string values in options to integers. -/// The last element of an array must have "" as the name. -/// It's used e.g. for match finder names in LZMA1/2. -typedef struct { - const char name[NAME_LEN_MAX + 1]; - const uint32_t value; -} name_value_map; - - -/// Each filter that has options needs an array of option_map structures. -/// The array doesn't need to be terminated as the functions take the -/// length of the array as an argument. -/// -/// When converting a string to filter options structure, option values -/// will be handled in a few different ways: -/// -/// (1) If .type equals OPTMAP_TYPE_LZMA_PRESET then LZMA1/2 preset string -/// is handled specially. -/// -/// (2) If .flags has OPTMAP_USE_NAME_VALUE_MAP set then the string is -/// converted to an integer using the name_value_map pointed by .u.map. -/// The last element in .u.map must have .name = "" as the terminator. -/// -/// (3) Otherwise the string is treated as a non-negative unsigned decimal -/// integer which must be in the range set in .u.range. If .flags has -/// OPTMAP_USE_BYTE_SUFFIX then KiB, MiB, and GiB suffixes are allowed. -/// -/// The integer value from (2) or (3) is then stored to filter_options -/// at the offset specified in .offset using the type specified in .type -/// (default is uint32_t). -/// -/// Stringifying a filter is done by processing a given number of options -/// in order from the beginning of an option_map array. The integer is -/// read from filter_options at .offset using the type from .type. -/// -/// If the integer is zero and .flags has OPTMAP_NO_STRFY_ZERO then the -/// option is skipped. -/// -/// If .flags has OPTMAP_USE_NAME_VALUE_MAP set then .u.map will be used -/// to convert the option to a string. If the map doesn't contain a string -/// for the integer value then "UNKNOWN" is used. -/// -/// If .flags doesn't have OPTMAP_USE_NAME_VALUE_MAP set then the integer is -/// converted to a decimal value. If OPTMAP_USE_BYTE_SUFFIX is used then KiB, -/// MiB, or GiB suffix is used if the value is an exact multiple of these. -/// Plain "B" suffix is never used. -typedef struct { - char name[NAME_LEN_MAX + 1]; - uint8_t type; - uint8_t flags; - uint16_t offset; - - union { - // NVHPC has problems with unions that contain pointers that - // are not the first members, so keep "map" at the top. - const name_value_map *map; - - struct { - uint32_t min; - uint32_t max; - } range; - } u; -} option_map; - - -static const char *parse_options(const char **const str, const char *str_end, - void *filter_options, - const option_map *const optmap, const size_t optmap_size); - - -///////// -// BCJ // -///////// - -#if defined(HAVE_ENCODER_X86) \ - || defined(HAVE_DECODER_X86) \ - || defined(HAVE_ENCODER_ARM) \ - || defined(HAVE_DECODER_ARM) \ - || defined(HAVE_ENCODER_ARMTHUMB) \ - || defined(HAVE_DECODER_ARMTHUMB) \ - || defined(HAVE_ENCODER_ARM64) \ - || defined(HAVE_DECODER_ARM64) \ - || defined(HAVE_ENCODER_POWERPC) \ - || defined(HAVE_DECODER_POWERPC) \ - || defined(HAVE_ENCODER_IA64) \ - || defined(HAVE_DECODER_IA64) \ - || defined(HAVE_ENCODER_SPARC) \ - || defined(HAVE_DECODER_SPARC) \ - || defined(HAVE_ENCODER_RISCV) \ - || defined(HAVE_DECODER_RISCV) -static const option_map bcj_optmap[] = { - { - .name = "start", - .flags = OPTMAP_NO_STRFY_ZERO | OPTMAP_USE_BYTE_SUFFIX, - .offset = offsetof(lzma_options_bcj, start_offset), - .u.range.min = 0, - .u.range.max = UINT32_MAX, - } -}; - - -static const char * -parse_bcj(const char **const str, const char *str_end, void *filter_options) -{ - // filter_options was zeroed on allocation and that is enough - // for the default value. - return parse_options(str, str_end, filter_options, - bcj_optmap, ARRAY_SIZE(bcj_optmap)); -} -#endif - - -/////////// -// Delta // -/////////// - -#if defined(HAVE_ENCODER_DELTA) || defined(HAVE_DECODER_DELTA) -static const option_map delta_optmap[] = { - { - .name = "dist", - .offset = offsetof(lzma_options_delta, dist), - .u.range.min = LZMA_DELTA_DIST_MIN, - .u.range.max = LZMA_DELTA_DIST_MAX, - } -}; - - -static const char * -parse_delta(const char **const str, const char *str_end, void *filter_options) -{ - lzma_options_delta *opts = filter_options; - opts->type = LZMA_DELTA_TYPE_BYTE; - opts->dist = LZMA_DELTA_DIST_MIN; - - return parse_options(str, str_end, filter_options, - delta_optmap, ARRAY_SIZE(delta_optmap)); -} -#endif - - -/////////////////// -// LZMA1 & LZMA2 // -/////////////////// - -/// Help string for presets -#define LZMA12_PRESET_STR "0-9[e]" - - -static const char * -parse_lzma12_preset(const char **const str, const char *str_end, - uint32_t *preset) -{ - assert(*str < str_end); - - if (!(**str >= '0' && **str <= '9')) - return N_("Unsupported preset"); - - *preset = (uint32_t)(**str - '0'); - - // NOTE: Remember to update LZMA12_PRESET_STR if this is modified! - while (++*str < str_end) { - switch (**str) { - case 'e': - *preset |= LZMA_PRESET_EXTREME; - break; - - default: - return N_("Unsupported flag in the preset"); - } - } - - return NULL; -} - - -static const char * -set_lzma12_preset(const char **const str, const char *str_end, - void *filter_options) -{ - uint32_t preset; - const char *errmsg = parse_lzma12_preset(str, str_end, &preset); - if (errmsg != NULL) - return errmsg; - - lzma_options_lzma *opts = filter_options; - if (lzma_lzma_preset(opts, preset)) - return N_("Unsupported preset"); - - return NULL; -} - - -static const name_value_map lzma12_mode_map[] = { - { "fast", LZMA_MODE_FAST }, - { "normal", LZMA_MODE_NORMAL }, - { "", 0 } -}; - - -static const name_value_map lzma12_mf_map[] = { - { "hc3", LZMA_MF_HC3 }, - { "hc4", LZMA_MF_HC4 }, - { "bt2", LZMA_MF_BT2 }, - { "bt3", LZMA_MF_BT3 }, - { "bt4", LZMA_MF_BT4 }, - { "", 0 } -}; - - -static const option_map lzma12_optmap[] = { - { - .name = "preset", - .type = OPTMAP_TYPE_LZMA_PRESET, - }, { - .name = "dict", - .flags = OPTMAP_USE_BYTE_SUFFIX, - .offset = offsetof(lzma_options_lzma, dict_size), - .u.range.min = LZMA_DICT_SIZE_MIN, - // FIXME? The max is really max for encoding but decoding - // would allow 4 GiB - 1 B. - .u.range.max = (UINT32_C(1) << 30) + (UINT32_C(1) << 29), - }, { - .name = "lc", - .offset = offsetof(lzma_options_lzma, lc), - .u.range.min = LZMA_LCLP_MIN, - .u.range.max = LZMA_LCLP_MAX, - }, { - .name = "lp", - .offset = offsetof(lzma_options_lzma, lp), - .u.range.min = LZMA_LCLP_MIN, - .u.range.max = LZMA_LCLP_MAX, - }, { - .name = "pb", - .offset = offsetof(lzma_options_lzma, pb), - .u.range.min = LZMA_PB_MIN, - .u.range.max = LZMA_PB_MAX, - }, { - .name = "mode", - .type = OPTMAP_TYPE_LZMA_MODE, - .flags = OPTMAP_USE_NAME_VALUE_MAP, - .offset = offsetof(lzma_options_lzma, mode), - .u.map = lzma12_mode_map, - }, { - .name = "nice", - .offset = offsetof(lzma_options_lzma, nice_len), - .u.range.min = 2, - .u.range.max = 273, - }, { - .name = "mf", - .type = OPTMAP_TYPE_LZMA_MATCH_FINDER, - .flags = OPTMAP_USE_NAME_VALUE_MAP, - .offset = offsetof(lzma_options_lzma, mf), - .u.map = lzma12_mf_map, - }, { - .name = "depth", - .offset = offsetof(lzma_options_lzma, depth), - .u.range.min = 0, - .u.range.max = UINT32_MAX, - } -}; - - -static const char * -parse_lzma12(const char **const str, const char *str_end, void *filter_options) -{ - lzma_options_lzma *opts = filter_options; - - // It cannot fail. - const bool preset_ret = lzma_lzma_preset(opts, LZMA_PRESET_DEFAULT); - assert(!preset_ret); - (void)preset_ret; - - const char *errmsg = parse_options(str, str_end, filter_options, - lzma12_optmap, ARRAY_SIZE(lzma12_optmap)); - if (errmsg != NULL) - return errmsg; - - if (opts->lc + opts->lp > LZMA_LCLP_MAX) - return N_("The sum of lc and lp must not exceed 4"); - - return NULL; -} - - -///////////////////////////////////////// -// Generic parsing and stringification // -///////////////////////////////////////// - -static const struct { - /// Name of the filter - char name[NAME_LEN_MAX + 1]; - - /// For lzma_str_to_filters: - /// Size of the filter-specific options structure. - uint32_t opts_size; - - /// Filter ID - lzma_vli id; - - /// For lzma_str_to_filters: - /// Function to parse the filter-specific options. The filter_options - /// will already have been allocated using lzma_alloc_zero(). - const char *(*parse)(const char **str, const char *str_end, - void *filter_options); - - /// For lzma_str_from_filters: - /// If the flag LZMA_STR_ENCODER is used then the first - /// strfy_encoder elements of optmap are stringified. - /// With LZMA_STR_DECODER strfy_decoder is used. - /// Currently encoders use all options that decoders do but if - /// that changes then this needs to be changed too, for example, - /// add a new OPTMAP flag to skip printing some decoder-only options. - const option_map *optmap; - uint8_t strfy_encoder; - uint8_t strfy_decoder; - - /// For lzma_str_from_filters: - /// If true, lzma_filter.options is allowed to be NULL. In that case, - /// only the filter name is printed without any options. - bool allow_null; - -} filter_name_map[] = { -#if defined (HAVE_ENCODER_LZMA1) || defined(HAVE_DECODER_LZMA1) - { "lzma1", sizeof(lzma_options_lzma), LZMA_FILTER_LZMA1, - &parse_lzma12, lzma12_optmap, 9, 5, false }, -#endif - -#if defined(HAVE_ENCODER_LZMA2) || defined(HAVE_DECODER_LZMA2) - { "lzma2", sizeof(lzma_options_lzma), LZMA_FILTER_LZMA2, - &parse_lzma12, lzma12_optmap, 9, 2, false }, -#endif - -#if defined(HAVE_ENCODER_X86) || defined(HAVE_DECODER_X86) - { "x86", sizeof(lzma_options_bcj), LZMA_FILTER_X86, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_ARM) || defined(HAVE_DECODER_ARM) - { "arm", sizeof(lzma_options_bcj), LZMA_FILTER_ARM, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_ARMTHUMB) || defined(HAVE_DECODER_ARMTHUMB) - { "armthumb", sizeof(lzma_options_bcj), LZMA_FILTER_ARMTHUMB, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_ARM64) || defined(HAVE_DECODER_ARM64) - { "arm64", sizeof(lzma_options_bcj), LZMA_FILTER_ARM64, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_RISCV) || defined(HAVE_DECODER_RISCV) - { "riscv", sizeof(lzma_options_bcj), LZMA_FILTER_RISCV, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_POWERPC) || defined(HAVE_DECODER_POWERPC) - { "powerpc", sizeof(lzma_options_bcj), LZMA_FILTER_POWERPC, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_IA64) || defined(HAVE_DECODER_IA64) - { "ia64", sizeof(lzma_options_bcj), LZMA_FILTER_IA64, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_SPARC) || defined(HAVE_DECODER_SPARC) - { "sparc", sizeof(lzma_options_bcj), LZMA_FILTER_SPARC, - &parse_bcj, bcj_optmap, 1, 1, true }, -#endif - -#if defined(HAVE_ENCODER_DELTA) || defined(HAVE_DECODER_DELTA) - { "delta", sizeof(lzma_options_delta), LZMA_FILTER_DELTA, - &parse_delta, delta_optmap, 1, 1, false }, -#endif -}; - - -/// Decodes options from a string for one filter (name1=value1,name2=value2). -/// Caller must have allocated memory for filter_options already and set -/// the initial default values. This is called from the filter-specific -/// parse_* functions. -/// -/// The input string starts at *str and the address in str_end is the first -/// char that is not part of the string anymore. So no '\0' terminator is -/// used. *str is advanced every time something has been decoded successfully. -static const char * -parse_options(const char **const str, const char *str_end, - void *filter_options, - const option_map *const optmap, const size_t optmap_size) -{ - while (*str < str_end && **str != '\0') { - // Each option is of the form name=value. - // Commas (',') separate options. Extra commas are ignored. - // Ignoring extra commas makes it simpler if an optional - // option stored in a shell variable which can be empty. - if (**str == ',') { - ++*str; - continue; - } - - // Find where the next name=value ends. - const size_t str_len = (size_t)(str_end - *str); - const char *name_eq_value_end = memchr(*str, ',', str_len); - if (name_eq_value_end == NULL) - name_eq_value_end = str_end; - - const char *equals_sign = memchr(*str, '=', - (size_t)(name_eq_value_end - *str)); - - // Fail if the '=' wasn't found or the option name is missing - // (the first char is '='). - if (equals_sign == NULL || **str == '=') - return N_("Options must be 'name=value' pairs " - "separated with commas"); - - // Reject a too long option name so that the memcmp() - // in the loop below won't read past the end of the - // string in optmap[i].name. - const size_t name_len = (size_t)(equals_sign - *str); - if (name_len > NAME_LEN_MAX) - return N_("Unknown option name"); - - // Find the option name from optmap[]. - size_t i = 0; - while (true) { - if (i == optmap_size) - return N_("Unknown option name"); - - if (memcmp(*str, optmap[i].name, name_len) == 0 - && optmap[i].name[name_len] == '\0') - break; - - ++i; - } - - // The input string is good at least until the start of - // the option value. - *str = equals_sign + 1; - - // The code assumes that the option value isn't an empty - // string so check it here. - const size_t value_len = (size_t)(name_eq_value_end - *str); - if (value_len == 0) - return N_("Option value cannot be empty"); - - // LZMA1/2 preset has its own parsing function. - if (optmap[i].type == OPTMAP_TYPE_LZMA_PRESET) { - const char *errmsg = set_lzma12_preset(str, - name_eq_value_end, filter_options); - if (errmsg != NULL) - return errmsg; - - continue; - } - - // It's an integer value. - uint32_t v; - if (optmap[i].flags & OPTMAP_USE_NAME_VALUE_MAP) { - // The integer is picked from a string-to-integer map. - // - // Reject a too long value string so that the memcmp() - // in the loop below won't read past the end of the - // string in optmap[i].u.map[j].name. - if (value_len > NAME_LEN_MAX) - return N_("Invalid option value"); - - const name_value_map *map = optmap[i].u.map; - size_t j = 0; - while (true) { - // The array is terminated with an empty name. - if (map[j].name[0] == '\0') - return N_("Invalid option value"); - - if (memcmp(*str, map[j].name, value_len) == 0 - && map[j].name[value_len] - == '\0') { - v = map[j].value; - break; - } - - ++j; - } - } else if (**str < '0' || **str > '9') { - // Note that "max" isn't supported while it is - // supported in xz. It's not useful here. - return N_("Value is not a non-negative " - "decimal integer"); - } else { - // strtoul() has locale-specific behavior so it cannot - // be relied on to get reproducible results since we - // cannot change the locate in a thread-safe library. - // It also needs '\0'-termination. - // - // Use a temporary pointer so that *str will point - // to the beginning of the value string in case - // an error occurs. - const char *p = *str; - v = 0; - do { - if (v > UINT32_MAX / 10) - return N_("Value out of range"); - - v *= 10; - - const uint32_t add = (uint32_t)(*p - '0'); - if (UINT32_MAX - add < v) - return N_("Value out of range"); - - v += add; - ++p; - } while (p < name_eq_value_end - && *p >= '0' && *p <= '9'); - - if (p < name_eq_value_end) { - // Remember this position so that it can be - // used for error messages that are - // specifically about the suffix. (Out of - // range values are about the whole value - // and those error messages point to the - // beginning of the number part, - // not to the suffix.) - const char *multiplier_start = p; - - // If multiplier suffix shouldn't be used - // then don't allow them even if the value - // would stay within limits. This is a somewhat - // unnecessary check but it rejects silly - // things like lzma2:pb=0MiB which xz allows. - if ((optmap[i].flags & OPTMAP_USE_BYTE_SUFFIX) - == 0) { - *str = multiplier_start; - return N_("This option does not " - "support any multiplier " - "suffixes"); - } - - uint32_t shift; - - switch (*p) { - case 'k': - case 'K': - shift = 10; - break; - - case 'm': - case 'M': - shift = 20; - break; - - case 'g': - case 'G': - shift = 30; - break; - - default: - *str = multiplier_start; - - // TRANSLATORS: Don't translate the - // suffixes "KiB", "MiB", or "GiB" - // because a user can only specify - // untranslated suffixes. - return N_("Invalid multiplier suffix " - "(KiB, MiB, or GiB)"); - } - - ++p; - - // Allow "M", "Mi", "MB", "MiB" and the same - // for the other five characters from the - // switch-statement above. All are handled - // as base-2 (perhaps a mistake, perhaps not). - // Note that 'i' and 'B' are case sensitive. - if (p < name_eq_value_end && *p == 'i') - ++p; - - if (p < name_eq_value_end && *p == 'B') - ++p; - - // Now we must have no chars remaining. - if (p < name_eq_value_end) { - *str = multiplier_start; - return N_("Invalid multiplier suffix " - "(KiB, MiB, or GiB)"); - } - - if (v > (UINT32_MAX >> shift)) - return N_("Value out of range"); - - v <<= shift; - } - - if (v < optmap[i].u.range.min - || v > optmap[i].u.range.max) - return N_("Value out of range"); - } - - // Set the value in filter_options. Enums are handled - // specially since the underlying type isn't the same - // as uint32_t on all systems. - void *ptr = (char *)filter_options + optmap[i].offset; - switch (optmap[i].type) { - case OPTMAP_TYPE_LZMA_MODE: - *(lzma_mode *)ptr = (lzma_mode)v; - break; - - case OPTMAP_TYPE_LZMA_MATCH_FINDER: - *(lzma_match_finder *)ptr = (lzma_match_finder)v; - break; - - default: - *(uint32_t *)ptr = v; - break; - } - - // This option has been successfully handled. - *str = name_eq_value_end; - } - - // No errors. - return NULL; -} - - -/// Finds the name of the filter at the beginning of the string and -/// calls filter_name_map[i].parse() to decode the filter-specific options. -/// The caller must have set str_end so that exactly one filter and its -/// options are present without any trailing characters. -static const char * -parse_filter(const char **const str, const char *str_end, lzma_filter *filter, - const lzma_allocator *allocator, bool only_xz) -{ - // Search for a colon or equals sign that would separate the filter - // name from filter options. If neither is found, then the input - // string only contains a filter name and there are no options. - // - // First assume that a colon or equals sign won't be found: - const char *name_end = str_end; - const char *opts_start = str_end; - - for (const char *p = *str; p < str_end; ++p) { - if (*p == ':' || *p == '=') { - name_end = p; - - // Filter options (name1=value1,name2=value2,...) - // begin after the colon or equals sign. - opts_start = p + 1; - break; - } - } - - // Reject a too long filter name so that the memcmp() - // in the loop below won't read past the end of the - // string in filter_name_map[i].name. - const size_t name_len = (size_t)(name_end - *str); - if (name_len > NAME_LEN_MAX) - return N_("Unknown filter name"); - - for (size_t i = 0; i < ARRAY_SIZE(filter_name_map); ++i) { - if (memcmp(*str, filter_name_map[i].name, name_len) == 0 - && filter_name_map[i].name[name_len] == '\0') { - if (only_xz && filter_name_map[i].id - >= LZMA_FILTER_RESERVED_START) - return N_("This filter cannot be used in " - "the .xz format"); - - // Allocate the filter-specific options and - // initialize the memory with zeros. - void *options = lzma_alloc_zero( - filter_name_map[i].opts_size, - allocator); - if (options == NULL) - return N_("Memory allocation failed"); - - // Filter name was found so the input string is good - // at least this far. - *str = opts_start; - - const char *errmsg = filter_name_map[i].parse( - str, str_end, options); - if (errmsg != NULL) { - lzma_free(options, allocator); - return errmsg; - } - - // *filter is modified only when parsing is successful. - filter->id = filter_name_map[i].id; - filter->options = options; - return NULL; - } - } - - return N_("Unknown filter name"); -} - - -/// Converts the string to a filter chain (array of lzma_filter structures). -/// -/// *str is advanced every time something has been decoded successfully. -/// This way the caller knows where in the string a possible error occurred. -static const char * -str_to_filters(const char **const str, lzma_filter *filters, uint32_t flags, - const lzma_allocator *allocator) -{ - const char *errmsg; - - // Skip leading spaces. - while (**str == ' ') - ++*str; - - if (**str == '\0') - return N_("Empty string is not allowed, " - "try '6' if a default value is needed"); - - // Detect the type of the string. - // - // A string beginning with a digit or a string beginning with - // one dash and a digit are treated as presets. Trailing spaces - // will be ignored too (leading spaces were already ignored above). - // - // For example, "6", "7 ", "-9e", or " -3 " are treated as presets. - // Strings like "-" or "- " aren't preset. -#define MY_IS_DIGIT(c) ((c) >= '0' && (c) <= '9') - if (MY_IS_DIGIT(**str) || (**str == '-' && MY_IS_DIGIT((*str)[1]))) { - if (**str == '-') - ++*str; - - // Ignore trailing spaces. - const size_t str_len = strlen(*str); - const char *str_end = memchr(*str, ' ', str_len); - if (str_end != NULL) { - // There is at least one trailing space. Check that - // there are no chars other than spaces. - for (size_t i = 1; str_end[i] != '\0'; ++i) - if (str_end[i] != ' ') - return N_("Unsupported preset"); - } else { - // There are no trailing spaces. Use the whole string. - str_end = *str + str_len; - } - - uint32_t preset; - errmsg = parse_lzma12_preset(str, str_end, &preset); - if (errmsg != NULL) - return errmsg; - - lzma_options_lzma *opts = lzma_alloc(sizeof(*opts), allocator); - if (opts == NULL) - return N_("Memory allocation failed"); - - if (lzma_lzma_preset(opts, preset)) { - lzma_free(opts, allocator); - return N_("Unsupported preset"); - } - - filters[0].id = LZMA_FILTER_LZMA2; - filters[0].options = opts; - filters[1].id = LZMA_VLI_UNKNOWN; - filters[1].options = NULL; - - return NULL; - } - - // Not a preset so it must be a filter chain. - // - // If LZMA_STR_ALL_FILTERS isn't used we allow only filters that - // can be used in .xz. - const bool only_xz = (flags & LZMA_STR_ALL_FILTERS) == 0; - - // Use a temporary array so that we don't modify the caller-supplied - // one until we know that no errors occurred. - lzma_filter temp_filters[LZMA_FILTERS_MAX + 1]; - - size_t i = 0; - do { - if (i == LZMA_FILTERS_MAX) { - errmsg = N_("The maximum number of filters is four"); - goto error; - } - - // Skip "--" if present. - if ((*str)[0] == '-' && (*str)[1] == '-') - *str += 2; - - // Locate the end of "filter:name1=value1,name2=value2", - // stopping at the first "--" or a single space. - const char *filter_end = *str; - while (filter_end[0] != '\0') { - if ((filter_end[0] == '-' && filter_end[1] == '-') - || filter_end[0] == ' ') - break; - - ++filter_end; - } - - // Inputs that have "--" at the end or "-- " in the middle - // will result in an empty filter name. - if (filter_end == *str) { - errmsg = N_("Filter name is missing"); - goto error; - } - - errmsg = parse_filter(str, filter_end, &temp_filters[i], - allocator, only_xz); - if (errmsg != NULL) - goto error; - - // Skip trailing spaces. - while (**str == ' ') - ++*str; - - ++i; - } while (**str != '\0'); - - // Seems to be good, terminate the array so that - // basic validation can be done. - temp_filters[i].id = LZMA_VLI_UNKNOWN; - temp_filters[i].options = NULL; - - // Do basic validation if the application didn't prohibit it. - if ((flags & LZMA_STR_NO_VALIDATION) == 0) { - size_t dummy; - const lzma_ret ret = lzma_validate_chain(temp_filters, &dummy); - assert(ret == LZMA_OK || ret == LZMA_OPTIONS_ERROR); - if (ret != LZMA_OK) { - errmsg = N_("Invalid filter chain " - "('lzma2' missing at the end?)"); - goto error; - } - } - - // All good. Copy the filters to the application supplied array. - memcpy(filters, temp_filters, (i + 1) * sizeof(lzma_filter)); - return NULL; - -error: - // Free the filter options that were successfully decoded. - while (i-- > 0) - lzma_free(temp_filters[i].options, allocator); - - return errmsg; -} - - -extern LZMA_API(const char *) -lzma_str_to_filters(const char *str, int *error_pos, lzma_filter *filters, - uint32_t flags, const lzma_allocator *allocator) -{ - // If error_pos isn't NULL, *error_pos must always be set. - // liblzma <= 5.4.6 and <= 5.6.1 have a bug and don't do this - // when str == NULL or filters == NULL or flags are unsupported. - if (error_pos != NULL) - *error_pos = 0; - - if (str == NULL || filters == NULL) { - // Don't translate this because it's only shown in case of - // a programming error. - return "Unexpected NULL pointer argument(s) " - "to lzma_str_to_filters()"; - } - - // Validate the flags. - const uint32_t supported_flags - = LZMA_STR_ALL_FILTERS - | LZMA_STR_NO_VALIDATION; - - if (flags & ~supported_flags) { - // This message is possible only if the caller uses flags - // that are only supported in a newer liblzma version (or - // the flags are simply buggy). Don't translate this at least - // when liblzma itself doesn't use gettext; xz and liblzma - // are usually upgraded at the same time. - return "Unsupported flags to lzma_str_to_filters()"; - } - - const char *used = str; - const char *errmsg = str_to_filters(&used, filters, flags, allocator); - - if (error_pos != NULL) { - const size_t n = (size_t)(used - str); - *error_pos = n > INT_MAX ? INT_MAX : (int)n; - } - - return errmsg; -} - - -/// Converts options of one filter to a string. -/// -/// The caller must have already put the filter name in the destination -/// string. Since it is possible that no options will be needed, the caller -/// won't have put a delimiter character (':' or '=') in the string yet. -/// We will add it if at least one option will be added to the string. -static void -strfy_filter(lzma_str *dest, const char *delimiter, - const option_map *optmap, size_t optmap_count, - const void *filter_options) -{ - for (size_t i = 0; i < optmap_count; ++i) { - // No attempt is made to reverse LZMA1/2 preset. - if (optmap[i].type == OPTMAP_TYPE_LZMA_PRESET) - continue; - - // All options have integer values, some just are mapped - // to a string with a name_value_map. LZMA1/2 preset - // isn't reversed back to preset=PRESET form. - uint32_t v; - const void *ptr - = (const char *)filter_options + optmap[i].offset; - switch (optmap[i].type) { - case OPTMAP_TYPE_LZMA_MODE: - v = *(const lzma_mode *)ptr; - break; - - case OPTMAP_TYPE_LZMA_MATCH_FINDER: - v = *(const lzma_match_finder *)ptr; - break; - - default: - v = *(const uint32_t *)ptr; - break; - } - - // Skip this if this option should be omitted from - // the string when the value is zero. - if (v == 0 && (optmap[i].flags & OPTMAP_NO_STRFY_ZERO)) - continue; - - // Before the first option we add whatever delimiter - // the caller gave us. For later options a comma is used. - str_append_str(dest, delimiter); - delimiter = ","; - - // Add the option name and equals sign. - str_append_str(dest, optmap[i].name); - str_append_str(dest, "="); - - if (optmap[i].flags & OPTMAP_USE_NAME_VALUE_MAP) { - const name_value_map *map = optmap[i].u.map; - size_t j = 0; - while (true) { - if (map[j].name[0] == '\0') { - str_append_str(dest, "UNKNOWN"); - break; - } - - if (map[j].value == v) { - str_append_str(dest, map[j].name); - break; - } - - ++j; - } - } else { - str_append_u32(dest, v, - optmap[i].flags & OPTMAP_USE_BYTE_SUFFIX); - } - } - - return; -} - - -extern LZMA_API(lzma_ret) -lzma_str_from_filters(char **output_str, const lzma_filter *filters, - uint32_t flags, const lzma_allocator *allocator) -{ - // On error *output_str is always set to NULL. - // Do it as the very first step. - if (output_str == NULL) - return LZMA_PROG_ERROR; - - *output_str = NULL; - - if (filters == NULL) - return LZMA_PROG_ERROR; - - // Validate the flags. - const uint32_t supported_flags - = LZMA_STR_ENCODER - | LZMA_STR_DECODER - | LZMA_STR_GETOPT_LONG - | LZMA_STR_NO_SPACES; - - if (flags & ~supported_flags) - return LZMA_OPTIONS_ERROR; - - // There must be at least one filter. - if (filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_OPTIONS_ERROR; - - // Allocate memory for the output string. - lzma_str dest; - return_if_error(str_init(&dest, allocator)); - - const bool show_opts = (flags & (LZMA_STR_ENCODER | LZMA_STR_DECODER)); - - const char *opt_delim = (flags & LZMA_STR_GETOPT_LONG) ? "=" : ":"; - - for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i) { - // If we reach LZMA_FILTERS_MAX, then the filters array - // is too large since the ID cannot be LZMA_VLI_UNKNOWN here. - if (i == LZMA_FILTERS_MAX) { - str_free(&dest, allocator); - return LZMA_OPTIONS_ERROR; - } - - // Don't add a space between filters if the caller - // doesn't want them. - if (i > 0 && !(flags & LZMA_STR_NO_SPACES)) - str_append_str(&dest, " "); - - // Use dashes for xz getopt_long() compatible syntax but also - // use dashes to separate filters when spaces weren't wanted. - if ((flags & LZMA_STR_GETOPT_LONG) - || (i > 0 && (flags & LZMA_STR_NO_SPACES))) - str_append_str(&dest, "--"); - - size_t j = 0; - while (true) { - if (j == ARRAY_SIZE(filter_name_map)) { - // Filter ID in filters[i].id isn't supported. - str_free(&dest, allocator); - return LZMA_OPTIONS_ERROR; - } - - if (filter_name_map[j].id == filters[i].id) { - // Add the filter name. - str_append_str(&dest, filter_name_map[j].name); - - // If only the filter names were wanted then - // skip to the next filter. In this case - // .options is ignored and may be NULL even - // when the filter doesn't allow NULL options. - if (!show_opts) - break; - - if (filters[i].options == NULL) { - if (!filter_name_map[j].allow_null) { - // Filter-specific options - // are missing but with - // this filter the options - // structure is mandatory. - str_free(&dest, allocator); - return LZMA_OPTIONS_ERROR; - } - - // .options is allowed to be NULL. - // There is no need to add any - // options to the string. - break; - } - - // Options structure is available. Add - // the filter options to the string. - const size_t optmap_count - = (flags & LZMA_STR_ENCODER) - ? filter_name_map[j].strfy_encoder - : filter_name_map[j].strfy_decoder; - strfy_filter(&dest, opt_delim, - filter_name_map[j].optmap, - optmap_count, - filters[i].options); - break; - } - - ++j; - } - } - - return str_finish(output_str, &dest, allocator); -} - - -extern LZMA_API(lzma_ret) -lzma_str_list_filters(char **output_str, lzma_vli filter_id, uint32_t flags, - const lzma_allocator *allocator) -{ - // On error *output_str is always set to NULL. - // Do it as the very first step. - if (output_str == NULL) - return LZMA_PROG_ERROR; - - *output_str = NULL; - - // Validate the flags. - const uint32_t supported_flags - = LZMA_STR_ALL_FILTERS - | LZMA_STR_ENCODER - | LZMA_STR_DECODER - | LZMA_STR_GETOPT_LONG; - - if (flags & ~supported_flags) - return LZMA_OPTIONS_ERROR; - - // Allocate memory for the output string. - lzma_str dest; - return_if_error(str_init(&dest, allocator)); - - // If only listing the filter names then separate them with spaces. - // Otherwise use newlines. - const bool show_opts = (flags & (LZMA_STR_ENCODER | LZMA_STR_DECODER)); - const char *filter_delim = show_opts ? "\n" : " "; - - const char *opt_delim = (flags & LZMA_STR_GETOPT_LONG) ? "=" : ":"; - bool first_filter_printed = false; - - for (size_t i = 0; i < ARRAY_SIZE(filter_name_map); ++i) { - // If we are printing only one filter then skip others. - if (filter_id != LZMA_VLI_UNKNOWN - && filter_id != filter_name_map[i].id) - continue; - - // If we are printing only .xz filters then skip the others. - if (filter_name_map[i].id >= LZMA_FILTER_RESERVED_START - && (flags & LZMA_STR_ALL_FILTERS) == 0 - && filter_id == LZMA_VLI_UNKNOWN) - continue; - - // Add a new line if this isn't the first filter being - // written to the string. - if (first_filter_printed) - str_append_str(&dest, filter_delim); - - first_filter_printed = true; - - if (flags & LZMA_STR_GETOPT_LONG) - str_append_str(&dest, "--"); - - str_append_str(&dest, filter_name_map[i].name); - - // If only the filter names were wanted then continue - // to the next filter. - if (!show_opts) - continue; - - const option_map *optmap = filter_name_map[i].optmap; - const char *d = opt_delim; - - const size_t end = (flags & LZMA_STR_ENCODER) - ? filter_name_map[i].strfy_encoder - : filter_name_map[i].strfy_decoder; - - for (size_t j = 0; j < end; ++j) { - // The first option is delimited from the filter - // name using "=" or ":" and the rest of the options - // are separated with ",". - str_append_str(&dest, d); - d = ","; - - // optname= - str_append_str(&dest, optmap[j].name); - str_append_str(&dest, "=<"); - - if (optmap[j].type == OPTMAP_TYPE_LZMA_PRESET) { - // LZMA1/2 preset has its custom help string. - str_append_str(&dest, LZMA12_PRESET_STR); - } else if (optmap[j].flags - & OPTMAP_USE_NAME_VALUE_MAP) { - // Separate the possible option values by "|". - const name_value_map *m = optmap[j].u.map; - for (size_t k = 0; m[k].name[0] != '\0'; ++k) { - if (k > 0) - str_append_str(&dest, "|"); - - str_append_str(&dest, m[k].name); - } - } else { - // Integer range is shown as min-max. - const bool use_byte_suffix = optmap[j].flags - & OPTMAP_USE_BYTE_SUFFIX; - str_append_u32(&dest, optmap[j].u.range.min, - use_byte_suffix); - str_append_str(&dest, "-"); - str_append_u32(&dest, optmap[j].u.range.max, - use_byte_suffix); - } - - str_append_str(&dest, ">"); - } - } - - // If no filters were added to the string then it must be because - // the caller provided an unsupported Filter ID. - if (!first_filter_printed) { - str_free(&dest, allocator); - return LZMA_OPTIONS_ERROR; - } - - return str_finish(output_str, &dest, allocator); -} diff --git a/software/src/xz/src/liblzma/common/vli_decoder.c b/software/src/xz/src/liblzma/common/vli_decoder.c deleted file mode 100644 index 3254ccc..0000000 --- a/software/src/xz/src/liblzma/common/vli_decoder.c +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file vli_decoder.c -/// \brief Decodes variable-length integers -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -extern LZMA_API(lzma_ret) -lzma_vli_decode(lzma_vli *restrict vli, size_t *vli_pos, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size) -{ - // If we haven't been given vli_pos, work in single-call mode. - size_t vli_pos_internal = 0; - if (vli_pos == NULL) { - vli_pos = &vli_pos_internal; - *vli = 0; - - // If there's no input, use LZMA_DATA_ERROR. This way it is - // easy to decode VLIs from buffers that have known size, - // and get the correct error code in case the buffer is - // too short. - if (*in_pos >= in_size) - return LZMA_DATA_ERROR; - - } else { - // Initialize *vli when starting to decode a new integer. - if (*vli_pos == 0) - *vli = 0; - - // Validate the arguments. - if (*vli_pos >= LZMA_VLI_BYTES_MAX - || (*vli >> (*vli_pos * 7)) != 0) - return LZMA_PROG_ERROR;; - - if (*in_pos >= in_size) - return LZMA_BUF_ERROR; - } - - do { - // Read the next byte. Use a temporary variable so that we - // can update *in_pos immediately. - const uint8_t byte = in[*in_pos]; - ++*in_pos; - - // Add the newly read byte to *vli. - *vli += (lzma_vli)(byte & 0x7F) << (*vli_pos * 7); - ++*vli_pos; - - // Check if this is the last byte of a multibyte integer. - if ((byte & 0x80) == 0) { - // We don't allow using variable-length integers as - // padding i.e. the encoding must use the most the - // compact form. - if (byte == 0x00 && *vli_pos > 1) - return LZMA_DATA_ERROR; - - return vli_pos == &vli_pos_internal - ? LZMA_OK : LZMA_STREAM_END; - } - - // There is at least one more byte coming. If we have already - // read maximum number of bytes, the integer is considered - // corrupt. - // - // If we need bigger integers in future, old versions liblzma - // will confusingly indicate the file being corrupt instead of - // unsupported. I suppose it's still better this way, because - // in the foreseeable future (writing this in 2008) the only - // reason why files would appear having over 63-bit integers - // is that the files are simply corrupt. - if (*vli_pos == LZMA_VLI_BYTES_MAX) - return LZMA_DATA_ERROR; - - } while (*in_pos < in_size); - - return vli_pos == &vli_pos_internal ? LZMA_DATA_ERROR : LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/common/vli_encoder.c b/software/src/xz/src/liblzma/common/vli_encoder.c deleted file mode 100644 index 3859006..0000000 --- a/software/src/xz/src/liblzma/common/vli_encoder.c +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file vli_encoder.c -/// \brief Encodes variable-length integers -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -extern LZMA_API(lzma_ret) -lzma_vli_encode(lzma_vli vli, size_t *vli_pos, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size) -{ - // If we haven't been given vli_pos, work in single-call mode. - size_t vli_pos_internal = 0; - if (vli_pos == NULL) { - vli_pos = &vli_pos_internal; - - // In single-call mode, we expect that the caller has - // reserved enough output space. - if (*out_pos >= out_size) - return LZMA_PROG_ERROR; - } else { - // This never happens when we are called by liblzma, but - // may happen if called directly from an application. - if (*out_pos >= out_size) - return LZMA_BUF_ERROR; - } - - // Validate the arguments. - if (*vli_pos >= LZMA_VLI_BYTES_MAX || vli > LZMA_VLI_MAX) - return LZMA_PROG_ERROR; - - // Shift vli so that the next bits to encode are the lowest. In - // single-call mode this never changes vli since *vli_pos is zero. - vli >>= *vli_pos * 7; - - // Write the non-last bytes in a loop. - while (vli >= 0x80) { - // We don't need *vli_pos during this function call anymore, - // but update it here so that it is ready if we need to - // return before the whole integer has been decoded. - ++*vli_pos; - assert(*vli_pos < LZMA_VLI_BYTES_MAX); - - // Write the next byte. - out[*out_pos] = (uint8_t)(vli) | 0x80; - vli >>= 7; - - if (++*out_pos == out_size) - return vli_pos == &vli_pos_internal - ? LZMA_PROG_ERROR : LZMA_OK; - } - - // Write the last byte. - out[*out_pos] = (uint8_t)(vli); - ++*out_pos; - ++*vli_pos; - - return vli_pos == &vli_pos_internal ? LZMA_OK : LZMA_STREAM_END; - -} diff --git a/software/src/xz/src/liblzma/common/vli_size.c b/software/src/xz/src/liblzma/common/vli_size.c deleted file mode 100644 index c8cb2ec..0000000 --- a/software/src/xz/src/liblzma/common/vli_size.c +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file vli_size.c -/// \brief Calculates the encoded size of a variable-length integer -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -extern LZMA_API(uint32_t) -lzma_vli_size(lzma_vli vli) -{ - if (vli > LZMA_VLI_MAX) - return 0; - - uint32_t i = 0; - do { - vli >>= 7; - ++i; - } while (vli != 0); - - assert(i <= LZMA_VLI_BYTES_MAX); - return i; -} diff --git a/software/src/xz/src/liblzma/delta/Makefile.inc b/software/src/xz/src/liblzma/delta/Makefile.inc deleted file mode 100644 index e5b919e..0000000 --- a/software/src/xz/src/liblzma/delta/Makefile.inc +++ /dev/null @@ -1,19 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -liblzma_la_SOURCES += \ - delta/delta_common.c \ - delta/delta_common.h \ - delta/delta_private.h - -if COND_ENCODER_DELTA -liblzma_la_SOURCES += \ - delta/delta_encoder.c \ - delta/delta_encoder.h -endif - -if COND_DECODER_DELTA -liblzma_la_SOURCES += \ - delta/delta_decoder.c \ - delta/delta_decoder.h -endif diff --git a/software/src/xz/src/liblzma/delta/delta_common.c b/software/src/xz/src/liblzma/delta/delta_common.c deleted file mode 100644 index 5dbe253..0000000 --- a/software/src/xz/src/liblzma/delta/delta_common.c +++ /dev/null @@ -1,72 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_common.c -/// \brief Common stuff for Delta encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "delta_common.h" -#include "delta_private.h" - - -static void -delta_coder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_delta_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -extern lzma_ret -lzma_delta_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - // Allocate memory for the decoder if needed. - lzma_delta_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_delta_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - - // End function is the same for encoder and decoder. - next->end = &delta_coder_end; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Validate the options. - if (lzma_delta_coder_memusage(filters[0].options) == UINT64_MAX) - return LZMA_OPTIONS_ERROR; - - // Set the delta distance. - const lzma_options_delta *opt = filters[0].options; - coder->distance = opt->dist; - - // Initialize the rest of the variables. - coder->pos = 0; - memzero(coder->history, LZMA_DELTA_DIST_MAX); - - // Initialize the next decoder in the chain, if any. - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} - - -extern uint64_t -lzma_delta_coder_memusage(const void *options) -{ - const lzma_options_delta *opt = options; - - if (opt == NULL || opt->type != LZMA_DELTA_TYPE_BYTE - || opt->dist < LZMA_DELTA_DIST_MIN - || opt->dist > LZMA_DELTA_DIST_MAX) - return UINT64_MAX; - - return sizeof(lzma_delta_coder); -} diff --git a/software/src/xz/src/liblzma/delta/delta_common.h b/software/src/xz/src/liblzma/delta/delta_common.h deleted file mode 100644 index bd09127..0000000 --- a/software/src/xz/src/liblzma/delta/delta_common.h +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_common.h -/// \brief Common stuff for Delta encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_DELTA_COMMON_H -#define LZMA_DELTA_COMMON_H - -#include "common.h" - -extern uint64_t lzma_delta_coder_memusage(const void *options); - -#endif diff --git a/software/src/xz/src/liblzma/delta/delta_decoder.c b/software/src/xz/src/liblzma/delta/delta_decoder.c deleted file mode 100644 index 9f0d49c..0000000 --- a/software/src/xz/src/liblzma/delta/delta_decoder.c +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_decoder.c -/// \brief Delta filter decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "delta_decoder.h" -#include "delta_private.h" - - -static void -decode_buffer(lzma_delta_coder *coder, uint8_t *buffer, size_t size) -{ - const size_t distance = coder->distance; - - for (size_t i = 0; i < size; ++i) { - buffer[i] += coder->history[(distance + coder->pos) & 0xFF]; - coder->history[coder->pos-- & 0xFF] = buffer[i]; - } -} - - -// For an unknown reason NVIDIA HPC Compiler needs this pragma -// to produce working code. -#ifdef __NVCOMPILER -# pragma routine novector -#endif -static lzma_ret -delta_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_delta_coder *coder = coder_ptr; - - assert(coder->next.code != NULL); - - const size_t out_start = *out_pos; - - const lzma_ret ret = coder->next.code(coder->next.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - action); - - // out might be NULL. In that case size == 0. Null pointer + 0 is - // undefined behavior so skip the call in that case as it would - // do nothing anyway. - const size_t size = *out_pos - out_start; - if (size > 0) - decode_buffer(coder, out + out_start, size); - - return ret; -} - - -extern lzma_ret -lzma_delta_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - next->code = &delta_decode; - return lzma_delta_coder_init(next, allocator, filters); -} - - -extern lzma_ret -lzma_delta_props_decode(void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - if (props_size != 1) - return LZMA_OPTIONS_ERROR; - - lzma_options_delta *opt - = lzma_alloc(sizeof(lzma_options_delta), allocator); - if (opt == NULL) - return LZMA_MEM_ERROR; - - opt->type = LZMA_DELTA_TYPE_BYTE; - opt->dist = props[0] + 1U; - - *options = opt; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/delta/delta_decoder.h b/software/src/xz/src/liblzma/delta/delta_decoder.h deleted file mode 100644 index e2268ed..0000000 --- a/software/src/xz/src/liblzma/delta/delta_decoder.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_decoder.h -/// \brief Delta filter decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_DELTA_DECODER_H -#define LZMA_DELTA_DECODER_H - -#include "delta_common.h" - -extern lzma_ret lzma_delta_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_delta_props_decode( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - -#endif diff --git a/software/src/xz/src/liblzma/delta/delta_encoder.c b/software/src/xz/src/liblzma/delta/delta_encoder.c deleted file mode 100644 index ba4a50b..0000000 --- a/software/src/xz/src/liblzma/delta/delta_encoder.c +++ /dev/null @@ -1,132 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_encoder.c -/// \brief Delta filter encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "delta_encoder.h" -#include "delta_private.h" - - -/// Copies and encodes the data at the same time. This is used when Delta -/// is the first filter in the chain (and thus the last filter in the -/// encoder's filter stack). -static void -copy_and_encode(lzma_delta_coder *coder, - const uint8_t *restrict in, uint8_t *restrict out, size_t size) -{ - const size_t distance = coder->distance; - - for (size_t i = 0; i < size; ++i) { - const uint8_t tmp = coder->history[ - (distance + coder->pos) & 0xFF]; - coder->history[coder->pos-- & 0xFF] = in[i]; - out[i] = in[i] - tmp; - } -} - - -/// Encodes the data in place. This is used when we are the last filter -/// in the chain (and thus non-last filter in the encoder's filter stack). -static void -encode_in_place(lzma_delta_coder *coder, uint8_t *buffer, size_t size) -{ - const size_t distance = coder->distance; - - for (size_t i = 0; i < size; ++i) { - const uint8_t tmp = coder->history[ - (distance + coder->pos) & 0xFF]; - coder->history[coder->pos-- & 0xFF] = buffer[i]; - buffer[i] -= tmp; - } -} - - -static lzma_ret -delta_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_delta_coder *coder = coder_ptr; - - lzma_ret ret; - - if (coder->next.code == NULL) { - const size_t in_avail = in_size - *in_pos; - const size_t out_avail = out_size - *out_pos; - const size_t size = my_min(in_avail, out_avail); - - // in and out might be NULL. In such cases size == 0. - // Null pointer + 0 is undefined behavior so skip - // the call in that case as it would do nothing anyway. - if (size > 0) - copy_and_encode(coder, in + *in_pos, out + *out_pos, - size); - - *in_pos += size; - *out_pos += size; - - ret = action != LZMA_RUN && *in_pos == in_size - ? LZMA_STREAM_END : LZMA_OK; - - } else { - const size_t out_start = *out_pos; - - ret = coder->next.code(coder->next.coder, allocator, - in, in_pos, in_size, out, out_pos, out_size, - action); - - // Like above, avoid null pointer + 0. - const size_t size = *out_pos - out_start; - if (size > 0) - encode_in_place(coder, out + out_start, size); - } - - return ret; -} - - -static lzma_ret -delta_encoder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters_null lzma_attribute((__unused__)), - const lzma_filter *reversed_filters) -{ - lzma_delta_coder *coder = coder_ptr; - - // Delta doesn't and will never support changing the options in - // the middle of encoding. If the app tries to change them, we - // simply ignore them. - return lzma_next_filter_update( - &coder->next, allocator, reversed_filters + 1); -} - - -extern lzma_ret -lzma_delta_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - next->code = &delta_encode; - next->update = &delta_encoder_update; - return lzma_delta_coder_init(next, allocator, filters); -} - - -extern lzma_ret -lzma_delta_props_encode(const void *options, uint8_t *out) -{ - // The caller must have already validated the options, so it's - // LZMA_PROG_ERROR if they are invalid. - if (lzma_delta_coder_memusage(options) == UINT64_MAX) - return LZMA_PROG_ERROR; - - const lzma_options_delta *opt = options; - out[0] = opt->dist - LZMA_DELTA_DIST_MIN; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/delta/delta_encoder.h b/software/src/xz/src/liblzma/delta/delta_encoder.h deleted file mode 100644 index 735f0ed..0000000 --- a/software/src/xz/src/liblzma/delta/delta_encoder.h +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_encoder.h -/// \brief Delta filter encoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_DELTA_ENCODER_H -#define LZMA_DELTA_ENCODER_H - -#include "delta_common.h" - -extern lzma_ret lzma_delta_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_delta_props_encode(const void *options, uint8_t *out); - -#endif diff --git a/software/src/xz/src/liblzma/delta/delta_private.h b/software/src/xz/src/liblzma/delta/delta_private.h deleted file mode 100644 index e54721a..0000000 --- a/software/src/xz/src/liblzma/delta/delta_private.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file delta_private.h -/// \brief Private common stuff for Delta encoder and decoder -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_DELTA_PRIVATE_H -#define LZMA_DELTA_PRIVATE_H - -#include "delta_common.h" - -typedef struct { - /// Next coder in the chain - lzma_next_coder next; - - /// Delta distance - size_t distance; - - /// Position in history[] - uint8_t pos; - - /// Buffer to hold history of the original data - uint8_t history[LZMA_DELTA_DIST_MAX]; -} lzma_delta_coder; - - -extern lzma_ret lzma_delta_coder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters); - -#endif diff --git a/software/src/xz/src/liblzma/liblzma.pc.in b/software/src/xz/src/liblzma/liblzma.pc.in deleted file mode 100644 index a432992..0000000 --- a/software/src/xz/src/liblzma/liblzma.pc.in +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: 0BSD -# Author: Lasse Collin - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: liblzma -Description: General purpose data compression library -URL: @PACKAGE_URL@ -Version: @PACKAGE_VERSION@ -Cflags: -I${includedir} -Cflags.private: -DLZMA_API_STATIC -Libs: -L${libdir} -llzma -Libs.private: @PTHREAD_CFLAGS@ @LIBS@ diff --git a/software/src/xz/src/liblzma/liblzma_w32res.rc b/software/src/xz/src/liblzma/liblzma_w32res.rc deleted file mode 100644 index 19507b6..0000000 --- a/software/src/xz/src/liblzma/liblzma_w32res.rc +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -/* - * Author: Lasse Collin - */ - -#define MY_TYPE VFT_DLL - -#if defined(__MSYS__) -# define MY_NAME "msys-lzma-5" -#elif defined(__CYGWIN__) -# define MY_NAME "cyglzma-5" -#else -# define MY_NAME "liblzma" -#endif - -#define MY_SUFFIX ".dll" -#define MY_DESC "liblzma data compression library" -#include "common_w32res.rc" diff --git a/software/src/xz/src/liblzma/lz/Makefile.inc b/software/src/xz/src/liblzma/lz/Makefile.inc deleted file mode 100644 index 15235d7..0000000 --- a/software/src/xz/src/liblzma/lz/Makefile.inc +++ /dev/null @@ -1,18 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -if COND_ENCODER_LZ -liblzma_la_SOURCES += \ - lz/lz_encoder.c \ - lz/lz_encoder.h \ - lz/lz_encoder_hash.h \ - lz/lz_encoder_hash_table.h \ - lz/lz_encoder_mf.c -endif - - -if COND_DECODER_LZ -liblzma_la_SOURCES += \ - lz/lz_decoder.c \ - lz/lz_decoder.h -endif diff --git a/software/src/xz/src/liblzma/lz/lz_decoder.c b/software/src/xz/src/liblzma/lz/lz_decoder.c deleted file mode 100644 index 1cb120a..0000000 --- a/software/src/xz/src/liblzma/lz/lz_decoder.c +++ /dev/null @@ -1,333 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_decoder.c -/// \brief LZ out window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -// liblzma supports multiple LZ77-based filters. The LZ part is shared -// between these filters. The LZ code takes care of dictionary handling -// and passing the data between filters in the chain. The filter-specific -// part decodes from the input buffer to the dictionary. - - -#include "lz_decoder.h" - - -typedef struct { - /// Dictionary (history buffer) - lzma_dict dict; - - /// The actual LZ-based decoder e.g. LZMA - lzma_lz_decoder lz; - - /// Next filter in the chain, if any. Note that LZMA and LZMA2 are - /// only allowed as the last filter, but the long-range filter in - /// future can be in the middle of the chain. - lzma_next_coder next; - - /// True if the next filter in the chain has returned LZMA_STREAM_END. - bool next_finished; - - /// True if the LZ decoder (e.g. LZMA) has detected end of payload - /// marker. This may become true before next_finished becomes true. - bool this_finished; - - /// Temporary buffer needed when the LZ-based filter is not the last - /// filter in the chain. The output of the next filter is first - /// decoded into buffer[], which is then used as input for the actual - /// LZ-based decoder. - struct { - size_t pos; - size_t size; - uint8_t buffer[LZMA_BUFFER_SIZE]; - } temp; -} lzma_coder; - - -static void -lz_decoder_reset(lzma_coder *coder) -{ - coder->dict.pos = LZ_DICT_INIT_POS; - coder->dict.full = 0; - coder->dict.buf[LZ_DICT_INIT_POS - 1] = '\0'; - coder->dict.has_wrapped = false; - coder->dict.need_reset = false; - return; -} - - -static lzma_ret -decode_buffer(lzma_coder *coder, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size) -{ - while (true) { - // Wrap the dictionary if needed. - if (coder->dict.pos == coder->dict.size) { - // See the comment of #define LZ_DICT_REPEAT_MAX. - coder->dict.pos = LZ_DICT_REPEAT_MAX; - coder->dict.has_wrapped = true; - memcpy(coder->dict.buf, coder->dict.buf - + coder->dict.size - - LZ_DICT_REPEAT_MAX, - LZ_DICT_REPEAT_MAX); - } - - // Store the current dictionary position. It is needed to know - // where to start copying to the out[] buffer. - const size_t dict_start = coder->dict.pos; - - // Calculate how much we allow coder->lz.code() to decode. - // It must not decode past the end of the dictionary - // buffer, and we don't want it to decode more than is - // actually needed to fill the out[] buffer. - coder->dict.limit = coder->dict.pos - + my_min(out_size - *out_pos, - coder->dict.size - coder->dict.pos); - - // Call the coder->lz.code() to do the actual decoding. - const lzma_ret ret = coder->lz.code( - coder->lz.coder, &coder->dict, - in, in_pos, in_size); - - // Copy the decoded data from the dictionary to the out[] - // buffer. Do it conditionally because out can be NULL - // (in which case copy_size is always 0). Calling memcpy() - // with a null-pointer is undefined even if the third - // argument is 0. - const size_t copy_size = coder->dict.pos - dict_start; - assert(copy_size <= out_size - *out_pos); - - if (copy_size > 0) - memcpy(out + *out_pos, coder->dict.buf + dict_start, - copy_size); - - *out_pos += copy_size; - - // Reset the dictionary if so requested by coder->lz.code(). - if (coder->dict.need_reset) { - lz_decoder_reset(coder); - - // Since we reset dictionary, we don't check if - // dictionary became full. - if (ret != LZMA_OK || *out_pos == out_size) - return ret; - } else { - // Return if everything got decoded or an error - // occurred, or if there's no more data to decode. - // - // Note that detecting if there's something to decode - // is done by looking if dictionary become full - // instead of looking if *in_pos == in_size. This - // is because it is possible that all the input was - // consumed already but some data is pending to be - // written to the dictionary. - if (ret != LZMA_OK || *out_pos == out_size - || coder->dict.pos < coder->dict.size) - return ret; - } - } -} - - -static lzma_ret -lz_decode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_coder *coder = coder_ptr; - - if (coder->next.code == NULL) - return decode_buffer(coder, in, in_pos, in_size, - out, out_pos, out_size); - - // We aren't the last coder in the chain, we need to decode - // our input to a temporary buffer. - while (*out_pos < out_size) { - // Fill the temporary buffer if it is empty. - if (!coder->next_finished - && coder->temp.pos == coder->temp.size) { - coder->temp.pos = 0; - coder->temp.size = 0; - - const lzma_ret ret = coder->next.code( - coder->next.coder, - allocator, in, in_pos, in_size, - coder->temp.buffer, &coder->temp.size, - LZMA_BUFFER_SIZE, action); - - if (ret == LZMA_STREAM_END) - coder->next_finished = true; - else if (ret != LZMA_OK || coder->temp.size == 0) - return ret; - } - - if (coder->this_finished) { - if (coder->temp.size != 0) - return LZMA_DATA_ERROR; - - if (coder->next_finished) - return LZMA_STREAM_END; - - return LZMA_OK; - } - - const lzma_ret ret = decode_buffer(coder, coder->temp.buffer, - &coder->temp.pos, coder->temp.size, - out, out_pos, out_size); - - if (ret == LZMA_STREAM_END) - coder->this_finished = true; - else if (ret != LZMA_OK) - return ret; - else if (coder->next_finished && *out_pos < out_size) - return LZMA_DATA_ERROR; - } - - return LZMA_OK; -} - - -static void -lz_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_coder *coder = coder_ptr; - - lzma_next_end(&coder->next, allocator); - lzma_free(coder->dict.buf, allocator); - - if (coder->lz.end != NULL) - coder->lz.end(coder->lz.coder, allocator); - else - lzma_free(coder->lz.coder, allocator); - - lzma_free(coder, allocator); - return; -} - - -extern lzma_ret -lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_decoder *lz, - const lzma_allocator *allocator, - lzma_vli id, const void *options, - lzma_lz_options *lz_options)) -{ - // Allocate the base structure if it isn't already allocated. - lzma_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &lz_decode; - next->end = &lz_decoder_end; - - coder->dict.buf = NULL; - coder->dict.size = 0; - coder->lz = LZMA_LZ_DECODER_INIT; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Allocate and initialize the LZ-based decoder. It will also give - // us the dictionary size. - lzma_lz_options lz_options; - return_if_error(lz_init(&coder->lz, allocator, - filters[0].id, filters[0].options, &lz_options)); - - // If the dictionary size is very small, increase it to 4096 bytes. - // This is to prevent constant wrapping of the dictionary, which - // would slow things down. The downside is that since we don't check - // separately for the real dictionary size, we may happily accept - // corrupt files. - if (lz_options.dict_size < 4096) - lz_options.dict_size = 4096; - - // Make dictionary size a multiple of 16. Some LZ-based decoders like - // LZMA use the lowest bits lzma_dict.pos to know the alignment of the - // data. Aligned buffer is also good when memcpying from the - // dictionary to the output buffer, since applications are - // recommended to give aligned buffers to liblzma. - // - // Reserve 2 * LZ_DICT_REPEAT_MAX bytes of extra space which is - // needed for alloc_size. Reserve also LZ_DICT_EXTRA bytes of extra - // space which is *not* counted in alloc_size or coder->dict.size. - // - // Avoid integer overflow. - if (lz_options.dict_size > SIZE_MAX - 15 - 2 * LZ_DICT_REPEAT_MAX - - LZ_DICT_EXTRA) - return LZMA_MEM_ERROR; - - lz_options.dict_size = (lz_options.dict_size + 15) & ~((size_t)(15)); - - // Reserve extra space as explained in the comment - // of #define LZ_DICT_REPEAT_MAX. - const size_t alloc_size - = lz_options.dict_size + 2 * LZ_DICT_REPEAT_MAX; - - // Allocate and initialize the dictionary. - if (coder->dict.size != alloc_size) { - lzma_free(coder->dict.buf, allocator); - - // The LZ_DICT_EXTRA bytes at the end of the buffer aren't - // included in alloc_size. These extra bytes allow - // dict_repeat() to read and write more data than requested. - // Otherwise this extra space is ignored. - coder->dict.buf = lzma_alloc(alloc_size + LZ_DICT_EXTRA, - allocator); - if (coder->dict.buf == NULL) - return LZMA_MEM_ERROR; - - // NOTE: Yes, alloc_size, not lz_options.dict_size. The way - // coder->dict.full is updated will take care that we will - // still reject distances larger than lz_options.dict_size. - coder->dict.size = alloc_size; - } - - lz_decoder_reset(next->coder); - - // Use the preset dictionary if it was given to us. - if (lz_options.preset_dict != NULL - && lz_options.preset_dict_size > 0) { - // If the preset dictionary is bigger than the actual - // dictionary, copy only the tail. - const size_t copy_size = my_min(lz_options.preset_dict_size, - lz_options.dict_size); - const size_t offset = lz_options.preset_dict_size - copy_size; - memcpy(coder->dict.buf + coder->dict.pos, - lz_options.preset_dict + offset, - copy_size); - - // dict.pos isn't zero after lz_decoder_reset(). - coder->dict.pos += copy_size; - coder->dict.full = copy_size; - } - - // Miscellaneous initializations - coder->next_finished = false; - coder->this_finished = false; - coder->temp.pos = 0; - coder->temp.size = 0; - - // Initialize the next filter in the chain, if any. - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} - - -extern uint64_t -lzma_lz_decoder_memusage(size_t dictionary_size) -{ - return sizeof(lzma_coder) + (uint64_t)(dictionary_size) - + 2 * LZ_DICT_REPEAT_MAX + LZ_DICT_EXTRA; -} diff --git a/software/src/xz/src/liblzma/lz/lz_decoder.h b/software/src/xz/src/liblzma/lz/lz_decoder.h deleted file mode 100644 index 2698e01..0000000 --- a/software/src/xz/src/liblzma/lz/lz_decoder.h +++ /dev/null @@ -1,325 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_decoder.h -/// \brief LZ out window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_DECODER_H -#define LZMA_LZ_DECODER_H - -#include "common.h" - -#ifdef HAVE_IMMINTRIN_H -# include -#endif - - -// dict_repeat() implementation variant: -// 0 = Byte-by-byte copying only. -// 1 = Use memcpy() for non-overlapping copies. -// 2 = Use x86 SSE2 for non-overlapping copies. -#ifndef LZMA_LZ_DECODER_CONFIG -# if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && defined(HAVE_IMMINTRIN_H) \ - && (defined(__SSE2__) || defined(_M_X64) \ - || (defined(_M_IX86_FP) && _M_IX86_FP >= 2)) -# define LZMA_LZ_DECODER_CONFIG 2 -# else -# define LZMA_LZ_DECODER_CONFIG 1 -# endif -#endif - -/// Byte-by-byte and memcpy() copy exactly the amount needed. Other methods -/// can copy up to LZ_DICT_EXTRA bytes more than requested, and this amount -/// of extra space is needed at the end of the allocated dictionary buffer. -/// -/// NOTE: If this is increased, update LZMA_DICT_REPEAT_MAX too. -#if LZMA_LZ_DECODER_CONFIG >= 2 -# define LZ_DICT_EXTRA 32 -#else -# define LZ_DICT_EXTRA 0 -#endif - -/// Maximum number of bytes that dict_repeat() may copy. The allocated -/// dictionary buffer will be 2 * LZ_DICT_REPEAT_MAX + LZMA_DICT_EXTRA bytes -/// larger than the actual dictionary size: -/// -/// (1) Every time the decoder reaches the end of the dictionary buffer, -/// the last LZ_DICT_REPEAT_MAX bytes will be copied to the beginning. -/// This way dict_repeat() will only need to copy from one place, -/// never from both the end and beginning of the buffer. -/// -/// (2) The other LZ_DICT_REPEAT_MAX bytes is kept as a buffer between -/// the oldest byte still in the dictionary and the current write -/// position. This way dict_repeat() with the maximum valid distance -/// won't need memmove() as the copying cannot overlap. -/// -/// (3) LZ_DICT_EXTRA bytes are required at the end of the dictionary buffer -/// so that extra copying done by dict_repeat() won't write or read past -/// the end of the allocated buffer. This amount is *not* counted as part -/// of lzma_dict.size. -/// -/// Note that memcpy() still cannot be used if distance < len. -/// -/// LZMA's longest match length is 273 bytes. The LZMA decoder looks at -/// the lowest four bits of the dictionary position, thus 273 must be -/// rounded up to the next multiple of 16 (288). In addition, optimized -/// dict_repeat() copies 32 bytes at a time, thus this must also be -/// a multiple of 32. -#define LZ_DICT_REPEAT_MAX 288 - -/// Initial position in lzma_dict.buf when the dictionary is empty. -#define LZ_DICT_INIT_POS (2 * LZ_DICT_REPEAT_MAX) - - -typedef struct { - /// Pointer to the dictionary buffer. - uint8_t *buf; - - /// Write position in dictionary. The next byte will be written to - /// buf[pos]. - size_t pos; - - /// Indicates how full the dictionary is. This is used by - /// dict_is_distance_valid() to detect corrupt files that would - /// read beyond the beginning of the dictionary. - size_t full; - - /// Write limit - size_t limit; - - /// Allocated size of buf. This is 2 * LZ_DICT_REPEAT_MAX bytes - /// larger than the actual dictionary size. This is enforced by - /// how the value for "full" is set; it can be at most - /// "size - 2 * LZ_DICT_REPEAT_MAX". - size_t size; - - /// True once the dictionary has become full and the writing position - /// has been wrapped in decode_buffer() in lz_decoder.c. - bool has_wrapped; - - /// True when dictionary should be reset before decoding more data. - bool need_reset; - -} lzma_dict; - - -typedef struct { - size_t dict_size; - const uint8_t *preset_dict; - size_t preset_dict_size; -} lzma_lz_options; - - -typedef struct { - /// Data specific to the LZ-based decoder - void *coder; - - /// Function to decode from in[] to *dict - lzma_ret (*code)(void *coder, - lzma_dict *restrict dict, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size); - - void (*reset)(void *coder, const void *options); - - /// Set the uncompressed size. If uncompressed_size == LZMA_VLI_UNKNOWN - /// then allow_eopm will always be true. - void (*set_uncompressed)(void *coder, lzma_vli uncompressed_size, - bool allow_eopm); - - /// Free allocated resources - void (*end)(void *coder, const lzma_allocator *allocator); - -} lzma_lz_decoder; - - -#define LZMA_LZ_DECODER_INIT \ - (lzma_lz_decoder){ \ - .coder = NULL, \ - .code = NULL, \ - .reset = NULL, \ - .set_uncompressed = NULL, \ - .end = NULL, \ - } - - -extern lzma_ret lzma_lz_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_decoder *lz, - const lzma_allocator *allocator, - lzma_vli id, const void *options, - lzma_lz_options *lz_options)); - -extern uint64_t lzma_lz_decoder_memusage(size_t dictionary_size); - - -////////////////////// -// Inline functions // -////////////////////// - -/// Get a byte from the history buffer. -static inline uint8_t -dict_get(const lzma_dict *const dict, const uint32_t distance) -{ - return dict->buf[dict->pos - distance - 1 - + (distance < dict->pos - ? 0 : dict->size - LZ_DICT_REPEAT_MAX)]; -} - - -/// Optimized version of dict_get(dict, 0) -static inline uint8_t -dict_get0(const lzma_dict *const dict) -{ - return dict->buf[dict->pos - 1]; -} - - -/// Test if dictionary is empty. -static inline bool -dict_is_empty(const lzma_dict *const dict) -{ - return dict->full == 0; -} - - -/// Validate the match distance -static inline bool -dict_is_distance_valid(const lzma_dict *const dict, const size_t distance) -{ - return dict->full > distance; -} - - -/// Repeat *len bytes at distance. -static inline bool -dict_repeat(lzma_dict *restrict dict, - uint32_t distance, uint32_t *restrict len) -{ - // Don't write past the end of the dictionary. - const size_t dict_avail = dict->limit - dict->pos; - uint32_t left = my_min(dict_avail, *len); - *len -= left; - - size_t back = dict->pos - distance - 1; - if (distance >= dict->pos) - back += dict->size - LZ_DICT_REPEAT_MAX; - -#if LZMA_LZ_DECODER_CONFIG == 0 - // Minimal byte-by-byte method. This might be the least bad choice - // if memcpy() isn't fast and there's no replacement for it below. - while (left-- > 0) { - dict->buf[dict->pos++] = dict->buf[back++]; - } - -#else - // Because memcpy() or a similar method can be faster than copying - // byte by byte in a loop, the copying process is split into - // two cases. - if (distance < left) { - // Source and target areas overlap, thus we can't use - // memcpy() nor even memmove() safely. - do { - dict->buf[dict->pos++] = dict->buf[back++]; - } while (--left > 0); - } else { -# if LZMA_LZ_DECODER_CONFIG == 1 - memcpy(dict->buf + dict->pos, dict->buf + back, left); - dict->pos += left; - -# elif LZMA_LZ_DECODER_CONFIG == 2 - // This can copy up to 32 bytes more than required. - // (If left == 0, we still copy 32 bytes.) - size_t pos = dict->pos; - dict->pos += left; - do { - const __m128i x0 = _mm_loadu_si128( - (__m128i *)(dict->buf + back)); - const __m128i x1 = _mm_loadu_si128( - (__m128i *)(dict->buf + back + 16)); - back += 32; - _mm_storeu_si128( - (__m128i *)(dict->buf + pos), x0); - _mm_storeu_si128( - (__m128i *)(dict->buf + pos + 16), x1); - pos += 32; - } while (pos < dict->pos); - -# else -# error "Invalid LZMA_LZ_DECODER_CONFIG value" -# endif - } -#endif - - // Update how full the dictionary is. - if (!dict->has_wrapped) - dict->full = dict->pos - LZ_DICT_INIT_POS; - - return *len != 0; -} - - -static inline void -dict_put(lzma_dict *restrict dict, uint8_t byte) -{ - dict->buf[dict->pos++] = byte; - - if (!dict->has_wrapped) - dict->full = dict->pos - LZ_DICT_INIT_POS; -} - - -/// Puts one byte into the dictionary. Returns true if the dictionary was -/// already full and the byte couldn't be added. -static inline bool -dict_put_safe(lzma_dict *restrict dict, uint8_t byte) -{ - if (unlikely(dict->pos == dict->limit)) - return true; - - dict_put(dict, byte); - return false; -} - - -/// Copies arbitrary amount of data into the dictionary. -static inline void -dict_write(lzma_dict *restrict dict, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size, - size_t *restrict left) -{ - // NOTE: If we are being given more data than the size of the - // dictionary, it could be possible to optimize the LZ decoder - // so that not everything needs to go through the dictionary. - // This shouldn't be very common thing in practice though, and - // the slowdown of one extra memcpy() isn't bad compared to how - // much time it would have taken if the data were compressed. - - if (in_size - *in_pos > *left) - in_size = *in_pos + *left; - - *left -= lzma_bufcpy(in, in_pos, in_size, - dict->buf, &dict->pos, dict->limit); - - if (!dict->has_wrapped) - dict->full = dict->pos - LZ_DICT_INIT_POS; - - return; -} - - -static inline void -dict_reset(lzma_dict *dict) -{ - dict->need_reset = true; - return; -} - -#endif diff --git a/software/src/xz/src/liblzma/lz/lz_encoder.c b/software/src/xz/src/liblzma/lz/lz_encoder.c deleted file mode 100644 index e5c4057..0000000 --- a/software/src/xz/src/liblzma/lz/lz_encoder.c +++ /dev/null @@ -1,632 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder.c -/// \brief LZ in window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_encoder.h" -#include "lz_encoder_hash.h" - -// See lz_encoder_hash.h. This is a bit hackish but avoids making -// endianness a conditional in makefiles. -#ifdef LZMA_LZ_HASH_TABLE_IS_NEEDED -# include "lz_encoder_hash_table.h" -#endif - -#include "memcmplen.h" - - -typedef struct { - /// LZ-based encoder e.g. LZMA - lzma_lz_encoder lz; - - /// History buffer and match finder - lzma_mf mf; - - /// Next coder in the chain - lzma_next_coder next; -} lzma_coder; - - -/// \brief Moves the data in the input window to free space for new data -/// -/// mf->buffer is a sliding input window, which keeps mf->keep_size_before -/// bytes of input history available all the time. Now and then we need to -/// "slide" the buffer to make space for the new data to the end of the -/// buffer. At the same time, data older than keep_size_before is dropped. -/// -static void -move_window(lzma_mf *mf) -{ - // Align the move to a multiple of 16 bytes. Some LZ-based encoders - // like LZMA use the lowest bits of mf->read_pos to know the - // alignment of the uncompressed data. We also get better speed - // for memmove() with aligned buffers. - assert(mf->read_pos > mf->keep_size_before); - const uint32_t move_offset - = (mf->read_pos - mf->keep_size_before) & ~UINT32_C(15); - - assert(mf->write_pos > move_offset); - const size_t move_size = mf->write_pos - move_offset; - - assert(move_offset + move_size <= mf->size); - - memmove(mf->buffer, mf->buffer + move_offset, move_size); - - mf->offset += move_offset; - mf->read_pos -= move_offset; - mf->read_limit -= move_offset; - mf->write_pos -= move_offset; - - return; -} - - -/// \brief Tries to fill the input window (mf->buffer) -/// -/// If we are the last encoder in the chain, our input data is in in[]. -/// Otherwise we call the next filter in the chain to process in[] and -/// write its output to mf->buffer. -/// -/// This function must not be called once it has returned LZMA_STREAM_END. -/// -static lzma_ret -fill_window(lzma_coder *coder, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - lzma_action action) -{ - assert(coder->mf.read_pos <= coder->mf.write_pos); - - // Move the sliding window if needed. - if (coder->mf.read_pos >= coder->mf.size - coder->mf.keep_size_after) - move_window(&coder->mf); - - // Maybe this is ugly, but lzma_mf uses uint32_t for most things - // (which I find cleanest), but we need size_t here when filling - // the history window. - size_t write_pos = coder->mf.write_pos; - lzma_ret ret; - if (coder->next.code == NULL) { - // Not using a filter, simply memcpy() as much as possible. - lzma_bufcpy(in, in_pos, in_size, coder->mf.buffer, - &write_pos, coder->mf.size); - - ret = action != LZMA_RUN && *in_pos == in_size - ? LZMA_STREAM_END : LZMA_OK; - - } else { - ret = coder->next.code(coder->next.coder, allocator, - in, in_pos, in_size, - coder->mf.buffer, &write_pos, - coder->mf.size, action); - } - - coder->mf.write_pos = write_pos; - - // Silence Valgrind. lzma_memcmplen() can read extra bytes - // and Valgrind will give warnings if those bytes are uninitialized - // because Valgrind cannot see that the values of the uninitialized - // bytes are eventually ignored. - memzero(coder->mf.buffer + write_pos, LZMA_MEMCMPLEN_EXTRA); - - // If end of stream has been reached or flushing completed, we allow - // the encoder to process all the input (that is, read_pos is allowed - // to reach write_pos). Otherwise we keep keep_size_after bytes - // available as prebuffer. - if (ret == LZMA_STREAM_END) { - assert(*in_pos == in_size); - ret = LZMA_OK; - coder->mf.action = action; - coder->mf.read_limit = coder->mf.write_pos; - - } else if (coder->mf.write_pos > coder->mf.keep_size_after) { - // This needs to be done conditionally, because if we got - // only little new input, there may be too little input - // to do any encoding yet. - coder->mf.read_limit = coder->mf.write_pos - - coder->mf.keep_size_after; - } - - // Restart the match finder after finished LZMA_SYNC_FLUSH. - if (coder->mf.pending > 0 - && coder->mf.read_pos < coder->mf.read_limit) { - // Match finder may update coder->pending and expects it to - // start from zero, so use a temporary variable. - const uint32_t pending = coder->mf.pending; - coder->mf.pending = 0; - - // Rewind read_pos so that the match finder can hash - // the pending bytes. - assert(coder->mf.read_pos >= pending); - coder->mf.read_pos -= pending; - - // Call the skip function directly instead of using - // mf_skip(), since we don't want to touch mf->read_ahead. - coder->mf.skip(&coder->mf, pending); - } - - return ret; -} - - -static lzma_ret -lz_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, lzma_action action) -{ - lzma_coder *coder = coder_ptr; - - while (*out_pos < out_size - && (*in_pos < in_size || action != LZMA_RUN)) { - // Read more data to coder->mf.buffer if needed. - if (coder->mf.action == LZMA_RUN && coder->mf.read_pos - >= coder->mf.read_limit) - return_if_error(fill_window(coder, allocator, - in, in_pos, in_size, action)); - - // Encode - const lzma_ret ret = coder->lz.code(coder->lz.coder, - &coder->mf, out, out_pos, out_size); - if (ret != LZMA_OK) { - // Setting this to LZMA_RUN for cases when we are - // flushing. It doesn't matter when finishing or if - // an error occurred. - coder->mf.action = LZMA_RUN; - return ret; - } - } - - return LZMA_OK; -} - - -static bool -lz_encoder_prepare(lzma_mf *mf, const lzma_allocator *allocator, - const lzma_lz_options *lz_options) -{ - // For now, the dictionary size is limited to 1.5 GiB. This may grow - // in the future if needed, but it needs a little more work than just - // changing this check. - if (!IS_ENC_DICT_SIZE_VALID(lz_options->dict_size) - || lz_options->nice_len > lz_options->match_len_max) - return true; - - mf->keep_size_before = lz_options->before_size + lz_options->dict_size; - - mf->keep_size_after = lz_options->after_size - + lz_options->match_len_max; - - // To avoid constant memmove()s, allocate some extra space. Since - // memmove()s become more expensive when the size of the buffer - // increases, we reserve more space when a large dictionary is - // used to make the memmove() calls rarer. - // - // This works with dictionaries up to about 3 GiB. If bigger - // dictionary is wanted, some extra work is needed: - // - Several variables in lzma_mf have to be changed from uint32_t - // to size_t. - // - Memory usage calculation needs something too, e.g. use uint64_t - // for mf->size. - uint32_t reserve = lz_options->dict_size / 2; - if (reserve > (UINT32_C(1) << 30)) - reserve /= 2; - - reserve += (lz_options->before_size + lz_options->match_len_max - + lz_options->after_size) / 2 + (UINT32_C(1) << 19); - - const uint32_t old_size = mf->size; - mf->size = mf->keep_size_before + reserve + mf->keep_size_after; - - // Deallocate the old history buffer if it exists but has different - // size than what is needed now. - if (mf->buffer != NULL && old_size != mf->size) { - lzma_free(mf->buffer, allocator); - mf->buffer = NULL; - } - - // Match finder options - mf->match_len_max = lz_options->match_len_max; - mf->nice_len = lz_options->nice_len; - - // cyclic_size has to stay smaller than 2 Gi. Note that this doesn't - // mean limiting dictionary size to less than 2 GiB. With a match - // finder that uses multibyte resolution (hashes start at e.g. every - // fourth byte), cyclic_size would stay below 2 Gi even when - // dictionary size is greater than 2 GiB. - // - // It would be possible to allow cyclic_size >= 2 Gi, but then we - // would need to be careful to use 64-bit types in various places - // (size_t could do since we would need bigger than 32-bit address - // space anyway). It would also require either zeroing a multigigabyte - // buffer at initialization (waste of time and RAM) or allow - // normalization in lz_encoder_mf.c to access uninitialized - // memory to keep the code simpler. The current way is simple and - // still allows pretty big dictionaries, so I don't expect these - // limits to change. - mf->cyclic_size = lz_options->dict_size + 1; - - // Validate the match finder ID and setup the function pointers. - switch (lz_options->match_finder) { -#ifdef HAVE_MF_HC3 - case LZMA_MF_HC3: - mf->find = &lzma_mf_hc3_find; - mf->skip = &lzma_mf_hc3_skip; - break; -#endif -#ifdef HAVE_MF_HC4 - case LZMA_MF_HC4: - mf->find = &lzma_mf_hc4_find; - mf->skip = &lzma_mf_hc4_skip; - break; -#endif -#ifdef HAVE_MF_BT2 - case LZMA_MF_BT2: - mf->find = &lzma_mf_bt2_find; - mf->skip = &lzma_mf_bt2_skip; - break; -#endif -#ifdef HAVE_MF_BT3 - case LZMA_MF_BT3: - mf->find = &lzma_mf_bt3_find; - mf->skip = &lzma_mf_bt3_skip; - break; -#endif -#ifdef HAVE_MF_BT4 - case LZMA_MF_BT4: - mf->find = &lzma_mf_bt4_find; - mf->skip = &lzma_mf_bt4_skip; - break; -#endif - - default: - return true; - } - - // Calculate the sizes of mf->hash and mf->son. - // - // NOTE: Since 5.3.5beta the LZMA encoder ensures that nice_len - // is big enough for the selected match finder. This makes it - // easier for applications as nice_len = 2 will always be accepted - // even though the effective value can be slightly bigger. - const uint32_t hash_bytes - = mf_get_hash_bytes(lz_options->match_finder); - assert(hash_bytes <= mf->nice_len); - - const bool is_bt = (lz_options->match_finder & 0x10) != 0; - uint32_t hs; - - if (hash_bytes == 2) { - hs = 0xFFFF; - } else { - // Round dictionary size up to the next 2^n - 1 so it can - // be used as a hash mask. - hs = lz_options->dict_size - 1; - hs |= hs >> 1; - hs |= hs >> 2; - hs |= hs >> 4; - hs |= hs >> 8; - hs >>= 1; - hs |= 0xFFFF; - - if (hs > (UINT32_C(1) << 24)) { - if (hash_bytes == 3) - hs = (UINT32_C(1) << 24) - 1; - else - hs >>= 1; - } - } - - mf->hash_mask = hs; - - ++hs; - if (hash_bytes > 2) - hs += HASH_2_SIZE; - if (hash_bytes > 3) - hs += HASH_3_SIZE; -/* - No match finder uses this at the moment. - if (mf->hash_bytes > 4) - hs += HASH_4_SIZE; -*/ - - const uint32_t old_hash_count = mf->hash_count; - const uint32_t old_sons_count = mf->sons_count; - mf->hash_count = hs; - mf->sons_count = mf->cyclic_size; - if (is_bt) - mf->sons_count *= 2; - - // Deallocate the old hash array if it exists and has different size - // than what is needed now. - if (old_hash_count != mf->hash_count - || old_sons_count != mf->sons_count) { - lzma_free(mf->hash, allocator); - mf->hash = NULL; - - lzma_free(mf->son, allocator); - mf->son = NULL; - } - - // Maximum number of match finder cycles - mf->depth = lz_options->depth; - if (mf->depth == 0) { - if (is_bt) - mf->depth = 16 + mf->nice_len / 2; - else - mf->depth = 4 + mf->nice_len / 4; - } - - return false; -} - - -static bool -lz_encoder_init(lzma_mf *mf, const lzma_allocator *allocator, - const lzma_lz_options *lz_options) -{ - // Allocate the history buffer. - if (mf->buffer == NULL) { - // lzma_memcmplen() is used for the dictionary buffer - // so we need to allocate a few extra bytes to prevent - // it from reading past the end of the buffer. - mf->buffer = lzma_alloc(mf->size + LZMA_MEMCMPLEN_EXTRA, - allocator); - if (mf->buffer == NULL) - return true; - - // Keep Valgrind happy with lzma_memcmplen() and initialize - // the extra bytes whose value may get read but which will - // effectively get ignored. - memzero(mf->buffer + mf->size, LZMA_MEMCMPLEN_EXTRA); - } - - // Use cyclic_size as initial mf->offset. This allows - // avoiding a few branches in the match finders. The downside is - // that match finder needs to be normalized more often, which may - // hurt performance with huge dictionaries. - mf->offset = mf->cyclic_size; - mf->read_pos = 0; - mf->read_ahead = 0; - mf->read_limit = 0; - mf->write_pos = 0; - mf->pending = 0; - -#if UINT32_MAX >= SIZE_MAX / 4 - // Check for integer overflow. (Huge dictionaries are not - // possible on 32-bit CPU.) - if (mf->hash_count > SIZE_MAX / sizeof(uint32_t) - || mf->sons_count > SIZE_MAX / sizeof(uint32_t)) - return true; -#endif - - // Allocate and initialize the hash table. Since EMPTY_HASH_VALUE - // is zero, we can use lzma_alloc_zero() or memzero() for mf->hash. - // - // We don't need to initialize mf->son, but not doing that may - // make Valgrind complain in normalization (see normalize() in - // lz_encoder_mf.c). Skipping the initialization is *very* good - // when big dictionary is used but only small amount of data gets - // actually compressed: most of the mf->son won't get actually - // allocated by the kernel, so we avoid wasting RAM and improve - // initialization speed a lot. - if (mf->hash == NULL) { - mf->hash = lzma_alloc_zero(mf->hash_count * sizeof(uint32_t), - allocator); - mf->son = lzma_alloc(mf->sons_count * sizeof(uint32_t), - allocator); - - if (mf->hash == NULL || mf->son == NULL) { - lzma_free(mf->hash, allocator); - mf->hash = NULL; - - lzma_free(mf->son, allocator); - mf->son = NULL; - - return true; - } - } else { -/* - for (uint32_t i = 0; i < mf->hash_count; ++i) - mf->hash[i] = EMPTY_HASH_VALUE; -*/ - memzero(mf->hash, mf->hash_count * sizeof(uint32_t)); - } - - mf->cyclic_pos = 0; - - // Handle preset dictionary. - if (lz_options->preset_dict != NULL - && lz_options->preset_dict_size > 0) { - // If the preset dictionary is bigger than the actual - // dictionary, use only the tail. - mf->write_pos = my_min(lz_options->preset_dict_size, mf->size); - memcpy(mf->buffer, lz_options->preset_dict - + lz_options->preset_dict_size - mf->write_pos, - mf->write_pos); - mf->action = LZMA_SYNC_FLUSH; - mf->skip(mf, mf->write_pos); - } - - mf->action = LZMA_RUN; - - return false; -} - - -extern uint64_t -lzma_lz_encoder_memusage(const lzma_lz_options *lz_options) -{ - // Old buffers must not exist when calling lz_encoder_prepare(). - lzma_mf mf = { - .buffer = NULL, - .hash = NULL, - .son = NULL, - .hash_count = 0, - .sons_count = 0, - }; - - // Setup the size information into mf. - if (lz_encoder_prepare(&mf, NULL, lz_options)) - return UINT64_MAX; - - // Calculate the memory usage. - return ((uint64_t)(mf.hash_count) + mf.sons_count) * sizeof(uint32_t) - + mf.size + sizeof(lzma_coder); -} - - -static void -lz_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_coder *coder = coder_ptr; - - lzma_next_end(&coder->next, allocator); - - lzma_free(coder->mf.son, allocator); - lzma_free(coder->mf.hash, allocator); - lzma_free(coder->mf.buffer, allocator); - - if (coder->lz.end != NULL) - coder->lz.end(coder->lz.coder, allocator); - else - lzma_free(coder->lz.coder, allocator); - - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -lz_encoder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters_null lzma_attribute((__unused__)), - const lzma_filter *reversed_filters) -{ - lzma_coder *coder = coder_ptr; - - if (coder->lz.options_update == NULL) - return LZMA_PROG_ERROR; - - return_if_error(coder->lz.options_update( - coder->lz.coder, reversed_filters)); - - return lzma_next_filter_update( - &coder->next, allocator, reversed_filters + 1); -} - - -static lzma_ret -lz_encoder_set_out_limit(void *coder_ptr, uint64_t *uncomp_size, - uint64_t out_limit) -{ - lzma_coder *coder = coder_ptr; - - // This is supported only if there are no other filters chained. - if (coder->next.code == NULL && coder->lz.set_out_limit != NULL) - return coder->lz.set_out_limit( - coder->lz.coder, uncomp_size, out_limit); - - return LZMA_OPTIONS_ERROR; -} - - -extern lzma_ret -lzma_lz_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_encoder *lz, - const lzma_allocator *allocator, - lzma_vli id, const void *options, - lzma_lz_options *lz_options)) -{ -#if defined(HAVE_SMALL) && !defined(HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR) - // The CRC32 table must be initialized. - lzma_crc32_init(); -#endif - - // Allocate and initialize the base data structure. - lzma_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &lz_encode; - next->end = &lz_encoder_end; - next->update = &lz_encoder_update; - next->set_out_limit = &lz_encoder_set_out_limit; - - coder->lz.coder = NULL; - coder->lz.code = NULL; - coder->lz.end = NULL; - coder->lz.options_update = NULL; - coder->lz.set_out_limit = NULL; - - // mf.size is initialized to silence Valgrind - // when used on optimized binaries (GCC may reorder - // code in a way that Valgrind gets unhappy). - coder->mf.buffer = NULL; - coder->mf.size = 0; - coder->mf.hash = NULL; - coder->mf.son = NULL; - coder->mf.hash_count = 0; - coder->mf.sons_count = 0; - - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Initialize the LZ-based encoder. - lzma_lz_options lz_options; - return_if_error(lz_init(&coder->lz, allocator, - filters[0].id, filters[0].options, &lz_options)); - - // Setup the size information into coder->mf and deallocate - // old buffers if they have wrong size. - if (lz_encoder_prepare(&coder->mf, allocator, &lz_options)) - return LZMA_OPTIONS_ERROR; - - // Allocate new buffers if needed, and do the rest of - // the initialization. - if (lz_encoder_init(&coder->mf, allocator, &lz_options)) - return LZMA_MEM_ERROR; - - // Initialize the next filter in the chain, if any. - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} - - -extern LZMA_API(lzma_bool) -lzma_mf_is_supported(lzma_match_finder mf) -{ - switch (mf) { -#ifdef HAVE_MF_HC3 - case LZMA_MF_HC3: - return true; -#endif -#ifdef HAVE_MF_HC4 - case LZMA_MF_HC4: - return true; -#endif -#ifdef HAVE_MF_BT2 - case LZMA_MF_BT2: - return true; -#endif -#ifdef HAVE_MF_BT3 - case LZMA_MF_BT3: - return true; -#endif -#ifdef HAVE_MF_BT4 - case LZMA_MF_BT4: - return true; -#endif - default: - return false; - } -} diff --git a/software/src/xz/src/liblzma/lz/lz_encoder.h b/software/src/xz/src/liblzma/lz/lz_encoder.h deleted file mode 100644 index eb197c6..0000000 --- a/software/src/xz/src/liblzma/lz/lz_encoder.h +++ /dev/null @@ -1,352 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder.h -/// \brief LZ in window and match finder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_ENCODER_H -#define LZMA_LZ_ENCODER_H - -#include "common.h" - - -// For now, the dictionary size is limited to 1.5 GiB. This may grow -// in the future if needed, but it needs a little more work than just -// changing this check. -#define IS_ENC_DICT_SIZE_VALID(size) \ - ((size) >= LZMA_DICT_SIZE_MIN \ - && (size) <= (UINT32_C(1) << 30) + (UINT32_C(1) << 29)) - - -/// A table of these is used by the LZ-based encoder to hold -/// the length-distance pairs found by the match finder. -typedef struct { - uint32_t len; - uint32_t dist; -} lzma_match; - - -typedef struct lzma_mf_s lzma_mf; -struct lzma_mf_s { - /////////////// - // In Window // - /////////////// - - /// Pointer to buffer with data to be compressed - uint8_t *buffer; - - /// Total size of the allocated buffer (that is, including all - /// the extra space) - uint32_t size; - - /// Number of bytes that must be kept available in our input history. - /// That is, once keep_size_before bytes have been processed, - /// buffer[read_pos - keep_size_before] is the oldest byte that - /// must be available for reading. - uint32_t keep_size_before; - - /// Number of bytes that must be kept in buffer after read_pos. - /// That is, read_pos <= write_pos - keep_size_after as long as - /// action is LZMA_RUN; when action != LZMA_RUN, read_pos is allowed - /// to reach write_pos so that the last bytes get encoded too. - uint32_t keep_size_after; - - /// Match finders store locations of matches using 32-bit integers. - /// To avoid adjusting several megabytes of integers every time the - /// input window is moved with move_window, we only adjust the - /// offset of the buffer. Thus, buffer[value_in_hash_table - offset] - /// is the byte pointed by value_in_hash_table. - uint32_t offset; - - /// buffer[read_pos] is the next byte to run through the match - /// finder. This is incremented in the match finder once the byte - /// has been processed. - uint32_t read_pos; - - /// Number of bytes that have been ran through the match finder, but - /// which haven't been encoded by the LZ-based encoder yet. - uint32_t read_ahead; - - /// As long as read_pos is less than read_limit, there is enough - /// input available in buffer for at least one encoding loop. - /// - /// Because of the stateful API, read_limit may and will get greater - /// than read_pos quite often. This is taken into account when - /// calculating the value for keep_size_after. - uint32_t read_limit; - - /// buffer[write_pos] is the first byte that doesn't contain valid - /// uncompressed data; that is, the next input byte will be copied - /// to buffer[write_pos]. - uint32_t write_pos; - - /// Number of bytes not hashed before read_pos. This is needed to - /// restart the match finder after LZMA_SYNC_FLUSH. - uint32_t pending; - - ////////////////// - // Match Finder // - ////////////////// - - /// Find matches. Returns the number of distance-length pairs written - /// to the matches array. This is called only via lzma_mf_find(). - uint32_t (*find)(lzma_mf *mf, lzma_match *matches); - - /// Skips num bytes. This is like find() but doesn't make the - /// distance-length pairs available, thus being a little faster. - /// This is called only via mf_skip(). - void (*skip)(lzma_mf *mf, uint32_t num); - - uint32_t *hash; - uint32_t *son; - uint32_t cyclic_pos; - uint32_t cyclic_size; // Must be dictionary size + 1. - uint32_t hash_mask; - - /// Maximum number of loops in the match finder - uint32_t depth; - - /// Maximum length of a match that the match finder will try to find. - uint32_t nice_len; - - /// Maximum length of a match supported by the LZ-based encoder. - /// If the longest match found by the match finder is nice_len, - /// mf_find() tries to expand it up to match_len_max bytes. - uint32_t match_len_max; - - /// When running out of input, binary tree match finders need to know - /// if it is due to flushing or finishing. The action is used also - /// by the LZ-based encoders themselves. - lzma_action action; - - /// Number of elements in hash[] - uint32_t hash_count; - - /// Number of elements in son[] - uint32_t sons_count; -}; - - -typedef struct { - /// Extra amount of data to keep available before the "actual" - /// dictionary. - size_t before_size; - - /// Size of the history buffer - size_t dict_size; - - /// Extra amount of data to keep available after the "actual" - /// dictionary. - size_t after_size; - - /// Maximum length of a match that the LZ-based encoder can accept. - /// This is used to extend matches of length nice_len to the - /// maximum possible length. - size_t match_len_max; - - /// Match finder will search matches up to this length. - /// This must be less than or equal to match_len_max. - size_t nice_len; - - /// Type of the match finder to use - lzma_match_finder match_finder; - - /// Maximum search depth - uint32_t depth; - - /// Initial dictionary for the match finder to search. - const uint8_t *preset_dict; - - /// If the preset dictionary is NULL, this value is ignored. - /// Otherwise this member must indicate the preset dictionary's - /// buffer size. If this size is larger than dict_size, then only - /// the dict_size sized tail of the preset_dict will be used. - uint32_t preset_dict_size; - -} lzma_lz_options; - - -// The total usable buffer space at any moment outside the match finder: -// before_size + dict_size + after_size + match_len_max -// -// In reality, there's some extra space allocated to prevent the number of -// memmove() calls reasonable. The bigger the dict_size is, the bigger -// this extra buffer will be since with bigger dictionaries memmove() would -// also take longer. -// -// A single encoder loop in the LZ-based encoder may call the match finder -// (mf_find() or mf_skip()) at most after_size times. In other words, -// a single encoder loop may increment lzma_mf.read_pos at most after_size -// times. Since matches are looked up to -// lzma_mf.buffer[lzma_mf.read_pos + match_len_max - 1], the total -// amount of extra buffer needed after dict_size becomes -// after_size + match_len_max. -// -// before_size has two uses. The first one is to keep literals available -// in cases when the LZ-based encoder has made some read ahead. -// TODO: Maybe this could be changed by making the LZ-based encoders to -// store the actual literals as they do with length-distance pairs. -// -// Algorithms such as LZMA2 first try to compress a chunk, and then check -// if the encoded result is smaller than the uncompressed one. If the chunk -// was incompressible, it is better to store it in uncompressed form in -// the output stream. To do this, the whole uncompressed chunk has to be -// still available in the history buffer. before_size achieves that. - - -typedef struct { - /// Data specific to the LZ-based encoder - void *coder; - - /// Function to encode from *dict to out[] - lzma_ret (*code)(void *coder, - lzma_mf *restrict mf, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size); - - /// Free allocated resources - void (*end)(void *coder, const lzma_allocator *allocator); - - /// Update the options in the middle of the encoding. - lzma_ret (*options_update)(void *coder, const lzma_filter *filter); - - /// Set maximum allowed output size - lzma_ret (*set_out_limit)(void *coder, uint64_t *uncomp_size, - uint64_t out_limit); - -} lzma_lz_encoder; - - -// Basic steps: -// 1. Input gets copied into the dictionary. -// 2. Data in dictionary gets run through the match finder byte by byte. -// 3. The literals and matches are encoded using e.g. LZMA. -// -// The bytes that have been ran through the match finder, but not encoded yet, -// are called 'read ahead'. - - -/// Get how many bytes the match finder hashes in its initial step. -/// This is also the minimum nice_len value with the match finder. -static inline uint32_t -mf_get_hash_bytes(lzma_match_finder match_finder) -{ - return (uint32_t)match_finder & 0x0F; -} - - -/// Get pointer to the first byte not ran through the match finder -static inline const uint8_t * -mf_ptr(const lzma_mf *mf) -{ - return mf->buffer + mf->read_pos; -} - - -/// Get the number of bytes that haven't been ran through the match finder yet. -static inline uint32_t -mf_avail(const lzma_mf *mf) -{ - return mf->write_pos - mf->read_pos; -} - - -/// Get the number of bytes that haven't been encoded yet (some of these -/// bytes may have been ran through the match finder though). -static inline uint32_t -mf_unencoded(const lzma_mf *mf) -{ - return mf->write_pos - mf->read_pos + mf->read_ahead; -} - - -/// Calculate the absolute offset from the beginning of the most recent -/// dictionary reset. Only the lowest four bits are important, so there's no -/// problem that we don't know the 64-bit size of the data encoded so far. -/// -/// NOTE: When moving the input window, we need to do it so that the lowest -/// bits of dict->read_pos are not modified to keep this macro working -/// as intended. -static inline uint32_t -mf_position(const lzma_mf *mf) -{ - return mf->read_pos - mf->read_ahead; -} - - -/// Since everything else begins with mf_, use it also for lzma_mf_find(). -#define mf_find lzma_mf_find - - -/// Skip the given number of bytes. This is used when a good match was found. -/// For example, if mf_find() finds a match of 200 bytes long, the first byte -/// of that match was already consumed by mf_find(), and the rest 199 bytes -/// have to be skipped with mf_skip(mf, 199). -static inline void -mf_skip(lzma_mf *mf, uint32_t amount) -{ - if (amount != 0) { - mf->skip(mf, amount); - mf->read_ahead += amount; - } -} - - -/// Copies at most *left number of bytes from the history buffer -/// to out[]. This is needed by LZMA2 to encode uncompressed chunks. -static inline void -mf_read(lzma_mf *mf, uint8_t *out, size_t *out_pos, size_t out_size, - size_t *left) -{ - const size_t out_avail = out_size - *out_pos; - const size_t copy_size = my_min(out_avail, *left); - - assert(mf->read_ahead == 0); - assert(mf->read_pos >= *left); - - memcpy(out + *out_pos, mf->buffer + mf->read_pos - *left, - copy_size); - - *out_pos += copy_size; - *left -= copy_size; - return; -} - - -extern lzma_ret lzma_lz_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_encoder *lz, - const lzma_allocator *allocator, - lzma_vli id, const void *options, - lzma_lz_options *lz_options)); - - -extern uint64_t lzma_lz_encoder_memusage(const lzma_lz_options *lz_options); - - -// These are only for LZ encoder's internal use. -extern uint32_t lzma_mf_find( - lzma_mf *mf, uint32_t *count, lzma_match *matches); - -extern uint32_t lzma_mf_hc3_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_hc3_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_hc4_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_hc4_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt2_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt2_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt3_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt3_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt4_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt4_skip(lzma_mf *dict, uint32_t amount); - -#endif diff --git a/software/src/xz/src/liblzma/lz/lz_encoder_hash.h b/software/src/xz/src/liblzma/lz/lz_encoder_hash.h deleted file mode 100644 index 6d4bf83..0000000 --- a/software/src/xz/src/liblzma/lz/lz_encoder_hash.h +++ /dev/null @@ -1,122 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder_hash.h -/// \brief Hash macros for match finders -// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_ENCODER_HASH_H -#define LZMA_LZ_ENCODER_HASH_H - -// We need to know if CRC32_GENERIC is defined and we may need the declaration -// of lzma_crc32_table[][]. -#include "crc_common.h" - -// If HAVE_SMALL is defined, then lzma_crc32_table[][] exists and -// it's little endian even on big endian systems. -// -// If HAVE_SMALL isn't defined, lzma_crc32_table[][] is in native endian -// but we want a little endian one so that the compressed output won't -// depend on the processor endianness. Big endian systems are less common -// so those get the burden of an extra 1 KiB table. -// -// If HAVE_SMALL isn't defined and CRC32_GENERIC isn't defined either, -// then lzma_crc32_table[][] doesn't exist. -#if defined(HAVE_SMALL) \ - || (defined(CRC32_GENERIC) && !defined(WORDS_BIGENDIAN)) -# define hash_table lzma_crc32_table[0] -#else - // lz_encoder.c takes care of including the actual table. - lzma_attr_visibility_hidden - extern const uint32_t lzma_lz_hash_table[256]; -# define hash_table lzma_lz_hash_table -# define LZMA_LZ_HASH_TABLE_IS_NEEDED 1 -#endif - -#define HASH_2_SIZE (UINT32_C(1) << 10) -#define HASH_3_SIZE (UINT32_C(1) << 16) -#define HASH_4_SIZE (UINT32_C(1) << 20) - -#define HASH_2_MASK (HASH_2_SIZE - 1) -#define HASH_3_MASK (HASH_3_SIZE - 1) -#define HASH_4_MASK (HASH_4_SIZE - 1) - -#define FIX_3_HASH_SIZE (HASH_2_SIZE) -#define FIX_4_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE) -#define FIX_5_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE + HASH_4_SIZE) - -// Endianness doesn't matter in hash_2_calc() (no effect on the output). -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define hash_2_calc() \ - const uint32_t hash_value = read16ne(cur) -#else -# define hash_2_calc() \ - const uint32_t hash_value \ - = (uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8) -#endif - -#define hash_3_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & mf->hash_mask - -#define hash_4_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - const uint32_t hash_value = (temp ^ ((uint32_t)(cur[2]) << 8) \ - ^ (hash_table[cur[3]] << 5)) & mf->hash_mask - - -// The following are not currently used. - -#define hash_5_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ - ^ hash_table[cur[3]] << 5); \ - const uint32_t hash_value \ - = (hash_4_value ^ (hash_table[cur[4]] << 3)) \ - & mf->hash_mask; \ - hash_4_value &= HASH_4_MASK - -/* -#define hash_zip_calc() \ - const uint32_t hash_value \ - = (((uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8)) \ - ^ hash_table[cur[2]]) & 0xFFFF -*/ - -#define hash_zip_calc() \ - const uint32_t hash_value \ - = (((uint32_t)(cur[2]) | ((uint32_t)(cur[0]) << 8)) \ - ^ hash_table[cur[1]]) & 0xFFFF - -#define mt_hash_2_calc() \ - const uint32_t hash_2_value \ - = (hash_table[cur[0]] ^ cur[1]) & HASH_2_MASK - -#define mt_hash_3_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK - -#define mt_hash_4_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - const uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ - (hash_table[cur[3]] << 5)) & HASH_4_MASK - -#endif diff --git a/software/src/xz/src/liblzma/lz/lz_encoder_hash_table.h b/software/src/xz/src/liblzma/lz/lz_encoder_hash_table.h deleted file mode 100644 index 2b3a60e..0000000 --- a/software/src/xz/src/liblzma/lz/lz_encoder_hash_table.h +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by crc32_tablegen.c. - -const uint32_t lzma_lz_hash_table[256] = { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -}; diff --git a/software/src/xz/src/liblzma/lz/lz_encoder_mf.c b/software/src/xz/src/liblzma/lz/lz_encoder_mf.c deleted file mode 100644 index 557c261..0000000 --- a/software/src/xz/src/liblzma/lz/lz_encoder_mf.c +++ /dev/null @@ -1,744 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder_mf.c -/// \brief Match finders -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_encoder.h" -#include "lz_encoder_hash.h" -#include "memcmplen.h" - - -/// \brief Find matches starting from the current byte -/// -/// \return The length of the longest match found -extern uint32_t -lzma_mf_find(lzma_mf *mf, uint32_t *count_ptr, lzma_match *matches) -{ - // Call the match finder. It returns the number of length-distance - // pairs found. - // FIXME: Minimum count is zero, what _exactly_ is the maximum? - const uint32_t count = mf->find(mf, matches); - - // Length of the longest match; assume that no matches were found - // and thus the maximum length is zero. - uint32_t len_best = 0; - - if (count > 0) { -#ifndef NDEBUG - // Validate the matches. - for (uint32_t i = 0; i < count; ++i) { - assert(matches[i].len <= mf->nice_len); - assert(matches[i].dist < mf->read_pos); - assert(memcmp(mf_ptr(mf) - 1, - mf_ptr(mf) - matches[i].dist - 2, - matches[i].len) == 0); - } -#endif - - // The last used element in the array contains - // the longest match. - len_best = matches[count - 1].len; - - // If a match of maximum search length was found, try to - // extend the match to maximum possible length. - if (len_best == mf->nice_len) { - // The limit for the match length is either the - // maximum match length supported by the LZ-based - // encoder or the number of bytes left in the - // dictionary, whichever is smaller. - uint32_t limit = mf_avail(mf) + 1; - if (limit > mf->match_len_max) - limit = mf->match_len_max; - - // Pointer to the byte we just ran through - // the match finder. - const uint8_t *p1 = mf_ptr(mf) - 1; - - // Pointer to the beginning of the match. We need -1 - // here because the match distances are zero based. - const uint8_t *p2 = p1 - matches[count - 1].dist - 1; - - len_best = lzma_memcmplen(p1, p2, len_best, limit); - } - } - - *count_ptr = count; - - // Finally update the read position to indicate that match finder was - // run for this dictionary offset. - ++mf->read_ahead; - - return len_best; -} - - -/// Hash value to indicate unused element in the hash. Since we start the -/// positions from dict_size + 1, zero is always too far to qualify -/// as usable match position. -#define EMPTY_HASH_VALUE 0 - - -/// Normalization must be done when lzma_mf.offset + lzma_mf.read_pos -/// reaches MUST_NORMALIZE_POS. -#define MUST_NORMALIZE_POS UINT32_MAX - - -/// \brief Normalizes hash values -/// -/// The hash arrays store positions of match candidates. The positions are -/// relative to an arbitrary offset that is not the same as the absolute -/// offset in the input stream. The relative position of the current byte -/// is lzma_mf.offset + lzma_mf.read_pos. The distances of the matches are -/// the differences of the current read position and the position found from -/// the hash. -/// -/// To prevent integer overflows of the offsets stored in the hash arrays, -/// we need to "normalize" the stored values now and then. During the -/// normalization, we drop values that indicate distance greater than the -/// dictionary size, thus making space for new values. -static void -normalize(lzma_mf *mf) -{ - assert(mf->read_pos + mf->offset == MUST_NORMALIZE_POS); - - // In future we may not want to touch the lowest bits, because there - // may be match finders that use larger resolution than one byte. - const uint32_t subvalue - = (MUST_NORMALIZE_POS - mf->cyclic_size); - // & ~((UINT32_C(1) << 10) - 1); - - for (uint32_t i = 0; i < mf->hash_count; ++i) { - // If the distance is greater than the dictionary size, - // we can simply mark the hash element as empty. - if (mf->hash[i] <= subvalue) - mf->hash[i] = EMPTY_HASH_VALUE; - else - mf->hash[i] -= subvalue; - } - - for (uint32_t i = 0; i < mf->sons_count; ++i) { - // Do the same for mf->son. - // - // NOTE: There may be uninitialized elements in mf->son. - // Valgrind may complain that the "if" below depends on - // an uninitialized value. In this case it is safe to ignore - // the warning. See also the comments in lz_encoder_init() - // in lz_encoder.c. - if (mf->son[i] <= subvalue) - mf->son[i] = EMPTY_HASH_VALUE; - else - mf->son[i] -= subvalue; - } - - // Update offset to match the new locations. - mf->offset -= subvalue; - - return; -} - - -/// Mark the current byte as processed from point of view of the match finder. -static void -move_pos(lzma_mf *mf) -{ - if (++mf->cyclic_pos == mf->cyclic_size) - mf->cyclic_pos = 0; - - ++mf->read_pos; - assert(mf->read_pos <= mf->write_pos); - - if (unlikely(mf->read_pos + mf->offset == UINT32_MAX)) - normalize(mf); -} - - -/// When flushing, we cannot run the match finder unless there is nice_len -/// bytes available in the dictionary. Instead, we skip running the match -/// finder (indicating that no match was found), and count how many bytes we -/// have ignored this way. -/// -/// When new data is given after the flushing was completed, the match finder -/// is restarted by rewinding mf->read_pos backwards by mf->pending. Then -/// the missed bytes are added to the hash using the match finder's skip -/// function (with small amount of input, it may start using mf->pending -/// again if flushing). -/// -/// Due to this rewinding, we don't touch cyclic_pos or test for -/// normalization. It will be done when the match finder's skip function -/// catches up after a flush. -static void -move_pending(lzma_mf *mf) -{ - ++mf->read_pos; - assert(mf->read_pos <= mf->write_pos); - ++mf->pending; -} - - -/// Calculate len_limit and determine if there is enough input to run -/// the actual match finder code. Sets up "cur" and "pos". This macro -/// is used by all find functions and binary tree skip functions. Hash -/// chain skip function doesn't need len_limit so a simpler code is used -/// in them. -#define header(is_bt, len_min, ret_op) \ - uint32_t len_limit = mf_avail(mf); \ - if (mf->nice_len <= len_limit) { \ - len_limit = mf->nice_len; \ - } else if (len_limit < (len_min) \ - || (is_bt && mf->action == LZMA_SYNC_FLUSH)) { \ - assert(mf->action != LZMA_RUN); \ - move_pending(mf); \ - ret_op; \ - } \ - const uint8_t *cur = mf_ptr(mf); \ - const uint32_t pos = mf->read_pos + mf->offset - - -/// Header for find functions. "return 0" indicates that zero matches -/// were found. -#define header_find(is_bt, len_min) \ - header(is_bt, len_min, return 0); \ - uint32_t matches_count = 0 - - -/// Header for a loop in a skip function. "continue" tells to skip the rest -/// of the code in the loop. -#define header_skip(is_bt, len_min) \ - header(is_bt, len_min, continue) - - -/// Calls hc_find_func() or bt_find_func() and calculates the total number -/// of matches found. Updates the dictionary position and returns the number -/// of matches found. -#define call_find(func, len_best) \ -do { \ - matches_count = (uint32_t)(func(len_limit, pos, cur, cur_match, \ - mf->depth, mf->son, \ - mf->cyclic_pos, mf->cyclic_size, \ - matches + matches_count, len_best) \ - - matches); \ - move_pos(mf); \ - return matches_count; \ -} while (0) - - -//////////////// -// Hash Chain // -//////////////// - -#if defined(HAVE_MF_HC3) || defined(HAVE_MF_HC4) -/// -/// -/// \param len_limit Don't look for matches longer than len_limit. -/// \param pos lzma_mf.read_pos + lzma_mf.offset -/// \param cur Pointer to current byte (mf_ptr(mf)) -/// \param cur_match Start position of the current match candidate -/// \param depth Maximum length of the hash chain -/// \param son lzma_mf.son (contains the hash chain) -/// \param cyclic_pos lzma_mf.cyclic_pos -/// \param cyclic_size lzma_mf_cyclic_size -/// \param matches Array to hold the matches. -/// \param len_best The length of the longest match found so far. -static lzma_match * -hc_find_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size, - lzma_match *matches, - uint32_t len_best) -{ - son[cyclic_pos] = cur_match; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) - return matches; - - const uint8_t *const pb = cur - delta; - cur_match = son[cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)]; - - if (pb[len_best] == cur[len_best] && pb[0] == cur[0]) { - uint32_t len = lzma_memcmplen(pb, cur, 1, len_limit); - - if (len_best < len) { - len_best = len; - matches->len = len; - matches->dist = delta - 1; - ++matches; - - if (len == len_limit) - return matches; - } - } - } -} - - -#define hc_find(len_best) \ - call_find(hc_find_func, len_best) - - -#define hc_skip() \ -do { \ - mf->son[mf->cyclic_pos] = cur_match; \ - move_pos(mf); \ -} while (0) - -#endif - - -#ifdef HAVE_MF_HC3 -extern uint32_t -lzma_mf_hc3_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(false, 3); - - hash_3_calc(); - - const uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t cur_match = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 2; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = lzma_memcmplen(cur - delta2, cur, - len_best, len_limit); - - matches[0].len = len_best; - matches[0].dist = delta2 - 1; - matches_count = 1; - - if (len_best == len_limit) { - hc_skip(); - return 1; // matches_count - } - } - - hc_find(len_best); -} - - -extern void -lzma_mf_hc3_skip(lzma_mf *mf, uint32_t amount) -{ - do { - if (mf_avail(mf) < 3) { - move_pending(mf); - continue; - } - - const uint8_t *cur = mf_ptr(mf); - const uint32_t pos = mf->read_pos + mf->offset; - - hash_3_calc(); - - const uint32_t cur_match - = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - hc_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_HC4 -extern uint32_t -lzma_mf_hc4_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(false, 4); - - hash_4_calc(); - - uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t delta3 - = pos - mf->hash[FIX_3_HASH_SIZE + hash_3_value]; - const uint32_t cur_match = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value ] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 1; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = 2; - matches[0].len = 2; - matches[0].dist = delta2 - 1; - matches_count = 1; - } - - if (delta2 != delta3 && delta3 < mf->cyclic_size - && *(cur - delta3) == *cur) { - len_best = 3; - matches[matches_count++].dist = delta3 - 1; - delta2 = delta3; - } - - if (matches_count != 0) { - len_best = lzma_memcmplen(cur - delta2, cur, - len_best, len_limit); - - matches[matches_count - 1].len = len_best; - - if (len_best == len_limit) { - hc_skip(); - return matches_count; - } - } - - if (len_best < 3) - len_best = 3; - - hc_find(len_best); -} - - -extern void -lzma_mf_hc4_skip(lzma_mf *mf, uint32_t amount) -{ - do { - if (mf_avail(mf) < 4) { - move_pending(mf); - continue; - } - - const uint8_t *cur = mf_ptr(mf); - const uint32_t pos = mf->read_pos + mf->offset; - - hash_4_calc(); - - const uint32_t cur_match - = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - hc_skip(); - - } while (--amount != 0); -} -#endif - - -///////////////// -// Binary Tree // -///////////////// - -#if defined(HAVE_MF_BT2) || defined(HAVE_MF_BT3) || defined(HAVE_MF_BT4) -static lzma_match * -bt_find_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size, - lzma_match *matches, - uint32_t len_best) -{ - uint32_t *ptr0 = son + (cyclic_pos << 1) + 1; - uint32_t *ptr1 = son + (cyclic_pos << 1); - - uint32_t len0 = 0; - uint32_t len1 = 0; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) { - *ptr0 = EMPTY_HASH_VALUE; - *ptr1 = EMPTY_HASH_VALUE; - return matches; - } - - uint32_t *const pair = son + ((cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)) - << 1); - - const uint8_t *const pb = cur - delta; - uint32_t len = my_min(len0, len1); - - if (pb[len] == cur[len]) { - len = lzma_memcmplen(pb, cur, len + 1, len_limit); - - if (len_best < len) { - len_best = len; - matches->len = len; - matches->dist = delta - 1; - ++matches; - - if (len == len_limit) { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return matches; - } - } - } - - if (pb[len] < cur[len]) { - *ptr1 = cur_match; - ptr1 = pair + 1; - cur_match = *ptr1; - len1 = len; - } else { - *ptr0 = cur_match; - ptr0 = pair; - cur_match = *ptr0; - len0 = len; - } - } -} - - -static void -bt_skip_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size) -{ - uint32_t *ptr0 = son + (cyclic_pos << 1) + 1; - uint32_t *ptr1 = son + (cyclic_pos << 1); - - uint32_t len0 = 0; - uint32_t len1 = 0; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) { - *ptr0 = EMPTY_HASH_VALUE; - *ptr1 = EMPTY_HASH_VALUE; - return; - } - - uint32_t *pair = son + ((cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)) - << 1); - const uint8_t *pb = cur - delta; - uint32_t len = my_min(len0, len1); - - if (pb[len] == cur[len]) { - len = lzma_memcmplen(pb, cur, len + 1, len_limit); - - if (len == len_limit) { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return; - } - } - - if (pb[len] < cur[len]) { - *ptr1 = cur_match; - ptr1 = pair + 1; - cur_match = *ptr1; - len1 = len; - } else { - *ptr0 = cur_match; - ptr0 = pair; - cur_match = *ptr0; - len0 = len; - } - } -} - - -#define bt_find(len_best) \ - call_find(bt_find_func, len_best) - -#define bt_skip() \ -do { \ - bt_skip_func(len_limit, pos, cur, cur_match, mf->depth, \ - mf->son, mf->cyclic_pos, \ - mf->cyclic_size); \ - move_pos(mf); \ -} while (0) - -#endif - - -#ifdef HAVE_MF_BT2 -extern uint32_t -lzma_mf_bt2_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 2); - - hash_2_calc(); - - const uint32_t cur_match = mf->hash[hash_value]; - mf->hash[hash_value] = pos; - - bt_find(1); -} - - -extern void -lzma_mf_bt2_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 2); - - hash_2_calc(); - - const uint32_t cur_match = mf->hash[hash_value]; - mf->hash[hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_BT3 -extern uint32_t -lzma_mf_bt3_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 3); - - hash_3_calc(); - - const uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t cur_match = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 2; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = lzma_memcmplen( - cur, cur - delta2, len_best, len_limit); - - matches[0].len = len_best; - matches[0].dist = delta2 - 1; - matches_count = 1; - - if (len_best == len_limit) { - bt_skip(); - return 1; // matches_count - } - } - - bt_find(len_best); -} - - -extern void -lzma_mf_bt3_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 3); - - hash_3_calc(); - - const uint32_t cur_match - = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_BT4 -extern uint32_t -lzma_mf_bt4_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 4); - - hash_4_calc(); - - uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t delta3 - = pos - mf->hash[FIX_3_HASH_SIZE + hash_3_value]; - const uint32_t cur_match = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 1; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = 2; - matches[0].len = 2; - matches[0].dist = delta2 - 1; - matches_count = 1; - } - - if (delta2 != delta3 && delta3 < mf->cyclic_size - && *(cur - delta3) == *cur) { - len_best = 3; - matches[matches_count++].dist = delta3 - 1; - delta2 = delta3; - } - - if (matches_count != 0) { - len_best = lzma_memcmplen( - cur, cur - delta2, len_best, len_limit); - - matches[matches_count - 1].len = len_best; - - if (len_best == len_limit) { - bt_skip(); - return matches_count; - } - } - - if (len_best < 3) - len_best = 3; - - bt_find(len_best); -} - - -extern void -lzma_mf_bt4_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 4); - - hash_4_calc(); - - const uint32_t cur_match - = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif diff --git a/software/src/xz/src/liblzma/lzma/Makefile.inc b/software/src/xz/src/liblzma/lzma/Makefile.inc deleted file mode 100644 index dca6b76..0000000 --- a/software/src/xz/src/liblzma/lzma/Makefile.inc +++ /dev/null @@ -1,40 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -EXTRA_DIST += lzma/fastpos_tablegen.c - -liblzma_la_SOURCES += \ - lzma/lzma_common.h \ - lzma/lzma_encoder_presets.c - -if COND_ENCODER_LZMA1 -liblzma_la_SOURCES += \ - lzma/fastpos.h \ - lzma/lzma_encoder.h \ - lzma/lzma_encoder.c \ - lzma/lzma_encoder_private.h \ - lzma/lzma_encoder_optimum_fast.c \ - lzma/lzma_encoder_optimum_normal.c - -if !COND_SMALL -liblzma_la_SOURCES += lzma/fastpos_table.c -endif -endif - -if COND_DECODER_LZMA1 -liblzma_la_SOURCES += \ - lzma/lzma_decoder.c \ - lzma/lzma_decoder.h -endif - -if COND_ENCODER_LZMA2 -liblzma_la_SOURCES += \ - lzma/lzma2_encoder.c \ - lzma/lzma2_encoder.h -endif - -if COND_DECODER_LZMA2 -liblzma_la_SOURCES += \ - lzma/lzma2_decoder.c \ - lzma/lzma2_decoder.h -endif diff --git a/software/src/xz/src/liblzma/lzma/fastpos.h b/software/src/xz/src/liblzma/lzma/fastpos.h deleted file mode 100644 index d3969a7..0000000 --- a/software/src/xz/src/liblzma/lzma/fastpos.h +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file fastpos.h -/// \brief Kind of two-bit version of bit scan reverse -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FASTPOS_H -#define LZMA_FASTPOS_H - -// LZMA encodes match distances by storing the highest two bits using -// a six-bit value [0, 63], and then the missing lower bits. -// Dictionary size is also stored using this encoding in the .xz -// file format header. -// -// fastpos.h provides a way to quickly find out the correct six-bit -// values. The following table gives some examples of this encoding: -// -// dist return -// 0 0 -// 1 1 -// 2 2 -// 3 3 -// 4 4 -// 5 4 -// 6 5 -// 7 5 -// 8 6 -// 11 6 -// 12 7 -// ... ... -// 15 7 -// 16 8 -// 17 8 -// ... ... -// 23 8 -// 24 9 -// 25 9 -// ... ... -// -// -// Provided functions or macros -// ---------------------------- -// -// get_dist_slot(dist) is the basic version. get_dist_slot_2(dist) -// assumes that dist >= FULL_DISTANCES, thus the result is at least -// FULL_DISTANCES_BITS * 2. Using get_dist_slot(dist) instead of -// get_dist_slot_2(dist) would give the same result, but get_dist_slot_2(dist) -// should be tiny bit faster due to the assumption being made. -// -// -// Size vs. speed -// -------------- -// -// With some CPUs that have fast BSR (bit scan reverse) instruction, the -// size optimized version is slightly faster than the bigger table based -// approach. Such CPUs include Intel Pentium Pro, Pentium II, Pentium III -// and Core 2 (possibly others). AMD K7 seems to have slower BSR, but that -// would still have speed roughly comparable to the table version. Older -// x86 CPUs like the original Pentium have very slow BSR; on those systems -// the table version is a lot faster. -// -// On some CPUs, the table version is a lot faster when using position -// dependent code, but with position independent code the size optimized -// version is slightly faster. This occurs at least on 32-bit SPARC (no -// ASM optimizations). -// -// I'm making the table version the default, because that has good speed -// on all systems I have tried. The size optimized version is sometimes -// slightly faster, but sometimes it is a lot slower. - -#ifdef HAVE_SMALL -# define get_dist_slot(dist) \ - ((dist) <= 4 ? (dist) : get_dist_slot_2(dist)) - -static inline uint32_t -get_dist_slot_2(uint32_t dist) -{ - const uint32_t i = bsr32(dist); - return (i + i) + ((dist >> (i - 1)) & 1); -} - - -#else - -#define FASTPOS_BITS 13 - -lzma_attr_visibility_hidden -extern const uint8_t lzma_fastpos[1 << FASTPOS_BITS]; - - -#define fastpos_shift(extra, n) \ - ((extra) + (n) * (FASTPOS_BITS - 1)) - -#define fastpos_limit(extra, n) \ - (UINT32_C(1) << (FASTPOS_BITS + fastpos_shift(extra, n))) - -#define fastpos_result(dist, extra, n) \ - (uint32_t)(lzma_fastpos[(dist) >> fastpos_shift(extra, n)]) \ - + 2 * fastpos_shift(extra, n) - - -static inline uint32_t -get_dist_slot(uint32_t dist) -{ - // If it is small enough, we can pick the result directly from - // the precalculated table. - if (dist < fastpos_limit(0, 0)) - return lzma_fastpos[dist]; - - if (dist < fastpos_limit(0, 1)) - return fastpos_result(dist, 0, 1); - - return fastpos_result(dist, 0, 2); -} - - -#ifdef FULL_DISTANCES_BITS -static inline uint32_t -get_dist_slot_2(uint32_t dist) -{ - assert(dist >= FULL_DISTANCES); - - if (dist < fastpos_limit(FULL_DISTANCES_BITS - 1, 0)) - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 0); - - if (dist < fastpos_limit(FULL_DISTANCES_BITS - 1, 1)) - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 1); - - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 2); -} -#endif - -#endif - -#endif diff --git a/software/src/xz/src/liblzma/lzma/fastpos_table.c b/software/src/xz/src/liblzma/lzma/fastpos_table.c deleted file mode 100644 index 4e10e37..0000000 --- a/software/src/xz/src/liblzma/lzma/fastpos_table.c +++ /dev/null @@ -1,521 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by fastpos_tablegen.c. - -#include "common.h" -#include "fastpos.h" - -const uint8_t lzma_fastpos[1 << FASTPOS_BITS] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25 -}; diff --git a/software/src/xz/src/liblzma/lzma/fastpos_tablegen.c b/software/src/xz/src/liblzma/lzma/fastpos_tablegen.c deleted file mode 100644 index 957ccb7..0000000 --- a/software/src/xz/src/liblzma/lzma/fastpos_tablegen.c +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file fastpos_tablegen.c -/// \brief Generates the lzma_fastpos[] lookup table -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include -#include - -#define lzma_attr_visibility_hidden -#include "fastpos.h" - - -int -main(void) -{ - uint8_t fastpos[1 << FASTPOS_BITS]; - - const uint8_t fast_slots = 2 * FASTPOS_BITS; - uint32_t c = 2; - - fastpos[0] = 0; - fastpos[1] = 1; - - for (uint8_t slot_fast = 2; slot_fast < fast_slots; ++slot_fast) { - const uint32_t k = 1 << ((slot_fast >> 1) - 1); - for (uint32_t j = 0; j < k; ++j, ++c) - fastpos[c] = slot_fast; - } - - // Split the SPDX string so that it won't accidentally match - // when tools search for the string. - printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" - "// This file has been generated by fastpos_tablegen.c.\n\n" - "#include \"common.h\"\n" - "#include \"fastpos.h\"\n\n" - "const uint8_t lzma_fastpos[1 << FASTPOS_BITS] = {"); - - for (size_t i = 0; i < (1 << FASTPOS_BITS); ++i) { - if (i % 16 == 0) - printf("\n\t"); - - printf("%3u", (unsigned int)(fastpos[i])); - - if (i != (1 << FASTPOS_BITS) - 1) - printf(","); - } - - printf("\n};\n"); - - return 0; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma2_decoder.c b/software/src/xz/src/liblzma/lzma/lzma2_decoder.c deleted file mode 100644 index 37ab253..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma2_decoder.c +++ /dev/null @@ -1,310 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma2_decoder.c -/// \brief LZMA2 decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma2_decoder.h" -#include "lz_decoder.h" -#include "lzma_decoder.h" - - -typedef struct { - enum sequence { - SEQ_CONTROL, - SEQ_UNCOMPRESSED_1, - SEQ_UNCOMPRESSED_2, - SEQ_COMPRESSED_0, - SEQ_COMPRESSED_1, - SEQ_PROPERTIES, - SEQ_LZMA, - SEQ_COPY, - } sequence; - - /// Sequence after the size fields have been decoded. - enum sequence next_sequence; - - /// LZMA decoder - lzma_lz_decoder lzma; - - /// Uncompressed size of LZMA chunk - size_t uncompressed_size; - - /// Compressed size of the chunk (naturally equals to uncompressed - /// size of uncompressed chunk) - size_t compressed_size; - - /// True if properties are needed. This is false before the - /// first LZMA chunk. - bool need_properties; - - /// True if dictionary reset is needed. This is false before the - /// first chunk (LZMA or uncompressed). - bool need_dictionary_reset; - - lzma_options_lzma options; -} lzma_lzma2_coder; - - -static lzma_ret -lzma2_decode(void *coder_ptr, lzma_dict *restrict dict, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size) -{ - lzma_lzma2_coder *restrict coder = coder_ptr; - - // With SEQ_LZMA it is possible that no new input is needed to do - // some progress. The rest of the sequences assume that there is - // at least one byte of input. - while (*in_pos < in_size || coder->sequence == SEQ_LZMA) - switch (coder->sequence) { - case SEQ_CONTROL: { - const uint32_t control = in[*in_pos]; - ++*in_pos; - - // End marker - if (control == 0x00) - return LZMA_STREAM_END; - - if (control >= 0xE0 || control == 1) { - // Dictionary reset implies that next LZMA chunk has - // to set new properties. - coder->need_properties = true; - coder->need_dictionary_reset = true; - } else if (coder->need_dictionary_reset) { - return LZMA_DATA_ERROR; - } - - if (control >= 0x80) { - // LZMA chunk. The highest five bits of the - // uncompressed size are taken from the control byte. - coder->uncompressed_size = (control & 0x1F) << 16; - coder->sequence = SEQ_UNCOMPRESSED_1; - - // See if there are new properties or if we need to - // reset the state. - if (control >= 0xC0) { - // When there are new properties, state reset - // is done at SEQ_PROPERTIES. - coder->need_properties = false; - coder->next_sequence = SEQ_PROPERTIES; - - } else if (coder->need_properties) { - return LZMA_DATA_ERROR; - - } else { - coder->next_sequence = SEQ_LZMA; - - // If only state reset is wanted with old - // properties, do the resetting here for - // simplicity. - if (control >= 0xA0) - coder->lzma.reset(coder->lzma.coder, - &coder->options); - } - } else { - // Invalid control values - if (control > 2) - return LZMA_DATA_ERROR; - - // It's uncompressed chunk - coder->sequence = SEQ_COMPRESSED_0; - coder->next_sequence = SEQ_COPY; - } - - if (coder->need_dictionary_reset) { - // Finish the dictionary reset and let the caller - // flush the dictionary to the actual output buffer. - coder->need_dictionary_reset = false; - dict_reset(dict); - return LZMA_OK; - } - - break; - } - - case SEQ_UNCOMPRESSED_1: - coder->uncompressed_size += (uint32_t)(in[(*in_pos)++]) << 8; - coder->sequence = SEQ_UNCOMPRESSED_2; - break; - - case SEQ_UNCOMPRESSED_2: - coder->uncompressed_size += in[(*in_pos)++] + 1U; - coder->sequence = SEQ_COMPRESSED_0; - coder->lzma.set_uncompressed(coder->lzma.coder, - coder->uncompressed_size, false); - break; - - case SEQ_COMPRESSED_0: - coder->compressed_size = (uint32_t)(in[(*in_pos)++]) << 8; - coder->sequence = SEQ_COMPRESSED_1; - break; - - case SEQ_COMPRESSED_1: - coder->compressed_size += in[(*in_pos)++] + 1U; - coder->sequence = coder->next_sequence; - break; - - case SEQ_PROPERTIES: - if (lzma_lzma_lclppb_decode(&coder->options, in[(*in_pos)++])) - return LZMA_DATA_ERROR; - - coder->lzma.reset(coder->lzma.coder, &coder->options); - - coder->sequence = SEQ_LZMA; - break; - - case SEQ_LZMA: { - // Store the start offset so that we can update - // coder->compressed_size later. - const size_t in_start = *in_pos; - - // Decode from in[] to *dict. - const lzma_ret ret = coder->lzma.code(coder->lzma.coder, - dict, in, in_pos, in_size); - - // Validate and update coder->compressed_size. - const size_t in_used = *in_pos - in_start; - if (in_used > coder->compressed_size) - return LZMA_DATA_ERROR; - - coder->compressed_size -= in_used; - - // Return if we didn't finish the chunk, or an error occurred. - if (ret != LZMA_STREAM_END) - return ret; - - // The LZMA decoder must have consumed the whole chunk now. - // We don't need to worry about uncompressed size since it - // is checked by the LZMA decoder. - if (coder->compressed_size != 0) - return LZMA_DATA_ERROR; - - coder->sequence = SEQ_CONTROL; - break; - } - - case SEQ_COPY: { - // Copy from input to the dictionary as is. - dict_write(dict, in, in_pos, in_size, &coder->compressed_size); - if (coder->compressed_size != 0) - return LZMA_OK; - - coder->sequence = SEQ_CONTROL; - break; - } - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -lzma2_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_lzma2_coder *coder = coder_ptr; - - assert(coder->lzma.end == NULL); - lzma_free(coder->lzma.coder, allocator); - - lzma_free(coder, allocator); - - return; -} - - -static lzma_ret -lzma2_decoder_init(lzma_lz_decoder *lz, const lzma_allocator *allocator, - lzma_vli id lzma_attribute((__unused__)), const void *opt, - lzma_lz_options *lz_options) -{ - lzma_lzma2_coder *coder = lz->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_lzma2_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - lz->coder = coder; - lz->code = &lzma2_decode; - lz->end = &lzma2_decoder_end; - - coder->lzma = LZMA_LZ_DECODER_INIT; - } - - const lzma_options_lzma *options = opt; - - coder->sequence = SEQ_CONTROL; - coder->need_properties = true; - coder->need_dictionary_reset = options->preset_dict == NULL - || options->preset_dict_size == 0; - - return lzma_lzma_decoder_create(&coder->lzma, - allocator, options, lz_options); -} - - -extern lzma_ret -lzma_lzma2_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - // LZMA2 can only be the last filter in the chain. This is enforced - // by the raw_decoder initialization. - assert(filters[1].init == NULL); - - return lzma_lz_decoder_init(next, allocator, filters, - &lzma2_decoder_init); -} - - -extern uint64_t -lzma_lzma2_decoder_memusage(const void *options) -{ - return sizeof(lzma_lzma2_coder) - + lzma_lzma_decoder_memusage_nocheck(options); -} - - -extern lzma_ret -lzma_lzma2_props_decode(void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - if (props_size != 1) - return LZMA_OPTIONS_ERROR; - - // Check that reserved bits are unset. - if (props[0] & 0xC0) - return LZMA_OPTIONS_ERROR; - - // Decode the dictionary size. - if (props[0] > 40) - return LZMA_OPTIONS_ERROR; - - lzma_options_lzma *opt = lzma_alloc( - sizeof(lzma_options_lzma), allocator); - if (opt == NULL) - return LZMA_MEM_ERROR; - - if (props[0] == 40) { - opt->dict_size = UINT32_MAX; - } else { - opt->dict_size = 2 | (props[0] & 1U); - opt->dict_size <<= props[0] / 2U + 11; - } - - opt->preset_dict = NULL; - opt->preset_dict_size = 0; - - *options = opt; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma2_decoder.h b/software/src/xz/src/liblzma/lzma/lzma2_decoder.h deleted file mode 100644 index cdd8b46..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma2_decoder.h +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma2_decoder.h -/// \brief LZMA2 decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA2_DECODER_H -#define LZMA_LZMA2_DECODER_H - -#include "common.h" - -extern lzma_ret lzma_lzma2_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern uint64_t lzma_lzma2_decoder_memusage(const void *options); - -extern lzma_ret lzma_lzma2_props_decode( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - -#endif diff --git a/software/src/xz/src/liblzma/lzma/lzma2_encoder.c b/software/src/xz/src/liblzma/lzma/lzma2_encoder.c deleted file mode 100644 index 71cfd9b..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma2_encoder.c +++ /dev/null @@ -1,413 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma2_encoder.c -/// \brief LZMA2 encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_encoder.h" -#include "lzma_encoder.h" -#include "fastpos.h" -#include "lzma2_encoder.h" - - -typedef struct { - enum { - SEQ_INIT, - SEQ_LZMA_ENCODE, - SEQ_LZMA_COPY, - SEQ_UNCOMPRESSED_HEADER, - SEQ_UNCOMPRESSED_COPY, - } sequence; - - /// LZMA encoder - void *lzma; - - /// LZMA options currently in use. - lzma_options_lzma opt_cur; - - bool need_properties; - bool need_state_reset; - bool need_dictionary_reset; - - /// Uncompressed size of a chunk - size_t uncompressed_size; - - /// Compressed size of a chunk (excluding headers); this is also used - /// to indicate the end of buf[] in SEQ_LZMA_COPY. - size_t compressed_size; - - /// Read position in buf[] - size_t buf_pos; - - /// Buffer to hold the chunk header and LZMA compressed data - uint8_t buf[LZMA2_HEADER_MAX + LZMA2_CHUNK_MAX]; -} lzma_lzma2_coder; - - -static void -lzma2_header_lzma(lzma_lzma2_coder *coder) -{ - assert(coder->uncompressed_size > 0); - assert(coder->uncompressed_size <= LZMA2_UNCOMPRESSED_MAX); - assert(coder->compressed_size > 0); - assert(coder->compressed_size <= LZMA2_CHUNK_MAX); - - size_t pos; - - if (coder->need_properties) { - pos = 0; - - if (coder->need_dictionary_reset) - coder->buf[pos] = 0x80 + (3 << 5); - else - coder->buf[pos] = 0x80 + (2 << 5); - } else { - pos = 1; - - if (coder->need_state_reset) - coder->buf[pos] = 0x80 + (1 << 5); - else - coder->buf[pos] = 0x80; - } - - // Set the start position for copying. - coder->buf_pos = pos; - - // Uncompressed size - size_t size = coder->uncompressed_size - 1; - coder->buf[pos++] += size >> 16; - coder->buf[pos++] = (size >> 8) & 0xFF; - coder->buf[pos++] = size & 0xFF; - - // Compressed size - size = coder->compressed_size - 1; - coder->buf[pos++] = size >> 8; - coder->buf[pos++] = size & 0xFF; - - // Properties, if needed - if (coder->need_properties) - lzma_lzma_lclppb_encode(&coder->opt_cur, coder->buf + pos); - - coder->need_properties = false; - coder->need_state_reset = false; - coder->need_dictionary_reset = false; - - // The copying code uses coder->compressed_size to indicate the end - // of coder->buf[], so we need add the maximum size of the header here. - coder->compressed_size += LZMA2_HEADER_MAX; - - return; -} - - -static void -lzma2_header_uncompressed(lzma_lzma2_coder *coder) -{ - assert(coder->uncompressed_size > 0); - assert(coder->uncompressed_size <= LZMA2_CHUNK_MAX); - - // If this is the first chunk, we need to include dictionary - // reset indicator. - if (coder->need_dictionary_reset) - coder->buf[0] = 1; - else - coder->buf[0] = 2; - - coder->need_dictionary_reset = false; - - // "Compressed" size - coder->buf[1] = (coder->uncompressed_size - 1) >> 8; - coder->buf[2] = (coder->uncompressed_size - 1) & 0xFF; - - // Set the start position for copying. - coder->buf_pos = 0; - return; -} - - -static lzma_ret -lzma2_encode(void *coder_ptr, lzma_mf *restrict mf, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size) -{ - lzma_lzma2_coder *restrict coder = coder_ptr; - - while (*out_pos < out_size) - switch (coder->sequence) { - case SEQ_INIT: - // If there's no input left and we are flushing or finishing, - // don't start a new chunk. - if (mf_unencoded(mf) == 0) { - // Write end of payload marker if finishing. - if (mf->action == LZMA_FINISH) - out[(*out_pos)++] = 0; - - return mf->action == LZMA_RUN - ? LZMA_OK : LZMA_STREAM_END; - } - - if (coder->need_state_reset) - return_if_error(lzma_lzma_encoder_reset( - coder->lzma, &coder->opt_cur)); - - coder->uncompressed_size = 0; - coder->compressed_size = 0; - coder->sequence = SEQ_LZMA_ENCODE; - FALLTHROUGH; - - case SEQ_LZMA_ENCODE: { - // Calculate how much more uncompressed data this chunk - // could accept. - const uint32_t left = LZMA2_UNCOMPRESSED_MAX - - coder->uncompressed_size; - uint32_t limit; - - if (left < mf->match_len_max) { - // Must flush immediately since the next LZMA symbol - // could make the uncompressed size of the chunk too - // big. - limit = 0; - } else { - // Calculate maximum read_limit that is OK from point - // of view of LZMA2 chunk size. - limit = mf->read_pos - mf->read_ahead - + left - mf->match_len_max; - } - - // Save the start position so that we can update - // coder->uncompressed_size. - const uint32_t read_start = mf->read_pos - mf->read_ahead; - - // Call the LZMA encoder until the chunk is finished. - const lzma_ret ret = lzma_lzma_encode(coder->lzma, mf, - coder->buf + LZMA2_HEADER_MAX, - &coder->compressed_size, - LZMA2_CHUNK_MAX, limit); - - coder->uncompressed_size += mf->read_pos - mf->read_ahead - - read_start; - - assert(coder->compressed_size <= LZMA2_CHUNK_MAX); - assert(coder->uncompressed_size <= LZMA2_UNCOMPRESSED_MAX); - - if (ret != LZMA_STREAM_END) - return LZMA_OK; - - // See if the chunk compressed. If it didn't, we encode it - // as uncompressed chunk. This saves a few bytes of space - // and makes decoding faster. - if (coder->compressed_size >= coder->uncompressed_size) { - coder->uncompressed_size += mf->read_ahead; - assert(coder->uncompressed_size - <= LZMA2_UNCOMPRESSED_MAX); - mf->read_ahead = 0; - lzma2_header_uncompressed(coder); - coder->need_state_reset = true; - coder->sequence = SEQ_UNCOMPRESSED_HEADER; - break; - } - - // The chunk did compress at least by one byte, so we store - // the chunk as LZMA. - lzma2_header_lzma(coder); - - coder->sequence = SEQ_LZMA_COPY; - FALLTHROUGH; - } - - case SEQ_LZMA_COPY: - // Copy the compressed chunk along its headers to the - // output buffer. - lzma_bufcpy(coder->buf, &coder->buf_pos, - coder->compressed_size, - out, out_pos, out_size); - if (coder->buf_pos != coder->compressed_size) - return LZMA_OK; - - coder->sequence = SEQ_INIT; - break; - - case SEQ_UNCOMPRESSED_HEADER: - // Copy the three-byte header to indicate uncompressed chunk. - lzma_bufcpy(coder->buf, &coder->buf_pos, - LZMA2_HEADER_UNCOMPRESSED, - out, out_pos, out_size); - if (coder->buf_pos != LZMA2_HEADER_UNCOMPRESSED) - return LZMA_OK; - - coder->sequence = SEQ_UNCOMPRESSED_COPY; - FALLTHROUGH; - - case SEQ_UNCOMPRESSED_COPY: - // Copy the uncompressed data as is from the dictionary - // to the output buffer. - mf_read(mf, out, out_pos, out_size, &coder->uncompressed_size); - if (coder->uncompressed_size != 0) - return LZMA_OK; - - coder->sequence = SEQ_INIT; - break; - } - - return LZMA_OK; -} - - -static void -lzma2_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_lzma2_coder *coder = coder_ptr; - lzma_free(coder->lzma, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -lzma2_encoder_options_update(void *coder_ptr, const lzma_filter *filter) -{ - lzma_lzma2_coder *coder = coder_ptr; - - // New options can be set only when there is no incomplete chunk. - // This is the case at the beginning of the raw stream and right - // after LZMA_SYNC_FLUSH. - if (filter->options == NULL || coder->sequence != SEQ_INIT) - return LZMA_PROG_ERROR; - - // Look if there are new options. At least for now, - // only lc/lp/pb can be changed. - const lzma_options_lzma *opt = filter->options; - if (coder->opt_cur.lc != opt->lc || coder->opt_cur.lp != opt->lp - || coder->opt_cur.pb != opt->pb) { - // Validate the options. - if (opt->lc > LZMA_LCLP_MAX || opt->lp > LZMA_LCLP_MAX - || opt->lc + opt->lp > LZMA_LCLP_MAX - || opt->pb > LZMA_PB_MAX) - return LZMA_OPTIONS_ERROR; - - // The new options will be used when the encoder starts - // a new LZMA2 chunk. - coder->opt_cur.lc = opt->lc; - coder->opt_cur.lp = opt->lp; - coder->opt_cur.pb = opt->pb; - coder->need_properties = true; - coder->need_state_reset = true; - } - - return LZMA_OK; -} - - -static lzma_ret -lzma2_encoder_init(lzma_lz_encoder *lz, const lzma_allocator *allocator, - lzma_vli id lzma_attribute((__unused__)), const void *options, - lzma_lz_options *lz_options) -{ - if (options == NULL) - return LZMA_PROG_ERROR; - - lzma_lzma2_coder *coder = lz->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_lzma2_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - lz->coder = coder; - lz->code = &lzma2_encode; - lz->end = &lzma2_encoder_end; - lz->options_update = &lzma2_encoder_options_update; - - coder->lzma = NULL; - } - - coder->opt_cur = *(const lzma_options_lzma *)(options); - - coder->sequence = SEQ_INIT; - coder->need_properties = true; - coder->need_state_reset = false; - coder->need_dictionary_reset - = coder->opt_cur.preset_dict == NULL - || coder->opt_cur.preset_dict_size == 0; - - // Initialize LZMA encoder - return_if_error(lzma_lzma_encoder_create(&coder->lzma, allocator, - LZMA_FILTER_LZMA2, &coder->opt_cur, lz_options)); - - // Make sure that we will always have enough history available in - // case we need to use uncompressed chunks. They are used when the - // compressed size of a chunk is not smaller than the uncompressed - // size, so we need to have at least LZMA2_COMPRESSED_MAX bytes - // history available. - if (lz_options->before_size + lz_options->dict_size < LZMA2_CHUNK_MAX) - lz_options->before_size - = LZMA2_CHUNK_MAX - lz_options->dict_size; - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzma2_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return lzma_lz_encoder_init( - next, allocator, filters, &lzma2_encoder_init); -} - - -extern uint64_t -lzma_lzma2_encoder_memusage(const void *options) -{ - const uint64_t lzma_mem = lzma_lzma_encoder_memusage(options); - if (lzma_mem == UINT64_MAX) - return UINT64_MAX; - - return sizeof(lzma_lzma2_coder) + lzma_mem; -} - - -extern lzma_ret -lzma_lzma2_props_encode(const void *options, uint8_t *out) -{ - if (options == NULL) - return LZMA_PROG_ERROR; - - const lzma_options_lzma *const opt = options; - uint32_t d = my_max(opt->dict_size, LZMA_DICT_SIZE_MIN); - - // Round up to the next 2^n - 1 or 2^n + 2^(n - 1) - 1 depending - // on which one is the next: - --d; - d |= d >> 2; - d |= d >> 3; - d |= d >> 4; - d |= d >> 8; - d |= d >> 16; - - // Get the highest two bits using the proper encoding: - if (d == UINT32_MAX) - out[0] = 40; - else - out[0] = get_dist_slot(d + 1) - 24; - - return LZMA_OK; -} - - -extern uint64_t -lzma_lzma2_block_size(const void *options) -{ - const lzma_options_lzma *const opt = options; - - if (!IS_ENC_DICT_SIZE_VALID(opt->dict_size)) - return UINT64_MAX; - - // Use at least 1 MiB to keep compression ratio better. - return my_max((uint64_t)(opt->dict_size) * 3, UINT64_C(1) << 20); -} diff --git a/software/src/xz/src/liblzma/lzma/lzma2_encoder.h b/software/src/xz/src/liblzma/lzma/lzma2_encoder.h deleted file mode 100644 index 29966a6..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma2_encoder.h +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma2_encoder.h -/// \brief LZMA2 encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA2_ENCODER_H -#define LZMA_LZMA2_ENCODER_H - -#include "common.h" - - -/// Maximum number of bytes of actual data per chunk (no headers) -#define LZMA2_CHUNK_MAX (UINT32_C(1) << 16) - -/// Maximum uncompressed size of LZMA chunk (no headers) -#define LZMA2_UNCOMPRESSED_MAX (UINT32_C(1) << 21) - -/// Maximum size of LZMA2 headers -#define LZMA2_HEADER_MAX 6 - -/// Size of a header for uncompressed chunk -#define LZMA2_HEADER_UNCOMPRESSED 3 - - -extern lzma_ret lzma_lzma2_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern uint64_t lzma_lzma2_encoder_memusage(const void *options); - -extern lzma_ret lzma_lzma2_props_encode(const void *options, uint8_t *out); - -extern uint64_t lzma_lzma2_block_size(const void *options); - -#endif diff --git a/software/src/xz/src/liblzma/lzma/lzma_common.h b/software/src/xz/src/liblzma/lzma/lzma_common.h deleted file mode 100644 index c3c587f..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_common.h +++ /dev/null @@ -1,240 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_common.h -/// \brief Private definitions common to LZMA encoder and decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_COMMON_H -#define LZMA_LZMA_COMMON_H - -#include "common.h" -#include "range_common.h" - - -/////////////////// -// Miscellaneous // -/////////////////// - -/// Maximum number of position states. A position state is the lowest pos bits -/// number of bits of the current uncompressed offset. In some places there -/// are different sets of probabilities for different pos states. -#define POS_STATES_MAX (1 << LZMA_PB_MAX) - - -/// Validates lc, lp, and pb. -static inline bool -is_lclppb_valid(const lzma_options_lzma *options) -{ - return options->lc <= LZMA_LCLP_MAX && options->lp <= LZMA_LCLP_MAX - && options->lc + options->lp <= LZMA_LCLP_MAX - && options->pb <= LZMA_PB_MAX; -} - - -/////////// -// State // -/////////// - -/// This enum is used to track which events have occurred most recently and -/// in which order. This information is used to predict the next event. -/// -/// Events: -/// - Literal: One 8-bit byte -/// - Match: Repeat a chunk of data at some distance -/// - Long repeat: Multi-byte match at a recently seen distance -/// - Short repeat: One-byte repeat at a recently seen distance -/// -/// The event names are in from STATE_oldest_older_previous. REP means -/// either short or long repeated match, and NONLIT means any non-literal. -typedef enum { - STATE_LIT_LIT, - STATE_MATCH_LIT_LIT, - STATE_REP_LIT_LIT, - STATE_SHORTREP_LIT_LIT, - STATE_MATCH_LIT, - STATE_REP_LIT, - STATE_SHORTREP_LIT, - STATE_LIT_MATCH, - STATE_LIT_LONGREP, - STATE_LIT_SHORTREP, - STATE_NONLIT_MATCH, - STATE_NONLIT_REP, -} lzma_lzma_state; - - -/// Total number of states -#define STATES 12 - -/// The lowest 7 states indicate that the previous state was a literal. -#define LIT_STATES 7 - - -/// Indicate that the latest state was a literal. -#define update_literal(state) \ - state = ((state) <= STATE_SHORTREP_LIT_LIT \ - ? STATE_LIT_LIT \ - : ((state) <= STATE_LIT_SHORTREP \ - ? (state) - 3 \ - : (state) - 6)) - -/// Like update_literal(state) but when it is already known that -/// is_literal_state(state) is true. -#define update_literal_normal(state) \ - state = ((state) <= STATE_SHORTREP_LIT_LIT \ - ? STATE_LIT_LIT \ - : (state) - 3); - -/// Like update_literal(state) but when it is already known that -/// is_literal_state(state) is false. -#define update_literal_matched(state) \ - state = ((state) <= STATE_LIT_SHORTREP \ - ? (state) - 3 \ - : (state) - 6); - -/// Indicate that the latest state was a match. -#define update_match(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_MATCH : STATE_NONLIT_MATCH) - -/// Indicate that the latest state was a long repeated match. -#define update_long_rep(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_LONGREP : STATE_NONLIT_REP) - -/// Indicate that the latest state was a short match. -#define update_short_rep(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_SHORTREP : STATE_NONLIT_REP) - -/// Test if the previous state was a literal. -#define is_literal_state(state) \ - ((state) < LIT_STATES) - - -///////////// -// Literal // -///////////// - -/// Each literal coder is divided in three sections: -/// - 0x001-0x0FF: Without match byte -/// - 0x101-0x1FF: With match byte; match bit is 0 -/// - 0x201-0x2FF: With match byte; match bit is 1 -/// -/// Match byte is used when the previous LZMA symbol was something else than -/// a literal (that is, it was some kind of match). -#define LITERAL_CODER_SIZE UINT32_C(0x300) - -/// Maximum number of literal coders -#define LITERAL_CODERS_MAX (1 << LZMA_LCLP_MAX) - -/// Calculates the literal_mask that literal_subcoder() needs. -#define literal_mask_calc(lc, lp) \ - ((UINT32_C(0x100) << (lp)) - (UINT32_C(0x100) >> (lc))) - -/// Locate the literal coder for the next literal byte. The choice depends on -/// - the lowest literal_pos_bits bits of the position of the current -/// byte; and -/// - the highest literal_context_bits bits of the previous byte. -#define literal_subcoder(probs, lc, literal_mask, pos, prev_byte) \ - ((probs) + UINT32_C(3) * \ - (((((pos) << 8) + (prev_byte)) & (literal_mask)) << (lc))) - - -static inline void -literal_init(probability *probs, uint32_t lc, uint32_t lp) -{ - assert(lc + lp <= LZMA_LCLP_MAX); - - const size_t coders = LITERAL_CODER_SIZE << (lc + lp); - - for (size_t i = 0; i < coders; ++i) - bit_reset(probs[i]); - - return; -} - - -////////////////// -// Match length // -////////////////// - -// Minimum length of a match is two bytes. -#define MATCH_LEN_MIN 2 - -// Match length is encoded with 4, 5, or 10 bits. -// -// Length Bits -// 2-9 4 = Choice=0 + 3 bits -// 10-17 5 = Choice=1 + Choice2=0 + 3 bits -// 18-273 10 = Choice=1 + Choice2=1 + 8 bits -#define LEN_LOW_BITS 3 -#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS) -#define LEN_MID_BITS 3 -#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS) -#define LEN_HIGH_BITS 8 -#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS) -#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS) - -// Maximum length of a match is 273 which is a result of the encoding -// described above. -#define MATCH_LEN_MAX (MATCH_LEN_MIN + LEN_SYMBOLS - 1) - - -//////////////////// -// Match distance // -//////////////////// - -// Different sets of probabilities are used for match distances that have very -// short match length: Lengths of 2, 3, and 4 bytes have a separate set of -// probabilities for each length. The matches with longer length use a shared -// set of probabilities. -#define DIST_STATES 4 - -// Macro to get the index of the appropriate probability array. -#define get_dist_state(len) \ - ((len) < DIST_STATES + MATCH_LEN_MIN \ - ? (len) - MATCH_LEN_MIN \ - : DIST_STATES - 1) - -// The highest two bits of a match distance (distance slot) are encoded -// using six bits. See fastpos.h for more explanation. -#define DIST_SLOT_BITS 6 -#define DIST_SLOTS (1 << DIST_SLOT_BITS) - -// Match distances up to 127 are fully encoded using probabilities. Since -// the highest two bits (distance slot) are always encoded using six bits, -// the distances 0-3 don't need any additional bits to encode, since the -// distance slot itself is the same as the actual distance. DIST_MODEL_START -// indicates the first distance slot where at least one additional bit is -// needed. -#define DIST_MODEL_START 4 - -// Match distances greater than 127 are encoded in three pieces: -// - distance slot: the highest two bits -// - direct bits: 2-26 bits below the highest two bits -// - alignment bits: four lowest bits -// -// Direct bits don't use any probabilities. -// -// The distance slot value of 14 is for distances 128-191 (see the table in -// fastpos.h to understand why). -#define DIST_MODEL_END 14 - -// Distance slots that indicate a distance <= 127. -#define FULL_DISTANCES_BITS (DIST_MODEL_END / 2) -#define FULL_DISTANCES (1 << FULL_DISTANCES_BITS) - -// For match distances greater than 127, only the highest two bits and the -// lowest four bits (alignment) is encoded using probabilities. -#define ALIGN_BITS 4 -#define ALIGN_SIZE (1 << ALIGN_BITS) -#define ALIGN_MASK (ALIGN_SIZE - 1) - -// LZMA remembers the four most recent match distances. Reusing these distances -// tends to take less space than re-encoding the actual distance value. -#define REPS 4 - -#endif diff --git a/software/src/xz/src/liblzma/lzma/lzma_decoder.c b/software/src/xz/src/liblzma/lzma/lzma_decoder.c deleted file mode 100644 index 2088a2f..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_decoder.c +++ /dev/null @@ -1,1263 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_decoder.c -/// \brief LZMA decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// Jia Tan -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_decoder.h" -#include "lzma_common.h" -#include "lzma_decoder.h" -#include "range_decoder.h" - -// The macros unroll loops with switch statements. -// Silence warnings about missing fall-through comments. -#if TUKLIB_GNUC_REQ(7, 0) || defined(__clang__) -# pragma GCC diagnostic ignored "-Wimplicit-fallthrough" -#endif - -// Minimum number of input bytes to safely decode one LZMA symbol. -// The worst case is that we decode 22 bits using probabilities and 26 -// direct bits. This may decode at maximum 20 bytes of input. -#define LZMA_IN_REQUIRED 20 - - -// Macros for (somewhat) size-optimized code. -// This is used to decode the match length (how many bytes must be repeated -// from the dictionary). This version is used in the Resumable mode and -// does not unroll any loops. -#define len_decode(target, ld, pos_state, seq) \ -do { \ -case seq ## _CHOICE: \ - rc_if_0_safe(ld.choice, seq ## _CHOICE) { \ - rc_update_0(ld.choice); \ - probs = ld.low[pos_state];\ - limit = LEN_LOW_SYMBOLS; \ - target = MATCH_LEN_MIN; \ - } else { \ - rc_update_1(ld.choice); \ -case seq ## _CHOICE2: \ - rc_if_0_safe(ld.choice2, seq ## _CHOICE2) { \ - rc_update_0(ld.choice2); \ - probs = ld.mid[pos_state]; \ - limit = LEN_MID_SYMBOLS; \ - target = MATCH_LEN_MIN + LEN_LOW_SYMBOLS; \ - } else { \ - rc_update_1(ld.choice2); \ - probs = ld.high; \ - limit = LEN_HIGH_SYMBOLS; \ - target = MATCH_LEN_MIN + LEN_LOW_SYMBOLS \ - + LEN_MID_SYMBOLS; \ - } \ - } \ - symbol = 1; \ -case seq ## _BITTREE: \ - do { \ - rc_bit_safe(probs[symbol], , , seq ## _BITTREE); \ - } while (symbol < limit); \ - target += symbol - limit; \ -} while (0) - - -// This is the faster version of the match length decoder that does not -// worry about being resumable. It unrolls the bittree decoding loop. -#define len_decode_fast(target, ld, pos_state) \ -do { \ - symbol = 1; \ - rc_if_0(ld.choice) { \ - rc_update_0(ld.choice); \ - rc_bittree3(ld.low[pos_state], \ - -LEN_LOW_SYMBOLS + MATCH_LEN_MIN); \ - target = symbol; \ - } else { \ - rc_update_1(ld.choice); \ - rc_if_0(ld.choice2) { \ - rc_update_0(ld.choice2); \ - rc_bittree3(ld.mid[pos_state], -LEN_MID_SYMBOLS \ - + MATCH_LEN_MIN + LEN_LOW_SYMBOLS); \ - target = symbol; \ - } else { \ - rc_update_1(ld.choice2); \ - rc_bittree8(ld.high, -LEN_HIGH_SYMBOLS \ - + MATCH_LEN_MIN \ - + LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS); \ - target = symbol; \ - } \ - } \ -} while (0) - - -/// Length decoder probabilities; see comments in lzma_common.h. -typedef struct { - probability choice; - probability choice2; - probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; - probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; - probability high[LEN_HIGH_SYMBOLS]; -} lzma_length_decoder; - - -typedef struct { - /////////////////// - // Probabilities // - /////////////////// - - /// Literals; see comments in lzma_common.h. - probability literal[LITERAL_CODERS_MAX * LITERAL_CODER_SIZE]; - - /// If 1, it's a match. Otherwise it's a single 8-bit literal. - probability is_match[STATES][POS_STATES_MAX]; - - /// If 1, it's a repeated match. The distance is one of rep0 .. rep3. - probability is_rep[STATES]; - - /// If 0, distance of a repeated match is rep0. - /// Otherwise check is_rep1. - probability is_rep0[STATES]; - - /// If 0, distance of a repeated match is rep1. - /// Otherwise check is_rep2. - probability is_rep1[STATES]; - - /// If 0, distance of a repeated match is rep2. Otherwise it is rep3. - probability is_rep2[STATES]; - - /// If 1, the repeated match has length of one byte. Otherwise - /// the length is decoded from rep_len_decoder. - probability is_rep0_long[STATES][POS_STATES_MAX]; - - /// Probability tree for the highest two bits of the match distance. - /// There is a separate probability tree for match lengths of - /// 2 (i.e. MATCH_LEN_MIN), 3, 4, and [5, 273]. - probability dist_slot[DIST_STATES][DIST_SLOTS]; - - /// Probability trees for additional bits for match distance when the - /// distance is in the range [4, 127]. - probability pos_special[FULL_DISTANCES - DIST_MODEL_END]; - - /// Probability tree for the lowest four bits of a match distance - /// that is equal to or greater than 128. - probability pos_align[ALIGN_SIZE]; - - /// Length of a normal match - lzma_length_decoder match_len_decoder; - - /// Length of a repeated match - lzma_length_decoder rep_len_decoder; - - /////////////////// - // Decoder state // - /////////////////// - - // Range coder - lzma_range_decoder rc; - - // Types of the most recently seen LZMA symbols - lzma_lzma_state state; - - uint32_t rep0; ///< Distance of the latest match - uint32_t rep1; ///< Distance of second latest match - uint32_t rep2; ///< Distance of third latest match - uint32_t rep3; ///< Distance of fourth latest match - - uint32_t pos_mask; // (1U << pb) - 1 - uint32_t literal_context_bits; - uint32_t literal_mask; - - /// Uncompressed size as bytes, or LZMA_VLI_UNKNOWN if end of - /// payload marker is expected. - lzma_vli uncompressed_size; - - /// True if end of payload marker (EOPM) is allowed even when - /// uncompressed_size is known; false if EOPM must not be present. - /// This is ignored if uncompressed_size == LZMA_VLI_UNKNOWN. - bool allow_eopm; - - //////////////////////////////// - // State of incomplete symbol // - //////////////////////////////// - - /// Position where to continue the decoder loop - enum { - SEQ_NORMALIZE, - SEQ_IS_MATCH, - SEQ_LITERAL, - SEQ_LITERAL_MATCHED, - SEQ_LITERAL_WRITE, - SEQ_IS_REP, - SEQ_MATCH_LEN_CHOICE, - SEQ_MATCH_LEN_CHOICE2, - SEQ_MATCH_LEN_BITTREE, - SEQ_DIST_SLOT, - SEQ_DIST_MODEL, - SEQ_DIRECT, - SEQ_ALIGN, - SEQ_EOPM, - SEQ_IS_REP0, - SEQ_SHORTREP, - SEQ_IS_REP0_LONG, - SEQ_IS_REP1, - SEQ_IS_REP2, - SEQ_REP_LEN_CHOICE, - SEQ_REP_LEN_CHOICE2, - SEQ_REP_LEN_BITTREE, - SEQ_COPY, - } sequence; - - /// Base of the current probability tree - probability *probs; - - /// Symbol being decoded. This is also used as an index variable in - /// bittree decoders: probs[symbol] - uint32_t symbol; - - /// Used as a loop termination condition on bittree decoders and - /// direct bits decoder. - uint32_t limit; - - /// Matched literal decoder: 0x100 or 0 to help avoiding branches. - /// Bittree reverse decoders: Offset of the next bit: 1 << offset - uint32_t offset; - - /// If decoding a literal: match byte. - /// If decoding a match: length of the match. - uint32_t len; -} lzma_lzma1_decoder; - - -static lzma_ret -lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, - const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - lzma_lzma1_decoder *restrict coder = coder_ptr; - - //////////////////// - // Initialization // - //////////////////// - - { - const lzma_ret ret = rc_read_init( - &coder->rc, in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - return ret; - } - - /////////////// - // Variables // - /////////////// - - // Making local copies of often-used variables improves both - // speed and readability. - - lzma_dict dict = *dictptr; - - const size_t dict_start = dict.pos; - - // Range decoder - rc_to_local(coder->rc, *in_pos, LZMA_IN_REQUIRED); - - // State - uint32_t state = coder->state; - uint32_t rep0 = coder->rep0; - uint32_t rep1 = coder->rep1; - uint32_t rep2 = coder->rep2; - uint32_t rep3 = coder->rep3; - - const uint32_t pos_mask = coder->pos_mask; - - // These variables are actually needed only if we last time ran - // out of input in the middle of the decoder loop. - probability *probs = coder->probs; - uint32_t symbol = coder->symbol; - uint32_t limit = coder->limit; - uint32_t offset = coder->offset; - uint32_t len = coder->len; - - const uint32_t literal_mask = coder->literal_mask; - const uint32_t literal_context_bits = coder->literal_context_bits; - - // Temporary variables - uint32_t pos_state = dict.pos & pos_mask; - - lzma_ret ret = LZMA_OK; - - // This is true when the next LZMA symbol is allowed to be EOPM. - // That is, if this is false, then EOPM is considered - // an invalid symbol and we will return LZMA_DATA_ERROR. - // - // EOPM is always required (not just allowed) when - // the uncompressed size isn't known. When uncompressed size - // is known, eopm_is_valid may be set to true later. - bool eopm_is_valid = coder->uncompressed_size == LZMA_VLI_UNKNOWN; - - // If uncompressed size is known and there is enough output space - // to decode all the data, limit the available buffer space so that - // the main loop won't try to decode past the end of the stream. - bool might_finish_without_eopm = false; - if (coder->uncompressed_size != LZMA_VLI_UNKNOWN - && coder->uncompressed_size <= dict.limit - dict.pos) { - dict.limit = dict.pos + (size_t)(coder->uncompressed_size); - might_finish_without_eopm = true; - } - - // The main decoder loop. The "switch" is used to resume the decoder at - // correct location. Once resumed, the "switch" is no longer used. - // The decoder loops is split into two modes: - // - // 1 - Non-resumable mode (fast). This is used when it is guaranteed - // there is enough input to decode the next symbol. If the output - // limit is reached, then the decoder loop will save the place - // for the resumable mode to continue. This mode is not used if - // HAVE_SMALL is defined. This is faster than Resumable mode - // because it reduces the number of branches needed and allows - // for more compiler optimizations. - // - // 2 - Resumable mode (slow). This is used when a previous decoder - // loop did not have enough space in the input or output buffers - // to complete. It uses sequence enum values to set remind - // coder->sequence where to resume in the decoder loop. This - // is the only mode used when HAVE_SMALL is defined. - - switch (coder->sequence) - while (true) { - // Calculate new pos_state. This is skipped on the first loop - // since we already calculated it when setting up the local - // variables. - pos_state = dict.pos & pos_mask; - -#ifndef HAVE_SMALL - - /////////////////////////////// - // Non-resumable Mode (fast) // - /////////////////////////////// - - // Go to Resumable mode (1) if there is not enough input to - // safely decode any possible LZMA symbol or (2) if the - // dictionary is full, which may need special checks that - // are only done in the Resumable mode. - if (unlikely(!rc_is_fast_allowed() - || dict.pos == dict.limit)) - goto slow; - - // Decode the first bit from the next LZMA symbol. - // If the bit is a 0, then we handle it as a literal. - // If the bit is a 1, then it is a match of previously - // decoded data. - rc_if_0(coder->is_match[state][pos_state]) { - ///////////////////// - // Decode literal. // - ///////////////////// - - // Update the RC that we have decoded a 0. - rc_update_0(coder->is_match[state][pos_state]); - - // Get the correct probability array from lp and - // lc params. - probs = literal_subcoder(coder->literal, - literal_context_bits, literal_mask, - dict.pos, dict_get0(&dict)); - - if (is_literal_state(state)) { - update_literal_normal(state); - - // Decode literal without match byte. - rc_bittree8(probs, 0); - } else { - update_literal_matched(state); - - // Decode literal with match byte. - rc_matched_literal(probs, - dict_get(&dict, rep0)); - } - - // Write decoded literal to dictionary - dict_put(&dict, symbol); - continue; - } - - /////////////////// - // Decode match. // - /////////////////// - - // Instead of a new byte we are going to decode a - // distance-length pair. The distance represents how far - // back in the dictionary to begin copying. The length - // represents how many bytes to copy. - - rc_update_1(coder->is_match[state][pos_state]); - - rc_if_0(coder->is_rep[state]) { - /////////////////// - // Simple match. // - /////////////////// - - // Not a repeated match. In this case, - // the length (how many bytes to copy) must be - // decoded first. Then, the distance (where to - // start copying) is decoded. - // - // This is also how we know when we are done - // decoding. If the distance decodes to UINT32_MAX, - // then we know to stop decoding (end of payload - // marker). - - rc_update_0(coder->is_rep[state]); - update_match(state); - - // The latest three match distances are kept in - // memory in case there are repeated matches. - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - - // Decode the length of the match. - len_decode_fast(len, coder->match_len_decoder, - pos_state); - - // Next, decode the distance into rep0. - - // The next 6 bits determine how to decode the - // rest of the distance. - probs = coder->dist_slot[get_dist_state(len)]; - - rc_bittree6(probs, -DIST_SLOTS); - assert(symbol <= 63); - - if (symbol < DIST_MODEL_START) { - // If the decoded symbol is < DIST_MODEL_START - // then we use its value directly as the - // match distance. No other bits are needed. - // The only possible distance values - // are [0, 3]. - rep0 = symbol; - } else { - // Use the first two bits of symbol as the - // highest bits of the match distance. - - // "limit" represents the number of low bits - // to decode. - limit = (symbol >> 1) - 1; - assert(limit >= 1 && limit <= 30); - rep0 = 2 + (symbol & 1); - - if (symbol < DIST_MODEL_END) { - // When symbol is > DIST_MODEL_START, - // but symbol < DIST_MODEL_END, then - // it can decode distances between - // [4, 127]. - assert(limit <= 5); - rep0 <<= limit; - assert(rep0 <= 96); - - // -1 is fine, because we start - // decoding at probs[1], not probs[0]. - // NOTE: This violates the C standard, - // since we are doing pointer - // arithmetic past the beginning of - // the array. - assert((int32_t)(rep0 - symbol - 1) - >= -1); - assert((int32_t)(rep0 - symbol - 1) - <= 82); - probs = coder->pos_special + rep0 - - symbol - 1; - symbol = 1; - offset = 1; - - // Variable number (1-5) of bits - // from a reverse bittree. This - // isn't worth manual unrolling. - // - // NOTE: Making one or many of the - // variables (probs, symbol, offset, - // or limit) local here (instead of - // using those declared outside the - // main loop) can affect code size - // and performance which isn't a - // surprise but it's not so clear - // what is the best. - do { - rc_bit_add_if_1(probs, - rep0, offset); - offset <<= 1; - } while (--limit > 0); - } else { - // The distance is >= 128. Decode the - // lower bits without probabilities - // except the lowest four bits. - assert(symbol >= 14); - assert(limit >= 6); - - limit -= ALIGN_BITS; - assert(limit >= 2); - - rc_direct(rep0, limit); - - // Decode the lowest four bits using - // probabilities. - rep0 <<= ALIGN_BITS; - rc_bittree_rev4(coder->pos_align); - rep0 += symbol; - - // If the end of payload marker (EOPM) - // is detected, jump to the safe code. - // The EOPM handling isn't speed - // critical at all. - // - // A final normalization is needed - // after the EOPM (there can be a - // dummy byte to read in some cases). - // If the normalization was done here - // in the fast code, it would need to - // be taken into account in the value - // of LZMA_IN_REQUIRED. Using the - // safe code allows keeping - // LZMA_IN_REQUIRED as 20 instead of - // 21. - if (rep0 == UINT32_MAX) - goto eopm; - } - } - - // Validate the distance we just decoded. - if (unlikely(!dict_is_distance_valid(&dict, rep0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - } else { - rc_update_1(coder->is_rep[state]); - - ///////////////////// - // Repeated match. // - ///////////////////// - - // The match distance is a value that we have decoded - // recently. The latest four match distances are - // available as rep0, rep1, rep2 and rep3. We will - // now decode which of them is the new distance. - // - // There cannot be a match if we haven't produced - // any output, so check that first. - if (unlikely(!dict_is_distance_valid(&dict, 0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - rc_if_0(coder->is_rep0[state]) { - rc_update_0(coder->is_rep0[state]); - // The distance is rep0. - - // Decode the next bit to determine if 1 byte - // should be copied from rep0 distance or - // if the number of bytes needs to be decoded. - - // If the next bit is 0, then it is a - // "Short Rep Match" and only 1 bit is copied. - // Otherwise, the length of the match is - // decoded after the "else" statement. - rc_if_0(coder->is_rep0_long[state][pos_state]) { - rc_update_0(coder->is_rep0_long[ - state][pos_state]); - - update_short_rep(state); - dict_put(&dict, dict_get(&dict, rep0)); - continue; - } - - // Repeating more than one byte at - // distance of rep0. - rc_update_1(coder->is_rep0_long[ - state][pos_state]); - - } else { - rc_update_1(coder->is_rep0[state]); - - // The distance is rep1, rep2 or rep3. Once - // we find out which one of these three, it - // is stored to rep0 and rep1, rep2 and rep3 - // are updated accordingly. There is no - // "Short Rep Match" option, so the length - // of the match must always be decoded next. - rc_if_0(coder->is_rep1[state]) { - // The distance is rep1. - rc_update_0(coder->is_rep1[state]); - - const uint32_t distance = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - rc_update_1(coder->is_rep1[state]); - - rc_if_0(coder->is_rep2[state]) { - // The distance is rep2. - rc_update_0(coder->is_rep2[ - state]); - - const uint32_t distance = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - // The distance is rep3. - rc_update_1(coder->is_rep2[ - state]); - - const uint32_t distance = rep3; - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - } - } - } - - update_long_rep(state); - - // Decode the length of the repeated match. - len_decode_fast(len, coder->rep_len_decoder, - pos_state); - } - - ///////////////////////////////// - // Repeat from history buffer. // - ///////////////////////////////// - - // The length is always between these limits. There is no way - // to trigger the algorithm to set len outside this range. - assert(len >= MATCH_LEN_MIN); - assert(len <= MATCH_LEN_MAX); - - // Repeat len bytes from distance of rep0. - if (unlikely(dict_repeat(&dict, rep0, &len))) { - coder->sequence = SEQ_COPY; - goto out; - } - - continue; - -slow: -#endif - /////////////////////////// - // Resumable Mode (slow) // - /////////////////////////// - - // This is very similar to Non-resumable Mode, so most of the - // comments are not repeated. The main differences are: - // - case labels are used to resume at the correct location. - // - Loops are not unrolled. - // - Range coder macros take an extra sequence argument - // so they can save to coder->sequence the location to - // resume in case there is not enough input. - case SEQ_NORMALIZE: - case SEQ_IS_MATCH: - if (unlikely(might_finish_without_eopm - && dict.pos == dict.limit)) { - // In rare cases there is a useless byte that needs - // to be read anyway. - rc_normalize_safe(SEQ_NORMALIZE); - - // If the range decoder state is such that we can - // be at the end of the LZMA stream, then the - // decoding is finished. - if (rc_is_finished(rc)) { - ret = LZMA_STREAM_END; - goto out; - } - - // If the caller hasn't allowed EOPM to be present - // together with known uncompressed size, then the - // LZMA stream is corrupt. - if (!coder->allow_eopm) { - ret = LZMA_DATA_ERROR; - goto out; - } - - // Otherwise continue decoding with the expectation - // that the next LZMA symbol is EOPM. - eopm_is_valid = true; - } - - rc_if_0_safe(coder->is_match[state][pos_state], SEQ_IS_MATCH) { - ///////////////////// - // Decode literal. // - ///////////////////// - - rc_update_0(coder->is_match[state][pos_state]); - - probs = literal_subcoder(coder->literal, - literal_context_bits, literal_mask, - dict.pos, dict_get0(&dict)); - symbol = 1; - - if (is_literal_state(state)) { - update_literal_normal(state); - - // Decode literal without match byte. - // The "slow" version does not unroll - // the loop. - case SEQ_LITERAL: - do { - rc_bit_safe(probs[symbol], , , - SEQ_LITERAL); - } while (symbol < (1 << 8)); - } else { - update_literal_matched(state); - - // Decode literal with match byte. - len = (uint32_t)(dict_get(&dict, rep0)) << 1; - - offset = 0x100; - - case SEQ_LITERAL_MATCHED: - do { - const uint32_t match_bit - = len & offset; - const uint32_t subcoder_index - = offset + match_bit - + symbol; - - rc_bit_safe(probs[subcoder_index], - offset &= ~match_bit, - offset &= match_bit, - SEQ_LITERAL_MATCHED); - - // It seems to be faster to do this - // here instead of putting it to the - // beginning of the loop and then - // putting the "case" in the middle - // of the loop. - len <<= 1; - - } while (symbol < (1 << 8)); - } - - case SEQ_LITERAL_WRITE: - if (dict_put_safe(&dict, symbol)) { - coder->sequence = SEQ_LITERAL_WRITE; - goto out; - } - - continue; - } - - /////////////////// - // Decode match. // - /////////////////// - - rc_update_1(coder->is_match[state][pos_state]); - - case SEQ_IS_REP: - rc_if_0_safe(coder->is_rep[state], SEQ_IS_REP) { - /////////////////// - // Simple match. // - /////////////////// - - rc_update_0(coder->is_rep[state]); - update_match(state); - - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - - len_decode(len, coder->match_len_decoder, - pos_state, SEQ_MATCH_LEN); - - probs = coder->dist_slot[get_dist_state(len)]; - symbol = 1; - - case SEQ_DIST_SLOT: - do { - rc_bit_safe(probs[symbol], , , SEQ_DIST_SLOT); - } while (symbol < DIST_SLOTS); - - symbol -= DIST_SLOTS; - assert(symbol <= 63); - - if (symbol < DIST_MODEL_START) { - rep0 = symbol; - } else { - limit = (symbol >> 1) - 1; - assert(limit >= 1 && limit <= 30); - rep0 = 2 + (symbol & 1); - - if (symbol < DIST_MODEL_END) { - assert(limit <= 5); - rep0 <<= limit; - assert(rep0 <= 96); - // -1 is fine, because we start - // decoding at probs[1], not probs[0]. - // NOTE: This violates the C standard, - // since we are doing pointer - // arithmetic past the beginning of - // the array. - assert((int32_t)(rep0 - symbol - 1) - >= -1); - assert((int32_t)(rep0 - symbol - 1) - <= 82); - probs = coder->pos_special + rep0 - - symbol - 1; - symbol = 1; - offset = 0; - case SEQ_DIST_MODEL: - do { - rc_bit_safe(probs[symbol], , - rep0 += 1U << offset, - SEQ_DIST_MODEL); - } while (++offset < limit); - } else { - assert(symbol >= 14); - assert(limit >= 6); - limit -= ALIGN_BITS; - assert(limit >= 2); - case SEQ_DIRECT: - rc_direct_safe(rep0, limit, - SEQ_DIRECT); - - rep0 <<= ALIGN_BITS; - symbol = 0; - offset = 1; - case SEQ_ALIGN: - do { - rc_bit_last_safe( - coder->pos_align[ - offset - + symbol], - , - symbol += offset, - SEQ_ALIGN); - offset <<= 1; - } while (offset < ALIGN_SIZE); - - rep0 += symbol; - - if (rep0 == UINT32_MAX) { - // End of payload marker was - // found. It may only be - // present if - // - uncompressed size is - // unknown or - // - after known uncompressed - // size amount of bytes has - // been decompressed and - // caller has indicated - // that EOPM might be used - // (it's not allowed in - // LZMA2). -#ifndef HAVE_SMALL -eopm: -#endif - if (!eopm_is_valid) { - ret = LZMA_DATA_ERROR; - goto out; - } - - case SEQ_EOPM: - // LZMA1 stream with - // end-of-payload marker. - rc_normalize_safe(SEQ_EOPM); - ret = rc_is_finished(rc) - ? LZMA_STREAM_END - : LZMA_DATA_ERROR; - goto out; - } - } - } - - if (unlikely(!dict_is_distance_valid(&dict, rep0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - } else { - ///////////////////// - // Repeated match. // - ///////////////////// - - rc_update_1(coder->is_rep[state]); - - if (unlikely(!dict_is_distance_valid(&dict, 0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - case SEQ_IS_REP0: - rc_if_0_safe(coder->is_rep0[state], SEQ_IS_REP0) { - rc_update_0(coder->is_rep0[state]); - - case SEQ_IS_REP0_LONG: - rc_if_0_safe(coder->is_rep0_long - [state][pos_state], - SEQ_IS_REP0_LONG) { - rc_update_0(coder->is_rep0_long[ - state][pos_state]); - - update_short_rep(state); - - case SEQ_SHORTREP: - if (dict_put_safe(&dict, - dict_get(&dict, - rep0))) { - coder->sequence = SEQ_SHORTREP; - goto out; - } - - continue; - } - - rc_update_1(coder->is_rep0_long[ - state][pos_state]); - - } else { - rc_update_1(coder->is_rep0[state]); - - case SEQ_IS_REP1: - rc_if_0_safe(coder->is_rep1[state], SEQ_IS_REP1) { - rc_update_0(coder->is_rep1[state]); - - const uint32_t distance = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - rc_update_1(coder->is_rep1[state]); - case SEQ_IS_REP2: - rc_if_0_safe(coder->is_rep2[state], - SEQ_IS_REP2) { - rc_update_0(coder->is_rep2[ - state]); - - const uint32_t distance = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - rc_update_1(coder->is_rep2[ - state]); - - const uint32_t distance = rep3; - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - } - } - } - - update_long_rep(state); - - len_decode(len, coder->rep_len_decoder, - pos_state, SEQ_REP_LEN); - } - - ///////////////////////////////// - // Repeat from history buffer. // - ///////////////////////////////// - - assert(len >= MATCH_LEN_MIN); - assert(len <= MATCH_LEN_MAX); - - case SEQ_COPY: - if (unlikely(dict_repeat(&dict, rep0, &len))) { - coder->sequence = SEQ_COPY; - goto out; - } - } - -out: - // Save state - - // NOTE: Must not copy dict.limit. - dictptr->pos = dict.pos; - dictptr->full = dict.full; - - rc_from_local(coder->rc, *in_pos); - - coder->state = state; - coder->rep0 = rep0; - coder->rep1 = rep1; - coder->rep2 = rep2; - coder->rep3 = rep3; - - coder->probs = probs; - coder->symbol = symbol; - coder->limit = limit; - coder->offset = offset; - coder->len = len; - - // Update the remaining amount of uncompressed data if uncompressed - // size was known. - if (coder->uncompressed_size != LZMA_VLI_UNKNOWN) { - coder->uncompressed_size -= dict.pos - dict_start; - - // If we have gotten all the output but the decoder wants - // to write more output, the file is corrupt. There are - // three SEQ values where output is produced. - if (coder->uncompressed_size == 0 && ret == LZMA_OK - && (coder->sequence == SEQ_LITERAL_WRITE - || coder->sequence == SEQ_SHORTREP - || coder->sequence == SEQ_COPY)) - ret = LZMA_DATA_ERROR; - } - - if (ret == LZMA_STREAM_END) { - // Reset the range decoder so that it is ready to reinitialize - // for a new LZMA2 chunk. - rc_reset(coder->rc); - coder->sequence = SEQ_IS_MATCH; - } - - return ret; -} - - -static void -lzma_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size, - bool allow_eopm) -{ - lzma_lzma1_decoder *coder = coder_ptr; - coder->uncompressed_size = uncompressed_size; - coder->allow_eopm = allow_eopm; -} - - -static void -lzma_decoder_reset(void *coder_ptr, const void *opt) -{ - lzma_lzma1_decoder *coder = coder_ptr; - const lzma_options_lzma *options = opt; - - // NOTE: We assume that lc/lp/pb are valid since they were - // successfully decoded with lzma_lzma_decode_properties(). - - // Calculate pos_mask. We don't need pos_bits as is for anything. - coder->pos_mask = (1U << options->pb) - 1; - - // Initialize the literal decoder. - literal_init(coder->literal, options->lc, options->lp); - - coder->literal_context_bits = options->lc; - coder->literal_mask = literal_mask_calc(options->lc, options->lp); - - // State - coder->state = STATE_LIT_LIT; - coder->rep0 = 0; - coder->rep1 = 0; - coder->rep2 = 0; - coder->rep3 = 0; - coder->pos_mask = (1U << options->pb) - 1; - - // Range decoder - rc_reset(coder->rc); - - // Bit and bittree decoders - for (uint32_t i = 0; i < STATES; ++i) { - for (uint32_t j = 0; j <= coder->pos_mask; ++j) { - bit_reset(coder->is_match[i][j]); - bit_reset(coder->is_rep0_long[i][j]); - } - - bit_reset(coder->is_rep[i]); - bit_reset(coder->is_rep0[i]); - bit_reset(coder->is_rep1[i]); - bit_reset(coder->is_rep2[i]); - } - - for (uint32_t i = 0; i < DIST_STATES; ++i) - bittree_reset(coder->dist_slot[i], DIST_SLOT_BITS); - - for (uint32_t i = 0; i < FULL_DISTANCES - DIST_MODEL_END; ++i) - bit_reset(coder->pos_special[i]); - - bittree_reset(coder->pos_align, ALIGN_BITS); - - // Len decoders (also bit/bittree) - const uint32_t num_pos_states = 1U << options->pb; - bit_reset(coder->match_len_decoder.choice); - bit_reset(coder->match_len_decoder.choice2); - bit_reset(coder->rep_len_decoder.choice); - bit_reset(coder->rep_len_decoder.choice2); - - for (uint32_t pos_state = 0; pos_state < num_pos_states; ++pos_state) { - bittree_reset(coder->match_len_decoder.low[pos_state], - LEN_LOW_BITS); - bittree_reset(coder->match_len_decoder.mid[pos_state], - LEN_MID_BITS); - - bittree_reset(coder->rep_len_decoder.low[pos_state], - LEN_LOW_BITS); - bittree_reset(coder->rep_len_decoder.mid[pos_state], - LEN_MID_BITS); - } - - bittree_reset(coder->match_len_decoder.high, LEN_HIGH_BITS); - bittree_reset(coder->rep_len_decoder.high, LEN_HIGH_BITS); - - coder->sequence = SEQ_IS_MATCH; - coder->probs = NULL; - coder->symbol = 0; - coder->limit = 0; - coder->offset = 0; - coder->len = 0; - - return; -} - - -extern lzma_ret -lzma_lzma_decoder_create(lzma_lz_decoder *lz, const lzma_allocator *allocator, - const lzma_options_lzma *options, lzma_lz_options *lz_options) -{ - if (lz->coder == NULL) { - lz->coder = lzma_alloc(sizeof(lzma_lzma1_decoder), allocator); - if (lz->coder == NULL) - return LZMA_MEM_ERROR; - - lz->code = &lzma_decode; - lz->reset = &lzma_decoder_reset; - lz->set_uncompressed = &lzma_decoder_uncompressed; - } - - // All dictionary sizes are OK here. LZ decoder will take care of - // the special cases. - lz_options->dict_size = options->dict_size; - lz_options->preset_dict = options->preset_dict; - lz_options->preset_dict_size = options->preset_dict_size; - - return LZMA_OK; -} - - -/// Allocate and initialize LZMA decoder. This is used only via LZ -/// initialization (lzma_lzma_decoder_init() passes function pointer to -/// the LZ initialization). -static lzma_ret -lzma_decoder_init(lzma_lz_decoder *lz, const lzma_allocator *allocator, - lzma_vli id, const void *options, lzma_lz_options *lz_options) -{ - if (!is_lclppb_valid(options)) - return LZMA_PROG_ERROR; - - lzma_vli uncomp_size = LZMA_VLI_UNKNOWN; - bool allow_eopm = true; - - if (id == LZMA_FILTER_LZMA1EXT) { - const lzma_options_lzma *opt = options; - - // Only one flag is supported. - if (opt->ext_flags & ~LZMA_LZMA1EXT_ALLOW_EOPM) - return LZMA_OPTIONS_ERROR; - - // FIXME? Using lzma_vli instead of uint64_t is weird because - // this has nothing to do with .xz headers and variable-length - // integer encoding. On the other hand, using LZMA_VLI_UNKNOWN - // instead of UINT64_MAX is clearer when unknown size is - // meant. A problem with using lzma_vli is that now we - // allow > LZMA_VLI_MAX which is fine in this file but - // it's still confusing. Note that alone_decoder.c also - // allows > LZMA_VLI_MAX when setting uncompressed size. - uncomp_size = opt->ext_size_low - + ((uint64_t)(opt->ext_size_high) << 32); - allow_eopm = (opt->ext_flags & LZMA_LZMA1EXT_ALLOW_EOPM) != 0 - || uncomp_size == LZMA_VLI_UNKNOWN; - } - - return_if_error(lzma_lzma_decoder_create( - lz, allocator, options, lz_options)); - - lzma_decoder_reset(lz->coder, options); - lzma_decoder_uncompressed(lz->coder, uncomp_size, allow_eopm); - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzma_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - // LZMA can only be the last filter in the chain. This is enforced - // by the raw_decoder initialization. - assert(filters[1].init == NULL); - - return lzma_lz_decoder_init(next, allocator, filters, - &lzma_decoder_init); -} - - -extern bool -lzma_lzma_lclppb_decode(lzma_options_lzma *options, uint8_t byte) -{ - if (byte > (4 * 5 + 4) * 9 + 8) - return true; - - // See the file format specification to understand this. - options->pb = byte / (9 * 5); - byte -= options->pb * 9 * 5; - options->lp = byte / 9; - options->lc = byte - options->lp * 9; - - return options->lc + options->lp > LZMA_LCLP_MAX; -} - - -extern uint64_t -lzma_lzma_decoder_memusage_nocheck(const void *options) -{ - const lzma_options_lzma *const opt = options; - return sizeof(lzma_lzma1_decoder) - + lzma_lz_decoder_memusage(opt->dict_size); -} - - -extern uint64_t -lzma_lzma_decoder_memusage(const void *options) -{ - if (!is_lclppb_valid(options)) - return UINT64_MAX; - - return lzma_lzma_decoder_memusage_nocheck(options); -} - - -extern lzma_ret -lzma_lzma_props_decode(void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - if (props_size != 5) - return LZMA_OPTIONS_ERROR; - - lzma_options_lzma *opt - = lzma_alloc(sizeof(lzma_options_lzma), allocator); - if (opt == NULL) - return LZMA_MEM_ERROR; - - if (lzma_lzma_lclppb_decode(opt, props[0])) - goto error; - - // All dictionary sizes are accepted, including zero. LZ decoder - // will automatically use a dictionary at least a few KiB even if - // a smaller dictionary is requested. - opt->dict_size = read32le(props + 1); - - opt->preset_dict = NULL; - opt->preset_dict_size = 0; - - *options = opt; - - return LZMA_OK; - -error: - lzma_free(opt, allocator); - return LZMA_OPTIONS_ERROR; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma_decoder.h b/software/src/xz/src/liblzma/lzma/lzma_decoder.h deleted file mode 100644 index 9730f56..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_decoder.h +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_decoder.h -/// \brief LZMA decoder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_DECODER_H -#define LZMA_LZMA_DECODER_H - -#include "common.h" - - -/// Allocates and initializes LZMA decoder -extern lzma_ret lzma_lzma_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern uint64_t lzma_lzma_decoder_memusage(const void *options); - -extern lzma_ret lzma_lzma_props_decode( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - - -/// \brief Decodes the LZMA Properties byte (lc/lp/pb) -/// -/// \return true if error occurred, false on success -/// -extern bool lzma_lzma_lclppb_decode( - lzma_options_lzma *options, uint8_t byte); - - -#ifdef LZMA_LZ_DECODER_H -/// Allocate and setup function pointers only. This is used by LZMA1 and -/// LZMA2 decoders. -extern lzma_ret lzma_lzma_decoder_create( - lzma_lz_decoder *lz, const lzma_allocator *allocator, - const lzma_options_lzma *opt, lzma_lz_options *lz_options); - -/// Gets memory usage without validating lc/lp/pb. This is used by LZMA2 -/// decoder, because raw LZMA2 decoding doesn't need lc/lp/pb. -extern uint64_t lzma_lzma_decoder_memusage_nocheck(const void *options); - -#endif - -#endif diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder.c b/software/src/xz/src/liblzma/lzma/lzma_encoder.c deleted file mode 100644 index 543ca32..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder.c +++ /dev/null @@ -1,786 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder.c -/// \brief LZMA encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma2_encoder.h" -#include "lzma_encoder_private.h" -#include "fastpos.h" - - -///////////// -// Literal // -///////////// - -static inline void -literal_matched(lzma_range_encoder *rc, probability *subcoder, - uint32_t match_byte, uint32_t symbol) -{ - uint32_t offset = 0x100; - symbol += UINT32_C(1) << 8; - - do { - match_byte <<= 1; - const uint32_t match_bit = match_byte & offset; - const uint32_t subcoder_index - = offset + match_bit + (symbol >> 8); - const uint32_t bit = (symbol >> 7) & 1; - rc_bit(rc, &subcoder[subcoder_index], bit); - - symbol <<= 1; - offset &= ~(match_byte ^ symbol); - - } while (symbol < (UINT32_C(1) << 16)); -} - - -static inline void -literal(lzma_lzma1_encoder *coder, lzma_mf *mf, uint32_t position) -{ - // Locate the literal byte to be encoded and the subcoder. - const uint8_t cur_byte = mf->buffer[ - mf->read_pos - mf->read_ahead]; - probability *subcoder = literal_subcoder(coder->literal, - coder->literal_context_bits, coder->literal_mask, - position, mf->buffer[mf->read_pos - mf->read_ahead - 1]); - - if (is_literal_state(coder->state)) { - // Previous LZMA-symbol was a literal. Encode a normal - // literal without a match byte. - update_literal_normal(coder->state); - rc_bittree(&coder->rc, subcoder, 8, cur_byte); - } else { - // Previous LZMA-symbol was a match. Use the last byte of - // the match as a "match byte". That is, compare the bits - // of the current literal and the match byte. - update_literal_matched(coder->state); - const uint8_t match_byte = mf->buffer[ - mf->read_pos - coder->reps[0] - 1 - - mf->read_ahead]; - literal_matched(&coder->rc, subcoder, match_byte, cur_byte); - } -} - - -////////////////// -// Match length // -////////////////// - -static void -length_update_prices(lzma_length_encoder *lc, const uint32_t pos_state) -{ - const uint32_t table_size = lc->table_size; - lc->counters[pos_state] = table_size; - - const uint32_t a0 = rc_bit_0_price(lc->choice); - const uint32_t a1 = rc_bit_1_price(lc->choice); - const uint32_t b0 = a1 + rc_bit_0_price(lc->choice2); - const uint32_t b1 = a1 + rc_bit_1_price(lc->choice2); - uint32_t *const prices = lc->prices[pos_state]; - - uint32_t i; - for (i = 0; i < table_size && i < LEN_LOW_SYMBOLS; ++i) - prices[i] = a0 + rc_bittree_price(lc->low[pos_state], - LEN_LOW_BITS, i); - - for (; i < table_size && i < LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS; ++i) - prices[i] = b0 + rc_bittree_price(lc->mid[pos_state], - LEN_MID_BITS, i - LEN_LOW_SYMBOLS); - - for (; i < table_size; ++i) - prices[i] = b1 + rc_bittree_price(lc->high, LEN_HIGH_BITS, - i - LEN_LOW_SYMBOLS - LEN_MID_SYMBOLS); - - return; -} - - -static inline void -length(lzma_range_encoder *rc, lzma_length_encoder *lc, - const uint32_t pos_state, uint32_t len, const bool fast_mode) -{ - assert(len <= MATCH_LEN_MAX); - len -= MATCH_LEN_MIN; - - if (len < LEN_LOW_SYMBOLS) { - rc_bit(rc, &lc->choice, 0); - rc_bittree(rc, lc->low[pos_state], LEN_LOW_BITS, len); - } else { - rc_bit(rc, &lc->choice, 1); - len -= LEN_LOW_SYMBOLS; - - if (len < LEN_MID_SYMBOLS) { - rc_bit(rc, &lc->choice2, 0); - rc_bittree(rc, lc->mid[pos_state], LEN_MID_BITS, len); - } else { - rc_bit(rc, &lc->choice2, 1); - len -= LEN_MID_SYMBOLS; - rc_bittree(rc, lc->high, LEN_HIGH_BITS, len); - } - } - - // Only getoptimum uses the prices so don't update the table when - // in fast mode. - if (!fast_mode) - if (--lc->counters[pos_state] == 0) - length_update_prices(lc, pos_state); -} - - -/////////// -// Match // -/////////// - -static inline void -match(lzma_lzma1_encoder *coder, const uint32_t pos_state, - const uint32_t distance, const uint32_t len) -{ - update_match(coder->state); - - length(&coder->rc, &coder->match_len_encoder, pos_state, len, - coder->fast_mode); - - const uint32_t dist_slot = get_dist_slot(distance); - const uint32_t dist_state = get_dist_state(len); - rc_bittree(&coder->rc, coder->dist_slot[dist_state], - DIST_SLOT_BITS, dist_slot); - - if (dist_slot >= DIST_MODEL_START) { - const uint32_t footer_bits = (dist_slot >> 1) - 1; - const uint32_t base = (2 | (dist_slot & 1)) << footer_bits; - const uint32_t dist_reduced = distance - base; - - if (dist_slot < DIST_MODEL_END) { - // Careful here: base - dist_slot - 1 can be -1, but - // rc_bittree_reverse starts at probs[1], not probs[0]. - rc_bittree_reverse(&coder->rc, - coder->dist_special + base - dist_slot - 1, - footer_bits, dist_reduced); - } else { - rc_direct(&coder->rc, dist_reduced >> ALIGN_BITS, - footer_bits - ALIGN_BITS); - rc_bittree_reverse( - &coder->rc, coder->dist_align, - ALIGN_BITS, dist_reduced & ALIGN_MASK); - ++coder->align_price_count; - } - } - - coder->reps[3] = coder->reps[2]; - coder->reps[2] = coder->reps[1]; - coder->reps[1] = coder->reps[0]; - coder->reps[0] = distance; - ++coder->match_price_count; -} - - -//////////////////// -// Repeated match // -//////////////////// - -static inline void -rep_match(lzma_lzma1_encoder *coder, const uint32_t pos_state, - const uint32_t rep, const uint32_t len) -{ - if (rep == 0) { - rc_bit(&coder->rc, &coder->is_rep0[coder->state], 0); - rc_bit(&coder->rc, - &coder->is_rep0_long[coder->state][pos_state], - len != 1); - } else { - const uint32_t distance = coder->reps[rep]; - rc_bit(&coder->rc, &coder->is_rep0[coder->state], 1); - - if (rep == 1) { - rc_bit(&coder->rc, &coder->is_rep1[coder->state], 0); - } else { - rc_bit(&coder->rc, &coder->is_rep1[coder->state], 1); - rc_bit(&coder->rc, &coder->is_rep2[coder->state], - rep - 2); - - if (rep == 3) - coder->reps[3] = coder->reps[2]; - - coder->reps[2] = coder->reps[1]; - } - - coder->reps[1] = coder->reps[0]; - coder->reps[0] = distance; - } - - if (len == 1) { - update_short_rep(coder->state); - } else { - length(&coder->rc, &coder->rep_len_encoder, pos_state, len, - coder->fast_mode); - update_long_rep(coder->state); - } -} - - -////////// -// Main // -////////// - -static void -encode_symbol(lzma_lzma1_encoder *coder, lzma_mf *mf, - uint32_t back, uint32_t len, uint32_t position) -{ - const uint32_t pos_state = position & coder->pos_mask; - - if (back == UINT32_MAX) { - // Literal i.e. eight-bit byte - assert(len == 1); - rc_bit(&coder->rc, - &coder->is_match[coder->state][pos_state], 0); - literal(coder, mf, position); - } else { - // Some type of match - rc_bit(&coder->rc, - &coder->is_match[coder->state][pos_state], 1); - - if (back < REPS) { - // It's a repeated match i.e. the same distance - // has been used earlier. - rc_bit(&coder->rc, &coder->is_rep[coder->state], 1); - rep_match(coder, pos_state, back, len); - } else { - // Normal match - rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); - match(coder, pos_state, back - REPS, len); - } - } - - assert(mf->read_ahead >= len); - mf->read_ahead -= len; -} - - -static bool -encode_init(lzma_lzma1_encoder *coder, lzma_mf *mf) -{ - assert(mf_position(mf) == 0); - assert(coder->uncomp_size == 0); - - if (mf->read_pos == mf->read_limit) { - if (mf->action == LZMA_RUN) - return false; // We cannot do anything. - - // We are finishing (we cannot get here when flushing). - assert(mf->write_pos == mf->read_pos); - assert(mf->action == LZMA_FINISH); - } else { - // Do the actual initialization. The first LZMA symbol must - // always be a literal. - mf_skip(mf, 1); - mf->read_ahead = 0; - rc_bit(&coder->rc, &coder->is_match[0][0], 0); - rc_bittree(&coder->rc, coder->literal + 0, 8, mf->buffer[0]); - ++coder->uncomp_size; - } - - // Initialization is done (except if empty file). - coder->is_initialized = true; - - return true; -} - - -static void -encode_eopm(lzma_lzma1_encoder *coder, uint32_t position) -{ - const uint32_t pos_state = position & coder->pos_mask; - rc_bit(&coder->rc, &coder->is_match[coder->state][pos_state], 1); - rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); - match(coder, pos_state, UINT32_MAX, MATCH_LEN_MIN); -} - - -/// Number of bytes that a single encoding loop in lzma_lzma_encode() can -/// consume from the dictionary. This limit comes from lzma_lzma_optimum() -/// and may need to be updated if that function is significantly modified. -#define LOOP_INPUT_MAX (OPTS + 1) - - -extern lzma_ret -lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, uint32_t limit) -{ - // Initialize the stream if no data has been encoded yet. - if (!coder->is_initialized && !encode_init(coder, mf)) - return LZMA_OK; - - // Encode pending output bytes from the range encoder. - // At the start of the stream, encode_init() encodes one literal. - // Later there can be pending output only with LZMA1 because LZMA2 - // ensures that there is always enough output space. Thus when using - // LZMA2, rc_encode() calls in this function will always return false. - if (rc_encode(&coder->rc, out, out_pos, out_size)) { - // We don't get here with LZMA2. - assert(limit == UINT32_MAX); - return LZMA_OK; - } - - // If the range encoder was flushed in an earlier call to this - // function but there wasn't enough output buffer space, those - // bytes would have now been encoded by the above rc_encode() call - // and the stream has now been finished. This can only happen with - // LZMA1 as LZMA2 always provides enough output buffer space. - if (coder->is_flushed) { - assert(limit == UINT32_MAX); - return LZMA_STREAM_END; - } - - while (true) { - // With LZMA2 we need to take care that compressed size of - // a chunk doesn't get too big. - // FIXME? Check if this could be improved. - if (limit != UINT32_MAX - && (mf->read_pos - mf->read_ahead >= limit - || *out_pos + rc_pending(&coder->rc) - >= LZMA2_CHUNK_MAX - - LOOP_INPUT_MAX)) - break; - - // Check that there is some input to process. - if (mf->read_pos >= mf->read_limit) { - if (mf->action == LZMA_RUN) - return LZMA_OK; - - if (mf->read_ahead == 0) - break; - } - - // Get optimal match (repeat position and length). - // Value ranges for pos: - // - [0, REPS): repeated match - // - [REPS, UINT32_MAX): - // match at (pos - REPS) - // - UINT32_MAX: not a match but a literal - // Value ranges for len: - // - [MATCH_LEN_MIN, MATCH_LEN_MAX] - uint32_t len; - uint32_t back; - - if (coder->fast_mode) - lzma_lzma_optimum_fast(coder, mf, &back, &len); - else - lzma_lzma_optimum_normal(coder, mf, &back, &len, - (uint32_t)(coder->uncomp_size)); - - encode_symbol(coder, mf, back, len, - (uint32_t)(coder->uncomp_size)); - - // If output size limiting is active (out_limit != 0), check - // if encoding this LZMA symbol would make the output size - // exceed the specified limit. - if (coder->out_limit != 0 && rc_encode_dummy( - &coder->rc, coder->out_limit)) { - // The most recent LZMA symbol would make the output - // too big. Throw it away. - rc_forget(&coder->rc); - - // FIXME: Tell the LZ layer to not read more input as - // it would be waste of time. This doesn't matter if - // output-size-limited encoding is done with a single - // call though. - - break; - } - - // This symbol will be encoded so update the uncompressed size. - coder->uncomp_size += len; - - // Encode the LZMA symbol. - if (rc_encode(&coder->rc, out, out_pos, out_size)) { - // Once again, this can only happen with LZMA1. - assert(limit == UINT32_MAX); - return LZMA_OK; - } - } - - // Make the uncompressed size available to the application. - if (coder->uncomp_size_ptr != NULL) - *coder->uncomp_size_ptr = coder->uncomp_size; - - // LZMA2 doesn't use EOPM at LZMA level. - // - // Plain LZMA streams without EOPM aren't supported except when - // output size limiting is enabled. - if (coder->use_eopm) - encode_eopm(coder, (uint32_t)(coder->uncomp_size)); - - // Flush the remaining bytes from the range encoder. - rc_flush(&coder->rc); - - // Copy the remaining bytes to the output buffer. If there - // isn't enough output space, we will copy out the remaining - // bytes on the next call to this function. - if (rc_encode(&coder->rc, out, out_pos, out_size)) { - // This cannot happen with LZMA2. - assert(limit == UINT32_MAX); - - coder->is_flushed = true; - return LZMA_OK; - } - - return LZMA_STREAM_END; -} - - -static lzma_ret -lzma_encode(void *coder, lzma_mf *restrict mf, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size) -{ - // Plain LZMA has no support for sync-flushing. - if (unlikely(mf->action == LZMA_SYNC_FLUSH)) - return LZMA_OPTIONS_ERROR; - - return lzma_lzma_encode(coder, mf, out, out_pos, out_size, UINT32_MAX); -} - - -static lzma_ret -lzma_lzma_set_out_limit( - void *coder_ptr, uint64_t *uncomp_size, uint64_t out_limit) -{ - // Minimum output size is 5 bytes but that cannot hold any output - // so we use 6 bytes. - if (out_limit < 6) - return LZMA_BUF_ERROR; - - lzma_lzma1_encoder *coder = coder_ptr; - coder->out_limit = out_limit; - coder->uncomp_size_ptr = uncomp_size; - coder->use_eopm = false; - return LZMA_OK; -} - - -//////////////////// -// Initialization // -//////////////////// - -static bool -is_options_valid(const lzma_options_lzma *options) -{ - // Validate some of the options. LZ encoder validates nice_len too - // but we need a valid value here earlier. - return is_lclppb_valid(options) - && options->nice_len >= MATCH_LEN_MIN - && options->nice_len <= MATCH_LEN_MAX - && (options->mode == LZMA_MODE_FAST - || options->mode == LZMA_MODE_NORMAL); -} - - -static void -set_lz_options(lzma_lz_options *lz_options, const lzma_options_lzma *options) -{ - // LZ encoder initialization does the validation for these so we - // don't need to validate here. - lz_options->before_size = OPTS; - lz_options->dict_size = options->dict_size; - lz_options->after_size = LOOP_INPUT_MAX; - lz_options->match_len_max = MATCH_LEN_MAX; - lz_options->nice_len = my_max(mf_get_hash_bytes(options->mf), - options->nice_len); - lz_options->match_finder = options->mf; - lz_options->depth = options->depth; - lz_options->preset_dict = options->preset_dict; - lz_options->preset_dict_size = options->preset_dict_size; - return; -} - - -static void -length_encoder_reset(lzma_length_encoder *lencoder, - const uint32_t num_pos_states, const bool fast_mode) -{ - bit_reset(lencoder->choice); - bit_reset(lencoder->choice2); - - for (size_t pos_state = 0; pos_state < num_pos_states; ++pos_state) { - bittree_reset(lencoder->low[pos_state], LEN_LOW_BITS); - bittree_reset(lencoder->mid[pos_state], LEN_MID_BITS); - } - - bittree_reset(lencoder->high, LEN_HIGH_BITS); - - if (!fast_mode) - for (uint32_t pos_state = 0; pos_state < num_pos_states; - ++pos_state) - length_update_prices(lencoder, pos_state); - - return; -} - - -extern lzma_ret -lzma_lzma_encoder_reset(lzma_lzma1_encoder *coder, - const lzma_options_lzma *options) -{ - if (!is_options_valid(options)) - return LZMA_OPTIONS_ERROR; - - coder->pos_mask = (1U << options->pb) - 1; - coder->literal_context_bits = options->lc; - coder->literal_mask = literal_mask_calc(options->lc, options->lp); - - // Range coder - rc_reset(&coder->rc); - - // State - coder->state = STATE_LIT_LIT; - for (size_t i = 0; i < REPS; ++i) - coder->reps[i] = 0; - - literal_init(coder->literal, options->lc, options->lp); - - // Bit encoders - for (size_t i = 0; i < STATES; ++i) { - for (size_t j = 0; j <= coder->pos_mask; ++j) { - bit_reset(coder->is_match[i][j]); - bit_reset(coder->is_rep0_long[i][j]); - } - - bit_reset(coder->is_rep[i]); - bit_reset(coder->is_rep0[i]); - bit_reset(coder->is_rep1[i]); - bit_reset(coder->is_rep2[i]); - } - - for (size_t i = 0; i < FULL_DISTANCES - DIST_MODEL_END; ++i) - bit_reset(coder->dist_special[i]); - - // Bit tree encoders - for (size_t i = 0; i < DIST_STATES; ++i) - bittree_reset(coder->dist_slot[i], DIST_SLOT_BITS); - - bittree_reset(coder->dist_align, ALIGN_BITS); - - // Length encoders - length_encoder_reset(&coder->match_len_encoder, - 1U << options->pb, coder->fast_mode); - - length_encoder_reset(&coder->rep_len_encoder, - 1U << options->pb, coder->fast_mode); - - // Price counts are incremented every time appropriate probabilities - // are changed. price counts are set to zero when the price tables - // are updated, which is done when the appropriate price counts have - // big enough value, and lzma_mf.read_ahead == 0 which happens at - // least every OPTS (a few thousand) possible price count increments. - // - // By resetting price counts to UINT32_MAX / 2, we make sure that the - // price tables will be initialized before they will be used (since - // the value is definitely big enough), and that it is OK to increment - // price counts without risk of integer overflow (since UINT32_MAX / 2 - // is small enough). The current code doesn't increment price counts - // before initializing price tables, but it maybe done in future if - // we add support for saving the state between LZMA2 chunks. - coder->match_price_count = UINT32_MAX / 2; - coder->align_price_count = UINT32_MAX / 2; - - coder->opts_end_index = 0; - coder->opts_current_index = 0; - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzma_encoder_create(void **coder_ptr, const lzma_allocator *allocator, - lzma_vli id, const lzma_options_lzma *options, - lzma_lz_options *lz_options) -{ - assert(id == LZMA_FILTER_LZMA1 || id == LZMA_FILTER_LZMA1EXT - || id == LZMA_FILTER_LZMA2); - - // Allocate lzma_lzma1_encoder if it wasn't already allocated. - if (*coder_ptr == NULL) { - *coder_ptr = lzma_alloc(sizeof(lzma_lzma1_encoder), allocator); - if (*coder_ptr == NULL) - return LZMA_MEM_ERROR; - } - - lzma_lzma1_encoder *coder = *coder_ptr; - - // Set compression mode. Note that we haven't validated the options - // yet. Invalid options will get rejected by lzma_lzma_encoder_reset() - // call at the end of this function. - switch (options->mode) { - case LZMA_MODE_FAST: - coder->fast_mode = true; - break; - - case LZMA_MODE_NORMAL: { - coder->fast_mode = false; - - // Set dist_table_size. - // Round the dictionary size up to next 2^n. - // - // Currently the maximum encoder dictionary size - // is 1.5 GiB due to lz_encoder.c and here we need - // to be below 2 GiB to make the rounded up value - // fit in an uint32_t and avoid an infinite while-loop - // (and undefined behavior due to a too large shift). - // So do the same check as in LZ encoder, - // limiting to 1.5 GiB. - if (options->dict_size > (UINT32_C(1) << 30) - + (UINT32_C(1) << 29)) - return LZMA_OPTIONS_ERROR; - - uint32_t log_size = 0; - while ((UINT32_C(1) << log_size) < options->dict_size) - ++log_size; - - coder->dist_table_size = log_size * 2; - - // Length encoders' price table size - const uint32_t nice_len = my_max( - mf_get_hash_bytes(options->mf), - options->nice_len); - - coder->match_len_encoder.table_size - = nice_len + 1 - MATCH_LEN_MIN; - coder->rep_len_encoder.table_size - = nice_len + 1 - MATCH_LEN_MIN; - break; - } - - default: - return LZMA_OPTIONS_ERROR; - } - - // We don't need to write the first byte as literal if there is - // a non-empty preset dictionary. encode_init() wouldn't even work - // if there is a non-empty preset dictionary, because encode_init() - // assumes that position is zero and previous byte is also zero. - coder->is_initialized = options->preset_dict != NULL - && options->preset_dict_size > 0; - coder->is_flushed = false; - coder->uncomp_size = 0; - coder->uncomp_size_ptr = NULL; - - // Output size limiting is disabled by default. - coder->out_limit = 0; - - // Determine if end marker is wanted: - // - It is never used with LZMA2. - // - It is always used with LZMA_FILTER_LZMA1 (unless - // lzma_lzma_set_out_limit() is called later). - // - LZMA_FILTER_LZMA1EXT has a flag for it in the options. - coder->use_eopm = (id == LZMA_FILTER_LZMA1); - if (id == LZMA_FILTER_LZMA1EXT) { - // Check if unsupported flags are present. - if (options->ext_flags & ~LZMA_LZMA1EXT_ALLOW_EOPM) - return LZMA_OPTIONS_ERROR; - - coder->use_eopm = (options->ext_flags - & LZMA_LZMA1EXT_ALLOW_EOPM) != 0; - - // TODO? As long as there are no filters that change the size - // of the data, it is enough to look at lzma_stream.total_in - // after encoding has been finished to know the uncompressed - // size of the LZMA1 stream. But in the future there could be - // filters that change the size of the data and then total_in - // doesn't work as the LZMA1 stream size might be different - // due to another filter in the chain. The problem is simple - // to solve: Add another flag to ext_flags and then set - // coder->uncomp_size_ptr to the address stored in - // lzma_options_lzma.reserved_ptr2 (or _ptr1). - } - - set_lz_options(lz_options, options); - - return lzma_lzma_encoder_reset(coder, options); -} - - -static lzma_ret -lzma_encoder_init(lzma_lz_encoder *lz, const lzma_allocator *allocator, - lzma_vli id, const void *options, lzma_lz_options *lz_options) -{ - if (options == NULL) - return LZMA_PROG_ERROR; - - lz->code = &lzma_encode; - lz->set_out_limit = &lzma_lzma_set_out_limit; - return lzma_lzma_encoder_create( - &lz->coder, allocator, id, options, lz_options); -} - - -extern lzma_ret -lzma_lzma_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return lzma_lz_encoder_init( - next, allocator, filters, &lzma_encoder_init); -} - - -extern uint64_t -lzma_lzma_encoder_memusage(const void *options) -{ - if (!is_options_valid(options)) - return UINT64_MAX; - - lzma_lz_options lz_options; - set_lz_options(&lz_options, options); - - const uint64_t lz_memusage = lzma_lz_encoder_memusage(&lz_options); - if (lz_memusage == UINT64_MAX) - return UINT64_MAX; - - return (uint64_t)(sizeof(lzma_lzma1_encoder)) + lz_memusage; -} - - -extern bool -lzma_lzma_lclppb_encode(const lzma_options_lzma *options, uint8_t *byte) -{ - if (!is_lclppb_valid(options)) - return true; - - *byte = (options->pb * 5 + options->lp) * 9 + options->lc; - assert(*byte <= (4 * 5 + 4) * 9 + 8); - - return false; -} - - -#ifdef HAVE_ENCODER_LZMA1 -extern lzma_ret -lzma_lzma_props_encode(const void *options, uint8_t *out) -{ - if (options == NULL) - return LZMA_PROG_ERROR; - - const lzma_options_lzma *const opt = options; - - if (lzma_lzma_lclppb_encode(opt, out)) - return LZMA_PROG_ERROR; - - write32le(out + 1, opt->dict_size); - - return LZMA_OK; -} -#endif - - -extern LZMA_API(lzma_bool) -lzma_mode_is_supported(lzma_mode mode) -{ - return mode == LZMA_MODE_FAST || mode == LZMA_MODE_NORMAL; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder.h b/software/src/xz/src/liblzma/lzma/lzma_encoder.h deleted file mode 100644 index e8ae807..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder.h +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder.h -/// \brief LZMA encoder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_ENCODER_H -#define LZMA_LZMA_ENCODER_H - -#include "common.h" - - -typedef struct lzma_lzma1_encoder_s lzma_lzma1_encoder; - - -extern lzma_ret lzma_lzma_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern uint64_t lzma_lzma_encoder_memusage(const void *options); - -extern lzma_ret lzma_lzma_props_encode(const void *options, uint8_t *out); - - -/// Encodes lc/lp/pb into one byte. Returns false on success and true on error. -extern bool lzma_lzma_lclppb_encode( - const lzma_options_lzma *options, uint8_t *byte); - - -#ifdef LZMA_LZ_ENCODER_H - -/// Initializes raw LZMA encoder; this is used by LZMA2. -extern lzma_ret lzma_lzma_encoder_create( - void **coder_ptr, const lzma_allocator *allocator, - lzma_vli id, const lzma_options_lzma *options, - lzma_lz_options *lz_options); - - -/// Resets an already initialized LZMA encoder; this is used by LZMA2. -extern lzma_ret lzma_lzma_encoder_reset( - lzma_lzma1_encoder *coder, const lzma_options_lzma *options); - - -extern lzma_ret lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - uint32_t read_limit); - -#endif - -#endif diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c b/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c deleted file mode 100644 index 0f063d5..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_optimum_fast.c -// -// Author: Igor Pavlov -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_encoder_private.h" -#include "memcmplen.h" - - -#define change_pair(small_dist, big_dist) \ - (((big_dist) >> 7) > (small_dist)) - - -extern void -lzma_lzma_optimum_fast(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res) -{ - const uint32_t nice_len = mf->nice_len; - - uint32_t len_main; - uint32_t matches_count; - if (mf->read_ahead == 0) { - len_main = mf_find(mf, &matches_count, coder->matches); - } else { - assert(mf->read_ahead == 1); - len_main = coder->longest_match_length; - matches_count = coder->matches_count; - } - - const uint8_t *buf = mf_ptr(mf) - 1; - const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX); - - if (buf_avail < 2) { - // There's not enough input left to encode a match. - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - - // Look for repeated matches; scan the previous four match distances - uint32_t rep_len = 0; - uint32_t rep_index = 0; - - for (uint32_t i = 0; i < REPS; ++i) { - // Pointer to the beginning of the match candidate - const uint8_t *const buf_back = buf - coder->reps[i] - 1; - - // If the first two bytes (2 == MATCH_LEN_MIN) do not match, - // this rep is not useful. - if (not_equal_16(buf, buf_back)) - continue; - - // The first two bytes matched. - // Calculate the length of the match. - const uint32_t len = lzma_memcmplen( - buf, buf_back, 2, buf_avail); - - // If we have found a repeated match that is at least - // nice_len long, return it immediately. - if (len >= nice_len) { - *back_res = i; - *len_res = len; - mf_skip(mf, len - 1); - return; - } - - if (len > rep_len) { - rep_index = i; - rep_len = len; - } - } - - // We didn't find a long enough repeated match. Encode it as a normal - // match if the match length is at least nice_len. - if (len_main >= nice_len) { - *back_res = coder->matches[matches_count - 1].dist + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 1); - return; - } - - uint32_t back_main = 0; - if (len_main >= 2) { - back_main = coder->matches[matches_count - 1].dist; - - while (matches_count > 1 && len_main == - coder->matches[matches_count - 2].len + 1) { - if (!change_pair(coder->matches[ - matches_count - 2].dist, - back_main)) - break; - - --matches_count; - len_main = coder->matches[matches_count - 1].len; - back_main = coder->matches[matches_count - 1].dist; - } - - if (len_main == 2 && back_main >= 0x80) - len_main = 1; - } - - if (rep_len >= 2) { - if (rep_len + 1 >= len_main - || (rep_len + 2 >= len_main - && back_main > (UINT32_C(1) << 9)) - || (rep_len + 3 >= len_main - && back_main > (UINT32_C(1) << 15))) { - *back_res = rep_index; - *len_res = rep_len; - mf_skip(mf, rep_len - 1); - return; - } - } - - if (len_main < 2 || buf_avail <= 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - - // Get the matches for the next byte. If we find a better match, - // the current byte is encoded as a literal. - coder->longest_match_length = mf_find(mf, - &coder->matches_count, coder->matches); - - if (coder->longest_match_length >= 2) { - const uint32_t new_dist = coder->matches[ - coder->matches_count - 1].dist; - - if ((coder->longest_match_length >= len_main - && new_dist < back_main) - || (coder->longest_match_length == len_main + 1 - && !change_pair(back_main, new_dist)) - || (coder->longest_match_length > len_main + 1) - || (coder->longest_match_length + 1 >= len_main - && len_main >= 3 - && change_pair(new_dist, back_main))) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - } - - // In contrast to LZMA SDK, dictionary could not have been moved - // between mf_find() calls, thus it is safe to just increment - // the old buf pointer instead of recalculating it with mf_ptr(). - ++buf; - - const uint32_t limit = my_max(2, len_main - 1); - - for (uint32_t i = 0; i < REPS; ++i) { - if (memcmp(buf, buf - coder->reps[i] - 1, limit) == 0) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - } - - *back_res = back_main + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 2); - return; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c b/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c deleted file mode 100644 index a6c0398..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c +++ /dev/null @@ -1,858 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_optimum_normal.c -// -// Author: Igor Pavlov -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_encoder_private.h" -#include "fastpos.h" -#include "memcmplen.h" - - -//////////// -// Prices // -//////////// - -static uint32_t -get_literal_price(const lzma_lzma1_encoder *const coder, const uint32_t pos, - const uint32_t prev_byte, const bool match_mode, - uint32_t match_byte, uint32_t symbol) -{ - const probability *const subcoder = literal_subcoder(coder->literal, - coder->literal_context_bits, coder->literal_mask, - pos, prev_byte); - - uint32_t price = 0; - - if (!match_mode) { - price = rc_bittree_price(subcoder, 8, symbol); - } else { - uint32_t offset = 0x100; - symbol += UINT32_C(1) << 8; - - do { - match_byte <<= 1; - - const uint32_t match_bit = match_byte & offset; - const uint32_t subcoder_index - = offset + match_bit + (symbol >> 8); - const uint32_t bit = (symbol >> 7) & 1; - price += rc_bit_price(subcoder[subcoder_index], bit); - - symbol <<= 1; - offset &= ~(match_byte ^ symbol); - - } while (symbol < (UINT32_C(1) << 16)); - } - - return price; -} - - -static inline uint32_t -get_len_price(const lzma_length_encoder *const lencoder, - const uint32_t len, const uint32_t pos_state) -{ - // NOTE: Unlike the other price tables, length prices are updated - // in lzma_encoder.c - return lencoder->prices[pos_state][len - MATCH_LEN_MIN]; -} - - -static inline uint32_t -get_short_rep_price(const lzma_lzma1_encoder *const coder, - const lzma_lzma_state state, const uint32_t pos_state) -{ - return rc_bit_0_price(coder->is_rep0[state]) - + rc_bit_0_price(coder->is_rep0_long[state][pos_state]); -} - - -static inline uint32_t -get_pure_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index, - const lzma_lzma_state state, uint32_t pos_state) -{ - uint32_t price; - - if (rep_index == 0) { - price = rc_bit_0_price(coder->is_rep0[state]); - price += rc_bit_1_price(coder->is_rep0_long[state][pos_state]); - } else { - price = rc_bit_1_price(coder->is_rep0[state]); - - if (rep_index == 1) { - price += rc_bit_0_price(coder->is_rep1[state]); - } else { - price += rc_bit_1_price(coder->is_rep1[state]); - price += rc_bit_price(coder->is_rep2[state], - rep_index - 2); - } - } - - return price; -} - - -static inline uint32_t -get_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index, - const uint32_t len, const lzma_lzma_state state, - const uint32_t pos_state) -{ - return get_len_price(&coder->rep_len_encoder, len, pos_state) - + get_pure_rep_price(coder, rep_index, state, pos_state); -} - - -static inline uint32_t -get_dist_len_price(const lzma_lzma1_encoder *const coder, const uint32_t dist, - const uint32_t len, const uint32_t pos_state) -{ - const uint32_t dist_state = get_dist_state(len); - uint32_t price; - - if (dist < FULL_DISTANCES) { - price = coder->dist_prices[dist_state][dist]; - } else { - const uint32_t dist_slot = get_dist_slot_2(dist); - price = coder->dist_slot_prices[dist_state][dist_slot] - + coder->align_prices[dist & ALIGN_MASK]; - } - - price += get_len_price(&coder->match_len_encoder, len, pos_state); - - return price; -} - - -static void -fill_dist_prices(lzma_lzma1_encoder *coder) -{ - for (uint32_t dist_state = 0; dist_state < DIST_STATES; ++dist_state) { - - uint32_t *const dist_slot_prices - = coder->dist_slot_prices[dist_state]; - - // Price to encode the dist_slot. - for (uint32_t dist_slot = 0; - dist_slot < coder->dist_table_size; ++dist_slot) - dist_slot_prices[dist_slot] = rc_bittree_price( - coder->dist_slot[dist_state], - DIST_SLOT_BITS, dist_slot); - - // For matches with distance >= FULL_DISTANCES, add the price - // of the direct bits part of the match distance. (Align bits - // are handled by fill_align_prices()). - for (uint32_t dist_slot = DIST_MODEL_END; - dist_slot < coder->dist_table_size; - ++dist_slot) - dist_slot_prices[dist_slot] += rc_direct_price( - ((dist_slot >> 1) - 1) - ALIGN_BITS); - - // Distances in the range [0, 3] are fully encoded with - // dist_slot, so they are used for coder->dist_prices - // as is. - for (uint32_t i = 0; i < DIST_MODEL_START; ++i) - coder->dist_prices[dist_state][i] - = dist_slot_prices[i]; - } - - // Distances in the range [4, 127] depend on dist_slot and - // dist_special. We do this in a loop separate from the above - // loop to avoid redundant calls to get_dist_slot(). - for (uint32_t i = DIST_MODEL_START; i < FULL_DISTANCES; ++i) { - const uint32_t dist_slot = get_dist_slot(i); - const uint32_t footer_bits = ((dist_slot >> 1) - 1); - const uint32_t base = (2 | (dist_slot & 1)) << footer_bits; - const uint32_t price = rc_bittree_reverse_price( - coder->dist_special + base - dist_slot - 1, - footer_bits, i - base); - - for (uint32_t dist_state = 0; dist_state < DIST_STATES; - ++dist_state) - coder->dist_prices[dist_state][i] - = price + coder->dist_slot_prices[ - dist_state][dist_slot]; - } - - coder->match_price_count = 0; - return; -} - - -static void -fill_align_prices(lzma_lzma1_encoder *coder) -{ - for (uint32_t i = 0; i < ALIGN_SIZE; ++i) - coder->align_prices[i] = rc_bittree_reverse_price( - coder->dist_align, ALIGN_BITS, i); - - coder->align_price_count = 0; - return; -} - - -///////////// -// Optimal // -///////////// - -static inline void -make_literal(lzma_optimal *optimal) -{ - optimal->back_prev = UINT32_MAX; - optimal->prev_1_is_literal = false; -} - - -static inline void -make_short_rep(lzma_optimal *optimal) -{ - optimal->back_prev = 0; - optimal->prev_1_is_literal = false; -} - - -#define is_short_rep(optimal) \ - ((optimal).back_prev == 0) - - -static void -backward(lzma_lzma1_encoder *restrict coder, uint32_t *restrict len_res, - uint32_t *restrict back_res, uint32_t cur) -{ - coder->opts_end_index = cur; - - uint32_t pos_mem = coder->opts[cur].pos_prev; - uint32_t back_mem = coder->opts[cur].back_prev; - - do { - if (coder->opts[cur].prev_1_is_literal) { - make_literal(&coder->opts[pos_mem]); - coder->opts[pos_mem].pos_prev = pos_mem - 1; - - if (coder->opts[cur].prev_2) { - coder->opts[pos_mem - 1].prev_1_is_literal - = false; - coder->opts[pos_mem - 1].pos_prev - = coder->opts[cur].pos_prev_2; - coder->opts[pos_mem - 1].back_prev - = coder->opts[cur].back_prev_2; - } - } - - const uint32_t pos_prev = pos_mem; - const uint32_t back_cur = back_mem; - - back_mem = coder->opts[pos_prev].back_prev; - pos_mem = coder->opts[pos_prev].pos_prev; - - coder->opts[pos_prev].back_prev = back_cur; - coder->opts[pos_prev].pos_prev = cur; - cur = pos_prev; - - } while (cur != 0); - - coder->opts_current_index = coder->opts[0].pos_prev; - *len_res = coder->opts[0].pos_prev; - *back_res = coder->opts[0].back_prev; - - return; -} - - -////////// -// Main // -////////// - -static inline uint32_t -helper1(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res, - uint32_t position) -{ - const uint32_t nice_len = mf->nice_len; - - uint32_t len_main; - uint32_t matches_count; - - if (mf->read_ahead == 0) { - len_main = mf_find(mf, &matches_count, coder->matches); - } else { - assert(mf->read_ahead == 1); - len_main = coder->longest_match_length; - matches_count = coder->matches_count; - } - - const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX); - if (buf_avail < 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return UINT32_MAX; - } - - const uint8_t *const buf = mf_ptr(mf) - 1; - - uint32_t rep_lens[REPS]; - uint32_t rep_max_index = 0; - - for (uint32_t i = 0; i < REPS; ++i) { - const uint8_t *const buf_back = buf - coder->reps[i] - 1; - - if (not_equal_16(buf, buf_back)) { - rep_lens[i] = 0; - continue; - } - - rep_lens[i] = lzma_memcmplen(buf, buf_back, 2, buf_avail); - - if (rep_lens[i] > rep_lens[rep_max_index]) - rep_max_index = i; - } - - if (rep_lens[rep_max_index] >= nice_len) { - *back_res = rep_max_index; - *len_res = rep_lens[rep_max_index]; - mf_skip(mf, *len_res - 1); - return UINT32_MAX; - } - - - if (len_main >= nice_len) { - *back_res = coder->matches[matches_count - 1].dist + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 1); - return UINT32_MAX; - } - - const uint8_t current_byte = *buf; - const uint8_t match_byte = *(buf - coder->reps[0] - 1); - - if (len_main < 2 && current_byte != match_byte - && rep_lens[rep_max_index] < 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return UINT32_MAX; - } - - coder->opts[0].state = coder->state; - - const uint32_t pos_state = position & coder->pos_mask; - - coder->opts[1].price = rc_bit_0_price( - coder->is_match[coder->state][pos_state]) - + get_literal_price(coder, position, buf[-1], - !is_literal_state(coder->state), - match_byte, current_byte); - - make_literal(&coder->opts[1]); - - const uint32_t match_price = rc_bit_1_price( - coder->is_match[coder->state][pos_state]); - const uint32_t rep_match_price = match_price - + rc_bit_1_price(coder->is_rep[coder->state]); - - if (match_byte == current_byte) { - const uint32_t short_rep_price = rep_match_price - + get_short_rep_price( - coder, coder->state, pos_state); - - if (short_rep_price < coder->opts[1].price) { - coder->opts[1].price = short_rep_price; - make_short_rep(&coder->opts[1]); - } - } - - const uint32_t len_end = my_max(len_main, rep_lens[rep_max_index]); - - if (len_end < 2) { - *back_res = coder->opts[1].back_prev; - *len_res = 1; - return UINT32_MAX; - } - - coder->opts[1].pos_prev = 0; - - for (uint32_t i = 0; i < REPS; ++i) - coder->opts[0].backs[i] = coder->reps[i]; - - uint32_t len = len_end; - do { - coder->opts[len].price = RC_INFINITY_PRICE; - } while (--len >= 2); - - - for (uint32_t i = 0; i < REPS; ++i) { - uint32_t rep_len = rep_lens[i]; - if (rep_len < 2) - continue; - - const uint32_t price = rep_match_price + get_pure_rep_price( - coder, i, coder->state, pos_state); - - do { - const uint32_t cur_and_len_price = price - + get_len_price( - &coder->rep_len_encoder, - rep_len, pos_state); - - if (cur_and_len_price < coder->opts[rep_len].price) { - coder->opts[rep_len].price = cur_and_len_price; - coder->opts[rep_len].pos_prev = 0; - coder->opts[rep_len].back_prev = i; - coder->opts[rep_len].prev_1_is_literal = false; - } - } while (--rep_len >= 2); - } - - - const uint32_t normal_match_price = match_price - + rc_bit_0_price(coder->is_rep[coder->state]); - - len = rep_lens[0] >= 2 ? rep_lens[0] + 1 : 2; - if (len <= len_main) { - uint32_t i = 0; - while (len > coder->matches[i].len) - ++i; - - for(; ; ++len) { - const uint32_t dist = coder->matches[i].dist; - const uint32_t cur_and_len_price = normal_match_price - + get_dist_len_price(coder, - dist, len, pos_state); - - if (cur_and_len_price < coder->opts[len].price) { - coder->opts[len].price = cur_and_len_price; - coder->opts[len].pos_prev = 0; - coder->opts[len].back_prev = dist + REPS; - coder->opts[len].prev_1_is_literal = false; - } - - if (len == coder->matches[i].len) - if (++i == matches_count) - break; - } - } - - return len_end; -} - - -static inline uint32_t -helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf, - uint32_t len_end, uint32_t position, const uint32_t cur, - const uint32_t nice_len, const uint32_t buf_avail_full) -{ - uint32_t matches_count = coder->matches_count; - uint32_t new_len = coder->longest_match_length; - uint32_t pos_prev = coder->opts[cur].pos_prev; - lzma_lzma_state state; - - if (coder->opts[cur].prev_1_is_literal) { - --pos_prev; - - if (coder->opts[cur].prev_2) { - state = coder->opts[coder->opts[cur].pos_prev_2].state; - - if (coder->opts[cur].back_prev_2 < REPS) - update_long_rep(state); - else - update_match(state); - - } else { - state = coder->opts[pos_prev].state; - } - - update_literal(state); - - } else { - state = coder->opts[pos_prev].state; - } - - if (pos_prev == cur - 1) { - if (is_short_rep(coder->opts[cur])) - update_short_rep(state); - else - update_literal(state); - } else { - uint32_t pos; - if (coder->opts[cur].prev_1_is_literal - && coder->opts[cur].prev_2) { - pos_prev = coder->opts[cur].pos_prev_2; - pos = coder->opts[cur].back_prev_2; - update_long_rep(state); - } else { - pos = coder->opts[cur].back_prev; - if (pos < REPS) - update_long_rep(state); - else - update_match(state); - } - - if (pos < REPS) { - reps[0] = coder->opts[pos_prev].backs[pos]; - - uint32_t i; - for (i = 1; i <= pos; ++i) - reps[i] = coder->opts[pos_prev].backs[i - 1]; - - for (; i < REPS; ++i) - reps[i] = coder->opts[pos_prev].backs[i]; - - } else { - reps[0] = pos - REPS; - - for (uint32_t i = 1; i < REPS; ++i) - reps[i] = coder->opts[pos_prev].backs[i - 1]; - } - } - - coder->opts[cur].state = state; - - for (uint32_t i = 0; i < REPS; ++i) - coder->opts[cur].backs[i] = reps[i]; - - const uint32_t cur_price = coder->opts[cur].price; - - const uint8_t current_byte = *buf; - const uint8_t match_byte = *(buf - reps[0] - 1); - - const uint32_t pos_state = position & coder->pos_mask; - - const uint32_t cur_and_1_price = cur_price - + rc_bit_0_price(coder->is_match[state][pos_state]) - + get_literal_price(coder, position, buf[-1], - !is_literal_state(state), match_byte, current_byte); - - bool next_is_literal = false; - - if (cur_and_1_price < coder->opts[cur + 1].price) { - coder->opts[cur + 1].price = cur_and_1_price; - coder->opts[cur + 1].pos_prev = cur; - make_literal(&coder->opts[cur + 1]); - next_is_literal = true; - } - - const uint32_t match_price = cur_price - + rc_bit_1_price(coder->is_match[state][pos_state]); - const uint32_t rep_match_price = match_price - + rc_bit_1_price(coder->is_rep[state]); - - if (match_byte == current_byte - && !(coder->opts[cur + 1].pos_prev < cur - && coder->opts[cur + 1].back_prev == 0)) { - - const uint32_t short_rep_price = rep_match_price - + get_short_rep_price(coder, state, pos_state); - - if (short_rep_price <= coder->opts[cur + 1].price) { - coder->opts[cur + 1].price = short_rep_price; - coder->opts[cur + 1].pos_prev = cur; - make_short_rep(&coder->opts[cur + 1]); - next_is_literal = true; - } - } - - if (buf_avail_full < 2) - return len_end; - - const uint32_t buf_avail = my_min(buf_avail_full, nice_len); - - if (!next_is_literal && match_byte != current_byte) { // speed optimization - // try literal + rep0 - const uint8_t *const buf_back = buf - reps[0] - 1; - const uint32_t limit = my_min(buf_avail_full, nice_len + 1); - - const uint32_t len_test = lzma_memcmplen(buf, buf_back, 1, limit) - 1; - - if (len_test >= 2) { - lzma_lzma_state state_2 = state; - update_literal(state_2); - - const uint32_t pos_state_next = (position + 1) & coder->pos_mask; - const uint32_t next_rep_match_price = cur_and_1_price - + rc_bit_1_price(coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - //for (; len_test >= 2; --len_test) { - const uint32_t offset = cur + 1 + len_test; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = false; - } - //} - } - } - - - uint32_t start_len = 2; // speed optimization - - for (uint32_t rep_index = 0; rep_index < REPS; ++rep_index) { - const uint8_t *const buf_back = buf - reps[rep_index] - 1; - if (not_equal_16(buf, buf_back)) - continue; - - uint32_t len_test = lzma_memcmplen(buf, buf_back, 2, buf_avail); - - while (len_end < cur + len_test) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t len_test_temp = len_test; - const uint32_t price = rep_match_price + get_pure_rep_price( - coder, rep_index, state, pos_state); - - do { - const uint32_t cur_and_len_price = price - + get_len_price(&coder->rep_len_encoder, - len_test, pos_state); - - if (cur_and_len_price < coder->opts[cur + len_test].price) { - coder->opts[cur + len_test].price = cur_and_len_price; - coder->opts[cur + len_test].pos_prev = cur; - coder->opts[cur + len_test].back_prev = rep_index; - coder->opts[cur + len_test].prev_1_is_literal = false; - } - } while (--len_test >= 2); - - len_test = len_test_temp; - - if (rep_index == 0) - start_len = len_test + 1; - - - uint32_t len_test_2 = len_test + 1; - const uint32_t limit = my_min(buf_avail_full, - len_test_2 + nice_len); - // NOTE: len_test_2 may be greater than limit so the call to - // lzma_memcmplen() must be done conditionally. - if (len_test_2 < limit) - len_test_2 = lzma_memcmplen(buf, buf_back, len_test_2, limit); - - len_test_2 -= len_test + 1; - - if (len_test_2 >= 2) { - lzma_lzma_state state_2 = state; - update_long_rep(state_2); - - uint32_t pos_state_next = (position + len_test) & coder->pos_mask; - - const uint32_t cur_and_len_literal_price = price - + get_len_price(&coder->rep_len_encoder, - len_test, pos_state) - + rc_bit_0_price(coder->is_match[state_2][pos_state_next]) - + get_literal_price(coder, position + len_test, - buf[len_test - 1], true, - buf_back[len_test], buf[len_test]); - - update_literal(state_2); - - pos_state_next = (position + len_test + 1) & coder->pos_mask; - - const uint32_t next_rep_match_price = cur_and_len_literal_price - + rc_bit_1_price(coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - //for(; len_test_2 >= 2; len_test_2--) { - const uint32_t offset = cur + len_test + 1 + len_test_2; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test_2, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + len_test + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = true; - coder->opts[offset].pos_prev_2 = cur; - coder->opts[offset].back_prev_2 = rep_index; - } - //} - } - } - - - //for (uint32_t len_test = 2; len_test <= new_len; ++len_test) - if (new_len > buf_avail) { - new_len = buf_avail; - - matches_count = 0; - while (new_len > coder->matches[matches_count].len) - ++matches_count; - - coder->matches[matches_count++].len = new_len; - } - - - if (new_len >= start_len) { - const uint32_t normal_match_price = match_price - + rc_bit_0_price(coder->is_rep[state]); - - while (len_end < cur + new_len) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - uint32_t i = 0; - while (start_len > coder->matches[i].len) - ++i; - - for (uint32_t len_test = start_len; ; ++len_test) { - const uint32_t cur_back = coder->matches[i].dist; - uint32_t cur_and_len_price = normal_match_price - + get_dist_len_price(coder, - cur_back, len_test, pos_state); - - if (cur_and_len_price < coder->opts[cur + len_test].price) { - coder->opts[cur + len_test].price = cur_and_len_price; - coder->opts[cur + len_test].pos_prev = cur; - coder->opts[cur + len_test].back_prev - = cur_back + REPS; - coder->opts[cur + len_test].prev_1_is_literal = false; - } - - if (len_test == coder->matches[i].len) { - // Try Match + Literal + Rep0 - const uint8_t *const buf_back = buf - cur_back - 1; - uint32_t len_test_2 = len_test + 1; - const uint32_t limit = my_min(buf_avail_full, - len_test_2 + nice_len); - - // NOTE: len_test_2 may be greater than limit - // so the call to lzma_memcmplen() must be - // done conditionally. - if (len_test_2 < limit) - len_test_2 = lzma_memcmplen(buf, buf_back, - len_test_2, limit); - - len_test_2 -= len_test + 1; - - if (len_test_2 >= 2) { - lzma_lzma_state state_2 = state; - update_match(state_2); - uint32_t pos_state_next - = (position + len_test) & coder->pos_mask; - - const uint32_t cur_and_len_literal_price = cur_and_len_price - + rc_bit_0_price( - coder->is_match[state_2][pos_state_next]) - + get_literal_price(coder, - position + len_test, - buf[len_test - 1], - true, - buf_back[len_test], - buf[len_test]); - - update_literal(state_2); - pos_state_next = (pos_state_next + 1) & coder->pos_mask; - - const uint32_t next_rep_match_price - = cur_and_len_literal_price - + rc_bit_1_price( - coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - // for(; len_test_2 >= 2; --len_test_2) { - const uint32_t offset = cur + len_test + 1 + len_test_2; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test_2, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + len_test + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = true; - coder->opts[offset].pos_prev_2 = cur; - coder->opts[offset].back_prev_2 - = cur_back + REPS; - } - //} - } - - if (++i == matches_count) - break; - } - } - } - - return len_end; -} - - -extern void -lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res, - uint32_t position) -{ - // If we have symbols pending, return the next pending symbol. - if (coder->opts_end_index != coder->opts_current_index) { - assert(mf->read_ahead > 0); - *len_res = coder->opts[coder->opts_current_index].pos_prev - - coder->opts_current_index; - *back_res = coder->opts[coder->opts_current_index].back_prev; - coder->opts_current_index = coder->opts[ - coder->opts_current_index].pos_prev; - return; - } - - // Update the price tables. In LZMA SDK <= 4.60 (and possibly later) - // this was done in both initialization function and in the main loop. - // In liblzma they were moved into this single place. - if (mf->read_ahead == 0) { - if (coder->match_price_count >= (1 << 7)) - fill_dist_prices(coder); - - if (coder->align_price_count >= ALIGN_SIZE) - fill_align_prices(coder); - } - - // TODO: This needs quite a bit of cleaning still. But splitting - // the original function into two pieces makes it at least a little - // more readable, since those two parts don't share many variables. - - uint32_t len_end = helper1(coder, mf, back_res, len_res, position); - if (len_end == UINT32_MAX) - return; - - uint32_t reps[REPS]; - memcpy(reps, coder->reps, sizeof(reps)); - - uint32_t cur; - for (cur = 1; cur < len_end; ++cur) { - assert(cur < OPTS); - - coder->longest_match_length = mf_find( - mf, &coder->matches_count, coder->matches); - - if (coder->longest_match_length >= mf->nice_len) - break; - - len_end = helper2(coder, reps, mf_ptr(mf) - 1, len_end, - position + cur, cur, mf->nice_len, - my_min(mf_avail(mf) + 1, OPTS - 1 - cur)); - } - - backward(coder, len_res, back_res, cur); - return; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder_presets.c b/software/src/xz/src/liblzma/lzma/lzma_encoder_presets.c deleted file mode 100644 index e53483f..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder_presets.c +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_presets.c -/// \brief Encoder presets -/// \note xz needs this even when only decoding is enabled. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -extern LZMA_API(lzma_bool) -lzma_lzma_preset(lzma_options_lzma *options, uint32_t preset) -{ - const uint32_t level = preset & LZMA_PRESET_LEVEL_MASK; - const uint32_t flags = preset & ~LZMA_PRESET_LEVEL_MASK; - const uint32_t supported_flags = LZMA_PRESET_EXTREME; - - if (level > 9 || (flags & ~supported_flags)) - return true; - - options->preset_dict = NULL; - options->preset_dict_size = 0; - - options->lc = LZMA_LC_DEFAULT; - options->lp = LZMA_LP_DEFAULT; - options->pb = LZMA_PB_DEFAULT; - - static const uint8_t dict_pow2[] - = { 18, 20, 21, 22, 22, 23, 23, 24, 25, 26 }; - options->dict_size = UINT32_C(1) << dict_pow2[level]; - - if (level <= 3) { - options->mode = LZMA_MODE_FAST; - options->mf = level == 0 ? LZMA_MF_HC3 : LZMA_MF_HC4; - options->nice_len = level <= 1 ? 128 : 273; - static const uint8_t depths[] = { 4, 8, 24, 48 }; - options->depth = depths[level]; - } else { - options->mode = LZMA_MODE_NORMAL; - options->mf = LZMA_MF_BT4; - options->nice_len = level == 4 ? 16 : level == 5 ? 32 : 64; - options->depth = 0; - } - - if (flags & LZMA_PRESET_EXTREME) { - options->mode = LZMA_MODE_NORMAL; - options->mf = LZMA_MF_BT4; - if (level == 3 || level == 5) { - options->nice_len = 192; - options->depth = 0; - } else { - options->nice_len = 273; - options->depth = 512; - } - } - - return false; -} diff --git a/software/src/xz/src/liblzma/lzma/lzma_encoder_private.h b/software/src/xz/src/liblzma/lzma/lzma_encoder_private.h deleted file mode 100644 index eeea5e9..0000000 --- a/software/src/xz/src/liblzma/lzma/lzma_encoder_private.h +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_private.h -/// \brief Private definitions for LZMA encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_ENCODER_PRIVATE_H -#define LZMA_LZMA_ENCODER_PRIVATE_H - -#include "lz_encoder.h" -#include "range_encoder.h" -#include "lzma_common.h" -#include "lzma_encoder.h" - - -// Macro to compare if the first two bytes in two buffers differ. This is -// needed in lzma_lzma_optimum_*() to test if the match is at least -// MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no -// reason to not use it when it is supported. -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define not_equal_16(a, b) (read16ne(a) != read16ne(b)) -#else -# define not_equal_16(a, b) \ - ((a)[0] != (b)[0] || (a)[1] != (b)[1]) -#endif - - -// Optimal - Number of entries in the optimum array. -#define OPTS (1 << 12) - - -typedef struct { - probability choice; - probability choice2; - probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; - probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; - probability high[LEN_HIGH_SYMBOLS]; - - uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS]; - uint32_t table_size; - uint32_t counters[POS_STATES_MAX]; - -} lzma_length_encoder; - - -typedef struct { - lzma_lzma_state state; - - bool prev_1_is_literal; - bool prev_2; - - uint32_t pos_prev_2; - uint32_t back_prev_2; - - uint32_t price; - uint32_t pos_prev; // pos_next; - uint32_t back_prev; - - uint32_t backs[REPS]; - -} lzma_optimal; - - -struct lzma_lzma1_encoder_s { - /// Range encoder - lzma_range_encoder rc; - - /// Uncompressed size (doesn't include possible preset dictionary) - uint64_t uncomp_size; - - /// If non-zero, produce at most this much output. - /// Some input may then be missing from the output. - uint64_t out_limit; - - /// If the above out_limit is non-zero, *uncomp_size_ptr is set to - /// the amount of uncompressed data that we were able to fit - /// in the output buffer. - uint64_t *uncomp_size_ptr; - - /// State - lzma_lzma_state state; - - /// The four most recent match distances - uint32_t reps[REPS]; - - /// Array of match candidates - lzma_match matches[MATCH_LEN_MAX + 1]; - - /// Number of match candidates in matches[] - uint32_t matches_count; - - /// Variable to hold the length of the longest match between calls - /// to lzma_lzma_optimum_*(). - uint32_t longest_match_length; - - /// True if using getoptimumfast - bool fast_mode; - - /// True if the encoder has been initialized by encoding the first - /// byte as a literal. - bool is_initialized; - - /// True if the range encoder has been flushed, but not all bytes - /// have been written to the output buffer yet. - bool is_flushed; - - /// True if end of payload marker will be written. - bool use_eopm; - - uint32_t pos_mask; ///< (1 << pos_bits) - 1 - uint32_t literal_context_bits; - uint32_t literal_mask; - - // These are the same as in lzma_decoder.c. See comments there. - probability literal[LITERAL_CODERS_MAX * LITERAL_CODER_SIZE]; - probability is_match[STATES][POS_STATES_MAX]; - probability is_rep[STATES]; - probability is_rep0[STATES]; - probability is_rep1[STATES]; - probability is_rep2[STATES]; - probability is_rep0_long[STATES][POS_STATES_MAX]; - probability dist_slot[DIST_STATES][DIST_SLOTS]; - probability dist_special[FULL_DISTANCES - DIST_MODEL_END]; - probability dist_align[ALIGN_SIZE]; - - // These are the same as in lzma_decoder.c except that the encoders - // include also price tables. - lzma_length_encoder match_len_encoder; - lzma_length_encoder rep_len_encoder; - - // Price tables - uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS]; - uint32_t dist_prices[DIST_STATES][FULL_DISTANCES]; - uint32_t dist_table_size; - uint32_t match_price_count; - - uint32_t align_prices[ALIGN_SIZE]; - uint32_t align_price_count; - - // Optimal - uint32_t opts_end_index; - uint32_t opts_current_index; - lzma_optimal opts[OPTS]; -}; - - -extern void lzma_lzma_optimum_fast( - lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res); - -extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, uint32_t *restrict back_res, - uint32_t *restrict len_res, uint32_t position); - -#endif diff --git a/software/src/xz/src/liblzma/rangecoder/Makefile.inc b/software/src/xz/src/liblzma/rangecoder/Makefile.inc deleted file mode 100644 index 9a00e6e..0000000 --- a/software/src/xz/src/liblzma/rangecoder/Makefile.inc +++ /dev/null @@ -1,17 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -EXTRA_DIST += rangecoder/price_tablegen.c - -liblzma_la_SOURCES += rangecoder/range_common.h - -if COND_ENCODER_LZMA1 -liblzma_la_SOURCES += \ - rangecoder/range_encoder.h \ - rangecoder/price.h \ - rangecoder/price_table.c -endif - -if COND_DECODER_LZMA1 -liblzma_la_SOURCES += rangecoder/range_decoder.h -endif diff --git a/software/src/xz/src/liblzma/rangecoder/price.h b/software/src/xz/src/liblzma/rangecoder/price.h deleted file mode 100644 index cce6bda..0000000 --- a/software/src/xz/src/liblzma/rangecoder/price.h +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file price.h -/// \brief Probability price calculation -// -// Author: Igor Pavlov -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_PRICE_H -#define LZMA_PRICE_H - - -#define RC_MOVE_REDUCING_BITS 4 -#define RC_BIT_PRICE_SHIFT_BITS 4 -#define RC_PRICE_TABLE_SIZE (RC_BIT_MODEL_TOTAL >> RC_MOVE_REDUCING_BITS) - -#define RC_INFINITY_PRICE (UINT32_C(1) << 30) - - -/// Lookup table for the inline functions defined in this file. -lzma_attr_visibility_hidden -extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; - - -static inline uint32_t -rc_bit_price(const probability prob, const uint32_t bit) -{ - return lzma_rc_prices[(prob ^ ((UINT32_C(0) - bit) - & (RC_BIT_MODEL_TOTAL - 1))) >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bit_0_price(const probability prob) -{ - return lzma_rc_prices[prob >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bit_1_price(const probability prob) -{ - return lzma_rc_prices[(prob ^ (RC_BIT_MODEL_TOTAL - 1)) - >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bittree_price(const probability *const probs, - const uint32_t bit_levels, uint32_t symbol) -{ - uint32_t price = 0; - symbol += UINT32_C(1) << bit_levels; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - price += rc_bit_price(probs[symbol], bit); - } while (symbol != 1); - - return price; -} - - -static inline uint32_t -rc_bittree_reverse_price(const probability *const probs, - uint32_t bit_levels, uint32_t symbol) -{ - uint32_t price = 0; - uint32_t model_index = 1; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - price += rc_bit_price(probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (--bit_levels != 0); - - return price; -} - - -static inline uint32_t -rc_direct_price(const uint32_t bits) -{ - return bits << RC_BIT_PRICE_SHIFT_BITS; -} - -#endif diff --git a/software/src/xz/src/liblzma/rangecoder/price_table.c b/software/src/xz/src/liblzma/rangecoder/price_table.c deleted file mode 100644 index c33433f..0000000 --- a/software/src/xz/src/liblzma/rangecoder/price_table.c +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -// This file has been generated by price_tablegen.c. - -#include "range_encoder.h" - -const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = { - 128, 103, 91, 84, 78, 73, 69, 66, - 63, 61, 58, 56, 54, 52, 51, 49, - 48, 46, 45, 44, 43, 42, 41, 40, - 39, 38, 37, 36, 35, 34, 34, 33, - 32, 31, 31, 30, 29, 29, 28, 28, - 27, 26, 26, 25, 25, 24, 24, 23, - 23, 22, 22, 22, 21, 21, 20, 20, - 19, 19, 19, 18, 18, 17, 17, 17, - 16, 16, 16, 15, 15, 15, 14, 14, - 14, 13, 13, 13, 12, 12, 12, 11, - 11, 11, 11, 10, 10, 10, 10, 9, - 9, 9, 9, 8, 8, 8, 8, 7, - 7, 7, 7, 6, 6, 6, 6, 5, - 5, 5, 5, 5, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1 -}; diff --git a/software/src/xz/src/liblzma/rangecoder/price_tablegen.c b/software/src/xz/src/liblzma/rangecoder/price_tablegen.c deleted file mode 100644 index 4b6ca37..0000000 --- a/software/src/xz/src/liblzma/rangecoder/price_tablegen.c +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file price_tablegen.c -/// \brief Probability price table generator -/// -/// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include -#include - -// Make it compile without common.h. -#define BUILDING_PRICE_TABLEGEN -#define lzma_attr_visibility_hidden - -#include "range_common.h" -#include "price.h" - - -static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; - - -static void -init_price_table(void) -{ - for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; - i < RC_BIT_MODEL_TOTAL; - i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { - const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; - uint32_t w = i; - uint32_t bit_count = 0; - - for (uint32_t j = 0; j < cycles_bits; ++j) { - w *= w; - bit_count <<= 1; - - while (w >= (UINT32_C(1) << 16)) { - w >>= 1; - ++bit_count; - } - } - - rc_prices[i >> RC_MOVE_REDUCING_BITS] - = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) - - 15 - bit_count; - } - - return; -} - - -static void -print_price_table(void) -{ - // Split the SPDX string so that it won't accidentally match - // when tools search for the string. - printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" - "// This file has been generated by price_tablegen.c.\n\n" - "#include \"range_encoder.h\"\n\n" - "const uint8_t lzma_rc_prices[" - "RC_PRICE_TABLE_SIZE] = {"); - - const size_t array_size = sizeof(lzma_rc_prices) - / sizeof(lzma_rc_prices[0]); - for (size_t i = 0; i < array_size; ++i) { - if (i % 8 == 0) - printf("\n\t"); - - printf("%4" PRIu32, rc_prices[i]); - - if (i != array_size - 1) - printf(","); - } - - printf("\n};\n"); - - return; -} - - -int -main(void) -{ - init_price_table(); - print_price_table(); - return 0; -} diff --git a/software/src/xz/src/liblzma/rangecoder/range_common.h b/software/src/xz/src/liblzma/rangecoder/range_common.h deleted file mode 100644 index ac4dbe1..0000000 --- a/software/src/xz/src/liblzma/rangecoder/range_common.h +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_common.h -/// \brief Common things for range encoder and decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_COMMON_H -#define LZMA_RANGE_COMMON_H - -// Skip common.h if building price_tablegen.c. -#ifndef BUILDING_PRICE_TABLEGEN -# include "common.h" -#endif - - -/////////////// -// Constants // -/////////////// - -#define RC_SHIFT_BITS 8 -#define RC_TOP_BITS 24 -#define RC_TOP_VALUE (UINT32_C(1) << RC_TOP_BITS) -#define RC_BIT_MODEL_TOTAL_BITS 11 -#define RC_BIT_MODEL_TOTAL (UINT32_C(1) << RC_BIT_MODEL_TOTAL_BITS) -#define RC_MOVE_BITS 5 - - -//////////// -// Macros // -//////////// - -// Resets the probability so that both 0 and 1 have probability of 50 % -#define bit_reset(prob) \ - prob = RC_BIT_MODEL_TOTAL >> 1 - -// This does the same for a complete bit tree. -// (A tree represented as an array.) -#define bittree_reset(probs, bit_levels) \ - for (uint32_t bt_i = 0; bt_i < (1 << (bit_levels)); ++bt_i) \ - bit_reset((probs)[bt_i]) - - -////////////////////// -// Type definitions // -////////////////////// - -/// \brief Type of probabilities used with range coder -/// -/// This needs to be at least 12-bit integer, so uint16_t is a logical choice. -/// However, on some architecture and compiler combinations, a bigger type -/// may give better speed, because the probability variables are accessed -/// a lot. On the other hand, bigger probability type increases cache -/// footprint, since there are 2 to 14 thousand probability variables in -/// LZMA (assuming the limit of lc + lp <= 4; with lc + lp <= 12 there -/// would be about 1.5 million variables). -/// -/// With malicious files, the initialization speed of the LZMA decoder can -/// become important. In that case, smaller probability variables mean that -/// there is less bytes to write to RAM, which makes initialization faster. -/// With big probability type, the initialization can become so slow that it -/// can be a problem e.g. for email servers doing virus scanning. -/// -/// I will be sticking to uint16_t unless some specific architectures -/// are *much* faster (20-50 %) with uint32_t. -/// -/// Update in 2024: The branchless C and x86-64 assembly was written so that -/// probability is assumed to be uint16_t. (In contrast, LZMA SDK 23.01 -/// assembly supports both types.) -typedef uint16_t probability; - -#endif diff --git a/software/src/xz/src/liblzma/rangecoder/range_decoder.h b/software/src/xz/src/liblzma/rangecoder/range_decoder.h deleted file mode 100644 index a8aca90..0000000 --- a/software/src/xz/src/liblzma/rangecoder/range_decoder.h +++ /dev/null @@ -1,966 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_decoder.h -/// \brief Range Decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_DECODER_H -#define LZMA_RANGE_DECODER_H - -#include "range_common.h" - - -// Choose the range decoder variants to use using a bitmask. -// If no bits are set, only the basic version is used. -// If more than one version is selected for the same feature, -// the last one on the list below is used. -// -// Bitwise-or of the following enable branchless C versions: -// 0x01 normal bittrees -// 0x02 fixed-sized reverse bittrees -// 0x04 variable-sized reverse bittrees (not faster) -// 0x08 matched literal (not faster) -// -// GCC & Clang compatible x86-64 inline assembly: -// 0x010 normal bittrees -// 0x020 fixed-sized reverse bittrees -// 0x040 variable-sized reverse bittrees -// 0x080 matched literal -// 0x100 direct bits -// -// The default can be overridden at build time by defining -// LZMA_RANGE_DECODER_CONFIG to the desired mask. -// -// 2024-02-22: Feedback from benchmarks: -// - Brancless C (0x003) can be better than basic on x86-64 but often it's -// slightly worse on other archs. Since asm is much better on x86-64, -// branchless C is not used at all. -// - With x86-64 asm, there are slight differences between GCC and Clang -// and different processors. Overall 0x1F0 seems to be the best choice. -#ifndef LZMA_RANGE_DECODER_CONFIG -# if defined(__x86_64__) && !defined(__ILP32__) \ - && !defined(__NVCOMPILER) \ - && (defined(__GNUC__) || defined(__clang__)) -# define LZMA_RANGE_DECODER_CONFIG 0x1F0 -# else -# define LZMA_RANGE_DECODER_CONFIG 0 -# endif -#endif - - -// Negative RC_BIT_MODEL_TOTAL but the lowest RC_MOVE_BITS are flipped. -// This is useful for updating probability variables in branchless decoding: -// -// uint32_t decoded_bit = ...; -// probability tmp = RC_BIT_MODEL_OFFSET; -// tmp &= decoded_bit - 1; -// prob -= (prob + tmp) >> RC_MOVE_BITS; -#define RC_BIT_MODEL_OFFSET \ - ((UINT32_C(1) << RC_MOVE_BITS) - 1 - RC_BIT_MODEL_TOTAL) - - -typedef struct { - uint32_t range; - uint32_t code; - uint32_t init_bytes_left; -} lzma_range_decoder; - - -/// Reads the first five bytes to initialize the range decoder. -static inline lzma_ret -rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - while (rc->init_bytes_left > 0) { - if (*in_pos == in_size) - return LZMA_OK; - - // The first byte is always 0x00. It could have been omitted - // in LZMA2 but it wasn't, so one byte is wasted in every - // LZMA2 chunk. - if (rc->init_bytes_left == 5 && in[*in_pos] != 0x00) - return LZMA_DATA_ERROR; - - rc->code = (rc->code << 8) | in[*in_pos]; - ++*in_pos; - --rc->init_bytes_left; - } - - return LZMA_STREAM_END; -} - - -/// Makes local copies of range decoder and *in_pos variables. Doing this -/// improves speed significantly. The range decoder macros expect also -/// variables 'in' and 'in_size' to be defined. -#define rc_to_local(range_decoder, in_pos, fast_mode_in_required) \ - lzma_range_decoder rc = range_decoder; \ - const uint8_t *rc_in_ptr = in + (in_pos); \ - const uint8_t *rc_in_end = in + in_size; \ - const uint8_t *rc_in_fast_end \ - = (rc_in_end - rc_in_ptr) <= (fast_mode_in_required) \ - ? rc_in_ptr \ - : rc_in_end - (fast_mode_in_required); \ - (void)rc_in_fast_end; /* Silence a warning with HAVE_SMALL. */ \ - uint32_t rc_bound - - -/// Evaluates to true if there is enough input remaining to use fast mode. -#define rc_is_fast_allowed() (rc_in_ptr < rc_in_fast_end) - - -/// Stores the local copes back to the range decoder structure. -#define rc_from_local(range_decoder, in_pos) \ -do { \ - range_decoder = rc; \ - in_pos = (size_t)(rc_in_ptr - in); \ -} while (0) - - -/// Resets the range decoder structure. -#define rc_reset(range_decoder) \ -do { \ - (range_decoder).range = UINT32_MAX; \ - (range_decoder).code = 0; \ - (range_decoder).init_bytes_left = 5; \ -} while (0) - - -/// When decoding has been properly finished, rc.code is always zero unless -/// the input stream is corrupt. So checking this can catch some corrupt -/// files especially if they don't have any other integrity check. -#define rc_is_finished(range_decoder) \ - ((range_decoder).code == 0) - - -// Read the next input byte if needed. -#define rc_normalize() \ -do { \ - if (rc.range < RC_TOP_VALUE) { \ - rc.range <<= RC_SHIFT_BITS; \ - rc.code = (rc.code << RC_SHIFT_BITS) | *rc_in_ptr++; \ - } \ -} while (0) - - -/// If more input is needed but there is -/// no more input available, "goto out" is used to jump out of the main -/// decoder loop. The "_safe" macros are used in the Resumable decoder -/// mode in order to save the sequence to continue decoding from that -/// point later. -#define rc_normalize_safe(seq) \ -do { \ - if (rc.range < RC_TOP_VALUE) { \ - if (rc_in_ptr == rc_in_end) { \ - coder->sequence = seq; \ - goto out; \ - } \ - rc.range <<= RC_SHIFT_BITS; \ - rc.code = (rc.code << RC_SHIFT_BITS) | *rc_in_ptr++; \ - } \ -} while (0) - - -/// Start decoding a bit. This must be used together with rc_update_0() -/// and rc_update_1(): -/// -/// rc_if_0(prob) { -/// rc_update_0(prob); -/// // Do something -/// } else { -/// rc_update_1(prob); -/// // Do something else -/// } -/// -#define rc_if_0(prob) \ - rc_normalize(); \ - rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); \ - if (rc.code < rc_bound) - - -#define rc_if_0_safe(prob, seq) \ - rc_normalize_safe(seq); \ - rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); \ - if (rc.code < rc_bound) - - -/// Update the range decoder state and the used probability variable to -/// match a decoded bit of 0. -/// -/// The x86-64 assembly uses the commented method but it seems that, -/// at least on x86-64, the first version is slightly faster as C code. -#define rc_update_0(prob) \ -do { \ - rc.range = rc_bound; \ - prob += (RC_BIT_MODEL_TOTAL - (prob)) >> RC_MOVE_BITS; \ - /* prob -= ((prob) + RC_BIT_MODEL_OFFSET) >> RC_MOVE_BITS; */ \ -} while (0) - - -/// Update the range decoder state and the used probability variable to -/// match a decoded bit of 1. -#define rc_update_1(prob) \ -do { \ - rc.range -= rc_bound; \ - rc.code -= rc_bound; \ - prob -= (prob) >> RC_MOVE_BITS; \ -} while (0) - - -/// Decodes one bit and runs action0 or action1 depending on the decoded bit. -/// This macro is used as the last step in bittree reverse decoders since -/// those don't use "symbol" for anything else than indexing the probability -/// arrays. -#define rc_bit_last(prob, action0, action1) \ -do { \ - rc_if_0(prob) { \ - rc_update_0(prob); \ - action0; \ - } else { \ - rc_update_1(prob); \ - action1; \ - } \ -} while (0) - - -#define rc_bit_last_safe(prob, action0, action1, seq) \ -do { \ - rc_if_0_safe(prob, seq) { \ - rc_update_0(prob); \ - action0; \ - } else { \ - rc_update_1(prob); \ - action1; \ - } \ -} while (0) - - -/// Decodes one bit, updates "symbol", and runs action0 or action1 depending -/// on the decoded bit. -#define rc_bit(prob, action0, action1) \ - rc_bit_last(prob, \ - symbol <<= 1; action0, \ - symbol = (symbol << 1) + 1; action1); - - -#define rc_bit_safe(prob, action0, action1, seq) \ - rc_bit_last_safe(prob, \ - symbol <<= 1; action0, \ - symbol = (symbol << 1) + 1; action1, \ - seq); - -// Unroll fixed-sized bittree decoding. -// -// A compile-time constant in final_add can be used to get rid of the high bit -// from symbol that is used for the array indexing (1U << bittree_bits). -// final_add may also be used to add offset to the result (LZMA length -// decoder does that). -// -// The reason to have final_add here is that in the asm code the addition -// can be done for free: in x86-64 there is SBB instruction with -1 as -// the immediate value, and final_add is combined with that value. -#define rc_bittree_bit(prob) \ - rc_bit(prob, , ) - -#define rc_bittree3(probs, final_add) \ -do { \ - symbol = 1; \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - symbol += (uint32_t)(final_add); \ -} while (0) - -#define rc_bittree6(probs, final_add) \ -do { \ - symbol = 1; \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - symbol += (uint32_t)(final_add); \ -} while (0) - -#define rc_bittree8(probs, final_add) \ -do { \ - symbol = 1; \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - rc_bittree_bit(probs[symbol]); \ - symbol += (uint32_t)(final_add); \ -} while (0) - - -// Fixed-sized reverse bittree -#define rc_bittree_rev4(probs) \ -do { \ - symbol = 0; \ - rc_bit_last(probs[symbol + 1], , symbol += 1); \ - rc_bit_last(probs[symbol + 2], , symbol += 2); \ - rc_bit_last(probs[symbol + 4], , symbol += 4); \ - rc_bit_last(probs[symbol + 8], , symbol += 8); \ -} while (0) - - -// Decode one bit from variable-sized reverse bittree. The loop is done -// in the code that uses this macro. This could be changed if the assembly -// version benefited from having the loop done in assembly but it didn't -// seem so in early 2024. -// -// Also, if the loop was done here, the loop counter would likely be local -// to the macro so that it wouldn't modify yet another input variable. -// If a _safe version of a macro with a loop was done then a modifiable -// input variable couldn't be avoided though. -#define rc_bit_add_if_1(probs, dest, value_to_add_if_1) \ - rc_bit(probs[symbol], \ - , \ - dest += value_to_add_if_1); - - -// Matched literal -#define decode_with_match_bit \ - t_match_byte <<= 1; \ - t_match_bit = t_match_byte & t_offset; \ - t_subcoder_index = t_offset + t_match_bit + symbol; \ - rc_bit(probs[t_subcoder_index], \ - t_offset &= ~t_match_bit, \ - t_offset &= t_match_bit) - -#define rc_matched_literal(probs_base_var, match_byte) \ -do { \ - uint32_t t_match_byte = (match_byte); \ - uint32_t t_match_bit; \ - uint32_t t_subcoder_index; \ - uint32_t t_offset = 0x100; \ - symbol = 1; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ - decode_with_match_bit; \ -} while (0) - - -/// Decode a bit without using a probability. -// -// NOTE: GCC 13 and Clang/LLVM 16 can, at least on x86-64, optimize the bound -// calculation to use an arithmetic right shift so there's no need to provide -// the alternative code which, according to C99/C11/C23 6.3.1.3-p3 isn't -// perfectly portable: rc_bound = (uint32_t)((int32_t)rc.code >> 31); -#define rc_direct(dest, count_var) \ -do { \ - dest = (dest << 1) + 1; \ - rc_normalize(); \ - rc.range >>= 1; \ - rc.code -= rc.range; \ - rc_bound = UINT32_C(0) - (rc.code >> 31); \ - dest += rc_bound; \ - rc.code += rc.range & rc_bound; \ -} while (--count_var > 0) - - - -#define rc_direct_safe(dest, count_var, seq) \ -do { \ - rc_normalize_safe(seq); \ - rc.range >>= 1; \ - rc.code -= rc.range; \ - rc_bound = UINT32_C(0) - (rc.code >> 31); \ - rc.code += rc.range & rc_bound; \ - dest = (dest << 1) + (rc_bound + 1); \ -} while (--count_var > 0) - - -////////////////// -// Branchless C // -////////////////// - -/// Decode a bit using a branchless method. This reduces the number of -/// mispredicted branches and thus can improve speed. -#define rc_c_bit(prob, action_bit, action_neg) \ -do { \ - probability *p = &(prob); \ - rc_normalize(); \ - rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * *p; \ - uint32_t rc_mask = rc.code >= rc_bound; /* rc_mask = decoded bit */ \ - action_bit; /* action when rc_mask is 0 or 1 */ \ - /* rc_mask becomes 0 if bit is 0 and 0xFFFFFFFF if bit is 1: */ \ - rc_mask = 0U - rc_mask; \ - rc.range &= rc_mask; /* If bit 0: set rc.range = 0 */ \ - rc_bound ^= rc_mask; \ - rc_bound -= rc_mask; /* If bit 1: rc_bound = 0U - rc_bound */ \ - rc.range += rc_bound; \ - rc_bound &= rc_mask; \ - rc.code += rc_bound; \ - action_neg; /* action when rc_mask is 0 or 0xFFFFFFFF */ \ - rc_mask = ~rc_mask; /* If bit 0: all bits are set in rc_mask */ \ - rc_mask &= RC_BIT_MODEL_OFFSET; \ - *p -= (*p + rc_mask) >> RC_MOVE_BITS; \ -} while (0) - - -// Testing on x86-64 give an impression that only the normal bittrees and -// the fixed-sized reverse bittrees are worth the branchless C code. -// It should be tested on other archs for which there isn't assembly code -// in this file. - -// Using addition in "(symbol << 1) + rc_mask" allows use of x86 LEA -// or RISC-V SH1ADD instructions. Compilers might infer it from -// "(symbol << 1) | rc_mask" too if they see that mask is 0 or 1 but -// the use of addition doesn't require such analysis from compilers. -#if LZMA_RANGE_DECODER_CONFIG & 0x01 -#undef rc_bittree_bit -#define rc_bittree_bit(prob) \ - rc_c_bit(prob, \ - symbol = (symbol << 1) + rc_mask, \ - ) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x01 - -#if LZMA_RANGE_DECODER_CONFIG & 0x02 -#undef rc_bittree_rev4 -#define rc_bittree_rev4(probs) \ -do { \ - symbol = 0; \ - rc_c_bit(probs[symbol + 1], symbol += rc_mask, ); \ - rc_c_bit(probs[symbol + 2], symbol += rc_mask << 1, ); \ - rc_c_bit(probs[symbol + 4], symbol += rc_mask << 2, ); \ - rc_c_bit(probs[symbol + 8], symbol += rc_mask << 3, ); \ -} while (0) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x02 - -#if LZMA_RANGE_DECODER_CONFIG & 0x04 -#undef rc_bit_add_if_1 -#define rc_bit_add_if_1(probs, dest, value_to_add_if_1) \ - rc_c_bit(probs[symbol], \ - symbol = (symbol << 1) + rc_mask, \ - dest += (value_to_add_if_1) & rc_mask) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x04 - - -#if LZMA_RANGE_DECODER_CONFIG & 0x08 -#undef decode_with_match_bit -#define decode_with_match_bit \ - t_match_byte <<= 1; \ - t_match_bit = t_match_byte & t_offset; \ - t_subcoder_index = t_offset + t_match_bit + symbol; \ - rc_c_bit(probs[t_subcoder_index], \ - symbol = (symbol << 1) + rc_mask, \ - t_offset &= ~t_match_bit ^ rc_mask) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x08 - - -//////////// -// x86-64 // -//////////// - -#if LZMA_RANGE_DECODER_CONFIG & 0x1F0 - -// rc_asm_y and rc_asm_n are used as arguments to macros to control which -// strings to include or omit. -#define rc_asm_y(str) str -#define rc_asm_n(str) - -// There are a few possible variations for normalization. -// This is the smallest variant which is also used by LZMA SDK. -// -// - This has partial register write (the MOV from (%[in_ptr])). -// -// - INC saves one byte in code size over ADD. False dependency on -// partial flags from INC shouldn't become a problem on any processor -// because the instructions after normalization don't read the flags -// until SUB which sets all flags. -// -#define rc_asm_normalize \ - "cmp %[top_value], %[range]\n\t" \ - "jae 1f\n\t" \ - "shl %[shift_bits], %[code]\n\t" \ - "mov (%[in_ptr]), %b[code]\n\t" \ - "shl %[shift_bits], %[range]\n\t" \ - "inc %[in_ptr]\n" \ - "1:\n" - -// rc_asm_calc(prob) is roughly equivalent to the C version of rc_if_0(prob)... -// -// rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); -// if (rc.code < rc_bound) -// -// ...but the bound is stored in "range": -// -// t0 = range; -// range = (range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); -// t0 -= range; -// t1 = code; -// code -= range; -// -// The carry flag (CF) from the last subtraction holds the negation of -// the decoded bit (if CF==0 then the decoded bit is 1). -// The values in t0 and t1 are needed for rc_update_0(prob) and -// rc_update_1(prob). If the bit is 0, rc_update_0(prob)... -// -// rc.range = rc_bound; -// -// ...has already been done but the "code -= range" has to be reverted using -// the old value stored in t1. (Also, prob needs to be updated.) -// -// If the bit is 1, rc_update_1(prob)... -// -// rc.range -= rc_bound; -// rc.code -= rc_bound; -// -// ...is already done for "code" but the value for "range" needs to be taken -// from t0. (Also, prob needs to be updated here as well.) -// -// The assignments from t0 and t1 can be done in a branchless manner with CMOV -// after the instructions from this macro. The CF from SUB tells which moves -// are needed. -#define rc_asm_calc(prob) \ - "mov %[range], %[t0]\n\t" \ - "shr %[bit_model_total_bits], %[range]\n\t" \ - "imul %[" prob "], %[range]\n\t" \ - "sub %[range], %[t0]\n\t" \ - "mov %[code], %[t1]\n\t" \ - "sub %[range], %[code]\n\t" - -// Also, prob needs to be updated: The update math depends on the decoded bit. -// It can be expressed in a few slightly different ways but this is fairly -// convenient here: -// -// prob -= (prob + (bit ? 0 : RC_BIT_MODEL_OFFSET)) >> RC_MOVE_BITS; -// -// To do it in branchless way when the negation of the decoded bit is in CF, -// both "prob" and "prob + RC_BIT_MODEL_OFFSET" are needed. Then the desired -// value can be picked with CMOV. The addition can be done using LEA without -// affecting CF. -// -// (This prob update method is a tiny bit different from LZMA SDK 23.01. -// In the LZMA SDK a single register is reserved solely for a constant to -// be used with CMOV when updating prob. That is fine since there are enough -// free registers to do so. The method used here uses one fewer register, -// which is valuable with inline assembly.) -// -// * * * -// -// In bittree decoding, each (unrolled) loop iteration decodes one bit -// and needs one prob variable. To make it faster, the prob variable of -// the iteration N+1 is loaded during iteration N. There are two possible -// prob variables to choose from for N+1. Both are loaded from memory and -// the correct one is chosen with CMOV using the same CF as is used for -// other things described above. -// -// This preloading/prefetching requires an extra register. To avoid -// useless moves from "preloaded prob register" to "current prob register", -// the macros swap between the two registers for odd and even iterations. -// -// * * * -// -// Finally, the decoded bit has to be stored in "symbol". Since the negation -// of the bit is in CF, this can be done with SBB: symbol -= CF - 1. That is, -// if the decoded bit is 0 (CF==1) the operation is a no-op "symbol -= 0" -// and when bit is 1 (CF==0) the operation is "symbol -= 0 - 1" which is -// the same as "symbol += 1". -// -// The instructions for all things are intertwined for a few reasons: -// - freeing temporary registers for new use -// - not modifying CF too early -// - instruction scheduling -// -// The first and last iterations can cheat a little. For example, -// on the first iteration "symbol" is known to start from 1 so it -// doesn't need to be read; it can even be immediately initialized -// to 2 to prepare for the second iteration of the loop. -// -// * * * -// -// a = number of the current prob variable (0 or 1) -// b = number of the next prob variable (1 or 0) -// *_only = rc_asm_y or _n to include or exclude code marked with them -#define rc_asm_bittree(a, b, first_only, middle_only, last_only) \ - first_only( \ - "movzwl 2(%[probs_base]), %[prob" #a "]\n\t" \ - "mov $2, %[symbol]\n\t" \ - "movzwl 4(%[probs_base]), %[prob" #b "]\n\t" \ - ) \ - middle_only( \ - /* Note the scaling of 4 instead of 2: */ \ - "movzwl (%[probs_base], %q[symbol], 4), %[prob" #b "]\n\t" \ - ) \ - last_only( \ - "add %[symbol], %[symbol]\n\t" \ - ) \ - \ - rc_asm_normalize \ - rc_asm_calc("prob" #a) \ - \ - "cmovae %[t0], %[range]\n\t" \ - \ - first_only( \ - "movzwl 6(%[probs_base]), %[t0]\n\t" \ - "cmovae %[t0], %[prob" #b "]\n\t" \ - ) \ - middle_only( \ - "movzwl 2(%[probs_base], %q[symbol], 4), %[t0]\n\t" \ - "lea (%q[symbol], %q[symbol]), %[symbol]\n\t" \ - "cmovae %[t0], %[prob" #b "]\n\t" \ - ) \ - \ - "lea %c[bit_model_offset](%q[prob" #a "]), %[t0]\n\t" \ - "cmovb %[t1], %[code]\n\t" \ - "mov %[symbol], %[t1]\n\t" \ - "cmovae %[prob" #a "], %[t0]\n\t" \ - \ - first_only( \ - "sbb $-1, %[symbol]\n\t" \ - ) \ - middle_only( \ - "sbb $-1, %[symbol]\n\t" \ - ) \ - last_only( \ - "sbb %[last_sbb], %[symbol]\n\t" \ - ) \ - \ - "shr %[move_bits], %[t0]\n\t" \ - "sub %[t0], %[prob" #a "]\n\t" \ - /* Scaling of 1 instead of 2 because symbol <<= 1. */ \ - "mov %w[prob" #a "], (%[probs_base], %q[t1], 1)\n\t" - -// NOTE: The order of variables in __asm__ can affect speed and code size. -#define rc_asm_bittree_n(probs_base_var, final_add, asm_str) \ -do { \ - uint32_t t0; \ - uint32_t t1; \ - uint32_t t_prob0; \ - uint32_t t_prob1; \ - \ - __asm__( \ - asm_str \ - : \ - [range] "+&r"(rc.range), \ - [code] "+&r"(rc.code), \ - [t0] "=&r"(t0), \ - [t1] "=&r"(t1), \ - [prob0] "=&r"(t_prob0), \ - [prob1] "=&r"(t_prob1), \ - [symbol] "=&r"(symbol), \ - [in_ptr] "+&r"(rc_in_ptr) \ - : \ - [probs_base] "r"(probs_base_var), \ - [last_sbb] "n"(-1 - (final_add)), \ - [top_value] "n"(RC_TOP_VALUE), \ - [shift_bits] "n"(RC_SHIFT_BITS), \ - [bit_model_total_bits] "n"(RC_BIT_MODEL_TOTAL_BITS), \ - [bit_model_offset] "n"(RC_BIT_MODEL_OFFSET), \ - [move_bits] "n"(RC_MOVE_BITS) \ - : \ - "cc", "memory"); \ -} while (0) - - -#if LZMA_RANGE_DECODER_CONFIG & 0x010 -#undef rc_bittree3 -#define rc_bittree3(probs_base_var, final_add) \ - rc_asm_bittree_n(probs_base_var, final_add, \ - rc_asm_bittree(0, 1, rc_asm_y, rc_asm_n, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_n, rc_asm_y) \ - ) - -#undef rc_bittree6 -#define rc_bittree6(probs_base_var, final_add) \ - rc_asm_bittree_n(probs_base_var, final_add, \ - rc_asm_bittree(0, 1, rc_asm_y, rc_asm_n, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_n, rc_asm_y) \ - ) - -#undef rc_bittree8 -#define rc_bittree8(probs_base_var, final_add) \ - rc_asm_bittree_n(probs_base_var, final_add, \ - rc_asm_bittree(0, 1, rc_asm_y, rc_asm_n, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(0, 1, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree(1, 0, rc_asm_n, rc_asm_n, rc_asm_y) \ - ) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x010 - - -// Fixed-sized reverse bittree -// -// This uses the indexing that constructs the final value in symbol directly. -// add = 1, 2, 4, 8 -// dcur = -, 4, 8, 16 -// dnext0 = 4, 8, 16, - -// dnext0 = 6, 12, 24, - -#define rc_asm_bittree_rev(a, b, add, dcur, dnext0, dnext1, \ - first_only, middle_only, last_only) \ - first_only( \ - "movzwl 2(%[probs_base]), %[prob" #a "]\n\t" \ - "xor %[symbol], %[symbol]\n\t" \ - "movzwl 4(%[probs_base]), %[prob" #b "]\n\t" \ - ) \ - middle_only( \ - "movzwl " #dnext0 "(%[probs_base], %q[symbol], 2), " \ - "%[prob" #b "]\n\t" \ - ) \ - \ - rc_asm_normalize \ - rc_asm_calc("prob" #a) \ - \ - "cmovae %[t0], %[range]\n\t" \ - \ - first_only( \ - "movzwl 6(%[probs_base]), %[t0]\n\t" \ - "cmovae %[t0], %[prob" #b "]\n\t" \ - ) \ - middle_only( \ - "movzwl " #dnext1 "(%[probs_base], %q[symbol], 2), %[t0]\n\t" \ - "cmovae %[t0], %[prob" #b "]\n\t" \ - ) \ - \ - "lea " #add "(%q[symbol]), %[t0]\n\t" \ - "cmovb %[t1], %[code]\n\t" \ - middle_only( \ - "mov %[symbol], %[t1]\n\t" \ - ) \ - last_only( \ - "mov %[symbol], %[t1]\n\t" \ - ) \ - "cmovae %[t0], %[symbol]\n\t" \ - "lea %c[bit_model_offset](%q[prob" #a "]), %[t0]\n\t" \ - "cmovae %[prob" #a "], %[t0]\n\t" \ - \ - "shr %[move_bits], %[t0]\n\t" \ - "sub %[t0], %[prob" #a "]\n\t" \ - first_only( \ - "mov %w[prob" #a "], 2(%[probs_base])\n\t" \ - ) \ - middle_only( \ - "mov %w[prob" #a "], " \ - #dcur "(%[probs_base], %q[t1], 2)\n\t" \ - ) \ - last_only( \ - "mov %w[prob" #a "], " \ - #dcur "(%[probs_base], %q[t1], 2)\n\t" \ - ) - -#if LZMA_RANGE_DECODER_CONFIG & 0x020 -#undef rc_bittree_rev4 -#define rc_bittree_rev4(probs_base_var) \ -rc_asm_bittree_n(probs_base_var, 4, \ - rc_asm_bittree_rev(0, 1, 1, -, 4, 6, rc_asm_y, rc_asm_n, rc_asm_n) \ - rc_asm_bittree_rev(1, 0, 2, 4, 8, 12, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree_rev(0, 1, 4, 8, 16, 24, rc_asm_n, rc_asm_y, rc_asm_n) \ - rc_asm_bittree_rev(1, 0, 8, 16, -, -, rc_asm_n, rc_asm_n, rc_asm_y) \ -) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x020 - - -#if LZMA_RANGE_DECODER_CONFIG & 0x040 -#undef rc_bit_add_if_1 -#define rc_bit_add_if_1(probs_base_var, dest_var, value_to_add_if_1) \ -do { \ - uint32_t t0; \ - uint32_t t1; \ - uint32_t t2 = (value_to_add_if_1); \ - uint32_t t_prob; \ - uint32_t t_index; \ - \ - __asm__( \ - "movzwl (%[probs_base], %q[symbol], 2), %[prob]\n\t" \ - "mov %[symbol], %[index]\n\t" \ - \ - "add %[dest], %[t2]\n\t" \ - "add %[symbol], %[symbol]\n\t" \ - \ - rc_asm_normalize \ - rc_asm_calc("prob") \ - \ - "cmovae %[t0], %[range]\n\t" \ - "lea %c[bit_model_offset](%q[prob]), %[t0]\n\t" \ - "cmovb %[t1], %[code]\n\t" \ - "cmovae %[prob], %[t0]\n\t" \ - \ - "cmovae %[t2], %[dest]\n\t" \ - "sbb $-1, %[symbol]\n\t" \ - \ - "sar %[move_bits], %[t0]\n\t" \ - "sub %[t0], %[prob]\n\t" \ - "mov %w[prob], (%[probs_base], %q[index], 2)" \ - : \ - [range] "+&r"(rc.range), \ - [code] "+&r"(rc.code), \ - [t0] "=&r"(t0), \ - [t1] "=&r"(t1), \ - [prob] "=&r"(t_prob), \ - [index] "=&r"(t_index), \ - [symbol] "+&r"(symbol), \ - [t2] "+&r"(t2), \ - [dest] "+&r"(dest_var), \ - [in_ptr] "+&r"(rc_in_ptr) \ - : \ - [probs_base] "r"(probs_base_var), \ - [top_value] "n"(RC_TOP_VALUE), \ - [shift_bits] "n"(RC_SHIFT_BITS), \ - [bit_model_total_bits] "n"(RC_BIT_MODEL_TOTAL_BITS), \ - [bit_model_offset] "n"(RC_BIT_MODEL_OFFSET), \ - [move_bits] "n"(RC_MOVE_BITS) \ - : \ - "cc", "memory"); \ -} while (0) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x040 - - -// Literal decoding uses a normal 8-bit bittree but literal with match byte -// is more complex in picking the probability variable from the correct -// subtree. This doesn't use preloading/prefetching of the next prob because -// there are four choices instead of two. -// -// FIXME? The first iteration starts with symbol = 1 so it could be optimized -// by a tiny amount. -#define rc_asm_matched_literal(nonlast_only) \ - "add %[offset], %[symbol]\n\t" \ - "and %[offset], %[match_bit]\n\t" \ - "add %[match_bit], %[symbol]\n\t" \ - \ - "movzwl (%[probs_base], %q[symbol], 2), %[prob]\n\t" \ - \ - "add %[symbol], %[symbol]\n\t" \ - \ - nonlast_only( \ - "xor %[match_bit], %[offset]\n\t" \ - "add %[match_byte], %[match_byte]\n\t" \ - ) \ - \ - rc_asm_normalize \ - rc_asm_calc("prob") \ - \ - "cmovae %[t0], %[range]\n\t" \ - "lea %c[bit_model_offset](%q[prob]), %[t0]\n\t" \ - "cmovb %[t1], %[code]\n\t" \ - "mov %[symbol], %[t1]\n\t" \ - "cmovae %[prob], %[t0]\n\t" \ - \ - nonlast_only( \ - "cmovae %[match_bit], %[offset]\n\t" \ - "mov %[match_byte], %[match_bit]\n\t" \ - ) \ - \ - "sbb $-1, %[symbol]\n\t" \ - \ - "shr %[move_bits], %[t0]\n\t" \ - /* Undo symbol += match_bit + offset: */ \ - "and $0x1FF, %[symbol]\n\t" \ - "sub %[t0], %[prob]\n\t" \ - \ - /* Scaling of 1 instead of 2 because symbol <<= 1. */ \ - "mov %w[prob], (%[probs_base], %q[t1], 1)\n\t" - - -#if LZMA_RANGE_DECODER_CONFIG & 0x080 -#undef rc_matched_literal -#define rc_matched_literal(probs_base_var, match_byte_value) \ -do { \ - uint32_t t0; \ - uint32_t t1; \ - uint32_t t_prob; \ - uint32_t t_match_byte = (uint32_t)(match_byte_value) << 1; \ - uint32_t t_match_bit = t_match_byte; \ - uint32_t t_offset = 0x100; \ - symbol = 1; \ - \ - __asm__( \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_y) \ - rc_asm_matched_literal(rc_asm_n) \ - : \ - [range] "+&r"(rc.range), \ - [code] "+&r"(rc.code), \ - [t0] "=&r"(t0), \ - [t1] "=&r"(t1), \ - [prob] "=&r"(t_prob), \ - [match_bit] "+&r"(t_match_bit), \ - [symbol] "+&r"(symbol), \ - [match_byte] "+&r"(t_match_byte), \ - [offset] "+&r"(t_offset), \ - [in_ptr] "+&r"(rc_in_ptr) \ - : \ - [probs_base] "r"(probs_base_var), \ - [top_value] "n"(RC_TOP_VALUE), \ - [shift_bits] "n"(RC_SHIFT_BITS), \ - [bit_model_total_bits] "n"(RC_BIT_MODEL_TOTAL_BITS), \ - [bit_model_offset] "n"(RC_BIT_MODEL_OFFSET), \ - [move_bits] "n"(RC_MOVE_BITS) \ - : \ - "cc", "memory"); \ -} while (0) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x080 - - -// Doing the loop in asm instead of C seems to help a little. -#if LZMA_RANGE_DECODER_CONFIG & 0x100 -#undef rc_direct -#define rc_direct(dest_var, count_var) \ -do { \ - uint32_t t0; \ - uint32_t t1; \ - \ - __asm__( \ - "2:\n\t" \ - "add %[dest], %[dest]\n\t" \ - "lea 1(%q[dest]), %[t1]\n\t" \ - \ - rc_asm_normalize \ - \ - "shr $1, %[range]\n\t" \ - "mov %[code], %[t0]\n\t" \ - "sub %[range], %[code]\n\t" \ - "cmovns %[t1], %[dest]\n\t" \ - "cmovs %[t0], %[code]\n\t" \ - "dec %[count]\n\t" \ - "jnz 2b\n\t" \ - : \ - [range] "+&r"(rc.range), \ - [code] "+&r"(rc.code), \ - [t0] "=&r"(t0), \ - [t1] "=&r"(t1), \ - [dest] "+&r"(dest_var), \ - [count] "+&r"(count_var), \ - [in_ptr] "+&r"(rc_in_ptr) \ - : \ - [top_value] "n"(RC_TOP_VALUE), \ - [shift_bits] "n"(RC_SHIFT_BITS) \ - : \ - "cc", "memory"); \ -} while (0) -#endif // LZMA_RANGE_DECODER_CONFIG & 0x100 - -#endif // x86_64 - -#endif diff --git a/software/src/xz/src/liblzma/rangecoder/range_encoder.h b/software/src/xz/src/liblzma/rangecoder/range_encoder.h deleted file mode 100644 index 8f62a47..0000000 --- a/software/src/xz/src/liblzma/rangecoder/range_encoder.h +++ /dev/null @@ -1,349 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_encoder.h -/// \brief Range Encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_ENCODER_H -#define LZMA_RANGE_ENCODER_H - -#include "range_common.h" -#include "price.h" - - -/// Maximum number of symbols that can be put pending into lzma_range_encoder -/// structure between calls to lzma_rc_encode(). For LZMA, 48+5 is enough -/// (match with big distance and length followed by range encoder flush). -#define RC_SYMBOLS_MAX 53 - - -typedef struct { - uint64_t low; - uint64_t cache_size; - uint32_t range; - uint8_t cache; - - /// Number of bytes written out by rc_encode() -> rc_shift_low() - uint64_t out_total; - - /// Number of symbols in the tables - size_t count; - - /// rc_encode()'s position in the tables - size_t pos; - - /// Symbols to encode - enum { - RC_BIT_0, - RC_BIT_1, - RC_DIRECT_0, - RC_DIRECT_1, - RC_FLUSH, - } symbols[RC_SYMBOLS_MAX]; - - /// Probabilities associated with RC_BIT_0 or RC_BIT_1 - probability *probs[RC_SYMBOLS_MAX]; - -} lzma_range_encoder; - - -static inline void -rc_reset(lzma_range_encoder *rc) -{ - rc->low = 0; - rc->cache_size = 1; - rc->range = UINT32_MAX; - rc->cache = 0; - rc->out_total = 0; - rc->count = 0; - rc->pos = 0; -} - - -static inline void -rc_forget(lzma_range_encoder *rc) -{ - // This must not be called when rc_encode() is partially done. - assert(rc->pos == 0); - rc->count = 0; -} - - -static inline void -rc_bit(lzma_range_encoder *rc, probability *prob, uint32_t bit) -{ - rc->symbols[rc->count] = bit; - rc->probs[rc->count] = prob; - ++rc->count; -} - - -static inline void -rc_bittree(lzma_range_encoder *rc, probability *probs, - uint32_t bit_count, uint32_t symbol) -{ - uint32_t model_index = 1; - - do { - const uint32_t bit = (symbol >> --bit_count) & 1; - rc_bit(rc, &probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (bit_count != 0); -} - - -static inline void -rc_bittree_reverse(lzma_range_encoder *rc, probability *probs, - uint32_t bit_count, uint32_t symbol) -{ - uint32_t model_index = 1; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - rc_bit(rc, &probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (--bit_count != 0); -} - - -static inline void -rc_direct(lzma_range_encoder *rc, - uint32_t value, uint32_t bit_count) -{ - do { - rc->symbols[rc->count++] - = RC_DIRECT_0 + ((value >> --bit_count) & 1); - } while (bit_count != 0); -} - - -static inline void -rc_flush(lzma_range_encoder *rc) -{ - for (size_t i = 0; i < 5; ++i) - rc->symbols[rc->count++] = RC_FLUSH; -} - - -static inline bool -rc_shift_low(lzma_range_encoder *rc, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - if ((uint32_t)(rc->low) < (uint32_t)(0xFF000000) - || (uint32_t)(rc->low >> 32) != 0) { - do { - if (*out_pos == out_size) - return true; - - out[*out_pos] = rc->cache + (uint8_t)(rc->low >> 32); - ++*out_pos; - ++rc->out_total; - rc->cache = 0xFF; - - } while (--rc->cache_size != 0); - - rc->cache = (rc->low >> 24) & 0xFF; - } - - ++rc->cache_size; - rc->low = (rc->low & 0x00FFFFFF) << RC_SHIFT_BITS; - - return false; -} - - -// NOTE: The last two arguments are uint64_t instead of size_t because in -// the dummy version these refer to the size of the whole range-encoded -// output stream, not just to the currently available output buffer space. -static inline bool -rc_shift_low_dummy(uint64_t *low, uint64_t *cache_size, uint8_t *cache, - uint64_t *out_pos, uint64_t out_size) -{ - if ((uint32_t)(*low) < (uint32_t)(0xFF000000) - || (uint32_t)(*low >> 32) != 0) { - do { - if (*out_pos == out_size) - return true; - - ++*out_pos; - *cache = 0xFF; - - } while (--*cache_size != 0); - - *cache = (*low >> 24) & 0xFF; - } - - ++*cache_size; - *low = (*low & 0x00FFFFFF) << RC_SHIFT_BITS; - - return false; -} - - -static inline bool -rc_encode(lzma_range_encoder *rc, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - assert(rc->count <= RC_SYMBOLS_MAX); - - while (rc->pos < rc->count) { - // Normalize - if (rc->range < RC_TOP_VALUE) { - if (rc_shift_low(rc, out, out_pos, out_size)) - return true; - - rc->range <<= RC_SHIFT_BITS; - } - - // Encode a bit - switch (rc->symbols[rc->pos]) { - case RC_BIT_0: { - probability prob = *rc->probs[rc->pos]; - rc->range = (rc->range >> RC_BIT_MODEL_TOTAL_BITS) - * prob; - prob += (RC_BIT_MODEL_TOTAL - prob) >> RC_MOVE_BITS; - *rc->probs[rc->pos] = prob; - break; - } - - case RC_BIT_1: { - probability prob = *rc->probs[rc->pos]; - const uint32_t bound = prob * (rc->range - >> RC_BIT_MODEL_TOTAL_BITS); - rc->low += bound; - rc->range -= bound; - prob -= prob >> RC_MOVE_BITS; - *rc->probs[rc->pos] = prob; - break; - } - - case RC_DIRECT_0: - rc->range >>= 1; - break; - - case RC_DIRECT_1: - rc->range >>= 1; - rc->low += rc->range; - break; - - case RC_FLUSH: - // Prevent further normalizations. - rc->range = UINT32_MAX; - - // Flush the last five bytes (see rc_flush()). - do { - if (rc_shift_low(rc, out, out_pos, out_size)) - return true; - } while (++rc->pos < rc->count); - - // Reset the range encoder so we are ready to continue - // encoding if we weren't finishing the stream. - rc_reset(rc); - return false; - - default: - assert(0); - break; - } - - ++rc->pos; - } - - rc->count = 0; - rc->pos = 0; - - return false; -} - - -static inline bool -rc_encode_dummy(const lzma_range_encoder *rc, uint64_t out_limit) -{ - assert(rc->count <= RC_SYMBOLS_MAX); - - uint64_t low = rc->low; - uint64_t cache_size = rc->cache_size; - uint32_t range = rc->range; - uint8_t cache = rc->cache; - uint64_t out_pos = rc->out_total; - - size_t pos = rc->pos; - - while (true) { - // Normalize - if (range < RC_TOP_VALUE) { - if (rc_shift_low_dummy(&low, &cache_size, &cache, - &out_pos, out_limit)) - return true; - - range <<= RC_SHIFT_BITS; - } - - // This check is here because the normalization above must - // be done before flushing the last bytes. - if (pos == rc->count) - break; - - // Encode a bit - switch (rc->symbols[pos]) { - case RC_BIT_0: { - probability prob = *rc->probs[pos]; - range = (range >> RC_BIT_MODEL_TOTAL_BITS) - * prob; - break; - } - - case RC_BIT_1: { - probability prob = *rc->probs[pos]; - const uint32_t bound = prob * (range - >> RC_BIT_MODEL_TOTAL_BITS); - low += bound; - range -= bound; - break; - } - - case RC_DIRECT_0: - range >>= 1; - break; - - case RC_DIRECT_1: - range >>= 1; - low += range; - break; - - case RC_FLUSH: - default: - assert(0); - break; - } - - ++pos; - } - - // Flush the last bytes. This isn't in rc->symbols[] so we do - // it after the above loop to take into account the size of - // the flushing that will be done at the end of the stream. - for (pos = 0; pos < 5; ++pos) { - if (rc_shift_low_dummy(&low, &cache_size, - &cache, &out_pos, out_limit)) - return true; - } - - return false; -} - - -static inline uint64_t -rc_pending(const lzma_range_encoder *rc) -{ - return rc->cache_size + 5 - 1; -} - -#endif diff --git a/software/src/xz/src/liblzma/simple/Makefile.inc b/software/src/xz/src/liblzma/simple/Makefile.inc deleted file mode 100644 index f42ad1b..0000000 --- a/software/src/xz/src/liblzma/simple/Makefile.inc +++ /dev/null @@ -1,51 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -liblzma_la_SOURCES += \ - simple/simple_coder.c \ - simple/simple_coder.h \ - simple/simple_private.h - -if COND_ENCODER_SIMPLE -liblzma_la_SOURCES += \ - simple/simple_encoder.c \ - simple/simple_encoder.h -endif - -if COND_DECODER_SIMPLE -liblzma_la_SOURCES += \ - simple/simple_decoder.c \ - simple/simple_decoder.h -endif - -if COND_FILTER_X86 -liblzma_la_SOURCES += simple/x86.c -endif - -if COND_FILTER_POWERPC -liblzma_la_SOURCES += simple/powerpc.c -endif - -if COND_FILTER_IA64 -liblzma_la_SOURCES += simple/ia64.c -endif - -if COND_FILTER_ARM -liblzma_la_SOURCES += simple/arm.c -endif - -if COND_FILTER_ARMTHUMB -liblzma_la_SOURCES += simple/armthumb.c -endif - -if COND_FILTER_ARM64 -liblzma_la_SOURCES += simple/arm64.c -endif - -if COND_FILTER_SPARC -liblzma_la_SOURCES += simple/sparc.c -endif - -if COND_FILTER_RISCV -liblzma_la_SOURCES += simple/riscv.c -endif diff --git a/software/src/xz/src/liblzma/simple/arm.c b/software/src/xz/src/liblzma/simple/arm.c deleted file mode 100644 index f9d9c08..0000000 --- a/software/src/xz/src/liblzma/simple/arm.c +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file arm.c -/// \brief Filter for ARM binaries -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -arm_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - size &= ~(size_t)3; - - size_t i; - for (i = 0; i < size; i += 4) { - if (buffer[i + 3] == 0xEB) { - uint32_t src = ((uint32_t)(buffer[i + 2]) << 16) - | ((uint32_t)(buffer[i + 1]) << 8) - | (uint32_t)(buffer[i + 0]); - src <<= 2; - - uint32_t dest; - if (is_encoder) - dest = now_pos + (uint32_t)(i) + 8 + src; - else - dest = src - (now_pos + (uint32_t)(i) + 8); - - dest >>= 2; - buffer[i + 2] = (dest >> 16); - buffer[i + 1] = (dest >> 8); - buffer[i + 0] = dest; - } - } - - return i; -} - - -static lzma_ret -arm_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &arm_code, 0, 4, 4, is_encoder); -} - - -#ifdef HAVE_ENCODER_ARM -extern lzma_ret -lzma_simple_arm_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return arm_coder_init(next, allocator, filters, true); -} -#endif - - -#ifdef HAVE_DECODER_ARM -extern lzma_ret -lzma_simple_arm_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return arm_coder_init(next, allocator, filters, false); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/arm64.c b/software/src/xz/src/liblzma/simple/arm64.c deleted file mode 100644 index 2ec10d9..0000000 --- a/software/src/xz/src/liblzma/simple/arm64.c +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file arm64.c -/// \brief Filter for ARM64 binaries -/// -/// This converts ARM64 relative addresses in the BL and ADRP immediates -/// to absolute values to increase redundancy of ARM64 code. -/// -/// Converting B or ADR instructions was also tested but it's not useful. -/// A majority of the jumps for the B instruction are very small (+/- 0xFF). -/// These are typical for loops and if-statements. Encoding them to their -/// absolute address reduces redundancy since many of the small relative -/// jump values are repeated, but very few of the absolute addresses are. -// -// Authors: Lasse Collin -// Jia Tan -// Igor Pavlov -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -arm64_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - size &= ~(size_t)3; - - size_t i; - - // Clang 14.0.6 on x86-64 makes this four times bigger and 40 % slower - // with auto-vectorization that is enabled by default with -O2. - // Such vectorization bloat happens with -O2 when targeting ARM64 too - // but performance hasn't been tested. -#ifdef __clang__ -# pragma clang loop vectorize(disable) -#endif - for (i = 0; i < size; i += 4) { - uint32_t pc = (uint32_t)(now_pos + i); - uint32_t instr = read32le(buffer + i); - - if ((instr >> 26) == 0x25) { - // BL instruction: - // The full 26-bit immediate is converted. - // The range is +/-128 MiB. - // - // Using the full range helps quite a lot with - // big executables. Smaller range would reduce false - // positives in non-code sections of the input though - // so this is a compromise that slightly favors big - // files. With the full range, only six bits of the 32 - // need to match to trigger a conversion. - const uint32_t src = instr; - instr = 0x94000000; - - pc >>= 2; - if (!is_encoder) - pc = 0U - pc; - - instr |= (src + pc) & 0x03FFFFFF; - write32le(buffer + i, instr); - - } else if ((instr & 0x9F000000) == 0x90000000) { - // ADRP instruction: - // Only values in the range +/-512 MiB are converted. - // - // Using less than the full +/-4 GiB range reduces - // false positives on non-code sections of the input - // while being excellent for executables up to 512 MiB. - // The positive effect of ADRP conversion is smaller - // than that of BL but it also doesn't hurt so much in - // non-code sections of input because, with +/-512 MiB - // range, nine bits of 32 need to match to trigger a - // conversion (two 10-bit match choices = 9 bits). - const uint32_t src = ((instr >> 29) & 3) - | ((instr >> 3) & 0x001FFFFC); - - // With the addition only one branch is needed to - // check the +/- range. This is usually false when - // processing ARM64 code so branch prediction will - // handle it well in terms of performance. - // - //if ((src & 0x001E0000) != 0 - // && (src & 0x001E0000) != 0x001E0000) - if ((src + 0x00020000) & 0x001C0000) - continue; - - instr &= 0x9000001F; - - pc >>= 12; - if (!is_encoder) - pc = 0U - pc; - - const uint32_t dest = src + pc; - instr |= (dest & 3) << 29; - instr |= (dest & 0x0003FFFC) << 3; - instr |= (0U - (dest & 0x00020000)) & 0x00E00000; - write32le(buffer + i, instr); - } - } - - return i; -} - - -static lzma_ret -arm64_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &arm64_code, 0, 4, 4, is_encoder); -} - - -#ifdef HAVE_ENCODER_ARM64 -extern lzma_ret -lzma_simple_arm64_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return arm64_coder_init(next, allocator, filters, true); -} - - -extern LZMA_API(size_t) -lzma_bcj_arm64_encode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - // start_offset must be a multiple of four. - start_offset &= ~UINT32_C(3); - return arm64_code(NULL, start_offset, true, buf, size); -} -#endif - - -#ifdef HAVE_DECODER_ARM64 -extern lzma_ret -lzma_simple_arm64_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return arm64_coder_init(next, allocator, filters, false); -} - - -extern LZMA_API(size_t) -lzma_bcj_arm64_decode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - // start_offset must be a multiple of four. - start_offset &= ~UINT32_C(3); - return arm64_code(NULL, start_offset, false, buf, size); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/armthumb.c b/software/src/xz/src/liblzma/simple/armthumb.c deleted file mode 100644 index 368b51c..0000000 --- a/software/src/xz/src/liblzma/simple/armthumb.c +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file armthumb.c -/// \brief Filter for ARM-Thumb binaries -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -armthumb_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - if (size < 4) - return 0; - - size -= 4; - - size_t i; - for (i = 0; i <= size; i += 2) { - if ((buffer[i + 1] & 0xF8) == 0xF0 - && (buffer[i + 3] & 0xF8) == 0xF8) { - uint32_t src = (((uint32_t)(buffer[i + 1]) & 7) << 19) - | ((uint32_t)(buffer[i + 0]) << 11) - | (((uint32_t)(buffer[i + 3]) & 7) << 8) - | (uint32_t)(buffer[i + 2]); - - src <<= 1; - - uint32_t dest; - if (is_encoder) - dest = now_pos + (uint32_t)(i) + 4 + src; - else - dest = src - (now_pos + (uint32_t)(i) + 4); - - dest >>= 1; - buffer[i + 1] = 0xF0 | ((dest >> 19) & 0x7); - buffer[i + 0] = (dest >> 11); - buffer[i + 3] = 0xF8 | ((dest >> 8) & 0x7); - buffer[i + 2] = (dest); - i += 2; - } - } - - return i; -} - - -static lzma_ret -armthumb_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &armthumb_code, 0, 4, 2, is_encoder); -} - - -#ifdef HAVE_ENCODER_ARMTHUMB -extern lzma_ret -lzma_simple_armthumb_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return armthumb_coder_init(next, allocator, filters, true); -} -#endif - - -#ifdef HAVE_DECODER_ARMTHUMB -extern lzma_ret -lzma_simple_armthumb_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return armthumb_coder_init(next, allocator, filters, false); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/ia64.c b/software/src/xz/src/liblzma/simple/ia64.c deleted file mode 100644 index 2a4aaeb..0000000 --- a/software/src/xz/src/liblzma/simple/ia64.c +++ /dev/null @@ -1,117 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file ia64.c -/// \brief Filter for IA64 (Itanium) binaries -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -ia64_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - static const uint32_t BRANCH_TABLE[32] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 6, 6, 0, 0, 7, 7, - 4, 4, 0, 0, 4, 4, 0, 0 - }; - - size &= ~(size_t)15; - - size_t i; - for (i = 0; i < size; i += 16) { - const uint32_t instr_template = buffer[i] & 0x1F; - const uint32_t mask = BRANCH_TABLE[instr_template]; - uint32_t bit_pos = 5; - - for (size_t slot = 0; slot < 3; ++slot, bit_pos += 41) { - if (((mask >> slot) & 1) == 0) - continue; - - const size_t byte_pos = (bit_pos >> 3); - const uint32_t bit_res = bit_pos & 0x7; - uint64_t instruction = 0; - - for (size_t j = 0; j < 6; ++j) - instruction += (uint64_t)( - buffer[i + j + byte_pos]) - << (8 * j); - - uint64_t inst_norm = instruction >> bit_res; - - if (((inst_norm >> 37) & 0xF) == 0x5 - && ((inst_norm >> 9) & 0x7) == 0 - /* && (inst_norm & 0x3F)== 0 */ - ) { - uint32_t src = (uint32_t)( - (inst_norm >> 13) & 0xFFFFF); - src |= ((inst_norm >> 36) & 1) << 20; - - src <<= 4; - - uint32_t dest; - if (is_encoder) - dest = now_pos + (uint32_t)(i) + src; - else - dest = src - (now_pos + (uint32_t)(i)); - - dest >>= 4; - - inst_norm &= ~((uint64_t)(0x8FFFFF) << 13); - inst_norm |= (uint64_t)(dest & 0xFFFFF) << 13; - inst_norm |= (uint64_t)(dest & 0x100000) - << (36 - 20); - - instruction &= (1U << bit_res) - 1; - instruction |= (inst_norm << bit_res); - - for (size_t j = 0; j < 6; j++) - buffer[i + j + byte_pos] = (uint8_t)( - instruction - >> (8 * j)); - } - } - } - - return i; -} - - -static lzma_ret -ia64_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &ia64_code, 0, 16, 16, is_encoder); -} - - -#ifdef HAVE_ENCODER_IA64 -extern lzma_ret -lzma_simple_ia64_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return ia64_coder_init(next, allocator, filters, true); -} -#endif - - -#ifdef HAVE_DECODER_IA64 -extern lzma_ret -lzma_simple_ia64_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return ia64_coder_init(next, allocator, filters, false); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/powerpc.c b/software/src/xz/src/liblzma/simple/powerpc.c deleted file mode 100644 index ea47d14..0000000 --- a/software/src/xz/src/liblzma/simple/powerpc.c +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file powerpc.c -/// \brief Filter for PowerPC (big endian) binaries -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -powerpc_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - size &= ~(size_t)3; - - size_t i; - for (i = 0; i < size; i += 4) { - // PowerPC branch 6(48) 24(Offset) 1(Abs) 1(Link) - if ((buffer[i] >> 2) == 0x12 - && ((buffer[i + 3] & 3) == 1)) { - - const uint32_t src - = (((uint32_t)(buffer[i + 0]) & 3) << 24) - | ((uint32_t)(buffer[i + 1]) << 16) - | ((uint32_t)(buffer[i + 2]) << 8) - | ((uint32_t)(buffer[i + 3]) & ~UINT32_C(3)); - - uint32_t dest; - if (is_encoder) - dest = now_pos + (uint32_t)(i) + src; - else - dest = src - (now_pos + (uint32_t)(i)); - - buffer[i + 0] = 0x48 | ((dest >> 24) & 0x03); - buffer[i + 1] = (dest >> 16); - buffer[i + 2] = (dest >> 8); - buffer[i + 3] &= 0x03; - buffer[i + 3] |= dest; - } - } - - return i; -} - - -static lzma_ret -powerpc_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &powerpc_code, 0, 4, 4, is_encoder); -} - - -#ifdef HAVE_ENCODER_POWERPC -extern lzma_ret -lzma_simple_powerpc_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return powerpc_coder_init(next, allocator, filters, true); -} -#endif - - -#ifdef HAVE_DECODER_POWERPC -extern lzma_ret -lzma_simple_powerpc_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return powerpc_coder_init(next, allocator, filters, false); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/riscv.c b/software/src/xz/src/liblzma/simple/riscv.c deleted file mode 100644 index bc97ebd..0000000 --- a/software/src/xz/src/liblzma/simple/riscv.c +++ /dev/null @@ -1,773 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file riscv.c -/// \brief Filter for 32-bit/64-bit little/big endian RISC-V binaries -/// -/// This converts program counter relative addresses in function calls -/// (JAL, AUIPC+JALR), address calculation of functions and global -/// variables (AUIPC+ADDI), loads (AUIPC+load), and stores (AUIPC+store). -/// -/// For AUIPC+inst2 pairs, the paired instruction checking is fairly relaxed. -/// The paired instruction opcode must only have its lowest two bits set, -/// meaning it will convert any paired instruction that is not a 16-bit -/// compressed instruction. This was shown to be enough to keep the number -/// of false matches low while improving code size and speed. -// -// Authors: Lasse Collin -// Jia Tan -// -// Special thanks: -// -// - Chien Wong provided a few early versions of RISC-V -// filter variants along with test files and benchmark results. -// -// - Igor Pavlov helped a lot in the filter design, getting it both -// faster and smaller. The implementation here is still independently -// written, not based on LZMA SDK. -// -/////////////////////////////////////////////////////////////////////////////// - -/* - -RISC-V filtering -================ - - RV32I and RV64I, possibly combined with extensions C, Zfh, F, D, - and Q, are identical enough that the same filter works for both. - - The instruction encoding is always little endian, even on systems - with big endian data access. Thus the same filter works for both - endiannesses. - - The following instructions have program counter relative - (pc-relative) behavior: - -JAL ---- - - JAL is used for function calls (including tail calls) and - unconditional jumps within functions. Jumps within functions - aren't useful to filter because the absolute addresses often - appear only once or at most a few times. Tail calls and jumps - within functions look the same to a simple filter so neither - are filtered, that is, JAL x0 is ignored (the ABI name of the - register x0 is "zero"). - - Almost all calls store the return address to register x1 (ra) - or x5 (t0). To reduce false matches when the filter is applied - to non-code data, only the JAL instructions that use x1 or x5 - are converted. JAL has pc-relative range of +/-1 MiB so longer - calls and jumps need another method (AUIPC+JALR). - -C.J and C.JAL -------------- - - C.J and C.JAL have pc-relative range of +/-2 KiB. - - C.J is for tail calls and jumps within functions and isn't - filtered for the reasons mentioned for JAL x0. - - C.JAL is an RV32C-only instruction. Its encoding overlaps with - RV64C-only C.ADDIW which is a common instruction. So if filtering - C.JAL was useful (it wasn't tested) then a separate filter would - be needed for RV32 and RV64. Also, false positives would be a - significant problem when the filter is applied to non-code data - because C.JAL needs only five bits to match. Thus, this filter - doesn't modify C.JAL instructions. - -BEQ, BNE, BLT, BGE, BLTU, BGEU, C.BEQZ, and C.BNEZ --------------------------------------------------- - - These are conditional branches with pc-relative range - of +/-4 KiB (+/-256 B for C.*). The absolute addresses often - appear only once and very short distances are the most common, - so filtering these instructions would make compression worse. - -AUIPC with rd != x0 -------------------- - - AUIPC is paired with a second instruction (inst2) to do - pc-relative jumps, calls, loads, stores, and for taking - an address of a symbol. AUIPC has a 20-bit immediate and - the possible inst2 choices have a 12-bit immediate. - - AUIPC stores pc + 20-bit signed immediate to a register. - The immediate encodes a multiple of 4 KiB so AUIPC itself - has a pc-relative range of +/-2 GiB. AUIPC does *NOT* set - the lowest 12 bits of the result to zero! This means that - the 12-bit immediate in inst2 cannot just include the lowest - 12 bits of the absolute address as is; the immediate has to - compensate for the lowest 12 bits that AUIPC copies from the - program counter. This means that a good filter has to convert - not only AUIPC but also the paired inst2. - - A strict filter would focus on filtering the following - AUIPC+inst2 pairs: - - - AUIPC+JALR: Function calls, including tail calls. - - - AUIPC+ADDI: Calculating the address of a function - or a global variable. - - - AUIPC+load/store from the base instruction sets - (RV32I, RV64I) or from the floating point extensions - Zfh, F, D, and Q: - * RV32I: LB, LH, LW, LBU, LHU, SB, SH, SW - * RV64I has also: LD, LWU, SD - * Zfh: FLH, FSH - * F: FLW, FSW - * D: FLD, FSD - * Q: FLQ, FSQ - - NOTE: AUIPC+inst2 can only be a pair if AUIPC's rd specifies - the same register as inst2's rs1. - - Instead of strictly accepting only the above instructions as inst2, - this filter uses a much simpler condition: the lowest two bits of - inst2 must be set, that is, inst2 must not be a 16-bit compressed - instruction. So this will accept all 32-bit and possible future - extended instructions as a pair to AUIPC if the bits in AUIPC's - rd [11:7] match the bits [19:15] in inst2 (the bits that I-type and - S-type instructions use for rs1). Testing showed that this relaxed - condition for inst2 did not consistently or significantly affect - compression ratio but it reduced code size and improved speed. - - Additionally, the paired instruction is always treated as an I-type - instruction. The S-type instructions used by stores (SB, SH, SW, - etc.) place the lowest 5 bits of the immediate in a different - location than I-type instructions. AUIPC+store pairs are less - common than other pairs, and testing showed that the extra - code required to handle S-type instructions was not worth the - compression ratio gained. - - AUIPC+inst2 don't necessarily appear sequentially next to each - other although very often they do. Especially AUIPC+JALR are - sequential as that may allow instruction fusion in processors - (and perhaps help branch prediction as a fused AUIPC+JALR is - a direct branch while JALR alone is an indirect branch). - - Clang 16 can generate code where AUIPC+inst2 is split: - - - AUIPC is outside a loop and inst2 (load/store) is inside - the loop. This way the AUIPC instruction needs to be - executed only once. - - - Load-modify-store may have AUIPC for the load and the same - AUIPC-result is used for the store too. This may get combined - with AUIPC being outside the loop. - - - AUIPC is before a conditional branch and inst2 is hundreds - of bytes away at the branch target. - - - Inner and outer pair: - - auipc a1,0x2f - auipc a2,0x3d - ld a2,-500(a2) - addi a1,a1,-233 - - - Many split pairs with an untaken conditional branch between: - - auipc s9,0x1613 # Pair 1 - auipc s4,0x1613 # Pair 2 - auipc s6,0x1613 # Pair 3 - auipc s10,0x1613 # Pair 4 - beqz a5,a3baae - ld a0,0(a6) - ld a6,246(s9) # Pair 1 - ld a1,250(s4) # Pair 2 - ld a3,254(s6) # Pair 3 - ld a4,258(s10) # Pair 4 - - It's not possible to find all split pairs in a filter like this. - At least in 2024, simple sequential pairs are 99 % of AUIPC uses - so filtering only such pairs gives good results and makes the - filter simpler. However, it's possible that future compilers will - produce different code where sequential pairs aren't as common. - - This filter doesn't convert AUIPC instructions alone because: - - (1) The conversion would be off-by-one (or off-by-4096) half the - time because the lowest 12 bits from inst2 (inst2_imm12) - aren't known. We only know that the absolute address is - pc + AUIPC_imm20 + [-2048, +2047] but there is no way to - know the exact 4096-byte multiple (or 4096 * n + 2048): - there are always two possibilities because AUIPC copies - the 12 lowest bits from pc instead of zeroing them. - - NOTE: The sign-extension of inst2_imm12 adds a tiny bit - of extra complexity to AUIPC math in general but it's not - the reason for this problem. The sign-extension only changes - the relative position of the pc-relative 4096-byte window. - - (2) Matching AUIPC instruction alone requires only seven bits. - When the filter is applied to non-code data, that leads - to many false positives which make compression worse. - As long as most AUIPC+inst2 pairs appear as two consecutive - instructions, converting only such pairs gives better results. - - In assembly, AUIPC+inst2 tend to look like this: - - # Call: - auipc ra, 0x12345 - jalr ra, -42(ra) - - # Tail call: - auipc t1, 0x12345 - jalr zero, -42(t1) - - # Getting the absolute address: - auipc a0, 0x12345 - addi a0, a0, -42 - - # rd of inst2 isn't necessarily the same as rs1 even - # in cases where there is no reason to preserve rs1. - auipc a0, 0x12345 - addi a1, a0, -42 - - As of 2024, 16-bit instructions from the C extension don't - appear as inst2. The RISC-V psABI doesn't list AUIPC+C.* as - a linker relaxation type explicitly but it's not disallowed - either. Usefulness is limited as most of the time the lowest - 12 bits won't fit in a C instruction. This filter doesn't - support AUIPC+C.* combinations because this makes the filter - simpler, there are no test files, and it hopefully will never - be needed anyway. - - (Compare AUIPC to ARM64 where ADRP does set the lowest 12 bits - to zero. The paired instruction has the lowest 12 bits of the - absolute address as is in a zero-extended immediate. Thus the - ARM64 filter doesn't need to care about the instructions that - are paired with ADRP. An off-by-4096 issue can still occur if - the code section isn't aligned with the filter's start offset. - It's not a problem with standalone ELF files but Windows PE - files need start_offset=3072 for best results. Also, a .tar - stores files with 512-byte alignment so most of the time it - won't be the best for ARM64.) - -AUIPC with rd == x0 -------------------- - - AUIPC instructions with rd=x0 are reserved for HINTs in the base - instruction set. Such AUIPC instructions are never filtered. - - As of January 2024, it seems likely that AUIPC with rd=x0 will - be used for landing pads (pseudoinstruction LPAD). LPAD is used - to mark valid targets for indirect jumps (for JALR), for example, - beginnings of functions. The 20-bit immediate in LPAD instruction - is a label, not a pc-relative address. Thus it would be - counterproductive to convert AUIPC instructions with rd=x0. - - Often the next instruction after LPAD won't have rs1=x0 and thus - the filtering would be skipped for that reason alone. However, - it's not good to rely on this. For example, consider a function - that begins like this: - - int foo(int i) - { - if (i <= 234) { - ... - } - - A compiler may generate something like this: - - lpad 0x54321 - li a5, 234 - bgt a0, a5, .L2 - - Converting the pseudoinstructions to raw instructions: - - auipc x0, 0x54321 - addi x15, x0, 234 - blt x15, x10, .L2 - - In this case the filter would undesirably convert the AUIPC+ADDI - pair if the filter didn't explicitly skip AUIPC instructions - that have rd=x0. - -*/ - - -#include "simple_private.h" - - -// This checks two conditions at once: -// - AUIPC rd == inst2 rs1. -// - inst2 opcode has the lowest two bits set. -// -// The 8 bit left shift aligns the rd of AUIPC with the rs1 of inst2. -// By XORing the registers, any non-zero value in those bits indicates the -// registers are not equal and thus not an AUIPC pair. Subtracting 3 from -// inst2 will zero out the first two opcode bits only when they are set. -// The mask tests if any of the register or opcode bits are set (and thus -// not an AUIPC pair). -// -// Alternative expression: (((((auipc) << 8) ^ (inst2)) & 0xF8003) != 3) -#define NOT_AUIPC_PAIR(auipc, inst2) \ - ((((auipc) << 8) ^ ((inst2) - 3)) & 0xF8003) - -// This macro checks multiple conditions: -// (1) AUIPC rd [11:7] == x2 (special rd value). -// (2) AUIPC bits 12 and 13 set (the lowest two opcode bits of packed inst2). -// (3) inst2_rs1 doesn't equal x0 or x2 because the opposite -// conversion is only done when -// auipc_rd != x0 && -// auipc_rd != x2 && -// auipc_rd == inst2_rs1. -// -// The left-hand side takes care of (1) and (2). -// (a) The lowest 7 bits are already known to be AUIPC so subtracting 0x17 -// makes those bits zeros. -// (b) If AUIPC rd equals x2, subtracting 0x100 makes bits [11:7] zeros. -// If rd doesn't equal x2, then there will be at least one non-zero bit -// and the next step (c) is irrelevant. -// (c) If the lowest two opcode bits of the packed inst2 are set in [13:12], -// then subtracting 0x3000 will make those bits zeros. Otherwise there -// will be at least one non-zero bit. -// -// The shift by 18 removes the high bits from the final '>=' comparison and -// ensures that any non-zero result will be larger than any possible result -// from the right-hand side of the comparison. The cast ensures that the -// left-hand side didn't get promoted to a larger type than uint32_t. -// -// On the right-hand side, inst2_rs1 & 0x1D will be non-zero as long as -// inst2_rs1 is not x0 or x2. -// -// The final '>=' comparison will make the expression true if: -// - The subtraction caused any bits to be set (special AUIPC rd value not -// used or inst2 opcode bits not set). (non-zero >= non-zero or 0) -// - The subtraction did not cause any bits to be set but inst2_rs1 was -// x0 or x2. (0 >= 0) -#define NOT_SPECIAL_AUIPC(auipc, inst2_rs1) \ - ((uint32_t)(((auipc) - 0x3117) << 18) >= ((inst2_rs1) & 0x1D)) - - -// The encode and decode functions are split for this filter because of the -// AUIPC+inst2 filtering. This filter design allows a decoder-only -// implementation to be smaller than alternative designs. - -#ifdef HAVE_ENCODER_RISCV -static size_t -riscv_encode(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, - bool is_encoder lzma_attribute((__unused__)), - uint8_t *buffer, size_t size) -{ - // Avoid using i + 8 <= size in the loop condition. - // - // NOTE: If there is a JAL in the last six bytes of the stream, it - // won't be converted. This is intentional to keep the code simpler. - if (size < 8) - return 0; - - size -= 8; - - size_t i; - - // The loop is advanced by 2 bytes every iteration since the - // instruction stream may include 16-bit instructions (C extension). - for (i = 0; i <= size; i += 2) { - uint32_t inst = buffer[i]; - - if (inst == 0xEF) { - // JAL - const uint32_t b1 = buffer[i + 1]; - - // Only filter rd=x1(ra) and rd=x5(t0). - if ((b1 & 0x0D) != 0) - continue; - - // The 20-bit immediate is in four pieces. - // The encoder stores it in big endian form - // since it improves compression slightly. - const uint32_t b2 = buffer[i + 2]; - const uint32_t b3 = buffer[i + 3]; - const uint32_t pc = now_pos + (uint32_t)i; - -// The following chart shows the highest three bytes of JAL, focusing on -// the 20-bit immediate field [31:12]. The first row of numbers is the -// bit position in a 32-bit little endian instruction. The second row of -// numbers shows the order of the immediate field in a J-type instruction. -// The last row is the bit number in each byte. -// -// To determine the amount to shift each bit, subtract the value in -// the last row from the value in the second last row. If the number -// is positive, shift left. If negative, shift right. -// -// For example, at the rightmost side of the chart, the bit 4 in b1 is -// the bit 12 of the address. Thus that bit needs to be shifted left -// by 12 - 4 = 8 bits to put it in the right place in the addr variable. -// -// NOTE: The immediate of a J-type instruction holds bits [20:1] of -// the address. The bit [0] is always 0 and not part of the immediate. -// -// | b3 | b2 | b1 | -// | 31 30 29 28 27 26 25 24 | 23 22 21 20 19 18 17 16 | 15 14 13 12 x x x x | -// | 20 10 9 8 7 6 5 4 | 3 2 1 11 19 18 17 16 | 15 14 13 12 x x x x | -// | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | 7 6 5 4 x x x x | - - uint32_t addr = ((b1 & 0xF0) << 8) - | ((b2 & 0x0F) << 16) - | ((b2 & 0x10) << 7) - | ((b2 & 0xE0) >> 4) - | ((b3 & 0x7F) << 4) - | ((b3 & 0x80) << 13); - - addr += pc; - - buffer[i + 1] = (uint8_t)((b1 & 0x0F) - | ((addr >> 13) & 0xF0)); - - buffer[i + 2] = (uint8_t)(addr >> 9); - buffer[i + 3] = (uint8_t)(addr >> 1); - - // The "-2" is included because the for-loop will - // always increment by 2. In this case, we want to - // skip an extra 2 bytes since we used 4 bytes - // of input. - i += 4 - 2; - - } else if ((inst & 0x7F) == 0x17) { - // AUIPC - inst |= (uint32_t)buffer[i + 1] << 8; - inst |= (uint32_t)buffer[i + 2] << 16; - inst |= (uint32_t)buffer[i + 3] << 24; - - // Branch based on AUIPC's rd. The bitmask test does - // the same thing as this: - // - // const uint32_t auipc_rd = (inst >> 7) & 0x1F; - // if (auipc_rd != 0 && auipc_rd != 2) { - if (inst & 0xE80) { - // AUIPC's rd doesn't equal x0 or x2. - - // Check if AUIPC+inst2 are a pair. - uint32_t inst2 = read32le(buffer + i + 4); - - if (NOT_AUIPC_PAIR(inst, inst2)) { - // The NOT_AUIPC_PAIR macro allows - // a false AUIPC+AUIPC pair if the - // bits [19:15] (where rs1 would be) - // in the second AUIPC match the rd - // of the first AUIPC. - // - // We must skip enough forward so - // that the first two bytes of the - // second AUIPC cannot get converted. - // Such a conversion could make the - // current pair become a valid pair - // which would desync the decoder. - // - // Skipping six bytes is enough even - // though the above condition looks - // at the lowest four bits of the - // buffer[i + 6] too. This is safe - // because this filter never changes - // those bits if a conversion at - // that position is done. - i += 6 - 2; - continue; - } - - // Convert AUIPC+inst2 to a special format: - // - // - The lowest 7 bits [6:0] retain the - // AUIPC opcode. - // - // - The rd [11:7] is set to x2(sp). x2 is - // used as the stack pointer so AUIPC with - // rd=x2 should be very rare in real-world - // executables. - // - // - The remaining 20 bits [31:12] (that - // normally hold the pc-relative immediate) - // are used to store the lowest 20 bits of - // inst2. That is, the 12-bit immediate of - // inst2 is not included. - // - // - The location of the original inst2 is - // used to store the 32-bit absolute - // address in big endian format. Compared - // to the 20+12-bit split encoding, this - // results in a longer uninterrupted - // sequence of identical common bytes - // when the same address is referred - // with different instruction pairs - // (like AUIPC+LD vs. AUIPC+ADDI) or - // when the occurrences of the same - // pair use different registers. When - // referring to adjacent memory locations - // (like function calls that go via the - // ELF PLT), in big endian order only the - // last 1-2 bytes differ; in little endian - // the differing 1-2 bytes would be in the - // middle of the 8-byte sequence. - // - // When reversing the transformation, the - // original rd of AUIPC can be restored - // from inst2's rs1 as they are required to - // be the same. - - // Arithmetic right shift makes sign extension - // trivial but (1) it's implementation-defined - // behavior (C99/C11/C23 6.5.7-p5) and so is - // (2) casting unsigned to signed (6.3.1.3-p3). - // - // One can check for (1) with - // - // if ((-1 >> 1) == -1) ... - // - // but (2) has to be checked from the - // compiler docs. GCC promises that (1) - // and (2) behave in the common expected - // way and thus - // - // addr += (uint32_t)( - // (int32_t)inst2 >> 20); - // - // does the same as the code below. But since - // the 100 % portable way is only a few bytes - // bigger code and there is no real speed - // difference, let's just use that, especially - // since the decoder doesn't need this at all. - uint32_t addr = inst & 0xFFFFF000; - addr += (inst2 >> 20) - - ((inst2 >> 19) & 0x1000); - - addr += now_pos + (uint32_t)i; - - // Construct the first 32 bits: - // [6:0] AUIPC opcode - // [11:7] Special AUIPC rd = x2 - // [31:12] The lowest 20 bits of inst2 - inst = 0x17 | (2 << 7) | (inst2 << 12); - - write32le(buffer + i, inst); - - // The second 32 bits store the absolute - // address in big endian order. - write32be(buffer + i + 4, addr); - } else { - // AUIPC's rd equals x0 or x2. - // - // x0 indicates a landing pad (LPAD). - // It's always skipped. - // - // AUIPC with rd == x2 is used for the special - // format as explained above. When the input - // contains a byte sequence that matches the - // special format, "fake" decoding must be - // done to keep the filter bijective (that - // is, safe to apply on arbitrary data). - // - // See the "x0 or x2" section in riscv_decode() - // for how the "real" decoding is done. The - // "fake" decoding is a simplified version - // of "real" decoding with the following - // differences (these reduce code size of - // the decoder): - // (1) The lowest 12 bits aren't sign-extended. - // (2) No address conversion is done. - // (3) Big endian format isn't used (the fake - // address is in little endian order). - - // Check if inst matches the special format. - const uint32_t fake_rs1 = inst >> 27; - - if (NOT_SPECIAL_AUIPC(inst, fake_rs1)) { - i += 4 - 2; - continue; - } - - const uint32_t fake_addr = - read32le(buffer + i + 4); - - // Construct the second 32 bits: - // [19:0] Upper 20 bits from AUIPC - // [31:20] The lowest 12 bits of fake_addr - const uint32_t fake_inst2 = (inst >> 12) - | (fake_addr << 20); - - // Construct new first 32 bits from: - // [6:0] AUIPC opcode - // [11:7] Fake AUIPC rd = fake_rs1 - // [31:12] The highest 20 bits of fake_addr - inst = 0x17 | (fake_rs1 << 7) - | (fake_addr & 0xFFFFF000); - - write32le(buffer + i, inst); - write32le(buffer + i + 4, fake_inst2); - } - - i += 8 - 2; - } - } - - return i; -} - - -extern lzma_ret -lzma_simple_riscv_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return lzma_simple_coder_init(next, allocator, filters, - &riscv_encode, 0, 8, 2, true); -} - - -extern LZMA_API(size_t) -lzma_bcj_riscv_encode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - // start_offset must be a multiple of two. - start_offset &= ~UINT32_C(1); - return riscv_encode(NULL, start_offset, true, buf, size); -} -#endif - - -#ifdef HAVE_DECODER_RISCV -static size_t -riscv_decode(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, - bool is_encoder lzma_attribute((__unused__)), - uint8_t *buffer, size_t size) -{ - if (size < 8) - return 0; - - size -= 8; - - size_t i; - for (i = 0; i <= size; i += 2) { - uint32_t inst = buffer[i]; - - if (inst == 0xEF) { - // JAL - const uint32_t b1 = buffer[i + 1]; - - // Only filter rd=x1(ra) and rd=x5(t0). - if ((b1 & 0x0D) != 0) - continue; - - const uint32_t b2 = buffer[i + 2]; - const uint32_t b3 = buffer[i + 3]; - const uint32_t pc = now_pos + (uint32_t)i; - -// | b3 | b2 | b1 | -// | 31 30 29 28 27 26 25 24 | 23 22 21 20 19 18 17 16 | 15 14 13 12 x x x x | -// | 20 10 9 8 7 6 5 4 | 3 2 1 11 19 18 17 16 | 15 14 13 12 x x x x | -// | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | 7 6 5 4 x x x x | - - uint32_t addr = ((b1 & 0xF0) << 13) - | (b2 << 9) | (b3 << 1); - - addr -= pc; - - buffer[i + 1] = (uint8_t)((b1 & 0x0F) - | ((addr >> 8) & 0xF0)); - - buffer[i + 2] = (uint8_t)(((addr >> 16) & 0x0F) - | ((addr >> 7) & 0x10) - | ((addr << 4) & 0xE0)); - - buffer[i + 3] = (uint8_t)(((addr >> 4) & 0x7F) - | ((addr >> 13) & 0x80)); - - i += 4 - 2; - - } else if ((inst & 0x7F) == 0x17) { - // AUIPC - uint32_t inst2; - - inst |= (uint32_t)buffer[i + 1] << 8; - inst |= (uint32_t)buffer[i + 2] << 16; - inst |= (uint32_t)buffer[i + 3] << 24; - - if (inst & 0xE80) { - // AUIPC's rd doesn't equal x0 or x2. - - // Check if it is a "fake" AUIPC+inst2 pair. - inst2 = read32le(buffer + i + 4); - - if (NOT_AUIPC_PAIR(inst, inst2)) { - i += 6 - 2; - continue; - } - - // Decode (or more like re-encode) the "fake" - // pair. The "fake" format doesn't do - // sign-extension, address conversion, or - // use big endian. (The use of little endian - // allows sharing the write32le() calls in - // the decoder to reduce code size when - // unaligned access isn't supported.) - uint32_t addr = inst & 0xFFFFF000; - addr += inst2 >> 20; - - inst = 0x17 | (2 << 7) | (inst2 << 12); - inst2 = addr; - } else { - // AUIPC's rd equals x0 or x2. - - // Check if inst matches the special format - // used by the encoder. - const uint32_t inst2_rs1 = inst >> 27; - - if (NOT_SPECIAL_AUIPC(inst, inst2_rs1)) { - i += 4 - 2; - continue; - } - - // Decode the "real" pair. - uint32_t addr = read32be(buffer + i + 4); - - addr -= now_pos + (uint32_t)i; - - // The second instruction: - // - Get the lowest 20 bits from inst. - // - Add the lowest 12 bits of the address - // as the immediate field. - inst2 = (inst >> 12) | (addr << 20); - - // AUIPC: - // - rd is the same as inst2_rs1. - // - The sign extension of the lowest 12 bits - // must be taken into account. - inst = 0x17 | (inst2_rs1 << 7) - | ((addr + 0x800) & 0xFFFFF000); - } - - // Both decoder branches write in little endian order. - write32le(buffer + i, inst); - write32le(buffer + i + 4, inst2); - - i += 8 - 2; - } - } - - return i; -} - - -extern lzma_ret -lzma_simple_riscv_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return lzma_simple_coder_init(next, allocator, filters, - &riscv_decode, 0, 8, 2, false); -} - - -extern LZMA_API(size_t) -lzma_bcj_riscv_decode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - // start_offset must be a multiple of two. - start_offset &= ~UINT32_C(1); - return riscv_decode(NULL, start_offset, false, buf, size); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/simple_coder.c b/software/src/xz/src/liblzma/simple/simple_coder.c deleted file mode 100644 index 5cbfa82..0000000 --- a/software/src/xz/src/liblzma/simple/simple_coder.c +++ /dev/null @@ -1,291 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_coder.c -/// \brief Wrapper for simple filters -/// -/// Simple filters don't change the size of the data i.e. number of bytes -/// in equals the number of bytes out. -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -/// Copied or encodes/decodes more data to out[]. -static lzma_ret -copy_or_code(lzma_simple_coder *coder, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - assert(!coder->end_was_reached); - - if (coder->next.code == NULL) { - lzma_bufcpy(in, in_pos, in_size, out, out_pos, out_size); - - // Check if end of stream was reached. - if (coder->is_encoder && action == LZMA_FINISH - && *in_pos == in_size) - coder->end_was_reached = true; - - } else { - // Call the next coder in the chain to provide us some data. - const lzma_ret ret = coder->next.code( - coder->next.coder, allocator, - in, in_pos, in_size, - out, out_pos, out_size, action); - - if (ret == LZMA_STREAM_END) { - assert(!coder->is_encoder - || action == LZMA_FINISH); - coder->end_was_reached = true; - - } else if (ret != LZMA_OK) { - return ret; - } - } - - return LZMA_OK; -} - - -static size_t -call_filter(lzma_simple_coder *coder, uint8_t *buffer, size_t size) -{ - const size_t filtered = coder->filter(coder->simple, - coder->now_pos, coder->is_encoder, - buffer, size); - coder->now_pos += filtered; - return filtered; -} - - -static lzma_ret -simple_code(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, lzma_action action) -{ - lzma_simple_coder *coder = coder_ptr; - - // TODO: Add partial support for LZMA_SYNC_FLUSH. We can support it - // in cases when the filter is able to filter everything. With most - // simple filters it can be done at offset that is a multiple of 2, - // 4, or 16. With x86 filter, it needs good luck, and thus cannot - // be made to work predictably. - if (action == LZMA_SYNC_FLUSH) - return LZMA_OPTIONS_ERROR; - - // Flush already filtered data from coder->buffer[] to out[]. - if (coder->pos < coder->filtered) { - lzma_bufcpy(coder->buffer, &coder->pos, coder->filtered, - out, out_pos, out_size); - - // If we couldn't flush all the filtered data, return to - // application immediately. - if (coder->pos < coder->filtered) - return LZMA_OK; - - if (coder->end_was_reached) { - assert(coder->filtered == coder->size); - return LZMA_STREAM_END; - } - } - - // If we get here, there is no filtered data left in the buffer. - coder->filtered = 0; - - assert(!coder->end_was_reached); - - // If there is more output space left than there is unfiltered data - // in coder->buffer[], flush coder->buffer[] to out[], and copy/code - // more data to out[] hopefully filling it completely. Then filter - // the data in out[]. This step is where most of the data gets - // filtered if the buffer sizes used by the application are reasonable. - const size_t out_avail = out_size - *out_pos; - const size_t buf_avail = coder->size - coder->pos; - if (out_avail > buf_avail || buf_avail == 0) { - // Store the old position so that we know from which byte - // to start filtering. - const size_t out_start = *out_pos; - - // Flush data from coder->buffer[] to out[], but don't reset - // coder->pos and coder->size yet. This way the coder can be - // restarted if the next filter in the chain returns e.g. - // LZMA_MEM_ERROR. - // - // Do the memcpy() conditionally because out can be NULL - // (in which case buf_avail is always 0). Calling memcpy() - // with a null-pointer is undefined even if the third - // argument is 0. - if (buf_avail > 0) - memcpy(out + *out_pos, coder->buffer + coder->pos, - buf_avail); - - *out_pos += buf_avail; - - // Copy/Encode/Decode more data to out[]. - { - const lzma_ret ret = copy_or_code(coder, allocator, - in, in_pos, in_size, - out, out_pos, out_size, action); - assert(ret != LZMA_STREAM_END); - if (ret != LZMA_OK) - return ret; - } - - // Filter out[] unless there is nothing to filter. - // This way we avoid null pointer + 0 (undefined behavior) - // when out == NULL. - const size_t size = *out_pos - out_start; - const size_t filtered = size == 0 ? 0 : call_filter( - coder, out + out_start, size); - - const size_t unfiltered = size - filtered; - assert(unfiltered <= coder->allocated / 2); - - // Now we can update coder->pos and coder->size, because - // the next coder in the chain (if any) was successful. - coder->pos = 0; - coder->size = unfiltered; - - if (coder->end_was_reached) { - // The last byte has been copied to out[] already. - // They are left as is. - coder->size = 0; - - } else if (unfiltered > 0) { - // There is unfiltered data left in out[]. Copy it to - // coder->buffer[] and rewind *out_pos appropriately. - *out_pos -= unfiltered; - memcpy(coder->buffer, out + *out_pos, unfiltered); - } - } else if (coder->pos > 0) { - memmove(coder->buffer, coder->buffer + coder->pos, buf_avail); - coder->size -= coder->pos; - coder->pos = 0; - } - - assert(coder->pos == 0); - - // If coder->buffer[] isn't empty, try to fill it by copying/decoding - // more data. Then filter coder->buffer[] and copy the successfully - // filtered data to out[]. It is probable, that some filtered and - // unfiltered data will be left to coder->buffer[]. - if (coder->size > 0) { - { - const lzma_ret ret = copy_or_code(coder, allocator, - in, in_pos, in_size, - coder->buffer, &coder->size, - coder->allocated, action); - assert(ret != LZMA_STREAM_END); - if (ret != LZMA_OK) - return ret; - } - - coder->filtered = call_filter( - coder, coder->buffer, coder->size); - - // Everything is considered to be filtered if coder->buffer[] - // contains the last bytes of the data. - if (coder->end_was_reached) - coder->filtered = coder->size; - - // Flush as much as possible. - lzma_bufcpy(coder->buffer, &coder->pos, coder->filtered, - out, out_pos, out_size); - } - - // Check if we got everything done. - if (coder->end_was_reached && coder->pos == coder->size) - return LZMA_STREAM_END; - - return LZMA_OK; -} - - -static void -simple_coder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_simple_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder->simple, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -simple_coder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters_null lzma_attribute((__unused__)), - const lzma_filter *reversed_filters) -{ - lzma_simple_coder *coder = coder_ptr; - - // No update support, just call the next filter in the chain. - return lzma_next_filter_update( - &coder->next, allocator, reversed_filters + 1); -} - - -extern lzma_ret -lzma_simple_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - size_t (*filter)(void *simple, uint32_t now_pos, - bool is_encoder, uint8_t *buffer, size_t size), - size_t simple_size, size_t unfiltered_max, - uint32_t alignment, bool is_encoder) -{ - // Allocate memory for the lzma_simple_coder structure if needed. - lzma_simple_coder *coder = next->coder; - if (coder == NULL) { - // Here we allocate space also for the temporary buffer. We - // need twice the size of unfiltered_max, because then it - // is always possible to filter at least unfiltered_max bytes - // more data in coder->buffer[] if it can be filled completely. - coder = lzma_alloc(sizeof(lzma_simple_coder) - + 2 * unfiltered_max, allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &simple_code; - next->end = &simple_coder_end; - next->update = &simple_coder_update; - - coder->next = LZMA_NEXT_CODER_INIT; - coder->filter = filter; - coder->allocated = 2 * unfiltered_max; - - // Allocate memory for filter-specific data structure. - if (simple_size > 0) { - coder->simple = lzma_alloc(simple_size, allocator); - if (coder->simple == NULL) - return LZMA_MEM_ERROR; - } else { - coder->simple = NULL; - } - } - - if (filters[0].options != NULL) { - const lzma_options_bcj *simple = filters[0].options; - coder->now_pos = simple->start_offset; - if (coder->now_pos & (alignment - 1)) - return LZMA_OPTIONS_ERROR; - } else { - coder->now_pos = 0; - } - - // Reset variables. - coder->is_encoder = is_encoder; - coder->end_was_reached = false; - coder->pos = 0; - coder->filtered = 0; - coder->size = 0; - - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} diff --git a/software/src/xz/src/liblzma/simple/simple_coder.h b/software/src/xz/src/liblzma/simple/simple_coder.h deleted file mode 100644 index 2b762d5..0000000 --- a/software/src/xz/src/liblzma/simple/simple_coder.h +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_coder.h -/// \brief Wrapper for simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SIMPLE_CODER_H -#define LZMA_SIMPLE_CODER_H - -#include "common.h" - - -extern lzma_ret lzma_simple_x86_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_x86_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_powerpc_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_powerpc_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_ia64_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_ia64_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_arm_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_arm_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_armthumb_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_armthumb_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_arm64_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_arm64_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_sparc_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_sparc_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern lzma_ret lzma_simple_riscv_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern lzma_ret lzma_simple_riscv_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -#endif diff --git a/software/src/xz/src/liblzma/simple/simple_decoder.c b/software/src/xz/src/liblzma/simple/simple_decoder.c deleted file mode 100644 index d9820ee..0000000 --- a/software/src/xz/src/liblzma/simple/simple_decoder.c +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_decoder.c -/// \brief Properties decoder for simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_decoder.h" - - -extern lzma_ret -lzma_simple_props_decode(void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - if (props_size == 0) - return LZMA_OK; - - if (props_size != 4) - return LZMA_OPTIONS_ERROR; - - lzma_options_bcj *opt = lzma_alloc( - sizeof(lzma_options_bcj), allocator); - if (opt == NULL) - return LZMA_MEM_ERROR; - - opt->start_offset = read32le(props); - - // Don't leave an options structure allocated if start_offset is zero. - if (opt->start_offset == 0) - lzma_free(opt, allocator); - else - *options = opt; - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/simple/simple_decoder.h b/software/src/xz/src/liblzma/simple/simple_decoder.h deleted file mode 100644 index 2ae87bb..0000000 --- a/software/src/xz/src/liblzma/simple/simple_decoder.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_decoder.h -/// \brief Properties decoder for simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SIMPLE_DECODER_H -#define LZMA_SIMPLE_DECODER_H - -#include "simple_coder.h" - -extern lzma_ret lzma_simple_props_decode( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - -#endif diff --git a/software/src/xz/src/liblzma/simple/simple_encoder.c b/software/src/xz/src/liblzma/simple/simple_encoder.c deleted file mode 100644 index d1f3509..0000000 --- a/software/src/xz/src/liblzma/simple/simple_encoder.c +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_encoder.c -/// \brief Properties encoder for simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_encoder.h" - - -extern lzma_ret -lzma_simple_props_size(uint32_t *size, const void *options) -{ - const lzma_options_bcj *const opt = options; - *size = (opt == NULL || opt->start_offset == 0) ? 0 : 4; - return LZMA_OK; -} - - -extern lzma_ret -lzma_simple_props_encode(const void *options, uint8_t *out) -{ - const lzma_options_bcj *const opt = options; - - // The default start offset is zero, so we don't need to store any - // options unless the start offset is non-zero. - if (opt == NULL || opt->start_offset == 0) - return LZMA_OK; - - write32le(out, opt->start_offset); - - return LZMA_OK; -} diff --git a/software/src/xz/src/liblzma/simple/simple_encoder.h b/software/src/xz/src/liblzma/simple/simple_encoder.h deleted file mode 100644 index bf5edbb..0000000 --- a/software/src/xz/src/liblzma/simple/simple_encoder.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_encoder.c -/// \brief Properties encoder for simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SIMPLE_ENCODER_H -#define LZMA_SIMPLE_ENCODER_H - -#include "simple_coder.h" - - -extern lzma_ret lzma_simple_props_size(uint32_t *size, const void *options); - -extern lzma_ret lzma_simple_props_encode(const void *options, uint8_t *out); - -#endif diff --git a/software/src/xz/src/liblzma/simple/simple_private.h b/software/src/xz/src/liblzma/simple/simple_private.h deleted file mode 100644 index 7aa360f..0000000 --- a/software/src/xz/src/liblzma/simple/simple_private.h +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file simple_private.h -/// \brief Private definitions for so called simple filters -// -// Author: Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SIMPLE_PRIVATE_H -#define LZMA_SIMPLE_PRIVATE_H - -#include "simple_coder.h" - - -typedef struct { - /// Next filter in the chain - lzma_next_coder next; - - /// True if the next coder in the chain has returned LZMA_STREAM_END. - bool end_was_reached; - - /// True if filter() should encode the data; false to decode. - /// Currently all simple filters use the same function for encoding - /// and decoding, because the difference between encoders and decoders - /// is very small. - bool is_encoder; - - /// Pointer to filter-specific function, which does - /// the actual filtering. - size_t (*filter)(void *simple, uint32_t now_pos, - bool is_encoder, uint8_t *buffer, size_t size); - - /// Pointer to filter-specific data, or NULL if filter doesn't need - /// any extra data. - void *simple; - - /// The lowest 32 bits of the current position in the data. Most - /// filters need this to do conversions between absolute and relative - /// addresses. - uint32_t now_pos; - - /// Size of the memory allocated for the buffer. - size_t allocated; - - /// Flushing position in the temporary buffer. buffer[pos] is the - /// next byte to be copied to out[]. - size_t pos; - - /// buffer[filtered] is the first unfiltered byte. When pos is smaller - /// than filtered, there is unflushed filtered data in the buffer. - size_t filtered; - - /// Total number of bytes (both filtered and unfiltered) currently - /// in the temporary buffer. - size_t size; - - /// Temporary buffer - uint8_t buffer[]; -} lzma_simple_coder; - - -extern lzma_ret lzma_simple_coder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters, - size_t (*filter)(void *simple, uint32_t now_pos, - bool is_encoder, uint8_t *buffer, size_t size), - size_t simple_size, size_t unfiltered_max, - uint32_t alignment, bool is_encoder); - -#endif diff --git a/software/src/xz/src/liblzma/simple/sparc.c b/software/src/xz/src/liblzma/simple/sparc.c deleted file mode 100644 index 1fa4850..0000000 --- a/software/src/xz/src/liblzma/simple/sparc.c +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file sparc.c -/// \brief Filter for SPARC binaries -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -static size_t -sparc_code(void *simple lzma_attribute((__unused__)), - uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - size &= ~(size_t)3; - - size_t i; - for (i = 0; i < size; i += 4) { - if ((buffer[i] == 0x40 && (buffer[i + 1] & 0xC0) == 0x00) - || (buffer[i] == 0x7F - && (buffer[i + 1] & 0xC0) == 0xC0)) { - - uint32_t src = ((uint32_t)buffer[i + 0] << 24) - | ((uint32_t)buffer[i + 1] << 16) - | ((uint32_t)buffer[i + 2] << 8) - | ((uint32_t)buffer[i + 3]); - - src <<= 2; - - uint32_t dest; - if (is_encoder) - dest = now_pos + (uint32_t)(i) + src; - else - dest = src - (now_pos + (uint32_t)(i)); - - dest >>= 2; - - dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) - | (dest & 0x3FFFFF) - | 0x40000000; - - buffer[i + 0] = (uint8_t)(dest >> 24); - buffer[i + 1] = (uint8_t)(dest >> 16); - buffer[i + 2] = (uint8_t)(dest >> 8); - buffer[i + 3] = (uint8_t)(dest); - } - } - - return i; -} - - -static lzma_ret -sparc_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - return lzma_simple_coder_init(next, allocator, filters, - &sparc_code, 0, 4, 4, is_encoder); -} - - -#ifdef HAVE_ENCODER_SPARC -extern lzma_ret -lzma_simple_sparc_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return sparc_coder_init(next, allocator, filters, true); -} -#endif - - -#ifdef HAVE_DECODER_SPARC -extern lzma_ret -lzma_simple_sparc_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return sparc_coder_init(next, allocator, filters, false); -} -#endif diff --git a/software/src/xz/src/liblzma/simple/x86.c b/software/src/xz/src/liblzma/simple/x86.c deleted file mode 100644 index dffa786..0000000 --- a/software/src/xz/src/liblzma/simple/x86.c +++ /dev/null @@ -1,181 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/////////////////////////////////////////////////////////////////////////////// -// -/// \file x86.c -/// \brief Filter for x86 binaries (BCJ filter) -/// -// Authors: Igor Pavlov -// Lasse Collin -// -/////////////////////////////////////////////////////////////////////////////// - -#include "simple_private.h" - - -#define Test86MSByte(b) ((b) == 0 || (b) == 0xFF) - - -typedef struct { - uint32_t prev_mask; - uint32_t prev_pos; -} lzma_simple_x86; - - -static size_t -x86_code(void *simple_ptr, uint32_t now_pos, bool is_encoder, - uint8_t *buffer, size_t size) -{ - static const uint32_t MASK_TO_BIT_NUMBER[5] = { 0, 1, 2, 2, 3 }; - - lzma_simple_x86 *simple = simple_ptr; - uint32_t prev_mask = simple->prev_mask; - uint32_t prev_pos = simple->prev_pos; - - if (size < 5) - return 0; - - if (now_pos - prev_pos > 5) - prev_pos = now_pos - 5; - - const size_t limit = size - 5; - size_t buffer_pos = 0; - - while (buffer_pos <= limit) { - uint8_t b = buffer[buffer_pos]; - if (b != 0xE8 && b != 0xE9) { - ++buffer_pos; - continue; - } - - const uint32_t offset = now_pos + (uint32_t)(buffer_pos) - - prev_pos; - prev_pos = now_pos + (uint32_t)(buffer_pos); - - if (offset > 5) { - prev_mask = 0; - } else { - for (uint32_t i = 0; i < offset; ++i) { - prev_mask &= 0x77; - prev_mask <<= 1; - } - } - - b = buffer[buffer_pos + 4]; - - if (Test86MSByte(b) && (prev_mask >> 1) <= 4 - && (prev_mask >> 1) != 3) { - - uint32_t src = ((uint32_t)(b) << 24) - | ((uint32_t)(buffer[buffer_pos + 3]) << 16) - | ((uint32_t)(buffer[buffer_pos + 2]) << 8) - | (buffer[buffer_pos + 1]); - - uint32_t dest; - while (true) { - if (is_encoder) - dest = src + (now_pos + (uint32_t)( - buffer_pos) + 5); - else - dest = src - (now_pos + (uint32_t)( - buffer_pos) + 5); - - if (prev_mask == 0) - break; - - const uint32_t i = MASK_TO_BIT_NUMBER[ - prev_mask >> 1]; - - b = (uint8_t)(dest >> (24 - i * 8)); - - if (!Test86MSByte(b)) - break; - - src = dest ^ ((1U << (32 - i * 8)) - 1); - } - - buffer[buffer_pos + 4] - = (uint8_t)(~(((dest >> 24) & 1) - 1)); - buffer[buffer_pos + 3] = (uint8_t)(dest >> 16); - buffer[buffer_pos + 2] = (uint8_t)(dest >> 8); - buffer[buffer_pos + 1] = (uint8_t)(dest); - buffer_pos += 5; - prev_mask = 0; - - } else { - ++buffer_pos; - prev_mask |= 1; - if (Test86MSByte(b)) - prev_mask |= 0x10; - } - } - - simple->prev_mask = prev_mask; - simple->prev_pos = prev_pos; - - return buffer_pos; -} - - -static lzma_ret -x86_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, bool is_encoder) -{ - const lzma_ret ret = lzma_simple_coder_init(next, allocator, filters, - &x86_code, sizeof(lzma_simple_x86), 5, 1, is_encoder); - - if (ret == LZMA_OK) { - lzma_simple_coder *coder = next->coder; - lzma_simple_x86 *simple = coder->simple; - simple->prev_mask = 0; - simple->prev_pos = (uint32_t)(-5); - } - - return ret; -} - - -#ifdef HAVE_ENCODER_X86 -extern lzma_ret -lzma_simple_x86_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return x86_coder_init(next, allocator, filters, true); -} - - -extern LZMA_API(size_t) -lzma_bcj_x86_encode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - lzma_simple_x86 simple = { - .prev_mask = 0, - .prev_pos = (uint32_t)(-5), - }; - - return x86_code(&simple, start_offset, true, buf, size); -} -#endif - - -#ifdef HAVE_DECODER_X86 -extern lzma_ret -lzma_simple_x86_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return x86_coder_init(next, allocator, filters, false); -} - - -extern LZMA_API(size_t) -lzma_bcj_x86_decode(uint32_t start_offset, uint8_t *buf, size_t size) -{ - lzma_simple_x86 simple = { - .prev_mask = 0, - .prev_pos = (uint32_t)(-5), - }; - - return x86_code(&simple, start_offset, false, buf, size); -} -#endif diff --git a/software/src/xz/src/liblzma/validate_map.sh b/software/src/xz/src/liblzma/validate_map.sh deleted file mode 100644 index dd1589d..0000000 --- a/software/src/xz/src/liblzma/validate_map.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: 0BSD - -############################################################################### -# -# Check liblzma_*.map for certain types of errors. -# -# liblzma_generic.map is for FreeBSD and Solaris and possibly others -# except GNU/Linux. -# -# liblzma_linux.map is for GNU/Linux only. This and the matching extra code -# in the .c files make liblzma >= 5.2.7 compatible with binaries that were -# linked against ill-patched liblzma in RHEL/CentOS 7. By providing the -# compatibility in official XZ Utils release will hopefully prevent people -# from further copying the broken patch to other places when they want -# compatibility with binaries linked on RHEL/CentOS 7. The long version -# of the story: -# -# RHEL/CentOS 7 shipped with 5.1.2alpha, including the threaded -# encoder that is behind #ifdef LZMA_UNSTABLE in the API headers. -# In 5.1.2alpha these symbols are under XZ_5.1.2alpha in liblzma.map. -# API/ABI compatibility tracking isn't done between development -# releases so newer releases didn't have XZ_5.1.2alpha anymore. -# -# Later RHEL/CentOS 7 updated xz to 5.2.2 but they wanted to keep -# the exported symbols compatible with 5.1.2alpha. After checking -# the ABI changes it turned out that >= 5.2.0 ABI is backward -# compatible with the threaded encoder functions from 5.1.2alpha -# (but not vice versa as fixes and extensions to these functions -# were made between 5.1.2alpha and 5.2.0). -# -# In RHEL/CentOS 7, XZ Utils 5.2.2 was patched with -# xz-5.2.2-compat-libs.patch to modify liblzma.map: -# -# - XZ_5.1.2alpha was added with lzma_stream_encoder_mt and -# lzma_stream_encoder_mt_memusage. This matched XZ Utils 5.1.2alpha. -# -# - XZ_5.2 was replaced with XZ_5.2.2. It is clear that this was -# an error; the intention was to keep using XZ_5.2 (XZ_5.2.2 -# has never been used in XZ Utils). So XZ_5.2.2 lists all -# symbols that were listed under XZ_5.2 before the patch. -# lzma_stream_encoder_mt and _mt_memusage are included too so -# they are listed both here and under XZ_5.1.2alpha. -# -# The patch didn't add any __asm__(".symver ...") lines to the .c -# files. Thus the resulting liblzma.so exports the threaded encoder -# functions under XZ_5.1.2alpha only. Listing the two functions -# also under XZ_5.2.2 in liblzma.map has no effect without -# matching .symver lines. -# -# The lack of XZ_5.2 in RHEL/CentOS 7 means that binaries linked -# against unpatched XZ Utils 5.2.x won't run on RHEL/CentOS 7. -# This is unfortunate but this alone isn't too bad as the problem -# is contained within RHEL/CentOS 7 and doesn't affect users -# of other distributions. It could also be fixed internally in -# RHEL/CentOS 7. -# -# The second problem is more serious: In XZ Utils 5.2.2 the API -# headers don't have #ifdef LZMA_UNSTABLE for obvious reasons. -# This is true in RHEL/CentOS 7 version too. Thus now programs -# using new APIs can be compiled without an extra #define. However, -# the programs end up depending on symbol version XZ_5.1.2alpha -# (and possibly also XZ_5.2.2) instead of XZ_5.2 as they would -# with an unpatched XZ Utils 5.2.2. This means that such binaries -# won't run on other distributions shipping XZ Utils >= 5.2.0 as -# they don't provide XZ_5.1.2alpha or XZ_5.2.2; they only provide -# XZ_5.2 (and XZ_5.0). (This includes RHEL/CentOS 8 as the patch -# luckily isn't included there anymore with XZ Utils 5.2.4.) -# -# Binaries built by RHEL/CentOS 7 users get distributed and then -# people wonder why they don't run on some other distribution. -# Seems that people have found out about the patch and been copying -# it to some build scripts, seemingly curing the symptoms but -# actually spreading the illness further and outside RHEL/CentOS 7. -# Adding compatibility in an official XZ Utils release should work -# as a vaccine against this ill patch and stop it from spreading. -# The vaccine is kept GNU/Linux-only as other OSes should be immune -# (hopefully it hasn't spread via some build script to other OSes). -# -# Author: Lasse Collin -# -############################################################################### - -LC_ALL=C -export LC_ALL - -STATUS=0 - -cd "$(dirname "$0")" - -# Get the list of symbols that aren't defined in liblzma_generic.map. -SYMS=$(sed -n 's/^extern LZMA_API([^)]*) \([a-z0-9_]*\)(.*$/\1;/p' \ - api/lzma/*.h \ - | sort \ - | grep -Fve "$(sed '/[{}:*]/d;/^$/d;s/^ //' liblzma_generic.map)") - -# Check that there are no old alpha or beta versions listed. -VER=$(cd ../.. && sh build-aux/version.sh) -NAMES= -case $VER in - *alpha | *beta) - NAMES=$(sed -n 's/^.*XZ_\([^ ]*\)\(alpha\|beta\) .*$/\1\2/p' \ - liblzma_generic.map | grep -Fv "$VER") - ;; -esac - -# Check for duplicate lines. It can catch missing dependencies. -DUPS=$(sort liblzma_generic.map | sed '/^$/d;/^global:$/d' | uniq -d) - -# Check that liblzma_linux.map is in sync with liblzma_generic.map. -# The RHEL/CentOS 7 compatibility symbols are in a fixed location -# so it makes it easy to remove them for comparison with liblzma_generic.map. -# -# NOTE: Putting XZ_5.2 before the compatibility symbols XZ_5.1.2alpha -# and XZ_5.2.2 in liblzma_linux.map is important: If liblzma_linux.map is -# incorrectly used without #define HAVE_SYMBOL_VERSIONS_LINUX, only the first -# occurrence of each function name will be used from liblzma_linux.map; -# the rest are ignored by the linker. Thus having XZ_5.2 before the -# compatibility symbols means that @@XZ_5.2 will be used for the symbols -# listed under XZ_5.2 {...} and the same function names later in -# the file under XZ_5.1.2alpha {...} and XZ_5.2.2 {...} will be -# ignored (@XZ_5.1.2alpha or @XZ_5.2.2 won't be added at all when -# the #define HAVE_SYMBOL_VERSIONS_LINUX isn't used). -IN_SYNC= -if ! sed '111,125d' liblzma_linux.map \ - | cmp -s - liblzma_generic.map; then - IN_SYNC=no -fi - -# Print error messages if needed. -if test -n "$SYMS$NAMES$DUPS$IN_SYNC"; then - echo - echo 'validate_map.sh found problems from liblzma_*.map:' - echo - - if test -n "$SYMS"; then - echo 'liblzma_generic.map lacks the following symbols:' - echo "$SYMS" - echo - fi - - if test -n "$NAMES"; then - echo 'Obsolete alpha or beta version names:' - echo "$NAMES" - echo - fi - - if test -n "$DUPS"; then - echo 'Duplicate lines:' - echo "$DUPS" - echo - fi - - if test -n "$IN_SYNC"; then - echo "liblzma_generic.map and liblzma_linux.map aren't in sync" - echo - fi - - STATUS=1 -fi - -# Exit status is 1 if problems were found, 0 otherwise. -exit "$STATUS" diff --git a/software/src/xz/src/scripts/Makefile.am b/software/src/xz/src/scripts/Makefile.am deleted file mode 100644 index 29c561c..0000000 --- a/software/src/xz/src/scripts/Makefile.am +++ /dev/null @@ -1,85 +0,0 @@ -## SPDX-License-Identifier: 0BSD -## Author: Lasse Collin - -nodist_bin_SCRIPTS = xzdiff xzgrep xzmore xzless -dist_man_MANS = xzdiff.1 xzgrep.1 xzmore.1 xzless.1 - -links = \ - xzdiff-xzcmp \ - xzgrep-xzegrep \ - xzgrep-xzfgrep - -if COND_LZMALINKS -links += \ - xzdiff-lzdiff \ - xzdiff-lzcmp \ - xzgrep-lzgrep \ - xzgrep-lzegrep \ - xzgrep-lzfgrep \ - xzmore-lzmore \ - xzless-lzless -endif - -install-exec-hook: - cd "$(DESTDIR)$(bindir)" && \ - for pair in $(links); do \ - target=`echo $$pair | sed 's/-.*$$//' | sed '$(transform)'` && \ - link=`echo $$pair | sed 's/^.*-//' | sed '$(transform)'` && \ - rm -f "$$link" && \ - $(LN_S) "$$target" "$$link"; \ - done - -# The installation of translated man pages abuses Automake internals -# by calling "install-man" with redefined dist_man_MANS and man_MANS. -# If this breaks some day, don't blame Automake developers. -install-data-hook: - languages= ; \ - if test "$(USE_NLS)" = yes && test -d "$(top_srcdir)/po4a/man"; then \ - languages=`ls "$(top_srcdir)/po4a/man"`; \ - fi; \ - for lang in $$languages; do \ - mans= ; \ - for man in $(dist_man_MANS); do \ - man="$(top_srcdir)/po4a/man/$$lang/$$man" ; \ - if test -f "$$man"; then \ - mans="$$mans $$man"; \ - fi; \ - done; \ - $(MAKE) dist_man_MANS="$$mans" man_MANS= \ - mandir="$(mandir)/$$lang" install-man; \ - done; \ - for lang in . $$languages; do \ - for pair in $(links); do \ - target=`echo $$pair | sed 's/-.*$$//' \ - | sed '$(transform)'` && \ - link=`echo $$pair | sed 's/^.*-//' \ - | sed '$(transform)'` && \ - man1dir="$(DESTDIR)$(mandir)/$$lang/man1" && \ - if test -f "$$man1dir/$$target.1"; then ( \ - cd "$$man1dir" && \ - rm -f "$$link.1" && \ - $(LN_S) "$$target.1" "$$link.1" \ - ); fi; \ - done; \ - done - -uninstall-hook: - cd "$(DESTDIR)$(bindir)" && \ - for pair in $(links); do \ - link=`echo $$pair | sed 's/^.*-//' | sed '$(transform)'` && \ - rm -f "$$link"; \ - done - languages= ; \ - if test "$(USE_NLS)" = yes && test -d "$(top_srcdir)/po4a/man"; then \ - languages=`ls "$(top_srcdir)/po4a/man"`; \ - fi; \ - for lang in . $$languages; do \ - for pair in $(links); do \ - target=`echo $$pair | sed 's/-.*$$//' \ - | sed '$(transform)'` && \ - link=`echo $$pair | sed 's/^.*-//' \ - | sed '$(transform)'` && \ - rm -f "$(DESTDIR)$(mandir)/$$lang/man1/$$target.1" \ - "$(DESTDIR)$(mandir)/$$lang/man1/$$link.1"; \ - done; \ - done diff --git a/software/src/xz/src/scripts/xzdiff.1 b/software/src/xz/src/scripts/xzdiff.1 deleted file mode 100644 index 9d2608e..0000000 --- a/software/src/xz/src/scripts/xzdiff.1 +++ /dev/null @@ -1,99 +0,0 @@ -.\" SPDX-License-Identifier: 0BSD -.\" -.\" Authors: Lasse Collin -.\" Jia Tan -.\" -.\" (Note that this file is not based on gzip's zdiff.1.) -.\" -.TH XZDIFF 1 "2025-03-06" "Tukaani" "XZ Utils" -.SH NAME -xzcmp, xzdiff, lzcmp, lzdiff \- compare compressed files -. -.SH SYNOPSIS -.B xzcmp -.RI [ option... ] -.I file1 -.RI [ file2 ] -.br -.B xzdiff -\&... -.br -.B lzcmp -\&... -(DEPRECATED) -.br -.B lzdiff -\&... -(DEPRECATED) -. -.SH DESCRIPTION -.B xzcmp -and -.B xzdiff -compare uncompressed contents of two files. -Uncompressed data and options are passed to -.BR cmp (1) -or -.BR diff (1) -unless -.B \-\-help -or -.B \-\-version -is specified. -.PP -If both -.I file1 -and -.I file2 -are specified, they can be uncompressed files or files in formats that -.BR xz (1), -.BR gzip (1), -.BR bzip2 (1), -.BR lzop (1), -.BR zstd (1), -or -.BR lz4 (1) -can decompress. -The required decompression commands are determined from -the filename suffixes of -.I file1 -and -.IR file2 . -A file with an unknown suffix is assumed to be either uncompressed -or in a format that -.BR xz (1) -can decompress. -.PP -If only one filename is provided, -.I file1 -must have a suffix of a supported compression format and the name for -.I file2 -is assumed to be -.I file1 -with the compression format suffix removed. -.PP -The commands -.B lzcmp -and -.B lzdiff -are provided for backward compatibility with LZMA Utils. -They are deprecated and will be removed in a future version. -. -.SH EXIT STATUS -If a decompression error occurs, the exit status is -.BR 2 . -Otherwise the exit status of -.BR cmp (1) -or -.BR diff (1) -is used. -. -.SH "SEE ALSO" -.BR cmp (1), -.BR diff (1), -.BR xz (1), -.BR gzip (1), -.BR bzip2 (1), -.BR lzop (1), -.BR zstd (1), -.BR lz4 (1) diff --git a/software/src/xz/src/scripts/xzdiff.in b/software/src/xz/src/scripts/xzdiff.in deleted file mode 100644 index 179218d..0000000 --- a/software/src/xz/src/scripts/xzdiff.in +++ /dev/null @@ -1,220 +0,0 @@ -#!@POSIX_SHELL@ -# SPDX-License-Identifier: GPL-2.0-or-later - -# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation -# Copyright (C) 1993 Jean-loup Gailly - -# Modified for XZ Utils by Andrew Dudman and Lasse Collin. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -@enable_path_for_scripts@ -#SET_PATH - This line is a placeholder to ease patching this script. - -# Instead of unsetting XZ_OPT, just make sure that xz will use file format -# autodetection. This way memory usage limit and thread limit can be -# specified via XZ_OPT. With gzip, bzip2, and lzop it's OK to just unset the -# environment variables. -xz='@xz@ --format=auto' -unset GZIP BZIP BZIP2 LZOP - -case ${0##*/} in - *cmp*) prog=xzcmp; cmp=${CMP:-cmp};; - *) prog=xzdiff; cmp=${DIFF:-diff};; -esac - -version="$prog (@PACKAGE_NAME@) @PACKAGE_VERSION@" - -usage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2] -Compare FILE1 to FILE2, using their uncompressed contents if they are -compressed. If FILE2 is omitted, then the files compared are FILE1 and -FILE1 from which the compression format suffix has been stripped. - -Do comparisons like '$cmp' does. OPTIONs are the same as for '$cmp'. - -Report bugs to <@PACKAGE_BUGREPORT@>." - -# sed script to escape all ' for the shell, and then (to handle trailing -# newlines correctly) turn trailing X on last line into '. -escape=' - s/'\''/'\''\\'\'''\''/g - $s/X$/'\''/ -' - -while :; do - case $1 in - --h*) printf '%s\n' "$usage" || exit 2; exit;; - --v*) printf '%s\n' "$version" || exit 2; exit;; - --) shift; break;; - -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;; - -?*) cmp="$cmp '$1'";; - *) break;; - esac - shift -done -cmp="$cmp --" - -for file; do - test "X$file" = X- || <"$file" || exit 2 -done - -# xz needs -qQ to ignore warnings like unsupported check type. -xz1="$xz -qQ" -xz2="$xz -qQ" -xz_status=0 -exec 3>&1 - -if test $# -eq 1; then - case $1 in - *[-.]xz | *[-.]lzma | *[-.]lz | *.t[lx]z) - ;; - *[-.]bz2 | *.tbz | *.tbz2) - xz1=bzip2;; - *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) - xz1=gzip;; - *[-.]lzo | *.tzo) - xz1=lzop;; - *[-.]zst | *.tzst) - xz1='zstd -q';; - *[-.]lz4) - xz1=lz4;; - *) - printf '%s\n' "$0: $1: Unknown compressed file name suffix" >&2 - exit 2;; - esac - case $1 in - *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *[-.]lz | *[-.]lzo | *[-.]zst | *[-.]lz4) - FILE=`expr "X$1" : 'X\(.*\)[-.][abglmostxzZ24]*$'`;; - *.t[abglx]z) - FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar;; - *.tbz2) - FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar;; - *.tzo) - FILE=`expr "X$1" : 'X\(.*[-.]t\)zo$'`ar;; - *.tzst) - FILE=`expr "X$1" : 'X\(.*[-.]t\)zst$'`ar;; - esac - xz_status=$( - exec 4>&1 - ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3 - ) -elif test $# -eq 2; then - case $1 in - *[-.]bz2 | *.tbz | *.tbz2) xz1=bzip2;; - *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=gzip;; - *[-.]lzo | *.tzo) xz1=lzop;; - *[-.]zst | *.tzst) xz1='zstd -q';; - *[-.]lz4) xz1=lz4;; - esac - case $2 in - *[-.]bz2 | *.tbz | *.tbz2) xz2=bzip2;; - *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=gzip;; - *[-.]lzo | *.tzo) xz2=lzop;; - *[-.]zst | *.tzst) xz2='zstd -q';; - *[-.]lz4) xz2=lz4;; - esac - case $1 in - *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *[-.]lz | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | *[-.]zst | *.tzst | *[-.]lz4 | -) - case "$2" in - *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *[-.]lz | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | *[-.]zst | *.tzst | *[-.]lz4 | -) - if test "$1$2" = --; then - xz_status=$( - exec 4>&1 - ($xz1 -cdf - 4>&-; echo $? >&4) 3>&- | - eval "$cmp" - - >&3 - ) - elif # Reject Solaris 8's buggy /bin/bash 2.03. - echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then - # NOTE: xz_status will contain two numbers. - xz_status=$( - exec 4>&1 - ($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- | - ( ($xz2 -cdf -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- &3) 5<&0 - ) - else - F=`expr "/$2" : '.*/\(.*\)[-.][ablmotxz2]*$'` || F=$prog - tmp= - trap ' - test -n "$tmp" && rm -rf "$tmp" - (exit 2); exit 2 - ' HUP INT PIPE TERM 0 - if type mktemp >/dev/null 2>&1; then - # Note that FreeBSD's mktemp isn't fully compatible with - # the implementations from mktemp.org and GNU coreutils. - # It is important that the -t argument is the last argument - # and that no "--" is used between -t and the template argument. - # This way this command works on all implementations. - tmp=`mktemp -d -t "$prog.XXXXXXXXXX"` || exit 2 - else - # Fallback code if mktemp is missing. This isn't as - # robust as using mktemp since this doesn't try with - # different file names in case of a file name conflict. - # - # There's no need to save the original umask since - # we don't create any non-temp files. Note that using - # mkdir -m 0077 isn't secure since some mkdir implementations - # create the dir with the default umask and chmod the - # the dir afterwards. - umask 0077 - mkdir -- "${TMPDIR-/tmp}/$prog.$$" || exit 2 - tmp="${TMPDIR-/tmp}/$prog.$$" - fi - $xz2 -cdf -- "$2" > "$tmp/$F" || exit 2 - xz_status=$( - exec 4>&1 - ($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- | - eval "$cmp" - '"$tmp/$F"' >&3 - ) - cmp_status=$? - rm -rf "$tmp" || xz_status=$? - trap - HUP INT PIPE TERM 0 - (exit $cmp_status) - fi;; - *) - xz_status=$( - exec 4>&1 - ($xz1 -cdf -- "$1" 4>&-; echo $? >&4) 3>&- | - eval "$cmp" - '"$2"' >&3 - );; - esac;; - *) - case "$2" in - *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *[-.]lz | *.t[abglx]z | *.tbz2 | *[-.]lzo | *.tzo | *[-.]zst | *.tzst | *[-.]lz4 | -) - xz_status=$( - exec 4>&1 - ($xz2 -cdf -- "$2" 4>&-; echo $? >&4) 3>&- | - eval "$cmp" '"$1"' - >&3 - );; - *) - eval "$cmp" '"$1"' '"$2"';; - esac;; - esac -else - printf '%s\n' "$0: Invalid number of operands; try '${0##*/} --help' for help" >&2 - exit 2 -fi - -cmp_status=$? -for num in $xz_status ; do - # 0 from decompressor means successful decompression. SIGPIPE from - # decompressor is possible when diff or cmp exits before the whole file - # has been decompressed. In that case we want to retain the exit status - # from diff or cmp. Note that using "trap '' PIPE" is not possible - # because gzip changes its behavior (including exit status) if SIGPIPE - # is ignored. - test "$num" -eq 0 && continue - test "$num" -ge 128 \ - && test "$(kill -l "$num" 2> /dev/null)" = "PIPE" \ - && continue - exit 2 -done -exit $cmp_status diff --git a/software/src/xz/src/scripts/xzgrep.1 b/software/src/xz/src/scripts/xzgrep.1 deleted file mode 100644 index c6bb0eb..0000000 --- a/software/src/xz/src/scripts/xzgrep.1 +++ /dev/null @@ -1,148 +0,0 @@ -.\" SPDX-License-Identifier: 0BSD -.\" -.\" Authors: Lasse Collin -.\" Jia Tan -.\" -.\" (Note that this file is not based on gzip's zgrep.1.) -.\" -.TH XZGREP 1 "2025-03-06" "Tukaani" "XZ Utils" -.SH NAME -xzgrep \- search possibly-compressed files for patterns -. -.SH SYNOPSIS -.B xzgrep -.RI [ option... ] -.RI [ pattern_list ] -.RI [ file... ] -.br -.B xzegrep -\&... -.br -.B xzfgrep -\&... -.br -.B lzgrep -\&... -(DEPRECATED) -.br -.B lzegrep -\&... -(DEPRECATED) -.br -.B lzfgrep -\&... -(DEPRECATED) -. -.SH DESCRIPTION -.B xzgrep -invokes -.BR grep (1) -on uncompressed contents of files. -The formats of the -.I files -are determined from the filename suffixes. -Any -.I file -with a suffix supported by -.BR xz (1), -.BR gzip (1), -.BR bzip2 (1), -.BR lzop (1), -.BR zstd (1), -or -.BR lz4 (1) -will be decompressed; -all other files are assumed to be uncompressed. -.PP -If no -.I files -are specified or -.I file -is -.B \- -then standard input is read. -When reading from standard input, only files supported by -.BR xz (1) -are decompressed. -Other files are assumed to be in uncompressed form already. -.PP -Most -.I options -of -.BR grep (1) -are supported. -However, the following options are not supported: -.IP "" 4 -.BR \-r , -.B \-\-recursive -.IP "" 4 -.BR \-R , -.B \-\-dereference\-recursive -.IP "" 4 -.BR \-d , -.BI \-\-directories= action -.IP "" 4 -.BR \-Z , -.B \-\-null -.IP "" 4 -.BR \-z , -.B \-\-null\-data -.IP "" 4 -.BI \-\-include= glob -.IP "" 4 -.BI \-\-exclude= glob -.IP "" 4 -.BI \-\-exclude\-from= file -.IP "" 4 -.BI \-\-exclude\-dir= glob -.PP -.B xzegrep -is an alias for -.BR "xzgrep \-E" . -.B xzfgrep -is an alias for -.BR "xzgrep \-F" . -.PP -The commands -.BR lzgrep , -.BR lzegrep , -and -.B lzfgrep -are provided for backward compatibility with LZMA Utils. -They are deprecated and will be removed in a future version. -. -.SH EXIT STATUS -.TP -0 -At least one match was found from at least one of the input files. -No errors occurred. -.TP -1 -No matches were found from any of the input files. -No errors occurred. -.TP ->1 -One or more errors occurred. -It is unknown if matches were found. -. -.SH ENVIRONMENT -.TP -.B GREP -If -.B GREP -is set to a non-empty value, -it is used instead of -.BR "grep" , -.BR "grep \-E" , -or -.BR "grep \-F" . -. -.SH "SEE ALSO" -.BR grep (1), -.BR xz (1), -.BR gzip (1), -.BR bzip2 (1), -.BR lzop (1), -.BR zstd (1), -.BR lz4 (1), -.BR zgrep (1) diff --git a/software/src/xz/src/scripts/xzgrep.in b/software/src/xz/src/scripts/xzgrep.in deleted file mode 100644 index c9cd02d..0000000 --- a/software/src/xz/src/scripts/xzgrep.in +++ /dev/null @@ -1,300 +0,0 @@ -#!@POSIX_SHELL@ -# SPDX-License-Identifier: GPL-2.0-or-later - -# xzgrep -- a wrapper around a grep program that decompresses files as needed -# Adapted from a version sent by Charles Levert - -# Copyright (C) 1998, 2001, 2002, 2006, 2007 Free Software Foundation -# Copyright (C) 1993 Jean-loup Gailly - -# Modified for XZ Utils by Andrew Dudman and Lasse Collin. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -@enable_path_for_scripts@ -#SET_PATH - This line is a placeholder to ease patching this script. - -# Instead of unsetting XZ_OPT, just make sure that xz will use file format -# autodetection. This way memory usage limit and thread limit can be -# specified via XZ_OPT. With gzip, bzip2, and lzop it's OK to just unset the -# environment variables. -xz='@xz@ --format=auto' -unset GZIP BZIP BZIP2 LZOP - -case ${0##*/} in - *egrep*) prog=xzegrep; grep=${GREP:-grep -E};; - *fgrep*) prog=xzfgrep; grep=${GREP:-grep -F};; - *) prog=xzgrep; grep=${GREP:-grep};; -esac - -version="$prog (@PACKAGE_NAME@) @PACKAGE_VERSION@" - -usage="Usage: ${0##*/} [OPTION]... [-e] PATTERN [FILE]... -Look for instances of PATTERN in the input FILEs, using their -uncompressed contents if they are compressed. - -OPTIONs are the same as for '$grep'. - -Report bugs to <@PACKAGE_BUGREPORT@>." - -# sed script to escape all ' for the shell, and then (to handle trailing -# newlines correctly) turn trailing X on last line into '. -escape=' - s/'\''/'\''\\'\'''\''/g - $s/X$/'\''/ -' -operands= -have_pat=0 -files_with_matches=0 -files_without_matches=0 -no_filename=0 -with_filename=0 - -# See if -H and --label options are supported (GNU and *BSDs). -if test f:x = "$(eval "echo x | $grep -H --label=f x 2> /dev/null")"; then - grep_supports_label=1 -else - grep_supports_label=0 -fi - -while test $# -ne 0; do - option=$1 - shift - optarg= - - case $option in - (-[0123456789abcdEFGhHiIKlLnoPqrRsTuUvVwxyzZ]*[!0123456789]*) - # Something like -Fiv was specified, that is, $option contains more - # than one option of which the first option (in this example -F) - # doesn't take an argument. Split the first option into a standalone - # argument and continue parsing the rest of the options (in this example, - # replace -Fiv with -iv in the argument list and set option=-F). - # - # If there are digits [0-9] they are treated as if they were a single - # option character because this syntax is an alias for -C for GNU grep. - # For example, "grep -25F" is equivalent to "grep -C25 -F". If only - # digits are specified like "grep -25" we don't get here because the - # above pattern in the case-statement doesn't match such strings. - arg2=-\'$(LC_ALL=C expr "X${option}X" : 'X-.[0-9]*\(.*\)' | - LC_ALL=C sed "$escape") - eval "set -- $arg2 "'${1+"$@"}' - option=$(LC_ALL=C expr "X$option" : 'X\(-.[0-9]*\)');; - (--binary-*=* | --[lm]a*=* | --reg*=*) - # These options require an argument and an argument has been provided - # with the --foo=argument syntax. All is good. - ;; - (-[ABCDefmX] | --binary-* | --file | --[lm]a* | --reg*) - # These options require an argument which should now be in $1. - # If it isn't, display an error and exit. - case ${1?"$option option requires an argument"} in - (*\'*) - optarg=" '"$(printf '%sX\n' "$1" | LC_ALL=C sed "$escape");; - (*) - optarg=" '$1'";; - esac - shift;; - (--) - break;; - (-?*) - ;; - (*) - case $option in - (*\'*) - operands="$operands '"$(printf '%sX\n' "$option" | - LC_ALL=C sed "$escape");; - (*) - operands="$operands '$option'";; - esac - ${POSIXLY_CORRECT+break} - continue;; - esac - - case $option in - (-[drRzZ] | --di* | --exc* | --inc* | --rec* | --nu*) - printf >&2 '%s: %s: Option not supported\n' "$0" "$option" - exit 2;; - (-[ef]* | --file | --file=* | --reg*) - have_pat=1;; - (--h | --he | --hel | --help) - printf '%s\n' "$usage" || exit 2 - exit;; - (-H | --wi | --wit | --with | --with- | --with-f | --with-fi \ - | --with-fil | --with-file | --with-filen | --with-filena | --with-filenam \ - | --with-filename) - with_filename=1 - continue;; - (-l | --files-with-*) - files_with_matches=1 - continue;; - (-L | --files-witho*) - files_without_matches=1 - continue;; - (-h | --no-f*) - no_filename=1;; - (-V | --v | --ve | --ver | --vers | --versi | --versio | --version) - printf '%s\n' "$version" || exit 2 - exit;; - esac - - case $option in - (*\'?*) - option=\'$(printf '%sX\n' "$option" | LC_ALL=C sed "$escape");; - (*) - option="'$option'";; - esac - - grep="$grep $option$optarg" -done - -eval "set -- $operands "'${1+"$@"}' - -if test $have_pat -eq 0; then - case ${1?"Missing pattern; try '${0##*/} --help' for help"} in - (*\'*) - grep="$grep -e '"$(printf '%sX\n' "$1" | LC_ALL=C sed "$escape");; - (*) - grep="$grep -e '$1'";; - esac - shift -fi - -if test $# -eq 0; then - set -- - -fi - -exec 3>&1 - -# res=1 means that no file matched yet -res=1 - -for i; do - case $i in - *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) uncompress="gzip -cdf";; - *[-.]bz2 | *[-.]tbz | *.tbz2) uncompress="bzip2 -cdf";; - *[-.]lzo | *[-.]tzo) uncompress="lzop -cdf";; - *[-.]zst | *[-.]tzst) uncompress="zstd -cdfq";; # zstd needs -q. - *[-.]lz4) uncompress="lz4 -cdf";; - *) uncompress="$xz -cdfqQ";; # -qQ to ignore warnings like unsupp. check. - esac - # xz_status will hold the decompressor's exit status. - # Exit status of grep (and in rare cases, printf or sed) is - # available as the exit status of this assignment command. - xz_status=$( - exec 5>&1 - ($uncompress -- "$i" 5>&-; echo $? >&5) 3>&- | - if test $files_with_matches -eq 1; then - eval "$grep -q" && { printf '%s\n' "$i" || exit 2; } - elif test $files_without_matches -eq 1; then - eval "$grep -q" || { - r=$? - if test $r -eq 1; then - printf '%s\n' "$i" || r=2 - fi - exit $r - } - elif test $with_filename -eq 0 && - { test $# -eq 1 || test $no_filename -eq 1; }; then - eval "$grep" - elif test $grep_supports_label -eq 1; then - # The grep implementation in use allows us to specify the filename - # that grep will prefix to the output lines. This is faster and - # less prone to security bugs than the fallback method that uses sed. - # This also avoids confusing output with GNU grep >= 3.5 (2020-09-27) - # which prints "binary file matches" to stderr instead of stdout. - # - # If reading from stdin, let grep use whatever name it prefers for - # stdin. With GNU grep it is a locale-specific translated string. - if test "x$i" = "x-"; then - eval "$grep -H" - else - eval "$grep -H --label \"\$i\"" - fi - else - # Append a colon so that the last character will never be a newline - # which would otherwise get lost in shell command substitution. - i="$i:" - - # Escape & \ | and newlines only if such characters are present - # (speed optimization). - case $i in - (*' -'* | *'&'* | *'\'* | *'|'*) - # If sed fails, set i to a known safe string to ensure that - # failing sed did not create a half-escaped dangerous string. - i=$(printf '%s\n' "$i" | LC_ALL=C sed 's/[&\|]/\\&/g; $!s/$/\\/') || - i='(unknown filename):';; - esac - - # $i already ends with a colon so do not add it here. - sed_script="s|^|$i|" - - # If grep or sed fails, pick the larger value of the two exit statuses. - # If sed fails, use at least 2 since we use >= 2 to indicate errors. - r=$( - exec 4>&1 - (eval "$grep" 4>&-; echo $? >&4) 3>&- | - LC_ALL=C sed "$sed_script" >&3 4>&- - ) || { - sed_status=$? - test "$sed_status" -lt 2 && sed_status=2 - test "$r" -lt "$sed_status" && r=$sed_status - } - exit $r - fi >&3 5>&- - ) - r=$? - - # If grep or sed or other non-decompression command failed with a signal, - # exit immediately and ignore the possible remaining files. - # - # NOTE: Instead of 128 + signal_number, some shells use - # 256 + signal_number (ksh) or 384 + signal_number (yash). - # This is fine for us since their "exit" and "kill -l" commands take - # this into account. (At least the versions I tried do but there is - # a report of an old ksh variant whose "exit" truncates the exit status - # to 8 bits without any special handling for values indicating a signal.) - test "$r" -ge 128 && exit "$r" - - if test -z "$xz_status"; then - # Something unusual happened, for example, we got a signal and - # the exit status of the decompressor was never echoed and thus - # $xz_status is empty. Exit immediately and ignore the possible - # remaining files. - exit 2 - elif test "$xz_status" -ge 128; then - # The decompressor died due to a signal. SIGPIPE is ignored since it can - # occur if grep exits before the whole file has been decompressed (grep -q - # can do that). If the decompressor died with some other signal, exit - # immediately and ignore the possible remaining files. - test "$(kill -l "$xz_status" 2> /dev/null)" != "PIPE" && exit "$xz_status" - elif test "$xz_status" -gt 0; then - # Decompression failed but we will continue with the remaining - # files anyway. Set exit status to at least 2 to indicate an error. - test "$r" -lt 2 && r=2 - fi - - # Since res=1 is the initial value, we only need to care about - # matches (r == 0) and errors (r >= 2) here; r == 1 can be ignored. - if test "$r" -ge 2; then - # An error occurred in decompressor, grep, or some other command. Update - # res unless a larger error code has been seen with an earlier file. - test "$res" -lt "$r" && res=$r - elif test "$r" -eq 0; then - # grep found a match and no errors occurred. Update res if no errors have - # occurred with earlier files. - test "$res" -eq 1 && res=0 - fi -done - -# 0: At least one file matched and no errors occurred. -# 1: No matches were found and no errors occurred. -# >=2: Error. It's unknown if matches were found. -exit "$res" diff --git a/software/src/xz/src/scripts/xzless.1 b/software/src/xz/src/scripts/xzless.1 deleted file mode 100644 index 17118b9..0000000 --- a/software/src/xz/src/scripts/xzless.1 +++ /dev/null @@ -1,69 +0,0 @@ -.\" SPDX-License-Identifier: 0BSD -.\" -.\" Authors: Andrew Dudman -.\" Lasse Collin -.\" -.\" (Note that this file is not based on gzip's zless.1.) -.\" -.TH XZLESS 1 "2025-03-06" "Tukaani" "XZ Utils" -.SH NAME -xzless, lzless \- view xz or lzma compressed (text) files -.SH SYNOPSIS -.B xzless -.RI [ file ...] -.br -.B lzless -.RI [ file ...] -(DEPRECATED) -.SH DESCRIPTION -.B xzless -is a filter that displays text from compressed files to a terminal. -Files supported by -.BR xz (1) -are decompressed; -other files are assumed to be in uncompressed form already. -If no -.I files -are given, -.B xzless -reads from standard input. -.PP -.B xzless -uses -.BR less (1) -to present its output. -Unlike -.BR xzmore , -its choice of pager cannot be altered by -setting an environment variable. -Commands are based on both -.BR more (1) -and -.BR vi (1) -and allow back and forth movement and searching. -See the -.BR less (1) -manual for more information. -.PP -The command named -.B lzless -is provided for backward compatibility with LZMA Utils. -It is deprecated and will be removed in a future version. -.SH ENVIRONMENT -.TP -.B LESSMETACHARS -A list of characters special to the shell. -Set by -.B xzless -unless it is already set in the environment. -.TP -.B LESSOPEN -Set to a command line to invoke the -.BR xz (1) -decompressor for preprocessing the input files to -.BR less (1). -.SH "SEE ALSO" -.BR less (1), -.BR xz (1), -.BR xzmore (1), -.BR zless (1) diff --git a/software/src/xz/src/scripts/xzless.in b/software/src/xz/src/scripts/xzless.in deleted file mode 100644 index 6346966..0000000 --- a/software/src/xz/src/scripts/xzless.in +++ /dev/null @@ -1,74 +0,0 @@ -#!@POSIX_SHELL@ -# SPDX-License-Identifier: GPL-2.0-or-later - -# Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation - -# The original version for gzip was written by Paul Eggert. -# Modified for XZ Utils by Andrew Dudman and Lasse Collin. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -@enable_path_for_scripts@ -#SET_PATH - This line is a placeholder to ease patching this script. - -# Instead of unsetting XZ_OPT, just make sure that xz will use file format -# autodetection. This way memory usage limit and thread limit can be -# specified via XZ_OPT. -xz='@xz@ --format=auto' - -version='xzless (@PACKAGE_NAME@) @PACKAGE_VERSION@' - -usage="Usage: ${0##*/} [OPTION]... [FILE]... -Like 'less', but operate on the uncompressed contents of xz compressed FILEs. - -Options are the same as for 'less'. - -Report bugs to <@PACKAGE_BUGREPORT@>." - -case $1 in - --help) printf '%s\n' "$usage" || exit 2; exit;; - --version) printf '%s\n' "$version" || exit 2; exit;; -esac - -if test "${LESSMETACHARS+set}" != set; then - # Work around a bug in less 394 and earlier; - # it mishandles the metacharacters '$%=~'. - space=' ' - tab=' ' - nl=' -' - LESSMETACHARS="$space$tab$nl'"';*?"()<>[|&^`#\$%=~' -fi - -VER=$(less -V | { read _ ver _ && echo ${ver%%.*}; }) -if test "$VER" -ge 451; then - # less 451 or later: If the compressed file is valid but has - # zero bytes of uncompressed data, using two vertical bars ||- makes - # "less" check the exit status of xz and if it is zero then display - # an empty file. With a single vertical bar |- and no output from xz, - # "less" would attempt to display the raw input file instead. - LESSOPEN="||-$xz -cdfqQ -- %s" -elif test "$VER" -ge 429; then - # less 429 or later: LESSOPEN pipe will be used on - # standard input if $LESSOPEN begins with |-. - LESSOPEN="|-$xz -cdfqQ -- %s" -else - LESSOPEN="|$xz -cdfqQ -- %s" -fi - -SHOW_PREPROC_ERRORS= -if test "$VER" -ge 632; then - SHOW_PREPROC_ERRORS=--show-preproc-errors -fi - -export LESSMETACHARS LESSOPEN - -exec less $SHOW_PREPROC_ERRORS "$@" diff --git a/software/src/xz/src/scripts/xzmore.1 b/software/src/xz/src/scripts/xzmore.1 deleted file mode 100644 index 8a0e21c..0000000 --- a/software/src/xz/src/scripts/xzmore.1 +++ /dev/null @@ -1,69 +0,0 @@ -.\" SPDX-License-Identifier: 0BSD -.\" -.\" Authors: Andrew Dudman -.\" Lasse Collin -.\" -.\" (Note that this file is based on xzless.1 instead of gzip's zmore.1.) -.\" -.TH XZMORE 1 "2025-03-06" "Tukaani" "XZ Utils" -.SH NAME -xzmore, lzmore \- view xz or lzma compressed (text) files -. -.SH SYNOPSIS -.B xzmore -.RI [ file ...] -.br -.B lzmore -.RI [ file ...] -(DEPRECATED) -. -.SH DESCRIPTION -.B xzmore -displays text from compressed files to a terminal using -.BR more (1). -Files supported by -.BR xz (1) -are decompressed; -other files are assumed to be in uncompressed form already. -If no -.I files -are given, -.B xzmore -reads from standard input. -See the -.BR more (1) -manual for the keyboard commands. -.PP -Note that scrolling backwards might not be possible -depending on the implementation of -.BR more (1). -This is because -.B xzmore -uses a pipe to pass the decompressed data to -.BR more (1). -.BR xzless (1) -uses -.BR less (1) -which provides more advanced features. -.PP -The command -.B lzmore -is provided for backward compatibility with LZMA Utils. -It is deprecated and will be removed in a future version. -. -.SH ENVIRONMENT -.TP -.\" TRANSLATORS: Don't translate the uppercase PAGER. -.\" It is a name of an environment variable. -.B PAGER -If -.B PAGER -is set, -its value is used as the pager instead of -.BR more (1). -. -.SH "SEE ALSO" -.BR more (1), -.BR xz (1), -.BR xzless (1), -.BR zmore (1) diff --git a/software/src/xz/src/scripts/xzmore.in b/software/src/xz/src/scripts/xzmore.in deleted file mode 100644 index c571913..0000000 --- a/software/src/xz/src/scripts/xzmore.in +++ /dev/null @@ -1,80 +0,0 @@ -#!@POSIX_SHELL@ -# SPDX-License-Identifier: GPL-2.0-or-later - -# Copyright (C) 2001, 2002, 2007 Free Software Foundation -# Copyright (C) 1992, 1993 Jean-loup Gailly - -# Modified for XZ Utils by Andrew Dudman and Lasse Collin. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -@enable_path_for_scripts@ -#SET_PATH - This line is a placeholder to ease patching this script. - -# Instead of unsetting XZ_OPT, just make sure that xz will use file format -# autodetection. This way memory usage limit and thread limit can be -# specified via XZ_OPT. -xz='@xz@ --format=auto' - -version='xzmore (@PACKAGE_NAME@) @PACKAGE_VERSION@' - -usage="Usage: ${0##*/} [OPTION]... [FILE]... -Like 'more', but operate on the uncompressed contents of xz compressed FILEs. - -Report bugs to <@PACKAGE_BUGREPORT@>." - -case $1 in - --help) printf '%s\n' "$usage" || exit 2; exit;; - --version) printf '%s\n' "$version" || exit 2; exit;; -esac - -oldtty=`stty -g 2>/dev/null` -if stty -cbreak 2>/dev/null; then - cb='cbreak'; ncb='-cbreak' -else - # 'stty min 1' resets eof to ^a on both SunOS and SysV! - cb='min 1 -icanon'; ncb='icanon eof ^d' -fi -if test $? -eq 0 && test -n "$oldtty"; then - trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15 -else - trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15 -fi - -if test $# = 0; then - if test -t 0; then - printf '%s\n' "$usage"; exit 1 - else - $xz -cdfqQ | eval "${PAGER:-more}" - fi -else - FIRST=1 - for FILE; do - < "$FILE" || continue - if test $FIRST -eq 0; then - printf "%s--More--(Next file: %s)" "" "$FILE" - stty $cb -echo 2>/dev/null - ANS=`dd bs=1 count=1 2>/dev/null` - stty $ncb echo 2>/dev/null - echo " " - case "$ANS" in - [eq]) exit;; - esac - fi - if test "$ANS" != 's'; then - printf '%s\n' "------> $FILE <------" - $xz -cdfqQ -- "$FILE" | eval "${PAGER:-more}" - fi - if test -t 1; then - FIRST=0 - fi - done -fi