From de182507fb63a659de324fcc2d0dab740d2d1842 Mon Sep 17 00:00:00 2001 From: "shaoding.zw" Date: Thu, 17 Sep 2026 15:35:52 +0800 Subject: [PATCH] test(test): add paper reproduction suite under benchmarks/paper Archive the workloads, scripts, runtime build notes, and reference results needed to reproduce the Evaluation section of the DTVM paper: contract microbenchmarks (sources + hex artifacts + methodology), PolyBench/C 30 cases, WAPM 20 cases (plus fortune rerun substitute), fib/integer-overflow cases, TTFI reproduction guides, trimmed raw result tables, and plotting scripts. Large artifacts (.wasm/.expected/ .time) are tracked via Git LFS. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .gitattributes | 5 + .gitignore | 15 + benchmarks/paper/ENVIRONMENT.md | 108 + benchmarks/paper/README.md | 77 + benchmarks/paper/REPRODUCE.md | 152 + benchmarks/paper/SOURCES.md | 34 + benchmarks/paper/VERSIONS.md | 157 + benchmarks/paper/benchmarks/README.md | 32 + .../paper/benchmarks/contracts/CALLS.md | 73 + .../paper/benchmarks/contracts/MANIFEST.md | 69 + .../paper/benchmarks/contracts/README.md | 35 + .../paper/benchmarks/contracts/REPRODUCE.md | 146 + .../paper/benchmarks/contracts/SHA256SUMS | 53 + .../contracts/bench_bytecode/c_erc20_wasm.hex | 1 + .../contracts/bench_bytecode/c_fib_wasm.hex | 1 + .../contracts/bench_bytecode/counter_evm.hex | 1 + .../contracts/bench_bytecode/ecdsa_evm.hex | 1 + .../contracts/bench_bytecode/erc1155_evm.hex | 1 + .../contracts/bench_bytecode/erc20_evm.hex | 1 + .../contracts/bench_bytecode/erc721_evm.hex | 1 + .../contracts/bench_bytecode/fib_evm.hex | 1 + .../bench_bytecode/generative_nft_evm.hex | 1 + .../contracts/bench_bytecode/merkle_evm.hex | 1 + .../contracts/bench_bytecode/poseidon_evm.hex | 1 + .../bench_bytecode/sol_counter_wasm.hex | 1 + .../bench_bytecode/sol_ecdsa_wasm.hex | 1 + .../bench_bytecode/sol_erc1155_wasm.hex | 1 + .../bench_bytecode/sol_erc20_wasm.hex | 1 + .../bench_bytecode/sol_erc721_wasm.hex | 1 + .../contracts/bench_bytecode/sol_fib_wasm.hex | 1 + .../sol_generative_nft_wasm.hex | 1 + .../bench_bytecode/sol_merkle_wasm.hex | 1 + .../bench_bytecode/sol_poseidon_wasm.hex | 1 + .../sol_uniswapv2_factory_wasm.hex | 1 + .../sol_uniswapv2_router_wasm.hex | 1 + .../bench_bytecode/uniswapv2_erc20_evm.hex | 1 + .../bench_bytecode/uniswapv2_factory_evm.hex | 1 + .../bench_bytecode/uniswapv2_router_evm.hex | 1 + .../bench_contract/counter/counter.sol | 14 + .../bench_contract/counter/counter.wasm | 3 + .../contracts/bench_contract/ecdsa/Errors.sol | 34 + .../contracts/bench_contract/ecdsa/Math.sol | 749 ++++ .../contracts/bench_contract/ecdsa/P256.sol | 370 ++ .../contracts/bench_contract/ecdsa/Panic.sol | 57 + .../bench_contract/ecdsa/SafeCast.sol | 1162 ++++++ .../contracts/bench_contract/ecdsa/ecdsa.sol | 20 + .../contracts/bench_contract/ecdsa/ecdsa.wasm | 3 + .../bench_contract/erc1155/erc1155.sol | 37 + .../bench_contract/erc1155/erc1155.wasm | 3 + .../bench_contract/erc1155/sol_erc1155.wasm | 3 + .../contracts/bench_contract/erc20/erc20.sol | 13 + .../contracts/bench_contract/erc20/erc20.wasm | 3 + .../bench_contract/erc20/sol_erc20.wasm | 3 + .../bench_contract/erc721/erc721.sol | 17 + .../bench_contract/erc721/erc721.wasm | 3 + .../bench_contract/erc721/sol_erc721.wasm | 3 + .../bench_contract/fibonacci/c_fib.wasm | 3 + .../bench_contract/fibonacci/fib.sol | 20 + .../bench_contract/fibonacci/fib.wasm | 3 + .../bench_contract/fibonacci/sol_fib.wasm | 3 + .../generative_nft/GenerativeNFT.sol | 31 + .../generative_nft/GenerativeNFT.wasm | 3 + .../bench_contract/merkle/MerkleProof.sol | 50 + .../bench_contract/merkle/MerkleProof.wasm | 3 + .../bench_contract/poseidon/Poseidon.wasm | 3 + .../bench_contract/poseidon/poseidon.sol | 82 + benchmarks/paper/benchmarks/fib/README.md | 19 + benchmarks/paper/benchmarks/fib/fib.c.wasm | 3 + benchmarks/paper/benchmarks/fib/fib.sol | 37 + benchmarks/paper/benchmarks/fib/fib.wasm | 3 + .../benchmarks/fib/fib_no_contract.c.wasm | 3 + benchmarks/paper/benchmarks/fib/md5.c | 51 + .../paper/benchmarks/overflow/README.md | 37 + .../overflow/REPRODUCE_fib_overflow_5way.md | 166 + benchmarks/paper/benchmarks/overflow/build.sh | 36 + .../benchmarks/overflow/fib_recursive.cpp | 27 + .../overflow/fib_recursive_invoke.wasm | 3 + .../overflow/fib_recursive_main.wasm | 3 + .../benchmarks/overflow/perf_test_fib.cpp | 65 + .../overflow/perf_test_fib_invoke.wasm | 3 + .../overflow/perf_test_fib_iter.cpp | 54 + .../overflow/perf_test_fib_iter_invoke.wasm | 3 + .../overflow/perf_test_fib_iter_unrolled.cpp | 72 + .../overflow/perf_test_fib_iter_unrolled.wasm | 3 + .../overflow/perf_test_fib_main.wasm | 3 + .../overflow/perf_test_swap_pool.cpp | 187 + .../overflow/perf_test_swap_pool_dtvm_O0.wasm | 3 + .../overflow/perf_test_swap_pool_dtvm_O1.wasm | 3 + .../overflow/perf_test_swap_pool_dtvm_O2.wasm | 3 + .../overflow/perf_test_swap_pool_dtvm_g.wasm | 3 + .../perf_test_swap_pool_non_dtvm_O0.wasm | 3 + .../perf_test_swap_pool_non_dtvm_O1.wasm | 3 + .../perf_test_swap_pool_non_dtvm_O2.wasm | 3 + .../perf_test_swap_pool_non_dtvm_g.wasm | 3 + .../perf_test_swap_pool_wasmer_O0.wasm | 3 + .../perf_test_swap_pool_wasmer_O1.wasm | 3 + .../perf_test_swap_pool_wasmer_O2.wasm | 3 + .../perf_test_swap_pool_wasmer_g.wasm | 3 + .../paper/benchmarks/overflow/run_dtvm.sh | 84 + .../benchmarks/overflow/run_wasmtime45.sh | 82 + .../paper/benchmarks/polybenchc/2mm.wasm | 3 + .../paper/benchmarks/polybenchc/3mm.wasm | 3 + .../paper/benchmarks/polybenchc/BUILD.md | 175 + .../paper/benchmarks/polybenchc/MANIFEST.md | 51 + .../paper/benchmarks/polybenchc/README.md | 41 + .../paper/benchmarks/polybenchc/SHA256SUMS | 30 + .../paper/benchmarks/polybenchc/__init__.py | 0 .../paper/benchmarks/polybenchc/adi.wasm | 3 + .../paper/benchmarks/polybenchc/atax.wasm | 3 + .../benchmarks/polybenchc/atax.wasm.expected | 3 + .../benchmarks/polybenchc/atax_config.py | 4 + .../paper/benchmarks/polybenchc/bicg.wasm | 3 + .../benchmarks/polybenchc/bicg.wasm.expected | 3 + .../benchmarks/polybenchc/bicg_config.py | 4 + .../paper/benchmarks/polybenchc/build.sh | 123 + .../paper/benchmarks/polybenchc/cholesky.wasm | 3 + .../polybenchc/cholesky.wasm.expected | 3 + .../benchmarks/polybenchc/cholesky_config.py | 4 + .../paper/benchmarks/polybenchc/config.py | 11 + .../benchmarks/polybenchc/correlation.wasm | 3 + .../benchmarks/polybenchc/covariance.wasm | 3 + .../paper/benchmarks/polybenchc/deriche.wasm | 3 + .../paper/benchmarks/polybenchc/doitgen.wasm | 3 + .../paper/benchmarks/polybenchc/durbin.wasm | 3 + .../polybenchc/durbin.wasm.expected | 3 + .../benchmarks/polybenchc/durbin_config.py | 4 + .../paper/benchmarks/polybenchc/fdtd-2d.wasm | 3 + .../benchmarks/polybenchc/floyd-warshall.wasm | 3 + .../paper/benchmarks/polybenchc/gemm.wasm | 3 + .../paper/benchmarks/polybenchc/gemver.wasm | 3 + .../polybenchc/gemver.wasm.expected | 3 + .../benchmarks/polybenchc/gemver_config.py | 4 + .../paper/benchmarks/polybenchc/gesummv.wasm | 3 + .../polybenchc/gesummv.wasm.expected | 3 + .../benchmarks/polybenchc/gesummv_config.py | 4 + .../benchmarks/polybenchc/gramschmidt.wasm | 3 + .../paper/benchmarks/polybenchc/heat-3d.wasm | 3 + .../paper/benchmarks/polybenchc/iwasm.conf | 1 + .../benchmarks/polybenchc/jacobi-2d.wasm | 3 + .../benchmarks/polybenchc/jacobi_1d.wasm | 3 + .../polybenchc/jacobi_1d.wasm.expected | 3 + .../benchmarks/polybenchc/jacobi_1d_config.py | 4 + .../paper/benchmarks/polybenchc/lu.wasm | 3 + .../benchmarks/polybenchc/lu.wasm.expected | 3 + .../paper/benchmarks/polybenchc/lu_config.py | 4 + .../paper/benchmarks/polybenchc/ludcmp.wasm | 3 + .../polybenchc/ludcmp.wasm.expected | 3 + .../benchmarks/polybenchc/ludcmp_config.py | 4 + .../paper/benchmarks/polybenchc/mvt.wasm | 3 + .../benchmarks/polybenchc/mvt.wasm.expected | 3 + .../paper/benchmarks/polybenchc/mvt_config.py | 4 + .../paper/benchmarks/polybenchc/nussinov.wasm | 3 + .../polybenchc/polybench-wasm-patch.h | 45 + .../polybenchc/runtest_polybench.sh | 56 + .../benchmarks/polybenchc/seidel-2d.wasm | 3 + .../paper/benchmarks/polybenchc/symm.wasm | 3 + .../paper/benchmarks/polybenchc/syr2k.wasm | 3 + .../paper/benchmarks/polybenchc/syrk.wasm | 3 + .../paper/benchmarks/polybenchc/trisolv.wasm | 3 + .../polybenchc/trisolv.wasm.expected | 3 + .../benchmarks/polybenchc/trisolv_config.py | 4 + .../paper/benchmarks/polybenchc/trmm.wasm | 3 + benchmarks/paper/benchmarks/wapm/MANIFEST.md | 42 + benchmarks/paper/benchmarks/wapm/README.md | 17 + benchmarks/paper/benchmarks/wapm/SHA256SUMS | 37 + .../paper/benchmarks/wapm/WAPM_REPRODUCE.md | 353 ++ benchmarks/paper/benchmarks/wapm/__init__.py | 0 benchmarks/paper/benchmarks/wapm/amirali.wasm | 3 + .../paper/benchmarks/wapm/amirali.wasm.conf | 1 + .../benchmarks/wapm/amirali.wasm.expected | 3 + .../paper/benchmarks/wapm/base64cli.wasm | 3 + .../paper/benchmarks/wapm/base64cli.wasm.conf | 1 + .../benchmarks/wapm/base64cli.wasm.expected | 3 + .../paper/benchmarks/wapm/base64cli_config.py | 4 + benchmarks/paper/benchmarks/wapm/chkfont.wasm | 3 + .../paper/benchmarks/wapm/chkfont.wasm.conf | 3 + .../benchmarks/wapm/chkfont.wasm.expected | 3 + .../paper/benchmarks/wapm/chkfont_config.py | 5 + .../paper/benchmarks/wapm/code-stock.wasm | 3 + .../benchmarks/wapm/code-stock.wasm.conf | 1 + .../benchmarks/wapm/code-stock.wasm.expected | 3 + benchmarks/paper/benchmarks/wapm/config.py | 7 + benchmarks/paper/benchmarks/wapm/cowsay.wasm | 3 + .../paper/benchmarks/wapm/cowsay.wasm.conf | 2 + .../benchmarks/wapm/cowsay.wasm.expected | 3 + .../paper/benchmarks/wapm/cowsay_config.py | 4 + benchmarks/paper/benchmarks/wapm/dice.wasm | 3 + .../paper/benchmarks/wapm/dice.wasm.conf | 2 + .../paper/benchmarks/wapm/dice.wasm.expected | 3 + .../paper/benchmarks/wapm/dice_config.py | 4 + benchmarks/paper/benchmarks/wapm/echo.wasm | 3 + .../paper/benchmarks/wapm/echo.wasm.conf | 2 + .../paper/benchmarks/wapm/echo.wasm.expected | 3 + .../paper/benchmarks/wapm/echo_config.py | 4 + benchmarks/paper/benchmarks/wapm/erdtree.wasm | 3 + .../paper/benchmarks/wapm/erdtree.wasm.conf | 2 + .../benchmarks/wapm/erdtree.wasm.expected | 3 + .../paper/benchmarks/wapm/erdtree_config.py | 5 + benchmarks/paper/benchmarks/wapm/figlet.wasm | 3 + .../paper/benchmarks/wapm/figlet.wasm.conf | 3 + .../benchmarks/wapm/figlet.wasm.expected | 3 + .../paper/benchmarks/wapm/figlet_config.py | 5 + benchmarks/paper/benchmarks/wapm/fonts/hz.flc | 4 + .../paper/benchmarks/wapm/fonts/koi8r.flc | 128 + .../paper/benchmarks/wapm/fonts/lean.flf | 1691 ++++++++ .../paper/benchmarks/wapm/fonts/mini.flf | 899 ++++ .../paper/benchmarks/wapm/fonts/mnemonic.flf | 3702 +++++++++++++++++ .../paper/benchmarks/wapm/fonts/moscow.flc | 68 + .../paper/benchmarks/wapm/fonts/script.flf | 1493 +++++++ .../paper/benchmarks/wapm/fonts/shadow.flf | 1097 +++++ .../paper/benchmarks/wapm/fonts/slant.flf | 1295 ++++++ .../paper/benchmarks/wapm/fonts/small.flf | 1097 +++++ .../paper/benchmarks/wapm/fonts/smscript.flf | 1097 +++++ .../paper/benchmarks/wapm/fonts/smshadow.flf | 899 ++++ .../paper/benchmarks/wapm/fonts/smslant.flf | 1097 +++++ .../paper/benchmarks/wapm/fonts/standard.flf | 2238 ++++++++++ .../paper/benchmarks/wapm/fonts/term.flf | 600 +++ benchmarks/paper/benchmarks/wapm/fortune.wasm | 3 + .../paper/benchmarks/wapm/fortune.wasm.conf | 1 + benchmarks/paper/benchmarks/wapm/irb.wasm | 3 + .../paper/benchmarks/wapm/irb.wasm.conf | 2 + .../paper/benchmarks/wapm/irb.wasm.expected | 3 + .../paper/benchmarks/wapm/irb_config.py | 4 + benchmarks/paper/benchmarks/wapm/iwasm.conf | 2 + benchmarks/paper/benchmarks/wapm/md5.wasm | 3 + .../paper/benchmarks/wapm/md5.wasm.conf | 2 + .../paper/benchmarks/wapm/md5_config.py | 4 + .../paper/benchmarks/wapm/parallel-small.png | 3 + benchmarks/paper/benchmarks/wapm/pi.wasm | 3 + benchmarks/paper/benchmarks/wapm/pi.wasm.conf | 2 + .../paper/benchmarks/wapm/pi.wasm.expected | 3 + benchmarks/paper/benchmarks/wapm/pi_config.py | 4 + benchmarks/paper/benchmarks/wapm/pkg1.wasm | 3 + .../paper/benchmarks/wapm/pkg1.wasm.conf | 1 + .../paper/benchmarks/wapm/pkg1.wasm.expected | 3 + benchmarks/paper/benchmarks/wapm/qr2text.wasm | 3 + .../paper/benchmarks/wapm/qr2text.wasm.conf | 2 + .../benchmarks/wapm/qr2text.wasm.expected | 3 + .../paper/benchmarks/wapm/qr2text_config.py | 4 + .../paper/benchmarks/wapm/runtest_wapm.sh | 104 + benchmarks/paper/benchmarks/wapm/sam.wasm | 3 + .../paper/benchmarks/wapm/sam.wasm.conf | 2 + .../paper/benchmarks/wapm/sam.wasm.expected | 3 + .../paper/benchmarks/wapm/sam_config.py | 4 + benchmarks/paper/benchmarks/wapm/suggest.wasm | 3 + .../paper/benchmarks/wapm/suggest.wasm.conf | 2 + .../benchmarks/wapm/suggest.wasm.expected | 3 + .../paper/benchmarks/wapm/suggest_config.py | 4 + benchmarks/paper/benchmarks/wapm/tpl.wasm | 3 + .../paper/benchmarks/wapm/tpl.wasm.conf | 2 + .../paper/benchmarks/wapm/tpl.wasm.expected | 3 + .../paper/benchmarks/wapm/tpl_config.py | 5 + benchmarks/paper/benchmarks/wapm/uuid.wasm | 3 + .../paper/benchmarks/wapm/uuid.wasm.conf | 1 + benchmarks/paper/benchmarks/wapm/viu.wasm | 3 + .../paper/benchmarks/wapm/viu.wasm.conf | 3 + .../paper/benchmarks/wapm/viu.wasm.expected | 3 + .../paper/benchmarks/wapm/viu_config.py | 5 + .../paper/benchmarks/wapm/wasmtime.conf | 1 + benchmarks/paper/benchmarks/wapm/zuk.wasm | 3 + .../paper/benchmarks/wapm/zuk.wasm.conf | 2 + .../paper/benchmarks/wapm/zuk_config.py | 4 + benchmarks/paper/docs/POLYBENCH_REPRODUCE.md | 403 ++ .../paper/docs/POLYBENCH_TTFI_REPRODUCE.md | 361 ++ .../paper/docs/WAPM_TTFI_REPRODUCTION.md | 340 ++ benchmarks/paper/docs/XLSX_FORMAT.md | 82 + benchmarks/paper/runtimes/README.md | 36 + benchmarks/paper/runtimes/dtvm/BUILD.md | 76 + benchmarks/paper/runtimes/dtvm/README.md | 33 + benchmarks/paper/runtimes/dtvm/version.txt | 22 + benchmarks/paper/runtimes/dtvm_main/README.md | 41 + .../paper/runtimes/dtvm_main/version.txt | 1 + benchmarks/paper/runtimes/wamr-1.2.3/BUILD.md | 138 + .../paper/runtimes/wamr-1.2.3/README.md | 29 + benchmarks/paper/runtimes/wamr-1.2.3/build.sh | 103 + .../paper/runtimes/wamr-1.2.3/version.txt | 1 + .../paper/runtimes/wasmer-5.0.4/BUILD.md | 30 + .../paper/runtimes/wasmer-5.0.4/README.md | 23 + .../paper/runtimes/wasmer-5.0.4/build.sh | 28 + .../paper/runtimes/wasmer-5.0.4/version.txt | 1 + .../paper/runtimes/wasmer-7.1.0/README.md | 43 + .../paper/runtimes/wasmer-7.1.0/build.sh | 29 + .../paper/runtimes/wasmtime-31.0.0/BUILD.md | 131 + .../paper/runtimes/wasmtime-31.0.0/README.md | 39 + .../paper/runtimes/wasmtime-31.0.0/build.sh | 80 + .../wasmtime-31.0.0/patches/ttfi-report.patch | 163 + .../runtimes/wasmtime-31.0.0/version.txt | 1 + .../paper/runtimes/wasmtime-45.0.0/README.md | 32 + .../paper/runtimes/wasmtime-45.0.0/build.sh | 21 + benchmarks/paper/scripts/README.md | 80 + benchmarks/paper/scripts/avg_compile_time.py | 51 + .../paper/scripts/bench_polybench_timing.sh | 242 ++ .../scripts/build_polybench_ttfi_table.py | 139 + .../paper/scripts/build_wapm_local_table.py | 360 ++ benchmarks/paper/scripts/common.sh | 21 + .../scripts/compare_lazy_runtime_ratios.sh | 250 ++ benchmarks/paper/scripts/infer_lazy_timing.py | 391 ++ .../scripts/run_dtvm_wt_compile_round.sh | 224 + benchmarks/paper/scripts/run_lazy_20.sh | 99 + benchmarks/paper/scripts/run_lazy_paper.sh | 253 ++ benchmarks/paper/scripts/run_lazy_stats.sh | 239 ++ benchmarks/paper/scripts/run_lazy_ttfi_est.sh | 269 ++ benchmarks/paper/scripts/run_polybench.sh | 47 + .../scripts/run_polybench_ttfi_compare.sh | 190 + .../paper/scripts/run_polybench_ttfi_round.sh | 73 + .../scripts/run_wapm_local_full_round.sh | 41 + .../paper/scripts/run_wapm_v45_v71_round.sh | 76 + .../paper/scripts/run_wasmer_ttfi_compare.sh | 238 ++ .../scripts/run_wasmtime_ttfi_compare.sh | 241 ++ .../paper/scripts/setup_polybench_case.sh | 17 + .../scripts/webassembly-testsuites/README.md | 24 + .../configuration/__init__.py | 0 .../configuration/dtvm_config.py | 7 + .../configuration/iwasm_config.py | 6 + .../configuration/runtime_config.py | 7 + .../configuration/suite_config.py | 14 + .../configuration/wasmer_config.py | 5 + .../configuration/wasmtime_config.py | 4 + .../runtest_webassembly.py | 423 ++ 319 files changed, 29870 insertions(+) create mode 100644 benchmarks/paper/ENVIRONMENT.md create mode 100644 benchmarks/paper/README.md create mode 100644 benchmarks/paper/REPRODUCE.md create mode 100644 benchmarks/paper/SOURCES.md create mode 100644 benchmarks/paper/VERSIONS.md create mode 100644 benchmarks/paper/benchmarks/README.md create mode 100644 benchmarks/paper/benchmarks/contracts/CALLS.md create mode 100644 benchmarks/paper/benchmarks/contracts/MANIFEST.md create mode 100644 benchmarks/paper/benchmarks/contracts/README.md create mode 100644 benchmarks/paper/benchmarks/contracts/REPRODUCE.md create mode 100644 benchmarks/paper/benchmarks/contracts/SHA256SUMS create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/c_erc20_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/c_fib_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/counter_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/ecdsa_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/erc1155_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/erc20_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/erc721_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/fib_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/generative_nft_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/merkle_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/poseidon_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_counter_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_ecdsa_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc1155_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc20_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc721_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_fib_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_generative_nft_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_merkle_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_poseidon_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_factory_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_router_wasm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_erc20_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_factory_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_router_evm.hex create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Errors.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Math.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/P256.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Panic.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/SafeCast.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/sol_erc1155.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc20/sol_erc20.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/erc721/sol_erc721.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/c_fib.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/sol_fib.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.sol create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/Poseidon.wasm create mode 100644 benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/poseidon.sol create mode 100644 benchmarks/paper/benchmarks/fib/README.md create mode 100644 benchmarks/paper/benchmarks/fib/fib.c.wasm create mode 100644 benchmarks/paper/benchmarks/fib/fib.sol create mode 100644 benchmarks/paper/benchmarks/fib/fib.wasm create mode 100644 benchmarks/paper/benchmarks/fib/fib_no_contract.c.wasm create mode 100644 benchmarks/paper/benchmarks/fib/md5.c create mode 100644 benchmarks/paper/benchmarks/overflow/README.md create mode 100644 benchmarks/paper/benchmarks/overflow/REPRODUCE_fib_overflow_5way.md create mode 100644 benchmarks/paper/benchmarks/overflow/build.sh create mode 100644 benchmarks/paper/benchmarks/overflow/fib_recursive.cpp create mode 100755 benchmarks/paper/benchmarks/overflow/fib_recursive_invoke.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/fib_recursive_main.wasm create mode 100644 benchmarks/paper/benchmarks/overflow/perf_test_fib.cpp create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_fib_invoke.wasm create mode 100644 benchmarks/paper/benchmarks/overflow/perf_test_fib_iter.cpp create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_invoke.wasm create mode 100644 benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.cpp create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_fib_main.wasm create mode 100644 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool.cpp create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O0.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O1.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O2.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_g.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O0.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O1.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O2.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_g.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O0.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O1.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O2.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_g.wasm create mode 100755 benchmarks/paper/benchmarks/overflow/run_dtvm.sh create mode 100755 benchmarks/paper/benchmarks/overflow/run_wasmtime45.sh create mode 100755 benchmarks/paper/benchmarks/polybenchc/2mm.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/3mm.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/BUILD.md create mode 100644 benchmarks/paper/benchmarks/polybenchc/MANIFEST.md create mode 100644 benchmarks/paper/benchmarks/polybenchc/README.md create mode 100644 benchmarks/paper/benchmarks/polybenchc/SHA256SUMS create mode 100644 benchmarks/paper/benchmarks/polybenchc/__init__.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/adi.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/atax.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/atax.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/atax_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/bicg.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/bicg.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/bicg_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/build.sh create mode 100755 benchmarks/paper/benchmarks/polybenchc/cholesky.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/cholesky.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/cholesky_config.py create mode 100644 benchmarks/paper/benchmarks/polybenchc/config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/correlation.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/covariance.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/deriche.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/doitgen.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/durbin.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/durbin.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/durbin_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/fdtd-2d.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/floyd-warshall.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/gemm.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/gemver.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/gemver.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/gemver_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/gesummv.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/gesummv.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/gesummv_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/gramschmidt.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/heat-3d.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/iwasm.conf create mode 100755 benchmarks/paper/benchmarks/polybenchc/jacobi-2d.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/jacobi_1d_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/lu.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/lu.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/lu_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/ludcmp_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/mvt.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/mvt.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/mvt_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/nussinov.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/polybench-wasm-patch.h create mode 100755 benchmarks/paper/benchmarks/polybenchc/runtest_polybench.sh create mode 100755 benchmarks/paper/benchmarks/polybenchc/seidel-2d.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/symm.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/syr2k.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/syrk.wasm create mode 100755 benchmarks/paper/benchmarks/polybenchc/trisolv.wasm create mode 100644 benchmarks/paper/benchmarks/polybenchc/trisolv.wasm.expected create mode 100644 benchmarks/paper/benchmarks/polybenchc/trisolv_config.py create mode 100755 benchmarks/paper/benchmarks/polybenchc/trmm.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/MANIFEST.md create mode 100644 benchmarks/paper/benchmarks/wapm/README.md create mode 100644 benchmarks/paper/benchmarks/wapm/SHA256SUMS create mode 100644 benchmarks/paper/benchmarks/wapm/WAPM_REPRODUCE.md create mode 100644 benchmarks/paper/benchmarks/wapm/__init__.py create mode 100644 benchmarks/paper/benchmarks/wapm/amirali.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/amirali.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/amirali.wasm.expected create mode 100755 benchmarks/paper/benchmarks/wapm/base64cli.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/base64cli.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/base64cli.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/base64cli_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/chkfont.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/chkfont.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/chkfont.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/chkfont_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/code-stock.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/code-stock.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/code-stock.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/config.py create mode 100755 benchmarks/paper/benchmarks/wapm/cowsay.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/cowsay.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/cowsay.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/cowsay_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/dice.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/dice.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/dice.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/dice_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/echo.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/echo.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/echo.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/echo_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/erdtree.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/erdtree.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/erdtree.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/erdtree_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/figlet.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/figlet.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/figlet.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/figlet_config.py create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/hz.flc create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/koi8r.flc create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/lean.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/mini.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/mnemonic.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/moscow.flc create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/script.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/shadow.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/slant.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/small.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/smscript.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/smshadow.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/smslant.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/standard.flf create mode 100644 benchmarks/paper/benchmarks/wapm/fonts/term.flf create mode 100755 benchmarks/paper/benchmarks/wapm/fortune.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/fortune.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/irb.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/irb.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/irb.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/irb_config.py create mode 100644 benchmarks/paper/benchmarks/wapm/iwasm.conf create mode 100755 benchmarks/paper/benchmarks/wapm/md5.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/md5.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/md5_config.py create mode 100644 benchmarks/paper/benchmarks/wapm/parallel-small.png create mode 100755 benchmarks/paper/benchmarks/wapm/pi.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/pi.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/pi.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/pi_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/pkg1.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/pkg1.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/pkg1.wasm.expected create mode 100755 benchmarks/paper/benchmarks/wapm/qr2text.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/qr2text.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/qr2text.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/qr2text_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/runtest_wapm.sh create mode 100755 benchmarks/paper/benchmarks/wapm/sam.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/sam.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/sam.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/sam_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/suggest.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/suggest.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/suggest.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/suggest_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/tpl.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/tpl.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/tpl.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/tpl_config.py create mode 100755 benchmarks/paper/benchmarks/wapm/uuid.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/uuid.wasm.conf create mode 100755 benchmarks/paper/benchmarks/wapm/viu.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/viu.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/viu.wasm.expected create mode 100644 benchmarks/paper/benchmarks/wapm/viu_config.py create mode 100644 benchmarks/paper/benchmarks/wapm/wasmtime.conf create mode 100644 benchmarks/paper/benchmarks/wapm/zuk.wasm create mode 100644 benchmarks/paper/benchmarks/wapm/zuk.wasm.conf create mode 100644 benchmarks/paper/benchmarks/wapm/zuk_config.py create mode 100644 benchmarks/paper/docs/POLYBENCH_REPRODUCE.md create mode 100644 benchmarks/paper/docs/POLYBENCH_TTFI_REPRODUCE.md create mode 100644 benchmarks/paper/docs/WAPM_TTFI_REPRODUCTION.md create mode 100644 benchmarks/paper/docs/XLSX_FORMAT.md create mode 100644 benchmarks/paper/runtimes/README.md create mode 100644 benchmarks/paper/runtimes/dtvm/BUILD.md create mode 100644 benchmarks/paper/runtimes/dtvm/README.md create mode 100644 benchmarks/paper/runtimes/dtvm/version.txt create mode 100644 benchmarks/paper/runtimes/dtvm_main/README.md create mode 100644 benchmarks/paper/runtimes/dtvm_main/version.txt create mode 100644 benchmarks/paper/runtimes/wamr-1.2.3/BUILD.md create mode 100644 benchmarks/paper/runtimes/wamr-1.2.3/README.md create mode 100755 benchmarks/paper/runtimes/wamr-1.2.3/build.sh create mode 100644 benchmarks/paper/runtimes/wamr-1.2.3/version.txt create mode 100644 benchmarks/paper/runtimes/wasmer-5.0.4/BUILD.md create mode 100644 benchmarks/paper/runtimes/wasmer-5.0.4/README.md create mode 100755 benchmarks/paper/runtimes/wasmer-5.0.4/build.sh create mode 100644 benchmarks/paper/runtimes/wasmer-5.0.4/version.txt create mode 100644 benchmarks/paper/runtimes/wasmer-7.1.0/README.md create mode 100755 benchmarks/paper/runtimes/wasmer-7.1.0/build.sh create mode 100644 benchmarks/paper/runtimes/wasmtime-31.0.0/BUILD.md create mode 100644 benchmarks/paper/runtimes/wasmtime-31.0.0/README.md create mode 100755 benchmarks/paper/runtimes/wasmtime-31.0.0/build.sh create mode 100644 benchmarks/paper/runtimes/wasmtime-31.0.0/patches/ttfi-report.patch create mode 100644 benchmarks/paper/runtimes/wasmtime-31.0.0/version.txt create mode 100644 benchmarks/paper/runtimes/wasmtime-45.0.0/README.md create mode 100755 benchmarks/paper/runtimes/wasmtime-45.0.0/build.sh create mode 100644 benchmarks/paper/scripts/README.md create mode 100644 benchmarks/paper/scripts/avg_compile_time.py create mode 100755 benchmarks/paper/scripts/bench_polybench_timing.sh create mode 100644 benchmarks/paper/scripts/build_polybench_ttfi_table.py create mode 100755 benchmarks/paper/scripts/build_wapm_local_table.py create mode 100644 benchmarks/paper/scripts/common.sh create mode 100755 benchmarks/paper/scripts/compare_lazy_runtime_ratios.sh create mode 100755 benchmarks/paper/scripts/infer_lazy_timing.py create mode 100755 benchmarks/paper/scripts/run_dtvm_wt_compile_round.sh create mode 100755 benchmarks/paper/scripts/run_lazy_20.sh create mode 100755 benchmarks/paper/scripts/run_lazy_paper.sh create mode 100755 benchmarks/paper/scripts/run_lazy_stats.sh create mode 100755 benchmarks/paper/scripts/run_lazy_ttfi_est.sh create mode 100755 benchmarks/paper/scripts/run_polybench.sh create mode 100755 benchmarks/paper/scripts/run_polybench_ttfi_compare.sh create mode 100755 benchmarks/paper/scripts/run_polybench_ttfi_round.sh create mode 100755 benchmarks/paper/scripts/run_wapm_local_full_round.sh create mode 100755 benchmarks/paper/scripts/run_wapm_v45_v71_round.sh create mode 100755 benchmarks/paper/scripts/run_wasmer_ttfi_compare.sh create mode 100755 benchmarks/paper/scripts/run_wasmtime_ttfi_compare.sh create mode 100755 benchmarks/paper/scripts/setup_polybench_case.sh create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/README.md create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/__init__.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/dtvm_config.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/iwasm_config.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/runtime_config.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/suite_config.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmer_config.py create mode 100644 benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmtime_config.py create mode 100755 benchmarks/paper/scripts/webassembly-testsuites/runtest_webassembly.py diff --git a/.gitattributes b/.gitattributes index 8f9dfcb93..631200c00 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,6 @@ resources/DTVM_paper.pdf filter=lfs diff=lfs merge=lfs -text + +# Paper reproduction benchmark data (benchmarks/paper) +benchmarks/paper/**/*.wasm filter=lfs diff=lfs merge=lfs -text +benchmarks/paper/**/*.expected filter=lfs diff=lfs merge=lfs -text +benchmarks/paper/**/*.png filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 680da3644..8ed2060eb 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,18 @@ bazel-testlogs .claude/* !.claude/skills/ !.claude/skills/** + +# Paper reproduction (benchmarks/paper) generated artifacts +benchmarks/paper/runtimes/*/build/ +benchmarks/paper/runtimes/*/out/ +benchmarks/paper/runtimes/dtvm/dtvm +benchmarks/paper/runtimes/dtvm/CMakeCache.txt +benchmarks/paper/runtimes/dtvm_main/dtvm +benchmarks/paper/runtimes/dtvm_main/CMakeCache.txt +benchmarks/paper/raw_data/ +benchmarks/paper/scripts/webassembly-testsuites/case/ +benchmarks/paper/**/.DS_Store + +# benchmarks/paper python artifacts +benchmarks/paper/**/__pycache__/ +benchmarks/paper/**/*.pyc diff --git a/benchmarks/paper/ENVIRONMENT.md b/benchmarks/paper/ENVIRONMENT.md new file mode 100644 index 000000000..1ddc8c36c --- /dev/null +++ b/benchmarks/paper/ENVIRONMENT.md @@ -0,0 +1,108 @@ +# Experiment Environment and Toolchain + +This file collects the environment and version information that can be **confirmed from the archive**. Anything not present in the reproduction notes, the contract-testbed repository, this repository's docs, or the original lab notes is marked **not recorded** rather than guessed. + +Different benchmark suites may have used different machines or toolchains; the tables below separate the **contract microbenchmark (vm_benchmark)** from the **other paper baselines**. + +--- + +## Checklist (contract vm_benchmark) + +**Test machine (from experiment notes, confirmed):** + +> **Compute-optimized c7, 8C16G, Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz** +> Runtime `/proc/cpuinfo`: **cpu MHz = 2699.998**; **Turbo Boost not enabled** + +| # | Item | Status | Archived evidence | +|---|------|--------|-------------------| +| — | **Machine hardware** | **confirmed** | see above; source: reproduction notes | +| 1 | Original OS version | **not recorded** | the notes give the hardware spec but no Linux distribution or version | +| 2 | Kernel version | **not recorded** | — | +| 3 | Docker / container | **not recorded** | no container usage recorded | +| 4 | Dockerfile / image / env scripts | **partial** | no Dockerfile; the contract bench ran `sh build.sh release.vmbench 6 false 2` inside the contract-testbed repo (see `benchmarks/contracts/REPRODUCE.md`) | +| 5 | Dedicated machine | **not recorded** | — | +| 6 | CPU core pinning | **not recorded** | the notes say the microbenchmark is "serial, 1C is enough"; no `taskset`/pinning command was recorded | +| 7 | Fixed CPU frequency | **partial** | `/proc/cpuinfo` read **cpu MHz ≈ 2699.998** at runtime (archived runner source, not included); no manual `cpufreq` step was recorded | +| 8 | Turbo Boost disabled | **confirmed** | notes: "turbo boost not enabled"; the archived runner source comments also require disabling Turbo Boost on Intel CPUs | +| 9 | CPU governor | **not recorded** | — | +| 10 | OS / runtime cache clearing | **not recorded** | no `drop_caches` step recorded for the contract bench; **State and Module LRU caches are reused** across measurements (see `benchmarks/contracts/REPRODUCE.md` §5) | +| 11 | Background load | **not recorded** | — | +| 12 | Toolchain versions | **partial** | see "contract toolchain" below; **no** solc / hex-compile command versions | + +--- + +## Contract Microbenchmark (vm_benchmark) + +Sources: reproduction notes (2025-04-22 archive) + `benchmarks/contracts/`. + +### Hardware and CPU + +| Item | Value | Source | +|------|-------|--------| +| Cloud instance | compute-optimized **c7, 8C16G** | experiment notes | +| CPU model | Intel Xeon Platinum **8369B** @ **2.70GHz** (nominal) | experiment notes | +| Observed frequency | **2699.998 MHz** (`cpu MHz` in `/proc/cpuinfo`) | experiment notes + archived runner source | +| Turbo Boost | **off** | experiment notes | +| Workload shape | **serial** microbenchmark; the notes state "**1C is enough**", test environment was **8C16G** | experiment notes | +| OS | **Linux** (reads `/proc/cpuinfo`); distribution **not recorded** | code + gap | + +### Repository and DTVM Macros + +| Item | Value | +|------|-------| +| Repository | contract-testbed repository | +| Branch | development branch | +| DTVM build macros | `ZEN_ENABLE_JIT`, `ZEN_ENABLE_SINGLEPASS_JIT`, `ZEN_ENABLE_DWASM`, `ZEN_ENABLE_CHECKED_ARITHMETIC` | + +### Contract Toolchain + +| Tool | Archive status | +|------|----------------| +| **evmone** | pulled in via the testbed's Bazel deps; **no** standalone version pin | +| **DTVM (`dtvm`)** | see the macros above; the `dtvm` binary is built from the DTVM source fork (`VERSIONS.md`) | +| **solc** (hex generation) | **not recorded** | +| **wabt / wat2wasm** | **not used** in the archived contract-bench flow | +| **clang / LLVM** (contract bench itself) | **not recorded** as a standalone version; hex are prebuilt artifacts | + +--- + +## Other Paper Baselines (non-contract) + +The following come from experiment notes / `VERSIONS.md` / the experiment notebook, and **may not** share the contract-bench machine. + +### Comparison Runtimes + +| Runtime | Notes / archived version | Notes | +|---------|--------------------------|-------| +| **Wasmtime** | **31.0.0** ([official x86_64-linux tar.xz](https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz)) | `runtimes/wasmtime-31.0.0/BUILD.md` | +| **Wasmer** | **`v5.0.4`**; the Singlepass comparison also used **`v5.0.5-rc1`** (wasi limitation) | Wasmer is **not pinned** in this repo | +| **WAMR `iwasm`** | **1.2.3** | `runtimes/wamr-1.2.3/` | +| **DTVM `dtvm`** | DTVM source fork (commits in `VERSIONS.md`) | not vanilla WAMR | + +### Build Toolchain (experiment notes / lab notebook) + +| Tool | Version / path | Used for | +|------|----------------|----------| +| **rustc** | **≥ 1.85.0** (Wasmtime build) | Wasmtime baseline | +| **LLVM / clang (DTVM build)** | **15.0.0**, e.g. `/opt/clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4/...` | Coremark / dtvm builds | +| **LLVM (Wasmer build)** | **18.1.7**, e.g. `...-ubuntu-18.04-...` | Wasmer build | +| **WASI SDK clang** | archived wasm metadata: **11.0.0** (27 cases), **14.0.3** (3 cases) | PolyBench (`benchmarks/polybenchc/BUILD.md`) | +| **WAMR AOT LLVM** | **11.1.0** | `runtimes/wamr-1.2.3/BUILD.md` | +| **Emscripten `em++`** | **not pinned** | `benchmarks/overflow/build.sh`, `-O2` | +| **clang (generic wasm example)** | `--target=wasm32` (no version pin) | md5 example in the experiment notebook | + +Coremark self-reports **CLANG 14.0.6** (`-O2`) inside the wasm output — that is the **benchmark program's** compiler, not the host clang used to build DTVM. + +### Cache Handling When Comparing Baselines (non-contract) + +The archive notes that for Wasmtime / Wasmer comparisons one may `rm -rf ~/.cache/wasmtime`, set `WASMTIME_CACHE=0`, or use `wasmer run --cache-dir=/dev/null`. **No corresponding step was recorded for the contract vm_benchmark.** + +--- + +## Related Documents + +| Document | Contents | +|----------|----------| +| [`VERSIONS.md`](VERSIONS.md) | Runtime pins and toolchain summary | +| [`benchmarks/contracts/REPRODUCE.md`](benchmarks/contracts/REPRODUCE.md) | Contract build, run, and measurement methodology | +| [`REPRODUCE.md`](REPRODUCE.md) | Whole-package reproduction skeleton | diff --git a/benchmarks/paper/README.md b/benchmarks/paper/README.md new file mode 100644 index 000000000..0a39ada8b --- /dev/null +++ b/benchmarks/paper/README.md @@ -0,0 +1,77 @@ +# DTVM Paper Reproduction Package + +This directory archives the test cases, benchmark scripts, baseline-runtime build notes, and reference results needed to reproduce every experiment in the Evaluation section of the DTVM paper (`resources/DTVM_paper.pdf`). The material was curated from an experiment archive; the interior layout matches the original package, and every script under `scripts/` treats this directory as its `ROOT`. + +Mainline comparison: **DTVM (multipass / lazy)** vs **Wasmtime 45.0.0** vs **Wasmer 7.1.0 (cranelift / singlepass / llvm)**; the EVM-side baseline is **evmone**. + +## Layout + +``` +benchmarks/paper/ +├── VERSIONS.md # runtime version pins (paper baseline + current mainline) +├── ENVIRONMENT.md # experiment environment and toolchain inventory +├── REPRODUCE.md # reproduction overview (links to per-topic guides) +├── SOURCES.md # provenance and license notes +├── docs/ # per-topic reproduction guides +│ ├── POLYBENCH_REPRODUCE.md # PolyBench wall-clock +│ ├── POLYBENCH_TTFI_REPRODUCE.md # PolyBench TTFI +│ └── WAPM_TTFI_REPRODUCTION.md # WAPM TTFI (wasmtime 45 / wasmer 7.1 backends) +├── runtimes/ # per-runtime BUILD.md / build.sh / version.txt (no binaries) +├── benchmarks/ # paper workloads +│ ├── contracts/ # contract microbenchmark: sol sources + evm/wasm hex (runner source not included) +│ ├── polybenchc/ # PolyBench/C 4.2.1, all 30 cases as wasm + WASI rebuild script +│ ├── wapm/ # 21 WAPM wasm files (paper's 20 cases + fortune) + confs + SHA256SUMS +│ ├── overflow/ # integer-overflow (swap-style) + fib(30) 5-way: C++ source + wasm + scripts +│ └── fib/ # standalone fib / md5 (C/Solidity sources + wasm) +└── scripts/ # benchmark drivers and table generators (incl. testsuite runner) + +`raw_data/` is created by the scripts at run time and is gitignored; this package ships cases and methodology only, no result data. +``` + +## Paper Results → Directory Map + +| Paper result | Experiment | Workloads | Entry point | +|---|---|---|---| +| Fig. "Ethereum Ecosystem" (Fig. 5) | DTVM vs evmone contract latency | `benchmarks/contracts/` (Merkle-MiMC, GenerativeNFT, ERC1155, Counter, ERC20/721, UniswapV2, fib) | `benchmarks/contracts/REPRODUCE.md` | +| Fig. "JIT improvement over Interp" (Fig. 6) | DTVM JIT vs interpreter | `benchmarks/contracts/` + `benchmarks/fib/` | same + `benchmarks/fib/` | +| Fig. "general-purpose Wasm VMs" (Fig. 7) | fib(30) / integer-overflow latency | `benchmarks/overflow/`, `benchmarks/fib/` | `benchmarks/overflow/REPRODUCE_fib_overflow_5way.md` | +| Fig. 8(a) + Appendix PolyBench table | PolyBench 30-case latency | `benchmarks/polybenchc/` | `docs/POLYBENCH_REPRODUCE.md` | +| Fig. 8(b) + Appendix PolyBench TTFI | PolyBench time-to-first-invocation | `benchmarks/polybenchc/` | `docs/POLYBENCH_TTFI_REPRODUCE.md` | +| Fig. 8(b) + Appendix WAPM table | WAPM 20-case TTFI | `benchmarks/wapm/` | `docs/WAPM_TTFI_REPRODUCTION.md`, `benchmarks/wapm/WAPM_REPRODUCE.md` | +| Deterministic-execution table | cross-arch stack-overflow determinism | `tests/wast/dwasm/call_stack_exceed.wast` (already in this repo) | `docs/testing/` | +| Machine-code-size table | compiled-code size comparison | `benchmarks/polybenchc/` + `benchmarks/fib/` | per-topic docs | + + +## Quick Start + +```bash +cd benchmarks/paper +export ROOT=$(pwd) +# 1. Build DTVM at the repo root: +# cmake -B build -DZEN_ENABLE_MULTIPASS_JIT=ON -DLLVM_DIR=/lib/cmake/llvm && cmake --build build +# Scripts default to /build/dtvm; override via the DTVM env var. +# 2. Install baseline runtimes (see docs/_REPRODUCE.md and runtimes//BUILD.md). +# 3. PolyBench wall-clock +./scripts/setup_polybench_case.sh +./scripts/run_polybench.sh dtvm +./scripts/bench_polybench_timing.sh dtvm multipass +# 4. PolyBench TTFI +WASMTIME_CACHE=0 ./scripts/run_polybench_ttfi_round.sh 1 +# 5. WAPM TTFI +WASMTIME_CACHE=0 ./scripts/run_wapm_v45_v71_round.sh 3 +# 6. overflow / fib(30) +cd benchmarks/overflow && bash run_dtvm.sh && bash run_wasmtime45.sh +``` + +## Large Files and Provenance + +- `*.wasm`, `*.expected`, and `*.png` are managed by **Git LFS** (see the root `.gitattributes`). +- Per-suite provenance and integrity: `benchmarks/*/MANIFEST.md`, `benchmarks/*/SHA256SUMS`, `SOURCES.md`. +- Runtime binaries are not committed: `runtimes//` keeps only `BUILD.md` + `build.sh` + `version.txt` (`out/` and `build/` are gitignored). + +## Not Migrated / Archive Gaps + +- Full intermediate data (multi-round timestamped runs, per-runtime CSVs, SVG comparisons) and the raw per-iteration contract timing samples (`.time`) are not included. +- The 9 non-paper WAPM cases and the libsodium (72) / wabench (22) suites were not migrated (see `benchmarks/README.md`). +- The contract microbenchmark runner (`test_vmbench`) builds only inside the contract-testbed repository; the sol→wasm / sol→evm compile commands were not recorded in the archive (see `benchmarks/contracts/README.md`, `SOURCES.md`). +- Other gaps are listed in `SOURCES.md` and `benchmarks/wapm/WAPM_REPRODUCE.md` §2. diff --git a/benchmarks/paper/REPRODUCE.md b/benchmarks/paper/REPRODUCE.md new file mode 100644 index 000000000..dbd969470 --- /dev/null +++ b/benchmarks/paper/REPRODUCE.md @@ -0,0 +1,152 @@ +# Reproduction Guide + +> This package lives at `benchmarks/paper/` in the DTVM repository. All relative paths below (`./scripts/...`, `benchmarks/...`) are rooted at this directory — `cd benchmarks/paper` first. + +This document gives the install and run entry points for the three main experiment groups; details live in `docs/_REPRODUCE.md` and `runtimes//BUILD.md`. + +## Requirements + +- OS: **Linux x86_64** +- Common tools: `cmake` ≥ 3.20, `ninja`, `curl`, `python3`, `taskset` +- DTVM build: GCC C++17, **LLVM 15** (multipass JIT) +- Wasmtime 45 source build: **Rust ≥ stable** (via `rustup`, `source ~/.cargo/env`) +- Wasmer 7.1 LLVM backend: **LLVM 21** (`LLVM_SYS_211_PREFIX` → `LLVM-21.1.x-Linux-X64/`) +- overflow / fib: **Emscripten** (wasm compilation) + +Contract-bench machine (from experiment notes): compute-optimized **c7 8C16G**, Xeon **8369B**, **Turbo Boost off**, observed **cpu MHz ≈ 2699.998**. The full 12-item environment/toolchain checklist is in [`ENVIRONMENT.md`](ENVIRONMENT.md). + +## Step 1 — Install Runtimes + +Each runtime directory keeps only `BUILD.md` + `build.sh` + `version.txt`; binaries are installed to `runtimes//out/` (gitignored). + +### DTVM (dtvm) + +```bash +# Paper PolyBench / WAPM wall-clock: commit 882c83155 +# TTFI mainline: main HEAD (includes "Total compilation time" instrumentation) +# overflow / fib: newest fastest commit (e.g. e532db3e2) +``` + +See [`runtimes/dtvm/BUILD.md`](runtimes/dtvm/BUILD.md). + +### Wasmtime + +| Purpose | Version | Path | +|---------|---------|------| +| Paper PolyBench wall-clock | **31.0.0** | `runtimes/wasmtime-31.0.0/` (includes `patches/ttfi-report.patch`) | +| TTFI / overflow / fib mainline | **45.0.0** | `runtimes/wasmtime-45.0.0/` (source tree must include the TTFI instrumentation) | + +```bash +# 31.0.0: official prebuilt tarball, or build from source +cd runtimes/wasmtime-31.0.0 && ./build.sh all +# 45.0.0: build from an instrumented source tree +WASMER_SRC=/path/to/wasmtime-45.0.0 runtimes/wasmtime-45.0.0/build.sh +``` + +### Wasmer + +| Purpose | Version | Path | +|---------|---------|------| +| Paper PolyBench `wasmer llvm` column | **5.0.4** | `runtimes/wasmer-5.0.4/` | +| TTFI / overflow / fib mainline | **7.1.0** | `runtimes/wasmer-7.1.0/` (cranelift + singlepass + llvm) | + +```bash +# 5.0.4: cranelift + singlepass + llvm (llvm backend needs LLVM 18) +cd runtimes/wasmer-5.0.4 && ./build.sh +# 7.1.0: cranelift + singlepass (default); llvm needs LLVM 21 +LLVM_SYS_211_PREFIX=/path/to/LLVM-21.1.8-Linux-X64 \ + WASMER_SRC=/path/to/wasmer-7.1.0 \ + runtimes/wasmer-7.1.0/build.sh +``` + +### WAMR 1.2.3 (optional, paper interpreter baseline) + +```bash +cd runtimes/wamr-1.2.3 && ./build.sh all +``` + +## Step 2 — Main Experiment Groups + +### 2.1 PolyBench wall-clock (30 cases) + +```bash +./scripts/setup_polybench_case.sh + +# Correctness (once per runtime) +./scripts/run_polybench.sh dtvm +./scripts/run_polybench.sh wasmtime + +# Timing CSV (1 warmup + 3 timed runs) +./scripts/bench_polybench_timing.sh dtvm multipass # mainline +./scripts/bench_polybench_timing.sh dtvm lazy +./scripts/bench_polybench_timing.sh wasmtime default +./scripts/bench_polybench_timing.sh wasmer llvm +``` + +Full procedure, command-line differences, and pitfalls when comparing against `dtvm_polybench.xlsx`: [`docs/POLYBENCH_REPRODUCE.md`](docs/POLYBENCH_REPRODUCE.md). + +### 2.2 PolyBench TTFI (30 cases) + +DTVM `multipass + lazy` vs **Wasmtime 45.0.0** vs **Wasmer 7.1.0 (cranelift / singlepass / llvm)**; the metric is the `Total compilation time` printed on stdout. + +```bash +export DTVM=$PWD/runtimes/dtvm_main/dtvm +export WASMTIME=$PWD/runtimes/wasmtime-45.0.0/out/wasmtime +export WASMER=$PWD/runtimes/wasmer-7.1.0/out/bin/wasmer +export WASMTIME_CACHE=0 +./scripts/run_polybench_ttfi_round.sh 1 +# → raw_data/benchs/polybench_ttfi_/ + polybench_ttfi_compare_latest.{md,csv} +``` + +Details: [`docs/POLYBENCH_TTFI_REPRODUCE.md`](docs/POLYBENCH_TTFI_REPRODUCE.md). + +### 2.3 WAPM TTFI + wall-clock (20 cases) + +```bash +export DTVM=/path/to/DTVM/build/dtvm +export WASMTIME=$PWD/runtimes/wasmtime-45.0.0/out/wasmtime +export WASMER=$PWD/runtimes/wasmer-7.1.0/out/bin/wasmer +export WASMTIME_CACHE=0 +./scripts/run_wapm_v45_v71_round.sh 3 +# → raw_data/benchs/wapm_v45_v71_/ + wapm_v45_v71_latency_table.{md,csv} +``` + +Details: [`docs/WAPM_TTFI_REPRODUCTION.md`](docs/WAPM_TTFI_REPRODUCTION.md) and [`benchmarks/wapm/WAPM_REPRODUCE.md`](benchmarks/wapm/WAPM_REPRODUCE.md). + +### 2.4 Integer overflow + fib(30) (5-way) + +Only the **newest fastest** DTVM commit is used; the other four columns are Wasmtime 45 / Wasmer cranelift / singlepass / llvm. + +```bash +cd benchmarks/overflow +# Compile the wasm (emscripten) — archived artifacts already exist, so this is skippable +bash build.sh +# 5-way benchmark +bash run_dtvm.sh # DTVM +bash run_wasmtime45.sh # Wasmtime 45 + all three Wasmer backends +``` + +Full command lines, the 5-rep median methodology, and per-runtime wasm variants: [`benchmarks/overflow/REPRODUCE_fib_overflow_5way.md`](benchmarks/overflow/REPRODUCE_fib_overflow_5way.md). + +## Step 3 — Collect Raw Data + +Benchmark output is written under `raw_data/benchs/` (generated at run time; gitignored — no result data is shipped). + +## Contract Microbenchmark (ERC20 / Uniswap / Merkle Proof / Generative NFT / …) + +Sources and hex artifacts are archived under `benchmarks/contracts/`. The runner builds only inside the contract-testbed repository: + +```bash +sh build.sh release.vmbench 4 +cd test_run +LD_LIBRARY_PATH=. ./test_vmbench --gtest_filter=VMBenchTest.Erc20Evm +``` + +Newer cases: + +```bash +LD_LIBRARY_PATH=. ./test_vmbench --gtest_filter=VMBenchTest.MerkleProofEvm:VMBenchTest.SolMerkleProofWasm +LD_LIBRARY_PATH=. ./test_vmbench --gtest_filter=VMBenchTest.GenerativeNFTEvm:VMBenchTest.SolGenerativeNFTWasm +``` + +See `benchmarks/contracts/REPRODUCE.md`. diff --git a/benchmarks/paper/SOURCES.md b/benchmarks/paper/SOURCES.md new file mode 100644 index 000000000..96ddac91d --- /dev/null +++ b/benchmarks/paper/SOURCES.md @@ -0,0 +1,34 @@ +# Source and License Notes + +The material in this directory was curated from an experiment archive. This file records the provenance and upstream licenses. + +## Source → This Repository + +| Path here | Archive source | Notes | +|-----------|---------------|-------| +| `runtimes/dtvm/` | DTVM source repository | the paper baseline fork; not WAMR 1.2.3 | +| `benchmarks/polybenchc/`, `benchmarks/wapm/` (wasm) | `webassembly-testsuites` repo `case/benchmark/`, `case/wapm/` | prebuilt wasm of public PolyBench/C and WAPM workloads | +| `benchmarks/contracts/` | contract-testbed repo `test/vm_benchmark/` | contract sources and hex artifacts; runner source not included | +| `benchmarks/overflow/`, `benchmarks/fib/` | experiment archive | Fig. 7 workloads | + +## Upstream Public Sources + +| Content | Upstream | License | +|---------|----------|---------| +| `benchmarks/polybenchc/` | PolyBench/C 4.2.1 (compiled to wasm with WASI-SDK) | PolyBench license | +| `benchmarks/wapm/*.wasm` | public WAPM packages (wapm.io) | per-package licenses | +| `benchmarks/wapm/fonts/`, `lib/` | WAPM package runtime dependencies | same as above | +| `bench_contract/erc20|721|1155` etc. | OpenZeppelin Contracts | MIT | +| Uniswap V2 contracts (source not included) | https://github.com/Uniswap/v2-core + https://github.com/Uniswap/v2-periphery | **GPL-3.0-or-later**; the `uniswapv2_*` hex in `bench_bytecode/` are their prebuilt artifacts | +| `bench_contract/ecdsa/` (P256 etc.) | OpenZeppelin / community implementations | MIT | +| `runtimes/wasmtime-*`, `wasmer-*`, `wamr-*` | upstream official releases / tags | respective licenses | +| `benchmarks/contracts/bench_bytecode/*.hex` | prebuilt artifacts of the sources above | follow the source license | + +## Gaps (absent from the archive as well) + +- Upstream WAMR 1.2.3 checkout (fetch the official tag yourself) +- Wasmtime 31.0.0 binary (use the official tarball; see `runtimes/wasmtime-31.0.0/BUILD.md`) +- Contract sol→evm / sol→wasm compile commands (only prebuilt hex exist) +- C sources for `c_erc20_wasm` / `c_fib_wasm` +- Sources for standalone wasm such as `fib_no_contract.c.wasm` +- The DTVM binary (build per `runtimes/dtvm/BUILD.md`) diff --git a/benchmarks/paper/VERSIONS.md b/benchmarks/paper/VERSIONS.md new file mode 100644 index 000000000..e9651c833 --- /dev/null +++ b/benchmarks/paper/VERSIONS.md @@ -0,0 +1,157 @@ +# Runtime Version Pins + +This package covers two sets of version pins: + +- **Paper baseline**: the PolyBench wall-clock main table and the early WAPM table (`dtvm_polybench.xlsx` / `latencytofirstinvocation.md`) +- **Current mainline** (PolyBench TTFI / WAPM TTFI / overflow / fib(30)): DTVM main with `Total compilation time` instrumentation + Wasmtime 45.0.0 + the three Wasmer 7.1.0 backends + +No binaries are committed; each `runtimes//` directory keeps only `BUILD.md` + `build.sh` + `version.txt`. Build artifacts (`out/`, `build/`, `dtvm`, `CMakeCache.txt`) are gitignored. + +## Paper Baseline (PolyBench wall-clock) + +| Runtime | Version | Role | Build doc | +|---------|---------|------|-----------| +| WAMR (`iwasm`) | **1.2.3** | interpreter baseline | `runtimes/wamr-1.2.3/BUILD.md` | +| Wasmtime | **31.0.0** | wall-clock baseline (Cranelift) | `runtimes/wasmtime-31.0.0/BUILD.md` | +| Wasmer | **5.0.4** | `wasmer llvm` column | `runtimes/wasmer-5.0.4/BUILD.md` | +| DTVM (`dtvm`) | DTVM source fork @ **`882c83155`** | paper PolyBench / WAPM body | `runtimes/dtvm/BUILD.md` | + +## Current Mainline (TTFI + overflow + fib) + +| Runtime | Version | Role | Build script | +|---------|---------|------|--------------| +| Wasmtime | **45.0.0** (with `ttfi-report` instrumentation) | PolyBench TTFI / WAPM TTFI / overflow / fib | `runtimes/wasmtime-45.0.0/build.sh` | +| Wasmer | **7.1.0** (cranelift + singlepass + **llvm**) | same | `runtimes/wasmer-7.1.0/build.sh` | +| DTVM (`dtvm`) main | TTFI mainline e.g. **`c3c3fd856`**; overflow / fib use the newest fastest commit e.g. **`e532db3e2`** | TTFI + overflow + fib | `runtimes/dtvm_main/version.txt` | + +> The overflow / fib(30) experiments run only the newest fastest DTVM build (not required to share the TTFI commit); the other four columns are fixed at Wasmtime 45 + the three Wasmer 7.1 backends. + +## Known DTVM Commits + +| Label | Commit | Date | Notes | +|-------|--------|------|-------| +| **Paper baseline** | **`882c83155`** | 2024 | PolyBench / WAPM body; branch `dev/init_code` | +| **TTFI mainline** | **`c3c3fd856`** | 2026-05-29 | includes `Total compilation time` instrumentation; `perf: commute two-address operands and fix branch peephole for 30% fib speedup` | +| **overflow / fib latest** | **`e532db3e2`** | 2026-05-30 | `perf: add post-RA peephole optimizations for x86 code generation` | +| singlepass-dev HEAD | `bc137635` | 2023-10-26 | old HEAD of the fork | +| wtf pin | `396d1f61` | 2022-08-11 | `wtf/cmake/project_wamr.cmake` | + +The commits above are from the DTVM source history; for local reproduction use this repository. + +**Note**: the fork is based on 2021–2022 upstream WAMR plus in-house patches (singlepass / multipass JIT etc.) and is **not** a substitute for WAMR 1.2.3. + +## Wasmtime 31.0.0 (paper baseline) + +Doc: `runtimes/wasmtime-31.0.0/BUILD.md` +Build script: `runtimes/wasmtime-31.0.0/build.sh` (includes `patches/ttfi-report.patch`, optional `Total compilation time` instrumentation) + +| Item | Value | +|------|-------| +| Version | **31.0.0** | +| Git tag | `release-31.0.0` | +| Rust (source build) | ≥ **1.85.0** | +| Prebuilt tarball (x86_64 Linux) | [wasmtime-v31.0.0-x86_64-linux.tar.xz](https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz) | +| Release page | https://github.com/bytecodealliance/wasmtime/releases/tag/v31.0.0 | + +```bash +# A. Official prebuilt tarball +curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz +tar xf wasmtime-v31.0.0-x86_64-linux.tar.xz + +# B. Source build (applies the TTFI patch automatically) +cd runtimes/wasmtime-31.0.0 && ./build.sh all +# Output: runtimes/wasmtime-31.0.0/out/wasmtime +``` + +## Wasmtime 45.0.0 (TTFI / overflow / fib mainline) + +Doc: `runtimes/wasmtime-45.0.0/build.sh` (requires a v45.0.0 source tree that already contains the `ttfi-report` instrumentation) + +| Item | Value | +|------|-------| +| Version | **45.0.0** | +| Git tag | `v45.0.0` | +| Instrumentation | `src/ttfi_report.rs` + `Cargo.toml` `ttfi-report` feature + `commands/run.rs` | +| Instrumented source example | `/path/to/wasmtime-45.0.0` | + +```bash +WASMER_SRC=/path/to/wasmtime-45.0.0 runtimes/wasmtime-45.0.0/build.sh +# Output: runtimes/wasmtime-45.0.0/out/wasmtime +export WASMTIME_CACHE=0 # required for TTFI +``` + +## Wasmer 5.0.4 (paper baseline) + +Doc: `runtimes/wasmer-5.0.4/BUILD.md` +Build script: `runtimes/wasmer-5.0.4/build.sh` (cranelift + singlepass; llvm needs LLVM 18, optional) + +| Item | Value | +|------|-------| +| Version | **5.0.4** | +| LLVM backend | **LLVM 18** (`LLVM_SYS_180_PREFIX`) | +| Singlepass used in the paper | `v5.0.5-rc1` | + +## Wasmer 7.1.0 (TTFI / overflow / fib mainline) + +Build script: `runtimes/wasmer-7.1.0/build.sh` + +| Item | Value | +|------|-------| +| Version | **7.1.0** | +| Git tag | `v7.1.0` | +| Instrumentation | `lib/wasix/src/ttfi_report.rs` etc. | +| LLVM backend | **LLVM 21** (not 18; needs `LLVM_SYS_211_PREFIX`) | +| LLVM 21 example | `/opt/LLVM-21.1.8-Linux-X64` | + +```bash +LLVM_SYS_211_PREFIX=/opt/LLVM-21.1.8-Linux-X64 \ + WASMER_SRC=/path/to/wasmer-7.1.0 \ + runtimes/wasmer-7.1.0/build.sh +# Output: runtimes/wasmer-7.1.0/out/bin/wasmer +``` + +## WAMR 1.2.3 + +Upstream tag: `WAMR-1.2.3` (`bytecodealliance/wasm-micro-runtime`) + +Docs: `runtimes/wamr-1.2.3/BUILD.md` / `runtimes/wamr-1.2.3/build.sh` + +| Item | Version | +|------|---------| +| WAMR | **1.2.3** | +| LLVM (AOT) | **11.1.0** | + +Default CMake options: + +``` +-DWAMR_BUILD_INTERP=1 +-DWAMR_BUILD_FAST_JIT=1 +-DWAMR_BUILD_AOT=1 +-DWAMR_BUILD_LIBC_WASI=1 +-DLLVM_DIR=/usr/lib/llvm-11/lib/cmake/llvm # for AOT +``` + +## Toolchain + +See [`ENVIRONMENT.md`](ENVIRONMENT.md). Summary: + +| Tool | Version / note | Basis | +|------|----------------|-------| +| **rustc** | ≥ **1.85.0** stable | Wasmtime 31 / 45, Wasmer 5 / 7.1 | +| **Wasmtime (paper)** | **31.0.0** | `runtimes/wasmtime-31.0.0/` | +| **Wasmtime (mainline)** | **45.0.0** (TTFI-instrumented) | `runtimes/wasmtime-45.0.0/` | +| **Wasmer (paper)** | **5.0.4** | `runtimes/wasmer-5.0.4/` | +| **Wasmer (mainline)** | **7.1.0** | `runtimes/wasmer-7.1.0/` | +| **Wasmer 5 LLVM backend** | **LLVM 18.1.7** | `runtimes/wasmer-5.0.4/BUILD.md` | +| **Wasmer 7.1 LLVM backend** | **LLVM 21.1.8** | `runtimes/wasmer-7.1.0/build.sh` | +| **WAMR AOT LLVM** | **11.1.0** | `runtimes/wamr-1.2.3/BUILD.md` | +| **DTVM build LLVM** | **15.0.0** (`clang+llvm-15.0.0-...-rhel-8.4`) | experiment notes, Coremark build steps | +| **WASI-SDK / clang** | **11.0.0** (27 cases), **14.0.3** (3 cases) | archived PolyBench wasm metadata | +| **PolyBench/C** | **4.2.1** | standard 30-case suite | +| **Emscripten (`em++`)** | not pinned, `-O2` | `benchmarks/overflow/build.sh` | +| **evmone / solc / wabt** (contract bench) | not pinned in the archive | contract hex are prebuilt artifacts | + +### Not Recorded in the Archive + +- Contract vm_benchmark host: **OS distribution, kernel, Docker, CPU governor, core pinning, drop_caches** +- **`solc`** / **`wat2wasm`** versions and commands used to produce `bench_bytecode/*.hex` diff --git a/benchmarks/paper/benchmarks/README.md b/benchmarks/paper/benchmarks/README.md new file mode 100644 index 000000000..2e835d5b1 --- /dev/null +++ b/benchmarks/paper/benchmarks/README.md @@ -0,0 +1,32 @@ +# Benchmarks + +Wasm test suites and rebuildable cases used by the paper experiments. + +## Suite Status + +| Directory | wasm count | Source | Build script | Status | +|-----------|-----------|--------|--------------|--------| +| `polybenchc/` | 30 | PolyBenchC-4.2.1 | `build.sh` (WASI clang) | **migrated**: wasm + rebuild docs | +| `contracts/` | — | Solidity + hex | testbed Bazel (see REPRODUCE) | **migrated**: sources / hex; runner source not included | +| `wapm/` | 21 | — | — | **migrated**: paper's 20 cases + fortune (zuk substitute) wasm + confs + SHA256 | +| `overflow/` | 1 | yes (C++) | yes | **migrated** | +| `fib/` | 3 | yes (C/Solidity) | — | **migrated**: standalone fib/md5 cases | + +> The upstream archive also contained the libsodium (72-case) and wabench (22-case) suites and 9 non-paper WAPM cases (`main`, `python`, `spidermonkey`, `sqlite`, `wasm3`, `jq`, `jyt`, `pee`, `greg`); none were used in the paper and none were migrated. + +## PolyBench Compilation (WASI clang) + +- Source: [PolyBenchC-4.2.1](https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1) +- Toolchain: WASI SDK `clang` (default `/opt/wasi-sdk/bin/clang`) +- Macros: `-DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS` +- Details: `benchmarks/polybenchc/BUILD.md` + +## Contract Microbenchmark + +- Directory: `benchmarks/contracts/` (archive of `test/vm_benchmark` in the contract-testbed repo) +- Reproduction: inside the source repo, `sh build.sh release.vmbench 6 false 2` +- Details: `contracts/REPRODUCE.md`, `contracts/CALLS.md` + +## Running + +See `../scripts/run_polybench.sh` and `webassembly-testsuites/runtest_webassembly.py`. diff --git a/benchmarks/paper/benchmarks/contracts/CALLS.md b/benchmarks/paper/benchmarks/contracts/CALLS.md new file mode 100644 index 000000000..222bc099c --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/CALLS.md @@ -0,0 +1,73 @@ +# Contract Call Parameters + +Extracted from the archived runner source `test/vm_benchmark/bench.cpp`. All cases share the same **setup**, then run a **10000-iteration** measured loop (`repeat_times = 10000`). + +## Common Setup + +| Item | Value | +|------|-------| +| `from` | `0x095e7baea6a6c7c4c2dfeb977efac326af552d87` | +| Initial balance | `1 ether` | +| setup tx1 | transfer 100 wei → `0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b` (nonce 0) | +| setup tx2 | contract create; deploy bytecode from `bench_bytecode/*.hex` (nonce 1) | +| Contract address (nonce 1) | `0xb88de88b35ecbf3c141e3caae2baf35834d18f63` | +| gas | `21000000` for most setup/measurement txs; `0xFFFFFFFFFFFFFE` for the Fib measurement tx | +| gas_price | `1` | + +Extra fixed addresses for Uniswap (deployed in nonce order): + +| Contract | Address | +|----------|---------| +| Factory | `0xb88de88b35ecbf3c141e3caae2baf35834d18f63` | +| Router | `0x5d35480c6e7f8952363fa280a0a96906da981f63` | +| Token0 | `0x5b5bd343a12fb42c62390aff6340b59947b60263` | +| Token1 | `0xa2b91fd595c51dec3fe42be1fbf3bfcb3bc9e4ed` | + +## Measured Calls (counted in cycles) + +| Case | Function | Selector | Arguments / calldata | Execute API | +|------|----------|----------|----------------------|-------------| +| ERC20 | `transfer(address,uint256)` | `0xa9059cbb` | to=`0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97`, amount=`1` | `MockedExecute` | +| ERC721 | `transferFrom(address,address,uint256)` | `0x23b872dd` | from=above, to=`0x4838b106...`, tokenId=loop var `i` | `Execute` | +| ERC1155 | `safeTransferFrom(...)` | `0xf242432a` | from, to, id=`1`, amount=`1`, data=`0x` | `Execute` | +| Fib | `fibonacci(uint256)` | `0x61047ff4` | n=`20` (`0x14`) | `Execute` | +| Counter | `increase()` | `0xe8927fbc` | none | `Execute` | +| Uniswap V2 | `swapExactTokensForTokens(...)` | `0x38ed1739` | amountIn=`10`, minOut=`0`, path token0→token1, to=from, deadline=`0` | `Execute` | +| ECDSA | `verify(...)` | `0xade9ec41` | see `TestECDSA` | `Execute` | +| Poseidon | `calc(...)` | `0xeb6c5b9e` | see `TestPoseidonHash` | `Execute` | +| Merkle Proof | `benchmark()` | `0x8903c5a2` | none; builds and verifies a 10-level proof internally | `Execute` | +| Generative NFT | `generate(uint256)` | `0x4a7dd523` | tokenId=`1` | `Execute` | + +## Setup Calls (not counted in the cycles loop) + +| Case | Function | Selector | Notes | +|------|----------|----------|-------| +| ERC20 | `mint(address,uint256)` | `0x40c10f19` | minted once after deploy | +| ERC721 | `mint(address)` | `0x6a627842` | minted **10000 times** after deploy (warmup) | +| ERC1155 | `mint(...)` | `0x731133e9` | minted **once** after deploy | +| Uniswap | `createPair` / `addLiquidity` / `approve` / `getReserves` etc. | various | see `TestUniswapV2`; full DEX initialization before swap | + +## gtest ↔ Bytecode Files + +| gtest | hex constant / file | +|-------|---------------------| +| `Erc20Evm` | `bench_bytecode/erc20_evm.hex` | +| `SolErc20Wasm` | `bench_bytecode/sol_erc20_wasm.hex` | +| `CErc20Wasm` | `bench_bytecode/c_erc20_wasm.hex` | +| `Erc721Evm` | `bench_bytecode/erc721_evm.hex` | +| `SolErc721Wasm` | `bench_bytecode/sol_erc721_wasm.hex` | +| `Erc1155Evm` | `bench_bytecode/erc1155_evm.hex` | +| `SolErc1155Wasm` | `bench_bytecode/sol_erc1155_wasm.hex` | +| `UniswapV2Evm` | `uniswapv2_factory_evm.hex` + `uniswapv2_router_evm.hex` + `uniswapv2_erc20_evm.hex` | +| `SolUniswapV2Wasm` | `sol_uniswapv2_factory_wasm.hex` + `sol_uniswapv2_router_wasm.hex` + `sol_erc20_wasm.hex` | +| `FibEvm` | `bench_bytecode/fib_evm.hex` | +| `SolFibWasm` | `bench_bytecode/sol_fib_wasm.hex` | +| `CFibWasm` | `bench_bytecode/c_fib_wasm.hex` | +| `CounterEvm` | `bench_bytecode/counter_evm.hex` | +| `SolCounterWasm` | `bench_bytecode/sol_counter_wasm.hex` | +| `MerkleProofEvm` | `bench_bytecode/merkle_evm.hex` | +| `SolMerkleProofWasm` | `bench_bytecode/sol_merkle_wasm.hex` | +| `GenerativeNFTEvm` | `bench_bytecode/generative_nft_evm.hex` | +| `SolGenerativeNFTWasm` | `bench_bytecode/sol_generative_nft_wasm.hex` | + +Full list: [`MANIFEST.md`](MANIFEST.md). diff --git a/benchmarks/paper/benchmarks/contracts/MANIFEST.md b/benchmarks/paper/benchmarks/contracts/MANIFEST.md new file mode 100644 index 000000000..09a237ab9 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/MANIFEST.md @@ -0,0 +1,69 @@ +# Manifest + +## bench_bytecode/*.hex (25) + +| File | Purpose | +|------|---------| +| `erc20_evm.hex` | ERC20 EVM deployment bytecode | +| `sol_erc20_wasm.hex` | ERC20 sol→wasm | +| `c_erc20_wasm.hex` | ERC20 C→wasm (**hex only, no C source**) | +| `erc721_evm.hex` | ERC721 EVM | +| `sol_erc721_wasm.hex` | ERC721 sol→wasm | +| `erc1155_evm.hex` | ERC1155 EVM | +| `sol_erc1155_wasm.hex` | ERC1155 sol→wasm | +| `uniswapv2_factory_evm.hex` | Uniswap V2 Factory EVM | +| `uniswapv2_router_evm.hex` | Uniswap V2 Router EVM | +| `uniswapv2_erc20_evm.hex` | Uniswap pair token EVM | +| `sol_uniswapv2_factory_wasm.hex` | Factory sol→wasm | +| `sol_uniswapv2_router_wasm.hex` | Router sol→wasm | +| `fib_evm.hex` | Fibonacci EVM | +| `sol_fib_wasm.hex` | Fibonacci sol→wasm | +| `c_fib_wasm.hex` | Fibonacci C→wasm (**hex only, no C source**) | +| `counter_evm.hex` | Counter EVM | +| `sol_counter_wasm.hex` | Counter sol→wasm | +| `ecdsa_evm.hex` | ECDSA EVM | +| `sol_ecdsa_wasm.hex` | ECDSA sol→wasm | +| `poseidon_evm.hex` | Poseidon EVM | +| `sol_poseidon_wasm.hex` | Poseidon sol→wasm | +| `merkle_evm.hex` | Merkle Proof EVM | +| `sol_merkle_wasm.hex` | Merkle Proof sol→wasm | +| `generative_nft_evm.hex` | Generative NFT EVM | +| `sol_generative_nft_wasm.hex` | Generative NFT sol→wasm | + +## bench_contract/ Sources + +| Directory / file | Description | +|------------------|-------------| +| `erc20/erc20.sol` | OpenZeppelin ERC20 + mint | +| `erc721/erc721.sol` | OpenZeppelin ERC721 + mint | +| `erc1155/erc1155.sol` | OpenZeppelin ERC1155 + mint | +| `counter/counter.sol` | increase / decrease | +| `fibonacci/fib.sol` | recursive fibonacci | +| `uniswapv2/` (not included) | Factory / Router / Pair / ERC20 + libraries; upstream https://github.com/Uniswap/v2-core and https://github.com/Uniswap/v2-periphery (GPL-3.0-or-later); the bench uses the prebuilt hex under `bench_bytecode/` | +| `ecdsa/` | P256 verify and its dependencies | +| `poseidon/poseidon.sol` | Poseidon hash | +| `merkle/MerkleProof.sol` | 10-level keccak256 Merkle proof verification | +| `generative_nft/GenerativeNFT.sol` | on-chain SVG generative art (8 circles, keccak256 PRNG) | + +> The ERC721/1155/20 `.sol` files reference `@openzeppelin/contracts`; recompiling them requires resolving that dependency in the testbed build environment. + +## runner/ (not included; experiment archive only) + +| File | Description | +|------|-------------| +| `bench.cpp` | gtest implementation (~2456 lines): mock state, calldata assembly, rdtsc timing | +| `gen_deploy.py` | hex → `gen_deploy.h` generator | +| `BUILD` | original `test/vm_benchmark/` Bazel BUILD | + +## Raw-output Naming + +The runner writes one `.time` sample file per case under `raw_data/contracts/` (not included here). The naming convention is: + +| gtest prefix | `.time` filename | +|--------------|------------------------------------| +| Erc20Evm / SolErc20Wasm | `erc20evm.time`, `solerc20wasm.time` | +| Erc721 / SolErc721 | `erc721evm.time`, `solerc721wasm.time` | +| Erc1155 | `erc1155evm.time`, `solerc1155wasm.time` | +| Uniswap | `uniswap.time`, `uniswap.wasm.time` | +| Fib | `fibevm_opt.time`, `solfibwasm.time`, `cfibwasm.time` | +| Counter | `counterevm_opt.time`, `solcounterwasm.time` | diff --git a/benchmarks/paper/benchmarks/contracts/README.md b/benchmarks/paper/benchmarks/contracts/README.md new file mode 100644 index 000000000..96f842236 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/README.md @@ -0,0 +1,35 @@ +# Contract Benchmarks (vm_benchmark) + +The paper's **rich-semantic smart contract** microbenchmark: ERC20 / ERC721 / ERC1155 / Uniswap V2 / Fibonacci / Counter (plus ECDSA / Poseidon bytecode). + +Source: `test/vm_benchmark/` in the contract-testbed repository. The reproduction notes were distilled from the experiment notes. + +## Contents + +| Path | Contents | +|------|----------| +| `bench_contract/` | Solidity contract sources (Uniswap V2 source is not included — see [`../../SOURCES.md`](../../SOURCES.md) for upstream links) | +| `bench_bytecode/` | prebuilt EVM / sol→wasm / C→wasm **hex artifacts** (no compile scripts) | +| runner source | not included (gtest driver, calldata assembly, Bazel BUILD — experiment archive only); methodology in `CALLS.md` / `REPRODUCE.md` | +| `CALLS.md` | per-case function under test, calldata, iteration counts | +| `REPRODUCE.md` | build, run, environment, and measurement methodology | +| `../../ENVIRONMENT.md` | 12-item environment/toolchain checklist (confirmed vs not recorded) | +| `MANIFEST.md` | file inventory and gtest case mapping | +| `SHA256SUMS` | integrity checksums | + +## Archived / Not Archived + +| Item | Status | +|------|--------| +| Solidity sources | ✅ | +| EVM / sol-wasm / C-wasm hex artifacts | ✅ (`c_*.hex` are artifacts only, **no C sources**) | +| Runner `bench.cpp` | exists in the archive; not included (depends on the source repo, cannot compile standalone) | +| sol→evm / sol→wasm compile commands | ❌ absent from the archive | +| C wasm sources | ❌ absent from the archive | +| Self-contained binary | ❌ requires building `test_vmbench` inside the contract-testbed repo | + +## Index + +- Reproduction steps → [`REPRODUCE.md`](REPRODUCE.md) +- Call parameters → [`CALLS.md`](CALLS.md) +- gtest ↔ hex mapping → [`MANIFEST.md`](MANIFEST.md) diff --git a/benchmarks/paper/benchmarks/contracts/REPRODUCE.md b/benchmarks/paper/benchmarks/contracts/REPRODUCE.md new file mode 100644 index 000000000..086eb6e89 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/REPRODUCE.md @@ -0,0 +1,146 @@ +# Contract Benchmark Reproduction + +Based on reproduction notes and `test/vm_benchmark/`. + +This directory archives the **sources, hex artifacts, and methodology**; a full run still requires compiling the runner inside the contract-testbed repository. + +## 1. Getting the Code + +The contract bench runner (`test_vmbench`, a gtest binary) builds only inside the contract-testbed repository's `test/vm_benchmark/`, which is not included. This directory already contains all contract sources and hex artifacts (verifiable with `SHA256SUMS`); methodology and parameters are in `CALLS.md`. External readers can reproduce the wasm-side experiments; the EVM comparison part is documented for methodology reference only. + +## 2. Building test_vmbench (source repository) + +At the root of the contract-testbed repository: + +```bash +sh build.sh release.vmbench 6 false 2 +``` + +Output: `test_vmbench` (gtest binary, depends on the EVM/DTVM stack in that repository). + +DTVM build macros used in the paper: + +``` +ZEN_ENABLE_JIT +ZEN_ENABLE_SINGLEPASS_JIT +ZEN_ENABLE_DWASM +ZEN_ENABLE_CHECKED_ARITHMETIC +``` + +## 3. Running + +Single case: + +```bash +./test_vmbench --gtest_filter=VMBenchTest.Erc20Evm +./test_vmbench --gtest_filter=VMBenchTest.SolErc20Wasm +``` + +EVM vs DTVM (sol→wasm) comparison: + +```bash +./test_vmbench --gtest_filter=VMBenchTest.Erc20Evm:VMBenchTest.SolErc20Wasm +``` + +### Paper Cases (gtest names) + +| Workload | EVM | sol→wasm | C→wasm | +|----------|-----|----------|--------| +| ERC20 `transfer` | `Erc20Evm` | `SolErc20Wasm` | `CErc20Wasm` (may be commented out on the branch) | +| ERC721 `transferFrom` | `Erc721Evm` | `SolErc721Wasm` | — | +| ERC1155 `safeTransferFrom` | `Erc1155Evm` | `SolErc1155Wasm` | — | +| Uniswap V2 `swapExactTokensForTokens` | `UniswapV2Evm` | `SolUniswapV2Wasm` | — | +| Fibonacci | `FibEvm` | `SolFibWasm` | `CFibWasm` | +| Counter `increase` | `CounterEvm` | `SolCounterWasm` | — | +| ECDSA R1 verify | `ECDSAEvm` | `SolECDSAWasm` | — | +| Poseidon | `PoseidonEvm` | `SolPoseidonWasm` | — | +| Merkle Proof verify | `MerkleProofEvm` | `SolMerkleProofWasm` | — | +| Generative NFT generate | `GenerativeNFTEvm` | `SolGenerativeNFTWasm` | — | + +Call details: [`CALLS.md`](CALLS.md). + +## 4. Experiment Environment (paper) + +**Test machine (confirmed in experiment notes):** compute-optimized **c7, 8C16G**, **Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz** + +The full 12-item environment checklist is in [`ENVIRONMENT.md`](../../ENVIRONMENT.md). Hardware/CPU items: + +| Item | Value | Note | +|------|-------|------| +| Machine | compute-optimized **c7, 8C16G** | experiment notes (0422 archive) | +| CPU | **Intel Xeon Platinum 8369B @ 2.70GHz** | experiment notes | +| Workload shape | **serial** microbenchmark | notes: "1C is enough"; no pinning recorded | +| OS / Kernel | **not recorded** | only known to be Linux (runner reads `/proc/cpuinfo`) | +| Docker / dedicated host / governor / background load | **not recorded** | — | +| Observed frequency | `/proc/cpuinfo` → **cpu MHz ≈ 2699.998** | not a manual cpufreq step | +| Turbo Boost | **off** | experiment notes + archived runner-source comment | +| Cache clearing | **not recorded** | State / Module LRU caches **are reused** during measurement | +| Iterations | **10000** per measured tx, average cycles | experiment notes | + +## 5. Measurement Methodology + +- **`rdtsc`** records CPU cycles, converted to time via the CPU frequency. +- Measurement target: **pure VM execute after instance creation** (intended to exclude load-module / create-instance; the exact boundaries are the `__rdtsc()` sites in the archived runner source). +- EVM path: `evmone`; wasm contract path: DTVM **MultipassMode**. +- Modules are LRU-cached by **code_hash + spec_version** (size=32); each call still **creates a new Instance**. +- The ERC20 measured transfer uses `MockedExecute` (unlike `Execute` in other cases). +- Mock state: `ReadAccount` only initializes the `from` balance; `ReadStorage` returns empty; `EVMContext` is the default `{}`. + +## 6. raw_data Mapping + +| Output | Path | +|--------|------| +| Raw cycles samples | per-iteration `.time` files are not included | +| Figures | not included (regenerate from fresh benchmark output) | + +## 7. Known Gaps + +- **No** C sources for `c_erc20_wasm` / `c_fib_wasm` (only `.hex` artifacts). +- `test_vmbench` depends on the source repository and cannot be built standalone here. + +## 8. Wasm Compilation (Merkle Proof / Generative NFT) + +The sol→wasm compilation for the newer Merkle Proof and Generative NFT cases used **DTVM_SolSDK v0.1.1**: + +```bash +# Install DTVM_SolSDK (prebuilt package) +tar xzf DTVM_SolSDK-v0.1.1-ubuntu22.04.tar.gz +export YUL2WASM=DTVM_SolSDK-26844a8-Linux/yul2wasm + +# MerkleProof +solc --ir --optimize-yul -o /tmp/merkle_yul --overwrite MerkleProof.sol +$YUL2WASM --input /tmp/merkle_yul/MerkleProof.yul --output MerkleProof.wasm + +# GenerativeNFT +solc --ir --optimize-yul -o /tmp/gennft_yul --overwrite GenerativeNFT.sol +$YUL2WASM --input /tmp/gennft_yul/GenerativeNFT.yul --output GenerativeNFT.wasm +``` + +## 9. Contract Microbenchmark Results (evmone 0.21.0 vs DTVM) + +Environment: Linux x86_64 CentOS (c7 8C16G, Xeon 8369B), evmone 0.21.0 (local source build), DTVM multipass JIT. +Build command: `sh build.sh release.vmbench 6 false 2` (`OP_VM_TYPE=2`, i.e. multipass). +Each measured tx repeated **10000** times; average CPU cycles (`rdtsc`) converted to time. + +| Workload | evmone 0.21.0 (EVM) | DTVM (sol→wasm) | DTVM/evmone | +|----------|--------------------:|----------------:|:-----------:| +| ERC20 transfer | 19.67 us | 25.11 us | 0.78x | +| ERC721 transferFrom | — | — | — | +| ERC1155 safeTransfer | — | — | — | +| UniswapV2 swap | — | — | — | +| ECDSA verify | 1322.46 us | 14.31 us | **92.4x** | +| Poseidon hash | — | — | — | +| Fibonacci(30) | 180,385 us | 67,853 us | **2.66x** | +| Counter increase | 8.72 us | 16.13 us | 0.54x | +| **Merkle Proof (MiMC)** | 2268.45 us | 565.36 us | **4.01x** | +| **Generative NFT (MiMC sponge)** | 1944.97 us | 657.63 us | **2.96x** | + +> DTVM/evmone > 1 means DTVM is faster. +> +> **Merkle Proof** uses MiMC hashing (91-round x^7 mod P S-box), 10 verification rounds, 20-node proofs each. +> The mix of `addmod`/`mulmod`/`keccak256` plus loop control flow favors the DTVM JIT. +> +> **Generative NFT** uses an MiMC sponge for deterministic on-chain attribute generation, 8 layers with 2 sponge absorptions each — again dominated by compute-heavy cryptographic primitives. +> +> Compute-dense cases like ECDSA and Fibonacci show the largest DTVM advantage (92x / 2.7x). +> Simple contracts such as ERC20/Counter favor evmone because wasm carries extra serialization/dispatch overhead. diff --git a/benchmarks/paper/benchmarks/contracts/SHA256SUMS b/benchmarks/paper/benchmarks/contracts/SHA256SUMS new file mode 100644 index 000000000..54a23c3f6 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/SHA256SUMS @@ -0,0 +1,53 @@ +9070a82415423927731c616c896377a1c8a179d6c3e0369ddbefb29e64956c9f bench_bytecode/c_erc20_wasm.hex +55c650de4d41dcead200b1383012e34c7a4b3dfa6c4161b23f9faf5cdb71d672 bench_bytecode/c_fib_wasm.hex +36a08335acbf35e814a7b043f4012387620714a298a06857df97dd0d71bc8002 bench_bytecode/counter_evm.hex +4919dd0d829cf861d980f00ba13e110c5062503e9f4c3520f7cd20ff64e46b82 bench_bytecode/ecdsa_evm.hex +71fd6ed4578675018da111a351727f14ad974a59e2ea95fda9240b373f7121c8 bench_bytecode/erc1155_evm.hex +69745f1db13d8dd4c8ba0a3a6bcea4e45b8a8613f2276a344468145eddfba306 bench_bytecode/erc20_evm.hex +46f47fca2f9084632e4981fb67e7818bf03148dbd74548d4abdf5a71138e57dd bench_bytecode/erc721_evm.hex +94aac92783e146325ae8e887a6b76a9314b92b8994c8721cbd43b9424f020a08 bench_bytecode/fib_evm.hex +93afd85ff796ccf63adcd405f607f0e4285e3ffc6846111eae7eb0b019d34bef bench_bytecode/generative_nft_evm.hex +b1655a6d2560f4893a8ab37477aa508df171391cd7252f4b0bc8aa3191742ca8 bench_bytecode/merkle_evm.hex +ba7a4610bf316b15329cdd3f61ce41b64c58c25b1eb1cad6f76f79ee1ee73ae5 bench_bytecode/poseidon_evm.hex +0694802330803bb3d20dfb380767ab76c3edeb5ad4c8e61a4e48c06630d280a8 bench_bytecode/sol_counter_wasm.hex +b6f5f1a9f70b79b175230e26111efa1779d1d6cdc593a80f0a23fa39cc1ad815 bench_bytecode/sol_ecdsa_wasm.hex +2bfe784a4115ffea3acbc229cd2f11255cb1aa8bd2051a5ce85cfbf8af2b8c47 bench_bytecode/sol_erc1155_wasm.hex +effd6ff41285d024cacda492131d98d0f2c998e37823ff9928721d3d22afb5c7 bench_bytecode/sol_erc20_wasm.hex +8e05215bbdb590e7939285f6a47d58340c0eeb1990f57737660b74d1933432b5 bench_bytecode/sol_erc721_wasm.hex +77a2311520da0f65f4b2e8b0cc18915729e67827b63490e6f7829be5b1ec6f98 bench_bytecode/sol_fib_wasm.hex +ef5aaff94954d9504764832b997321a35e814e2a41b7b9d1a0c4901cd772e83a bench_bytecode/sol_generative_nft_wasm.hex +1853262fd5dc949d241932477ef2a4e1f4ad90b03f3dfd82a0d4d947e3746736 bench_bytecode/sol_merkle_wasm.hex +bb5b3edd8f111edde3dc6fb796da66206c40d9748be9a15e4ac5680d51c38050 bench_bytecode/sol_poseidon_wasm.hex +4f1875d2f6fb58d1e09b71581f1928b516b87f41b03aabed171da1dbed82888b bench_bytecode/sol_uniswapv2_factory_wasm.hex +cd24ce9cf55b427568ce50ef08d76dfc9e3e4afba2be608f5edc7c28f091b227 bench_bytecode/sol_uniswapv2_router_wasm.hex +b1dfd06727b1ef62b0788248f843b3c68dac4a2751c88f1d1afedbb9a64eb131 bench_bytecode/uniswapv2_erc20_evm.hex +576249afcebeca384b15893d9f2d3dffff094eafa186c503e99dae72e0c114d7 bench_bytecode/uniswapv2_factory_evm.hex +5c3c849fdc4bf8edf20ce9289dec2a8042a4ca618a5e642a5ee64d8a45bdb1b5 bench_bytecode/uniswapv2_router_evm.hex +2450c1dcaa12799ead027dd8279b737569b9445f8aa2949c343bfdd3fdfbafdb bench_contract/counter/counter.sol +b29927a5dbe715f4d95685ffdd6efb7f0232b98a2de08bff101f27671103c858 bench_contract/counter/counter.wasm +0704b9d6c032cca8512a3bc3f30f49f86f1f03102d2896a3d23e794b82efea66 bench_contract/ecdsa/Errors.sol +3f31917e4814473203471fe17593758f77d75799e8c34d992128f90810e6702a bench_contract/ecdsa/Math.sol +c8860207752ab4ca057837214a7fb692b5f0943d34eee69adc6f66c0850df6a2 bench_contract/ecdsa/P256.sol +270fc8401c1a13fae6a7a4a2dd6e381b95d658896701e51f0d3e2688acab3dec bench_contract/ecdsa/Panic.sol +9769274bf53f26a7c7896c526ea1980dc9bea5bf5c2a5fd04870008c4afc1de9 bench_contract/ecdsa/SafeCast.sol +6b52b491a0719337b4429b7a9d22e3c2ac0012eefd07ff74270063b38deaf9a5 bench_contract/ecdsa/ecdsa.sol +b6b50601c902ce0ecf065e461219fd5b5ef36ada76f813610519cf2091dcc6c6 bench_contract/ecdsa/ecdsa.wasm +e2a65433be49c7eaa839f4a5fb7bfc93292476be904f75f0d9f3f67dbe1f8931 bench_contract/erc1155/erc1155.sol +db58501ba952032a0b0e916de1d3b92393f710e4e36e2a005fa237919bd66ef0 bench_contract/erc1155/erc1155.wasm +f59a6922496018f1004d94c935d6147e0586a80aebd84ca310297b60d3fac25e bench_contract/erc1155/sol_erc1155.wasm +37b5ddd51fec31257feb31c4b9d7bd2b5a9ab224c2a89d79630e1e368fde62ff bench_contract/erc20/erc20.sol +9062d69da8330f24f2f153d68c46958d5d6afff630ecee13c4f588a5c51793e5 bench_contract/erc20/erc20.wasm +74d3f3df0feb9322e669ef9ee78bf1d0471504a9d7fe9980c356d136432ca226 bench_contract/erc20/sol_erc20.wasm +c04f2afff8c9b13bc79d6d4ca6a419231045c1606c867da9e84f249cc8c1a5d0 bench_contract/erc721/erc721.sol +e78ea0fea204ed8e686a9fa0dad66cb92f0b54480749be02738cda9bd723bf5e bench_contract/erc721/erc721.wasm +b89d619402ad99b86e80502f4ef57c30a4bf512d21b45a43088bbf2cd7c34605 bench_contract/erc721/sol_erc721.wasm +73a25f7e2535cba0ad25580d093e29b35fef47fb6f7120feb00e03a0c150c0c1 bench_contract/fibonacci/c_fib.wasm +cb1b468a1ff206a39e5f393815da53901f3fc64aa86ef17ff2354286c2a78a16 bench_contract/fibonacci/fib.sol +fc0033adeee85f96422fa9c9247a2717ce40efc6b61bf99e4d8482b9b71bb65b bench_contract/fibonacci/fib.wasm +c34728c6d1ac12cec7e917deed344e99da91b11e896ee75bac12095c54070860 bench_contract/fibonacci/sol_fib.wasm +50b1d52850a1d404a1b83bbc1f2495d3701ecafaf5c67f00aec7cb356fe17733 bench_contract/generative_nft/GenerativeNFT.sol +3a9e6d1ccac2f0af6ca3f8cc33f2cee76a100bce5e4031e0bbfa2fc985e2f12f bench_contract/generative_nft/GenerativeNFT.wasm +34b79231f2efd8ad1c021a93ab9a2890f7bb4adcc663172dc0bbd3cec5c3a1f0 bench_contract/merkle/MerkleProof.sol +32c700605b302f3f69af1e1242a01f476b9eb481dc5a6bd43276be89011f3ae0 bench_contract/merkle/MerkleProof.wasm +1e49516dae0cc9e5d57512b344fa2375c8e39fb2ce6de67dff6a8d31facab65a bench_contract/poseidon/Poseidon.wasm +b3fb1c2cc1590fb724e21ebb688db07a3b7f0d55157696a4351c583c859f3683 bench_contract/poseidon/poseidon.sol diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_erc20_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_erc20_wasm.hex new file mode 100644 index 000000000..67b6b85d7 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_erc20_wasm.hex @@ -0,0 +1 @@ +000007820061736d0100000001130460037f7f7f0060027f7f0060017f0060000002630603656e760c63616c6c44617461436f7079000003656e760b73746f726167654c6f6164000103656e760c73746f7261676553746f7265000103656e760967657443616c6c6572000203656e7606726576657274000103656e760666696e6973680001030302030305030100020608017f0141d089040b071a03066d656d6f727902000463616c6c0006066465706c6f7900070aa40d029e0d01037f41a0888080004100410410808080800002400240024041002d00a088808000220041f000460d01200041c000470d024120210041b0888080004104412010808080800041d0888080004124412010808080800041b08880800041f088808000108180808000410021010340200041ef888080006a2202200120022d00006a200041cf888080006a2d00006a22013a0000200041ee888080006a2202200141ff014b20022d00006a200041ce888080006a2d00006a22013a0000200141ff014b21012000417e6a22000d000b41b08880800041f0888080001082808080000f0b4120210041b0888080004104412010808080800041b08980800041f08880800010818080800041f08880800041201085808080000f0b41808880800041201084808080000b02000b0b2701004180080b2001020304050607080102030405060708010203040506070801020304050607080102030405060708 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_fib_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_fib_wasm.hex new file mode 100644 index 000000000..a01aecd3b --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/c_fib_wasm.hex @@ -0,0 +1 @@ +0061736d010000000140096000017f60037f7f7f0060017f0060027f7f0060000060017f017f60087e7e7e7e7e7e7e7e017f60047e7e7e7e017f600c7e7e7e7e7e7e7e7e7e7e7e7e017f02780703656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f70790001031d1c040303050300000003050105030303030304000004060708040404040405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300070463616c6c0020066465706c6f7900220ac83e1c02000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190b2800200028001c220041187420004180fe03714108747220004108764180fe0371200041187672720b9b0a01057f0240410028028080042202417f470d0041001000220236028080040b0240024002400240200041206a20024d0d00200220006b21030240200241e500480d0020012000200310010c020b024041002d0094cc040d0041b0cb04410020021001410041013a0094cc040b2003450d02200041b0cb046a210402400240200341077122050d0020032105200121060c010b200121060340200620042d00003a0000200641016a2106200441016a21042005417f6a22050d000b200341787121050b20034108490d02200541786a21050340200620042d00003a0000200620042d00013a0001200620042d00023a0002200620042d00033a0003200620042d00043a0004200620042d00053a0005200620042d00063a0006200620042d00073a00072005450d02200541786a2105200441086a2104200641086a21060c000b0b02402002417f470d0041001000220236028080040b0240200241e500480d0020012000412010010f0b024041002d0094cc040d0041b0cb04410020021001410041013a0094cc040b2001200041b0cb046a2d00003a00002001200041b1cb046a2d00003a00012001200041b2cb046a2d00003a00022001200041b3cb046a2d00003a00032001200041b4cb046a2d00003a00042001200041b5cb046a2d00003a00052001200041b6cb046a2d00003a00062001200041b7cb046a2d00003a00072001200041b8cb046a2d00003a00082001200041b9cb046a2d00003a00092001200041bacb046a2d00003a000a2001200041bbcb046a2d00003a000b2001200041bccb046a2d00003a000c2001200041bdcb046a2d00003a000d2001200041becb046a2d00003a000e2001200041bfcb046a2d00003a000f2001200041c0cb046a2d00003a00102001200041c1cb046a2d00003a00112001200041c2cb046a2d00003a00122001200041c3cb046a2d00003a00132001200041c4cb046a2d00003a00142001200041c5cb046a2d00003a00152001200041c6cb046a2d00003a00162001200041c7cb046a2d00003a00172001200041c8cb046a2d00003a00182001200041c9cb046a2d00003a00192001200041cacb046a2d00003a001a2001200041cbcb046a2d00003a001b2001200041cccb046a2d00003a001c2001200041cdcb046a2d00003a001d2001200041cecb046a2d00003a001e2001200041cfcb046a2d00003a001f0c020b2003411f4a0d010b200020026b2204411f6a2106024020044107712204450d000340200120036a41003a0000200341016a21032004417f6a22040d000b0b20064107490d00411820036b220641037621000240200641d801490d00200120036a2204200641787122066a2004490d00200441016a220520066a2005490d00200441026a220520066a2005490d00200441036a220520066a2005490d00200441046a220520066a2005490d00200441056a220520066a2005490d00200441066a220520066a2005490d00200441076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062004410f6a210402400340200441716a41003b0000200441736a41003a00002004410a6a41003600002004410e6a41003b0000200441746a4100360000200441786a41003b00002004417a6a4200370000200441026a4200370000200441106a41003a00002006450d012006417c6a2106200441206a21040c000b0b20052000460d014118200041037420036a22036b41037621000b200120036a2104200041037441086a21060340200441003a0000200441016a21042006417f6a22060d000b0b0b8308010d7f230041106b22002400410021010240410028028080042202417f470d0041001000220236028080040b02402002450d000240200241034b0d00410021032000410036020c024041002d0094cc040d0041b0cb04410020021001410041013a0094cc040b024002400240200241044f0d0041b0cb0421012000410c6a21040c010b2002417c71220341b0cb046a21012000410c6a20036a21044100210503402000410c6a20056a200541b0cb046a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f470d0041001000220236028080040b02400240200241e500480d00200041086a4100410410010c010b024041002d0094cc040d0041b0cb04410020021001410041013a0094cc040b200041002802b0cb043602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f0240410028028080042200417f470d0041001000220036028080040b20000b4402017f047e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b1000410028029ccc0420006a200110030b0c00410028029ccc0420006a0bb60501037f0240024041002802a8cc042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602a4cc04410020054180807c713602a8cc04410041002802a0cc0420034110746a3602a0cc040c010b41002802a4cc0420044f0d00410020043602a4cc040b410028029ccc04220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100522044f0d0020002001200210060f0b0240200441004a200120046b2204200148470d000240410028028080042201417f470d0041001000220136028080042001417f470d0041001000220136028080040b0240200141e500480d0020002004200210010c020b024041002d0094cc040d0041b0cb04410020011001410041013a0094cc040b2002450d01200441b0cb046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802a8cc04220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602a4cc04410020024180807c713602a8cc04410041002802a0cc0420014110746a3602a0cc0441e0000f0b024041002802a4cc0420004f0d00410020003602a4cc040b41e0000b920401037f0240200041206a22022000480d000240024041002802a8cc04220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602a4cc04410020044180807c713602a8cc04410041002802a0cc0420034110746a3602a0cc040c010b41002802a4cc0420024f0d00410020023602a4cc040b410028029ccc0420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802a8cc04220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602a4cc04410020074180807c713602a8cc04410041002802a0cc0420014110746a3602a0cc040c010b41002802a4cc0420024f0d00410020023602a4cc040b410028029ccc0420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802a8cc04220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602a4cc04410020044180807c713602a8cc04410041002802a0cc0420034110746a3602a0cc040c010b41002802a4cc0420024f0d00410020023602a4cc040b410028029ccc0420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b9103002001410028029ccc0420006a22002d00003a0000200120002d00013a0001200120002d00023a0002200120002d00033a0003200120002d00043a0004200120002d00053a0005200120002d00063a0006200120002d00073a0007200120002d00083a00082001200041096a2d00003a000920012000410a6a2d00003a000a20012000410b6a2d00003a000b20012000410c6a2d00003a000c20012000410d6a2d00003a000d20012000410e6a2d00003a000e20012000410f6a2d00003a000f2001200041106a2d00003a00102001200041116a2d00003a00112001200041126a2d00003a00122001200041136a2d00003a00132001200041146a2d00003a00142001200041156a2d00003a00152001200041166a2d00003a00162001200041176a2d00003a00172001200041186a2d00003a00182001200041196a2d00003a001920012000411a6a2d00003a001a20012000411b6a2d00003a001b20012000411c6a2d00003a001c20012000411d6a2d00003a001d20012000411e6a2d00003a001e20012000411f6a2d00003a001f0b1000410028029ccc0420006a200110040b0b00410041013a009080040b2501017f0240410028028080042200417f470d0041001000220036028080040b2000417c6a0bc80101027f024041002802948004220041ab024b0d004100200041016a3602948004200041057441a080046a0f0b024041002802a0cb0422000d0041003f004110743602a0cb04410140001a3f002100410041203602a8cb04410020004110743602a4cb0441002802a0cb040f0b0240200041002802a8cb0422016a220041206a41002802a4cb04490d00410140001a41003f004110743602a4cb04410041002802a8cb04220041206a3602a8cb04200041002802a0cb046a0f0b4100200141206a3602a8cb0420000b7e01027f024041002d0098cc040d00024002403f0022004102490d004100200041107436029ccc04410140001a3f004110742200410028029ccc046b21010c010b410041b0cc0436029ccc0441b0cc0521004180800121010b410020003602a0cc04410020013602a8cc04410041013a0098cc04410041003602a4cc040b0be50203037f017e017f230041e0006b22082400101a21092008220a200420007c220b370340200a200520017c200b200454220cad7c2204370348200a200620027c220b200c200420055420042005511bad7c2205370350200a41c0006a41186a200720037c200b200654ad7c2005200b54ad7c370300200a41c0006a200a41206a1009200941186a200a41206a41186a290000370000200941106a200a41206a41106a290000370000200941086a200a41206a41086a2900003700002009200a2900203700002009200a10080240200a29030020005a200a41086a290300220520015a20052001511b200a41106a290300220520025a200a41186a290300220120035a20012003511b2005200285200120038584501b0d00200841606a22082400200841186a428080808090ee9ea4ce0037030020084200370310200842003703082008420037030041002008101441044111101541004124100f0b200a41e0006a240020090bf40404047f037e017f037e230022042105101a21060240200042015620014200522001501b200242005220034200522003501b2002200384501b0d00024002402000a70e020001000b200441606a220422072400200441186a4200370300200442003703102004420037030820044200370300200741606a22072400200420071009200641186a200741186a290000370000200641106a200741106a290000370000200641086a200741086a290000370000200620072900003700002005240020060f0b200441606a220422072400200441186a4200370300200442003703102004420037030820044201370300200741606a22072400200420071009200641186a200741186a290000370000200641106a200741106a290000370000200641086a200741086a290000370000200620072900003700002005240020060f0b2000427f7c22082001427f7c220920082000542207ad7c220a2002427f7c22082007200a200154200a2001511bad7c220a20032008200254ad7c427f7c2202200a200854ad7c101d2107200441606a2204220b2400200720041008200441186a290300210a200441106a290300210c200441086a290300210d2004290300210e2000427e7c2203200920032000542204ad7c220320082004200320015420032001511bad7c220120022001200854ad7c101d2107200b41606a22042400200720041008200e200d200c200a2004290300200441086a290300200441106a290300200441186a290300101c22042900002101200441086a2900002103200441106a2900002100200641186a200441186a290000370000200641106a2000370000200641086a2003370000200620013700002005240020060b900401047f2300220c210d101a210e0240200042015620014200522001501b200242005220034200522003501b2002200384501b0d00024002402000a70e020001000b200c41606a220c220f2400200c41186a2007370300200c2006370310200c2005370308200c2004370300200f41606a220f2400200c200f1009200e41186a200f41186a290000370000200e41106a200f41106a290000370000200e41086a200f41086a290000370000200e200f290000370000200d2400200e0f0b200c41606a220c220f2400200c41186a200b370300200c200a370310200c2009370308200c2008370300200f41606a220f2400200c200f1009200e41186a200f41186a290000370000200e41106a200f41106a290000370000200e41086a200f41086a290000370000200e200f290000370000200d2400200e0f0b200420052006200720082009200a200b101c210f200c41606a220c2400200f200c10082000427f7c220720012007200054220fad7c427f7c22002002427f7c2207200f200020015420002001511bad7c220120032007200254ad7c2001200754ad7c427f7c20082009200a200b200c290300200c41086a290300200c41106a290300200c41186a290300101e220c2900002103200c41086a2900002101200c41106a2900002102200e41186a200c41186a290000370000200e41106a2002370000200e41086a2001370000200e2003370000200d2400200e0bd80201047f23002200210141800110121a41c00041e00010150240100d4104490d0002400240100c220241abc1b6e47a460d00200241f4ff918806470d020240100e450d0041004100100f0b02401019411f4b0d0041004100100f0b200041606a22022200240041042002100b200041606a2200220324002002200010082000290300200041086a290300200041106a290300200041186a290300101d2102200341606a2200240041c000200010162000100a2200200210130c010b0240100e450d0041004100100f0b02401019411f4b0d0041004100100f0b200041606a22022200240041042002100b200041606a2200220324002002200010082000290300200041086a290300200041106a290300200041186a29030042004200420042004201420042004200101e2102200341606a2200240041c000200010162000100a2200200210130b2000412010170b41004100100f200124000b0400101f0b0400101b0b3700101841800110121a41c00041e00010150240100e450d0041004100100f0b41e00041b0cc05410010106b4104101141e000410410170b0b280400418080040b04ffffffff004198cc040b010100419ecc040b0502000000030041aacc040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600cf07046e616d6501a90723000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f707907115f5f7761736d5f63616c6c5f63746f7273081a753235365f66726f6d5f6269675f656e6469616e5f62797465730918753235365f746f5f6269675f656e6469616e5f62797465730a1b6933325f66726f6d5f6269675f656e6469616e5f627974657333320b1c777261707065725f63616c6c646174616c6f61645f627974657333320c1e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f720d15777261707065725f63616c6c646174615f73697a650e1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f0f0e777261707065725f726576657274101365766d5f6765745f6d656d6f72795f616464721110777261707065725f636f6465636f70791214777261707065725f6d656d6f72795f67756172641316777261707065725f6d73746f72655f627974657333321413777261707065725f6d73746f72655f753235361512777261707065725f6d73746f72655f7533321615777261707065725f6d6c6f61645f62797465733332170e777261707065725f72657475726e18137365745f69735f6465706c6f79696e675f7478191d777261707065725f63616c6c646174615f73697a655f6d696e75735f341a156d656d6f72795f616c6c6f63615f627974657333321b0f5f5f696e69745f65766d5f686561701c574669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e636865636b65645f6164645f75696e743235361d514669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e66756e5f6669626f6e616363691e5e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e66756e5f6669626f6e616363695461696c5265637572736976651f484669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e696e6974200463616c6c21065f737461727422066465706c6f79071201000f5f5f737461636b5f706f696e74657209080100052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/counter_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/counter_evm.hex new file mode 100644 index 000000000..ac92d33aa --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/counter_evm.hex @@ -0,0 +1 @@ +6080806040523460135760d8908160188239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c90816306661abd14608b57508063d732d95514606f5763e8927fbc146039575f80fd5b34606b575f366003190112606b575f545f1981146057576001015f55005b634e487b7160e01b5f52601160045260245ffd5b5f80fd5b34606b575f366003190112606b575f5480156057575f19015f55005b34606b575f366003190112606b576020905f548152f3fea2646970667358221220c86a4479700aacf9a5200f25d2f804a6dcd8dfbaf80a79b1358b5cbc0f77014e64736f6c63430008190033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/ecdsa_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/ecdsa_evm.hex new file mode 100644 index 000000000..d8a0db976 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/ecdsa_evm.hex @@ -0,0 +1 @@ +6080604052348015600e575f80fd5b5061099c8061001c5f395ff3fe60806040526004361061001d575f3560e01c8063ade9ec4114610021575b5f80fd5b61002961003d565b604051901515815260200160405180910390f35b5f7faf2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268e9891562113d8a62add1bf7fefd48b2aacb6a8fd1140dd9cd45e81d69d2c877b56aaf991c34d0ea84eaf37167f0834e36ad29a83bf2bc9385e491d6099c8fdf9d1ed67aa7ea5f51f93782857a97f60fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67f7903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299856100f186868686866100fc565b979650505050505050565b5f61010785856101ae565b158061011a57506101188383610208565b155b1561012657505f6101a5565b5f610131848461026c565b90505f61014b865f8051602061094783398151915261045f565b90505f5f80516020610947833981519152828a0990505f5f80516020610947833981519152838a0990505f61018185848461046e565b5090508961019c5f8051602061094783398151915283610913565b14955050505050505b95945050505050565b5f82158015906101ca57505f8051602061094783398151915283105b80156101d557508115155b801561020157507f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a88211155b9392505050565b5f600160601b63ffffffff60c01b031980838409817f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8387856003600160601b0363ffffffff60c01b0319878b8c0908090894821191909310169190921416919050565b6102746108cc565b60405180606001604052805f81526020015f81526020015f815250815f601081106102a1576102a1610932565b602002018190525060405180606001604052808481526020018381526020016001815250816001601081106102d8576102d8610932565b602002018190525060405180606001604052807f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29681526020017f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5815260200160018152508160046010811061034f5761034f610932565b60200201526103658160015b6020020151610592565b604082015261037581600461035b565b6101008201526020810151610392908260025b60200201516105ee565b60608201526103ab8160015b6020020151826004610388565b60a08201526103bb81600261039e565b60c08201526103cb81600361039e565b60e08201526103e48160015b6020020151826008610388565b6101208201526103f58160026103d7565b6101408201526104068160036103d7565b6101608201526104178160046103d7565b6101808201526104318160015b602002015182600c610388565b6101a0820152610442816002610424565b6101c0820152610453816003610424565b6101e082015292915050565b5f61020183600284038461064c565b5f805f805f805b60808110156105765781156104a95761048f84848461066d565b919550935091506104a184848461066d565b919550935091505b600c60fc89901c1660fe88901c178981601081106104c9576104c9610932565b6020020151604001511561056257825f03610538578981601081106104f0576104f0610932565b6020020151518a826010811061050857610508610932565b6020020151602001518b836010811061052357610523610932565b60200201516040015191965094509250610562565b61055a8a826010811061054d5761054d610932565b60200201518686866106f0565b919650945092505b50600297881b979690961b95600101610475565b5061058283838361081c565b945094505050505b935093915050565b6105b360405180606001604052805f81526020015f81526020015f81525090565b5f805f6105cc855f01518660200151876040015161066d565b6040805160608101825293845260208401929092529082015295945050505050565b61060f60405180606001604052805f81526020015f81526020015f81525090565b5f805f61062986865f0151876020015188604001516106f0565b604080516060810182529384526020840192909252908201529695505050505050565b5f805f61065a868686610869565b91509150816101a5576101a560126108bb565b5f805f600160601b63ffffffff60c01b031980868709818687098283848384096003600160601b0363ffffffff60c01b03190984858c8d096003090890508283838b09600409838482600209850385848509089650838485858609600809850385868a880385088509089550505050808186880960020991505093509350939050565b5f805f600160601b63ffffffff60c01b0319604088015181818209828388858a8b090960208c0151098381850385868686098c090884858a8b098d51098581870387868f090893508115841516801561075057600181146107965761080b565b868586098788898386096002098903898a848a098b038b88890908089a5087888983890987098903898a8e8c038c8689090887090899505086878c88098609975061080b565b8c8c8c898283098a8283098b8c8d8384096003600160601b0363ffffffff60c01b0319098d8e8889096003090890508b8c83870960040994508b8c866002098d038d838409089e508b8c8384096008098c0391508b8f8d03860894508b828d878409089d505050898a8284096002099a505050505b505050505050509450945094915050565b5f80825f0361082f57505f90508061058a565b600160601b63ffffffff60c01b03195f610849858361045f565b905081818209828189099450828383830988099350505050935093915050565b5f80825f0361087c57505f90508061058a565b60405160208152602080820152602060408201528560608201528460808201528360a082015260205f60c08360055afa9250505f519050935093915050565b634e487b715f52806020526024601cfd5b6040518061020001604052806010905b6108fd60405180606001604052805f81526020015f81526020015f81525090565b8152602001906001900390816108dc5790505090565b5f8261092d57634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52603260045260245ffdfeffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551a2646970667358221220ea93ccff0e445bb56ad8512a41922026a87b634e5bba913c1332896002e8d3c964736f6c634300081a0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc1155_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc1155_evm.hex new file mode 100644 index 000000000..291f90434 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc1155_evm.hex @@ -0,0 +1 @@ +60806040523461002757610011610318565b61001961002c565b61211f61068f823961211f90f35b610032565b60405190565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061005e90610036565b810190811060018060401b0382111761007657604052565b610040565b9061008e61008761002c565b9283610054565b565b60018060401b0381116100ac576100a8602091610036565b0190565b610040565b906100c36100be83610090565b61007b565b918252565b60207f647d2e6a736f6e00000000000000000000000000000000000000000000000000917f68747470733a2f2f67616d652e6578616d706c652f6170692f6974656d2f7b695f8201520152565b61011f60276100b1565b9061012c602083016100c8565b565b610136610115565b90565b634e487b7160e01b5f52602260045260245ffd5b906001600283049216801561016d575b602083101461016857565b610139565b91607f169161015d565b5f5260205f2090565b601f602091010490565b1b90565b919060086101a99102916101a35f198461018a565b9261018a565b9181191691161790565b90565b90565b6101cd6101c86101d2926101b3565b6101b6565b6101b3565b90565b90565b91906101ee6101e96101f6936101b9565b6101d5565b90835461018e565b9055565b5f90565b6102109161020a6101fa565b916101d8565b565b5b81811061021e575050565b8061022b5f6001936101fe565b01610213565b9190601f8111610241575b505050565b61024d61027293610177565b90602061025984610180565b8301931061027a575b61026b90610180565b0190610212565b5f808061023c565b915061026b81929050610262565b61029d600d610297835461014d565b83610231565b601a7f4d792047616d65204974656d7300000000000000000000000000000000000000019055565b6102ce90610288565b565b6102e5600e6102df835461014d565b83610231565b601c7f5465737447616d6553796d626f6c000000000000000000000000000000000000019055565b610316906102d0565b565b61032a3361032461012e565b906103a4565b61033460046102c5565b61033e600561030d565b565b90565b60018060a01b031690565b61036261035d61036792610340565b6101b6565b610343565b90565b6103739061034e565b90565b61037f90610343565b90565b61038b90610376565b9052565b91906103a2905f60208501940190610382565b565b906103ae90610400565b806103c96103c36103be5f61036a565b610376565b91610376565b146103d9576103d7906104b8565b565b6103fc6103e55f61036a565b5f918291631e4fbdf760e01b83526004830161038f565b0390fd5b61040990610681565b565b5f1c90565b60018060a01b031690565b61042761042c9161040b565b610410565b90565b610439905461041b565b90565b5f1b90565b9061045260018060a01b039161043c565b9181191691161790565b61047061046b61047592610343565b6101b6565b610343565b90565b6104819061045c565b90565b61048d90610478565b90565b90565b906104a86104a36104af92610484565b610490565b8254610441565b9055565b5f0190565b6104c2600361042f565b6104cd826003610493565b906105016104fb7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610484565b91610484565b9161050a61002c565b80610514816104b3565b0390a3565b5190565b5f5260205f2090565b9190601f8111610536575b505050565b6105426105679361051d565b90602061054e84610180565b8301931061056f575b61056090610180565b0190610212565b5f8080610531565b915061056081929050610557565b1c90565b90610591905f199060080261057d565b191690565b816105a091610581565b906002021790565b906105b281610519565b9060018060401b038211610670576105d4826105ce855461014d565b85610526565b602090601f8311600114610608579180916105f7935f926105fc575b5050610596565b90555b565b90915001515f806105f0565b601f198316916106178561051d565b925f5b8181106106585750916002939185600196941061063e575b505050020190556105fa565b61064e910151601f841690610581565b90555f8080610632565b9193602060018192878701518155019501920161061a565b610040565b9061067f916105a8565b565b61068c906002610675565b56fe60806040526004361015610013575b610d20565b61001d5f3561010b565b8062fdd58e1461010657806301ffc9a71461010157806306fdde03146100fc5780630e89341c146100f75780631f7fdffa146100f25780632eb2c2d6146100ed5780634e1273f4146100e8578063715018a6146100e3578063731133e9146100de5780638da5cb5b146100d957806395d89b41146100d4578063a22cb465146100cf578063e985e9c5146100ca578063f242432a146100c55763f2fde38b0361000e57610ced565b610c98565b610bf3565b610b92565b610b0d565b610ac9565b610a70565b6109de565b6109a8565b6107de565b610708565b610500565b6104ad565b61027c565b6101d2565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b60018060a01b031690565b61013790610123565b90565b6101438161012e565b0361014a57565b5f80fd5b9050359061015b8261013a565b565b90565b6101698161015d565b0361017057565b5f80fd5b9050359061018182610160565b565b91906040838203126101ab578061019f6101a8925f860161014e565b93602001610174565b90565b61011b565b6101b99061015d565b9052565b91906101d0905f602085019401906101b0565b565b34610203576101ff6101ee6101e8366004610183565b90610dd0565b6101f6610111565b918291826101bd565b0390f35b610117565b63ffffffff60e01b1690565b61021d81610208565b0361022457565b5f80fd5b9050359061023582610214565b565b906020828203126102505761024d915f01610228565b90565b61011b565b151590565b61026390610255565b9052565b919061027a905f6020850194019061025a565b565b346102ac576102a8610297610292366004610237565b610dfb565b61029f610111565b91829182610267565b0390f35b610117565b5f9103126102bb57565b61011b565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015610307575b602083101461030257565b6102d3565b91607f16916102f7565b60209181520190565b5f5260205f2090565b905f929180549061033d610336836102e7565b8094610311565b916001811690815f146103945750600114610358575b505050565b610365919293945061031a565b915f925b81841061037c57505001905f8080610353565b60018160209295939554848601520191019290610369565b92949550505060ff19168252151560200201905f8080610353565b906103b991610323565b90565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906103e4906103bc565b810190811067ffffffffffffffff8211176103fe57604052565b6103c6565b9061042361041c92610413610111565b938480926103af565b03836103da565b565b905f106104385761043590610403565b90565b6102c0565b61044960045f90610425565b90565b5190565b60209181520190565b90825f9392825e0152565b61048361048c6020936104919361047a8161044c565b93848093610450565b95869101610459565b6103bc565b0190565b6104aa9160208201915f818403910152610464565b90565b346104dd576104bd3660046102b1565b6104d96104c861043d565b6104d0610111565b91829182610495565b0390f35b610117565b906020828203126104fb576104f8915f01610174565b90565b61011b565b346105305761052c61051b6105163660046104e2565b610e74565b610523610111565b91829182610495565b0390f35b610117565b5f80fd5b9061054c610545610111565b92836103da565b565b67ffffffffffffffff81116105665760208091020190565b6103c6565b5f80fd5b9092919261058461057f8261054e565b610539565b93818552602080860192028301928184116105c157915b8383106105a85750505050565b602080916105b68486610174565b81520192019161059b565b61056b565b9080601f830112156105e4578160206105e19335910161056f565b90565b610535565b5f80fd5b67ffffffffffffffff811161060b576106076020916103bc565b0190565b6103c6565b90825f939282370152565b9092919261063061062b826105ed565b610539565b9381855260208501908284011161064c5761064a92610610565b565b6105e9565b9080601f8301121561066f5781602061066c9335910161061b565b90565b610535565b906080828203126106fe5761068b815f840161014e565b92602083013567ffffffffffffffff81116106f957826106ac9185016105c6565b92604081013567ffffffffffffffff81116106f457836106cd9183016105c6565b92606082013567ffffffffffffffff81116106ef576106ec9201610651565b90565b61011f565b61011f565b61011f565b61011b565b5f0190565b3461073a5761072461071b366004610674565b92919091610eb1565b61072c610111565b8061073681610703565b0390f35b610117565b91909160a0818403126107d957610758835f830161014e565b92610766816020840161014e565b92604083013567ffffffffffffffff81116107d457826107879185016105c6565b92606081013567ffffffffffffffff81116107cf57836107a89183016105c6565b92608082013567ffffffffffffffff81116107ca576107c79201610651565b90565b61011f565b61011f565b61011f565b61011b565b34610810576107fa6107f136600461073f565b93929092610ee2565b610802610111565b8061080c81610703565b0390f35b610117565b67ffffffffffffffff811161082d5760208091020190565b6103c6565b9092919261084761084282610815565b610539565b938185526020808601920283019281841161088457915b83831061086b5750505050565b60208091610879848661014e565b81520192019161085e565b61056b565b9080601f830112156108a7578160206108a493359101610832565b90565b610535565b919091604081840312610904575f81013567ffffffffffffffff81116108ff57836108d8918301610889565b92602082013567ffffffffffffffff81116108fa576108f792016105c6565b90565b61011f565b61011f565b61011b565b5190565b60209181520190565b60200190565b6109259061015d565b9052565b906109368160209361091c565b0190565b60200190565b9061095d61095761095084610909565b809361090d565b92610916565b905f5b81811061096d5750505090565b9091926109866109806001928651610929565b9461093a565b9101919091610960565b6109a59160208201915f818403910152610940565b90565b346109d9576109d56109c46109be3660046108ac565b9061103a565b6109cc610111565b91829182610990565b0390f35b610117565b34610a0c576109ee3660046102b1565b6109f661116f565b6109fe610111565b80610a0881610703565b0390f35b610117565b90608082820312610a6b57610a28815f840161014e565b92610a368260208501610174565b92610a448360408301610174565b92606082013567ffffffffffffffff8111610a6657610a639201610651565b90565b61011f565b61011b565b34610aa257610a8c610a83366004610a11565b9291909161119f565b610a94610111565b80610a9e81610703565b0390f35b610117565b610ab09061012e565b9052565b9190610ac7905f60208501940190610aa7565b565b34610af957610ad93660046102b1565b610af5610ae46111dd565b610aec610111565b91829182610ab4565b0390f35b610117565b610b0a60055f90610425565b90565b34610b3d57610b1d3660046102b1565b610b39610b28610afe565b610b30610111565b91829182610495565b0390f35b610117565b610b4b81610255565b03610b5257565b5f80fd5b90503590610b6382610b42565b565b9190604083820312610b8d5780610b81610b8a925f860161014e565b93602001610b56565b90565b61011b565b34610bc157610bab610ba5366004610b65565b906111f3565b610bb3610111565b80610bbd81610703565b0390f35b610117565b9190604083820312610bee5780610be2610beb925f860161014e565b9360200161014e565b90565b61011b565b34610c2457610c20610c0f610c09366004610bc6565b9061125c565b610c17610111565b91829182610267565b0390f35b610117565b91909160a081840312610c9357610c42835f830161014e565b92610c50816020840161014e565b92610c5e8260408501610174565b92610c6c8360608301610174565b92608082013567ffffffffffffffff8111610c8e57610c8b9201610651565b90565b61011f565b61011b565b34610cca57610cb4610cab366004610c29565b93929092611284565b610cbc610111565b80610cc681610703565b0390f35b610117565b90602082820312610ce857610ce5915f0161014e565b90565b61011b565b34610d1b57610d05610d00366004610ccf565b611362565b610d0d610111565b80610d1781610703565b0390f35b610117565b5f80fd5b5f90565b90565b610d3f610d3a610d449261015d565b610d28565b61015d565b90565b90610d5190610d2b565b5f5260205260405f2090565b610d71610d6c610d7692610123565b610d28565b610123565b90565b610d8290610d5d565b90565b610d8e90610d79565b90565b90610d9b90610d85565b5f5260205260405f2090565b5f1c90565b90565b610dbb610dc091610da7565b610dac565b90565b610dcd9054610daf565b90565b610def90610dea610df493610de3610d24565b505f610d47565b610d91565b610dc3565b90565b5f90565b610e03610df7565b5080610e1e610e18636cdb3d1360e11b610208565b91610208565b148015610e42575b908115610e32575b5090565b610e3c915061136d565b5f610e2e565b5080610e5d610e576303a24d0760e21b610208565b91610208565b14610e26565b606090565b610e7190610403565b90565b50610e7d610e63565b50610e886002610e68565b90565b90610e9f939291610e9a611393565b610ea1565b565b91610eaf93919091926113e1565b565b90610ebd939291610e8b565b565b916020610ee0929493610ed960408201965f830190610aa7565b0190610aa7565b565b949391929092610ef0611445565b86610f03610efd8361012e565b9161012e565b141580610f41575b610f215750610f1f94959390919293611452565b565b8690610f3d5f92839263711bec9160e11b845260048401610ebf565b0390fd5b50610f56610f5088839061125c565b15610255565b610f0b565b606090565b5190565b916020610f85929493610f7e60408201965f8301906101b0565b01906101b0565b565b90610f99610f948361054e565b610539565b918252565b369037565b90610fc8610fb083610f87565b92602080610fbe869361054e565b9201910390610f9e565b565b90565b610fe1610fdc610fe692610fca565b610d28565b61015d565b90565b6001610ff5910161015d565b90565b634e487b7160e01b5f52603260045260245ffd5b9061101682610909565b811015611027576020809102010190565b610ff8565b906110369061015d565b9052565b90611043610f5b565b5061104d82610f60565b61106761106161105c84610909565b61015d565b9161015d565b036110f15761107d61107883610f60565b610fa3565b916110875f610fcd565b5b806110a361109d61109885610f60565b61015d565b9161015d565b10156110eb576110e6906110e16110cf6110be8584906114f4565b6110c987859061150a565b90610dd0565b6110dc879184909261100c565b61102c565b610fe9565b611088565b50505090565b6110fd61110391610909565b91610f60565b9061111e5f928392635b05999160e01b845260048401610f64565b0390fd5b61112a611393565b61113261115c565b565b61114861114361114d92610fca565b610d28565b610123565b90565b61115990611134565b90565b61116d6111685f611150565b611563565b565b611177611122565b565b9061118d939291611188611393565b61118f565b565b9161119d93919091926115c4565b565b906111ab939291611179565b565b5f90565b60018060a01b031690565b6111c86111cd91610da7565b6111b1565b90565b6111da90546111bc565b90565b6111e56111ad565b506111f060036111d0565b90565b611207916111ff611445565b919091611676565b565b9061121390610d85565b5f5260205260405f2090565b9061122990610d85565b5f5260205260405f2090565b60ff1690565b61124761124c91610da7565b611235565b90565b611259905461123b565b90565b6112819161127761127c9261126f610df7565b506001611209565b61121f565b61124f565b90565b949391929092611292611445565b866112a561129f8361012e565b9161012e565b1415806112e3575b6112c357506112c19495939091929361172e565b565b86906112df5f92839263711bec9160e11b845260048401610ebf565b0390fd5b506112f86112f288839061125c565b15610255565b6112ad565b61130e90611309611393565b611310565b565b8061132b6113256113205f611150565b61012e565b9161012e565b1461133b5761133990611563565b565b61135e6113475f611150565b5f918291631e4fbdf760e01b835260048301610ab4565b0390fd5b61136b906112fd565b565b611375610df7565b5061138f6113896301ffc9a760e01b610208565b91610208565b1490565b61139b6111dd565b6113b46113ae6113a9611445565b61012e565b9161012e565b036113bb57565b6113dd6113c6611445565b5f91829163118cdaa760e01b835260048301610ab4565b0390fd5b91929092826114006113fa6113f55f611150565b61012e565b9161012e565b1461141e5761141c936114125f611150565b93909192936117f8565b565b61144161142a5f611150565b5f918291632bfa23e760e11b835260048301610ab4565b0390fd5b61144d6111ad565b503390565b93919290928361147261146c6114675f611150565b61012e565b9161012e565b146114cd578461149261148c6114875f611150565b61012e565b9161012e565b146114a7576114a59493909192936117f8565b565b6114c96114b35f611150565b5f918291626a0d4560e21b835260048301610ab4565b0390fd5b6114f06114d95f611150565b5f918291632bfa23e760e11b835260048301610ab4565b0390fd5b90602080916115016111ad565b50029101015190565b9060208091611517610d24565b50029101015190565b5f1b90565b9061153660018060a01b0391611520565b9181191691161790565b90565b9061155861155361155f92610d85565b611540565b8254611525565b9055565b61156d60036111d0565b611578826003611543565b906115ac6115a67f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d85565b91610d85565b916115b5610111565b806115bf81610703565b0390a3565b919290826115e26115dc6115d75f611150565b61012e565b9161012e565b1461160a57611608936115f4916118b4565b906115fe5f611150565b93909192936117f8565b565b61162d6116165f611150565b5f918291632bfa23e760e11b835260048301610ab4565b0390fd5b9061163d60ff91611520565b9181191691161790565b61165090610255565b90565b90565b9061166b61166661167292611647565b611653565b8254611631565b9055565b9190918261169461168e6116895f611150565b61012e565b9161012e565b14611708576116b8826116b36116ac60018590611209565b869061121f565b611656565b9190916117036116f16116eb7f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3193610d85565b93610d85565b936116fa610111565b91829182610267565b0390a3565b61172a6117145f611150565b5f91829162ced3e160e81b835260048301610ab4565b0390fd5b909293918361174d6117476117425f611150565b61012e565b9161012e565b146117b2578161176d6117676117625f611150565b61012e565b9161012e565b1461178c5761178a9461177f916118b4565b9193909192936117f8565b565b6117ae6117985f611150565b5f918291626a0d4560e21b835260048301610ab4565b0390fd5b6117d56117be5f611150565b5f918291632bfa23e760e11b835260048301610ab4565b0390fd5b90565b6117f06117eb6117f5926117d9565b610d28565b61015d565b90565b9293919361180a8483879084926119d4565b8161182561181f61181a5f611150565b61012e565b9161012e565b03611832575b5050505050565b61183a611445565b9161184486610909565b61185761185160016117dc565b9161015d565b145f1461189e57611887611877611893976118715f610fcd565b9061150a565b926118815f610fcd565b9061150a565b92949091929394611f8a565b5b5f8080808061182b565b6118af959192949091929394611dda565b611894565b916118bd610f5b565b506118c6610f5b565b5060405192600184526020840152604083019160018352602083015260408201604052565b6119206119279461191660609498979561190c608086019a5f870190610aa7565b60208501906101b0565b60408301906101b0565b01906101b0565b565b90611934910361015d565b90565b906119435f1991611520565b9181191691161790565b90565b9061196561196061196c92610d2b565b61194d565b8254611937565b9055565b634e487b7160e01b5f52601160045260245ffd5b6119936119999193929361015d565b9261015d565b82018092116119a457565b611970565b90916119c36119d19360408401908482035f860152610940565b916020818403910152610940565b90565b939290916119e181610909565b6119fb6119f56119f085610909565b61015d565b9161015d565b03611c7657611a08611445565b93611a125f610fcd565b5b80611a2e611a28611a2386610909565b61015d565b9161015d565b1015611b6c57611a3f83829061150a565b611a4a85839061150a565b9088611a66611a60611a5b5f611150565b61012e565b9161012e565b03611ad6575b90611a9a929187611a8d611a87611a825f611150565b61012e565b9161012e565b03611a9f575b5050610fe9565b611a13565b611ac9611aba611ab3611acf94935f610d47565b8a90610d91565b91611ac483610dc3565b611984565b90611950565b5f80611a93565b611af3611aee611ae75f8490610d47565b8b90610d91565b610dc3565b80611b06611b008561015d565b9161015d565b10611b425790611b39611b1f611a9a9594938490611929565b611b34611b2d5f8590610d47565b8d90610d91565b611950565b90919250611a6c565b90611b68908a9293611b52610111565b9485946303dee4c560e01b8652600486016118eb565b0390fd5b509490929192611b7b81610909565b611b8e611b8860016117dc565b9161015d565b145f14611c1757611bab611bbb91611ba55f610fcd565b9061150a565b93611bb55f610fcd565b9061150a565b9390919293611bfc611bf6611bf07fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6294610d85565b94610d85565b94610d85565b94611c11611c08610111565b92839283610f64565b0390a45b565b929390919293611c59611c53611c4d7f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb94610d85565b94610d85565b94610d85565b94611c6e611c65610111565b928392836119a9565b0390a4611c15565b611c82611c8891610909565b91610909565b90611ca35f928392635b05999160e01b845260048401610f64565b0390fd5b611cb090610d5d565b90565b611cbc90611ca7565b90565b611cc890610d79565b90565b60e01b90565b90505190611cde82610214565b565b90602082820312611cf957611cf6915f01611cd1565b90565b61011b565b5190565b60209181520190565b611d2a611d33602093611d3893611d2181611cfe565b93848093611d02565b95869101610459565b6103bc565b0190565b9390611d7690611d929694611d69611d8495611d5f60a08a01945f8b0190610aa7565b6020890190610aa7565b8682036040880152610940565b908482036060860152610940565b916080818403910152611d0b565b90565b90611da7611da2836105ed565b610539565b918252565b606090565b3d5f14611dcc57611dc13d611d95565b903d5f602084013e5b565b611dd4611dac565b90611dca565b94909194939293853b611df5611def5f610fcd565b9161015d565b11611e03575b505050505050565b5f611e3f91611e4a602096611e1f611e1a8b611cb3565b611cbf565b9563bc197c81939799919091611e33610111565b9a8b998a988997611ccb565b875260048701611d3c565b03925af180915f92611f09575b50155f14611ec657506001611e7357505b5f8080808080611dfb565b611e7b611db1565b90611e8582611cfe565b611e97611e915f610fcd565b9161015d565b145f14611ebd57611eb9905f918291632bfa23e760e11b835260048301610ab4565b0390fd5b50805190602001fd5b611edf611ed963bc197c8160e01b610208565b91610208565b03611eea5750611e68565b611f05905f918291632bfa23e760e11b835260048301610ab4565b0390fd5b611f2b91925060203d8111611f32575b611f2381836103da565b810190611ce0565b905f611e57565b503d611f19565b9193611f70611f879694611f66611f7a9497611f5c60a08801995f890190610aa7565b6020870190610aa7565b60408501906101b0565b60608301906101b0565b6080818403910152611d0b565b90565b94909194939293853b611fa5611f9f5f610fcd565b9161015d565b11611fb3575b505050505050565b5f611fef91611ffa602096611fcf611fca8b611cb3565b611cbf565b9563f23a6e61939799919091611fe3610111565b9a8b998a988997611ccb565b875260048701611f39565b03925af180915f926120b9575b50155f146120765750600161202357505b5f8080808080611fab565b61202b611db1565b9061203582611cfe565b6120476120415f610fcd565b9161015d565b145f1461206d57612069905f918291632bfa23e760e11b835260048301610ab4565b0390fd5b50805190602001fd5b61208f61208963f23a6e6160e01b610208565b91610208565b0361209a5750612018565b6120b5905f918291632bfa23e760e11b835260048301610ab4565b0390fd5b6120db91925060203d81116120e2575b6120d381836103da565b810190611ce0565b905f612007565b503d6120c956fea26469706673582212205e2008c20001cfe636b50f18da2a163d03671d1f3ed159cd10360c3e3ec333d064736f6c634300081d0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc20_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc20_evm.hex new file mode 100644 index 000000000..bd81f5021 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc20_evm.hex @@ -0,0 +1 @@ +608034610370576001600160401b0390601f601f19610abd3881900383810183168501868111868210176103745785928291604052833960209485918101031261037057519361004d610388565b926004938481526311dbdb1960e21b86820152610068610388565b916003928381526211d31160ea1b88820152825185811161035d578454936001948581811c91168015610353575b8b821014610340579081858493116102f2575b508a90858311600114610296575f9261028b575b50505f1982871b1c191690841b1784555b80519485116102785786548381811c9116801561026e575b8982101461025b57828111610218575b50879185116001146101b857849550908492915f956101ad575b50501b925f19911b1c19161781555b3315610196576002549083820180921161018357505f917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91600255338352828152604083208481540190556040519384523393a360405161071590816103a88239f35b601190634e487b7160e01b5f525260245ffd5b6024905f6040519163ec442f0560e01b8352820152fd5b015193505f80610110565b929194841692865f5284885f20945f5b8a8983831061020157505050106101e8575b50505050811b01815561011f565b01519060f8845f19921b161c191690555f8080806101da565b8686015189559097019694850194889350016101c8565b875f52885f208380880160051c8201928b8910610252575b0160051c019084905b8281106102475750506100f6565b5f8155018490610239565b92508192610230565b602288634e487b7160e01b5f525260245ffd5b90607f16906100e6565b604187634e487b7160e01b5f525260245ffd5b015190505f806100bd565b908987941691885f528c5f20928d5f905b8282106102db57505084116102c4575b505050811b0184556100ce565b01515f1983891b60f8161c191690555f80806102b7565b8385015186558a979095019493840193018e6102a7565b909150865f528a5f208580850160051c8201928d8610610337575b918891869594930160051c01915b8281106103295750506100a9565b5f815585945088910161031b565b9250819261030d565b60228a634e487b7160e01b5f525260245ffd5b90607f1690610096565b604188634e487b7160e01b5f525260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b60408051919082016001600160401b038111838210176103745760405256fe6080604090808252600480361015610015575f80fd5b5f3560e01c91826306fdde03146104d757508163095ea7b31461042f57816318160ddd1461041157816323b872dd1461031f578163313ce5671461030457816340c10f191461025f57816370a082311461022957816395d89b411461010a57508063a9059cbb146100da5763dd62ed3e1461008e575f80fd5b346100d657806003193601126100d6576020906100a96105d9565b6100b16105ef565b9060018060a01b038091165f5260018452825f2091165f528252805f20549051908152f35b5f80fd5b50346100d657806003193601126100d6576020906101036100f96105d9565b6024359033610605565b5160018152f35b82346100d6575f3660031901126100d6578051905f835460018160011c906001831692831561021f575b602093848410811461020c578388529081156101f0575060011461019c575b505050829003601f01601f191682019267ffffffffffffffff84118385101761018957508291826101859252826105af565b0390f35b604190634e487b7160e01b5f525260245ffd5b5f878152929350837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106101dc5750505050830101848080610153565b8054888601830152930192849082016101c6565b60ff1916878501525050151560051b8401019050848080610153565b602289634e487b7160e01b5f525260245ffd5b91607f1691610134565b82346100d65760203660031901126100d6576020906001600160a01b0361024e6105d9565b165f525f8252805f20549051908152f35b82346100d657806003193601126100d6576102786105d9565b6001600160a01b031691602435919083156102ef57600254908382018092116102dc57505f927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9260209260025585855284835280852082815401905551908152a3005b601190634e487b7160e01b5f525260245ffd5b5f602492519163ec442f0560e01b8352820152fd5b82346100d6575f3660031901126100d6576020905160128152f35b9050346100d65760603660031901126100d65761033a6105d9565b6103426105ef565b906044359260018060a01b038216805f526001602052855f20335f52602052855f2054915f19831061037d575b602087610103888888610605565b8583106103e55781156103cf5733156103b957505f9081526001602090815286822033835281529086902091859003909155829061010361036f565b6024905f885191634a1406b160e11b8352820152fd5b6024905f88519163e602df0560e01b8352820152fd5b8651637dc7a0d960e11b8152339181019182526020820193909352604081018690528291506060010390fd5b82346100d6575f3660031901126100d6576020906002549051908152f35b82346100d657806003193601126100d6576104486105d9565b6024359033156104c1576001600160a01b03169081156104ab5760209350335f5260018452825f20825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8251634a1406b160e11b81525f81860152602490fd5b825163e602df0560e01b81525f81860152602490fd5b83346100d6575f3660031901126100d6575f60035460018160011c90600183169283156105a5575b602093848410811461020c578388529081156101f0575060011461054f57505050829003601f01601f191682019267ffffffffffffffff84118385101761018957508291826101859252826105af565b60035f908152929350837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106105915750505050830101848080610153565b80548886018301529301928490820161057b565b91607f16916104ff565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100d657565b602435906001600160a01b03821682036100d657565b916001600160a01b038084169283156106c757169283156106af57825f525f60205260405f20549082821061067d5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f5260405f20818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b60405163ec442f0560e01b81525f6004820152602490fd5b604051634b637e8f60e11b81525f6004820152602490fdfea26469706673582212208cbf42750af9ce626ac1e2be84ba9e14ac467bdcfd18d75ca077d731635b74b264736f6c634300081900330000000000000000000000000000000000c097ce7bc90715b34b9f1000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc721_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc721_evm.hex new file mode 100644 index 000000000..85dad1ab1 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/erc721_evm.hex @@ -0,0 +1 @@ +6080604052346100275761001161015e565b61001961002c565b6120446105b7823961204490f35b610032565b60405190565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061005e90610036565b810190811060018060401b0382111761007657604052565b610040565b9061008e61008761002c565b9283610054565b565b60018060401b0381116100ac576100a8602091610036565b0190565b610040565b906100c36100be83610090565b61007b565b918252565b5f7f4d794e4654000000000000000000000000000000000000000000000000000000910152565b6100f960056100b1565b90610106602083016100c8565b565b6101106100ef565b90565b5f7f4d4e465400000000000000000000000000000000000000000000000000000000910152565b61014460046100b1565b9061015160208301610113565b565b61015b61013a565b90565b6101783361016a610108565b610172610153565b916101e1565b565b90565b60018060a01b031690565b90565b61019f61019a6101a49261017a565b610188565b61017d565b90565b6101b09061018b565b90565b6101bc9061017d565b90565b6101c8906101b3565b9052565b91906101df905f602085019401906101bf565b565b916101eb91610491565b806102066102006101fb5f6101a7565b6101b3565b916101b3565b146102165761021490610555565b565b6102396102225f6101a7565b5f918291631e4fbdf760e01b8352600483016101cc565b0390fd5b5190565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015610275575b602083101461027057565b610241565b91607f1691610265565b5f5260205f2090565b601f602091010490565b1b90565b919060086102b19102916102ab5f1984610292565b92610292565b9181191691161790565b90565b6102d26102cd6102d7926102bb565b610188565b6102bb565b90565b90565b91906102f36102ee6102fb936102be565b6102da565b908354610296565b9055565b5f90565b6103159161030f6102ff565b916102dd565b565b5b818110610323575050565b806103305f600193610303565b01610318565b9190601f8111610346575b505050565b6103526103779361027f565b90602061035e84610288565b8301931061037f575b61037090610288565b0190610317565b5f8080610341565b915061037081929050610367565b1c90565b906103a1905f199060080261038d565b191690565b816103b091610391565b906002021790565b906103c28161023d565b9060018060401b038211610480576103e4826103de8554610255565b85610336565b602090601f831160011461041857918091610407935f9261040c575b50506103a6565b90555b565b90915001515f80610400565b601f198316916104278561027f565b925f5b8181106104685750916002939185600196941061044e575b5050500201905561040a565b61045e910151601f841690610391565b90555f8080610442565b9193602060018192878701518155019501920161042a565b610040565b9061048f916103b8565b565b9061049f6104a6925f610485565b6001610485565b565b5f1c90565b60018060a01b031690565b6104c46104c9916104a8565b6104ad565b90565b6104d690546104b8565b90565b5f1b90565b906104ef60018060a01b03916104d9565b9181191691161790565b61050d6105086105129261017d565b610188565b61017d565b90565b61051e906104f9565b90565b61052a90610515565b90565b90565b9061054561054061054c92610521565b61052d565b82546104de565b9055565b5f0190565b61055f60066104cc565b61056a826006610530565b9061059e6105987f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610521565b91610521565b916105a761002c565b806105b181610550565b0390a356fe60806040526004361015610013575b6108bb565b61001d5f3561012c565b806301ffc9a71461012757806306fdde0314610122578063081812fc1461011d578063095ea7b31461011857806323b872dd1461011357806342842e0e1461010e5780636352211e146101095780636a6278421461010457806370a08231146100ff578063715018a6146100fa5780638da5cb5b146100f557806395d89b41146100f0578063a22cb465146100eb578063b88d4fde146100e6578063c87b56dd146100e1578063e985e9c5146100dc5763f2fde38b0361000e57610888565b610852565b6107f0565b6107b9565b610645565b6105c0565b61058b565b610558565b610523565b6104ee565b610479565b610445565b610411565b6103a3565b610319565b610267565b6101b8565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b63ffffffff60e01b1690565b61015981610144565b0361016057565b5f80fd5b9050359061017182610150565b565b9060208282031261018c57610189915f01610164565b90565b61013c565b151590565b61019f90610191565b9052565b91906101b6905f60208501940190610196565b565b346101e8576101e46101d36101ce366004610173565b6108c3565b6101db610132565b918291826101a3565b0390f35b610138565b5f9103126101f757565b61013c565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61023d61024660209361024b93610234816101fc565b93848093610200565b95869101610209565b610214565b0190565b6102649160208201915f81840391015261021e565b90565b34610297576102773660046101ed565b610293610282610a47565b61028a610132565b9182918261024f565b0390f35b610138565b90565b6102a88161029c565b036102af57565b5f80fd5b905035906102c08261029f565b565b906020828203126102db576102d8915f016102b3565b90565b61013c565b60018060a01b031690565b6102f4906102e0565b90565b610300906102eb565b9052565b9190610317905f602085019401906102f7565b565b346103495761034561033461032f3660046102c2565b610a60565b61033c610132565b91829182610304565b0390f35b610138565b610357816102eb565b0361035e57565b5f80fd5b9050359061036f8261034e565b565b9190604083820312610399578061038d610396925f8601610362565b936020016102b3565b90565b61013c565b5f0190565b346103d2576103bc6103b6366004610371565b90610a7f565b6103c4610132565b806103ce8161039e565b0390f35b610138565b909160608284031261040c576104096103f2845f8501610362565b936104008160208601610362565b936040016102b3565b90565b61013c565b346104405761042a6104243660046103d7565b91610af5565b610432610132565b8061043c8161039e565b0390f35b610138565b346104745761045e6104583660046103d7565b91610be1565b610466610132565b806104708161039e565b0390f35b610138565b346104a9576104a561049461048f3660046102c2565b610bf7565b61049c610132565b91829182610304565b0390f35b610138565b906020828203126104c7576104c4915f01610362565b90565b61013c565b6104d59061029c565b9052565b91906104ec905f602085019401906104cc565b565b3461051e5761051a6105096105043660046104ae565b610d04565b610511610132565b918291826104d9565b0390f35b610138565b346105535761054f61053e6105393660046104ae565b610d62565b610546610132565b918291826104d9565b0390f35b610138565b34610586576105683660046101ed565b610570610ded565b610578610132565b806105828161039e565b0390f35b610138565b346105bb5761059b3660046101ed565b6105b76105a6610e23565b6105ae610132565b91829182610304565b0390f35b610138565b346105f0576105d03660046101ed565b6105ec6105db610e39565b6105e3610132565b9182918261024f565b0390f35b610138565b6105fe81610191565b0361060557565b5f80fd5b90503590610616826105f5565b565b9190604083820312610640578061063461063d925f8601610362565b93602001610609565b90565b61013c565b346106745761065e610658366004610618565b90610e4f565b610666610132565b806106708161039e565b0390f35b610138565b5f80fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b9061069f90610214565b810190811067ffffffffffffffff8211176106b957604052565b610681565b906106d16106ca610132565b9283610695565b565b67ffffffffffffffff81116106f1576106ed602091610214565b0190565b610681565b90825f939282370152565b90929192610716610711826106d3565b6106be565b9381855260208501908284011161073257610730926106f6565b565b61067d565b9080601f830112156107555781602061075293359101610701565b90565b610679565b906080828203126107b457610771815f8401610362565b9261077f8260208501610362565b9261078d83604083016102b3565b92606082013567ffffffffffffffff81116107af576107ac9201610737565b90565b610140565b61013c565b346107eb576107d56107cc36600461075a565b92919091610e65565b6107dd610132565b806107e78161039e565b0390f35b610138565b346108205761081c61080b6108063660046102c2565b610f2b565b610813610132565b9182918261024f565b0390f35b610138565b919060408382031261084d578061084161084a925f8601610362565b93602001610362565b90565b61013c565b346108835761087f61086e610868366004610825565b90610fea565b610876610132565b918291826101a3565b0390f35b610138565b346108b6576108a061089b3660046104ae565b611077565b6108a8610132565b806108b28161039e565b0390f35b610138565b5f80fd5b5f90565b6108cb6108bf565b50806108e66108e06380ac58cd60e01b610144565b91610144565b14801561090a575b9081156108fa575b5090565b6109049150611082565b5f6108f6565b508061092561091f635b5e139f60e01b610144565b91610144565b146108ee565b606090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015610964575b602083101461095f57565b610930565b91607f1691610954565b60209181520190565b5f5260205f2090565b905f929180549061099a61099383610944565b809461096e565b916001811690815f146109f157506001146109b5575b505050565b6109c29192939450610977565b915f925b8184106109d957505001905f80806109b0565b600181602092959395548486015201910192906109c6565b92949550505060ff19168252151560200201905f80806109b0565b90610a1691610980565b90565b90610a39610a3292610a29610132565b93848092610a0c565b0383610695565b565b610a4490610a19565b90565b610a4f61092b565b50610a595f610a3b565b90565b5f90565b610a7c90610a6c610a5c565b50610a76816110a8565b50611114565b90565b90610a939190610a8d611133565b91611140565b565b90565b90565b610aaf610aaa610ab492610a95565b610a98565b6102e0565b90565b610ac090610a9b565b90565b604090610aec610af39496959396610ae260608401985f8501906102f7565b60208301906104cc565b01906102f7565b565b919080610b12610b0c610b075f610ab7565b6102eb565b916102eb565b14610b6957610b2a9082610b24611133565b916111c9565b9182610b3e610b38836102eb565b916102eb565b03610b4857505050565b610b659091925f9384936364283d7b60e01b855260048501610ac3565b0390fd5b610b8c610b755f610ab7565b5f918291633250574960e11b835260048301610304565b0390fd5b67ffffffffffffffff8111610bae57610baa602091610214565b0190565b610681565b90610bc5610bc083610b90565b6106be565b918252565b610bd35f610bb3565b90565b610bde610bca565b90565b91610bf59291610bef610bd6565b92610e65565b565b610c0990610c03610a5c565b506110a8565b90565b5f90565b90610c2291610c1d61134a565b610cd8565b90565b5f1c90565b90565b610c39610c3e91610c25565b610c2a565b90565b610c4b9054610c2d565b90565b634e487b7160e01b5f52601160045260245ffd5b610c6b9061029c565b5f198114610c795760010190565b610c4e565b5f1b90565b90610c8f5f1991610c7e565b9181191691161790565b610cad610ca8610cb29261029c565b610a98565b61029c565b90565b90565b90610ccd610cc8610cd492610c99565b610cb5565b8254610c83565b9055565b50610d01610ce66007610c41565b610cf9610cf282610c62565b6007610cb8565b918290611398565b90565b610d1590610d10610c0c565b610c10565b90565b610d2c610d27610d31926102e0565b610a98565b6102e0565b90565b610d3d90610d18565b90565b610d4990610d34565b90565b90610d5690610d40565b5f5260205260405f2090565b610d6a610c0c565b5080610d86610d80610d7b5f610ab7565b6102eb565b916102eb565b14610da157610d99610d9e916003610d4c565b610c41565b90565b610dc4610dad5f610ab7565b5f9182916322718ad960e21b835260048301610304565b0390fd5b610dd061134a565b610dd8610dda565b565b610deb610de65f610ab7565b6113ae565b565b610df5610dc8565b565b60018060a01b031690565b610e0e610e1391610c25565b610df7565b90565b610e209054610e02565b90565b610e2b610a5c565b50610e366006610e16565b90565b610e4161092b565b50610e4c6001610a3b565b90565b610e6391610e5b611133565b919091611454565b565b91610e899391610e7784828491610af5565b610e7f611133565b939091929361161e565b565b90565b5190565b610ea6610ea1610eab92610a95565b610a98565b61029c565b90565b610eb6610bca565b90565b905090565b610ee3610eda92602092610ed1816101fc565b94858093610eb9565b93849101610209565b0190565b610ef590610efb9392610ebe565b90610ebe565b90565b610f1d9291610f2991610f0f610132565b948592602084019283610ee7565b90810382520383610695565b565b610f3361092b565b50610f3d816110a8565b50610f46611772565b90610f58610f5383610e8b565b610e8e565b610f6a610f645f610e92565b9161029c565b115f14610f8857610f7e610f849291611816565b90610efe565b5b90565b5050610f92610eae565b610f85565b90610fa190610d40565b5f5260205260405f2090565b90610fb790610d40565b5f5260205260405f2090565b60ff1690565b610fd5610fda91610c25565b610fc3565b90565b610fe79054610fc9565b90565b61100f9161100561100a92610ffd6108bf565b506005610f97565b610fad565b610fdd565b90565b6110239061101e61134a565b611025565b565b8061104061103a6110355f610ab7565b6102eb565b916102eb565b146110505761104e906113ae565b565b61107361105c5f610ab7565b5f918291631e4fbdf760e01b835260048301610304565b0390fd5b61108090611012565b565b61108a6108bf565b506110a461109e6301ffc9a760e01b610144565b91610144565b1490565b6110b0610a5c565b506110ba816118bf565b90816110d66110d06110cb5f610ab7565b6102eb565b916102eb565b146110df575090565b6110fa905f918291637e27328960e01b8352600483016104d9565b0390fd5b9061110890610c99565b5f5260205260405f2090565b61112b61113091611123610a5c565b5060046110fe565b610e16565b90565b61113b610a5c565b503390565b9161114e92916001926118de565b565b90565b61116761116261116c92611150565b610a98565b61029c565b90565b9061117a910361029c565b90565b90611188910161029c565b90565b9061119c60018060a01b0391610c7e565b9181191691161790565b90565b906111be6111b96111c592610d40565b6111a6565b825461118b565b9055565b906111d2610a5c565b506111dc816118bf565b92806111f86111f26111ed5f610ab7565b6102eb565b916102eb565b03611337575b508261121a61121461120f5f610ab7565b6102eb565b916102eb565b036112e3575b8161123b6112356112305f610ab7565b6102eb565b916102eb565b036112ad575b61125682611251600284906110fe565b6111a9565b829161129461128e6112887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef95610d40565b92610d40565b92610c99565b9261129d610132565b806112a78161039e565b0390a490565b6112de6112ba6001611153565b6112d86112c960038690610d4c565b916112d383610c41565b61117d565b90610cb8565b611241565b6113016112ef5f610ab7565b826112f95f610ab7565b905f926118de565b61133261130e6001611153565b61132c61131d60038790610d4c565b9161132783610c41565b61116f565b90610cb8565b611220565b6113449084908391611a4b565b5f6111fe565b611352610e23565b61136b611365611360611133565b6102eb565b916102eb565b0361137257565b61139461137d611133565b5f91829163118cdaa760e01b835260048301610304565b0390fd5b906113ac91906113a6610bd6565b91611ac7565b565b6113b86006610e16565b6113c38260066111a9565b906113f76113f17f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610d40565b91610d40565b91611400610132565b8061140a8161039e565b0390a3565b9061141b60ff91610c7e565b9181191691161790565b61142e90610191565b90565b90565b9061144961144461145092611425565b611431565b825461140f565b9055565b9190918261147261146c6114675f610ab7565b6102eb565b916102eb565b146114e6576114968261149161148a60058590610f97565b8690610fad565b611434565b9190916114e16114cf6114c97f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3193610d40565b93610d40565b936114d8610132565b918291826101a3565b0390a3565b611501835f918291630b61174360e31b835260048301610304565b0390fd5b61150e90610d18565b90565b61151a90611505565b90565b61152690610d34565b90565b60e01b90565b9050519061153c82610150565b565b9060208282031261155757611554915f0161152f565b90565b61013c565b60209181520190565b61158461158d6020936115929361157b81610e8e565b9384809361155c565b95869101610209565b610214565b0190565b90926115c9906115bf6115d696946115b560808601975f8701906102f7565b60208501906102f7565b60408301906104cc565b6060818403910152611565565b90565b906115eb6115e6836106d3565b6106be565b918252565b606090565b3d5f14611610576116053d6115d9565b903d5f602084013e5b565b6116186115f0565b9061160e565b9193843b61163461162e5f610e92565b9161029c565b11611641575b5050505050565b6116795f60209461168461165c6116578a611511565b61151d565b9463150b7a0292969861166d610132565b998a9889978896611529565b865260048601611596565b03925af180915f92611742575b50155f146116ff575060016116ac57505b5f8080808061163a565b6116b46115f5565b906116be82610e8e565b6116d06116ca5f610e92565b9161029c565b145f146116f6576116f2905f918291633250574960e11b835260048301610304565b0390fd5b50805190602001fd5b611718611712630a85bd0160e11b610144565b91610144565b0361172357506116a2565b61173e905f918291633250574960e11b835260048301610304565b0390fd5b61176491925060203d811161176b575b61175c8183610695565b81019061153e565b905f611691565b503d611752565b61177a61092b565b50611783610eae565b90565b369037565b906117b061179883610bb3565b926020806117a68693610b90565b9201910390611786565b565b60016117be910361029c565b90565b90565b6117d86117d36117dd926117c1565b610a98565b61029c565b90565b634e487b7160e01b5f52601260045260245ffd5b6118006118069161029c565b9161029c565b908115611811570490565b6117e0565b61181e61092b565b5061183b61182b82611c69565b6118356001611153565b9061117d565b906118458261178b565b9161184e610c0c565b5060200182015b6001156118b857611868611894916117b2565b916f181899199a1a9b1b9c1cb0b131b232b360811b600a82061a835361188e600a6117c4565b906117f4565b806118a76118a15f610e92565b9161029c565b146118b25790611855565b50505b90565b50506118b5565b6118d66118db916118ce610a5c565b5060026110fe565b610e16565b90565b919092808015611a05575b611907575b505090611900611905929160046110fe565b6111a9565b565b611910846110a8565b918061192c6119266119215f610ab7565b6102eb565b916102eb565b1415806119ea575b806119d0575b6119b1575091611900916119059493611956575b5091926118ee565b81849061199561198f6119897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92595610d40565b92610d40565b92610c99565b9261199e610132565b806119a88161039e565b0390a45f61194e565b6119cc905f91829163a9fbf51f60e01b835260048301610304565b0390fd5b506119e56119df848390610fea565b15610191565b61193a565b50826119fe6119f8836102eb565b916102eb565b1415611934565b5081611a21611a1b611a165f610ab7565b6102eb565b916102eb565b14156118e9565b916020611a49929493611a4260408201965f8301906102f7565b01906104cc565b565b611a60611a5a82848691611eca565b15610191565b611a6957505050565b611a83611a7d611a785f610ab7565b6102eb565b916102eb565b145f14611aa957611aa5825f918291637e27328960e01b8352600483016104d9565b0390fd5b611ac35f92839263177e802f60e01b845260048401611a28565b0390fd5b9091611af392611ad8838290611f6a565b611ae0611133565b92611aea5f610ab7565b9091929361161e565b565b90565b611b0c611b07611b1192611af5565b610a98565b61029c565b90565b90565b611b2b611b26611b3092611b14565b610a98565b61029c565b90565b90565b611b4a611b45611b4f92611b33565b610a98565b61029c565b90565b90565b611b69611b64611b6e92611b52565b610a98565b61029c565b90565b90565b611b88611b83611b8d92611b71565b610a98565b61029c565b90565b90565b611ba7611ba2611bac92611b90565b610a98565b61029c565b90565b90565b611bc6611bc1611bcb92611baf565b610a98565b61029c565b90565b90565b611be5611be0611bea92611bce565b610a98565b61029c565b90565b90565b611c04611bff611c0992611bed565b610a98565b61029c565b90565b90565b611c23611c1e611c2892611c0c565b610a98565b61029c565b90565b90565b611c42611c3d611c4792611c2b565b610a98565b61029c565b90565b90565b611c61611c5c611c6692611c4a565b610a98565b61029c565b90565b611c71610c0c565b50611c7b5f610e92565b9080611caa611ca47a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000611af8565b9161029c565b1015611e82575b80611cd2611ccc6d04ee2d6d415b85acef8100000000611b36565b9161029c565b1015611e47575b80611cf3611ced662386f26fc10000611b74565b9161029c565b1015611e13575b80611d11611d0b6305f5e100611bb2565b9161029c565b1015611de2575b80611d2d611d27612710611bf0565b9161029c565b1015611db3575b80611d48611d426064611c2e565b9161029c565b1015611d85575b611d62611d5c600a6117c4565b9161029c565b1015611d6c575b90565b611d8090611d7a6001611153565b9061117d565b611d69565b611d9c611dad91611d966064611c2e565b906117f4565b91611da76002611c4d565b9061117d565b90611d4f565b611dcb611ddc91611dc5612710611bf0565b906117f4565b91611dd66004611c0f565b9061117d565b90611d34565b611dfc611e0d91611df66305f5e100611bb2565b906117f4565b91611e076008611bd1565b9061117d565b90611d18565b611e30611e4191611e2a662386f26fc10000611b74565b906117f4565b91611e3b6010611b93565b9061117d565b90611cfa565b611e6b611e7c91611e656d04ee2d6d415b85acef8100000000611b36565b906117f4565b91611e766020611b55565b9061117d565b90611cd9565b611eb3611ec491611ead7a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000611af8565b906117f4565b91611ebe6040611b17565b9061117d565b90611cb1565b9190611ed46108bf565b5080611ef0611eea611ee55f610ab7565b6102eb565b916102eb565b14159283611eff575b50505090565b8091929350611f16611f10846102eb565b916102eb565b14908115611f58575b50918215611f32575b50505f8080611ef9565b611f50919250611f44611f4a91611114565b926102eb565b916102eb565b145f80611f28565b611f6491508290610fea565b5f611f1f565b9081611f86611f80611f7b5f610ab7565b6102eb565b916102eb565b14611fe757611f9f9190611f995f610ab7565b916111c9565b611fb9611fb3611fae5f610ab7565b6102eb565b916102eb565b03611fc057565b611fe3611fcc5f610ab7565b5f9182916339e3563760e11b835260048301610304565b0390fd5b61200a611ff35f610ab7565b5f918291633250574960e11b835260048301610304565b0390fdfea264697066735822122015b32b977d5e559b637190522b6bcc9df5d2ab765f36b11e5761a034841af17964736f6c634300081d0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/fib_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/fib_evm.hex new file mode 100644 index 000000000..b68a78b10 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/fib_evm.hex @@ -0,0 +1 @@ +60808060405234601557610159908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806361047ff41461005c5763ac8da0ab1461002f575f80fd5b3461005857602036600319011261005857602061005060015f6004356100ea565b604051908152f35b5f80fd5b3461005857602036600319011261005857602061005060043561009b565b9190820180921161008757565b634e487b7160e01b5f52601160045260245ffd5b80156100e557600181146100df575f198101818111610087576100bd9061009b565b906001198101908111610087576100d39061009b565b6100dc9161007a565b90565b50600190565b505f90565b9091811561011e5760018214610118575f19820191821161008757610112816100dc9461007a565b916100ea565b91505090565b50509056fea2646970667358221220c72c4088b644683c888ca5fba8885c68d3bb2b50be3137b84148e0515a11a7b864736f6c63430008190033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/generative_nft_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/generative_nft_evm.hex new file mode 100644 index 000000000..dd2cd743d --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/generative_nft_evm.hex @@ -0,0 +1 @@ +608080604052346015576101b7908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c634a7dd52314610024575f80fd5b346100a55760203660031901126100a5575f6004355b6008821061004d57602090604051908152f35b6001820180831161009157610061916100a9565b6064820180831161009157816100875f80516020610162833981519152926001946100a9565b900891019061003a565b634e487b7160e01b5f52601160045260245ffd5b5f80fd5b905f805b605b81106100e157506100cd575f80516020610162833981519152910890565b634e487b7160e01b5f52601260045260245ffd5b92906040516020810190858252602081526040810181811067ffffffffffffffff82111761014d57604052519020906100cd575f8051602061016283398151915283918193080860015f805160206101628339815191528083800992815f9481818009090993016100ad565b634e487b7160e01b5f52604160045260245ffdfe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220a49639e07d9ecd445ebbeffe25dc0d3b074d3b0819ac44569961878b74e5eb8064736f6c634300081a0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/merkle_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/merkle_evm.hex new file mode 100644 index 000000000..06e742ac5 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/merkle_evm.hex @@ -0,0 +1 @@ +6080604052348015600e575f80fd5b5061036c8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80638903c5a21461002d575b5f80fd5b610035610049565b604051901515815260200160405180910390f35b60408051600880825261012082019092525f918291906020820161010080368337505060408051600880825261012082019092529293505f9291506020820161010080368337019050509050602a805f5b600881101561012c576100ae8160076102b9565b6100b990600d6102d0565b8582815181106100cb576100cb6102e3565b60209081029190910101526100e16002826102f7565b8482815181106100f3576100f36102e3565b60200260200101818152505061012282868381518110610115576101156102e3565b6020026020010151610142565b915060010161009a565b5061013984828486610221565b94505050505090565b5f8083815b605b811015610204575f5f80516020610317833981519152865f805160206103178339815191528686080890505f5f8051602061031783398151915282830990505f5f8051602061031783398151915282830990505f80516020610317833981519152835f805160206103178339815191528484090994505f80516020610317833981519152604080516020810187905201604051602081830303815290604052805190602001205f1c8708955050600190920191506101479050565b505f80516020610317833981519152848208925050505b92915050565b5f82815b865181101561029957838181518110610240576102406102e3565b60200260200101515f0361026b5761026482888381518110610115576101156102e3565b9150610291565b61028e878281518110610280576102806102e3565b602002602001015183610142565b91505b600101610225565b50909314949350505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761021b5761021b6102a5565b8082018082111561021b5761021b6102a5565b634e487b7160e01b5f52603260045260245ffd5b5f8261031157634e487b7160e01b5f52601260045260245ffd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a2646970667358221220dad8bc3658239211c36e6a2fad3e851566b573ccb745f8c9fe18c446d8ead91164736f6c634300081a0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/poseidon_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/poseidon_evm.hex new file mode 100644 index 000000000..540b9c8c2 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/poseidon_evm.hex @@ -0,0 +1 @@ +6080604052348015600e575f80fd5b506123eb8061001c5f395ff3fe608060405260043610610033575f3560e01c8063561558fe146100375780638cc13d8a14610069578063eb6c5b9e14610088575b5f80fd5b348015610042575f80fd5b5061005661005136600461226d565b6100a0565b6040519081526020015b60405180910390f35b348015610074575f80fd5b506100566100833660046122e9565b61218c565b6100906121ce565b6040519015158152602001610060565b60408051611860810182527f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e81527ef1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e8646020808301919091527f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5928201929092527f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d060608201527f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf260808201527f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa60a08201527f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d60c08201527f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb7860e08201527f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc6326101008201527f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d4286101208201527f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f66101408201527f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c6101608201527f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de5596101808201527f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f66101a08201527f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c87056101c08201527f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d6101e08201527f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be8286102008201527f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b96102208201527f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa66102408201527f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc6102608201527f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd16102808201527f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d096102a08201527f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea5656102c08201527e5032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f96102e08201527f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b56103008201527f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d602806103208201527f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b6103408201527f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec06103608201527f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c4606103808201527f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc06103a08201527f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e6103c08201527f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f84486103e08201527f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f6104008201527f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e6104208201527f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f6104408201527f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c8876104608201527f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c86104808201527f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf16104a08201527f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da536104c08201527f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c6104e08201527e81c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e6105008201527f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb386105208201527f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a7352066105408201527f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad6105608201527f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c6105808201527f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef6105a08201527f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c916105c08201527f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a06105e08201527f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c07506106008201527f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e6106208201527f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e6106408201527f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab6106608201527f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a700923933116106808201527f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a6106a08201527f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da96106c08201527f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c45655296106e08201527f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c5026107008201527f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b546107208201527f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef6107408201527f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a6107608201527f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd8046107808201527f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd6496107a08201527f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a6107c08201527eef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff16107e08201527f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d36108008201527f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba896108208201527f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be6108408201527f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af16108608201527f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c56108808201527f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f1006108a08201527f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c29676108c08201527f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e46108e08201527f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b026109008201527f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b6466109208201527f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d6109408201527f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc66109608201527f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da46109808201527f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e6109a08201527f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea06546266109c08201527f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb6109e08201527f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13610a008201527f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758610a208201527f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef610a408201527f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9610a608201527f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d610a808201527f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2610aa08201527f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035610ac08201527f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147610ae08201527f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2610b008201527f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a610b208201527f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc610b408201527f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f610b608201527f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69610b808201527f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a610ba08201527f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1610bc08201527f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8610be08201527f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a610c008201527f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785610c208201527f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77610c408201527f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67610c608201527f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727610c808201527e2e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b610ca08201527f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2610cc08201527eb9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe610ce08201527f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512610d008201527e248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d610d208201527f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9610d408201527f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808610d608201527f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1610d808201527f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973610da08201527f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09610dc08201527f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38610de08201527f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd610e008201527f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284610e208201527f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af610e408201527f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466610e608201527f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad610e808201527f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086610ea08201527f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3610ec08201527f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800610ee08201527f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6610f008201527f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7610f208201527f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b610f408201527f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b610f608201527f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591610f808201527f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178610fa08201527f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40610fc08201527f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4610fe08201527f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e5042336110008201527f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b1688736110208201527f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d6110408201527f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc06110608201527f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb6110808201527f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f93264788756110a08201527f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e6110c08201527f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f0196110e08201527f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b6111008201527f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d596111208201527f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f6111408201527f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a86111608201527f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f889486111808201527f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f6111a08201527f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f6111c08201527f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d1426111e08201527f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b6112008201527f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f236112208201527f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c06112408201527f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a6112608201527f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b56112808201527f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a586112a08201527f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f26112c08201527f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b6112e08201527f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d016113008201527f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b16113208201527f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b6113408201527f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d6113608201527f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec6113808201527f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb26113a08201527f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc7926113c08201527f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e368606113e08201527f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d6114008201527f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61116114208201527f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c7116114408201527f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb6114608201527f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3366114808201527f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a6114a08201527f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf18606114c08201527f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d66114e08201527f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b6115008201527f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b6115208201527f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f4516115408201527f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c5566115608201527f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f706115808201527f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf776115a08201527f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea6115c08201527f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d6115e08201527f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc6306116008201527f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f6116208201527f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd786116408201527f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc6116608201527f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb6116808201527f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d606116a08201527f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f6116c08201527f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a46116e08201527f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f16117008201527f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc6117208201527f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf086117408201527f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb241006117608201527f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c23206117808201527f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad8706117a08201527f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba6117c08201527f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f86117e08201527f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab16118008201527f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d226118208201527f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e42283251616118408201528251918301515f928391828282825b611e6f60396008612328565b8160ff16101561217e575f8051602061239683398151915288611e96600360ff8516612341565b611ea0905f612328565b60c38110611eb057611eb0612300565b6020020151850896505f8051602061239683398151915288611ed6600360ff8516612341565b611ee1906001612328565b60c38110611ef157611ef1612300565b6020020151840895505f8051602061239683398151915288611f17600360ff8516612341565b611f22906002612328565b60c38110611f3257611f32612300565b602002015183089450611f448761218c565b9650611f5260026008612358565b8160ff161080611f7c57506039611f6b60026008612358565b611f759190612328565b8160ff1610155b15611f9857611f8a8661218c565b9550611f958561218c565b94505b5f80516020612396833981519152807f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d87095f80516020612396833981519152807f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e08a095f80516020612396833981519152807f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b8d095f08080893505f80516020612396833981519152807f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa87095f80516020612396833981519152807f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe238a095f80516020612396833981519152807f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7718d095f08080892505f80516020612396833981519152807f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e087095f80516020612396833981519152807f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee29118a095f80516020612396833981519152807f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a78d095f08080891508061217681612377565b915050611e63565b509198975050505050505050565b5f805f8051602061239683398151915283840990505f5f8051602061239683398151915282830990505f80516020612396833981519152818509949350505050565b604080518082019091527f08fd69dd1602112194d1fefd8c2b20242e371879feba6683a4bdeebd6e8f121c81527f2a17023cc2483bf305661df2580c3b29444f8b954de7f2166091592ba772859160208201525f907f0312caa17b630038ed8ffb058c6aac74159c87d55c558223b953afcddcfc7df68261224e836100a0565b919091149392505050565b634e487b7160e01b5f52604160045260245ffd5b5f6040828403121561227d575f80fd5b82601f83011261228b575f80fd5b6040516040810181811067ffffffffffffffff821117156122ae576122ae612259565b80604052508060408401858111156122c4575f80fd5b845b818110156122de5780358352602092830192016122c6565b509195945050505050565b5f602082840312156122f9575f80fd5b5035919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561233b5761233b612314565b92915050565b808202811582820484141761233b5761233b612314565b5f8261237257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60ff821660ff810361238c5761238c612314565b6001019291505056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a264697066735822122062c9b842fa0bfc6814396d2e1045f0ff168ba9e8a778e831989194771034c48164736f6c634300081a0033 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_counter_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_counter_wasm.hex new file mode 100644 index 000000000..f955377f4 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_counter_wasm.hex @@ -0,0 +1 @@ +00001c410061736d01000000011c066000017f60037f7f7f0060017f0060027f7f0060000060017f017f02c7010a03656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e761873746f7261676553746f72654c6974746c65456e6469616e000303656e760b73746f726167654c6f6164000303656e761773746f726167654c6f61644c6974746c65456e6469616e0003031716040000000305010503030303030303040004040404040405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000a0463616c6c001d066465706c6f79001f0ad4201602000b8308010d7f230041106b22002400410021010240410028028080042202417f4a0d0041001000220236028080040b02402002450d000240200241034b0d00410021032000410036020c024041002d00a481040d0041c08004410020021001410041013a00a481040b024002400240200241044f0d0041c0800421012000410c6a21040c010b2002417c71220341c080046a21012000410c6a20036a21044100210503402000410c6a20056a200541c080046a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f4a0d0041001000220236028080040b02400240200241e500480d00200041086a4100410410010c010b024041002d00a481040d0041c08004410020021001410041013a00a481040b200041002802c080043602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f0240410028028080042200417f4a0d0041001000220036028080040b20000b4402017f047e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802ac810420006a200110030b0c0041002802ac810420006a0bb60501037f0240024041002802b881042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602b48104410020054180807c713602b88104410041002802b0810420034110746a3602b081040c010b41002802b4810420044f0d00410020043602b481040b41002802ac8104220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100522044f0d0020002001200210060f0b0240200441004a200120046b2204200148470d000240410028028080042201417f4a0d0041001000220136028080042001417f4a0d0041001000220136028080040b0240200141e500480d0020002004200210010c020b024041002d00a481040d0041c08004410020011001410041013a00a481040b2002450d01200441c080046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802b88104220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602b48104410020024180807c713602b88104410041002802b0810420014110746a3602b0810441e0000f0b024041002802b4810420004f0d00410020003602b481040b41e0000b920401037f0240200041206a22022000480d000240024041002802b88104220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602b48104410020044180807c713602b88104410041002802b0810420034110746a3602b081040c010b41002802b4810420024f0d00410020023602b481040b41002802ac810420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802b88104220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602b48104410020074180807c713602b88104410041002802b0810420014110746a3602b081040c010b41002802b4810420024f0d00410020023602b481040b41002802ac810420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802b88104220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602b48104410020044180807c713602b88104410041002802b0810420034110746a3602b081040c010b41002802b4810420024f0d00410020023602b481040b41002802ac810420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b08002000200110070b08002000200110090b08002000200110080b100041002802ac810420006a200110040b0b00410041013a009080040b2501017f0240410028028080042200417f4a0d0041001000220036028080040b2000417c6a0b7e01027f024041002d00a881040d00024002403f0022004102490d00410020004110743602ac8104410140001a3f00411074220041002802ac81046b21010c010b410041c081043602ac810441c0810521004180800121010b410020003602b08104410020013602b88104410041013a00a88104410041003602b481040b0b8a0502037f067e23002200210141800110111a41c00041e00010140240100c4104490d0002400240100b220241d5b2cbb97d460d00200241bcffc9c47e460d01200241bdb59833470d020240100d450d0041004100100e0b101a1a200041606a2200240041a080042000101741e0002000101241e000412010180c020b0240100d450d0041004100100e0b101a1a200041606a22002202240041a0800420001016024020002903002203200041106a290300220484200041086a2903002205200041186a290300220684844200520d00200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101341044111101441004124100e0b200241606a2200240020002003427f7c22073703002000200520072003542202ad7c427f7c220337030820002004427f7c22072002200320055420032005511bad7c2205370310200041186a20062007200454ad7c2005200754ad7c427f7c37030041a08004200010154100410010180c010b0240100d450d0041004100100e0b101a1a200041606a22002202240041a0800420001016024020002903002205200041106a290300220383200041086a2903002204200041186a29030022068383427f520d00200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101341044111101441004124100e0b200241606a2200240020002004200542017c22072005542202ad7c2208370308200020073703002000200320022008200454200720055a1bad7c2205370310200041186a20062005200354ad7c37030041a08004200010154100410010180b41004100100e200124000b0400101c0b0400101b0b3700101941800110111a41c00041e00010140240100d450d0041004100100e0b41e00041c081054100100f6b4104101041e000410410180b0b280400418080040b04ffffffff0041a881040b01010041ae81040b0502000000030041ba81040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600c605046e616d6501a00520000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f7079071873746f7261676553746f72654c6974746c65456e6469616e080b73746f726167654c6f6164091773746f726167654c6f61644c6974746c65456e6469616e0a115f5f7761736d5f63616c6c5f63746f72730b1e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f720c15777261707065725f63616c6c646174615f73697a650d1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f0e0e777261707065725f7265766572740f1365766d5f6765745f6d656d6f72795f616464721010777261707065725f636f6465636f70791114777261707065725f6d656d6f72795f67756172641216777261707065725f6d73746f72655f627974657333321313777261707065725f6d73746f72655f753235361412777261707065725f6d73746f72655f753332152f777261707065725f7373746f72655f753235365f7573696e675f6c6974746c655f656e6469616e5f686f7374617069162e777261707065725f736c6f61645f753235365f7573696e675f6c6974746c655f656e6469616e5f686f73746170691715777261707065725f736c6f61645f62797465733332180e777261707065725f72657475726e19137365745f69735f6465706c6f79696e675f74781a1d777261707065725f63616c6c646174615f73697a655f6d696e75735f341b0f5f5f696e69745f65766d5f686561701c32636f756e7465725f34383736325f6465706c6f7965642e636f756e7465725f34383736325f6465706c6f7965642e696e69741d0463616c6c1e065f73746172741f066465706c6f79071201000f5f5f737461636b5f706f696e74657209080100052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_ecdsa_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_ecdsa_wasm.hex new file mode 100644 index 000000000..05a410702 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_ecdsa_wasm.hex @@ -0,0 +1 @@ +0000e5730061736d01000000018d010f60027f7f0060000060037f7f7f006000017f6000017e60057f7e7e7e7e0060017f017f600d7f7e7e7e7e7e7e7e7e7e7e7e7e0060087e7e7e7e7e7e7e7e0060017f0060047e7f7f7f017f60067e7f7f7f7f7f017f60157f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060117f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0002c7010b03656e760f67657443616c6c4461746153697a65000303656e760c63616c6c44617461436f7079000203656e760c67657443616c6c56616c7565000903656e7606726576657274000003656e760666696e697368000003656e760b676574436f646553697a65000303656e7608636f6465436f7079000203656e761167657452657475726e4461746153697a65000303656e760e72657475726e44617461436f7079000203656e760a63616c6c537461746963000a03656e760a6765744761734c656674000403212001050000030300060206000000000b0401010202010c0d07070808050e01010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000b0463616c6c0028066465706c6f79002a0ac3aa03200300010b7501017e2000200120047e200220037e7c20034220882204200142208822027e7c200342ffffffff0f832203200142ffffffff0f8322017e2205422088200220037e7c22034220887c200120047e200342ffffffff0f837c22034220887c3703082000200542ffffffff0f832003422086843703000bef0205017f017e017e017e017e200041086a2903002103200041106a2903002104200029030021052001200041186a29030022064228883c0002200120064238883c0000200120044228883c000a200120044238883c000820012006a722003a0007200120064220883c0003200120064230883c0001200120034228883c0012200120034238883c001020012004a722023a000f200120044220883c000b200120044230883c0009200120004108763a0006200120004118763a0004200120024108763a000e200120024118763a000c200120004110763a000520012003a722004108763a0016200120004118763a0014200120024110763a000d20012005a722024108763a001e200120024118763a001c200120054228883c001a200120054238883c0018200120003a0017200120004110763a0015200120034220883c0013200120034230883c0011200120023a001f200120024110763a001d200120054220883c001b200120054230883c00190b91041c017f017f017f017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e230041206b2202240010002103200241186a22044200370300200241106a22054200370300200242003703082002420037030020022000200320006b4120200041206a20034b1b10012004310000210620053100002107200231001f2108200231001e2109200231001b210a200231001a210b2002310019210c200231001c210d200231001d210e2002310003210f200231000221102002310001211120023100002112200231000721132002310006211420023100042115200231000521162002310013211720023100122118200231001121192002310017211a2002310016211b2002310014211c2002310015211d2001200231000f200231000e42088684200231000c421886200231000d4210868484200231000b200231000a42088684200231000842188620023100094210868484422086843703102001201a201b42088684201c421886201d4210868484201720184208868420074218862019421086848442208684370308200141186a2013201442088684201542188620164210868484200f2011421086201242188684201042088684844220868437030020012008200942088684200d421886200e42108684200a200b420886842006421886200c42108684844220868484370300200241206a24000b040010000b4a05017f017e017e017e017e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200120028484844200520b100041b8800428020020006a200110030b0c0041b8800428020020006a0b8c0303017f017f017f024041c480042802002204200020026a2203490440200341ffff036a220541107620044110766b220440001a41c08004200336020041c4800420054180807c7136020041bc800441bc800428020020044110746a3602000c010b41c0800428020020034f0d0041c0800420033602000b41b88004280200220320006a210002400240200141004804402002450d01200120036a210120024107712203047f0340200020012d00003a0000200041016a2100200141016a2101200341016b22030d000b20024178710520020b210320024108490d010340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200041086a2100200141086a2101200341086b22030d000b0c010b1005220441046a22032004480d012003200120026a4b044020002001200210060f0b200341004a200120036b2203200148470d0110001a20002003200210010b0f0b000b7402017f017f200041c4800428020022014b0440200041ffff036a220241107620014110766b220140001a41c08004200036020041c4800420024180807c7136020041bc800441bc800428020020014110746a36020041e0000f0b200041c080042802004b044041c0800420003602000b41e0000bf70306017f017e017e017e017e017f2000200041206a22024c0440200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240200241c4800428020022014b0440200241ffff036a220741107620014110766b220140001a41c08004200236020041c4800420074180807c7136020041bc800441bc800428020020014110746a3602000c010b41c0800428020020024f0d0041c0800420023602000b41b8800428020020006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b000bcd0103017f017f017f2000200041206a22024c04400240200241c4800428020022034b0440200241ffff036a220441107620034110766b220340001a41c08004200236020041c4800420044180807c7136020041bc800441bc800428020020034110746a3602000c010b41c0800428020020024f0d0041c0800420023602000b41b8800428020020006a22004200370318200042003703102000420037030820004200370300200020013a001f200020014108763a001e200020014110763a001d200020014118763a001c0f0b000bc30318017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e41b8800428020020006a220031001f2102200031001e2103200031001c2104200031001d2105200031001b2106200031001a210720003100182108200031001921092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000f200031000e42088684200031000c421886200031000d4210868484200031000b200031000a420886842000310008421886200031000942108684844220868437031020012016201742088684201842188620194210868484201220134208868420144218862015421086848442208684370308200141186a200e200f42088684201042188620114210868484200a200c421086200d42188684200b420886848442208684370300200120022003420886842004421886200542108684200620074208868420084218862009421086848442208684843703000b100041b8800428020020006a200110040bc80101017f20002001410c6a41b8800428020020026a2003100922014102460440419980044114100341000f0b200504401007200548044041808004411810032001450f0b024041c480042802002203200420056a2202490440200241ffff036a220641107620034110766b220340001a41c08004200236020041c4800420064180807c7136020041bc800441bc800428020020034110746a3602000c010b41c0800428020020024f0d0041c0800420023602000b41b8800428020020046a4100200510080b2001450b0400100a0b0b0041b0800441013a00000b5501017f41b480042d000045044041b880043f00411074360200410140001a3f00210041b4800441013a000041bc80042000411074220036020041c48004200041b880042802006b36020041c0800441003602000b0bc30208017f017e017e017e017e017f017e017e230041406a21032002027e200141004c0440200041186a2903002104200041106a2903002105200041086a290300210720002903000c010b200141ff014b044042000c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220686200029000022094201882003413f73ad220488842107200041186a290000200686200041106a290000220a420188200488842104200a20068620054201882003417f73413f71ad8884210520092006860b22063703002002200737030820022005370310200241186a20043703000bbe0207017f017e017e017e017e017e017e230041406a2103027e200141004c0440200041106a2903002107200041086a290300210420002903002105200041186a2903000c010b200141ff014b044042000c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220420014107712200ad220688200341186a29000022084201862000413f73ad22058684210720044201862000417f73413f71ad86200341086a29000022092006888421042009420186200586200329000020068884210520082006880b2106200220053703002002200437030820022007370310200241186a20063703000bf10515017f017f017f017f017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e230041e0006b22002400100f41034d04404100410010110b200041d8006a220242c1ddedd49afcf695af7f370300200042c7bfd0a7e9baf8d6623703502000429592a6c7a6a0c7c11a370348200042bfa3b795a6b1cf88e200370340200041406b4100200041206a101d200041386a22012903002105200041306a22032903002106200041286a2204290300210720002903202108200242fdd1dae5aae5a2ea6f370300200042d683faa2cdb3b7a01137035020004291f3abb5b5efa1969d7f37034820004296eebcf584d5c3a643370340200041406b4100200041206a101d200129030021092003290300210a2004290300210b2000290320210c200242bf87ea94adedb89a0837030020004299c1f5c8e48bcee42b370350200042fed49eeb9ebafefe48370348200042a9afa1c1b7f2c7faa57f370340200041406b4100200041206a101d2001290300210d2003290300210e2004290300210f20002903202110200242b1baeaaaa297b5ffe000370300200042e8dad5b1cceefab049370350200042ecf487dba392eea440370348200042b6bfca87e6c5d8b466370340200041406b4100200041206a101d2001290300211120032903002112200429030021132000290320211420024299f9e2c580c2ff81f900370300200042e4f8a2b195bdba8da47f370350200042d1befaebc2c1ecf87237034820004299c598a2cdd2f0d1f700370340200041406b4100200041206a101d20002008200720062005200c200b200a20092010200f200e200d201420132012201120002903202004290300200329030020012903001020200041106a2903002105200041186a2903002106200041086a29030021072000290300210841c000200041406b10172000280240210120024200370300200042003703502000420037034820002005200884200620078484420052ad3703402001200041406b1015200141201018200041e0006a24000b842119017f017e017e017f017e017e017e017f017e017e017e017f017e017e017f017e017e017f017e017e017e017e017e017f017e230041c0056b22152400201541b8056a22182008370300201520073703b005201520063703a805201520053703a005201541a0056a410020154180056a101e027e024002400240024020152903800520154190056a221c2903008420154188056a222029030020154198056a22232903008484500d0020182008370300201520053703a005201520063703a805201520073703b005201541a0056a410020154180056a101e20152903800542d0ca8ce3afd8f2dc7356202029030022164284bddeb8dad5bef3bc7f5620164284bddeb8dad5bef3bc7f511b2023290300221642808080807056201c290300427f8520164280808080708584501b0d00201541b8056a2218200c370300201520093703a0052015200a3703a8052015200b3703b005201541a0056a410020154180056a101e20152903800520154190056a221c2903008420154188056a222029030020154198056a22232903008484500d002018200c370300201520093703a0052015200a3703a8052015200b3703b005201541a0056a410020154180056a101e20152903800542a9a5c6f197acb9eef900542020290300221642c29eaf9cedaadfb95e54201642c29eaf9cedaadfb95e511b201c290300221742ffffffffffffffffff0054202329030022164280808080f8ffffffff005420164280808080f8ffffffff00511b201742ffffffffffffffffff008520164280808080f8ffffffff008584501b0d010b0c010b201541a0046a2011201220132014100c201541b0046a2013201420112012100c201541e0046a2012420020114200100c201541d0046a2011420020124200100c201541f0046a2011420020114200100c201541c0046a2012420020124200100c20154190046a200d200e200f2010100c20154180046a200f2010200d200e100c201541d0036a200e4200200d4200100c201541c0036a200d4200200e4200100c201541e0036a200d4200200d4200100c201541f0036a200e4200200e4200100c201541e0026a200d200e20152903f003221b201541d8036a29030020152903d0032216201541e8036a2903007c2217201654ad7c2219201541c8036a29030020152903c003222120177c2216202154ad7c7c221e7c222220152903800422242015290390047c22287c2217201742017d222520152903e003222142017c221f202154221820162018ad7c4280808080107d221d2016542016201d511bad7c22272021427f52201642ffffffff0f54201642ffffffff0f511b2017202254ad201b202256ad201541f8036a2903002019201e56ad7c7c2024202856ad20154188046a29030020154198046a2903007c7c7c7c222242818080807054201720224281808080708584501b22181b221b2021201f20181b221942047d221e201954221c2016201d20181b2216201cad7c42ffffffff0f7c222120165420162021511bad7c221d201b42017d2224201942037d2228201954221c2016201cad7c42017d221920165420162019511bad7c221f201e427f52202142ffffffff0f54202142ffffffff0f511b20222025202756ad20222017202556ad7c7c42feffffff0f7c20181b2217201b201d56ad7c42ffffffff0f7d221642818080807054201d20164281808080708584501b22181b2016201f202454ad2017201b202456ad7c7c42017d20181b100c201541f0026a200f2010201e202820181b22162021201920181b2217100c201541b0036a20164200200d4200100c20154190036a20174200200d4200100c201541a0036a20164200200e4200100c20154180036a20174200200e4200100c200d427f51200e42ffffffff0f56200e42ffffffff0f511b200f4200522010428180808070562010428180808070511b200f20104281808080708584501b0d002011427f51201242ffffffff0f56201242ffffffff0f511b20134200522014428180808070562014428180808070511b201320144281808080708584501b0d0042002121420021174200221620152903f0042224202442017c222b2024427f5220152903d004221b20152903e0042219201541f8046a2903007c22257c222242ffffffff0f54202242ffffffff0f511b201541c8046a290300201541e8046a2903002019202556ad7c2219201541d8046a290300201b202256ad7c7c221b201954ad7c20152903c0042219201b7c221b201954ad7c20152903b004221920152903a0047c2225201954ad201541b8046a290300201541a8046a2903007c7c7c201b20257c2225201b54ad7c222842818080807054202520284281808080708584501b22181b20152903b0032219201942017c22292019427f5220152903a003221d201529039003221e201541b8036a2903007c221f7c221b42ffffffff0f54201b42ffffffff0f511b20154188036a29030020154198036a290300201e201f56ad7c221e201541a8036a290300201b201d54ad7c7c221d201e54ad7c201529038003221f201d7c221e201f54ad7c20152903f002221d20152903e0027c221f201d54ad201541f8026a290300201541e8026a2903007c7c7c201e201f7c221d201e54ad7c221f42818080807054201d201f4281808080708584501b221c1b222742cbc0c9bee2878fe73b7c221e202742ccc0c9bee2878fe73b7c222d201e427f52201b201b20192029562220ad7c4280808080107d2229201c1b2219201e2027542223ad7c42f6e1cee28cd6c18ee5007c221e42ffffffff0f54201e42ffffffff0f511b201f201f201d42017d222a201d54ad7c202a2020201b202956201b2029511bad7c221b202a54ad7c42feffffff0f7c201c1b201d201b201c1b221d42c4f29dcba8d5908acc007d221b201d54ad7c222a201b20232019201e562019201e511bad7c221d201b54ad7c42e7a7ead18abb8de3da007c221f42818080807054201d201f4281808080708584501b221c1b852025202542017d22292024202b56222020222020ad7c4280808080107d222420225420222024511bad7c222b20181b201d201b2027202d56222020192020ad7c42f6e1cee2fcd5c18ee5007c222720195420192027511bad7c2219201c1b85842022202420181b201e2027201c1b8520282029202b56ad20282025202956ad7c7c42feffffff0f7c20181b201f202a2019201b54ad7c42e6a7ead19abb8de3da007c201c1b8584844200520d021a201541b8056a221820103703002015200d3703a0052015200e3703a8052015200f3703b005201541a0056a410020154180056a101e20154198056a221c290300210e20154190056a2220290300211620154188056a22232903002117201529038005211a20182014370300201520133703b005201520123703a805201520113703a005201541a0056a410020154180056a101e201541c0026a201a20172016200e20152903800520232903002020290300201c2903001021201541d8026a2903002111201541d0026a2903002110201541c8026a290300210f20152903c00221142018200c3703002015200b3703b0052015200a3703a805201520093703a005201541a0056a410020154180056a101e20154180026a20152903800520232903002020290300201c29030042cfca8ce3afd8f2dc734284bddeb8dad5bef3bc7f427f42808080807042d1ca8ce3afd8f2dc734284bddeb8dad5bef3bc7f427f4280808080701022201541b8026a2903002117201541b0026a290300211a201541a8026a290300210e20152903a002211620152903800220154190026a2903008420154188026a29030020154198026a290300848450044020184200370300201542003703b005201542003703a805201542f1f6a1f2043703a0054100201541a0056a1015201c4200370300201542003703900520154200370388052015421237038005412020154180056a1015411c412410110b20182004370300201520013703a005201520023703a805201520033703b005201541a0056a410020154180056a101e201541b0016a2016200e2020290300201c290300100c201541e0006a201a2017201529038005220d20232903002212100c201541a0016a200d420020164200100c20154180016a2012420020164200100c20154190016a200d4200200e4200100c201541f0006a20124200200e4200100c20182008370300201520073703b005201520063703a805201520053703a005201541a0056a410020154180056a101e201541d0006a2016200e2020290300201c290300100c2015201a2017201529038005220d20232903002212100c201541406b200d420020164200100c201541206a2012420020164200100c201541306a200d4200200e4200100c201541106a20124200200e4200100c201541c0016a2014200f2010201120152903a001221a201a42afb5f39cd0a78da30c7c220d201a42d1ca8ce3afd8f2dc735420152903900122162015290380012217201541a8016a2903007c22127c220e4284bddeb8dad5bef3bc7f54200e4284bddeb8dad5bef3bc7f511b2015290370220c20154188016a2903002012201754ad7c221220154198016a290300200e201654ad7c7c220b7c22172015290360220a20152903b0017c22097c2216427f522016201754ad200c201756ad201541f8006a290300200b201254ad7c7c2009200a54ad201541e8006a290300201541b8016a2903007c7c7c7c2217428080808070542017428080808070511b2016427f8520174280808080708584501b22261b200e200e200d201a54222cad7c42fbc2a1c7a5aac18cc3007c221a20261b20162016202c200e201a56200e201a511bad7c220e20261b20172017200e201654ad7c42ffffffff0f7c20261b2015290340221a201a42afb5f39cd0a78da30c7c220d201a42d1ca8ce3afd8f2dc73542015290330221620152903202217201541c8006a2903007c22127c220e4284bddeb8dad5bef3bc7f54200e4284bddeb8dad5bef3bc7f511b2015290310220c201541286a2903002012201754ad7c2212201541386a290300200e201654ad7c7c220b7c22172015290300220a20152903507c22097c2216427f522016201754ad200c201756ad201541186a290300200b201254ad7c7c2009200a54ad201541086a290300201541d8006a2903007c7c7c7c2217428080808070542017428080808070511b2016427f8520174280808080708584501b22261b200e200e200d201a54222cad7c42fbc2a1c7a5aac18cc3007c221a20261b20162016202c200e201a56200e201a511bad7c220e20261b20172017200e201654ad7c42ffffffff0f7c20261b1023201541c8016a290300210e201541d0016a2903002116201541d8016a290300211720152903c001211a20182008370300201520073703b005201520063703a805201520053703a005201541a0056a410020154180056a101e201529038005201a201a42afb5f39cd0a78da30c7c2208201a42d1ca8ce3afd8f2dc7354200e4284bddeb8dad5bef3bc7f54200e4284bddeb8dad5bef3bc7f511b2016427f522017428080808070542017428080808070511b2016427f8520174280808080708584501b22181b852020290300201620162008201a542226200e2026ad7c42fbc2a1c7a5aac18cc3007c2208200e542008200e511bad7c220720181b85842023290300200e200820181b85201c290300201720172007201654ad7c42ffffffff0f7c20181b85848450ad211a0c010b420021210b4200211742000b21162000201a3703002000202137030820002016370310200041186a2017370300201541c0056a24000b924b1a017f017f017e017f017f017f017e017e017e017f017f017e017e017e017e017f017f017f017f017f017f017f017e017e017e017e230041c0176b2209240041c000200941a0176a101720092903a017221f200941a8176a220c2903002220200941b0176a220d2903002221200941b8176a220a29030022224280044200420042001024201f202020212022428004420042004200102541c000200941a0176a101720092903a017220b200c290300220f200d2903002210200a290300221142e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a017200ba72218200941a0176a1015200a4200370300200942003703b017200942003703a817200942003703a017201841206a200941a0176a1015200a4200370300200942003703b017200942003703a817200942003703a017201841406b200941a0176a1015200941d8166a2011370300200920103703d0162009200f3703c8162009200b3703c016201fa72218200941c0166a10152018200941a0166a101741c000200941a0176a101720092903a017220b200c290300220f200d2903002210200a290300221142e0004200420042001024200a2004370300200920033703b017200920023703a817200920013703a017200ba7221a200941a0176a1015200a2008370300200920073703b017200920063703a817200920053703a017201a41206a200941a0176a1015200a4200370300200942003703b017200942003703a817200942013703a017201a41406b200941a0176a101520094198166a201137030020092010370390162009200f370388162009200b37038016201841206a221220094180166a10152012200941e0156a101741c000200941a0176a101720092903a017220b200c2903002204200d2903002203200a290300220242e0004200420042001024200a42c784b189aebef48beb00370300200942f281919dd6dcb9de783703b017200942a0e7acef92b0df81f7003703a8172009429685e3c4dda8ced0743703a017200ba7221a200941a0176a1015200a429bffe9f0afdcd0f1cf0037030020094296bcbee0a7e9faf38e7f3703b017200942cebdc5d9f6ea8ce72b3703a817200942f5a3fdbd838d90db4b3703a017201a41206a200941a0176a1015200a4200370300200942003703b017200942003703a817200942013703a017201a41406b200941a0176a1015200941d8156a2002370300200920033703d015200920043703c8152009200b3703c01520184180016a2213200941c0156a10152013200941a0156a1017201220094180156a1017200941c0086a20092903801520094188156a29030020094190156a29030020094198156a2903001026200941f8146a200941d8086a2903003703002009200941d0086a2903003703f0142009200941c8086a2903003703e814200920092903c0083703e014201841406b221e200941e0146a1015201e200941c0146a10172013200941a0146a1017200941a0086a20092903a014200941a8146a290300200941b0146a290300200941b8146a290300102620094198146a200941b8086a2903003703002009200941b0086a290300370390142009200941a8086a29030037038814200920092903a0083703801420184180026a221b20094180146a1015201b200941e0136a10172012200941c0136a1017200941d8136a290300210b200941d0136a2903002104200941c8136a290300210320092903c0132102201e200941a0136a101720092802a013211c41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a7220e200941a0176a101520094198176a221a4200370300200942003703901720094200370388172009420037038017200e41206a20094180176a1015200941f8166a221d4200370300200942003703f016200942003703e816200942003703e016200e41406b200941e0166a1015201c200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106201c41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111201c41406b200941a0176a1017200941c0076a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a290300102720094188086a290300210420094190086a290300210320094198086a2903002102200941e8076a2903002101200941f0076a2903002108200941f8076a2903002107200941c8076a2903002106200941d0076a2903002105200941d8076a290300210f200929038008211020092903e007211120092903c007211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7221c200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017201c41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017201c41406b200941a0176a101520094198136a2017370300200920163703901320092015370388132009200b37038013201841e0006a221c20094180136a1015201c200941e0126a10172012200941c0126a1017200941d8126a290300210b200941d0126a2903002104200941c8126a290300210320092903c01221022013200941a0126a101720092802a012210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a1017200941e0066a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941a8076a2903002104200941b0076a2903002103200941b8076a290300210220094188076a290300210120094190076a290300210820094198076a2903002107200941e8066a2903002106200941f0066a2903002105200941f8066a290300210f20092903a0072110200929038007211120092903e006211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a101520094198126a2017370300200920163703901220092015370388122009200b37038012201841a0016a220e20094180126a1015200e200941e0116a1017201e200941c0116a1017200941d8116a290300210b200941d0116a2903002104200941c8116a290300210320092903c01121022013200941a0116a101720092802a011210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a101720094180066a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941c8066a2903002104200941d0066a2903002103200941d8066a2903002102200941a8066a2903002101200941b0066a2903002108200941b8066a290300210720094188066a290300210620094190066a290300210520094198066a290300210f20092903c006211020092903a0062111200929038006211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a101520094198116a2017370300200920163703901120092015370388112009200b37038011201841c0016a220e20094180116a1015200e200941e0106a1017201c200941c0106a1017200941d8106a290300210b200941d0106a2903002104200941c8106a290300210320092903c01021022013200941a0106a101720092802a010210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a1017200941a0056a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941e8056a2903002104200941f0056a2903002103200941f8056a2903002102200941c8056a2903002101200941d0056a2903002108200941d8056a2903002107200941a8056a2903002106200941b0056a2903002105200941b8056a290300210f20092903e005211020092903c005211120092903a005211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a101520094198106a2017370300200920163703901020092015370388102009200b37038010201841e0016a220e20094180106a1015200e200941e00f6a10172012200941c00f6a1017200941d80f6a290300210b200941d00f6a2903002104200941c80f6a290300210320092903c00f2102201b200941a00f6a101720092802a00f210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a1017200941c0046a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a290300102720094188056a290300210420094190056a290300210320094198056a2903002102200941e8046a2903002101200941f0046a2903002108200941f8046a2903002107200941c8046a2903002106200941d0046a2903002105200941d8046a290300210f200929038005211020092903e004211120092903c004211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a1015200941980f6a2017370300200920163703900f200920153703880f2009200b3703800f201841a0026a220e200941800f6a1015200e200941e00e6a1017201e200941c00e6a1017200941d80e6a290300210b200941d00e6a2903002104200941c80e6a290300210320092903c00e2102201b200941a00e6a101720092802a00e210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a1017200941e0036a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941a8046a2903002104200941b0046a2903002103200941b8046a290300210220094188046a290300210120094190046a290300210820094198046a2903002107200941e8036a2903002106200941f0036a2903002105200941f8036a290300210f20092903a0042110200929038004211120092903e003211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a1015200941980e6a2017370300200920163703900e200920153703880e2009200b3703800e201841c0026a220e200941800e6a1015200e200941e00d6a1017201c200941c00d6a1017200941d80d6a290300210b200941d00d6a2903002104200941c80d6a290300210320092903c00d2102201b200941a00d6a101720092802a00d210e41c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72219200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201941206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201941406b200941e0166a1015200e200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106200e41206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111200e41406b200941a0176a101720094180036a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941c8036a2903002104200941d0036a2903002103200941d8036a2903002102200941a8036a2903002101200941b0036a2903002108200941b8036a290300210720094188036a290300210620094190036a290300210520094198036a290300210f20092903c003211020092903a0032111200929038003211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220e200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200e41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200e41406b200941a0176a1015200941980d6a2017370300200920163703900d200920153703880d2009200b3703800d201841e0026a220e200941800d6a1015200e200941e00c6a10172013200941c00c6a1017200941d80c6a290300210b200941d00c6a2903002104200941c80c6a290300210320092903c00c2102201b200941a00c6a101720092802a00c211341c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a7221b200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201b41206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201b41406b200941e0166a10152013200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106201341206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111201341406b200941a0176a1017200941a0026a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941e8026a2903002104200941f0026a2903002103200941f8026a2903002102200941c8026a2903002101200941d0026a2903002108200941d8026a2903002107200941a8026a2903002106200941b0026a2903002105200941b8026a290300210f20092903e002211020092903c002211120092903a002211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba72213200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017201341206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017201341406b200941a0176a1015200941980c6a2017370300200920163703900c200920153703880c2009200b3703800c20184180036a2213200941800c6a10152013200941e00b6a10172012200941c00b6a1017200941d80b6a290300210b200941d00b6a2903002104200941c80b6a290300210320092903c00b21022013200941a00b6a101720092802a00b211241c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a7221b200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201b41206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201b41406b200941e0166a10152012200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106201241206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111201241406b200941a0176a1017200941c0016a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a290300102720094188026a290300210420094190026a290300210320094198026a2903002102200941e8016a2903002101200941f0016a2903002108200941f8016a2903002107200941c8016a2903002106200941d0016a2903002105200941d8016a290300210f200929038002211020092903e001211120092903c001211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba72212200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017201241206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017201241406b200941a0176a1015200941980b6a2017370300200920163703900b200920153703880b2009200b3703800b201841a0036a2212200941800b6a10152012200941e00a6a1017201e200941c00a6a1017200941d80a6a290300210b200941d00a6a2903002104200941c80a6a290300210320092903c00a21022013200941a00a6a101720092802a00a211241c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a7221e200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201e41206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201e41406b200941e0166a10152012200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106201241206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111201241406b200941a0176a1017200941e0006a200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941a8016a2903002104200941b0016a2903002103200941b8016a290300210220094188016a290300210120094190016a290300210820094198016a2903002107200941e8006a2903002106200941f0006a2903002105200941f8006a290300210f20092903a001211020092903800121112009290360211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba72212200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017201241206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017201241406b200941a0176a1015200941980a6a2017370300200920163703900a200920153703880a2009200b3703800a201841c0036a2212200941800a6a10152012200941e0096a1017201c200941c0096a1017200941d8096a290300210b200941d0096a2903002104200941c8096a290300210320092903c00921022013200941a0096a101720092802a009211241c000200941a0176a101720092903a0172201200c290300200d290300200a29030042e0004200420042001024200a4200370300200942003703b017200942003703a817200942003703a0172001a72213200941a0176a1015201a4200370300200942003703901720094200370388172009420037038017201341206a20094180176a1015201d4200370300200942003703f016200942003703e816200942003703e016201341406b200941e0166a10152012200941a0176a1017200a2903002101200d2903002108200c290300210720092903a0172106201241206a200941a0176a1017200a2903002105200d290300210f200c290300211020092903a0172111201241406b200941a0176a10172009200220032004200b200620072008200120112010200f200520092903a017200c290300200d290300200a2903001027200941c8006a2903002104200941d0006a2903002103200941d8006a2903002102200941286a2903002101200941306a2903002108200941386a2903002107200941086a2903002106200941106a2903002105200941186a290300210f20092903402110200929032021112009290300211441c000200941a0176a101720092903a017220b200c2903002215200d2903002216200a290300221742e0004200420042001024200a200f370300200920053703b017200920063703a817200920143703a017200ba7220c200941a0176a1015200a2007370300200920083703b017200920013703a817200920113703a017200c41206a200941a0176a1015200a2002370300200920033703b017200920043703a817200920103703a017200c41406b200941a0176a101520094198096a2017370300200920163703900920092015370388092009200b37038009201841e0036a220a20094180096a1015200a200941e0086a101720002021370310200020203703082000201f370300200041186a2022370300200941c0176a24000ba70507017f017f017f017e017e017f017f2300220f2112027e2009200b84200a200c84845004404200210c4200210a4200210b420021094200210842000c010b200f41206b220f220d240041c000200f1017200f280200210f200d41206b220d220e2400200d41186a4200370300200d4200370310200d4200370308200d4220370300200f200d1015200e41206b220d220e2400200d41186a4200370300200d4200370310200d4200370308200d4220370300200f41206a200d1015200e41206b220d220e2400200d41186a4200370300200d4200370310200d4200370308200d4220370300200f41406b200d1015200e41206b220d220e2400200d41186a2004370300200d2003370310200d2002370308200d2001370300200f41e0006a200d1015200e41206b220d220e2400200d41186a2008370300200d2007370310200d2006370308200d2005370300200f4180016a200d1015200e41206b220d220e2400200d41186a200c370300200d200b370310200d200a370308200d2009370300200f41a0016a200d1015101a210c200e41206b220d220e2400200d41186a4200370300200d4200370310200d4200370308200d4205370300200e41206b220e22132400200d200e100d200e290000210a200e290008210b200e2900102109200e2900182110201341206b220d220e2400200d2010370018200d2009370010200d200b370008200d200a370000200c200d200f41c001410041201019210d200e41206b220f24004100200f1017200dad2110200f41106a2903002108200f41086a2903002109200f290300210b4200210c4200210a200f41186a2903000b21072000200b37032020002010370300200041286a200937030020002011370308200041306a20083703002000200c370310200041386a2007370300200041186a200a370300201224000bab7237017f017e017e017e017e017f017e017e017e017e017e017e017e017e017e017f017e017e017e017e017e017f017e017e017e017e017e017e017e017e017e017e017e017e017f017f017e017f017e017e017e017e017e017f017f017e017f017f017f017f017f017f017e017e017f230041a0156b223024002030220d4188156a2138200d4190156a2139200d4198046a213b200d4190046a213c200d4188046a213d200d41f8036a213e200d41f0036a213f200d41e8036a21400340201b213a201e212c2019212b20152129027e200e201084200f201184845004404200210f4200210e4200211142000c010b200d41b0126a20162018200e2011100c200d41a0126a201a201d2010200f100c200d41f0116a2010420020164200100c200d41e0116a200f420020164200100c200d4190126a2010420020184200100c200d4180126a200f420020184200100c200d41f00d6a20142013201f2017100c200d41e00d6a201f201720142013100c200d41b00d6a2013420020144200100c200d41a00d6a2014420020134200100c200d41c00d6a2014420020144200100c200d41d00d6a2013420020134200100c200d41800c6a200d2903d00d2227200d41b80d6a290300200d2903b00d2215200d41c80d6a2903007c2219201554ad7c2228200d41a80d6a290300200d2903a00d221e20197c2215201e54ad7c7c22217c221b200d2903e00d2226200d2903f00d7c22247c2219201942017d2223200d2903c00d221e42017c2225201e54221220152012ad7c4280808080107d222020155420152020511bad7c222a201e427f52201542ffffffff0f54201542ffffffff0f511b2019201b54ad201b202754ad200d41d80d6a2903002021202854ad7c7c2024202654ad200d41e80d6a290300200d41f80d6a2903007c7c7c7c221b428180808070542019201b4281808080708584501b22121b201b2023202a56ad201b2019202356ad7c7c42feffffff0f7c20121b42034200100c200d41900d6a201e202520121b2219420042034200100c200d41f00c6a2015202020121b2215420042034200100c200d41900c6a2019201542004200100c200d41800d6a2019420042004200100c200d41a00c6a2015420042004200100c200d41d0146a2010200f200e2011100c200d41c0146a200e20112010200f100c200d4190146a200f420020104200100c200d4180146a20104200200f4200100c200d41a0146a2010420020104200100c200d41b0146a200f4200200f4200100c200d41d0126a200d2903a014220e200e42017c2219200e427f52200d29038014220f200d290390142211200d41a8146a2903007c22157c221042ffffffff0f54201042ffffffff0f511b200d41b8146a290300200d4198146a2903002011201556ad7c2211200d4188146a290300200f201056ad7c7c220f201154ad7c200d2903b0142211200f7c220f201154ad7c200d2903c0142211200d2903d0147c2215201154ad200d41c8146a290300200d41d8146a2903007c7c7c200f20157c2211200f54ad7c221542818080807054201120154281808080708584501b22121b220f20102010200e201956221cad7c4280808080107d221920121b220e2011201142017d221e201c201020195620102019511bad7c221020121b221920152010201e54ad20152011201e56ad7c7c42feffffff0f7c20121b2210100c200d41e0126a20192010200f200e100c200d41e0136a200e4200200f4200100c200d41d0136a200f4200200e4200100c200d41f0136a200f4200200f4200100c200d41f0126a200e4200200e4200100c200d41c0126a200d2903f012221e200d41e8136a290300200d2903e0132210200d41f8136a2903007c220f201054ad7c221b200d41d8136a290300200d2903d013220e200f7c2210200e54ad7c7c22237c2211200d2903e0122220200d2903d0127c22277c220f200f42017d2215200d2903f013220e42017c2228200e54221220102012ad7c4280808080107d221920105420102019511bad7c2221200e427f52201042ffffffff0f54201042ffffffff0f511b200f201154ad2011201e54ad200d41f8126a290300201b202356ad7c7c2020202756ad200d41e8126a290300200d41d8126a2903007c7c7c7c221142818080807054200f20114281808080708584501b22121b20112015202156ad2011200f201556ad7c7c42feffffff0f7c20121b427c42ffffffff0f100c200d4180136a200e202820121b220f2010201920121b22104200428180808070100c200d41c0136a200f4200427c4200100c200d41a0136a20104200427c4200100c200d41b0136a200f420042ffffffff0f4200100c200d4190136a2010420042ffffffff0f4200100c200d41b00f6a20162018201a201d100c200d41a00f6a201a201d20162018100c200d41800f6a2018420020164200100c200d41f00e6a2016420020184200100c200d41e00e6a2016420020164200100c200d41900f6a2018420020184200100c200d41d00b6a20142013200d2903900f2215200d41880f6a290300200d2903800f2210200d41e80e6a2903007c220f201054ad7c221a200d41f80e6a290300200d2903f00e2216200f7c2210201654ad7c7c221d7c2218200d2903a00f2219200d2903b00f7c221e7c220f200f42017d220e200d2903e00e221642017c221b201654221220102012ad7c4280808080107d221120105420102011511bad7c22202016427f52201042ffffffff0f54201042ffffffff0f511b200f201854ad2015201856ad200d41980f6a290300201a201d56ad7c7c2019201e56ad200d41a80f6a290300200d41b80f6a2903007c7c7c7c221842818080807054200f20184281808080708584501b22121b22232018200e202056ad2018200e200f54ad7c7c42feffffff0f7c20121b2220100c200d41c00b6a201f20172016201b20121b22162010201120121b2218100c200d41800b6a2016420020144200100c200d41a00b6a2018420020144200100c200d41900b6a2016420020134200100c200d41b00b6a2018420020134200100c200d41e00b6a200d2903c0132210201042017c221a2010427f52200d2903b0132213200d2903a0132214200d41c8136a2903007c220e7c220f42ffffffff0f54200f42ffffffff0f511b200d4198136a290300200d41a8136a290300200e201454ad7c2214200d41b8136a290300200f201354ad7c7c2213201454ad7c200d29039013221420137c2213201454ad7c200d290380132214200d2903c0127c220e201454ad200d4188136a290300200d41c8126a2903007c7c7c200e20137c2214201354ad7c221542818080807054201420154281808080708584501b22121b2219200d2903900d221f201f42017c221e201f427f52200d2903800d220e200d2903f00c2211200d41980d6a2903007c22177c221342ffffffff0f54201342ffffffff0f511b200d41a80c6a290300200d41f80c6a2903002011201756ad7c2211200d41880d6a290300200e201356ad7c7c220e201154ad7c200d2903a00c2217200e7c2211201754ad7c200d2903900c220e200d2903800c7c2217200e54ad200d41980c6a290300200d41880c6a2903007c7c7c201120177c220e201154ad7c221742818080807054200e20174281808080708584501b221c1b7c2211201142017c221b2011427f5220112019542232ad200f200f2010201a562222ad7c4280808080107d221a20121b221d20132013201e201f54222fad7c4280808080107d221f201c1b7c7c221042ffffffff0f54201042ffffffff0f511b20152015201442017d2219201454ad7c20192022200f201a56200f201a511bad7c221a201954ad7c42feffffff0f7c20121b20172017200e42017d220f200e54ad7c200f202f2013201f562013201f511bad7c2213200f54ad7c42feffffff0f7c201c1b7c2014201a20121b220f200e2013201c1b7c2213200f54ad7c201320322010201d542010201d511bad7c220f201354ad7c220e42818080807054200f200e4281808080708584501b22121b2213201020102011201b56221cad7c4280808080107d221120121b2214200f200f42017d2215201c201020115620102011511bad7c221020121b2227200e2010201554ad200e200f201556ad7c7c42feffffff0f7c20121b2228100c200d41f00b6a2027202820132014100c200d41d00c6a2014420020134200100c200d41c00c6a2013420020144200100c200d41e00c6a2013420020134200100c200d41b00c6a2014420020144200100c200d41c0056a20132014200d2903b00b2219200d41a80b6a290300200d2903a00b2210200d41880b6a2903007c220f201054ad7c221e200d41980b6a290300200d2903900b220e200f7c2210200e54ad7c7c221b7c2211200d2903c00b2221200d2903d00b7c22267c220e4202862010423e88842217201742017d221a200d2903800b2215420286221f42047c2224201f54221220104202862015423e8884220f2012ad7c4280808080407c221d200f54200f201d511bad7c22252015427f52201042ffffffff0f54201042ffffffff0f511b200e201154ad2011201954ad200d41b80b6a290300201b201e54ad7c7c2021202656ad200d41c80b6a290300200d41d80b6a2903007c7c7c7c221042818080807054200e20104281808080708584501b22121b2215201542017d2221201f202420121b221f420184221b201f54221c200f201d20121b220f201cad7c4280808080107d2211200f54200f2011511bad7c222d201f427f52200f42ffffffff0f54200f42ffffffff0f511b2010420286200e423e88842210201a202556ad20102017201a56ad7c7c42fbffffff3f7c20121b221742818080807054201520174281808080708584501b22121b221a200d2903b00c221e200d41d80c6a290300200d2903d00c2210200d41e80c6a2903007c220e201054ad7c2225200d41c80c6a290300200d2903c00c221d200e7c2210201d54ad7c7c222a7c2219200d2903f00b222e200d2903e00b7c22317c220e200e42017d2226200d2903e00c221d42017c2233201d54221c2010201cad7c4280808080107d222420105420102024511bad7c2234201d427f52201042ffffffff0f54201042ffffffff0f511b200e201954ad2019201e54ad200d41b80c6a2903002025202a56ad7c7c202e203156ad200d41f80b6a290300200d41e80b6a2903007c7c7c7c221942818080807054200e20194281808080708584501b221c1b222e201a420186200f201120121b2211423f8884221e201e42017d2225201f201b20121b221f420186221b4201842231201b5422222011420186201f423f8884220f2022ad7c4280808080107d222a200f54200f202a511bad7c2235201b427f52200f42ffffffff0f54200f42ffffffff0f511b20172021202d56ad20172015202156ad7c7c42feffffff0f7c20121b222d420186201a423f8884221542818080807054201e20154281808080708584501b22121b22367d2237201d2033201c1b2217201b203120121b221b54222220102024201c1b2210200f202a20121b220f54200f2010511bad22247d221d2017201b7d221b42017d2221201b54222f2010200f7d2022ad7d2217202fad7c42ffffffff0f7c221020175420102017511bad7c220f201d2021427f52201042ffffffff0f54201042ffffffff0f511b20192026203456ad2019200e202656ad7c7c42feffffff0f7c201c1b20152025203556ad2015201e202556ad7c7c42feffffff0f7c20121b7d202e203654ad7d2024203756ad7d2226200f201d54ad7c42ffffffff0f7d221942818080807054200f20194281808080708584501b22121b22157d2224201f2021201b20121b220f54221c20112010201720121b22105420102011511bad22217d2217201f200f7d221d42017d221e201d542222201120107d201cad7d22112022ad7c42ffffffff0f7c220e201154200e2011511bad7c221b2017201e427f52200e42ffffffff0f54200e42ffffffff0f511b202d2019202620121b221f7d2015201a56ad7d2021202456ad7d22192017201b56ad7c42ffffffff0f7d221a42818080807054201b201a4281808080708584501b22121b201a201920121b100c200d4190066a20272028201e201d20121b2217200e201120121b220e100c200d41a0096a2017420020134200100c200d4180096a200e420020134200100c200d4190096a2017420020144200100c200d41a0066a200e420020144200100c200d41800e6a2016201820232020100c200d41900e6a2023202020162018100c200d41c00e6a2018420020164200100c200d41b00e6a2016420020184200100c200d41d00e6a2016420020164200100c200d41a00e6a2018420020184200100c200d4180056a200d2903f01122184201862211201142027c221a2018427f52200d290390122214200d2903e0112216200d41f8116a2903007c220e7c221342ffffffff0f54201342ffffffff0f511b200d4188126a290300200d41e8116a290300200e201654ad7c2216200d4198126a2903002013201454ad7c7c2214201654ad7c200d29038012220e20147c2216200e54ad7c200d2903a0122214200d2903b0127c220e201454ad200d41a8126a290300200d41b8126a2903007c7c7c200e20167c2214201654ad7c221742818080807054201420174281808080708584501b22121b22162016420184221d2016427f5220134201862018423f8884220e200e2011201a56221cad7c4280808080207d221120121b221842ffffffff0f54201842ffffffff0f511b20174201862014423f88842217201720144201862013423f8884221342017d2214201354ad7c2014201c200e201156200e2011511bad7c220e201454ad7c42fdffffff1f7c20121b2217428180808070542013200e20121b221a20174281808080708584501b22121b2213201820182016201d56222fad7c4280808080107d222720121b2214200d2903a0062219200d4188096a290300200d290380092216200d41a8096a2903007c220e201654ad7c221e200d4198096a290300200d290390092211200e7c2216201154ad7c7c221b7c220e200d290390062223200d2903c0057c22207c2211201142017d2228200d2903a009221d42017c2231201d54221c2016201cad7c4280808080107d222120165420162021511bad7c2233201d427f52201642ffffffff0f54201642ffffffff0f511b200e201156ad200e201954ad200d41a8066a290300201b201e54ad7c7c2020202354ad200d4198066a290300200d41c8056a2903007c7c7c7c221942818080807054201120194281808080708584501b221c1b2234200d2903a00e222d200d41c80e6a290300200d2903c00e220e200d41d80e6a2903007c221e200e54ad7c222e200d41b80e6a290300200d2903b00e221b201e7c220e201b54ad7c7c22357c2223200d2903900e2236200d2903800e7c22377c221e420386200e423d88842226202642017d2224200d2903d00e2220420386222542087c22412025542222200e4203862020423d8884221b2022ad7c428080808080017d222a201b54201b202a511bad7c22422020427f52200e42ffffffff0f54200e42ffffffff0f511b201e202354ad2023202d54ad200d41a80e6a290300202e203556ad7c7c2036203756ad200d41980e6a290300200d41880e6a2903007c7c7c7c222d42818080807054201e202d4281808080708584501b22221b2223202342017d222e2025204120221b222042018422252020542232201b202a20221b220e2032ad7c4280808080107d221b200e54200e201b511bad7c222a2020427f52200e42ffffffff0f54200e42ffffffff0f511b202d420386201e423d8884221e2024204256ad201e2024202654ad7c7c42f7ffffffff007c20221b221e428180808070542023201e4281808080708584501b22221b22267d2224201d2031201c1b221d2020202520221b222054223220162021201c1b2216200e201b20221b220e54200e2016511bad22257d221b201d20207d222042017d222120205422432016200e7d2032ad7d221d2043ad7c42ffffffff0f7c220e201d54200e201d511bad7c2216201b2021427f52200e42ffffffff0f54200e42ffffffff0f511b20192028203356ad20192011202856ad7c7c42feffffff0f7c201c1b201e202a202e54ad201e2023202e56ad7c7c42feffffff0f7c20221b7d2026203456ad7d2024202554ad7d221e2016201b54ad7c42ffffffff0f7d221142818080807054201620114281808080708584501b221c1b22192011201e201c1b221e100c200d41b0066a201a201a42017d2216202f201820275620182027511bad7c221820121b221b20172016201856ad20172016201a54ad7c7c42feffffff0f7c20121b222320212020201c1b2216200e201d201c1b2218100c200d41f0086a2016420020134200100c200d41c0086a2018420020134200100c200d41e0086a2016420020144200100c200d41b0086a2018420020144200100c200d41f0056a200f20102015201f100c200d4180066a2015201f200f2010100c200d41e00a6a20104200200f4200100c200d41d00a6a200f420020104200100c200d41f00a6a200f4200200f4200100c200d41b0096a2010420020104200100c200d41d0056a200d2903b0092227200d41e80a6a290300200d2903e00a220e200d41f80a6a2903007c2211200e54ad7c2228200d41d80a6a290300200d2903d00a221720117c220e201754ad7c7c22217c221a200d290380062226200d2903f0057c22247c2211201142017d221d200d2903f00a221742017c22252017542212200e2012ad7c4280808080107d2220200e54200e2020511bad7c222a2017427f52200e42ffffffff0f54200e42ffffffff0f511b2011201a54ad201a202754ad200d41b8096a2903002021202854ad7c7c2024202654ad200d4188066a290300200d41f8056a2903007c7c7c7c221a428180808070542011201a4281808080708584501b22121b201a201d202a56ad201a2011201d56ad7c7c42feffffff0f7c20121b42034200100c200d41c00a6a2017202520121b2211420042034200100c200d41a00a6a200e202020121b220e420042034200100c200d41c0096a2011200e42004200100c200d41b00a6a2011420042004200100c200d41d0096a200e420042004200100c200d41f00f6a20132014201b2023100c200d4180106a201b202320132014100c200d41c0116a2014420020134200100c200d41b0116a2013420020144200100c200d41d0116a2013420020134200100c200d4190106a2014420020144200100c200d41d00f6a200d2903d011220e200e42017c221a200e427f52200d2903b0112214200d2903c0112211200d41d8116a2903007c22177c221342ffffffff0f54201342ffffffff0f511b200d4198106a290300200d41c8116a2903002011201756ad7c2211200d41b8116a2903002013201454ad7c7c2214201154ad7c200d29039010221120147c2214201154ad7c200d290380102211200d2903f00f7c2217201154ad200d4188106a290300200d41f80f6a2903007c7c7c201420177c2211201454ad7c221742818080807054201120174281808080708584501b22121b221420132013200e201a56221cad7c4280808080107d221a20121b220e2011201142017d221d201c2013201a562013201a511bad7c221320121b221a20172013201d54ad20172011201d56ad7c7c42feffffff0f7c20121b2213100c200d41e00f6a201a20132014200e100c200d4190116a200e420020144200100c200d4180116a20144200200e4200100c200d41a0116a2014420020144200100c200d41a0106a200e4200200e4200100c200d41c00f6a200d2903a010221d200d4198116a290300200d290390112213200d41a8116a2903007c2214201354ad7c221b200d4188116a290300200d29038011220e20147c2213200e54ad7c7c22237c2211200d2903e00f2220200d2903d00f7c22277c2214201442017d2217200d2903a011220e42017c2228200e54221220132012ad7c4280808080107d221a2013542013201a511bad7c2221200e427f52201342ffffffff0f54201342ffffffff0f511b2011201456ad2011201d54ad200d41a8106a290300201b202356ad7c7c2020202756ad200d41e80f6a290300200d41d80f6a2903007c7c7c7c221142818080807054201420114281808080708584501b22121b20112017202156ad20112014201756ad7c7c42feffffff0f7c20121b427c42ffffffff0f100c200d41b0106a200e202820121b22142013201a20121b22134200428180808070100c200d41f0106a20144200427c4200100c200d41d0106a20134200427c4200100c200d41e0106a2014420042ffffffff0f4200100c200d41c0106a2013420042ffffffff0f4200100c200d41e0046a201620182019201e100c200d41f0046a2019201e20162018100c200d41a0086a2018420020164200100c200d4190086a2016420020184200100c200d41d0086a2016420020164200100c200d41c0066a2018420020184200100c200d41d0046a200f2010200d2903c0062217200d41a8086a290300200d2903a0082213200d41d8086a2903007c2214201354ad7c221a200d4198086a290300200d29039008221620147c2213201654ad7c7c221d7c2218200d2903f0042219200d2903e0047c221e7c2214201442017d220e200d2903d008221642017c221b201654221220132012ad7c4280808080107d221120135420112013511bad7c22202016427f52201342ffffffff0f54201342ffffffff0f511b2014201854ad2017201856ad200d41c8066a290300201a201d56ad7c7c2019201e56ad200d41f8046a290300200d41e8046a2903007c7c7c7c221842818080807054201420184281808080708584501b22121b22232018200e202056ad2018200e201454ad7c7c42feffffff0f7c20121b2220100c200d41e0056a2015201f2016201b20121b22162013201120121b2218100c200d4180086a20164200200f4200100c200d41d0076a20184200200f4200100c200d41f0076a2016420020104200100c200d4180076a2018420020104200100c200d41a0056a200d2903c00a2213201342017c221a2013427f52200d2903b00a220f200d2903a00a2214200d41c80a6a2903007c220e7c221042ffffffff0f54201042ffffffff0f511b200d41d8096a290300200d41a80a6a290300200e201454ad7c2214200d41b80a6a290300200f201056ad7c7c220f201454ad7c200d2903d0092214200f7c220f201454ad7c200d2903c0092214200d2903d0057c220e201454ad200d41c8096a290300200d41d8056a2903007c7c7c200e200f7c2214200f54ad7c221542818080807054201420154281808080708584501b22121b2219200d2903f010221f201f42017c221e201f427f52200d2903e010220e200d2903d0102211200d41f8106a2903007c22177c220f42ffffffff0f54200f42ffffffff0f511b200d41c8106a290300200d41d8106a2903002011201756ad7c2211200d41e8106a290300200e200f56ad7c7c220e201154ad7c200d2903c0102217200e7c2211201754ad7c200d2903b010220e200d2903c00f7c2217200e54ad200d41b8106a290300200d41c80f6a2903007c7c7c201120177c220e201154ad7c221742818080807054200e20174281808080708584501b221c1b7c2211201142017c221b2011427f5220112019542232ad201020102013201a562222ad7c4280808080107d221a20121b221d200f200f201e201f54222fad7c4280808080107d221f201c1b7c7c221342ffffffff0f54201342ffffffff0f511b20152015201442017d2219201454ad7c201920222010201a562010201a511bad7c221a201954ad7c42feffffff0f7c20121b20172017200e42017d2210200e54ad7c2010202f200f201f56200f201f511bad7c220f201054ad7c42feffffff0f7c201c1b7c2014201a20121b2214200e200f201c1b7c2210201454ad7c201020322013201d542013201d511bad7c2214201054ad7c220e428180808070542014200e4281808080708584501b22121b2210201320132011201b56221cad7c4280808080107d221120121b220f2014201442017d2215201c201120135420112013511bad7c221320121b2227200e2013201554ad200e2014201556ad7c7c42feffffff0f7c20121b2228100c200d41b0056a202720282010200f100c200d41800a6a200f420020104200100c200d41f0096a20104200200f4200100c200d41900a6a2010420020104200100c200d41e0096a200f4200200f4200100c200d41a0046a2010200f200d290380072219200d41d8076a290300200d2903d0072213200d4188086a2903007c2214201354ad7c221e200d41f8076a290300200d2903f007220e20147c2213200e54ad7c7c221b7c2211200d2903e0052221200d2903d0047c22267c220e4202862013423e88842217201742017d221a200d290380082215420286221f42047c2224201f54221220134202862015423e888422142012ad7c4280808080407c221d2014542014201d511bad7c22252015427f52201342ffffffff0f54201342ffffffff0f511b200e201154ad2011201954ad200d4188076a290300201b201e54ad7c7c2021202656ad200d41e8056a290300200d41d8046a2903007c7c7c7c221342818080807054200e20134281808080708584501b22121b2215201542017d2221201f202420121b221f420184221b201f54221c2014201d20121b2214201cad7c4280808080107d221120145420112014511bad7c222d201f427f52201442ffffffff0f54201442ffffffff0f511b2013420286200e423e88842213201a202556ad20132017201a56ad7c7c42fbffffff3f7c20121b221742818080807054201520174281808080708584501b22121b221a200d2903e009221e200d41880a6a290300200d2903800a2213200d41980a6a2903007c220e201354ad7c2225200d41f8096a290300200d2903f009221d200e7c2213201d54ad7c7c222a7c2219200d2903b005222e200d2903a0057c22317c220e200e42017d2226200d2903900a221d42017c2233201d54221c2013201cad7c4280808080107d222420135420132024511bad7c2234201d427f52201342ffffffff0f54201342ffffffff0f511b200e201954ad2019201e54ad200d41e8096a2903002025202a56ad7c7c202e203156ad200d41b8056a290300200d41a8056a2903007c7c7c7c221942818080807054200e20194281808080708584501b221c1b222e201a4201862014201120121b2211423f8884221e201e42017d2225201f201b20121b221b420186221f4201842231201f5422222011420186201b423f888422142022ad7c4280808080107d222a2014542014202a511bad7c2235201f427f52201442ffffffff0f54201442ffffffff0f511b20172021202d56ad20172015202156ad7c7c42feffffff0f7c20121b222d420186201a423f8884221542818080807054201e20154281808080708584501b22121b22367d2237201d2033201c1b2217201f203120121b221d54222220132024201c1b22132014202a20121b22145420132014511bad22247d221f2017201d7d221d42017d2221201d54222f201320147d2022ad7d2217202fad7c42ffffffff0f7c221320175420132017511bad7c2214201f2021427f52201342ffffffff0f54201342ffffffff0f511b20192026203456ad2019200e202656ad7c7c42feffffff0f7c201c1b20152025203556ad2015201e202556ad7c7c42feffffff0f7c20121b7d202e203654ad7d2024203756ad7d22262014201f54ad7c42ffffffff0f7d221542818080807054201420154281808080708584501b22121b221f7d2224201b2021201d20121b221454221c20112013201720121b22135420112013511bad22217d221d201b20147d221942017d221e2019542222201120137d201cad7d22112022ad7c42ffffffff0f7c220e201154200e2011511bad7c221b201d201e427f52200e42ffffffff0f54200e42ffffffff0f511b202d2015202620121b22177d201a201f54ad7d2021202456ad7d221a201b201d54ad7c42ffffffff0f7d221542818080807054201b20154281808080708584501b22121b2015201a20121b100c200d4190056a20272028201e201920121b2215200e201120121b220e100c200d41c0076a2015420020104200100c200d41a0076a200e420020104200100c200d41b0076a20154200200f4200100c200d4190076a200e4200200f4200100c200d41b0046a2016201820232020100c200d41c0046a2023202020162018100c200d41f0066a2018420020164200100c200d41e0066a2016420020184200100c200d41e0076a2016420020164200100c200d41d0066a2018420020184200100c200d4198076a290300200d41a8076a290300200d2903a0072210200d41c8076a2903007c220f201054ad7c2216200d41b8076a290300200d2903b0072218200f7c2210201854ad7c7c220f201654ad7c200d290390072216200f7c220f201654ad7c200d290390052216200d2903a0047c2218201654ad200d4198056a290300200d41a8046a2903007c7c7c200f20187c2216200f54ad7c220f200f201642017d220e201654ad7c200e200d2903c007221842017c2220201854221220102012ad7c4280808080107d221d2010542010201d511bad7c2227200e54ad7c42feffffff0f7c2018427f52201042ffffffff0f54201042ffffffff0f511b200f428180808070542016200f4281808080708584501b22121b200d41d8066a290300200d41f8066a290300200d2903f006220f200d41e8076a2903007c220e200f54ad7c2211200d41e8066a290300200d2903e0062215200e7c220f201554ad7c7c220e201154ad7c200d2903d0062215200e7c2211201554ad7c200d2903c004220e200d2903b0047c2215200e54ad200d41c8046a290300200d41b8046a2903007c7c7c201120157c220e201154ad7c2215420386200e423d888422112011200e420386200f423d8884221a42017d2219201a54ad7c2019200d2903e007221e420386221b42087c2228201b54221c200f420386201e423d88842211201cad7c428080808080017d222320115420112023511bad7c2221201954ad7c42f7ffffffff007c201e427f52200f42ffffffff0f54200f42ffffffff0f511b201542818080807054200e20154281808080708584501b221c1b220e200e201a2021201c1b221542017d2219201554ad7c2019201b2028201c1b221a420184221e201a54222220112023201c1b220f2022ad7c4280808080107d2211200f54200f2011511bad7c221b201954ad7c42feffffff0f7c201a427f52200f42ffffffff0f54200f42ffffffff0f511b200e428180808070542015200e4281808080708584501b221c1b7d2016202720121b22162015201b201c1b220e54ad7d2016200e7d22162018202020121b2218201a201e201c1b220e5422222010201d20121b2210200f2011201c1b220f54200f2010511bad221154ad7d221a201620117d22162018200e7d220e42017d2211200e5422122010200f7d2022ad7d220f2012ad7c42ffffffff0f7c2210200f54200f2010511bad7c2218201654ad7c42ffffffff0f7d2215201a2011427f52201042ffffffff0f54201042ffffffff0f511b201542818080807054201820154281808080708584501b22121b211d2018201620121b211a2010200f20121b21182011200e20121b2116200d2903b0082220200d41c8086a290300200d2903c0082210200d41f8086a2903007c220f201054ad7c2227200d41e8086a290300200d2903e008220e200f7c2210200e54ad7c7c22287c2211200d2903b0062221200d290380057c22267c220f4201862010423f88842219201942017d221e200d2903f0082215420186221b42027c2224201b54221220104201862015423f8884220e2012ad7c4280808080207d2223200e54200e2023511bad7c22252015427f52201042ffffffff0f54201042ffffffff0f511b200f201154ad2011202054ad200d41b8086a2903002027202856ad7c7c2021202656ad200d41b8066a290300200d4188056a2903007c7c7c7c222042818080807054200f20204281808080708584501b22121b2211201142017d2227201b202420121b22154201842228201554221c200e202320121b2210201cad7c4280808080107d221b2010542010201b511bad7c22232015427f52201042ffffffff0f54201042ffffffff0f511b2020420186200f423f8884220f201e202556ad200f2019201e56ad7c7c42fdffffff1f7c20121b220f428180808070542011200f4281808080708584501b22121b210e200f2023202754ad200f2011202756ad7c7c42feffffff0f7c20121b21112010201b20121b210f2015202820121b0b2110200d4198156a22122008370300200d200537038015200d200637038815200d200737039015200d4180156a41fc01200d41e0146a101e200d2903e01421152012200c370300200d200b37039015200d200a37038815200d200937038015200d4180156a41fe01200d41e0146a101e200d2903e0142119203041206b221c2230240020194203832015420c838442058620017ca72222201c1017201c28020041406b200d4180156a10170240200d29038015203929030084203829030020122903008484500d00203041206b221c223024002022201c1017201c2903002115200e201084200f2011848450450440200d41c0036a2015201c41086a290300201c41106a290300201c41186a29030020142013201f201720162018201a201d2010200f200e20111027203b2903002111203c290300210e203d290300210f203e290300211d203f290300211a20402903002118200d41d8036a2903002117200d41d0036a290300211f200d41c8036a2903002113200d290380042110200d2903e0032116200d2903c00321140c010b2015a7200d4180156a1017201229030021172039290300211f20382903002113200d290380152114203041206b2230221c2400202220301017203028020041206a200d4180156a10172012290300211d2039290300211a20382903002118200d290380152116201c41206b221c223024002022201c1017201c28020041406b200d4180156a1017201229030021112039290300210e2038290300210f200d2903801521100b20122008370300200d200537038015200d200637038815200d200737039015200d4180156a4102200d41e0146a101d200d41f8146a221c2903002108200d41f0146a22222903002107200d41e8146a222f2903002106200d2903e01421052012200c370300200d200b37039015200d200a37038815200d200937038015200d4180156a4102200d41e0146a101d203a202c202942017c22152029542212202b2012ad7c2219202b54201520295a1bad7c221e202c54ad7c211b201c290300210c2022290300210b202f290300210a200d2903e0142109202c203a8450202b50202942ff005471710d000b2000027e200e201084200f2011848450044042002116420021184200210e420021114200210f420021134200212942000c010b200d4180036a2010200f200e2011427d42ffffffff0f4200428180808070427f42ffffffff0f42004281808080701022200d41b8036a2903002129200d41b0036a2903002115200d41a8036a2903002110200d2903a003210f200d29038003200d4190036a29030084200d4188036a290300200d4198036a2903008484500440200d4198156a4200370300200d420037039015200d420037038815200d42f1f6a1f204370380154100200d4180156a1015200d41f8146a4200370300200d42003703f014200d42003703e814200d42123703e0144120200d41e0146a1015411c412410110b200d41f0026a200f201020152029100c200d41e0026a20152029200f2010100c200d41b0026a20104200200f4200100c200d41a0026a200f420020104200100c200d41c0026a200f4200200f4200100c200d41d0026a2010420020104200100c200d41b0016a20142013200d2903d002220b200d41b8026a290300200d2903b002220e200d41c8026a2903007c2211200e54ad7c220a200d41a8026a290300200d2903a002222c20117c220e202c54ad7c7c22097c222b200d2903e0022208200d2903f0027c22077c2211201142017d2219200d2903c002222c42017c2206202c542212200e2012ad7c4280808080107d220c200e54200c200e511bad7c2205202c427f52200e42ffffffff0f54200e42ffffffff0f511b2011202b54ad200b202b56ad200d41d8026a2903002009200a54ad7c7c2007200854ad200d41e8026a290300200d41f8026a2903007c7c7c7c222b428180808070542011202b4281808080708584501b22121b220b202b2005201954ad202b2011201956ad7c7c42feffffff0f7c20121b222b100c200d41a0016a201f2017202c200620121b2211200e200c20121b220e100c200d41f0006a2011420020144200100c200d41e0006a200e420020144200100c200d4190016a2011420020134200100c200d4180016a200e420020134200100c200d41c0016a200f2010200b202b100c200d41d0016a201520292011200e100c200d4190026a20114200200f4200100c200d41f0016a200e4200200f4200100c200d4180026a2011420020104200100c200d41e0016a200e420020104200100c200d41d0006a20162018200d2903e0012229200d41f8016a290300200d2903f0012210200d4198026a2903007c220f201054ad7c2215200d4188026a290300200d290380022213200f7c2210201354ad7c7c221f7c2214200d2903d001222c200d2903c0017c222b7c220f200f42017d220e200d29039002221342017c2217201354221220102012ad7c4280808080107d221120105420102011511bad7c22192013427f52201042ffffffff0f54201042ffffffff0f511b200f201454ad2014202954ad200d41e8016a2903002015201f56ad7c7c202b202c54ad200d41d8016a290300200d41c8016a2903007c7c7c7c221442818080807054200f20144281808080708584501b22121b2014200e201956ad2014200e200f54ad7c7c42feffffff0f7c20121b100c200d41406b201a201d2013201720121b220f2010201120121b2210100c200d41106a200f420020164200100c200d41206a2010420020164200100c200d200f420020184200100c200d41306a2010420020184200100c200d4188016a290300200d41e8006a290300200d2903602210200d41f8006a2903007c220f201054ad7c2213200d4198016a290300200d290390012214200f7c2210201454ad7c7c220f201354ad7c200d290380012214200f7c2213201454ad7c200d2903a001220f200d2903b0017c2214200f54ad200d41a8016a290300200d41b8016a2903007c7c7c201320147c220f201354ad7c22132013200f42017d2216200f54ad7c2016200d290370221442017c2229201454221220102012ad7c4280808080107d221820105420102018511bad7c220e201654ad7c42feffffff0f7c2014427f52201042ffffffff0f54201042ffffffff0f511b201342818080807054200f20134281808080708584501b22121b2111200f200e20121b210e2010201820121b21182014202920121b2116200d41386a290300200d41286a290300200d2903202210200d41186a2903007c220f201054ad7c2213200d41086a290300200d2903002214200f7c2210201454ad7c7c220f201354ad7c200d2903302214200f7c2213201454ad7c200d290340220f200d2903507c2214200f54ad200d41c8006a290300200d41d8006a2903007c7c7c201320147c220f201354ad7c22132013200f42017d2229200f54ad7c2029200d290310221442017c221f201454221220102012ad7c4280808080107d221520105420102015511bad7c222c202954ad7c42feffffff0f7c2014427f52201042ffffffff0f54201042ffffffff0f511b201342818080807054200f20134281808080708584501b22121b2129200f202c20121b21132010201520121b210f2014201f20121b0b221037032020002016370300200041286a200f37030020002018370308200041306a20133703002000200e370310200041386a2029370300200041186a2011370300200d41a0156a24000beb0208017f017e017f017e017e017e017f017f230041406a220a2108200a2400024020052004421f7c220c200454220ead7c220920017c200c426083220b20007c220d200b54220fad7c220b4200522006200e20052009562004200c581bad7c220420027c2205200f2009200b562009200b511bad7c22094200522005200956ad2004200556ad20072004200654ad7c20037c7c7c22044200522004501b2004200984501b4504402000200d582001200b582001200b511b2002200958200320045820032004511b2002200985200320048584501b0d010b200841386a428080808090ee9ea4ce003703002008420037033020084200370328200842003703204100200841206a1015200841186a42003703002008420037031020084200370308200842c1003703004104200810154100412410110b200a41206b220a2400200a41186a2004370300200a2009370310200a200b370308200a200d37030041c000200a1015200841406b24000ba4030d017f017f017e017e017e017e017e017f017e017e017f017f017e230041e0006b220f2108200f2400200420068420052007848450450440200841d0006a2112200841c8006a2113034041c000200841406b10172008290340220a2013290300220c2012290300220d200841d8006a2209290300221442e000420042004200102420094200370300200842003703502008420037034820084200370340200aa72209200841406b1015200841386a4200370300200842003703302008420037032820084200370320200941206a200841206a1015200841186a4200370300200842003703102008420037030820084200370300200941406b20081015200f41206b2209220f2400200941186a20143703002009200d3703102009200c3703082009200a3703002000200b7ca7200910152011200b42207c220a200b54220920102009ad7c220c201054200a200b5a1bad7c220d2011542109200a210b200c2110200d21112004200a562005200c562005200c511b2006200d56200e2009ad7c220e2007542007200e511b2006200d852007200e8584501b0d000b0b200841e0006a24000be63227017f017e017e017e017e017e017e017e017f017e017e017e017f017e017e017e017e017f017e017f017e017e017e017e017e017e017f017e017e017e017f017e017e017f017f017e017e017e017e23004180096b2205240041c000200541e0086a101720052903e0082209200541e8086a2211290300200541f0086a2216290300200541f8086a221f29030042e0004200420042001024201f4200370300200542003703f008200542003703e808200542003703e0082009a7220d200541e0086a1015200541d8086a4200370300200542003703d008200542003703c808200542003703c008200d41206a200541c0086a1015200541b8086a4200370300200542003703b008200542003703a808200542003703a008200d41406b200541a0086a10152001a7220d200541e0086a10172011290300210120162903002114201f290300211220052903e0082109200d41206a200541e0086a101720162903002115201f290300210e2011290300210c20052903e008210b200d41406b200541e0086a1017200541f0046a200b200c20162903002213201f2903002217100c200541b0016a2015200e20052903e008220820112903002206100c200541d0046a20084200200b4200100c200541f0016a20064200200b4200100c200541c0046a20084200200c4200100c200541e0016a20064200200c4200100c200541f0066a2009200120142012100c20054180076a2014201220092001100c20054180086a2001420020094200100c200541f0076a2009420020014200100c20054190086a2009420020094200100c20054190076a2001420020014200100c200541406b200529039007221920054188086a290300200529038008220720054198086a2903007c220a200754ad7c221b200541f8076a29030020052903f007220f200a7c2207200f54ad7c7c22217c2210200529038007222020052903f0067c22227c220a200a42017d221d200529039008220f42017c221c200f54220d2007200dad7c4280808080107d221a2007542007201a511bad7c221e200f427f52200742ffffffff0f54200742ffffffff0f511b200a201054ad2010201954ad20054198076a290300201b202156ad7c7c2020202256ad20054188076a290300200541f8066a2903007c7c7c7c221042818080807054200a20104281808080708584501b220d1b2010201d201e56ad2010200a201d56ad7c7c42feffffff0f7c200d1b42034200100c200541e0076a200f201c200d1b220a420042034200100c200541c0076a2007201a200d1b2207420042034200100c200541a0076a200a200742004200100c200541d0076a200a420042004200100c200541b0076a2007420042004200100c200541c0016a2008200620132017100c200541d0016a2013201720082006100c200541b0046a2006420020084200100c200541a0046a2008420020064200100c200541e0046a2008420020084200100c20054180026a2006420020064200100c20054190016a20052903e0042207200742017c22102007427f5220052903a004220620052903b004220a200541e8046a2903007c220f7c220842ffffffff0f54200842ffffffff0f511b20054188026a290300200541b8046a290300200a200f56ad7c220a200541a8046a2903002006200856ad7c7c2206200a54ad7c200529038002220a20067c2206200a54ad7c20052903d001220a20052903c0017c220f200a54ad200541d8016a290300200541c8016a2903007c7c7c2006200f7c220a200654ad7c220f42818080807054200a200f4281808080708584501b220d1b22062008200820072010562218ad7c4280808080107d2210200d1b2207200a200a42017d22132018200820105620082010511bad7c2208200d1b2210200f2008201354ad200f200a201356ad7c7c42feffffff0f7c200d1b2208100c200541a0016a2010200820062007100c20054180046a2007420020064200100c200541f0036a2006420020074200100c20054190046a2006420020064200100c20054190026a2007420020074200100c20054180016a200529039002221320054188046a290300200529038004220820054198046a2903007c2206200854ad7c2217200541f8036a29030020052903f003220720067c2208200754ad7c7c221d7c220a20052903a001221a2005290390017c22197c2206200642017d220f200529039004220742017c221b200754220d2008200dad7c4280808080107d221020085420082010511bad7c22212007427f52200842ffffffff0f54200842ffffffff0f511b2006200a54ad200a201354ad20054198026a2903002017201d56ad7c7c2019201a54ad200541a8016a29030020054198016a2903007c7c7c7c220a428180808070542006200a4281808080708584501b220d1b200a200f202156ad200a2006200f56ad7c7c42feffffff0f7c200d1b427c42ffffffff0f100c200541a0026a2007201b200d1b220620082010200d1b22084200428180808070100c200541e0036a20064200427c4200100c200541c0036a20084200427c4200100c200541d0036a2006420042ffffffff0f4200100c200541b0026a2008420042ffffffff0f4200100c20054180056a200b200c2015200e100c20054190056a2015200e200b200c100c200541d0066a200c4200200b4200100c200541c0066a200b4200200c4200100c200541e0066a200b4200200b4200100c200541a0056a200c4200200c4200100c200541f0006a2009200120052903a0052215200541d8066a29030020052903d006220c200541e8066a2903007c220b200c54ad7c220e200541c8066a29030020052903c006220c200b7c220b200c54ad7c7c220f7c220620052903900522102005290380057c22137c220c200c42017d220720052903e006220842017c2217200854220d200b200dad7c4280808080107d220a200b54200a200b511bad7c221a2008427f52200b42ffffffff0f54200b42ffffffff0f511b2006200c56ad2006201554ad200541a8056a290300200e200f56ad7c7c2010201356ad20054198056a29030020054188056a2903007c7c7c7c220642818080807054200c20064281808080708584501b220d1b221d20062007201a56ad20062007200c54ad7c7c42feffffff0f7c200d1b221a100c200541b0056a2014201220082017200d1b220c200b200a200d1b220b100c200541b0066a200c420020094200100c20054180066a200b420020094200100c200541a0066a200c420020014200100c200541f0056a200b420020014200100c200541206a20052903e0032208200842017c220e2008427f5220052903d003220920052903c0032206200541e8036a2903007c22077c220142ffffffff0f54200142ffffffff0f511b200541b8026a290300200541c8036a2903002006200756ad7c2206200541d8036a2903002001200954ad7c7c2209200654ad7c20052903b002220620097c2209200654ad7c20052903a00222062005290380017c2207200654ad200541a8026a29030020054188016a2903007c7c7c200720097c2206200954ad7c221442818080807054200620144281808080708584501b220d1b221020052903e0072212201242017c22132012427f5220052903d007220720052903c007220a200541e8076a2903007c22157c220942ffffffff0f54200942ffffffff0f511b200541b8076a290300200541c8076a290300200a201556ad7c220a200541d8076a2903002007200956ad7c7c2207200a54ad7c20052903b007221520077c220a201554ad7c20052903a007220720052903407c2215200754ad200541a8076a290300200541c8006a2903007c7c7c200a20157c2207200a54ad7c221542818080807054200720154281808080708584501b22181b7c220a200a42017c2217200a427f52200a2010542227ad200120012008200e562223ad7c4280808080107d220e200d1b220f2009200920122013562226ad7c4280808080107d221220181b7c7c220842ffffffff0f54200842ffffffff0f511b20142014200642017d2210200654ad7c201020232001200e562001200e511bad7c220e201054ad7c42feffffff0f7c200d1b20152015200742017d2201200754ad7c20012026200920125620092012511bad7c2209200154ad7c42feffffff0f7c20181b7c2006200e200d1b22062007200920181b7c2201200654ad7c200120272008200f542008200f511bad7c2206200154ad7c220742818080807054200620074281808080708584501b220d1b220120082008200a2017562218ad7c4280808080107d220a200d1b22092006200642017d221420182008200a562008200a511bad7c2208200d1b221920072008201454ad20072006201456ad7c7c42feffffff0f7c200d1b221b100c200541306a2019201b20012009100c200541a0036a2009420020014200100c20054190036a2001420020094200100c200541b0036a2001420020014200100c200541c0026a2009420020094200100c41c000200541e0086a101720052903e00822212011290300222820162903002229201f290300222a42e00042004200420010242005200529039003220620052903a0032207200541b8036a2903007c220a7c2208200820052903b003221242017c2224201254220dad7c4280808080107d22202012427f52200842ffffffff0f54200842ffffffff0f511b200541c8026a290300200541a8036a2903002007200a56ad7c220720054198036a2903002006200856ad7c7c2206200754ad7c20052903c002220720067c2206200754ad7c2005290330220720052903207c220a200754ad200541386a290300200541286a2903007c7c7c2006200a7c220a200654ad7c221542818080807054200a20154281808080708584501b22111b222220052903a006220e2005290380062213200541b8066a2903007c22177c220742028620052903b0062206423e8884221420142006420286220f42047c221c200f542218ad7c4280808080407c22102006427f52200742ffffffff0f54200742ffffffff0f511b200541f8056a29030020054188066a2903002013201756ad7c2206200541a8066a2903002007200e54ad7c7c220e200654ad7c20052903f0052213200e7c2206201354ad7c20052903b005220e20052903707c2213200e54ad200541b8056a290300200541f8006a2903007c7c7c200620137c220e200654ad7c221342818080807054200e20134281808080708584501b22161b22062006200f201c20161b220f420184221c200f542223ad7c4280808080107d2217200f427f52200642ffffffff0f54200642ffffffff0f511b2013420286200e423e888422132013200e4202862007423e8884220742017d220e200754ad7c200e2018201020145420102014511bad7c2214200e54ad7c42fbffffff3f7c20161b220e428180808070542007201420161b2210200e4281808080708584501b22161b2214420186200f201c20161b220f423f888422072007200f420186221342018422252013542218ad7c4280808080107d221c2013427f52200742ffffffff0f54200742ffffffff0f511b200e200e201042017d221e201054ad7c201e2023200620175620062017511bad7c2206201e54ad7c42feffffff0f7c20161b222b4201862010200620161b220e423f8884221042818080807054200e4201862014423f8884221720104281808080708584501b22161b221e7d2012202420111b22062013202520161b2213542223ad7d2212200620137d221342017d22242013542226ad7c42ffffffff0f7c220620122024427f52200642ffffffff0f54200642ffffffff0f511b20152015200a42017d2225200a54ad7c2025200d200820205620082020511bad7c2220202554ad7c42feffffff0f7c20111b20102010201742017d2208201754ad7c200820182007201c562007201c511bad7c2207200854ad7c42feffffff0f7c20161b7d200a202020111b22082017200720161b220754ad7d200820077d22082023201e202256201e2022511bad220754ad7d2210200820077d22072026200620125420062012511bad7c2206200754ad7c42ffffffff0f7d220a428180808070542006200a4281808080708584501b22111b22083703e80820052024201320111b22123703e00820052006200720111b22073703f008200520012009200e20077d2213200f2012542216200820145620082014511bad22177d2215200f20127d221242017d220f201254220d201420087d2016ad7d2206200dad7c42ffffffff0f7c220820065420062008511bad7c22142015200f427f52200842ffffffff0f54200842ffffffff0f511b202b200a201020111b220a7d2007200e56ad7d2013201754ad7d220e2014201554ad7c42ffffffff0f7d220742818080807054201420074281808080708584501b22111b2007200e20111b100c200541106a2019201b200f201220111b22072008200620111b2208100c20054180036a2007420020014200100c200541e0026a2008420020014200100c200541f0026a2007420020094200100c200541d0026a2008420020094200100c200541d0006a200c200b201d201a100c200541e0006a201d201a200c200b100c200541e0056a200b4200200c4200100c200541d0056a200c4200200b4200100c20054190066a200c4200200c4200100c200541c0056a200b4200200b4200100c201f200a37030020054198066a290300210e20052903e0052106200541e8056a290300210f20052903d0052107200541d8056a2903002110200541c8056a290300211320052903c005210a200541d8006a2903002117200541e8006a290300211d2005290350211a20052903602114200529039006210820054188036a290300211520052903e0022101200541e8026a290300211920052903f0022109200541f8026a290300211b200541d8026a290300212020052903d002210b200541086a2903002122200541186a290300211c2005290300211e20052903102112200529038003210c2021a7220d200541e0086a1015201f20202019200120157c2215200154ad7c2219201b200920157c2201200954ad7c7c2209201954ad7c2009200b7c2209200b54ad7c2012201e7c220b201254ad201c20227c7c7c2009200b7c220b200954ad7c22092009200b42017d2212200b54ad7c2012200c42017c2219200c54221120012011ad7c4280808080107d221520015420012015511bad7c221b201254ad7c42feffffff0f7c200c427f52200142ffffffff0f54200142ffffffff0f511b200942818080807054200b20094281808080708584501b22111b2013200f2006200e7c2209200654ad7c22062010200720097c2209200754ad7c7c2207200654ad7c2007200a7c2207200a54ad7c2014201a7c2206201454ad2017201d7c7c7c200620077c2206200754ad7c220a4203862006423d88842207200720064203862009423d8884221442017d2212201454ad7c20122008420386220e42087c2210200e54221620094203862008423d888422072016ad7c428080808080017d220f2007542007200f511bad7c2213201254ad7c42f7ffffffff007c2008427f52200942ffffffff0f54200942ffffffff0f511b200a428180808070542006200a4281808080708584501b22161b220820082014201320161b220642017d2214200654ad7c2014200e201020161b220a4201842212200a5422182007200f20161b22092018ad7c4280808080107d220720095420072009511bad7c220e201454ad7c42feffffff0f7c200a427f52200942ffffffff0f54200942ffffffff0f511b200842818080807054200620084281808080708584501b22161b7d200b201b20111b220b2006200e20161b220854ad7d200b20087d220b200c201920111b2208200a201220161b22065422182001201520111b22012009200720161b22095420012009511bad220c54ad7d220a200b200c7d220c200820067d220b42017d2208200b542211200120097d2018ad7d22092011ad7c42ffffffff0f7c220120095420012009511bad7c2206200c54ad7c42ffffffff0f7d2207200a2008427f52200142ffffffff0f54200142ffffffff0f511b200742818080807054200620074281808080708584501b22111b37030020052006200c20111b3703f00820052001200920111b3703e80820052008200b20111b3703e008200d41206a200541e0086a1015201f200541e8016a290300200541f8016a29030020052903f0012201200541d8046a2903007c2209200154ad7c220c200541c8046a29030020052903c004220b20097c2201200b54ad7c7c2209200c54ad7c20052903e001220b20097c220c200b54ad7c20052903b001220920052903f0047c220b200954ad200541b8016a290300200541f8046a2903007c7c7c200b200c7c2209200c54ad7c220b4201862009423f8884220c200c20094201862001423f8884220842017d2206200854ad7c200620052903d0042207420186220a42027c2212200a54221120014201862007423f8884220c2011ad7c4280808080207d2214200c54200c2014511bad7c2215200654ad7c42fdffffff1f7c2007427f52200142ffffffff0f54200142ffffffff0f511b200b428180808070542009200b4281808080708584501b22111b220920092008201520111b220b42017d2206200b54ad7c2006200a201220111b220842018422072008542216200c201420111b22012016ad7c4280808080107d220c2001542001200c511bad7c220a200654ad7c42feffffff0f7c2008427f52200142ffffffff0f54200142ffffffff0f511b200942818080807054200b20094281808080708584501b22111b3703002005200b200a20111b3703f00820052001200c20111b3703e80820052008200720111b3703e008200d41406b200541e0086a1015200020293703102000202837030820002021370300200041186a202a37030020054180096a24000bd1682e017f017e017e017e017f017e017e017e017e017e017e017e017f017e017e017e017f017e017e017e017e017e017e017e017e017e017f017e017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017f017e017f230041a0146b221124002001a7221d41406b20114180146a1017201141c00f6a201129038014220120114188146a290300221320114190146a290300223020114198146a2903002231100c201141d00f6a2030203120012013100c201141f0116a2013420020014200100c201141e0116a2001420020134200100c20114180126a2001420020014200100c201141e00f6a2013420020134200100c201d41206a201141e0136a101720114190126a200d200e200f2010100c201141a0126a200f2010200d200e100c201141a0136a200e4200200d4200100c20114190136a200d4200200e4200100c201141b0136a200d4200200d4200100c201141b0126a200e4200200e4200100c201141e00d6a200d200e20112903b012221b201141a8136a29030020112903a0132214201141b8136a2903007c2212201454ad7c221c20114198136a290300201129039013221920127c2214201954ad7c7c221e7c221620112903a012221a2011290390127c22207c2212201242017d221820112903b013221942017c2222201954221520142015ad7c4280808080107d221720145420142017511bad7c221f2019427f52201442ffffffff0f54201442ffffffff0f511b2012201654ad2016201b54ad201141b8126a290300201c201e56ad7c7c201a202056ad201141a8126a29030020114198126a2903007c7c7c7c221642818080807054201220164281808080708584501b22151b223520162018201f56ad20162012201856ad7c7c42feffffff0f7c20151b2236100c201141c0126a200f20102019202220151b22192014201720151b2216100c20114180136a20194200200d4200100c201141e0126a20164200200d4200100c201141f0126a20194200200e4200100c201141d0126a20164200200e4200100c201141b00f6a2011290380132218201842017c221c2018427f5220112903f012221220112903e012221720114188136a2903007c221b7c221442ffffffff0f54201442ffffffff0f511b201141d8126a290300201141e8126a2903002017201b56ad7c2217201141f8126a2903002012201456ad7c7c2212201754ad7c20112903d012221b20127c2217201b54ad7c20112903c012221220112903e00d7c221b201254ad201141c8126a290300201141e80d6a2903007c7c7c2017201b7c2212201754ad7c221742818080807054201220174281808080708584501b22151b221b201420142018201c562221ad7c4280808080107d221820151b221c201141f0136a290300201141f8136a290300100c201141c00d6a2012201242017d221e2021201420185620142018511bad7c221420151b20172014201e54ad20172012201e56ad7c7c42feffffff0f7c20151b20112903e0132214201141e8136a2903002212100c201141a00f6a20144200201b4200100c201141800f6a20124200201b4200100c201141900f6a20144200201c4200100c201141f00e6a20124200201c4200100c201141900e6a2001201320112903e00f221e201141f8116a29030020112903f011221420114188126a2903007c2212201454ad7c221a201141e8116a29030020112903e011221820127c2214201854ad7c7c22207c221720112903d00f222220112903c00f7c221f7c2212201242017d221b201129038012221842017c2223201854221520142015ad7c4280808080107d221c2014542014201c511bad7c22252018427f52201442ffffffff0f54201442ffffffff0f511b2012201754ad2017201e54ad201141e80f6a290300201a202056ad7c7c201f202254ad201141d80f6a290300201141c80f6a2903007c7c7c7c221742818080807054201220174281808080708584501b22151b22202017201b202556ad20172012201b56ad7c7c42feffffff0f7c20151b2222100c20114180106a203020312018202320151b22122014201c20151b2218100c201141d0116a2012420020014200100c20114190116a2018420020014200100c201141c0116a2012420020134200100c201141b0106a2018420020134200100c201141f00d6a2009200a20112903b010221f20114198116a2903002011290390112214201141d8116a2903007c2217201454ad7c2223201141c8116a29030020112903c011221b20177c2214201b54ad7c7c22257c221c201129038010222420112903900e7c22287c2217201742017d221e20112903d011221b42017c2227201b54221520142015ad7c4280808080107d221a2014542014201a511bad7c2226201b427f52201442ffffffff0f54201442ffffffff0f511b2017201c54ad201c201f54ad201141b8106a2903002023202556ad7c7c2024202856ad20114188106a290300201141980e6a2903007c7c7c7c221c428180808070542017201c4281808080708584501b22151b201c201e202656ad201c2017201e56ad7c7c42feffffff0f7c20151b100c201141c0106a200b200c201b202720151b22172014201a20151b2214100c20114180116a2017420020094200100c201141e0106a2014420020094200100c201141f0106a20174200200a4200100c201141d0106a20144200200a4200100c201d201141c0136a1017201141e00e6a20192016201141d0136a290300201141d8136a290300100c201141d00d6a2035203620112903c0132214201141c8136a2903002217100c201141d00e6a2014420020194200100c201141b00e6a2017420020194200100c201141c00e6a2014420020164200100c201141a00e6a2017420020164200100c201141800e6a2005200620202022100c201141f00f6a2007200820122018100c201141b0116a2012420020054200100c201141a0106a2018420020054200100c201141a0116a2012420020064200100c20114190106a2018420020064200100c027e20112903b011221b201b42017c2222201b427f5220112903a011221220112903a0102218201141b8116a2903007c22177c221442ffffffff0f54201442ffffffff0f511b20114198106a290300201141a8106a2903002017201854ad7c2218201141a8116a2903002012201456ad7c7c2212201854ad7c201129039010221820127c2212201854ad7c20112903f00f221820112903800e7c2217201854ad201141f80f6a290300201141880e6a2903007c7c7c201220177c2218201254ad7c221c428180808070542018201c4281808080708584501b22151b222720112903d00e221e201e42017c2226201e427f5220112903c00e221720112903b00e221a201141d80e6a2903007c22207c221242ffffffff0f54201242ffffffff0f511b201141a80e6a290300201141b80e6a290300201a202056ad7c221a201141c80e6a2903002012201754ad7c7c2217201a54ad7c20112903a00e222020177c221a202054ad7c20112903d00d221720112903e00e7c2220201754ad201141d80d6a290300201141e80e6a2903007c7c7c201a20207c2217201a54ad7c222042818080807054201720204281808080708584501b221d1b22247d221f42017d2223201f2023427f5220142014201b2022562221ad7c4280808080107d222520151b222820122012201e202656222bad7c4280808080107d221e201d1b221a7d2024202756222dad7d2222201f202356223cad7c42ffffffff0f7c221b42ffffffff0f54201b42ffffffff0f511b201c201c201842017d2223201854ad7c20232021201420255620142025511bad7c2225202354ad7c42feffffff0f7c20151b20202020201742017d2214201754ad7c2014202b2012201e562012201e511bad7c2212201454ad7c42feffffff0f7c201d1b22327d2018202520151b221420172012201d1b223b54ad7d2014203b7d2214202d201a202856201a2028511bad221254ad7d2237201420127d2227203c201b202254201b2022511bad7c2226202754ad7c42ffffffff0f7d222a428180808070542026202a4281808080708584501b22151b2214201129038011221e201e42017c2225201e427f5220112903f010221820112903e010221720114188116a2903007c221c7c221242ffffffff0f54201242ffffffff0f511b201141d8106a290300201141e8106a2903002017201c56ad7c2217201141f8106a2903002012201854ad7c7c2218201754ad7c20112903d010221720187c2218201754ad7c20112903c010221720112903f00d7c221c201754ad201141c8106a290300201141f80d6a2903007c7c7c2018201c7c2217201854ad7c221f428180808070542017201f4281808080708584501b221d1b223820112903a00f2220202042017c22342020427f5220112903900f221c20112903800f2223201141a80f6a2903007c22287c221842ffffffff0f54201842ffffffff0f511b201141f80e6a290300201141880f6a2903002023202856ad7c2223201141980f6a2903002018201c54ad7c7c221c202354ad7c20112903f00e2228201c7c2223202854ad7c20112903c00d221c20112903b00f7c2228201c54ad201141c80d6a290300201141b80f6a2903007c7c7c202320287c221c202354ad7c222342818080807054201c20234281808080708584501b22211b22287d222e42017d222f202e202f427f5220122012201e202556222bad7c4280808080107d2229201d1b222c201820182020203456222dad7c4280808080107d223420211b22207d2028203856223cad7d2225202e202f56223ead7c42ffffffff0f7c221e42ffffffff0f54201e42ffffffff0f511b201f201f201742017d222f201754ad7c202f202b201220295620122029511bad7c2229202f54ad7c42feffffff0f7c201d1b20232023201c42017d2212201c54ad7c2012202d201820345620182034511bad7c2218201254ad7c42feffffff0f7c20211b22347d20172029201d1b2212201c201820211b222f54ad7d2012202f7d2212203c2020202c562020202c511bad221854ad7d2229201220187d2212203e201e202554201e2025511bad7c2217201254ad7c42ffffffff0f7d221f428180808070542017201f4281808080708584501b221d1b2218842026202720151b221c20172012201d1b22238484201b202220151b2212201e2025201d1b221784202a203720151b221b201f2029201d1b222584848450450440201141b00d6a20142012201c201b100c201141a00d6a201c201b20142012100c201141f00c6a2012420020144200100c201141e00c6a2014420020124200100c201141800d6a2014420020144200100c201141900d6a2012420020124200100c201141f00b6a2018201720232025100c201141e00b6a2023202520182017100c201141b00b6a2017420020184200100c201141a00b6a2018420020174200100c201141c00b6a2018420020184200100c201141d00b6a2017420020174200100c201141800c6a2014201220112903900d221e201141f80c6a29030020112903f00c2219201141880d6a2903007c2216201954ad7c2222201141e80c6a29030020112903e00c220a20167c2219200a54ad7c7c221f7c220920112903a00d220c20112903b00d7c220b7c2216201642017d220620112903800d220a42017c2208200a54221520192015ad7c4280808080107d220520195420052019511bad7c2207200a427f52201942ffffffff0f54201942ffffffff0f511b2009201656ad2009201e54ad201141980d6a290300201f202254ad7c7c200b200c54ad201141a80d6a290300201141b80d6a2903007c7c7c7c220942818080807054201620094281808080708584501b22151b221e20092006200756ad20092006201654ad7c7c42feffffff0f7c20151b2209100c201141900c6a201c201b200a200820151b22162019200520151b2219100c201141d00c6a2016420020144200100c201141b00c6a2019420020144200100c201141c00c6a2016420020124200100c201141a00c6a2019420020124200100c201141900b6a2024201a201e2009100c201141800b6a203b203220162019100c201141d00a6a2016420020244200100c201141c00a6a2019420020244200100c201141f00a6a20164200201a4200100c201141e00a6a20194200201a4200100c201141e0096a2018201720112903e00a2209201141c80a6a29030020112903c00a2219201141d80a6a2903007c2216201954ad7c2205201141f80a6a29030020112903f00a220a20167c2219200a54ad7c7c221e7c220a20112903800b221a20112903900b7c22227c2216201642017d220820112903d00a220642017c2235200654221520192015ad7c4280808080107d220720195420072019511bad7c22362006427f52201942ffffffff0f54201942ffffffff0f511b200a201656ad2009200a56ad201141e80a6a2903002005201e56ad7c7c201a202256ad201141880b6a290300201141980b6a2903007c7c7c7c220542818080807054201620054281808080708584501b22151b223b20112903d00b221a201141b80b6a29030020112903b00b220a201141c80b6a2903007c2209200a54ad7c221f201141a80b6a29030020112903a00b221e20097c220a201e54ad7c7c22247c220920112903e00b220c20112903f00b7c22267c221e201e42017d222720112903c00b222242017c2229202254221d200a201dad7c4280808080107d220b200a54200a200b511bad7c22372022427f52200a42ffffffff0f54200a42ffffffff0f511b2009201e56ad2009201a54ad201141d80b6a290300201f202456ad7c7c200c202656ad201141e80b6a290300201141f80b6a2903007c7c7c7c222442818080807054201e20244281808080708584501b221d1b223820112903a00c222e201141b80c6a29030020112903b00c2209201141d80c6a2903007c221a200954ad7c222c201141c80c6a29030020112903c00c221f201a7c2209201f54ad7c7c22327c220c20112903900c223320112903800c7c22397c221a201a42017d222620112903d00c221f42017c223d201f54222120092021ad7c4280808080107d222a2009542009202a511bad7c223a201f427f52200942ffffffff0f54200942ffffffff0f511b200c201a56ad200c202e54ad201141a80c6a290300202c203256ad7c7c2033203956ad201141980c6a290300201141880c6a2903007c7c7c7c220c42818080807054201a200c4281808080708584501b22211b222e7d223220222029201d1b2229201f203d20211b222254222b200a200b201d1b221f2009202a20211b220a54200a201f511bad22337d2209202920227d222a42017d2229202a54222d201f200a7d202bad7d220b202dad7c42ffffffff0f7c221f200b54200b201f511bad7c222c20092029427f52201f42ffffffff0f54201f42ffffffff0f511b20242027203756ad2024201e202756ad7c7c42feffffff0f7c201d1b200c2026203a56ad200c201a202656ad7c7c42feffffff0f7c20211b22377d202e203856ad7d2032203354ad7d22382009202c56ad7c42ffffffff0f7d220c42818080807054202c200c4281808080708584501b221d1b223220164201862019423f88842224202442017d22272006420186221a42027c2233201a54222120194201862006423f888422092021ad7c4280808080207d222620095420092026511bad7c223920151b221e201e42017d222c201a203320151b221a4201842233201a5422212009202620151b22092021ad7c4280808080107d222620095420092026511bad7c223d201a427f52200942ffffffff0f54200942ffffffff0f511b20054201862016423f8884223a2027203956ad203a2024202756ad7c7c42fdffffff1f7c20151b222442818080807054201e20244281808080708584501b22211b22397d223a2029202a201d1b2227201a203320211b222a54222b201f200b201d1b221a2009202620211b2209542009201a511bad22297d221f2027202a7d220b42017d2227200b54222d201a20097d202bad7d221a202dad7c42ffffffff0f7c2209201a542009201a511bad7c2226201f2027427f52200942ffffffff0f54200942ffffffff0f511b200c2038201d1b2024202c203d56ad2024201e202c56ad7c7c42feffffff0f7c20211b7d2032203954ad7d2029203a56ad7d222a201f202656ad7c42ffffffff0f7d222442818080807054202620244281808080708584501b221d1b221e7d22262006203520151b22292027200b201d1b22065422212019200720151b221f2009201a201d1b2219542019201f511bad22277d220c202920067d220b42017d2207200b54222b201f20197d2021ad7d221a202bad7c42ffffffff0f7c2209201a542009201a511bad7c221f200c2007427f52200942ffffffff0f54200942ffffffff0f511b20052008203656ad20052008201654ad7c7c42feffffff0f7c20151b2024202a201d1b22057d201e203b56ad7d2026202754ad7d2224200c201f56ad7c42ffffffff0f7d221642818080807054201f20164281808080708584501b22151b2016202420151b100c201141f0096a202320252007200b20151b22162009201a20151b2209100c201141b00a6a2016420020184200100c201141900a6a2009420020184200100c201141a00a6a2016420020174200100c201141800a6a2009420020174200100c201141d0096a20282020202e2037100c201141c0096a202f20342022200a100c20114190096a2022420020284200100c201141a0096a200a420020284200100c20114180096a2022420020204200100c201141b0096a200a420020204200100c201141f0086a200d200e20302031100c201141e0086a200f201020012013100c201141b0086a20014200200d4200100c201141c0086a20134200200d4200100c201141a0086a20014200200e4200100c201141d0086a20134200200e4200100c201141d0076a20112903b0082201200142017c220a2001427f5220112903a008220d20112903c0082213201141b8086a2903007c22167c220e42ffffffff0f54200e42ffffffff0f511b201141d8086a290300201141c8086a2903002013201656ad7c2213201141a8086a290300200d200e56ad7c7c220d201354ad7c20112903d0082216200d7c2213201654ad7c20112903e008220d20112903f0087c2216200d54ad201141e8086a290300201141f8086a2903007c7c7c201320167c220d201354ad7c221342818080807054200d20134281808080708584501b22151b2216200e200e2001200a56221dad7c4280808080107d220120151b220a201c201b100c201141c0076a200d200d42017d2209201d2001200e542001200e511bad7c220e20151b20132009200e56ad20132009200d54ad7c7c42feffffff0f7c20151b20142012100c20114190086a2014420020164200100c20114180086a2012420020164200100c201141f0076a20144200200a4200100c201141e0076a20124200200a4200100c201141880a6a290300201141980a6a29030020112903900a220e201141b80a6a2903007c220d200e54ad7c2201201141a80a6a29030020112903a00a2213200d7c220e201354ad7c7c220d200154ad7c20112903800a2201200d7c220d200154ad7c20112903f009220120112903e0097c2213200154ad201141f8096a290300201141e8096a2903007c7c7c200d20137c2201200d54ad7c220d200d200142017d2213200154ad7c201320112903b00a221442017c22172014542215200e2015ad7c4280808080107d220a200e54200a200e511bad7c2210201354ad7c42feffffff0f7c2014427f52200e42ffffffff0f54200e42ffffffff0f511b200d428180808070542001200d4281808080708584501b22151b201141b8096a290300201141a8096a29030020112903a009220d20114198096a2903007c2213200d54ad7c221220114188096a290300201129038009221620137c220d201654ad7c7c2213201254ad7c20112903b009221620137c2212201654ad7c20112903c009221320112903d0097c2216201354ad201141c8096a290300201141d8096a2903007c7c7c201220167c2213201254ad7c22122012201342017d2209201354ad7c2009201129039009221642017c220f201654221d200d201dad7c4280808080107d2218200d54200d2018511bad7c221b200954ad7c42feffffff0f7c2016427f52200d42ffffffff0f54200d42ffffffff0f511b201242818080807054201320124281808080708584501b221d1b7d2001201020151b22012013201b201d1b221354ad7d200120137d22012014201720151b22132016200f201d1b2214542221200e200a20151b220e200d2018201d1b220d54200d200e511bad221254ad7d2216200120127d2201201320147d221342017d220a2013542215200e200d7d2021ad7d220d2015ad7c42ffffffff0f7c220e200d54200d200e511bad7c2212200154ad7c42ffffffff0f7d22142016200a427f52200e42ffffffff0f54200e42ffffffff0f511b201442818080807054201220144281808080708584501b22151b21142012200120151b2112200e200d20151b2116200a201320151b210a201141e8076a29030020114188086a290300201129038008220e20114198086a2903007c220d200e54ad7c2201201141f8076a29030020112903f0072213200d7c220e201354ad7c7c220d200154ad7c20112903e0072213200d7c2201201354ad7c20112903c007220d20112903d0077c2213200d54ad201141c8076a290300201141d8076a2903007c7c7c200120137c220d200154ad7c21012011290390080c010b201141b0076a2009200a200b200c100c201141a0076a200b200c2009200a100c201141f0066a200a420020094200100c201141e0066a20094200200a4200100c20114180076a2009420020094200100c20114190076a200a4200200a4200100c201141f0056a2005200620072008100c201141e0056a2007200820052006100c201141b0056a2006420020054200100c201141a0056a2005420020064200100c201141c0056a2005420020054200100c201141d0056a2006420020064200100c201141c0046a20112903d005221b201141b8056a29030020112903b0052201201141c8056a2903007c2213200154ad7c221c201141a8056a29030020112903a005221420137c2201201454ad7c7c221e7c221220112903e005221a20112903f0057c22207c2213201342017d221820112903c005221442017c2222201454221520012015ad7c4280808080107d221720015420012017511bad7c221f2014427f52200142ffffffff0f54200142ffffffff0f511b2012201356ad2012201b54ad201141d8056a290300201c201e56ad7c7c201a202056ad201141e8056a290300201141f8056a2903007c7c7c7c221242818080807054201320124281808080708584501b22151b20122018201f56ad20122013201856ad7c7c42feffffff0f7c20151b42034200100c20114190056a2014202220151b2213420042034200100c201141f0046a2001201720151b2201420042034200100c201141d0046a2013200142004200100c20114180056a2013420042004200100c201141e0046a2001420042004200100c201141d0036a2019201620352036100c201141c0036a2035203620192016100c20114190036a2016420020194200100c20114180036a2019420020164200100c201141a0036a2019420020194200100c201141b0036a2016420020164200100c201141a0016a20112903b003221820114198036a2903002011290390032201201141a8036a2903007c2213200154ad7c221720114188036a290300201129038003221420137c2201201454ad7c7c221b7c221220112903c003221c20112903d0037c221e7c2213201342017d221920112903a003221442017c221a201454221520012015ad7c4280808080107d221620015420012016511bad7c22202014427f52200142ffffffff0f54200142ffffffff0f511b2012201356ad2012201854ad201141b8036a2903002017201b56ad7c7c201c201e56ad201141c8036a290300201141d8036a2903007c7c7c7c221242818080807054201320124281808080708584501b22151b20122019202056ad20122013201956ad7c7c42feffffff0f7c20151b427c42ffffffff0f100c201141b0016a2014201a20151b22132001201620151b22014200428180808070100c201141f0026a20134200427c4200100c201141d0026a20014200427c4200100c201141e0026a2013420042ffffffff0f4200100c201141c0016a2001420042ffffffff0f4200100c201141b0046a200520062011290390072218201141f8066a29030020112903f006220120114188076a2903007c2213200154ad7c2217201141e8066a29030020112903e006220120137c2213200154ad7c7c221b7c221220112903a007221c20112903b0077c221e7c2201200142017d2219201129038007221442017c221a201454221520132015ad7c4280808080107d221620135420132016511bad7c22202014427f52201342ffffffff0f54201342ffffffff0f511b2001201254ad2012201854ad20114198076a2903002017201b56ad7c7c201c201e56ad201141a8076a290300201141b8076a2903007c7c7c7c221242818080807054200120124281808080708584501b22151b221c20122019202056ad20122001201956ad7c7c42feffffff0f7c20151b221e100c201141a0046a200720082014201a20151b22012013201620151b2213100c201141e0036a2001420020054200100c20114180046a2013420020054200100c201141f0036a2001420020064200100c20114190046a2013420020064200100c20114180016a20112903f0022219201942017c221a2019427f5220112903e002221220112903d0022216201141f8026a2903007c22067c221442ffffffff0f54201442ffffffff0f511b201141c8016a290300201141d8026a2903002006201654ad7c2216201141e8026a2903002012201456ad7c7c2212201654ad7c20112903c001221620127c2212201654ad7c20112903b001221620112903a0017c2206201654ad201141b8016a290300201141a8016a2903007c7c7c200620127c2216201254ad7c221842818080807054201620184281808080708584501b22151b22222011290390052217201742017c221f2017427f52201129038005220620112903f004220520114198056a2903007c221b7c221242ffffffff0f54201242ffffffff0f511b201141e8046a290300201141f8046a2903002005201b56ad7c220520114188056a2903002006201256ad7c7c2206200554ad7c20112903e004221b20067c2205201b54ad7c20112903d004220620112903c0047c221b200654ad201141d8046a290300201141c8046a2903007c7c7c2005201b7c2206200554ad7c221b428180808070542006201b4281808080708584501b221d1b7c2205200542017c22232005427f522005202254222dad201420142019201a562221ad7c4280808080107d221a20151b2220201220122017201f56222bad7c4280808080107d2217201d1b7c7c221942ffffffff0f54201942ffffffff0f511b20182018201642017d2222201654ad7c202220212014201a562014201a511bad7c221a202254ad7c42feffffff0f7c20151b201b201b200642017d2214200654ad7c2014202b201220175620122017511bad7c2212201454ad7c42feffffff0f7c201d1b7c2016201a20151b221620062012201d1b7c2214201654ad7c2014202d201920205420192020511bad7c2216201454ad7c220642818080807054201620064281808080708584501b22151b2214201920192005202356221dad7c4280808080107d220520151b22122016201642017d2218201d200520195420052019511bad7c221920151b222020062018201956ad20062016201856ad7c7c42feffffff0f7c20151b2222100c20114190016a2020202220142012100c201141b0026a2012420020144200100c201141a0026a2014420020124200100c201141c0026a2014420020144200100c201141d0016a2012420020124200100c20114180066a20012013201c201e100c20114190066a201c201e20012013100c201141c0066a2013420020014200100c201141b0066a2001420020134200100c201141d0066a2001420020014200100c201141a0066a2013420020134200100c201141e0006a20142012201129039004221c20114188046a2903002011290380042201201141e8036a2903007c2213200154ad7c221e201141f8036a29030020112903f003221920137c2201201954ad7c7c221a7c221620112903a004221f20112903b0047c22237c22194202862001423e88842218201842017d221720112903e0032206420286220542047c2225200554221520014202862006423e888422132015ad7c4280808080407c221b2013542013201b511bad7c22242006427f52200142ffffffff0f54200142ffffffff0f511b2016201956ad2016201c54ad20114198046a290300201a201e54ad7c7c201f202356ad201141a8046a290300201141b8046a2903007c7c7c7c220142818080807054201920014281808080708584501b22151b2206200642017d221f2005202520151b2205420184221a200554221d2013201b20151b2213201dad7c4280808080107d221620135420132016511bad7c22302005427f52201342ffffffff0f54201342ffffffff0f511b20014202862019423e888422012017202456ad20012017201854ad7c7c42fbffffff3f7c20151b221842818080807054200620184281808080708584501b22151b221720112903d001221e201141b8026a29030020112903b0022201201141c8026a2903007c2219200154ad7c2224201141a8026a29030020112903a002221b20197c2201201b54ad7c7c22287c221c20112903900122312011290380017c22087c2219201942017d222320112903c002221b42017c2207201b54221d2001201dad7c4280808080107d222520015420012025511bad7c2227201b427f52200142ffffffff0f54200142ffffffff0f511b2019201c54ad201c201e54ad201141d8016a2903002024202856ad7c7c2008203154ad20114198016a29030020114188016a2903007c7c7c7c221c428180808070542019201c4281808080708584501b221d1b223120174201862013201620151b2216423f8884221e201e42017d22242005201a20151b2205420186221a4201842208201a54222120164201862005423f888422132021ad7c4280808080107d222820135420132028511bad7c2226201a427f52201342ffffffff0f54201342ffffffff0f511b2018201f203056ad20182006201f56ad7c7c42feffffff0f7c20151b22304201862017423f8884220642818080807054201e20064281808080708584501b22151b222a7d222e201b2007201d1b221b201a200820151b221a54222120012025201d1b22012013202820151b22135420012013511bad22257d2218201b201a7d221b42017d221a201b54222b200120137d2021ad7d2213202bad7c42ffffffff0f7c220120135420012013511bad7c221f2018201a427f52200142ffffffff0f54200142ffffffff0f511b201c2023202756ad201c2019202356ad7c7c42feffffff0f7c201d1b20062024202656ad2006201e202456ad7c7c42feffffff0f7c20151b7d202a203156ad7d2025202e56ad7d22232018201f56ad7c42ffffffff0f7d221c42818080807054201f201c4281808080708584501b22151b221e7d221f2005201a201b20151b220654221d20162001201320151b22195420162019511bad22257d2218200520067d221b42017d221a201b542221201620197d201dad7d22132021ad7c42ffffffff0f7c220120135420012013511bad7c22162018201a427f52200142ffffffff0f54200142ffffffff0f511b2030201c202320151b22057d2017201e54ad7d201f202554ad7d221c2016201854ad7c42ffffffff0f7d221742818080807054201620174281808080708584501b22151b2017201c20151b100c201141f0006a20202022201a201b20151b22162001201320151b2201100c20114190026a2016420020144200100c201141f0016a2001420020144200100c20114180026a2016420020124200100c201141e0016a2001420020124200100c201141d0006a2009200a200f2010100c201141406b200b200c200d200e100c201141106a200d420020094200100c201141306a200e420020094200100c2011200d4200200a4200100c201141206a200e4200200a4200100c201141e8016a290300201141f8016a29030020112903f001220e20114198026a2903007c220d200e54ad7c220120114188026a2903002011290380022213200d7c220e201354ad7c7c220d200154ad7c20112903e0012201200d7c220d200154ad7c2011290370220120112903607c2213200154ad201141f8006a290300201141e8006a2903007c7c7c200d20137c2201200d54ad7c220d200d200142017d2214200154ad7c2014201129039002221342017c221b2013542215200e2015ad7c4280808080107d2209200e542009200e511bad7c221c201454ad7c42feffffff0f7c2013427f52200e42ffffffff0f54200e42ffffffff0f511b200d428180808070542001200d4281808080708584501b22151b201141a8066a290300201141c8066a29030020112903c006220d201141d8066a2903007c2214200d54ad7c2212201141b8066a29030020112903b006221620147c220d201654ad7c7c2214201254ad7c20112903a006221620147c2212201654ad7c20112903900622142011290380067c2216201454ad20114198066a29030020114188066a2903007c7c7c201220167c2214201254ad7c22164203862014423d8884221220122014420386200d423d8884220a42017d2218200a54ad7c201820112903d0062217420386221042087c221a201054221d200d4203862017423d88842212201dad7c428080808080017d220f201254200f2012511bad7c2220201854ad7c42f7ffffffff007c2017427f52200d42ffffffff0f54200d42ffffffff0f511b201642818080807054201420164281808080708584501b221d1b22142014200a2020201d1b221642017d2218201654ad7c20182010201a201d1b220a4201842217200a5422212012200f201d1b220d2021ad7c4280808080107d2212200d54200d2012511bad7c2210201854ad7c42feffffff0f7c200a427f52200d42ffffffff0f54200d42ffffffff0f511b201442818080807054201620144281808080708584501b221d1b7d2001201c20151b220120162010201d1b221454ad7d200120147d22012013201b20151b2213200a2017201d1b2214542221200e200920151b220e200d2012201d1b220d54200d200e511bad221254ad7d2216200120127d2201201320147d221342017d220a2013542215200e200d7d2021ad7d220d2015ad7c42ffffffff0f7c220e200d54200d200e511bad7c2212200154ad7c42ffffffff0f7d22142016200a427f52200e42ffffffff0f54200e42ffffffff0f511b201442818080807054201220144281808080708584501b22151b21142012200120151b2112200e200d20151b2116200a201320151b210a201141286a290300201141386a2903002011290330220e201141186a2903007c220d200e54ad7c2201201141086a29030020112903002213200d7c220e201354ad7c7c220d200154ad7c20112903202213200d7c2201201354ad7c2011290340220d20112903507c2213200d54ad201141c8006a290300201141d8006a2903007c7c7c200120137c220d200154ad7c2201420186200d423f888422132013200d420186200e423f8884220942017d2218200954ad7c201820112903102217420186221042027c221b2010542215200e4201862017423f888422132015ad7c4280808080207d220f201354200f2013511bad7c221c201854ad7c42fdffffff1f7c2017427f52200e42ffffffff0f54200e42ffffffff0f511b200142818080807054200d20014281808080708584501b22151b21012009201c20151b210d2013200f20151b210e2010201b20151b0b21132000200a37032020002006370300200041286a201637030020002019370308200041306a20123703002000201e370310200041386a2014370300200041186a2005370300200041c8006a200e200e201342017c2212201354221dad7c4280808080107d22142013427f52200e42ffffffff0f54200e42ffffffff0f511b200142818080807054200d20014281808080708584501b22151b37030020002013201220151b370340200041d0006a200d200d42017d2213201d200e201456200e2014511bad7c220e20151b370300200041d8006a2001200e201354ad2001200d201356ad7c7c42feffffff0f7c20151b370300201141a0146a24000b7501017f230041406a2200240041800110141a41c00041e00010160240100f4104490d004100200041206a100e200041206a41e0012000101e200041106a290300200029030042c1d8a7ef0a8584200041086a290300200041186a29030084844200520d00101f0b410041001011200041406b24000b0400101c0b5202017f017f230041206b22002400101b41800110141a41c00041e0001016101004404100410010110b41c000200010172000280200220141c88004410010126b41041013200141041018200041206a24000b0b510400418080040b2d6f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c65640041b480040b01010041ba80040b0502000000030041c680040b010100ba0b046e616d6501920b2b000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f7079071167657452657475726e4461746153697a65080e72657475726e44617461436f7079090a63616c6c5374617469630a0a6765744761734c6566740b115f5f7761736d5f63616c6c5f63746f72730c085f5f6d756c7469330d18753235365f746f5f6269675f656e6469616e5f62797465730e19777261707065725f63616c6c646174616c6f61645f753235360f15777261707065725f63616c6c646174615f73697a65101a777261707065725f63616c6c76616c75655f6e6f745f7a65726f110e777261707065725f726576657274121365766d5f6765745f6d656d6f72795f616464721310777261707065725f636f6465636f70791414777261707065725f6d656d6f72795f67756172641513777261707065725f6d73746f72655f753235361612777261707065725f6d73746f72655f7533321712777261707065725f6d6c6f61645f75323536180e777261707065725f72657475726e1912777261707065725f73746174696363616c6c1a0b777261707065725f6761731b137365745f69735f6465706c6f79696e675f74781c0f5f5f696e69745f65766d5f686561701d10777261707065725f753235365f73686c1e10777261707065725f753235365f7368721f667465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e65787465726e616c5f66756e5f746573745f65636473615f7665726966795f703235365f343620577465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f766572696679536f6c69646974795f3139393721627465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f5f707265436f6d707574654a61636f6269616e506f696e74735f3236343422517465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f7472794d6f644578705f39303023557465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f5f6a4d756c745368616d69725f3234333724537465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e2593017465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7a65726f5f636f6d706c65785f6d656d6f72795f61727261795f745f6172726179245f745f737472756374245f4a506f696e745f24313730345f6d656d6f72795f7074725f2431365f6d656d6f72795f70747226567465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f5f6a446f75626c65506f696e745f32373130274e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e7465737445636473615231436f6e74726163745f34375f6465706c6f7965642e66756e5f5f6a4164645f32323730280463616c6c29065f73746172742a066465706c6f79071201000f5f5f737461636b5f706f696e746572090a0100072e726f646174610085010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790105636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420313736323439626436373332613830343464343537303932656439333237363837323461366630362900ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000a3040b2e64656275675f6c696e65130200000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e63000200000000050206000000032704030100050209000000030805030a010005020d000000037f052c010005021000000005180601000502150000000372050c060100050216000000037e050b010005021d000000037b0100050222000000030805260100050225000000050c06010005022600000003750523060100050231000000051006010005023a000000051e0100050241000000030105160601000502440000000302051f0100050247000000050506010005024c0000000302051006010005024d0000000313052201000502500000000370051f0100050253000000037e050f010005025c0000000302050506010005026100000003020511060100050262000000030e050c01000502630000000301050301000502680000000369050b01000502710000000307051f0100050276000000050b010005027700000003100503010005027b00000000010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e67657310000000480000000000000001000000000000000100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f93084d0000006b0000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003e000000420000000400ed02029f4a000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a000000000000000800000006000000750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000b060000007500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc1155_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc1155_wasm.hex new file mode 100644 index 000000000..33c839568 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc1155_wasm.hex @@ -0,0 +1 @@ +0000e9dc0061736d0100000001c001146000017f60037f7f7f0060017f0060027f7f0060077f7f7f7f7f7f7f0060057e7f7f7f7f017f6000017e60017f017f60000060057f7f7f7f7f0060067f7f7f7f7f7f0060037f7f7f017f60077e7f7f7f7f7f7f017f60027f7f017f60057f7e7e7e7e0060087e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060107e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060147e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060187e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0002d3021103656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e761873746f7261676553746f72654c6974746c65456e6469616e000303656e761773746f726167654c6f61644c6974746c65456e6469616e000303656e76096b656363616b323536000103656e760c656d69744c6f674576656e74000403656e761167657452657475726e4461746153697a65000003656e760e72657475726e44617461436f7079000103656e760c63616c6c436f6e7472616374000503656e760a6765744761734c656674000603656e761367657445787465726e616c436f646553697a6500070352510803030307030000020003070107030303030303030103090a0b010c06000108070100080d07010101010e0f08080f08080e101008081108121008100808080808080808101012121313100208080808080405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300110463616c6c005e066465706c6f7900610ac99a035102000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190b4300200120003a001f20014100360218200142003703102001420037030820014200370300200120004108763a001e200120004110763a001d200120004118763a001c0b2800200028001c220041187420004180fe03714108747220004108764180fe0371200041187672720bb40a01057f024041002802d080042202417f4a0d004100100022023602d080040b0240024002400240200041206a20024d0d002002210302402002417f4a0d004100100022033602d080040b200220006b21040240200341e500480d0020012000200410010c020b024041002d00d490040d0041f08f04410020031001410041013a00d490040b2004450d02200041f08f046a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d004100100022023602d080040b0240200241e500480d0020012000412010010f0b024041002d00d490040d0041f08f04410020021001410041013a00d490040b2001200041f08f046a2d00003a00002001200041f18f046a2d00003a00012001200041f28f046a2d00003a00022001200041f38f046a2d00003a00032001200041f48f046a2d00003a00042001200041f58f046a2d00003a00052001200041f68f046a2d00003a00062001200041f78f046a2d00003a00072001200041f88f046a2d00003a00082001200041f98f046a2d00003a00092001200041fa8f046a2d00003a000a2001200041fb8f046a2d00003a000b2001200041fc8f046a2d00003a000c2001200041fd8f046a2d00003a000d2001200041fe8f046a2d00003a000e2001200041ff8f046a2d00003a000f20012000418090046a2d00003a001020012000418190046a2d00003a001120012000418290046a2d00003a001220012000418390046a2d00003a001320012000418490046a2d00003a001420012000418590046a2d00003a001520012000418690046a2d00003a001620012000418790046a2d00003a001720012000418890046a2d00003a001820012000418990046a2d00003a001920012000418a90046a2d00003a001a20012000418b90046a2d00003a001b20012000418c90046a2d00003a001c20012000418d90046a2d00003a001d20012000418e90046a2d00003a001e20012000418f90046a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b8308010d7f230041106b2200240041002101024041002802d080042202417f4a0d004100100022023602d080040b02402002450d000240200241034b0d00410021032000410036020c024041002d00d490040d0041f08f04410020021001410041013a00d490040b024002400240200241044f0d0041f08f0421012000410c6a21040c010b2002417c71220341f08f046a21012000410c6a20036a21044100210503402000410c6a20056a200541f08f046a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f4a0d004100100022023602d080040b02400240200241e500480d00200041086a4100410410010c010b024041002d00d490040d0041f08f04410020021001410041013a00d490040b200041002802f08f043602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f024041002802d080042200417f4a0d004100100022003602d080040b20000b17002000410c6a100220004100360208200042003702000b4402017f047e230041206b220024002000100320002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802dc900420006a200110040b0c0041002802dc900420006a0bb60501037f0240024041002802e890042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e49004410020054180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420044f0d00410020043602e490040b41002802dc9004220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100622044f0d0020002001200210070f0b0240200441004a200120046b2204200148470d00024041002802d080042201417f4a0d004100100022013602d080042001417f4a0d004100100022013602d080040b0240200141e500480d0020002004200210010c020b024041002d00d490040d0041f08f04410020011001410041013a00d490040b2002450d01200441f08f046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802e89004220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602e49004410020024180807c713602e89004410041002802e0900420014110746a3602e0900441e0000f0b024041002802e4900420004f0d00410020003602e490040b41e0000b920401037f0240200041206a22022000480d000240024041002802e89004220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602e49004410020044180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420024f0d00410020023602e490040b41002802dc900420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802e89004220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602e49004410020074180807c713602e89004410041002802e0900420014110746a3602e090040c010b41002802e4900420024f0d00410020023602e490040b41002802dc900420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802e89004220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602e49004410020044180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420024f0d00410020023602e490040b41002802dc900420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000bcc0200200141002802dc900420006a22002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b910300200141002802dc900420006a22002d00003a0000200120002d00013a0001200120002d00023a0002200120002d00033a0003200120002d00043a0004200120002d00053a0005200120002d00063a0006200120002d00073a0007200120002d00083a00082001200041096a2d00003a000920012000410a6a2d00003a000a20012000410b6a2d00003a000b20012000410c6a2d00003a000c20012000410d6a2d00003a000d20012000410e6a2d00003a000e20012000410f6a2d00003a000f2001200041106a2d00003a00102001200041116a2d00003a00112001200041126a2d00003a00122001200041136a2d00003a00132001200041146a2d00003a00142001200041156a2d00003a00152001200041166a2d00003a00162001200041176a2d00003a00172001200041186a2d00003a00182001200041196a2d00003a001920012000411a6a2d00003a001a20012000411b6a2d00003a001b20012000411c6a2d00003a001c20012000411d6a2d00003a001d20012000411e6a2d00003a001e20012000411f6a2d00003a001f0b08002000200110080b08002000200110090b120041002802dc900420006a20012002100a0b100041002802dc900420006a200110050b1a0041002802dc900420006a200141032002200320044100100b0b1a0041002802dc900420006a200141042002200320042005100b0bfe0201037f024020004102470d00419980044114100441000f0b02402002450d000240100c220320024e0d00024020000d000240024041002802e890042202200320016a22004f0d00200041ffff036a220441107620024110766b220240001a410020003602e49004410020044180807c713602e89004410041002802e0900420024110746a3602e090040c010b41002802e4900420004f0d00410020003602e490040b41002802dc900420016a41002003100d41010f0b024020030d0041ae8004411f10042000450f0b024020034180084a0d0041e0870441002003100d41e08704200310042000450f0b41808004411810042000450f0b0240024041002802e890042204200220016a22034f0d00200341ffff036a220541107620044110766b220440001a410020033602e49004410020054180807c713602e89004410041002802e0900420044110746a3602e090040c010b41002802e4900420034f0d00410020033602e490040b41002802dc900420016a41002002100d0b2000450b860101037f0240024041002802e890042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e49004410020054180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420044f0d00410020043602e490040b41002802dc900420006a20012002100d0b9c0303017f047e027f230041206b22072400200241086a2903002108200241106a29030021092002290300210a2007200241186a290300220b4228883c00022007200b4238883c0000200720094228883c000a200720094238883c00082007200b4220883c00032007200b4230883c0001200720084228883c0012200720084238883c0010200720094220883c000b200720094230883c000920072008a722024108763a0016200720024118763a00142007200ba7220c3a00072007200c4108763a00062007200c4118763a000420072009a7220d3a000f2007200d4108763a000e2007200d4118763a000c2007200c4110763a00052007200d4110763a000d2007200a4228883c001a2007200a4238883c0018200720023a0017200720024110763a0015200720084220883c0013200720084230883c00112007200a4220883c001b2007200a4230883c00192007200aa722023a001f200720024108763a001e200720024118763a001c200720024110763a001d20002001410c6a200741002802dc900420036a2004100e20052006102a2102200741206a240020020b0400100f0b0400100c0bbf0701037f0240024041002802e890042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e49004410020054180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420044f0d00410020043602e490040b41002802dc90042103024041002802d080042204417f4a0d004100100022043602d080040b200320006a210002400240200420014b0d002002450d0102400240200241077122040d00200221040c010b0340200041003a0000200041016a21002004417f6a22040d000b200241787121040b20024108490d01034020004200370000200041086a2100200441786a22040d000c020b0b02400240200220016a20044d0d002004210302402004417f4a0d004100100022033602d080040b200420016b21050240200341e500480d0020002001200510010c020b024041002d00d490040d0041f08f04410020031001410041013a00d490040b2005450d01200141f08f046a210402400240200541077122030d0020052103200021010c010b200021010340200120042d00003a0000200141016a2101200441016a21042003417f6a22030d000b200541787121030b20054108490d01200341786a21030340200120042d00003a0000200120042d00013a0001200120042d00023a0002200120042d00033a0003200120042d00043a0004200120042d00053a0005200120042d00063a0006200120042d00073a00072003450d02200341786a2103200441086a2104200141086a21010c000b0b02402004417f4a0d004100100022043602d080040b0240200441e500480d0020002001200210010f0b024041002d00d490040d0041f08f04410020041001410041013a00d490040b2002450d01200141f08f046a210402400240200241077122010d00200221010c010b0340200020042d00003a0000200041016a2100200441016a21042001417f6a22010d000b200241787121010b20024108490d01200141786a21010340200020042d00003a0000200020042d00013a0001200020042d00023a0002200020042d00033a0003200020042d00043a0004200020042d00053a0005200020042d00063a0006200020042d00073a00072001450d02200141786a2101200441086a2104200041086a21000c000b0b200220056b2201450d00200020056a210002400240200141077122040d00200121040c010b0340200041003a0000200041016a21002004417f6a22040d000b200141787121040b20014108490d00034020004200370000200041086a2100200441786a22040d000b0b0b0b00410041013a00e08f040b09002000410c6a10100bd00201037f0240024041002802e890042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e49004410020054180807c713602e89004410041002802e0900420034110746a3602e090040c010b41002802e4900420044f0d00410020043602e490040b02402002450d0041002802dc9004220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d00200141786a21010340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a00072001450d01200141786a2101200041086a2100200441086a21040c000b0b0b2501017f024041002802d080042200417f4a0d004100100022003602d080040b2000417c6a0b7e01027f024041002d00d890040d00024002403f0022004102490d00410020004110743602dc9004410140001a3f00411074220041002802dc90046b21010c010b410041f090043602dc900441f0900521004180800121010b410020003602e09004410020013602e89004410041013a00d89004410041003602e490040b0b4101017f41002102024020002903002001290300520d0020002903082001290308520d0020002903102001290310520d00200029031820012903185121020b20020b3301017f41002101024020002903004200520d0020002903084200520d0020002903104200520d0020002903185021010b20010b4200200220012903002000290300833703002002200129030820002903088337030820022001290310200029031083370310200220012903182000290318833703180bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000b7701057f410021034100210402400340200220036a2205411f6a2004200020036a2206411f6a2d00006a200120036a2204411f6a2d00006a22073a00002005411e6a20074108762006411e6a2d00006a2004411e6a2d00006a22043a000020034162460d012003417e6a2103200441087621040c000b0b0b920201027f230041c0006b220524002005220641206a41186a2004370300200620033703302006200237032820062001370320200641206a41012006103902402001a74101712006290300220442ff0083200420014201832201501b2202421f56420020017d2201200641086a2903008322044200522004501b2001200641106a2903008322034200522001200641186a2903008322014200522001501b2003200184501b460d00200541606a22052400200541186a428080808090ee9ea4ce0037030020054200370310200542003703082005420037030041002005102041044122102141004124101b0b200020023703002000200437030820002003370310200041186a2001370300200641c0006a24000b990202047f037e2300220821090240200020045a200120055a20012005511b200220065a200320075a20032007511b2002200685200320078584501b0d000340200841606a220a220b2400200a41186a2003370300200a2002370310200a2001370308200a2000370300200b41606a220b22082400200a200b1013200841606a220a22082400200a41186a4200370300200a4200370310200a4200370308200a4200370300200b200a10242002200042017c220c200054220a2001200aad7c220d200154200c20005a1bad7c220e200254210a200c2100200d2101200e2102200c200454200d200554200d2005511b200e2006542003200aad7c220320075420032007511b200e200685200320078584501b0d000b0b200924000b9a0303037f047e017f23004180016b22002101200024000240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b4104200110162001200141e0006a1012200041606a22002202240041242000101641002000101f412041001021200241606a220022022400410041c000200010262000200141206a10124100200141e0006a10204120200141206a1020410041c000200110262001200141c0006a1012200141c0006a41086a2903002103200141c0006a41106a2903002104200141c0006a41186a290300210520012903402106200241606a220022022400200041186a2005370300200020043703102000200337030820002006370300200241606a220222072400200020021013200741606a22002207240020022000102520002903002103200041086a2903002104200041106a2903002105200041186a2903002106200741606a22002207240041c00020001023200010152102200741606a22002400200041186a200637030020002005370310200020043703082000200337030020022000102020024120102720014180016a24000b9d0703047f047e027f230041e0006b22002101200024000240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a220222002400410420021016200041606a22002203240020022000101220002903002104200041106a2903002105200041086a2903002106200041186a2903002107200141c0006a41086a41e0800441086a290300370300200141c0006a41106a41e0800441106a290300370300200141c0006a41186a41e0800441186a290300370300200141002903e08004370340200141c0006a200141206a1012200141206a41e00120011038024020042001290300427f85832005200141106a290300427f8583842006200141086a290300427f85832007200141186a290300427f85838484500d0041004100101b0b200341606a220022032400200341606a220322082400200341186a4180810441186a290300370000200341106a4180810441106a290300370000200341086a4180810441086a29030037000020034100290380810437000020032000101220002903002104200041086a2903002105200041106a2903002106200041186a2903002107200841606a220022032400200041186a2007370300200020063703102000200537030820002004370300200341606a220322082400200041e0012003103820032903002104200341086a2903002105200341106a2903002106200341186a2903002107200841606a220022032400200041186a2007370300200020063703102000200537030820002004370300200341606a220822032400200020081013200341606a2203220024002002200820031037200041606a220022022400200041186a4280808080e0c49edb59370300200042003703102000420037030820004200370300200241606a22022208240020002002101302400240200320021035450d00200841706a220022022400200041013602000c010b200841606a220022022400200041186a4280808080c083cdc40e370300200042003703102000420037030820004200370300200241606a2202220924002000200210132003200210352108200941706a2200220224002000200836020020080d00200241606a220822022400200841186a4280808080f0b4f2ff01370300200842003703102008420037030820084200370300200241606a22092202240020082009101320002003200910353602000b200241606a2203240041c0002003102320031015220320002802004100471021200341201027200141e0006a24000b800305027f037e017f017e017f230041c0006b2208240041a08104200822091012024002402004421f7c220a426083220b20007c220c2000542005200a200454220dad7c220e20017c200c200b54220fad7c220020015420002001511b2006200d200e200554200a20045a1bad7c220420027c2205200f2000200e542000200e511bad7c220120025420072004200654ad7c20037c2005200454ad7c2001200554ad7c220420035420042003511b2001200285200420038584501b0d00200c2009290300582000200941086a29030022035820002003511b2001200941106a2903002202582004200941186a29030022035820042003511b2001200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a1020410441c100102141004124101b0b200841606a22082400200841186a200437030020082001370310200820003703082008200c37030041c00020081020200941c0006a24000bd20c03057f167e017f230041e0006b22002101200024000240101a450d0041004100101b0b10331a200041606a22022200240041c00020021023200041606a220022032400200041186a4200370300200042003703102000420037030820004204370300200341606a220322042400200020031013200441606a22002204240020032000102520002903002105200041086a2903002106200041106a2903002107200041186a2903002108200441606a220022032400200041186a2008370300200020073703102000200637030820002005370300200341606a220322042400200041012003103902402005a74101712003290300220942ff008320092005420183220a501b220b421f564200200a7d2209200341086a29030083220c420052200c501b2009200341106a29030083220d4200522009200341186a29030083220e420052200e501b200d200e84501b460d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b200441606a220022032400200220001012200041186a290300210f200041106a2903002110200041086a290300211120002903002109200141c0006a41186a200e3703002001200d3703502001200c3703482001200b3703402009a7200141c0006a1020200f2010200942207c2212200954220020112000ad7c2213201154201220095a1bad7c2214201054ad7c211502400240200a4200520d00200341606a220022032400200041186a200837030020002007370310200020063703082000200542807e833703002012a720001020200341606a220022032400200041186a420037030020004200370310200042003703082000200b200d84200c200e8484420052ad370300200341606a2204220324002000410520041038200441186a2903002106200441106a2903002110200441086a290300210a200429030021110c010b4100410410210240200b200d84200c200e848450450d00420021114200210a42002110420021060c010b429af0ff8abc9feb9a8a7f210f42f293dcfec4a69fd739210742c6cbb1d4ca9680c38e7f2108429ba3af9bfecfffa5b67f2109420021054200211642002117420021060340200341606a220022032400200041186a200f370300200020073703102000200837030820002009370300200341606a220322042400200020031013200441606a2200220424002003200010252000290300210a200041086a2903002110200041106a2903002111200041186a2903002118200441606a220022032400200041186a201837030020002011370310200020103703082000200a370300200520127ca7200010202017200542207c2211200554220020162000ad7c220a201654201120055a1bad7c22102017542100200f2007200942017c2218200954220420082004ad7c2219200854201820095a1bad7c221a200754ad7c210f20112105200a2116201021172018210920192108201a21072011200b54200a200c54200a200c511b2010200d5420062000ad7c2206200e542006200e511b2010200d852006200e8584501b0d000b0b200341606a220022032400200220001012200041186a2903002107200041106a2903002108200041086a290300210e2000290300210f200341606a220022032400200220001012200f200e20082007201120127c2205200029030022167d200a20137c20052011542204ad7c2209200041086a29030022117d2005201654221bad7d201020147c220520042009200a542009200a511bad7c220a200041106a29030022167d2217201b200920115420092011511bad22097d200620157c2005201054ad7c200a200554ad7c200041186a2903007d200a201654ad7d2017200954ad7d103f200341606a22002203240041c00020001023200341606a22032204240020002003101220032903002109200441606a220322042400200220031012200328020021032009a7412010212003200141c0006a1023200942207c2205a72202200141c0006a101f200241206a200341206a200141c0006a10151032200141c0006a200141206a1012200129032020057ca741206a41001021200141c0006a2001101220012903002105200441606a220324002000200310122000101520092005421f7c42e0ffffff0f837c20032903007da741c0006a1027200141e0006a24000bde0c03057f167e017f230041e0006b22002101200024000240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a22022200240041c00020021023200041606a220022032400200041186a4200370300200042003703102000420037030820004202370300200341606a220322042400200020031013200441606a22002204240020032000102520002903002105200041086a2903002106200041106a2903002107200041186a2903002108200441606a220022032400200041186a2008370300200020073703102000200637030820002005370300200341606a220322042400200041012003103902402005a74101712003290300220942ff008320092005420183220a501b220b421f564200200a7d2209200341086a29030083220c420052200c501b2009200341106a29030083220d4200522009200341186a29030083220e420052200e501b200d200e84501b460d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b200441606a220022032400200220001012200041186a290300210f200041106a2903002110200041086a290300211120002903002109200141c0006a41186a200e3703002001200d3703502001200c3703482001200b3703402009a7200141c0006a1020200f2010200942207c2212200954220020112000ad7c2213201154201220095a1bad7c2214201054ad7c211502400240200a4200520d00200341606a220022032400200041186a200837030020002007370310200020063703082000200542807e833703002012a720001020200341606a220022032400200041186a420037030020004200370310200042003703082000200b200d84200c200e8484420052ad370300200341606a2204220324002000410520041038200441186a2903002106200441106a2903002110200441086a290300210a200429030021110c010b4100410210210240200b200d84200c200e848450450d00420021114200210a42002110420021060c010b42e0c7a095a1ffe1abc000210f42a8f7eca0cce3d8db7221074291a284d49ce4ccc5827f210842ceb5ed9daaa7f3ba7a2109420021054200211642002117420021060340200341606a220022032400200041186a200f370300200020073703102000200837030820002009370300200341606a220322042400200020031013200441606a2200220424002003200010252000290300210a200041086a2903002110200041106a2903002111200041186a2903002118200441606a220022032400200041186a201837030020002011370310200020103703082000200a370300200520127ca7200010202017200542207c2211200554220020162000ad7c220a201654201120055a1bad7c22102017542100200f2007200942017c2218200954220420082004ad7c2219200854201820095a1bad7c221a200754ad7c210f20112105200a2116201021172018210920192108201a21072011200b54200a200c54200a200c511b2010200d5420062000ad7c2206200e542006200e511b2010200d852006200e8584501b0d000b0b200341606a220022032400200220001012200041186a2903002107200041106a2903002108200041086a290300210e2000290300210f200341606a220022032400200220001012200f200e20082007201120127c2205200029030022167d200a20137c20052011542204ad7c2209200041086a29030022117d2005201654221bad7d201020147c220520042009200a542009200a511bad7c220a200041106a29030022167d2217201b200920115420092011511bad22097d200620157c2005201054ad7c200a200554ad7c200041186a2903007d200a201654ad7d2017200954ad7d103f200341606a22002203240041c00020001023200341606a22032204240020002003101220032903002109200441606a220322042400200220031012200328020021032009a7412010212003200141c0006a1023200942207c2205a72202200141c0006a101f200241206a200341206a200141c0006a10151032200141c0006a200141206a1012200129032020057ca741206a41001021200141c0006a2001101220012903002105200441606a220324002000200310122000101520092005421f7c42e0ffffff0f837c20032903007da741c0006a1027200141e0006a24000bcf0203027f027e017f230041c0006b2205240041c081042005220610120240200629030020015a200641086a290300220720025a20072002511b200641106a290300220820035a200641186a290300220720045a20072004511b2008200385200720048584501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1020410441c100102141004124101b0b200541606a220522092400200541186a2004370300200520033703102005200237030820052001370300200941606a22092400200541052009103820002009290300220442207c22033703002000200941086a290300220220032004542205ad7c22013703082000200941106a290300220720052001200254200320045a1bad7c2204370310200041186a200941186a2903002004200754ad7c370300200641c0006a24000bf1090b027f017e017f017e017f027e017f017e017f017e017f230041c0006b2209210a2009240002402001421f7c220b2005542002200b200154220cad7c220d200654200d2006511b2003200c200d200254200b20015a1bad7c220b2007542004200b200354ad7c220d200853200d2008511b200b200785200d20088584501b0d0041004100101b0b200941606a2209220c24002001a720091016200c41606a220c220e24002009200c1012200a200c290300200c41086a290300200c41106a290300200c41186a2903001042200a41186a290300210b200a41106a290300210d200a41086a290300210f200a2903002110200e41606a2211220c240041c00020111023200c41606a220c220e24002011200c1012200c290300200c41086a290300200c41106a290300200c41186a2903002010200f200d200b103f201110152009101f200e41606a220c220e24002011200c1012200c290300210b200c41086a290300210d200c41186a2903002112200c41106a290300210f200e41606a220e220c2400200e200d200b42207c2210200b542213ad7c2214370308200e2010370300200e200f20132014200d542010200b5a1bad7c220b370310200e41186a2012200b200f54ad7c370300200c41606a220c22132400200e200c1013201341606a220e22132400201341606a221322152400201341186a200941186a290000370000201341106a200941106a290000370000201341086a200941086a290000370000201320092900003700002013200e1012200e290300210b200e41086a290300210d200e41106a290300210f200e41186a2903002110201541606a2209220e2400200941186a20103703002009200f3703102009200d3703082009200b370300200e41606a220e2213240020094105200e10380240200e290300220d200142207c220b7c2214200558200e41086a29030022102002200b2001542209ad7c22057c2014200d542215ad7c220f200658200f2006511b200e41106a2903002206200320092005200254200b20015a1bad7c220d7c22022015200f201054200f2010511bad7c2210200758200e41186a2903002004200d200354ad7c22017c2002200654ad7c2010200254ad7c220620085820062008511b2010200785200620088584501b0d0041004100101b0b0240200b20145a2005200f5a2005200f511b200d20105a200120065a20012006511b200d201085200120068584501b0d00200ba7210e0340201341606a220922132400200e20091016200c10152009101f201341606a220922132400200c2009101220092903002108200941086a2903002102200941186a2903002104200941106a2903002103201341606a2209220c240020092002200842207c22072008542213ad7c2212370308200920073703002009200320132012200254200720085a1bad7c2208370310200941186a20042008200354ad7c370300200c41606a220c221324002009200c1013200d200b42207c2208200b54220920052009ad7c22022005542008200b5a1bad7c2203200d542109200e41206a210e2008210b200221052003210d20082014542002200f542002200f511b200320105420012009ad7c220120065420012006511b2003201085200120068584501b0d000b0b2011200a41206a10122000200a41306a2903003703102000200a41286a2903003703082000200a290320370300200041186a200a41206a41186a290300370300200a41c0006a24000bf3060b027f017e017f017e027f047e017f027e017f017e017f230041e0006b2209210a2009240002402001421f7c220b2005542002200b200154220cad7c220d200654200d2006511b2003200c200d200254200b20015a1bad7c220b2007542004200b200354ad7c220d200853200d2008511b200b200785200d20088584501b0d0041004100101b0b200941606a2209220c24002001a7220e20091016200c41606a220c220f24002009200c1012200c290300210b200c41086a290300210d200c41106a2903002110200c41186a290300211141e08104200a41206a10120240200a290320200b5a200a41206a41086a2903002212200d5a2012200d511b200a41206a41106a290300221320105a200a41206a41186a290300221220115a20122011511b2013201085201220118584501b0d00200a41c0006a41186a428080808090ee9ea4ce00370300200a4200370350200a4200370348200a42003703404100200a41c0006a1020410441c100102141004124101b0b200f41606a220c220f240041c000200c1023200f41606a220f22142400200c200f1012200f290300200f41086a290300200f41106a290300200f41186a290300200b421f7c2212426083221342207c2215200d2012200b54220fad7c221620152013542217ad7c22182010200f2016200d542012200b5a1bad7c220b20172018201654201520135a1bad7c220d2011200b201054ad7c200d200b54ad7c103f200c10152009101f201441606a220f221424002009200f101202402001200f2903007c220b42207c220d2005582002200f41086a2903007c200b2001542217ad7c2201200d200b542219ad7c221020065820102006511b2003200f41106a2903007c22062017200120025420012002511bad7c220220192010200154200d200b5a1bad7c22012007582004200f41186a2903007c2006200354ad7c2002200654ad7c2001200254ad7c220220085820022008511b2001200785200220088584501b0d0041004100101b0b201441606a220f22142400200c200f1012200f28020041206a200e41206a20091015102f201441606a220f220e2400200c2009200f103a200e41606a22092400200f20091012200928020041206a41001021200c200a10122000200a41106a2903003703102000200a41086a2903003703082000200a290300370300200041186a200a41186a290300370300200a41e0006a24000b880a05027f047e027f0d7e017f230041a0016b22002101200024000240101a450d0041004100101b0b0240103341ff004b0d0041004100101b0b410420014180016a101620014180016a200141e0006a1012200141e0006a41186a2903002102200141e0006a41106a2903002103200141e0006a41086a290300210420012903602105200041606a220622002400412420061016200041606a22002207240020062000101220002903002108200041086a2903002109200041106a290300210a200041186a290300210b200741606a2200220724004180820420001012024020082000290300582009200041086a29030022085820092008511b200a200041106a290300220858200b200041186a290300220958200b2009511b200a200885200b20098584501b0d0041004100101b0b200741606a220022072400200620001012200141c0006a2000290300220b42047c2209200041086a290300220a2009200b542206ad7c2208200041106a290300220c20062008200a542009200b5a1bad7c220b200041186a290300200b200c54ad7c1018ad4200420042001043200141c0006a41186a2903002108200141c0006a41106a290300210c200141c0006a41086a290300210d2001290340210e200741606a22062200240041c40020061016200041606a2200220724002006200010122000290300210f200041086a2903002109200041106a290300210a200041186a290300210b200741606a22002207240041808204200010120240200f2000290300582009200041086a290300220f582009200f511b200a200041106a290300220f58200b200041186a290300220958200b2009511b200a200f85200b20098584501b0d0041004100101b0b200741606a220022072400200620001012200141206a2000290300220b42047c2209200041086a290300220a2009200b542206ad7c220f200041106a29030022102006200f200a542009200b5a1bad7c220b200041186a290300200b201054ad7c1018ad4200420042001043200141206a41186a290300210f200141206a41106a2903002110200141206a41086a290300211120012903202112200741606a22062200240041e40020061016200041606a22002207240020062000101220002903002113200041086a2903002109200041106a290300210a200041186a290300210b200741606a2200220724004180820420001012024020132000290300582009200041086a29030022135820092013511b200a200041106a290300221358200b200041186a290300220958200b2009511b200a201385200b20098584501b0d0041004100101b0b200741606a22002207240020062000101220012000290300220b42047c2209200041086a290300220a2009200b542206ad7c2213200041106a290300221420062013200a542009200b5a1bad7c220b200041186a290300200b201454ad7c1018ad4200420042001044200141186a290300210b200141106a2903002109200141086a290300210a200129030021131046024020052003842004200284844200520d00200741606a22062200240041c00020061023200610152107200041606a220022152400200041186a4280808080e0f991fad700370300200042003703102000420037030820004200370300200720001020201541606a22002400200620001012200028020041046a4100102120074124101b0b2005200420032002200e200d200c2008201220112010200f2013200a2009200b1047410041001027200141a0016a24000bc10203027f037e037f230041c0016b220024002000220141a0016a41186a4200370300200142003703b001200142003703a801200142033703a001200141a0016a20014180016a101320014180016a200141e0006a1025200141e8006a2903002102200141f0006a350200210320012903602104200141c0006a1019200141206a41186a4200370300200120033703302001200237032820012004370320200141206a2001101302402001200141c0006a10350d00200041606a22052200240041c00020051023200510152106200041606a220022072400200041186a4280808080f0d4b6c611370300200042003703102000420037030820004200370300200620001020200741606a22002207240020052000101220002802002105200741606a2200240020001019200541046a2000101f20064124101b0b200141c0016a24000bc91303077f0c7e027f230041a0026b221024002004a72211201022124180016a10232008a72213201241e0006a1023024020124180016a201241e0006a10350d00201041606a22142210240041c00020141023201410152115201041606a221022162400201041186a428080808090b2e682db00370300201042003703102010420037030820104200370300201520101020201641606a2210221624002014201010122010290300211720124180016a20124180026a1012201241e0006a201241e0016a10122017a7221041046a20124180026a1020201041246a201241e0016a1020201641606a2216221024002014201610122015201720162903007da741c4006a101b0b201041606a221422102400201120141023201041606a22102215240020142010101202402010290300201041106a29030084201041086a290300201041186a2903008484500d004200211742002118420021194200211a0340201541606a221022142400201041186a201a370300201020193703102010201837030820102017370300201441606a22142215240020104105201410382014290300211b201541606a221022142400201b20047ca741206a20101023201441606a221522142400201b20087ca741206a2015102302402000200284200120038484500d00201020124180026a1012410020124180026a1020412041001021410041c000201241a0016a1026201241a0016a201241c0016a101220124180026a41186a2003370300201220023703900220122001370388022012200037038002410020124180026a10204120201241c0016a1020410041c000201241a0016a1026201241a0016a201241e0016a1012201241e0016a41086a290300211b201241e0016a41106a290300211c201241e0016a41186a290300211d20122903e001211e201441606a221022142400201041186a201d3703002010201c3703102010201b3703082010201e370300201441606a221422162400201020141013201641606a221022162400201420101025201041186a290300211f201041106a2903002120201041086a290300212120102903002122201641606a221022142400201520101012201241c0006a202220212020201f2010290300201041086a290300201041106a290300201041186a2903001056201241c0006a41086a290300211f201241c0006a41106a2903002120201241c0006a41186a290300212120122903402122201441606a221022142400201041186a201d3703002010201c3703102010201b3703082010201e370300201441606a221522142400201020151013201441606a221022142400201041186a2021370300201020203703102010201f370308201020223703002015201010240b201441606a221422102400201120141023201041606a2210221524002014201010122019201742017c221b201754221420182014ad7c221c201854201b20175a1bad7c221d2019542114201b2117201c2118201d2119201b201029030054201c201041086a290300221b54201c201b511b201d201041106a290300221c54201a2014ad7c221a201041186a290300221b54201a201b511b201d201c85201a201b8584501b0d000b0b201541606a221422102400201120141023201041606a221022152400201041186a4200370300201042003703102010420037030820104201370300201541606a221522162400201020151013024002402014201510350d00201641606a22142210240041c00020141023201041606a221022152400201420101012201041186a2903002119201041106a2903002118201041086a29030021172010290300221aa7221041c0001021201241206a2004200520062007201a42c0007c221b2017201b201a542216ad7c221c20182016201c201754201b201a5a1bad7c221b2019201b201854ad7c104a20124180026a41186a201241206a41186a290300221c20197d201241206a41106a2903002219201854ad7d201920187d221d2012290320221b201a542216201241206a41086a290300221820175420182017511bad221e54ad7d3703002012201b201a7d370380022012201820177d2016ad7d370388022012201d201e7d37039002201041206a20124180026a1020201220082009200a200b201b20182019201c104a20122903002117201541606a2210221524002014201010122010290300211a201541606a22152210240020151019201410152123201041606a221022142400201041186a4200370300201042003703102010420037030820104200370300201441606a221422162400201020141013201641606a221022162400201041186a2003370300201020023703102010200137030820102000370300201641606a22162224240020102016101320232017201a7da741c0840420152014201610290c010b201641606a221422102400201141206a20141023201041606a221522102400201341206a20151023201041606a22102216240041c00020101023201641606a22162224240020102016101220162903002117201420124180026a10122015201241e0016a10122017a7221420124180026a1020201441206a201241e0016a1020202441606a2214221524002010201410122014290300211a201541606a22142215240020141019201010152123201541606a221022152400201041186a4200370300201042003703102010420037030820104200370300201541606a221522162400201020151013201641606a221022162400201041186a2003370300201020023703102010200137030820102000370300201641606a22162224240020102016101320232017201a7da741c0006a41e0840420142015201610290b02402000200284200120038484500d00202441606a221422102400201120141023201041606a221022152400201041186a4200370300201042003703102010420037030820104201370300201541606a22152216240020102015101302402014201510350d00201641606a22142210240020141019201041606a221024002014201010122010290300201041086a290300201041106a290300201041186a2903002000200120022003200420052006200720082009200a200b200c200d200e200f10570c010b201641606a221422102400201141206a20141023201041606a22152210240020151019201041606a221022162400201520101012201041186a2903002117201041106a290300211a201041086a290300211820102903002119201641606a221022152400201420101012201041186a290300211b201041106a290300211c201041086a290300211d2010290300211e201541606a22102400201341206a2010102220192018201a20172000200120022003201e201d201c201b2010290300201041086a290300201041106a290300201041186a290300200c200d200e200f10580b201241a0026a24000bfe1007037f017e017f017e017f177e027f230041e0016b22002101200024000240101a450d0041004100101b0b02401033419f014b0d0041004100101b0b4104200141e0006a1016200141e0006a200141c0016a1012200141c0016a41186a22022903002103200141c0016a41106a22042903002105200141c0016a41086a2206290300210720012903c00121084124200141e0006a1016200141e0006a200141c0016a1012200229030021092004290300210a2006290300210b20012903c001210c200041606a22022200240041c40020021016200041606a2200220424002002200010122000290300210d200041086a290300210e200041106a290300210f200041186a2903002110200441606a22002204240041a08204200010120240200d200029030058200e200041086a290300220d58200e200d511b200f200041106a290300220d582010200041186a290300220e582010200e511b200f200d852010200e8584501b0d0041004100101b0b200441606a220022042400200220001012200141c0006a2000290300221042047c220e200041086a290300220f200e2010542202ad7c220d200041106a29030022112002200d200f54200e20105a1bad7c2210200041186a2903002010201154ad7c1018ad4200420042001043200141c0006a41186a290300210d200141c0006a41106a2903002111200141c0006a41086a290300211220012903402113200441606a22022200240041e40020021016200041606a22002204240020022000101220002903002114200041086a290300210e200041106a290300210f200041186a2903002110200441606a22002204240041a082042000101202402014200029030058200e200041086a290300221458200e2014511b200f200041106a2903002214582010200041186a290300220e582010200e511b200f2014852010200e8584501b0d0041004100101b0b200441606a220022042400200220001012200141206a2000290300221042047c220e200041086a290300220f200e2010542202ad7c2214200041106a290300221520022014200f54200e20105a1bad7c2210200041186a2903002010201554ad7c1018ad4200420042001043200141206a41186a2903002114200141206a41106a2903002115200141206a41086a290300211620012903202117200441606a22022200240041840120021016200041606a22002204240020022000101220002903002118200041086a290300210e200041106a290300210f200041186a2903002110200441606a22002204240041a082042000101202402018200029030058200e200041086a290300221858200e2018511b200f200041106a2903002218582010200041186a290300220e582010200e511b200f2018852010200e8584501b0d0041004100101b0b200441606a22002204240020022000101220012000290300221042047c220e200041086a290300220f200e2010542202ad7c2218200041106a290300221920022018200f54200e20105a1bad7c2210200041186a2903002010201954ad7c1018ad4200420042001044200141186a290300210e200141106a290300210f200141086a290300211820012903002119200441606a22042200240020041019200041606a220022022400200041186a42003703002000200542ffffffff0f8322103703102000200737030820002008370300200241606a22062202240020002006101302402006200410350d00200241606a220022022400200041186a4200370300200020103703102000200737030820002008370300410020001020412041011021200241606a220022022400410041c00020001026200020014180016a1012200241606a220022022400200010192000200141c0016a10124100200141c0016a1020412020014180016a1020410041c000200141e0006a1026200141e0006a200141a0016a1012200141a0016a41086a290300211a200141a0016a41106a290300211b200141a0016a41186a2206290300211c20012903a001211d200241606a220022022400200041186a201c3703002000201b3703102000201a3703082000201d370300200241606a220422022400200020041013200241606a22002202240020042000102520002d00000d00200241606a22042200240041c0002004102320041015211e200041606a220022022400200041186a4280808080a0a4f69b62370300200042003703102000420037030820004200370300201e20001020200241606a2200220224002004200010122000290300211a200241606a22022200240020021019200041606a2200221f24002002200010122000290300211b200041086a290300211c200041106a350200211d200141c0016a41186a42003703002001201d3703d0012001201c3703c8012001201b3703c001201aa7220041046a200141c0016a102020064200370300200120103703b001200120073703a801200120083703a001200041246a200141a0016a1020201f41606a220022022400200420001012201e201a20002903007da741c4006a101b0b0240200c200a42ffffffff0f8384200b844200520d00200241606a22042200240041c00020041023200410152106200041606a220022022400200041186a4280808080e0f991fad700370300200042003703102000420037030820004200370300200620001020200241606a220022022400200420001012200028020041046a4100102120064124101b0b024020082010842007844200520d00200241606a22022200240041c00020021023200210152104200041606a220022062400200041186a4280808080c0a28dd401370300200042003703102000420037030820004200370300200420001020200641606a22002400200220001012200028020041046a4100102120044124101b0b2008200720052003200c200b200a2009201320122011200d201720162015201420192018200f200e1049410041001027200141e0016a24000bc41c0a077f077e037f017e017f027e017f027e017f067e230041a0026b221424002008a72215201422164180016a1023200ca72217201641e0006a1023024020164180016a201641e0006a10350d00201441606a22182214240041c00020181023201810152119201441606a2214221a2400201441186a428080808090b2e682db00370300201442003703102014420037030820144200370300201920141020201a41606a2214221a24002018201410122014290300211b20164180016a20164180026a1012201641e0006a201641e0016a1012201ba7221441046a20164180026a1020201441246a201641e0016a1020201a41606a221a221424002018201a10122019201b201a2903007da741c4006a101b0b201441606a221822142400201520181023201441606a22142219240020182014101202402014290300201441106a29030084201441086a290300201441186a2903008484500d002000200242ffffffff0f8384200184211c2004200642ffffffff0f8384200584211d4200211b4200211e4200211f420021200340201941606a221422182400201441186a20203703002014201f3703102014201e3703082014201b370300201841606a221822192400201441052018103820182903002121201941606a221822142400202120087ca741206a20181023201441606a2219221424002021200c7ca741206a201910230240201c500d00201820164180026a1012410020164180026a1020412041001021410041c000201641a0016a1026201641a0016a201641c0016a101220164180026a41186a22222003370300201620023703900220162001370388022016200037038002410020164180026a10204120201641c0016a1020410041c000201641a0016a1026201641a0016a201641e0016a1012201641e0016a41086a22232903002121201641e0016a41106a22242903002125201641e0016a41186a2226290300212720162903e0012128201441606a2214221a2400201441186a2027370300201420253703102014202137030820142028370300201a41606a221a222924002014201a1013202941606a221422292400201a2014102520142903002128201441086a2903002121201441106a2903002125201441186a2903002127202941606a2214221a2400201920141012024020282014290300542021201441086a290300222a542021202a511b2025201441106a290300222b542027201441186a290300222a542027202a511b2025202b852027202a8584501b450d00201a41606a22292214240041c0002029102320291015212c201441606a2214221a2400201441186a4280808080d098b9ef03370300201442003703102014420037030820144200370300202c20141020201a41606a2214221a24002029201410122014290300212a2019201641c0016a10122018201641a0016a101220222003370300201620023703900220162001370388022016200037038002202aa7221441046a20164180026a102020262027370300201620253703f001201620213703e801201620283703e001201441246a201641e0016a1020201441c4006a201641c0016a1020201441e4006a201641a0016a1020201a41606a2214221a2400202920141012202c202a20142903007da74184016a101b0b201820164180026a1012410020164180026a1020412041001021410041c000201641a0016a1026201641a0016a201641c0016a101220222003370300201620023703900220162001370388022016200037038002410020164180026a10204120201641c0016a1020410041c000201641a0016a1026201641a0016a201641e0016a10122023290300212d2024290300212e2026290300212f20162903e0012130201a41606a2214221a2400201920141012201441186a2903002131201441106a290300212b20142903002132201441086a290300212a201a41606a2214221a2400201441186a202f3703002014202e3703102014202d37030820142030370300201a41606a2222221a2400201420221013201a41606a221a22142400201a41186a202720317d2025202b54ad7d2025202b7d2225202820325422262021202a542021202a511bad222754ad7d370300201a202520277d370310201a2021202a7d2026ad7d370308201a202820327d3703002022201a10240b0240201d500d00201820164180026a1012410020164180026a1020412041001021410041c000201641a0016a1026201641a0016a201641c0016a101220164180026a41186a2007370300201620063703900220162005370388022016200437038002410020164180026a10204120201641c0016a1020410041c000201641a0016a1026201641a0016a201641e0016a1012201641e0016a41086a2903002121201641e0016a41106a2903002125201641e0016a41186a290300212720162903e0012128201441606a221422182400201441186a2027370300201420253703102014202137030820142028370300201841606a2218221a2400201420181013201a41606a2214221a2400201820141025201441186a290300212a201441106a290300212b201441086a29030021322014290300212d201a41606a221422182400201920141012201641c0006a202d2032202b202a2014290300201441086a290300201441106a290300201441186a2903001056201641c0006a41086a290300212a201641c0006a41106a290300212b201641c0006a41186a29030021322016290340212d201841606a221422182400201441186a2027370300201420253703102014202137030820142028370300201841606a221922182400201420191013201841606a221822142400201841186a20323703002018202b3703102018202a3703082018202d3703002019201810240b201441606a221822142400201520181023201441606a221422192400201820141012201f201b42017c2221201b542218201e2018ad7c2225201e542021201b5a1bad7c2227201f5421182021211b2025211e2027211f20212014290300542025201441086a29030022215420252021511b2027201441106a29030022255420202018ad7c2220201441186a29030022215420202021511b2027202585202020218584501b0d000b0b201941606a221822142400201520181023201441606a221422192400201441186a4200370300201442003703102014420037030820144201370300201941606a2219221a2400201420191013024002402018201910350d00201a41606a22182214240041c00020181023201441606a221422192400201820141012201441186a290300211e201441106a2903002121201441086a290300211b20142903002220a7221441c0001021201641206a20082009200a200b202042c0007c221f201b201f202054221aad7c22252021201a2025201b54201f20205a1bad7c221f201e201f202154ad7c104a20164180026a41186a201641206a41186a2903002225201e7d201641206a41106a290300221e202154ad7d201e20217d22272016290320221f202054221a201641206a41086a2903002221201b542021201b511bad222854ad7d3703002016201f20207d3703800220162021201b7d201aad7d370388022016202720287d37039002201441206a20164180026a10202016200c200d200e200f201f2021201e2025104a2016290300211b201941606a22142219240020182014101220142903002120201941606a22192214240020191019201810152126201441606a221422182400201441186a42003703002014200242ffffffff0f833703102014200137030820142000370300201841606a2218221a2400201420181013201a41606a2214221a2400201441186a42003703002014200642ffffffff0f833703102014200537030820142004370300201a41606a221a222224002014201a10132026201b20207da74180850420192018201a10290c010b201a41606a221822142400201541206a20181023201441606a221922142400201741206a20191023201441606a2214221a240041c00020141023201a41606a221a222224002014201a1012201a290300211b201820164180026a10122019201641e0016a1012201ba7221820164180026a1020201841206a201641e0016a1020202241606a22182219240020142018101220182903002120201941606a22182219240020181019201410152126201941606a221422192400201441186a42003703002014200242ffffffff0f833703102014200137030820142000370300201941606a2219221a2400201420191013201a41606a2214221a2400201441186a42003703002014200642ffffffff0f833703102014200537030820142004370300201a41606a221a222224002014201a10132026201b20207da741c0006a41a0850420182019201a10290b02402004200684200520078484500d00202241606a221822142400201520181023201441606a221422192400201441186a4200370300201442003703102014420037030820144201370300201941606a2219221a240020142019101302402018201910350d00201a41606a22182214240020181019201441606a221424002018201410122014290300201441086a290300201441106a290300201441186a2903002000200120022003200420052006200720082009200a200b200c200d200e200f201020112012201310590c010b201a41606a221822142400201541206a20181023201441606a22192214240020191019201441606a2214221a2400201920141012201441186a290300211b201441106a2903002120201441086a29030021212014290300211e201a41606a221422192400201820141012201441186a290300211f201441106a2903002125201441086a290300212720142903002128201941606a22142400201741206a20141022201e20212020201b20002001200220032004200520062007202820272025201f2014290300201441086a290300201441106a290300201441186a2903002010201120122013105a0b201641a0026a24000bfa0308027f017e017f087e017f027e017f027e230041c0006b220924002001a72009220a41206a10232005a7200a41206a101f20082007200542207c220b200554220c2006200cad7c220d200654200b20055a1bad7c220e200754ad7c210f200a41206a200a101202400240200a290300200a41106a29030084200a41086a290300200a41186a290300848450450d00200b2110200d2111200e21120c010b420021054200211342002114420021060340200941606a220c22092400200142207c2207a7200c1023200ba7200c101f200941606a220c22092400200a41206a200c10122014200542017c2208200554221520132015ad7c2216201354200820055a1bad7c22172014542115200f200e200b42207c2210200b542218200d2018ad7c2211200d542010200b5a1bad7c2212200e54ad7c210f200420032007200154221820022018ad7c2219200254200720015a1bad7c221a200354ad7c21042008210520162113201721142010210b2011210d2012210e2007210120192102201a21032008200c290300542016200c41086a29030022075420162007511b2017200c41106a29030022085420062015ad7c2206200c41186a29030022075420062007511b2017200885200620078584501b0d000b0b200020103703002000201137030820002012370310200041186a200f370300200a41c0006a24000bfd110a047f047e017f017e027f017e017f027e017f067e230041c0016b22002101200024000240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b200041606a220222002400410420021016200041606a22002203240020022000101220002903002104200041086a2903002105200041106a2903002106200041186a2903002107200341606a22002203240041c0820420001012024020042000290300582005200041086a29030022045820052004511b2006200041106a2903002204582007200041186a29030022055820072005511b2006200485200720058584501b0d0041004100101b0b200341606a22002203240020022000101202402000290300220742237c22051018ad544100200041086a290300220620052007542208ad7c2204501b200041186a290300200041106a290300220920082004200654200520075a1bad7c2207200954ad7c22054200532007200584501b0d0041004100101b0b200341606a22002203240020022000101220002802002108200341606a220022032400200841046a20001016200341606a220322082400200020031012200141e0006a2003290300200341086a290300200341106a290300200341186a2903001042200141e0006a41186a2903002107200141e0006a41106a2903002105200141e0006a41086a290300210620012903602104200841606a220a2203240041c000200a1023200341606a220322082400200a200310122003290300200341086a290300200341106a290300200341186a2903002004200620052007103f200a10152000101f200841606a220322082400200a2003101220032903002107200341086a2903002105200341186a2903002109200341106a2903002106200841606a22082203240020082005200742207c2204200754220bad7c220c3703082008200437030020082006200b200c200554200420075a1bad7c2207370310200841186a20092007200654ad7c370300200341606a2203220b2400200820031013200b41606a2208220b2400200b41606a220b220d2400200b41186a200041186a290000370000200b41106a200041106a290000370000200b41086a200041086a290000370000200b2000290000370000200b2008101220082903002107200841086a2903002105200841106a2903002106200841186a2903002104200d41606a220022082400200041186a2004370300200020063703102000200537030820002007370300200841606a2208220b24002000410520081038200841186a290300210c200841106a290300210420082903002106200841086a2903002107200b41606a2200220824002002200010120240200620002903007c220542247c220e1018ad582007200041086a2903007c2005200654220bad7c2206200e200554220dad7c220f50221020101b2004200041106a2903007c2209200b200620075420062007511bad7c2207200d200f200654200e20055a1bad7c221150200c200041186a2903007c2009200454ad7c2007200954ad7c2011200754ad7c220c50220020001b2011200c84501b0d0041004100101b0b200841606a22002208240020022000101202402000290300220542247c2207200e5a200041086a290300220620072005542202ad7c2212200f5a2012200f511b200041106a290300220420022012200654200720055a1bad7c221320115a200041186a2903002013200454ad7c2205200c5a2005200c511b20132011852005200c8584501b0d002007a721020340200220014180016a101620014180016a200141a0016a1012200141a0016a41086a2903002106200141a0016a41106a2903002104200141a0016a41186a290300210920012903a001211420031015210b200841606a220022082400200041186a2009370300200020043703102000200637030820002014370300200b20001020200841606a22002208240020032000101220002903002106200041086a2903002104200041186a2903002115200041106a2903002109200841606a22002203240020002004200642207c22142006542208ad7c2216370308200020143703002000200920082016200454201420065a1bad7c2206370310200041186a20152006200954ad7c370300200341606a2203220824002000200310132013200742207c2206200754220020122000ad7c2204201254200620075a1bad7c22092013542100200241206a21022006210720042112200921132006200e542004200f542004200f511b200920115420052000ad7c2205200c542005200c511b20092011852005200c8584501b0d000b0b200841606a220322002400412420031016200041606a22002202240020032000101220002903002104200041086a2903002105200041106a2903002106200041186a2903002107200241606a22002202240041c0820420001012024020042000290300582005200041086a29030022045820052004511b2006200041106a2903002204582007200041186a29030022055820072005511b2006200485200720058584501b0d0041004100101b0b200241606a220022022400200a20001012200041186a2903002106200041106a2903002104200041086a29030021092000290300210c200241606a220022022400200320001012200141c0006a2000290300220742047c2205200041086a290300221220052007542203ad7c2213200041106a290300221420032013201254200520075a1bad7c2207200041186a2903002007201454ad7c1018ad4200420042001043200141206a200c2009200420062001290340200141c0006a41086a290300200141c0006a41106a290300200141c0006a41186a290300104c200141206a41186a2903002109200141206a41106a290300210c200141206a41086a290300211220012903202113200241606a22032200240041c00020031023200041606a220022022400200320001012200041186a2903002114200041106a2903002105200041086a290300210620002903002207a741201021200120132012200c2009200742207c2204200620042007542200ad7c2211200520002011200654200420075a1bad7c220720142007200554ad7c104a20012903002107200241606a2200240020032000101220031015200720002903007da71027200141c0016a24000b910a04067f047e017f047e23004180036b220924002001a7220a2009220b4180016a10232005a7200b41e0006a10230240200b4180016a200b41e0006a10350d00200941606a220c2209240041c000200c1023200c1015210d200941606a2209220e2400200941186a428080808090b2e682db00370300200942003703102009420037030820094200370300200d20091020200e41606a2209220e2400200c200910122009290300210f200b41e0006a200b41e0026a1012200b4180016a200b41c0026a1012200fa7220941046a200b41e0026a1020200941246a200b41c0026a1020200e41606a220e22092400200c200e1012200d200f200e2903007da741c4006a101b0b200941606a220c22092400200a200c1023200941606a2209220d2400200c20091012200b41c0006a2009290300200941086a290300200941106a290300200941186a2903001042200b41c0006a41186a290300210f200b41c0006a41106a2903002110200b41c0006a41086a2903002111200b2903402112200d41606a22132209240041c00020131023200941606a2209220d24002013200910122009290300200941086a290300200941106a290300200941186a290300201220112010200f103f20131015200c101f200d41606a2209220d2400200c20091012200b41206a2009290300200941086a290300200941106a290300200941186a2903001042200b280220210c200d41606a2209220d2400201320091012200928020041206a1018200c41606a102f200d41606a220c22092400200a200c1023200941606a2209220d2400200c2009101202402009290300200941106a29030084200941086a290300200941186a2903008484500d004200210f4200211142002112420021100340200d41606a2209220c2400200941186a201037030020092012370310200920113703082009200f370300200c41606a220c220d240020094105200c1038200c2903002114200d41606a220c22092400201420017ca741206a200c1023200941606a2209220d2400201320091012200b2009290300200941086a290300200941106a290300200941186a290300200f2011201220101055200b280200210e200c200b41e0026a1012201420057ca741206a200b4180026a10224100200b4180026a1020412041001021410041c000200b41e0016a1026200b41e0016a200b41c0026a10124100200b41e0026a10204120200b41c0026a1020410041c000200b41a0026a1026200b41a0026a200b41c0016a1012200b41c0016a200b41e0026a1013200b41e0026a200b41c0026a1025200b41c0026a41086a2903002114200b41c0026a41106a2903002115200b41c0026a41186a2903002116200b2903c0022117200d41606a2209220c2400200941186a2016370300200920153703102009201437030820092017370300200e20091020200c41606a220c22092400200a200c1023200941606a2209220d2400200c200910122012200f42017c2214200f54220c2011200cad7c22152011542014200f5a1bad7c2216201254210c2014210f201521112016211220142009290300542015200941086a29030022145420152014511b2016200941106a2903002215542010200cad7c2210200941186a29030022145420102014511b2016201585201020148584501b0d000b0b2013200b41a0016a10122000200b41a0016a41106a2903003703102000200b41a0016a41086a2903003703082000200b2903a001370300200041186a200b41a0016a41186a290300370300200b4180036a24000bf90402047f087e2300220021010240101a450d0041004100101b0b10331a1046200041606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a220222032400200020021013200341606a22002203240020022000102520002903002104200041086a2903002105200041106a2903002106200041186a2903002107200341606a220022022400200241606a220222032400200241186a41e0820441186a290300370000200241106a41e0820441106a290300370000200241086a41e0820441086a290300370000200241002903e0820437000020022000101220002903002108200041086a2903002109200041106a290300210a200041186a290300210b200341606a220022022400200041186a200b3703002000200a3703102000200937030820002008370300200241606a220222032400200041a0012002103820022903002108200241086a2903002109200241106a290300210a200241186a290300210b200341606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a220222032400200020021013200341606a220022032400200041186a200b2007833703002000200a2006833703102000200920058337030820002008200483370300200220001024200341606a220022022400200041186a2007370300200020063703102000200537030820002004370300200241606a220222032400200020021013200341606a220022032400200041186a4200370300200042003703102000420037030820004200370300200341606a220324002000200310134100410041808304200220031028410041001027200124000b8c0706027f047e027f097e017f027e230041a0016b22002101200024000240101a450d0041004100101b0b0240103341ff004b0d0041004100101b0b410420014180016a101620014180016a200141e0006a1012200141e0006a41186a2903002102200141e0006a41106a2903002103200141e0006a41086a290300210420012903602105200041606a22062200240041e40020061016200041606a22002207240020062000101220002903002108200041086a2903002109200041106a290300210a200041186a290300210b200741606a22002207240041a0830420001012024020082000290300582009200041086a29030022085820092008511b200a200041106a290300220858200b200041186a290300220958200b2009511b200a200885200b20098584501b0d0041004100101b0b200741606a22002207240020062000101220012000290300220b42047c2209200041086a290300220a2009200b542206ad7c2208200041106a290300220c20062008200a542009200b5a1bad7c220b200041186a290300200b200c54ad7c1018ad4200420042001044200141186a290300210d200141106a290300210e200141086a290300210f200129030021101046024020052003842004200284844200520d00200741606a22062200240041c00020061023200610152111200041606a220022072400200041186a4280808080e0f991fad700370300200042003703102000420037030820004200370300201120001020200741606a220022072400200620001012200028020041046a4100102120114124101b0b200741606a2200220624004124200010162000200141e0006a1012200641606a2200240041c400200010162000200141c0006a101241c00020014180016a102220014180016a41186a290300210820014190016a290300210920014188016a290300210a200129038001220ba7220041011021200041206a200141e0006a1020200b42c0007c220ca741011021200041e0006a200141c0006a10202001200b4280017c22123703202001200a2012200b542200ad7c22133703282001200920002013200a542012200b5a1bad7c2212370330200141206a41186a20082012200954ad7c37030041c000200141206a10202005200420032002200b200a20092008200c200a200c200b542200ad7c2212200920002012200a54200c200b5a1bad7c221220082012200954ad7c2010200f200e200d1047410041001027200141a0016a24000bd40102047f037e2300220021010240101a450d0041004100101b0b10331a200041606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a220222032400200020021013200341606a22002203240020022000102520002903002104200041086a2903002105200041106a3502002106200341606a22002203240041c00020001023200010152102200341606a22002400200041186a4200370300200020063703102000200537030820002004370300200220001020200241201027200124000bd00c03057f167e017f230041e0006b22002101200024000240101a450d0041004100101b0b10331a200041606a22022200240041c00020021023200041606a220022032400200041186a4200370300200042003703102000420037030820004205370300200341606a220322042400200020031013200441606a22002204240020032000102520002903002105200041086a2903002106200041106a2903002107200041186a2903002108200441606a220022032400200041186a2008370300200020073703102000200637030820002005370300200341606a220322042400200041012003103902402005a74101712003290300220942ff008320092005420183220a501b220b421f564200200a7d2209200341086a29030083220c420052200c501b2009200341106a29030083220d4200522009200341186a29030083220e420052200e501b200d200e84501b460d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b200441606a220022032400200220001012200041186a290300210f200041106a2903002110200041086a290300211120002903002109200141c0006a41186a200e3703002001200d3703502001200c3703482001200b3703402009a7200141c0006a1020200f2010200942207c2212200954220020112000ad7c2213201154201220095a1bad7c2214201054ad7c211502400240200a4200520d00200341606a220022032400200041186a200837030020002007370310200020063703082000200542807e833703002012a720001020200341606a220022032400200041186a420037030020004200370310200042003703082000200b200d84200c200e8484420052ad370300200341606a2204220324002000410520041038200441186a2903002106200441106a2903002110200441086a290300210a200429030021110c010b4100410510210240200b200d84200c200e848450450d00420021114200210a42002110420021060c010b4291cfb2afcbf0d8b503210f42bbf3b1e8d2a2d89346210742cedeedafcaa0b08206210842b0fbeca595e68fb8b07f2109420021054200211642002117420021060340200341606a220022032400200041186a200f370300200020073703102000200837030820002009370300200341606a220322042400200020031013200441606a2200220424002003200010252000290300210a200041086a2903002110200041106a2903002111200041186a2903002118200441606a220022032400200041186a201837030020002011370310200020103703082000200a370300200520127ca7200010202017200542207c2211200554220020162000ad7c220a201654201120055a1bad7c22102017542100200f2007200942017c2218200954220420082004ad7c2219200854201820095a1bad7c221a200754ad7c210f20112105200a2116201021172018210920192108201a21072011200b54200a200c54200a200c511b2010200d5420062000ad7c2206200e542006200e511b2010200d852006200e8584501b0d000b0b200341606a220022032400200220001012200041186a2903002107200041106a2903002108200041086a290300210e2000290300210f200341606a220022032400200220001012200f200e20082007201120127c2205200029030022167d200a20137c20052011542204ad7c2209200041086a29030022117d2005201654221bad7d201020147c220520042009200a542009200a511bad7c220a200041106a29030022167d2217201b200920115420092011511bad22097d200620157c2005201054ad7c200a200554ad7c200041186a2903007d200a201654ad7d2017200954ad7d103f200341606a22002203240041c00020001023200341606a22032204240020002003101220032903002109200441606a220322042400200220031012200328020021032009a7412010212003200141c0006a1023200942207c2205a72202200141c0006a101f200241206a200341206a200141c0006a10151032200141c0006a200141206a1012200129032020057ca741206a41001021200141c0006a2001101220012903002105200441606a220324002000200310122000101520092005421f7c42e0ffffff0f837c20032903007da741c0006a1027200141e0006a24000bb20704027f047e057f087e23004180016b22002101200024000240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b4104200110162001200141e0006a1012200141f8006a2903002102200141f0006a2903002103200141e8006a290300210420012903602105200041606a220622002400412420061016200610362107200041606a22002208240020074522072000101402402006200010350d0041004100101b0b024020052003842004200284844200520d00200841606a22092200240041c0002009102320091015210a200041606a220022082400200041186a428080808080a0f8e94e370300200042003703102000420037030820004200370300200a20001020200841606a220022082400200920001012200028020041046a41001021200a4124101b0b200841606a2200220824002000101941002000101f412041011021200841606a220022082400410041c000200010262000200141206a1012200141e0006a41186a20023703002001200337037020012004370368200120053703604100200141e0006a10204120200141206a1020410041c000200110262001200141c0006a1012200141c0006a41086a290300210b200141c0006a41106a290300210c200141c0006a41186a290300210d2001290340210e200841606a220022082400200041186a200d3703002000200c3703102000200b3703082000200e370300200841606a220822092400200020081013200941606a2200220924002008200010252000290300210f200041086a2903002110200041106a2903002111200041186a2903002112200941606a220022082400200041186a200d3703002000200c3703102000200b3703082000200e370300200841606a220822092400200020081013200941606a220022092400200041186a201237030020002011370310200020103703082000200f42807e832007ad84370300200820001024200941606a22082200240041c00020081023200041606a2200220724002008200010122000290300210b200741606a220022072400200620001012200ba72000290300200041106a29030084200041086a290300200041186a29030084844200521021200741606a2200220624002008200010122000290300210c200641606a22062200240020061019200810152107200041606a220022082400200041186a2002370300200020033703102000200437030820002005370300200841606a220824002000200810132007200b200c7da741206a41c0830420062008102841004100102720014180016a24000bad0303027f047e027f23004180016b22002101200024000240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b4104200110162001200141e0006a1012200141e0006a41086a2903002102200141e0006a41106a2903002103200141e0006a41186a2903002104200129036021054124200110162001200141e0006a1012200041606a220022062400200041186a2004370300200020033703102000200237030820002005370300410020001020412041011021200641606a220022062400410041c000200010262000200141206a10124100200141e0006a10204120200141206a1020410041c000200110262001200141c0006a1012200141c0006a41086a2903002102200141c0006a41106a2903002103200141c0006a41186a290300210420012903402105200641606a220022062400200041186a2004370300200020033703102000200237030820002005370300200641606a220622072400200020061013200741606a22002207240020062000102520003100002102200741606a2200240041c000200010232000101522002002420052102120004120102720014180016a24000bf80d08037f017e017f017e017f0f7e027f027e230041a0016b22002101200024000240101a450d0041004100101b0b02401033419f014b0d0041004100101b0b4104200141206a1016200141206a20014180016a101220014180016a41186a2202290300210320014180016a41106a2204290300210520014180016a41086a2206290300210720012903800121084124200141206a1016200141206a20014180016a1012200229030021092004290300210a2006290300210b200129038001210c200041606a22022200240041840120021016200041606a2200220424002002200010122000290300210d200041086a290300210e200041106a290300210f200041186a2903002110200441606a22002204240041e08304200010120240200d200029030058200e200041086a290300220d58200e200d511b200f200041106a290300220d582010200041186a290300220e582010200e511b200f200d852010200e8584501b0d0041004100101b0b200441606a22002204240020022000101220012000290300221042047c220e200041086a290300220f200e2010542202ad7c220d200041106a29030022112002200d200f54200e20105a1bad7c2210200041186a2903002010201154ad7c1018ad4200420042001044200141186a2903002112200141106a2903002113200141086a290300211420012903002115200441606a22042200240020041019200041606a220022022400200041186a42003703002000200542ffffffff0f8322103703102000200737030820002008370300200241606a22062202240020002006101302402006200410350d00200241606a220022022400200041186a4200370300200020103703102000200737030820002008370300410020001020412041011021200241606a220022022400410041c000200010262000200141c0006a1012200241606a22002202240020001019200020014180016a1012410020014180016a10204120200141c0006a1020410041c000200141206a1026200141206a200141e0006a1012200141e0006a41086a290300210e200141e0006a41106a290300210f200141e0006a41186a2206290300210d20012903602111200241606a220022022400200041186a200d3703002000200f3703102000200e37030820002011370300200241606a220422022400200020041013200241606a22002202240020042000102520002d00000d00200241606a22042200240041c00020041023200410152116200041606a220022022400200041186a4280808080a0a4f69b62370300200042003703102000420037030820004200370300201620001020200241606a2200220224002004200010122000290300210e200241606a22022200240020021019200041606a2200221724002002200010122000290300210f200041086a290300210d200041106a350200211120014180016a41186a420037030020012011370390012001200d370388012001200f37038001200ea7220041046a20014180016a102020064200370300200120103703702001200737036820012008370360200041246a200141e0006a1020201741606a2200220224002004200010122016200e20002903007da741c4006a101b0b0240200c200a42ffffffff0f8384200b844200520d00200241606a22042200240041c00020041023200410152106200041606a220022022400200041186a4280808080e0f991fad700370300200042003703102000420037030820004200370300200620001020200241606a220022022400200420001012200028020041046a4100102120064124101b0b024020082010842007844200520d00200241606a22042200240041c00020041023200410152106200041606a220022022400200041186a4280808080c0a28dd401370300200042003703102000420037030820004200370300200620001020200241606a220022022400200420001012200028020041046a4100102120064124101b0b200241606a22002202240041c400200010162000200141e0006a1012200241606a2200240041e400200010162000200141c0006a101241c00020014180016a102220014180016a41186a290300210d20014190016a290300210e20014188016a290300210f2001290380012210a7220041011021200041206a200141e0006a1020201042c0007c2211a741011021200041e0006a200141c0006a1020200120104280017c22183703202001200f20182010542200ad7c22193703282001200e20002019200f54201820105a1bad7c2218370330200141206a41186a200d2018200e54ad7c37030041c000200141206a10202008200720052003200c200b200a20092010200f200e200d2011200f20112010542200ad7c2218200e20002018200f54201120105a1bad7c2218200d2018200e54ad7c20152014201320121049410041001027200141a0016a24000bd60604027f037e037f087e230041c0006b22002101200024000240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b4104200141206a1016200141206a20011012200141106a350200210220012903002103200141086a29030021041046024020042003200284844200520d00200041606a22052200240041c00020051023200510152106200041606a220022072400200041186a4280808080f0beefa71e370300200042003703102000420037030820004200370300200620001020200741606a220722002400200520071012200728020041046a4100102120064124101b0b200041606a220022052400200041186a4200370300200042003703102000420037030820004203370300200541606a220522062400200020051013200641606a22002206240020052000102520002903002108200041086a2903002109200041106a290300210a200041186a290300210b200641606a220022052400200541606a220522062400200541186a4180840441186a290300370000200541106a4180840441106a290300370000200541086a4180840441086a2903003700002005410029038084043700002005200010122000290300210c200041086a290300210d200041106a290300210e200041186a290300210f200641606a220022052400200041186a200f3703002000200e3703102000200d3703082000200c370300200541606a220522062400200041a001200510382005290300210c200541086a290300210d200541106a290300210e200541186a290300210f200641606a220022052400200041186a4200370300200042003703102000420037030820004203370300200541606a220522062400200020051013200641606a220022062400200041186a200f200b833703002000200e200a832002843703102000200d2009832004843703082000200c200883200384370300200520001024200641606a220022052400200041186a42003703002000200a42ffffffff0f833703102000200937030820002008370300200541606a220522062400200020051013200641606a220022062400200041186a4200370300200020023703102000200437030820002003370300200641606a220624002000200610134100410041a08404200520061028410041001027200141c0006a24000b920303027f027e027f230041c0006b220924002001a72009220a41206a1023200a41206a200a10120240200a290300200556200a41086a290300220b200656200b2006511b200a41106a290300220c200756200a41186a290300220b200856200b2008511b200c200785200b20088584501b0d00200941606a220d22092400200d41186a428080808090ee9ea4ce00370300200d4200370310200d4200370308200d42003703004100200d102041044132102141004124101b0b200941606a2209220d2400200941186a2008370300200920073703102009200637030820092005370300200d41606a220d240020094105200d103820002001200d2903007c220842207c220737030020002002200d41086a2903007c20082001542209ad7c22012007200854220ead7c220537030820002003200d41106a2903007c22062009200120025420012002511bad7c2202200e2005200154200720085a1bad7c2208370310200041186a2004200d41186a2903007c2006200354ad7c2002200654ad7c2008200254ad7c370300200a41c0006a24000be20103027f017e017f23002209210a0240200520017c220b20015a200620027c200b200554220cad7c220120025a20012002511b200720037c2205200c200120065420012006511bad7c220220035a200820047c2005200754ad7c2002200554ad7c220620045a20062004511b2002200385200620048584501b0d00200941606a220c2400200c41186a428080808090ee9ea4ce00370300200c4200370310200c4200370308200c42003703004100200c102041044111102141004124101b0b2000200b3703002000200137030820002002370310200041186a2006370300200a24000ba21103057f097e017f23004180036b221424002014221541a0016a41186a2007370300201520063703b001201520053703a801201520043703a001201541a0016a20154180016a1013024020154180016a1031450d00201441606a22142216240041c00020141023201641606a221622172400201741606a221722182400201741186a41c0850441186a290300370000201741106a41c0850441106a290300370000201741086a41c0850441086a290300370000201741002903c0850437000020172016101220162903002119201641086a290300211a201641106a290300211b201641186a290300211c201841606a221622172400201641186a201c3703002016201b3703102016201a37030820162019370300201741606a221722182400201641e001201710382017290300211d201741086a290300211e201741106a290300211f201741186a2903002120201410152117201841606a221622182400201641186a20203703002016201f3703102016201e3703082016201d370300201720161020102d2121201841606a221622182400201420161012201641186a290300211c201641106a290300211a201641086a290300211b2016290300211920154180026a41186a2003370300201520023703900220152001370388022015200037038002201942047c2203a7221620154180026a1020201641206a41001021201641c0006a41a0011021201541e0006a20082009200a200b201942a4017c2202201b20022019542222ad7c2201201a20222001201b54200220195a1bad7c2202201c2002201a54ad7c104a201541e0016a41186a201541e0006a41186a290300220b201c201a20032019542222201b2022ad7c2202201b54200320195a1bad7c2219201a54ad7c220a7d201541e0006a41106a290300221b201954ad7d201b20197d22092015290360221c2003542222201541e0006a41086a290300221a200254201a2002511bad220854ad7d3703002015201c20037d3703e0012015201a20027d2022ad7d3703e8012015200920087d3703f001201641e0006a201541e0016a1020201541c0006a200c200d200e200f201c201a201b200b104a201541c0016a41186a201541c0006a41186a290300200a7d201541c0006a41106a290300221a201954ad7d201a20197d221b2015290340221a2003542222201541c0006a41086a290300221920025420192002511bad221c54ad7d3703002015201a20037d3703c0012015201920027d2022ad7d3703c8012015201b201c7d3703d00120164180016a201541c0016a10202010a72216201541e0026a1023201aa72222201541e0026a101f202241206a201641206a201541e0026a10151032201541e0026a201541c0026a1012201a20152903c0027ca741206a41001021201541e0026a201541a0026a101220152903a0022103201841606a22162218240020142016101220162903002102201841606a221622182400201641186a2007370300201620063703102016200537030820162004370300201841606a221822222400201620181013202241606a22162222240042002119201641186a4200370300201642003703102016420037030820164200370300024002402021201820162017201a2003421f7c42e0ffffff0f837c20027da741206a20174120102c450d000240102e4120490d00422021030c020b102ead2103420021190c010b2015105c20152802002116202241606a221422172400201620141023024020141036450d00201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080e0f991fad700370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142903002119201541e0026a41186a2007370300201520063703f002201520053703e802201520043703e0022019a741046a201541e0026a1020201841606a221424002016201410122017201920142903007da741246a101b0c020b201641206a20141015101b0c010b202241606a2216221724002014201610122016290300201641086a290300201641106a290300201641186a2903002003201920192019103f201741606a221622172400201420161012201641186a290300211b201641106a290300211c201641086a29030021102016290300210f201741606a221622172400201420161012201541206a200f2010201c201b2016290300220220037c221a201641086a290300220320197c201a2002542214ad7c2202201641106a290300220e20197c221a2014200220035420022003511bad7c2203201641186a29030020197c201a200e54ad7c2003201a54ad7c105b201541206a41106a2903002119201541206a41086a2903002103201541206a41186a29030021022015290320211a201741606a221422162400201641606a221622172400201641186a41e0850441186a290300370000201641106a41e0850441106a290300370000201641086a41e0850441086a290300370000201641002903e085043700002016201410122014290300211b201441086a290300211c201441106a2903002110201441186a290300210f201741606a221422162400201441186a200f370300201420103703102014201c3703082014201b370300201641606a221622172400201441e00120161038201a201629030083201d852019201641106a29030083201f85842003201641086a29030083201e852002201641186a290300832020858484500d00201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080e0f991fad700370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142903002119201541e0026a41186a2007370300201520063703f002201520053703e802201520043703e0022019a741046a201541e0026a1020201841606a221424002016201410122017201920142903007da741246a101b0b20154180036a24000bcc0e03057f067e017f230041c0026b221424002014221541e0006a41186a2007370300201520063703702015200537036820152004370360201541e0006a201541c0006a10130240201541c0006a1031450d00201441606a22142216240041c00020141023201641606a221622172400201741606a221722182400201741186a41c0860441186a290300370000201741106a41c0860441106a290300370000201741086a41c0860441086a290300370000201741002903c0860437000020172016101220162903002119201641086a290300211a201641106a290300211b201641186a290300211c201841606a221622172400201641186a201c3703002016201b3703102016201a37030820162019370300201741606a221722182400201641e001201710382017290300211a201741086a290300211b201741106a290300211c201741186a290300211d201410152117201841606a221622182400201641186a201d3703002016201c3703102016201b3703082016201a370300201720161020102d211e201841606a22162218240020142016101220162903002119201541c0016a41186a2003370300201520023703d001201520013703c801201520003703c0012019a7221641046a201541c0016a1020201641246a41001021201541a0016a41186a200b3703002015200a3703b001201520093703a801201520083703a001201641c4006a201541a0016a102020154180016a41186a200f3703002015200e370390012015200d370388012015200c37038001201641e4006a20154180016a102020164184016a41a00110212010a72216201541a0026a1023201942a4017c2210a7221f201541a0026a101f201f41206a201641206a201541a0026a10151032201541a0026a20154180026a101220152903800220107ca741206a41001021201541a0026a201541e0016a101220152903e001210f201841606a2216221824002014201610122016290300210e201841606a221622182400201641186a2007370300201620063703102016200537030820162004370300201841606a2218221f2400201620181013201f41606a2216221f240042002110201641186a420037030020164200370310201642003703082016420037030002400240201e2018201620172019200f421f7c42e0ffffff0f837c200e7da741c4016a20174120102c450d000240102e4120490d00422021190c020b102ead2119420021100c010b2015105c20152802002116201f41606a221422172400201620141023024020141036450d00201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080e0f991fad700370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142903002110201541a0026a41186a2007370300201520063703b002201520053703a802201520043703a0022010a741046a201541a0026a1020201841606a221424002016201410122017201020142903007da741246a101b0c020b201641206a20141015101b0c010b201f41606a2216221724002014201610122016290300201641086a290300201641106a290300201641186a2903002019201020102010103f201741606a221622172400201420161012201641186a290300210d201641106a290300210c201641086a290300210b2016290300210a201741606a221622172400201420161012201541206a200a200b200c200d2016290300220f20197c220e201641086a290300221920107c200e200f542214ad7c220f201641106a290300220920107c220e2014200f201954200f2019511bad7c2219201641186a29030020107c200e200954ad7c2019200e54ad7c105b201541206a41106a2903002110201541206a41086a2903002119201541206a41186a290300210f2015290320210e201741606a221422162400201641606a221622172400201641186a41e0860441186a290300370000201641106a41e0860441106a290300370000201641086a41e0860441086a290300370000201641002903e086043700002016201410122014290300210d201441086a290300210c201441106a290300210b201441186a290300210a201741606a221422162400201441186a200a3703002014200b3703102014200c3703082014200d370300201641606a221622172400201441e00120161038200e201629030083201a852010201641106a29030083201c85842019201641086a29030083201b85200f201641186a29030083201d858484500d00201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080e0f991fad700370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142903002110201541a0026a41186a2007370300201520063703b002201520053703a802201520043703a0022010a741046a201541a0026a1020201841606a221424002016201410122017201020142903007da741246a101b0b201541c0026a24000bda1103057f0a7e017f230041a0036b221824002018221941a0016a41186a200b3703002019200a3703b001201920093703a801201920083703a001201941a0016a20194180016a1013024020194180016a1031450d00201841606a2218221a240041c00020181023201a41606a221a221b2400201b41606a221b221c2400201b41186a4180860441186a290300370000201b41106a4180860441106a290300370000201b41086a4180860441086a290300370000201b41002903808604370000201b201a1012201a290300211d201a41086a290300211e201a41106a290300211f201a41186a2903002120201c41606a221a221b2400201a41186a2020370300201a201f370310201a201e370308201a201d370300201b41606a221b221c2400201a41e001201b1038201b2903002121201b41086a2903002122201b41106a2903002123201b41186a290300212420181015211b201c41606a221a221c2400201a41186a2024370300201a2023370310201a2022370308201a2021370300201b201a1020102d2125201c41606a221a221c24002018201a1012201a41186a2903002126201a41106a290300211f201a41086a2903002120201a290300211d4200211e201941a0026a41186a42003703002019200242ffffffff0f833703b002201920013703a802201920003703a002201d42047c2202a7221a201941a0026a102020194180026a41186a42003703002019200642ffffffff0f833703900220192005370388022019200437038002201a41206a20194180026a1020201a41c0006a41a0011021201941e0006a200c200d200e200f201d42a4017c220620202006201d542227ad7c2205201f202720052020542006201d5a1bad7c220620262006201f54ad7c104a201941e0016a41186a201941e0006a41186a290300220f2026201f2002201d54222720202027ad7c22062020542002201d5a1bad7c221d201f54ad7c220e7d201941e0006a41106a2903002220201d54ad7d2020201d7d220d201929036022262002542227201941e0006a41086a290300221f200654201f2006511bad220c54ad7d3703002019202620027d3703e0012019201f20067d2027ad7d3703e8012019200d200c7d3703f001201a41e0006a201941e0016a1020201941c0006a20102011201220132026201f2020200f104a201941c0016a41186a201941c0006a41186a290300200e7d201941c0006a41106a290300221f201d54ad7d201f201d7d22202019290340221d2002542227201941c0006a41086a290300221f200654201f2006511bad222654ad7d3703002019201d20027d3703c0012019201f20067d2027ad7d3703c8012019202020267d3703d001201a4180016a201941c0016a10202014a7221a20194180036a1023201da7222720194180036a101f202741206a201a41206a20194180036a1015103220194180036a201941e0026a1012201d20192903e0027ca741206a4100102120194180036a201941c0026a101220192903c0022102201c41606a221a221c24002018201a1012201a2903002106201c41606a221a221c2400201a41186a200b370300201a200a370310201a2009370308201a2008370300201c41606a221c22272400201a201c1013202741606a221a22272400201a41186a4200370300201a4200370310201a4200370308201a4200370300024002402025201c201a201b201d2002421f7c42e0ffffff0f837c20067da741206a201b4120102c450d000240102e4120490d004220211d0c020b102ead211d4200211e0c010b2019105c2019280200211a202741606a2218221b2400201a20181023024020181036450d00201b41606a221a2218240041c000201a1023201a1015211b201841606a2218221c2400201841186a4280808080e0f991fad700370300201842003703102018420037030820184200370300201b20181020201c41606a2218221c2400201a201810122018290300211d20194180036a41186a200b3703002019200a3703900320192009370388032019200837038003201da741046a20194180036a1020201c41606a22182400201a20181012201b201d20182903007da741246a101b0c020b201a41206a20181015101b0c010b202741606a221a221b24002018201a1012201a290300201a41086a290300201a41106a290300201a41186a290300201d201e201e201e103f201b41606a221a221b24002018201a1012201a41186a290300211f201a41106a2903002120201a41086a2903002126201a2903002114201b41606a221a221b24002018201a1012201941206a201420262020201f201a2903002202201d7c2206201a41086a290300221d201e7c20062002542218ad7c2202201a41106a2903002213201e7c220620182002201d542002201d511bad7c221d201a41186a290300201e7c2006201354ad7c201d200654ad7c105b201941206a41106a290300211d201941206a41086a2903002102201941206a41186a29030021062019290320211e201b41606a2218221a2400201a41606a221a221b2400201a41186a41a0860441186a290300370000201a41106a41a0860441106a290300370000201a41086a41a0860441086a290300370000201a41002903a08604370000201a201810122018290300211f201841086a2903002120201841106a2903002126201841186a2903002114201b41606a2218221a2400201841186a201437030020182026370310201820203703082018201f370300201a41606a221a221b2400201841e001201a1038201e201a29030083202185201d201a41106a29030083202385842002201a41086a290300832022852006201a41186a290300832024858484500d00201b41606a221a2218240041c000201a1023201a1015211b201841606a2218221c2400201841186a4280808080e0f991fad700370300201842003703102018420037030820184200370300201b20181020201c41606a2218221c2400201a201810122018290300211d20194180036a41186a200b3703002019200a3703900320192009370388032019200837038003201da741046a20194180036a1020201c41606a22182400201a20181012201b201d20182903007da741246a101b0b201941a0036a24000b840f03057f077e017f230041e0026b221824002018221941e0006a41186a200b3703002019200a3703702019200937036820192008370360201941e0006a201941c0006a10130240201941c0006a1031450d00201841606a2218221a240041c00020181023201a41606a221a221b2400201b41606a221b221c2400201b41186a4180870441186a290300370000201b41106a4180870441106a290300370000201b41086a4180870441086a290300370000201b41002903808704370000201b201a1012201a290300211d201a41086a290300211e201a41106a290300211f201a41186a2903002120201c41606a221a221b2400201a41186a2020370300201a201f370310201a201e370308201a201d370300201b41606a221b221c2400201a41e001201b1038201b290300211f201b41086a2903002120201b41106a2903002121201b41186a290300212220181015211b201c41606a221a221c2400201a41186a2022370300201a2021370310201a2020370308201a201f370300201b201a1020102d2123201c41606a221a221c24002018201a1012201a290300211e4200211d201941e0016a41186a42003703002019200242ffffffff0f833703f001201920013703e801201920003703e001201ea7221a41046a201941e0016a1020201941c0016a41186a42003703002019200642ffffffff0f833703d001201920053703c801201920043703c001201a41246a201941c0016a1020201941a0016a41186a200f3703002019200e3703b0012019200d3703a8012019200c3703a001201a41c4006a201941a0016a102020194180016a41186a2013370300201920123703900120192011370388012019201037038001201a41e4006a20194180016a1020201a4184016a41a00110212014a7221a201941c0026a1023201e42a4017c2214a72224201941c0026a101f202441206a201a41206a201941c0026a10151032201941c0026a201941a0026a101220192903a00220147ca741206a41001021201941c0026a20194180026a10122019290380022114201c41606a221a221c24002018201a1012201a2903002113201c41606a221a221c2400201a41186a200b370300201a200a370310201a2009370308201a2008370300201c41606a221c22242400201a201c1013202441606a221a22242400201a41186a4200370300201a4200370310201a4200370308201a4200370300024002402023201c201a201b201e2014421f7c42e0ffffff0f837c20137da741c4016a201b4120102c450d000240102e4120490d004220211e0c020b102ead211e4200211d0c010b2019105c2019280200211a202441606a2218221b2400201a20181023024020181036450d00201b41606a221a2218240041c000201a1023201a1015211b201841606a2218221c2400201841186a4280808080e0f991fad700370300201842003703102018420037030820184200370300201b20181020201c41606a2218221c2400201a201810122018290300211d201941c0026a41186a200b3703002019200a3703d002201920093703c802201920083703c002201da741046a201941c0026a1020201c41606a22182400201a20181012201b201d20182903007da741246a101b0c020b201a41206a20181015101b0c010b202441606a221a221b24002018201a1012201a290300201a41086a290300201a41106a290300201a41186a290300201e201d201d201d103f201b41606a221a221b24002018201a1012201a41186a2903002112201a41106a2903002111201a41086a2903002110201a290300210f201b41606a221a221b24002018201a1012201941206a200f201020112012201a2903002214201e7c2213201a41086a290300221e201d7c20132014542218ad7c2214201a41106a290300220e201d7c221320182014201e542014201e511bad7c221e201a41186a290300201d7c2013200e54ad7c201e201354ad7c105b201941206a41106a290300211d201941206a41086a290300211e201941206a41186a290300211420192903202113201b41606a2218221a2400201a41606a221a221b2400201a41186a41a0870441186a290300370000201a41106a41a0870441106a290300370000201a41086a41a0870441086a290300370000201a41002903a08704370000201a2018101220182903002112201841086a2903002111201841106a2903002110201841186a290300210f201b41606a2218221a2400201841186a200f370300201820103703102018201137030820182012370300201a41606a221a221b2400201841e001201a10382013201a29030083201f85201d201a41106a2903008320218584201e201a41086a290300832020852014201a41186a290300832022858484500d00201b41606a221a2218240041c000201a1023201a1015211b201841606a2218221c2400201841186a4280808080e0f991fad700370300201842003703102018420037030820184200370300201b20181020201c41606a2218221c2400201a201810122018290300211d201941c0026a41186a200b3703002019200a3703d002201920093703c802201920083703c002201da741046a201941c0026a1020201c41606a22182400201a20181012201b201d20182903007da741246a101b0b201941e0026a24000bbd0301037f23004180016b2209210a200924000240200520017d421f56200620027d2005200154220bad7d22054200522005501b200720037d2205200b200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101b0b200941606a220b220924002001a7200b1023200941606a22092400200b2009101220092903002102200941106a2903002106200941086a2903002101200941186a2903002105200a41e0006a41086a41e0800441086a290300370300200a41e0006a41106a41e0800441106a290300370300200a41e0006a41186a41e0800441186a290300370300200a41002903e08004370360200a41e0006a200a41c0006a1012200a41c0006a41e001200a41206a103802402002200a290320427f85832006200a41206a41106a290300427f8583842001200a41206a41086a290300427f85832005200a41206a41186a290300427f85838484500d0041004100101b0b200b200a10122000200a41106a2903003703102000200a41086a2903003703082000200a290300370300200041186a200a41186a290300370300200a4180016a24000ba00303027f047e037f230041e0006b220121022001240002400240102e0d004200210342e000210442002105420021060c010b102e210741e08104200241206a1012024020022903202007ad22035a4101200241206a41086a290300501b4101200241206a41106a290300200241206a41186a29030084501b0d00200241c0006a41186a428080808090ee9ea4ce003703002002420037035020024200370348200242003703404100200241c0006a1020410441c100102141004124101b0b200141606a22012208240041c00020011023200841606a2208220924002001200810122008290300200841086a290300200841106a290300200841186a2903002003421f7c42e0ffffff1f83220342207c220420042003542208ad20084100200420035a1bad4200103f2001101520071021200120021012200941606a22082400200120081012200828020041206a4100102e102b200241186a2903002106200241106a2903002105200241086a2903002103200229030021040b200020043703002000200337030820002005370310200041186a2006370300200241e0006a24000bea0201017f41c0004180011021024010184104490d00024002400240024002401017220041a693ff0f4a0d000240200041c4d397cc7e4a0d00200041db9697ed78460d02200041c1b6e2ae79460d03200041e5e8b2917a470d0610510c060b02402000418ac7f7977f4a0d00200041c5d397cc7e460d04200041aa8689927f470d0610530c060b2000418bc7f7977f460d042000418eabf707470d05103d0c050b024002400240024002400240200041d585cbf5024a0d0002402000419be8a4f4004a0d00200041a793ff0f460d0220004183bcf737470d0b10400c0b0b2000419ce8a4f400460d02200041fabffffb01470d0a10450c0a0b0240200041a5b1c08a074a0d00200041d685cbf502460d03200041f4e7c9f004470d0a104b0c0a0b200041a6b1c08a07460d03200041e9e7c49807460d040c090b103e0c080b10410c070b10480c060b104d0c050b104e0c040b104f0c030b10500c020b10520c010b10540b41004100101b0b0400105d0b040010340bc41905047f047e017f067e017f230041e0006b2200210120002400418001101e1a0240101a450d0041004100101b0b200041606a220022022400200041186a42003703002000420037031020004200370308200042c00137030041c0002000102041e00041271021200241606a220022022400200041186a420037030020004200370310200042003703082000420037030041800120001020200241606a220022022400200041186a4280dcbd9ba7cdcbbee40037030020004200370310200042003703082000420037030041a00120001020200241606a220022022400200041186a4200370300200042003703102000420037030820004202370300200241606a220222032400200020021013200341606a220022032400200220001025200141c0006a2000290300200041086a290300200041106a290300200041186a290300103b0240200129034022044220544100200141c0006a41086a2903002205501b4100200141c0006a41106a2903002206200141c0006a41186a290300220784501b0d00410041021021200341606a2208220024004100412020081026200041606a220022022400200820001012200041186a2903002109200041106a290300210a200041086a290300210b2000290300210c200241606a220022022400200041186a200720062004421f7c220d200454220320052003ad7c220e200554200d20045a1bad7c2204200654ad7c370300200020043703102000200e3703082000200d370300200241606a2202220324002000410520021039200241186a2903002107200241106a290300210620022903002105200241086a290300210d200341606a220022032400200820001012200c42027c2204200b2004200c542202ad7c220e200a2002200e200b542004200c5a1bad7c220420092004200a54ad7c20052000290300220c7c2205200d200041086a29030022047c2005200c542202ad7c22052006200041106a290300220c7c22062002200520045420052004511bad7c22042007200041186a2903007c2006200c54ad7c2004200654ad7c103c0b410041021021200341606a2202220024004100412020021026200041606a2200220324004180012000102220002903002104200041086a2903002105200041106a2903002106200041186a290300210c200341606a220022032400200041186a200c370300200020063703102000200537030820002004370300200220001024200341606a22002203240020022000101220002903002104200041086a2903002105200041186a2903002107200041106a2903002106200341606a22002202240020002005200442017c220c2004542203ad7c220a3703082000200c370300200020062003200a200554200c20045a1bad7c2204370310200041186a20072004200654ad7c370300200241606a220822022400200020081013200241606a22022200240041a00120021023200041606a220022032400200041186a42807e370300200042003703102000420037030820004200370300200341606a2203220f2400200020031013200f41606a2200220f24002002200320001037200f41606a220222032400200341606a2203220f2400200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a2900003700002003200029000037000020032002101220022903002104200241086a2903002105200241106a2903002106200241186a290300210c200f41606a220022022400200041186a200c370300200020063703102000200537030820002004370300200820001024200241606a220022022400200041186a4200370300200042003703102000420037030820004202370300200241606a220222032400200020021013200341606a220022032400200041186a42003703002000420037031020004200370308200042cf00370300200220001024200341606a22022200240020021019024020021036450d00200041606a22022200240041c00020021023200210152103200041606a220022082400200041186a4280808080f0beefa71e370300200042003703102000420037030820004200370300200320001020200841606a220822002400200220081012200828020041046a4100102120034124101b0b200041606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a220222032400200020021013200341606a22002203240020022000102520002903002106200041086a290300210c200041106a2903002104200041186a2903002105200341606a22022200240020021019200041606a22002203240020022000101220002903002107200041086a290300210a200041106a290300210b200041186a290300210d200341606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a220222032400200020021013200341606a220022032400200041186a200d2005843703002000200b200442808080807083843703102000200a37030820002007370300200220001024200341606a22022200240020021019200041606a220022032400200041186a2005370300200020043703102000200c37030820002006370300200341606a2203220824002000200310134100410041c08704200320021028200841606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a220222032400200020021013200341606a220022032400200220001025200141206a2000290300200041086a290300200041106a290300200041186a290300103b0240200129032022044220544100200141206a41086a2903002205501b4100200141206a41106a2903002206200141206a41186a290300220c84501b0d00410041041021200341606a2208220024004100412020081026200041606a220022022400200820001012200041186a290300210a200041106a290300210b200041086a290300210d20002903002109200241606a220022022400200041186a200c20062004421f7c2207200454220320052003ad7c220e200554200720045a1bad7c2204200654ad7c370300200020043703102000200e37030820002007370300200241606a2202220324002000410520021039200241186a290300210c200241106a290300210620022903002104200241086a2903002105200341606a2200220324002008200010122009200d200b200a2004200029030022077c220e2005200041086a29030022047c200e2007542202ad7c22052006200041106a29030022077c22062002200520045420052004511bad7c2204200c200041186a2903007c2006200754ad7c2004200654ad7c103c0b200341606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a220222032400200020021013200341606a220022032400200041186a42a0cab58bf688c8bccd0037030020004280808098d7ad99bac900370310200042003703082000421a370300200220001024200341606a220022022400200041186a4200370300200042003703102000420037030820004205370300200241606a220222032400200020021013200341606a22002203240020022000102520012000290300200041086a290300200041106a290300200041186a290300103b0240200129030022044220544100200141086a2903002205501b4100200141106a2903002206200141186a290300220c84501b0d00410041051021200341606a2208220024004100412020081026200041606a220022022400200820001012200041186a290300210a200041106a290300210b200041086a290300210d20002903002109200241606a220022022400200041186a200c20062004421f7c2207200454220320052003ad7c220e200554200720045a1bad7c2204200654ad7c370300200020043703102000200e37030820002007370300200241606a2202220324002000410520021039200241186a290300210c200241106a290300210620022903002104200241086a2903002105200341606a2200220324002008200010122009200d200b200a2004200029030022077c220e2005200041086a29030022047c200e2007542202ad7c22052006200041106a29030022077c22062002200520045420052004511bad7c2204200c200041186a2903007c2006200754ad7c2004200654ad7c103c0b200341606a220022022400200041186a4200370300200042003703102000420037030820004205370300200241606a220222032400200020021013200341606a220022032400200041186a42e5da85bbc4eedcb2d4003703002000428080b0fba6acdbbcd300370310200042003703082000421c370300200220001024200341606a2200240041c000200010234100101c210220001015220041f0900520026b4104101d200041041027200141e0006a24000b0600103010600b0b85051800418080040b546f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c65640063616c6c206661696c65642077697468206e6f207265766572742064617461000000ffffffff0041fc80040b04ffffffff00419c81040b04ffffffff0041b881040b08ffffffffffffffff0041d881040b08ffffffffffffffff0041f881040b08ffffffffffffffff00419882040b08ffffffffffffffff0041b882040b08ffffffffffffffff0041d882040b08ffffffffffffffff0041f482040b2cffffffffffffffffffffffff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00041b883040b28ffffffffffffffff17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c310041f883040b08ffffffffffffffff00419484040bac01ffffffffffffffffffffffff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e04a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f624a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f620041dc85040b04bc197c810041fc85040b04ffffffff00419c86040b04bc197c810041bc86040b04ffffffff0041dc86040b04f23a6e610041fc86040b04ffffffff00419c87040b04f23a6e610041bc87040b24ffffffff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00041d890040b01010041de90040b0502000000030041ea90040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600a11f046e616d6501f21e62000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030c67657443616c6c56616c75650406726576657274050666696e697368060b676574436f646553697a650708636f6465436f7079081873746f7261676553746f72654c6974746c65456e6469616e091773746f726167654c6f61644c6974746c65456e6469616e0a096b656363616b3235360b0c656d69744c6f674576656e740c1167657452657475726e4461746153697a650d0e72657475726e44617461436f70790e0c63616c6c436f6e74726163740f0a6765744761734c656674101367657445787465726e616c436f646553697a6511115f5f7761736d5f63616c6c5f63746f7273121a753235365f66726f6d5f6269675f656e6469616e5f62797465731318753235365f746f5f6269675f656e6469616e5f6279746573141f6933325f746f5f627974657333325f6269675f656e6469616e5f6279746573151b6933325f66726f6d5f6269675f656e6469616e5f62797465733332161c777261707065725f63616c6c646174616c6f61645f62797465733332171e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f721815777261707065725f63616c6c646174615f73697a65190e777261707065725f63616c6c65721a1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f1b0e777261707065725f7265766572741c1365766d5f6765745f6d656d6f72795f616464721d10777261707065725f636f6465636f70791e14777261707065725f6d656d6f72795f67756172641f16777261707065725f6d73746f72655f627974657333322013777261707065725f6d73746f72655f753235362112777261707065725f6d73746f72655f7533322212777261707065725f6d6c6f61645f753235362315777261707065725f6d6c6f61645f62797465733332242f777261707065725f7373746f72655f753235365f7573696e675f6c6974746c655f656e6469616e5f686f7374617069252e777261707065725f736c6f61645f753235365f7573696e675f6c6974746c655f656e6469616e5f686f73746170692611777261707065725f6b656363616b323536270e777261707065725f72657475726e280c777261707065725f6c6f6733290c777261707065725f6c6f67342a0f77726974655f63616c6c5f646174612b17777261707065725f72657475726e646174615f636f70792c15777261707065725f63616c6c5f636f6e74726163742d0b777261707065725f6761732e17777261707065725f72657475726e646174615f73697a652f15777261707065725f63616c6c646174615f636f707930137365745f69735f6465706c6f79696e675f74783114777261707065725f657874636f64655f73697a653211777261707065725f646174615f636f7079331d777261707065725f63616c6c646174615f73697a655f6d696e75735f34340f5f5f696e69745f65766d5f686561703512777261707065725f627974657333325f65713616777261707065725f627974657333325f69737a65726f3713777261707065725f627974657333325f616e643810777261707065725f753235365f73686c3910777261707065725f753235365f7368723a13777261707065725f627974657333325f6164643b394d79455243313135355f34383535332e4d79455243313135355f34383535332e657874726163745f627974655f61727261795f6c656e6774683c3a4d79455243313135355f34383535332e4d79455243313135355f34383535332e636c6561725f73746f726167655f72616e67655f6279746573313d484d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f62616c616e63654f663e504d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f737570706f727473496e746572666163653f454d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e40434d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f6e616d6541424d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f75726942594d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e61727261795f616c6c6f636174696f6e5f73697a655f61727261795f75696e743235365f64796e434e4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e6162695f6465636f64655f61727261795f75696e743235365f64796e44424d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e6162695f6465636f64655f627974657345484d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f6d696e74426174636846404d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f636865636b4f776e657247544d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f75706461746557697468416363657074616e6365436865636b5f3533383648544d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f7361666542617463685472616e7366657246726f6d494f4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f75706461746557697468416363657074616e6365436865636b4a594d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e6162695f656e636f64655f61727261795f75696e743235365f64796e5f6d656d6f72795f7074724b4d4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f62616c616e63654f6642617463684c444d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f62616c616e63654f6642617463684d504d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f72656e6f756e63654f776e6572736869704e434d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f6d696e744f444d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f6f776e657250454d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f73796d626f6c51504d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f736574417070726f76616c466f72416c6c524f4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f6973417070726f766564466f72416c6c534f4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f736166655472616e7366657246726f6d54504d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e65787465726e616c5f66756e5f7472616e736665724f776e65727368697055574d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e6d656d6f72795f61727261795f696e6465785f6163636573735f75696e743235365f64796e56454d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e636865636b65645f6164645f75696e7432353657574d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f636865636b4f6e45524331313535426174636852656365697665645f313037353858524d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f636865636b4f6e4552433131353552656365697665645f313037353959514d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f636865636b4f6e45524331313535426174636852656365697665645a4c4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e66756e5f636865636b4f6e4552433131353552656365697665645b4e4d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e6162695f6465636f64655f6279746573345f66726f6d4d656d6f72795c444d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e657874726163745f72657475726e646174615d364d79455243313135355f34383535335f6465706c6f7965642e4d79455243313135355f34383535335f6465706c6f7965642e696e69745e0463616c6c5f065f737461727460244d79455243313135355f34383535332e4d79455243313135355f34383535332e696e697461066465706c6f79071201000f5f5f737461636b5f706f696e74657209110200072e726f6461746101052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc20_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc20_wasm.hex new file mode 100644 index 000000000..5deadf927 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc20_wasm.hex @@ -0,0 +1 @@ +00007eca0061736d01000000012e086000017f60037f7f7f0060017f0060027f7f0060077f7f7f7f7f7f7f0060000060017f017f60057f7f7f7f7f0002e8010c03656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e761873746f7261676553746f72654c6974746c65456e6469616e000303656e761773746f726167654c6f61644c6974746c65456e6469616e000303656e76096b656363616b323536000103656e760c656d69744c6f674576656e740004032a2905030306030000020003060106030303030303030103070500000100020001050601010105050505050405017001010105030100010608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000c0463616c6c0031066465706c6f7900340aabdf012902000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190b2800200028001c220041187420004180fe03714108747220004108764180fe0371200041187672720bb40a01057f024041002802f480022202417f4a0d004100100022023602f480020b0240024002400240200041206a20024d0d002002210302402002417f4a0d004100100022033602f480020b200220006b21040240200341e500480d0020012000200410010c020b024041002d009484020d0041b08302410020031001410041013a009484020b2004450d02200041b083026a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d004100100022023602f480020b0240200241e500480d0020012000412010010f0b024041002d009484020d0041b08302410020021001410041013a009484020b2001200041b083026a2d00003a00002001200041b183026a2d00003a00012001200041b283026a2d00003a00022001200041b383026a2d00003a00032001200041b483026a2d00003a00042001200041b583026a2d00003a00052001200041b683026a2d00003a00062001200041b783026a2d00003a00072001200041b883026a2d00003a00082001200041b983026a2d00003a00092001200041ba83026a2d00003a000a2001200041bb83026a2d00003a000b2001200041bc83026a2d00003a000c2001200041bd83026a2d00003a000d2001200041be83026a2d00003a000e2001200041bf83026a2d00003a000f2001200041c083026a2d00003a00102001200041c183026a2d00003a00112001200041c283026a2d00003a00122001200041c383026a2d00003a00132001200041c483026a2d00003a00142001200041c583026a2d00003a00152001200041c683026a2d00003a00162001200041c783026a2d00003a00172001200041c883026a2d00003a00182001200041c983026a2d00003a00192001200041ca83026a2d00003a001a2001200041cb83026a2d00003a001b2001200041cc83026a2d00003a001c2001200041cd83026a2d00003a001d2001200041ce83026a2d00003a001e2001200041cf83026a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b8308010d7f230041106b2200240041002101024041002802f480022202417f4a0d004100100022023602f480020b02402002450d000240200241034b0d00410021032000410036020c024041002d009484020d0041b08302410020021001410041013a009484020b024002400240200241044f0d0041b0830221012000410c6a21040c010b2002417c71220341b083026a21012000410c6a20036a21044100210503402000410c6a20056a200541b083026a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f4a0d004100100022023602f480020b02400240200241e500480d00200041086a4100410410010c010b024041002d009484020d0041b08302410020021001410041013a009484020b200041002802b083023602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f024041002802f480022200417f4a0d004100100022003602f480020b20000b17002000410c6a100220004100360208200042003702000b4402017f047e230041206b220024002000100320002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b1000410028029c840220006a200110040b0c00410028029c840220006a0bb60501037f0240024041002802a884022203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602a48402410020054180807c713602a88402410041002802a0840220034110746a3602a084020c010b41002802a4840220044f0d00410020043602a484020b410028029c8402220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100622044f0d0020002001200210070f0b0240200441004a200120046b2204200148470d00024041002802f480022201417f4a0d004100100022013602f480022001417f4a0d004100100022013602f480020b0240200141e500480d0020002004200210010c020b024041002d009484020d0041b08302410020011001410041013a009484020b2002450d01200441b083026a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802a88402220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602a48402410020024180807c713602a88402410041002802a0840220014110746a3602a0840241e0000f0b024041002802a4840220004f0d00410020003602a484020b41e0000b920401037f0240200041206a22022000480d000240024041002802a88402220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602a48402410020044180807c713602a88402410041002802a0840220034110746a3602a084020c010b41002802a4840220024f0d00410020023602a484020b410028029c840220006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802a88402220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602a48402410020074180807c713602a88402410041002802a0840220014110746a3602a084020c010b41002802a4840220024f0d00410020023602a484020b410028029c840220006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802a88402220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602a48402410020044180807c713602a88402410041002802a0840220034110746a3602a084020c010b41002802a4840220024f0d00410020023602a484020b410028029c840220006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000bcc02002001410028029c840220006a22002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b9103002001410028029c840220006a22002d00003a0000200120002d00013a0001200120002d00023a0002200120002d00033a0003200120002d00043a0004200120002d00053a0005200120002d00063a0006200120002d00073a0007200120002d00083a00082001200041096a2d00003a000920012000410a6a2d00003a000a20012000410b6a2d00003a000b20012000410c6a2d00003a000c20012000410d6a2d00003a000d20012000410e6a2d00003a000e20012000410f6a2d00003a000f2001200041106a2d00003a00102001200041116a2d00003a00112001200041126a2d00003a00122001200041136a2d00003a00132001200041146a2d00003a00142001200041156a2d00003a00152001200041166a2d00003a00162001200041176a2d00003a00172001200041186a2d00003a00182001200041196a2d00003a001920012000411a6a2d00003a001a20012000411b6a2d00003a001b20012000411c6a2d00003a001c20012000411d6a2d00003a001d20012000411e6a2d00003a001e20012000411f6a2d00003a001f0b08002000200110080b08002000200110090b1200410028029c840220006a20012002100a0b1000410028029c840220006a200110050b1a00410028029c840220006a200141032002200320044100100b0b0b00410041013a00a083020b5101027f41002d00a08302210010062101024020000d0020010f0b024041002802f480022200417f4a0d004100100022003602f480020b02402000410048200120006a2200200148470d0020000f0b00000b040010060bd00201037f0240024041002802a884022203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602a48402410020054180807c713602a88402410041002802a0840220034110746a3602a084020c010b41002802a4840220044f0d00410020043602a484020b02402002450d00410028029c8402220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d00200141786a21010340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a00072001450d01200141786a2101200041086a2100200441086a21040c000b0b0b2501017f024041002802f480022200417f4a0d004100100022003602f480020b2000417c6a0b0b00410020003602a483020b090041002802a483020bb50d09017f037e017f027e027f027e017f017e017f230041b0026b2203240002400240200029030c22044200520d0020002903144200520d00200028021c0d0041a08002412410040c010b0240200129030c4200520d0020012903144200520d00200128021c0d0041d08002412410040c010b20034188026a420037030020034180026a4200370300200341f8016a4200370300200342003703f00120032004423888a73a00e30120032004423088a73a00e20120032004422888a73a00e10120032004422088a73a00e00120032004421888a73a00df0120032004421088a73a00de0120032004420888a73a00dd0120032004a73a00dc01200320002d00003a00d001200320002f00013b00d101200320002900033700d301200320002d000b3a00db01200320002d00143a00e401200320002900153700e501200320002f001d3b00ed01200320002d001f3a00ef01200341d0016a41c00020034190026a100a20034190026a200341b0016a1009024020032903b00122052002290018220442388620044280fe0383422886842004428080fc0783421886200442808080f80f834208868484200442088842808080f80f832004421888428080fc07838420044228884280fe0383200442388884848422065a200341b0016a41086a22072903002208200231001720023100164208868420023100154210868420023100144218868420023100134220868420023100124228868420023100114230868420023100104238868422095a2008200951220a1b200341b0016a41106a220b290300220c200231000f200231000e42088684200231000d42108684200231000c42188684200231000b42208684200231000a42288684200231000942308684200231000842388684220d5a200341b0016a41186a220e29030022042002310007200231000642088684200231000542108684200231000442188684200231000342208684200231000242288684200231000142308684200231000042388684220f5a2004200f511b200c200d852004200f8584501b0d00200341a0016a410036020020034198016a42003703002003420037039001200341e4a1cde678360240200320002f00003b0144200320002900023701462003200029000a37014e20032000280012360156200320002f00163b015a200320002d00183a005c200320002d00193a005d200320054220883c007f200320054228883c007e200320054230883c007d200320054238883c007c200320084220883c0077200320084228883c0076200320084230883c0075200320084238883c0074200320002f001a3b015e2003200028001c3602602003200c4220883c006f2003200c4228883c006e2003200c4230883c006d2003200c4238883c006c20032005a722003a008301200320004108763a008201200320004110763a008101200320004118763a00800120032008a722003a007b200320004108763a007a200320004110763a0079200320004118763a0078200320044220883c0067200320044228883c0066200320044230883c0065200320044238883c00642003200ca722003a0073200320004108763a0072200320004110763a0071200320004118763a007020032004a722003a006b200320004108763a006a200320004110763a0069200320004118763a0068200320022d00003a008401200320022800013600850120032002290005370089012003200229000d370091012003200229001537009901200320022f001d3b00a101200320022d001f3a00a301200341c0006a41e40010040c010b200341c0006a41186a2004200f7d200c200d54ad7d200c200d7d2204200520065422102008200954200a1bad220c54ad7d3703002003200520067d3703402003200820097d2010ad7d37034820032004200c7d37035020034190026a200341c0006a1008200320012d00003a00d001200320012800013600d101200320012900053700d5012003200129000d3700dd01200320012900153700e501200320012f001d3b00ed01200320012d001f3a00ef01200341d0016a41c00020034190026a100a20034190026a200341b0016a100920072903002104200320032903b001220820067c220c3703202003200420097c200c2008542207ad7c22083703282003200b2903002205200d7c220c2007200820045420082004511bad7c2204370330200341206a41186a200e290300200f7c200c200554ad7c2004200c54ad7c37030020034190026a200341206a1008200341186a41002903988002370300200341106a410029039080023703002003410029038880023703082003410029038080023703002002412041032003200020014100100b0b200341b0026a24000b7e01027f024041002d009884020d00024002403f0022004102490d004100200041107436029c8402410140001a3f004110742200410028029c84026b21010c010b410041b0840236029c840241b0840321004180800121010b410020003602a08402410020013602a88402410041013a00988402410041003602a484020b0b3301017f41002101024020002903004200520d0020002903084200520d0020002903104200520d0020002903185021010b20010b4200200220012903002000290300833703002002200129030820002903088337030820022001290310200029031083370310200220012903182000290318833703180bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000bf94606037f047e037f0c7e017f047e230041e0006b220021012000240041800110181a41c00041e000101b024010124104490d0002400240024002400240024002400240024002401011220241dc9bd8c0014a0d000240200241bdda8beb7d4a0d00200241c1b6e2ae79460d07200241bbb996c87a470d0b02401014450d004100410010150b02401027413f4b0d004100410010150b4104200110102001200141c0006a100d200141c8006a2903002103200141d0006a2903002104200141c0006a41186a290300210520012903402106200041606a22022200240020021013200041606a220022072400200041186a2005370300200020043703102000200337030820002006370300200741606a22072208240020002007100e200841606a220022082400412420001010200220072000102a200841606a2200240041c0002000101d2000100f22004101101b2000412010210c0b0b200241beda8beb7d460d0720024183bcf737460d01200241b3cffaca00470d0a02401014450d004100410010150b02401027413f4b0d004100410010150b4104200110102001200141c0006a100d200141c0006a41186a2903002103200141c0006a41106a2903002104200141c0006a41086a290300210520012903402106200041606a220022022400412420001010200241606a2207220224002007101302402007102c450d00200241606a22082202240041c0002008101d200241606a220222072400200741606a220722092400200741186a41a0810241186a290300370000200741106a41a0810241106a290300370000200741086a41a0810241086a290300370000200741002903a0810237000020072002100d2002290300210a200241086a290300210b200241106a290300210c200241186a290300210d200941606a220222072400200241186a200d3703002002200c3703102002200b3703082002200a370300200741606a220722092400200241e0012007102e2007290300210a200741086a290300210b200741106a290300210c200741186a290300210d2008100f2107200941606a220222092400200241186a200d3703002002200c3703102002200b3703082002200a37030020072002101a200941606a22092202240020082009100d200928020041046a4100101b2007412410150b024020062004842005200384844200520d00200241606a22072202240041c0002007101d2007100f2108200241606a220222092400200241186a4280808080a0ac8394947f37030020024200370310200242003703082002420037030020082002101a200941606a22092202240020072009100d200928020041046a4100101b2008412410150b200241606a2202220724002002101341002002101941204101101b200741606a220722022400410041c00020071020200241606a220222082400200241186a200337030020022004370310200220053703082002200637030041002002101a412020071019200841606a220822022400410041c00020081020200241606a220222072400200741606a220722092400200741186a200041186a290000370000200741106a200041106a290000370000200741086a200041086a2900003700002007200029000037000020072002100d2002290300210a200241086a290300210b200241106a290300210c200241186a290300210d200941606a220222072400200241186a200d3703002002200c3703102002200b3703082002200a37030020082002101e200741606a22022207240041c0002002101d2002100f220820001019200741606a22022200240020021013200041606a220022072400200041186a2003370300200020043703102000200537030820002006370300200741606a22072209240020002007100e2008412041c08102200220071022200941606a2200240041c0002000101d2000100f22004101101b2000412010210c0a0b0240200241e6caf389034a0d00200241dd9bd8c001460d02200241dde5e19d02470d0a02401014450d004100410010150b0240102741df004b0d004100410010150b4104200110102001200141c0006a100d200141c0006a41086a22022903002104200141c0006a41106a22072903002105200141c0006a41186a220829030021062001290340210a4124200110102001200141c0006a100d2008290300210e2007290300210f2002290300211020012903402111200041606a22022200240041c40020021010200041606a220022072400200041186a200637030020002005370310200020043703082000200a37030041002000101a41204101101b200741606a220022072400410041c00020001020200741606a22072208240020071013410020071019412020001019200841606a220822002400410041c00020081020200041606a22002207240020082000101f02402000290300220d200041106a290300220b83200041086a2903002203200041186a290300220c8383427f510d00200741606a22002207240020022000100d0240200d2000290300542003200041086a29030022125420032012511b200b200041106a290300221354200c200041186a290300221254200c2012511b200b201385200c20128584501b450d00200741606a22082200240041c0002008101d2008100f2109200041606a220022072400200041186a4280808080a0b6d0c77b37030020004200370310200042003703082000420037030020092000101a200741606a22002207240020082000100d20002903002112200741606a220022072400200010132000200141c0006a100d20022001100d2012a7220041046a200141c0006a101a200141206a41186a200c3703002001200b370330200120033703282001200d370320200041246a200141206a101a200041c4006a2001101a200741606a22002207240020082000100d2009201220002903007da741e4006a10150b0240200a2005842004200684844200520d00200741606a22082200240041c0002008101d200041606a220022072400200741606a220722092400200741186a41e0810241186a290300370000200741106a41e0810241106a290300370000200741086a41e0810241086a290300370000200741002903e0810237000020072000100d20002903002112200041086a2903002113200041106a2903002114200041186a2903002115200941606a220022072400200041186a2015370300200020143703102000201337030820002012370300200741606a220722162400200041e0012007102e20072903002112200741086a2903002113200741106a2903002114200741186a29030021152008100f2109201641606a220022072400200041186a201537030020002014370310200020133703082000201237030020092000101a200741606a22002207240020082000100d200028020041046a4100101b2009412410150b200741606a2207220024002007101302402007102c450d00200041606a22072200240041c0002007101d2007100f2108200041606a220022092400200041186a4280808080a0ac8394947f37030020004200370310200042003703082000420037030020082000101a200941606a22092200240020072009100d200928020041046a4100101b2008412410150b200041606a220022072400200041186a200637030020002005370310200020043703082000200a37030041002000101a41204101101b200741606a220022072400410041c00020001020200741606a22072208240020071013410020071019412020001019200841606a220822002400410041c00020081020200041606a22002207240020022000100d200041086a290300211220002903002113200041106a2903002114200041186a2903002115200741606a2200220724002000200b20147d2217200d2013542209200320125420032012511bad22187d3703102000200320127d2009ad7d3703082000200d20137d370300200041186a200c20157d200b201454ad7d2017201854ad7d37030020082000101e0b200741606a220022072400200041186a200637030020002005370310200020043703082000200a370300200741606a22072208240020002007100e200841606a220022082400200041186a200e3703002000200f3703102000201037030820002011370300200841606a22082209240020002008100e200720082002102a200941606a2200240041c0002000101d2000100f22004101101b2000412010210c0a0b200241e7caf38903460d02200241999e848604460d03200241b184828507460d040c090b02401014450d004100410010150b10271a200041606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a22022207240020002002100e200741606a22002207240020022000101f20002903002103200041086a2903002106200041106a290300210a200041186a290300210b200741606a220022022400200041186a200b3703002000200a3703102000200637030820002003370300200241606a220222072400200041012002102f02402003a74101712002290300220542ff0083200520034201832204501b2215421f56420020047d2205200241086a29030083220f420052200f501b2005200241106a2903008322104200522005200241186a29030083220d420052200d501b2010200d84501b460d00200741606a220022072400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044122101b4100412410150b200741606a220022072400200041186a200d370300200020103703102000200f3703082000201537030041e0002000101a024020044200520d00200741606a220022022400200041186a200b3703002000200a370310200020063703082000200342807e833703004180012000101a200241606a220022022400200041186a4200370300200042003703102000420037030820002015201084200f200d8484420052ad370300200241606a220222072400200041052002102e200241186a290300200241106a2903002206200229030022054280017c22042005542200200241086a290300220a2000ad7c2203200a54200420055a1bad7c2205200654ad7c21060c080b41004103101b02402015201084200f200d848450450d0042002103428001210442002105420021060c080b4280f8e4f2e9c1d6ab42210e42a8b6cbf89299feac79210442d08594d8a3abcee1e900210542dbf0c7fbc6c8c592de0021034200210641800121024200210a4200210b4200210c0340200741606a220022072400200041186a200e370300200020043703102000200537030820002003370300200741606a22072208240020002007100e200841606a22002208240020072000101f20002903002112200041086a2903002111200041106a2903002113200041186a2903002114200841606a220022072400200041186a201437030020002013370310200020113703082000201237030020022000101a200e2004200342017c2212200354220020052000ad7c2211200554201220035a1bad7c2213200454ad7c210e200241206a21022012210320112105201321042006221242207c2206201554200a221120062012542200ad7c220a200f54200a200f511b200b22132000200a201154200620125a1bad7c220b201054200c2214200b201354ad7c220c200d54200c200d511b200b201085200c200d8584501b0d000b20142013201242a0017c2204201254220020112000ad7c2203201154200420125a1bad7c2205201354ad7c21060c070b02401014450d004100410010150b10271a200041606a220022022400200041186a4200370300200042003703102000420037030820004202370300200241606a22022207240020002002100e200741606a22002207240020022000101f20002903002103200041086a2903002104200041106a2903002105200041186a2903002106200741606a22002207240041c0002000101d2000100f2102200741606a22002400200041186a200637030020002005370310200020043703082000200337030020022000101a2002412010210c070b02401014450d004100410010150b10271a200041606a2200240041c0002000101d2000100f22004112101b2000412010210c060b02401014450d004100410010150b02401027413f4b0d004100410010150b4104200110102001200141c0006a100d200141c0006a41106a2903002105200141c0006a41186a2903002106200141c0006a41086a290300210a2001290340210b200041606a2202220024004124200210100240200b200584200a200684844200520d00200041606a22082200240041c0002008101d200041606a220022072400200741606a220722092400200741186a4180820241186a290300370000200741106a4180820241106a290300370000200741086a4180820241086a29030037000020074100290380820237000020072000100d20002903002103200041086a2903002104200041106a290300210c200041186a290300210d200941606a220022072400200041186a200d3703002000200c3703102000200437030820002003370300200741606a220722092400200041e0012007102e20072903002103200741086a2903002104200741106a290300210c200741186a290300210d2008100f2107200941606a220022092400200041186a200d3703002000200c370310200020043703082000200337030020072000101a200941606a22092200240020082009100d200928020041046a4100101b2007412410150b200041606a220022072400200041186a4200370300200042003703102000420037030820004202370300200741606a22072208240020002007100e200841606a22002208240020072000101f200041186a2903002103200041106a290300210c20002903002104200041086a290300210d200841606a22002207240020022000100d0240200420042000290300220f7c220e58200d200d200041086a29030022127c200e200f542208ad7c220458200d2004511b200c200c200041106a29030022107c220f2008200420125420042012511bad7c220d5820032003200041186a2903007c200f201054ad7c200d200f54ad7c22125820032012511b200c200d85200320128584501b0d00200741606a220022072400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044111101b4100412410150b200741606a220022072400200041186a4200370300200042003703102000420037030820004202370300200741606a22072208240020002007100e200841606a220022082400200041186a20123703002000200d370310200020043703082000200e37030020072000101e200841606a220022072400200041186a2006370300200020053703102000200a3703082000200b37030041002000101a41204100101b200741606a220722002400410041c00020071020200041606a22002208240020072000101f200041186a2903002112200041106a290300210d2000290300210e200041086a290300210f200841606a22002208240020022000100d200041086a290300210320002903002104200041186a2903002110200041106a290300210c200841606a22002208240020002003200f7c2004200e7c220e2004542209ad7c22043703082000200e3703002000200c200d7c220d2009200420035420042003511bad7c2203370310200041186a201020127c200d200c54ad7c2003200d54ad7c37030020072000101e200841606a22002207240041c0002000101d2000100f220820021019200741606a220022022400200041186a4200370300200042003703102000420037030820004200370300200241606a22022207240020002002100e200741606a220022072400200041186a2006370300200020053703102000200a3703082000200b370300200741606a2207240020002007100e2008412041a082022002200710224100410010210c050b02401014450d004100410010150b02401027411f4b0d004100410010150b4104200110102001200141c0006a100d200141c0006a41086a2903002103200141c0006a41106a350200210420012903402105200041606a220022022400200041186a420037030020002004370310200020033703082000200537030041002000101a41204100101b200241606a220222002400410041c00020021020200041606a22002207240020022000101f20002903002103200041086a2903002104200041106a2903002105200041186a2903002106200741606a22002207240041c0002000101d2000100f2102200741606a22002400200041186a200637030020002005370310200020043703082000200337030020022000101a2002412010210c040b02401014450d004100410010150b10271a200041606a22082200240041c0002008101d200041606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a22022207240020002002100e200741606a22002207240020022000101f20002903002103200041086a2903002106200041106a290300210a200041186a290300210b200741606a220022022400200041186a200b3703002000200a3703102000200637030820002003370300200241606a220222072400200041012002102f02402003a74101712002290300220542ff0083200520034201832204501b2218421f56420020047d2205200241086a2903008322134200522013501b2005200241106a2903008322144200522005200241186a2903008322124200522012501b2014201284501b460d00200741606a220022072400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044122101b4100412410150b2008100f2102200741606a220022072400200041186a201237030020002014370310200020133703082000201837030020022000101a200741606a220022022400024020044200520d0020082000100d20002802002107200241606a220022022400200041186a200b3703002000200a370310200020063703082000200342807e83370300200741206a2000101a200241606a220022022400200041186a4200370300200042003703102000420037030820002018201484201320128484420052ad370300200241606a220222072400200041052002102e200241186a2903002103200241106a290300210420022903002106200241086a290300210a200741606a22002202240020082000100d2003200041186a2903007c2004200041106a29030022037c2205200354ad7c20052006200029030022047c22032004542207200a200041086a29030022067c2007ad7c220420065420042006511bad7c220c200554ad7c21150c020b42002105200042003703102000420037030820004204370300200041186a420037030041002000101a02400240201820148420132012848450450d004200210a4200210b420021060c010b429af0ff8abc9feb9a8a7f210e42f293dcfec4a69fd739210c42c6cbb1d4ca9680c38e7f210d429ba3af9bfecfffa5b67f2103420021044200210f42002110420021060340200241606a22002202240020082000100d20002903002105200241606a220022022400200041186a200e3703002000200c3703102000200d37030820002003370300200241606a22022207240020002002100e200741606a22002207240020022000101f2000290300210a200041086a290300210b200041106a2903002111200041186a2903002115200741606a220022022400200041186a2015370300200020113703102000200b3703082000200a370300200520047ca741206a2000101a2010200442207c22052004542200200f2000ad7c220a200f54200520045a1bad7c220b2010542100200e200c200342017c22112003542207200d2007ad7c2215200d54201120035a1bad7c2217200c54ad7c210e20052104200a210f200b2110201121032015210d2017210c2005201854200a201354200a2013511b200b20145420062000ad7c220620125420062012511b200b201485200620128584501b0d000b0b200241606a22002202240020082000100d200041186a29030020067c200041106a2903002203200b7c2206200354ad7c20062000290300220420057c22032004542207200041086a2903002205200a7c2007ad7c220420055420042005511bad7c220c200654ad7c21150c010b02401014450d004100410010150b02401027413f4b0d004100410010150b4104200110102001200141c0006a100d200141c0006a41086a22022903002103200141c0006a41106a22073502002104200129034021054124200110102001200141c0006a100d200229030021062007350200210a2001290340210b200041606a220022022400200041186a420037030020002004370310200020033703082000200537030041002000101a41204101101b200241606a220222002400410041c00020021020200041606a220022072400200041186a42003703002000200a370310200020063703082000200b37030041002000101a412020021019200741606a220222002400410041c00020021020200041606a22002207240020022000101f20002903002103200041086a2903002104200041106a2903002105200041186a2903002106200741606a22002207240041c0002000101d2000100f2102200741606a22002400200041186a200637030020002005370310200020043703082000200337030020022000101a2002412010210c020b200241606a22002202240020082000100d200041186a2903002117200041106a290300210d20002903002112200041086a2903002106200241606a22002202240020082000100d2000290300210e200041086a290300210a200041106a290300210f200041186a2903002118200241606a22002202240041c082022000100d20002903002119200041086a2903002110200041106a2903002111200041186a290300210b200241606a22002202240020082000100d02400240200e200320127d2213423f7c22144260837c2205201956200a200420067d20032012542207ad7d221220142013542209ad7c22197c2005200e542216ad7c220320105620032010511b200f200c200d7d220e2007200420065420042006511bad22107d221a20092019201254201420135a1bad7c22127c220420162003200a542003200a511bad7c22062011562018201520177d200c200d54ad7d200e201054ad7d2012201a54ad7c7c2004200f54ad7c2006200454ad7c2204200b562004200b511b20062011852004200b8584501b0d0020052000290300542003200041086a290300220a542003200a511b2006200041106a290300220b542004200041186a290300220a542004200a511b2006200b852004200a8584501b450d010b200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a410441c100101b4100412410150b200241606a220022022400200041186a200437030020002006370310200020033703082000200537030041c0002000101a200241606a2200240020082000100d200028020021022005a722004120101b20022001101d200041206a20011019200041c0006a200241206a2001100f10262001200141c0006a100d200129034020057ca741c0006a4100101b2001200141206a100d20002001280220411f6a41607141c0006a10210c010b200741606a220022022400418081022000100d20062005427f7c220a200554ad7c200a200442bf7f7c2205200454220720032007ad7c427f7c220420035420042003511bad7c2206200a54ad7c427f7c220d20062005426083220a42e0007c2203200a54220720042007ad7c220b2004542003200a5a1bad7c220c200654ad7c210502400240200a429f7f5641002004427f511b41002006200d83427f511b0d002003200029030056200b200041086a290300220456200b2004511b200c200041106a2903002206562005200041186a29030022045620052004511b200c200685200520048584501b450d010b200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a410441c100101b4100412410150b200241606a22002400200041186a20053703002000200c3703102000200b3703082000200337030041c0002000101a2003a722004120101b41e0002001101d200041206a20011019200041c0006a4180012001100f10262001200141c0006a100d200129034020037ca741c0006a4100101b2001200141206a100d20002001280220411f6a41607141c0006a10210b410041001015200141e0006a24000b040010300b0400102b0bdf4f0a037f057e017f017e057f017e017f057e017f027e23002200210141800110181a02401014450d004100410010150b1025210202401024ad22032002ad22047d2205421f7c2206426083220742a07f54410020062005542208ad2003200454ad22047d2209501b410020082009420020047d220354200620055a1bad20047d22062006200354ad20047d84501b0d00200041606a220822002400200841186a428080808090ee9ea4ce0037030020084200370310200842003703082008420037030041002008101a410441c100101b4100412410150b2007a741e0006a102841e00020022005a7101702402005421f562003420052220220035022081b2002200342005520081b2003200384501b0d004100410010150b200041606a220a2200240041e000200a101d1029220b41c0006a1028200041606a220022022400200041186a4200370300200042003703102000420037030820004204370300200b2000101a200241606a220022022400200041186a4280808080c08cdbb7c700370300200042003703102000420037030820004200370300200b41206a220c2000101a1029220d41c0006a1028200241606a220022022400200041186a4200370300200042003703102000420037030820004203370300200d2000101a200241606a220022022400200041186a4280808080808091a6c700370300200042003703102000420037030820004200370300200d41206a2000101a200241606a220e22002400200b200e101d200041606a220022022400200e2000100d0240200041086a290300504100200041106a290300200041186a29030084501b0d00200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a410441c100101b4100412410150b200241606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a22022208240020002002100e200841606a22002208240020022000101f20002903002103200041086a2903002105200041106a2903002104200041186a2903002106200841606a220022022400200041186a2006370300200020043703102000200537030820002003370300200241606a220222082400200041012002102f02402003a74101712002290300220542ff0083200520034201832203501b2207421f56420020037d2203200241086a29030083220f420052200f5022101b2003200241106a2903008322114200522003200241186a2903008322094200522009501b20112009845022021b460d00200841606a220022082400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044122101b4100412410150b02402007422054410020101b410020021b0d00200841606a220022022400200041186a420037030020004200370310200042003703082000420337030041002000101a200241606a2210220024004100412020101020200041606a220022022400200e2000100d20002903002103200041086a2903002105200041186a2903002112200041106a2903002104200241606a220022022400200020052003421f7c22062003542208ad7c2213370308200020063703002000200420082013200554200620035a1bad7c2203370310200041186a20122003200454ad7c370300200241606a220222082400200041052002102f200241186a2903002106200241106a290300211220022903002113200241086a2903002114200841606a22002202240020102000100d200041186a2903002115200041106a290300210520002903002104200041086a2903002103200241606a220022022400200e2000100d0240024020002903004220544100200041086a290300501b4100200041106a290300200041186a29030084501b0d00201520067c200520127c2212200554ad7c2012200420137c22052004542200200320147c2000ad7c220420035420042003511bad7c2206201254ad7c21030c010b200241606a22002202240020102000100d200041186a2903002103200041106a2903002106200041086a2903002104200029030021050b200241606a2200220224002000200f2007421f7c22122007542208ad7c2213370308200020123703002000201120082013200f54201220075a1bad7c2207370310200041186a20092007201154ad7c370300200241606a220222082400200041052002102f200241186a290300210f200241106a290300210920022903002107200241086a2903002111200841606a22002208240020102000100d20052007200029030022127c22145a20042011200041086a29030022077c20142012542202ad7c22125a20042012511b20062009200041106a29030022117c22092002201220075420122007511bad7c22135a2003200f200041186a2903007c2009201154ad7c2013200954ad7c22115a20032011511b2006201385200320118584501b0d000340200841606a220022022400200041186a2003370300200020063703102000200437030820002005370300200241606a22022208240020002002100e200841606a220022082400200041186a420037030020004200370310200042003703082000420037030020022000101e2006200542017c2207200554220020042000ad7c2209200454200720055a1bad7c220f20065421002007210520092104200f21062007201454200920125420092012511b200f20135420032000ad7c220320115420032011511b200f201385200320118584501b0d000b0b200841606a220022022400200e2000100d200041186a290300210342002107200041106a2903002105200041086a290300210420002903002106200241606a220022022400024002402006421f5620044200522004501b200542005220034200522003501b2005200384501b450d002000427f3703102000427f37030820004260370300200041186a427f370300200241606a22022208240020002002100e200841606a221622002400200e20022016102d200041606a22002202240042002105200041186a420037030020004200370310200042003703082000420337030041002000101a200241606a220222002400412021104100412020021020200041606a22002208240020162000100d02402000290300200041106a29030084200041086a290300200041186a2903008484500d00420021114200211242002104422021034200211342002114420021150340200841606a220022082400200b2003a76a2000101c20002903002106200041086a2903002107200041106a2903002109200041186a290300210f200841606a220022082400200041186a200f37030020002009370310200020073703082000200637030020022000101e200841606a22002208240020022000100d20002903002106200041086a2903002107200041186a2903002117200041106a2903002109200841606a22002202240020002007200642017c220f2006542208ad7c22183703082000200f3703002000200920082018200754200f20065a1bad7c2206370310200041186a20172006200954ad7c370300200241606a22022208240020002002100e200841606a22002208240020162000100d2012200542207c2206200554221020112010ad7c2207201154200620055a1bad7c2209201254211020152014200342207c220f200354220c2013200cad7c2217201354200f20035a1bad7c2218201454ad7c2115200621052007211120092112200f2103201721132018211420062000290300542007200041086a29030022065420072006511b2009200041106a29030022075420042010ad7c2204200041186a29030022065420042006511b2009200785200420068584501b0d000b200fa721100b200841606a22002208240020162000100d20002903002106200041086a2903002105200041106a2903002104200041186a2903002103200841606a220022082400200e2000100d0240200620002903005a2005200041086a29030022065a20052006511b2004200041106a29030022065a2003200041186a29030022055a20032005511b2004200685200320058584501b0d00200841606a220c220024002010200b6a200c101d200041606a220022082400200841606a220822102400200841186a200e41186a290000370000200841106a200e41106a290000370000200841086a200e41086a2900003700002008200e29000037000020082000100d20002903002103200041086a2903002105200041106a2903002104200041186a2903002106201041606a220022082400200041186a2006370300200020043703102000200537030820002003370300200841606a220822102400200041032008102e2008280200210b201041606a220022082400200041186a427f3703002000427f3703102000427f3703082000427f370300200841606a2208221024002000200b41f801712008102f20082903002103200841086a2903002105200841106a2903002104200841186a2903002106201041606a220022082400200041186a2006427f8537030020002004427f8537031020002005427f8537030820002003427f85370300200841606a22082210240020002008100e201041606a220022102400200c20082000102d201041606a220822102400201041606a2210220c2400201041186a200041186a290000370000201041106a200041106a290000370000201041086a200041086a2900003700002010200029000037000020102008100d20082903002103200841086a2903002105200841106a2903002104200841186a2903002106200c41606a220022082400200041186a200637030020002004370310200020053703082000200337030020022000101e0b200841606a220022022400200241606a220222082400200241186a200e41186a290000370000200241106a200e41106a290000370000200241086a200e41086a2900003700002002200e29000037000020022000100d20002903002103200041086a2903002105200041106a2903002104200041186a2903002106200841606a220022022400200041186a2006370300200020043703102000200537030820002003370300200241606a220222082400200041012002102e200241186a2903002107200241106a2903002105200241086a290300210420022903002103200841606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a22082202240020002008100e200241606a220022022400200041186a20072005200342017c2206200354221020042010ad7c2209200454200620035a1bad7c2203200554ad7c37030020002003370310200020093703082000200637030020082000101e0c010b200241606a220222082400200241186a200e41186a290000370000200241106a200e41106a290000370000200241086a200e41086a2900003700002002200e29000037000020022000100d024002402000290300200041106a29030084200041086a290300200041186a290300848450450d004200210342002105420021040c010b200841606a220022082400200c2000101c200041186a2903002104200041106a2903002105200041086a2903002103200029030021070b200841606a220022022400200241606a220222082400200241186a200e41186a2210290000370000200241106a200e41106a220c290000370000200241086a200e41086a220b2900003700002002200e29000037000020022000100d20002903002106200041086a2903002109200041106a290300210f200041186a2903002111200841606a220022022400200041186a20113703002000200f3703102000200937030820002006370300200241606a220222082400200041032002102e20022802002116200841606a220022022400200041186a427f3703002000427f3703102000427f3703082000427f370300200241606a220222082400200020162002102f20022903002106200241086a2903002109200241106a290300210f200241186a2903002111200841606a220022022400200241606a220222082400200241186a2010290000370000200241106a200c290000370000200241086a200b2900003700002002200e29000037000020022000100d20002903002112200041086a2903002113200041106a2903002114200041186a2903002115200841606a220022022400200041186a2015370300200020143703102000201337030820002012370300200241606a220222082400200041012002102e20022903002112200241086a2903002113200241106a2903002114200241186a2903002115200841606a220022022400200041186a4200370300200042003703102000420037030820004203370300200241606a22082202240020002008100e200241606a220022022400200041186a201520042011427f858384370300200020142005200f427f8583843703102000201320032009427f8583843703082000201220072006427f85838437030020082000101e0b200241606a220b22002400200d200b101d200041606a220022022400200b2000100d0240200041086a290300420052200041106a2903002205420052200041186a29030022034200522003501b2005200384501b450d00200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a410441c100101b4100412410150b200241606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a22022208240020002002100e200841606a22002208240020022000101f20002903002103200041086a2903002105200041106a2903002104200041186a2903002106200841606a220022022400200041186a2006370300200020043703102000200537030820002003370300200241606a220222082400200041012002102f02402002290300220542ff0083200520034201832204501b2207421f56420020047d2205200241086a29030083220f420052200f5022101b2005200241106a2903008322114200522005200241186a2903008322094200522009501b20112009845022021b2003a7410171460d00200841606a220022082400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044122101b4100412410150b02402007422054410020101b410020021b0d00200841606a220022022400200041186a420037030020004200370310200042003703082000420437030041002000101a200241606a2210220024004100412020101020200041606a220022022400200b2000100d20002903002103200041086a2903002105200041186a2903002112200041106a2903002104200241606a220022022400200020052003421f7c22062003542208ad7c2213370308200020063703002000200420082013200554200620035a1bad7c2203370310200041186a20122003200454ad7c370300200241606a220222082400200041052002102f200241186a2903002106200241106a290300211220022903002113200241086a2903002114200841606a22002202240020102000100d200041186a2903002115200041106a290300210520002903002104200041086a2903002103200241606a220022022400200b2000100d0240024020002903004220544100200041086a290300501b4100200041106a290300200041186a29030084501b0d00201520067c200520127c2212200554ad7c2012200420137c22052004542200200320147c2000ad7c220420035420042003511bad7c2206201254ad7c21030c010b200241606a22002202240020102000100d200041186a2903002103200041106a2903002106200041086a2903002104200029030021050b200241606a2200220224002000200f2007421f7c22122007542208ad7c2213370308200020123703002000201120082013200f54201220075a1bad7c2207370310200041186a20092007201154ad7c370300200241606a220222082400200041052002102f200241186a290300210f200241106a290300210920022903002107200241086a2903002111200841606a22002208240020102000100d20052007200029030022127c22145a20042011200041086a29030022077c20142012542202ad7c22125a20042012511b20062009200041106a29030022117c22092002201220075420122007511bad7c22135a2003200f200041186a2903007c2009201154ad7c2013200954ad7c22115a20032011511b2006201385200320118584501b0d000340200841606a220022022400200041186a2003370300200020063703102000200437030820002005370300200241606a22022208240020002002100e200841606a220022082400200041186a420037030020004200370310200042003703082000420037030020022000101e2006200542017c2207200554220020042000ad7c2209200454200720055a1bad7c220f20065421002007210520092104200f21062007201454200920125420092012511b200f20135420032000ad7c220320115420032011511b200f201385200320118584501b0d000b0b200841606a220022022400200b2000100d200041186a290300210342002107200041106a2903002105200041086a290300210420002903002106200241606a220022022400024002402006421f5620044200522004501b200542005220034200522003501b2005200384501b450d002000427f3703102000427f37030820004260370300200041186a427f370300200241606a22022208240020002002100e200841606a220e22002400200b2002200e102d200041606a22002202240042002105200041186a420037030020004200370310200042003703082000420437030041002000101a200241606a220222002400412021104100412020021020200041606a220022082400200e2000100d02402000290300200041106a29030084200041086a290300200041186a2903008484500d00420021114200211242002104422021034200211342002114420021150340200841606a220022082400200d2003a76a2000101c20002903002106200041086a2903002107200041106a2903002109200041186a290300210f200841606a220022082400200041186a200f37030020002009370310200020073703082000200637030020022000101e200841606a22002208240020022000100d20002903002106200041086a2903002107200041186a2903002117200041106a2903002109200841606a22002202240020002007200642017c220f2006542208ad7c22183703082000200f3703002000200920082018200754200f20065a1bad7c2206370310200041186a20172006200954ad7c370300200241606a22022208240020002002100e200841606a220022082400200e2000100d2012200542207c2206200554221020112010ad7c2207201154200620055a1bad7c2209201254211020152014200342207c220f200354220c2013200cad7c2217201354200f20035a1bad7c2218201454ad7c2115200621052007211120092112200f2103201721132018211420062000290300542007200041086a29030022065420072006511b2009200041106a29030022075420042010ad7c2204200041186a29030022065420042006511b2009200785200420068584501b0d000b200fa721100b200841606a220022082400200e2000100d20002903002106200041086a2903002105200041106a2903002104200041186a2903002103200841606a220022082400200b2000100d0240200620002903005a2005200041086a29030022065a20052006511b2004200041106a29030022065a2003200041186a29030022055a20032005511b2004200685200320058584501b0d00200841606a220c220024002010200d6a200c101d200041606a220022082400200841606a220822102400200841186a200b41186a290000370000200841106a200b41106a290000370000200841086a200b41086a2900003700002008200b29000037000020082000100d20002903002103200041086a2903002105200041106a2903002104200041186a2903002106201041606a220022082400200041186a2006370300200020043703102000200537030820002003370300200841606a220822102400200041032008102e2008280200210d201041606a220022082400200041186a427f3703002000427f3703102000427f3703082000427f370300200841606a2208221024002000200d41f801712008102f20082903002103200841086a2903002105200841106a2903002104200841186a2903002106201041606a220022082400200041186a2006427f8537030020002004427f8537031020002005427f8537030820002003427f85370300200841606a22082210240020002008100e201041606a220022102400200c20082000102d201041606a220822102400201041606a2210220c2400201041186a200041186a290000370000201041106a200041106a290000370000201041086a200041086a2900003700002010200029000037000020102008100d20082903002103200841086a2903002105200841106a2903002104200841186a2903002106200c41606a220022082400200041186a200637030020002004370310200020053703082000200337030020022000101e0b200841606a220022022400200241606a220222082400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b29000037000020022000100d20002903002103200041086a2903002105200041106a2903002104200041186a2903002106200841606a220022022400200041186a2006370300200020043703102000200537030820002003370300200241606a220222082400200041012002102e200241186a2903002107200241106a2903002105200241086a290300210420022903002103200841606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a22082202240020002008100e200241606a220022022400200041186a20072005200342017c2206200354221020042010ad7c2209200454200620035a1bad7c2203200554ad7c37030020002003370310200020093703082000200637030020082000101e0c010b200241606a220222082400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b29000037000020022000100d024002402000290300200041106a29030084200041086a290300200041186a290300848450450d004200210342002105420021040c010b200841606a220022082400200d41206a2000101c200041186a2903002104200041106a2903002105200041086a2903002103200029030021070b200841606a220022022400200241606a220222082400200241186a200b41186a2210290000370000200241106a200b41106a220c290000370000200241086a200b41086a220d2900003700002002200b29000037000020022000100d20002903002106200041086a2903002109200041106a290300210f200041186a2903002111200841606a220022022400200041186a20113703002000200f3703102000200937030820002006370300200241606a220222082400200041032002102e2002280200210e200841606a220022022400200041186a427f3703002000427f3703102000427f3703082000427f370300200241606a2202220824002000200e2002102f20022903002106200241086a2903002109200241106a290300210f200241186a2903002111200841606a220022022400200241606a220222082400200241186a2010290000370000200241106a200c290000370000200241086a200d2900003700002002200b29000037000020022000100d20002903002112200041086a2903002113200041106a2903002114200041186a2903002115200841606a220022022400200041186a2015370300200020143703102000201337030820002012370300200241606a220222082400200041012002102e20022903002112200241086a2903002113200241106a2903002114200241186a2903002115200841606a220022022400200041186a4200370300200042003703102000420037030820004204370300200241606a22082202240020002008100e200241606a220022022400200041186a201520042011427f858384370300200020142005200f427f8583843703102000201320032009427f8583843703082000201220072006427f85838437030020082000101e0b200241606a2200220224002000101302402000102c450d0010292108200241606a220022022400200241606a220222102400200241186a41e0820241186a290300370000200241106a41e0820241106a290300370000200241086a41e0820241086a290300370000200241002903e0820237000020022000100d20002903002103200041086a2903002105200041106a2903002104200041186a2903002106201041606a220022022400200041186a2006370300200020043703102000200537030820002003370300200241606a220222102400200041e0012002102e20022903002103200241086a2903002105200241106a2903002104200241186a2903002106201041606a220022022400200041186a200637030020002004370310200020053703082000200337030020082000101a200841046a4100101b2008412410150b200241606a220022022400200041186a4200370300200042003703102000420037030820004202370300200241606a22022208240020002002100e200841606a22002208240020022000101f200041186a2903002103200041106a290300210420002903002105200041086a2903002106200841606a220022022400200a2000100d0240200520052000290300220f7c22095820062006200041086a29030022077c2009200f542208ad7c22055820062005511b20042004200041106a29030022117c220f2008200520075420052007511bad7c22065820032003200041186a2903007c200f201154ad7c2006200f54ad7c22075820032007511b2004200685200320078584501b0d00200241606a220022022400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000101a41044111101b4100412410150b200241606a220022022400200041186a4200370300200042003703102000420037030820004202370300200241606a22022208240020002002100e200841606a220022082400200041186a200737030020002006370310200020053703082000200937030020022000101e200841606a2200220224002000101341002000101941204100101b200241606a220222002400410041c00020021020200041606a22002208240020022000101f200041186a2903002107200041106a290300210620002903002109200041086a290300210f200841606a220022082400200a2000100d200041086a290300210320002903002105200041186a2903002111200041106a2903002104200841606a22002208240020002003200f7c200520097c22092005542210ad7c2205370308200020093703002000200420067c22062010200520035420052003511bad7c2203370310200041186a201120077c2006200454ad7c2003200654ad7c37030020022000101e10292210200a1019200841606a22022200240020021013200041606a220022082400200041186a4200370300200042003703102000420037030820004200370300200841606a2208240020002008100e20104120418083022008200210221029220041b08403410010166b41041017200041041021200124000b0600102310330b0b85020b00418080020b24ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef96c6fd1e0041d080020b04ec442f050041f480020b04ffffffff00419881020b08ffffffffffffffff0041bc81020b24e602df058c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9250041fc81020b04e602df0500419c82020b24ec442f05ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0041d882020b08ffffffffffffffff0041fc82020b24ec442f05ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00419884020b0a010000003082000030c20041a984020b0140002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600d309046e616d6501a40935000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030c67657443616c6c56616c75650406726576657274050666696e697368060b676574436f646553697a650708636f6465436f7079081873746f7261676553746f72654c6974746c65456e6469616e091773746f726167654c6f61644c6974746c65456e6469616e0a096b656363616b3235360b0c656d69744c6f674576656e740c115f5f7761736d5f63616c6c5f63746f72730d1a753235365f66726f6d5f6269675f656e6469616e5f62797465730e18753235365f746f5f6269675f656e6469616e5f62797465730f1b6933325f66726f6d5f6269675f656e6469616e5f62797465733332101c777261707065725f63616c6c646174616c6f61645f62797465733332111e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f721215777261707065725f63616c6c646174615f73697a65130e777261707065725f63616c6c6572141a777261707065725f63616c6c76616c75655f6e6f745f7a65726f150e777261707065725f726576657274161365766d5f6765745f6d656d6f72795f616464721710777261707065725f636f6465636f70791814777261707065725f6d656d6f72795f67756172641916777261707065725f6d73746f72655f627974657333321a13777261707065725f6d73746f72655f753235361b12777261707065725f6d73746f72655f7533321c12777261707065725f6d6c6f61645f753235361d15777261707065725f6d6c6f61645f627974657333321e2f777261707065725f7373746f72655f753235365f7573696e675f6c6974746c655f656e6469616e5f686f73746170691f2e777261707065725f736c6f61645f753235365f7573696e675f6c6974746c655f656e6469616e5f686f73746170692011777261707065725f6b656363616b323536210e777261707065725f72657475726e220c777261707065725f6c6f673323137365745f69735f6465706c6f79696e675f74782422777261707065725f63757272656e745f636f6e74726163745f636f64655f73697a65252b777261707065725f63757272656e745f636f6e74726163745f707572655f636f6e74726163745f73697a652611777261707065725f646174615f636f7079271d777261707065725f63616c6c646174615f73697a655f6d696e75735f342819777261707065725f7365745f6d656d7074725f676c6f62616c2919777261707065725f6765745f6d656d7074725f676c6f62616c2a24777261707065725f6f7074696d697a65645f65726332305f66756e5f7472616e736665722b0f5f5f696e69745f65766d5f686561702c16777261707065725f627974657333325f69737a65726f2d13777261707065725f627974657333325f616e642e10777261707065725f753235365f73686c2f10777261707065725f753235365f7368723034474c44546f6b656e5f34383437375f6465706c6f7965642e474c44546f6b656e5f34383437375f6465706c6f7965642e696e6974310463616c6c32065f73746172743322474c44546f6b656e5f34383437372e474c44546f6b656e5f34383437372e696e697434066465706c6f79071201000f5f5f737461636b5f706f696e74657209110200072e726f6461746101052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d0000000000000000000000000000000000000000000000c097ce7bc90715b34b9f1000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc721_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc721_wasm.hex new file mode 100644 index 000000000..5c3d9d257 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_erc721_wasm.hex @@ -0,0 +1 @@ +0000bfb40061736d01000000019601136000017f60037f7f7f0060017f0060027f7f0060077f7f7f7f7f7f7f0060057e7f7f7f7f017f6000017e60017f017f60000060057f7f7f7f7f0060067f7f7f7f7f7f0060037f7f7f017f60077e7f7f7f7f7f7f017f60027f7f017f60057f7e7e7e7e0060047e7e7e7e0060087e7e7e7e7e7e7e7e0060067f7f7e7e7e7e0060147e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0002d3021103656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e761873746f7261676553746f72654c6974746c65456e6469616e000303656e761773746f726167654c6f61644c6974746c65456e6469616e000303656e76096b656363616b323536000103656e760c656d69744c6f674576656e74000403656e761167657452657475726e4461746153697a65000003656e760e72657475726e44617461436f7079000103656e760c63616c6c436f6e7472616374000503656e760a6765744761734c656674000603656e761367657445787465726e616c436f646553697a6500070338370803030307030000020003070107030303030303030103090a0b010c06000108070100080d07010101010e0f100e110e081208080808080405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300110463616c6c0044066465706c6f7900470a92d7023702000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190b4300200120003a001f20014100360218200142003703102001420037030820014200370300200120004108763a001e200120004110763a001d200120004118763a001c0b2800200028001c220041187420004180fe03714108747220004108764180fe0371200041187672720bb40a01057f024041002802d080042202417f4a0d004100100022023602d080040b0240024002400240200041206a20024d0d002002210302402002417f4a0d004100100022033602d080040b200220006b21040240200341e500480d0020012000200410010c020b024041002d00d48f040d0041f08e04410020031001410041013a00d48f040b2004450d02200041f08e046a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d004100100022023602d080040b0240200241e500480d0020012000412010010f0b024041002d00d48f040d0041f08e04410020021001410041013a00d48f040b2001200041f08e046a2d00003a00002001200041f18e046a2d00003a00012001200041f28e046a2d00003a00022001200041f38e046a2d00003a00032001200041f48e046a2d00003a00042001200041f58e046a2d00003a00052001200041f68e046a2d00003a00062001200041f78e046a2d00003a00072001200041f88e046a2d00003a00082001200041f98e046a2d00003a00092001200041fa8e046a2d00003a000a2001200041fb8e046a2d00003a000b2001200041fc8e046a2d00003a000c2001200041fd8e046a2d00003a000d2001200041fe8e046a2d00003a000e2001200041ff8e046a2d00003a000f2001200041808f046a2d00003a00102001200041818f046a2d00003a00112001200041828f046a2d00003a00122001200041838f046a2d00003a00132001200041848f046a2d00003a00142001200041858f046a2d00003a00152001200041868f046a2d00003a00162001200041878f046a2d00003a00172001200041888f046a2d00003a00182001200041898f046a2d00003a001920012000418a8f046a2d00003a001a20012000418b8f046a2d00003a001b20012000418c8f046a2d00003a001c20012000418d8f046a2d00003a001d20012000418e8f046a2d00003a001e20012000418f8f046a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b8308010d7f230041106b2200240041002101024041002802d080042202417f4a0d004100100022023602d080040b02402002450d000240200241034b0d00410021032000410036020c024041002d00d48f040d0041f08e04410020021001410041013a00d48f040b024002400240200241044f0d0041f08e0421012000410c6a21040c010b2002417c71220341f08e046a21012000410c6a20036a21044100210503402000410c6a20056a200541f08e046a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f4a0d004100100022023602d080040b02400240200241e500480d00200041086a4100410410010c010b024041002d00d48f040d0041f08e04410020021001410041013a00d48f040b200041002802f08e043602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f024041002802d080042200417f4a0d004100100022003602d080040b20000b17002000410c6a100220004100360208200042003702000b4402017f047e230041206b220024002000100320002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802dc8f0420006a200110040b0c0041002802dc8f0420006a0bb60501037f0240024041002802e88f042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e48f04410020054180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420044f0d00410020043602e48f040b41002802dc8f04220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100622044f0d0020002001200210070f0b0240200441004a200120046b2204200148470d00024041002802d080042201417f4a0d004100100022013602d080042001417f4a0d004100100022013602d080040b0240200141e500480d0020002004200210010c020b024041002d00d48f040d0041f08e04410020011001410041013a00d48f040b2002450d01200441f08e046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802e88f04220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602e48f04410020024180807c713602e88f04410041002802e08f0420014110746a3602e08f0441e0000f0b024041002802e48f0420004f0d00410020003602e48f040b41e0000b920401037f0240200041206a22022000480d000240024041002802e88f04220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602e48f04410020044180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420024f0d00410020023602e48f040b41002802dc8f0420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802e88f04220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602e48f04410020074180807c713602e88f04410041002802e08f0420014110746a3602e08f040c010b41002802e48f0420024f0d00410020023602e48f040b41002802dc8f0420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802e88f04220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602e48f04410020044180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420024f0d00410020023602e48f040b41002802dc8f0420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000bcc0200200141002802dc8f0420006a22002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b910300200141002802dc8f0420006a22002d00003a0000200120002d00013a0001200120002d00023a0002200120002d00033a0003200120002d00043a0004200120002d00053a0005200120002d00063a0006200120002d00073a0007200120002d00083a00082001200041096a2d00003a000920012000410a6a2d00003a000a20012000410b6a2d00003a000b20012000410c6a2d00003a000c20012000410d6a2d00003a000d20012000410e6a2d00003a000e20012000410f6a2d00003a000f2001200041106a2d00003a00102001200041116a2d00003a00112001200041126a2d00003a00122001200041136a2d00003a00132001200041146a2d00003a00142001200041156a2d00003a00152001200041166a2d00003a00162001200041176a2d00003a00172001200041186a2d00003a00182001200041196a2d00003a001920012000411a6a2d00003a001a20012000411b6a2d00003a001b20012000411c6a2d00003a001c20012000411d6a2d00003a001d20012000411e6a2d00003a001e20012000411f6a2d00003a001f0b08002000200110080b08002000200110090b120041002802dc8f0420006a20012002100a0b100041002802dc8f0420006a200110050b1a0041002802dc8f0420006a200141032002200320044100100b0b1a0041002802dc8f0420006a200141042002200320042005100b0bfe0201037f024020004102470d00419980044114100441000f0b02402002450d000240100c220320024e0d00024020000d000240024041002802e88f042202200320016a22004f0d00200041ffff036a220441107620024110766b220240001a410020003602e48f04410020044180807c713602e88f04410041002802e08f0420024110746a3602e08f040c010b41002802e48f0420004f0d00410020003602e48f040b41002802dc8f0420016a41002003100d41010f0b024020030d0041ae8004411f10042000450f0b024020034180084a0d0041e0860441002003100d41e08604200310042000450f0b41808004411810042000450f0b0240024041002802e88f042204200220016a22034f0d00200341ffff036a220541107620044110766b220440001a410020033602e48f04410020054180807c713602e88f04410041002802e08f0420044110746a3602e08f040c010b41002802e48f0420034f0d00410020033602e48f040b41002802dc8f0420016a41002002100d0b2000450b860101037f0240024041002802e88f042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e48f04410020054180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420044f0d00410020043602e48f040b41002802dc8f0420006a20012002100d0b9c0303017f047e027f230041206b22072400200241086a2903002108200241106a29030021092002290300210a2007200241186a290300220b4228883c00022007200b4238883c0000200720094228883c000a200720094238883c00082007200b4220883c00032007200b4230883c0001200720084228883c0012200720084238883c0010200720094220883c000b200720094230883c000920072008a722024108763a0016200720024118763a00142007200ba7220c3a00072007200c4108763a00062007200c4118763a000420072009a7220d3a000f2007200d4108763a000e2007200d4118763a000c2007200c4110763a00052007200d4110763a000d2007200a4228883c001a2007200a4238883c0018200720023a0017200720024110763a0015200720084220883c0013200720084230883c00112007200a4220883c001b2007200a4230883c00192007200aa722023a001f200720024108763a001e200720024118763a001c200720024110763a001d20002001410c6a200741002802dc8f0420036a2004100e20052006102a2102200741206a240020020b0400100f0b0400100c0bbf0701037f0240024041002802e88f042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e48f04410020054180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420044f0d00410020043602e48f040b41002802dc8f042103024041002802d080042204417f4a0d004100100022043602d080040b200320006a210002400240200420014b0d002002450d0102400240200241077122040d00200221040c010b0340200041003a0000200041016a21002004417f6a22040d000b200241787121040b20024108490d01034020004200370000200041086a2100200441786a22040d000c020b0b02400240200220016a20044d0d002004210302402004417f4a0d004100100022033602d080040b200420016b21050240200341e500480d0020002001200510010c020b024041002d00d48f040d0041f08e04410020031001410041013a00d48f040b2005450d01200141f08e046a210402400240200541077122030d0020052103200021010c010b200021010340200120042d00003a0000200141016a2101200441016a21042003417f6a22030d000b200541787121030b20054108490d01200341786a21030340200120042d00003a0000200120042d00013a0001200120042d00023a0002200120042d00033a0003200120042d00043a0004200120042d00053a0005200120042d00063a0006200120042d00073a00072003450d02200341786a2103200441086a2104200141086a21010c000b0b02402004417f4a0d004100100022043602d080040b0240200441e500480d0020002001200210010f0b024041002d00d48f040d0041f08e04410020041001410041013a00d48f040b2002450d01200141f08e046a210402400240200241077122010d00200221010c010b0340200020042d00003a0000200041016a2100200441016a21042001417f6a22010d000b200241787121010b20024108490d01200141786a21010340200020042d00003a0000200020042d00013a0001200020042d00023a0002200020042d00033a0003200020042d00043a0004200020042d00053a0005200020042d00063a0006200020042d00073a00072001450d02200141786a2101200441086a2104200041086a21000c000b0b200220056b2201450d00200020056a210002400240200141077122040d00200121040c010b0340200041003a0000200041016a21002004417f6a22040d000b200141787121040b20014108490d00034020004200370000200041086a2100200441786a22040d000b0b0b0b00410041013a00e08e040b09002000410c6a10100bd00201037f0240024041002802e88f042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e48f04410020054180807c713602e88f04410041002802e08f0420034110746a3602e08f040c010b41002802e48f0420044f0d00410020043602e48f040b02402002450d0041002802dc8f04220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d00200141786a21010340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a00072001450d01200141786a2101200041086a2100200441086a21040c000b0b0b2501017f024041002802d080042200417f4a0d004100100022003602d080040b2000417c6a0b7e01027f024041002d00d88f040d00024002403f0022004102490d00410020004110743602dc8f04410140001a3f00411074220041002802dc8f046b21010c010b410041f08f043602dc8f0441f08f0521004180800121010b410020003602e08f04410020013602e88f04410041013a00d88f04410041003602e48f040b0b4101017f41002102024020002903002001290300520d0020002903082001290308520d0020002903102001290310520d00200029031820012903185121020b20020b3301017f41002101024020002903004200520d0020002903084200520d0020002903104200520d0020002903185021010b20010b4200200220012903002000290300833703002002200129030820002903088337030820022001290310200029031083370310200220012903182000290318833703180bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000b7701057f410021034100210402400340200220036a2205411f6a2004200020036a2206411f6a2d00006a200120036a2204411f6a2d00006a22073a00002005411e6a20074108762006411e6a2d00006a2004411e6a2d00006a22043a000020034162460d012003417e6a2103200441087621040c000b0b0b940303027f017e017f230041e0006b220521062005240002402001427c7c220742df0056200220072001542208ad7c427f7c22014200522001501b2003427f7c22072008200120025420012002511bad7c220242005220042007200354ad7c2002200754ad7c427f7c22014200552001501b2002200184501b0d0041004100101b0b200541606a220522082400410420051016200520061012200841606a2205220824004124200510162005200641206a1012200841606a2205240041c400200510162005200641c0006a101220002006290340370340200020062903203703202000200641106a2903003703102000200641086a29030037030820002006290300370300200041d8006a200641c0006a41186a290300370300200041d0006a200641c0006a41106a290300370300200041c8006a200641c0006a41086a290300370300200041386a200641206a41186a290300370300200041306a200641206a41106a290300370300200041286a200641206a41086a290300370300200041186a200641186a290300370300200641e0006a24000baf0204027f017e017f037e230041206b2204240041e0800420042205101220032002200042207c2206200054220720012007ad7c2208200154200620005a1bad7c2209200254ad7c210a024002402000425f5641002001427f511b41002002200383427f511b0d0020062005290300582008200541086a29030022005820082000511b2009200541106a290300220158200a200541186a290300220058200a2000511b2009200185200a20008584501b0d010b200441606a220722042400200741186a428080808090ee9ea4ce00370300200742003703102007420037030820074200370300410020071020410441c100102141004124101b0b200441606a22042400200441186a200a37030020042009370310200420083703082004200637030041c00020041020200541206a24000b830305027f037e017f017e017f230041206b2208240041808104200822091012024002402004421f7c220a426083220b20007c220c2000542005200a200454220dad7c220e20017c200c200b54220fad7c220020015420002001511b2006200d200e200554200a20045a1bad7c220420027c2205200f2000200e542000200e511bad7c220120025420072004200654ad7c20037c2005200454ad7c2001200554ad7c220420035420042003511b2001200285200420038584501b0d00200c2009290300582000200941086a29030022035820002003511b2001200941106a2903002202582004200941186a29030022035820042003511b2001200285200420038584501b0d010b200841606a220d22082400200d41186a428080808090ee9ea4ce00370300200d4200370310200d4200370308200d42003703004100200d1020410441c100102141004124101b0b200841606a22082400200841186a200437030020082001370310200820003703082008200c37030041c00020081020200941206a24000ba90204027f047e017f017e230041206b2205240041a081042005220610120240200629030020015a200641086a290300220720025a20072002511b200641106a290300220820035a200641186a290300220720045a20072004511b2008200385200720048584501b0d00200541606a22052400200541186a428080808090ee9ea4ce00370300200542003703102005420037030820054200370300410020051020410441c100102141004124101b0b20002001421f7c2207426083220842207c22093703002000200220072001542205ad7c220a2009200854220bad7c220c370308200020032005200a200254200720015a1bad7c2202200b200c200a54200920085a1bad7c2201370310200041186a20042002200354ad7c2001200254ad7c370300200641206a24000bfc1604047f067e017f097e230041c0026b220624002006220741c0006a41186a4200370300200742ffffffff0f3703502007427f3703482007427f370340200741c0006a200741206a10132001200741206a20071037024020071036450d00200641606a22012206240041c00020011023200110152108200641606a220622092400200641186a4280808080a0d2abd0e400370300200642003703102006420037030820064200370300200820061020200941606a220922062400200120091012200928020041046a4100102120084124101b0b200641606a220622012400200641186a2005370300200620043703102006200337030820062002370300410020061020412041021021200141606a220122062400410041c00020011026200641606a220622082400200120061025200641086a290300210a2006290300210b200641106a350200210c200841606a22012206240020011019024002400240200110360d00200641606a22082206240020081019200641606a220122062400200141186a42003703002001200c3703102001200a3703082001200b370300200641606a2209220624002001200910132009200810350d00200641606a220622012400200641186a42003703002006200c3703102006200a3703082006200b370300410020061020412041051021200141606a220622012400410041c00020061026200141606a2201220824002001101941002001101f41202006101f200841606a220122062400410041c00020011026200641606a22082206240020012008102520082d00000d00200641606a220622012400200641186a2005370300200620043703102006200337030820062002370300410020061020412041041021200141606a220122062400410041c00020011026200641606a2206220824002001200610252006290300210d200641086a290300210e200641106a350200210f200841606a22082206240020081019200641606a220122062400200141186a42003703002001200f3703102001200e3703082001200d370300200641606a2209220624002001200910132009200810350d00200641606a22012206240041c00020011023200110152108200641606a2206220924000240200b200c84200a84500d00200642003703102006420037030820064200370300200641186a4280808080f085a0bf17370300200820061020200941606a22062209240020012006101220062802002110200941606a22062209240020061019201041046a2006101f200941606a22062209240020012006101220062802002110200941606a220122062400200141186a2005370300200120043703102001200337030820012002370300201041246a20011020200841c400101b0c020b200642003703102006420037030820064200370300200641186a428080808090d1cc93fe00370300200820061020200941606a22062209240020012006101220062802002110200941606a220122062400200141186a2005370300200120043703102001200337030820012002370300201041046a2001102020084124101b0c020b200b200c84200a84500d010b200741a0026a41186a2005370300200720023703a002200720033703a802200720043703b0024100200741a0026a1020412041041021410041c00020074180026a102620074180026a200741e0016a1025200741c0016a41086a41c0820441086a290300370300200741c0016a41106a41c0820441106a290300370300200741c0016a41186a41c0820441186a290300370300200741002903c082043703c001200741e0016a41086a290300210d200741e0016a41106a290300210e200741e0016a41186a290300210f20072903e0012111200741c0016a200741a0016a1012200741a0016a41a00120074180016a1038200741e0006a41186a200f20074180016a41186a290300833703002007200e20074180016a41106a290300833703702007200d20074180016a41086a29030083370368200720112007290380018337036020074180026a200741e0006a1024200641606a220622012400200641186a42003703002006200c3703102006200a3703082006200b370300410020061020412041031021200141606a220822062400410041c00020081026200641606a2206220124002008200610252006290300210e200641086a290300210d200641186a2903002112200641106a290300210f200141606a2201220624002001200d200e427f7c2211200e542209ad7c427f7c220e370308200120113703002001200f427f7c22112009200e200d54200e200d511bad7c220d370310200141186a20122011200f54ad7c200d201154ad7c427f7c3703002008200110240b41002007101f412041031021200641606a220122062400410041c00020011026200641606a2206220824002001200610252006290300210d200641086a290300210e200641186a2903002112200641106a290300210f200841606a2206220824002006200e200d42017c2211200d542209ad7c2213370308200620113703002006200f20092013200e542011200d5a1bad7c220d370310200641186a2012200d200f54ad7c370300200120061024200841606a220622012400200641186a2005370300200620043703102006200337030820062002370300410020061020412041021021200141606a220822062400410041c00020081026200641606a2206220124002008200610252006290300210d200641086a290300210e200641106a290300210f200641186a2903002111200141606a220622012400200141606a220122092400200141186a41c0810441186a290300370000200141106a41c0810441106a290300370000200141086a41c0810441086a290300370000200141002903c0810437000020012006101220062903002112200641086a2903002113200641106a2903002114200641186a2903002115200941606a220622012400200641186a2015370300200620143703102006201337030820062012370300200141606a220122092400200641a0012001103820012903002112200141086a2903002113200141106a2903002114200141186a2903002115200941606a220622012400200720061012200641186a290300211620062903002117200641086a2903002118200641106a2903002119200141606a220622012400200641186a2016201520118384370300200620192014200f8384370310200620182013200e8384370308200620172012200d8384370300200820061024200141606a220622012400200641186a42003703002006200c3703102006200a3703082006200b370300200141606a220122082400200620011013200841606a220622082400200641186a2005370300200620043703102006200337030820062002370300200841606a2208220924002006200810134100410041e081042001200720081029200941606a220622012400200641186a4200370300200642ffffffff0f3703102006427f3703082006427f370300200141606a220822012400200620081013200141606a2201220624002000200820011037200641606a220622082400200641186a42003703002006200c3703102006200a3703082006200b370300200841606a22082200240020062008101302402008200110350d00200041606a22062208240041c00020061023200610152100200841606a220822092400200841186a4280808080b0af8f94e400370300200842003703102008420037030820084200370300200020081020200941606a220822092400200620081012200828020041046a2001101f200941606a22012208240020062001101220012802002109200841606a220122082400200141186a2005370300200120043703102001200337030820012002370300200941246a20011020200841606a22012208240020062001101220012802002101200841606a22062400200641186a42003703002006200c3703102006200a3703082006200b370300200141c4006a20061020200041e400101b0b200741c0026a24000bc80203027f037e037f230041e0006b220524002005220641c0006a41186a20043703002006200337035020062002370348200620013703404100200641c0006a1020412041021021410041c000200641206a1026200641206a20061025024020062903002207200641106a350200220884200641086a2903002209844200520d00200541606a220a2205240041c000200a1023200a1015210b200541606a2205220c2400200541186a428080808090d1cc93fe00370300200542003703102005420037030820054200370300200b20051020200c41606a2205220c2400200a200510122005280200210a200c41606a22052400200541186a2004370300200520033703102005200237030820052001370300200a41046a20051020200b4124101b0b20002007370300200041186a42003703002000200937030820002008370310200641e0006a24000bc10203027f037e037f230041c0016b220024002000220141a0016a41186a4200370300200142003703b001200142003703a801200142063703a001200141a0016a20014180016a101320014180016a200141e0006a1025200141e8006a2903002102200141f0006a350200210320012903602104200141c0006a1019200141206a41186a4200370300200120033703302001200237032820012004370320200141206a2001101302402001200141c0006a10350d00200041606a22052200240041c00020051023200510152106200041606a220022072400200041186a4280808080f0d4b6c611370300200042003703102000420037030820004200370300200620001020200741606a22002207240020052000101220002802002105200741606a2200240020001019200541046a2000101f20064124101b0b200141c0016a24000b981201077f230041c0016b221424002014221541c0006a41186a200b3703002015200a3703502015200937034820152008370340201541c0006a201541206a10130240201541206a1031450d00201441606a22142216240041c00020141023201410152117201641606a221622182400201641186a4280808080a0c0de85153703004200210b201642003703102016420037030820164200370300201720161020201841606a22162218240020142016101220162802002119201841606a221622182400201641186a42003703002016200242ffffffff0f833703102016200137030820162000370300201941046a20161020201841606a22162218240020142016101220162802002119201841606a221622182400201641186a42003703002016200642ffffffff0f833703102016200537030820162004370300201941246a20161020201841606a22162218240020142016101220162802002119201841606a221622182400201641186a200f3703002016200e3703102016200d3703082016200c370300201941c4006a20161020201841606a221622182400201420161012418001211a201628020041e4006a4180011021102d210e201841606a2216221824002014201610122016290300210f2010a72216201541a0016a1023200f4284017c2210a72219201541a0016a101f201941206a201641206a201541a0016a10151032201541a0016a20154180016a101220152903800120107ca741206a41001021201541a0016a201541e0006a101220152903602110201841606a2216221824002014201610122016290300210d201841606a221622182400201641186a42003703002016200a42ffffffff0f83220c3703102016200937030820162008370300201841606a221822192400201620181013201941606a221622192400201641186a4200370300201642003703102016420037030820164200370300200e201820162017200f2010421f7c42e0ffffff0f837c200d7da741a4016a20174120102c2116102e2118024002402016450d000240024020184120490d004220210e0c010b102ead210e4200210b0b201941606a2216221824002014201610122016290300201641086a290300201641106a290300201641186a290300200e200b200b200b103d201841606a221622182400201420161012201641186a2903002106201641106a2903002110201641086a290300210f2016290300210a201841606a2216221824002014201610120240200a200e7c220e201629030022057d421f56200f200b7c200e200a542214ad7c220a201641086a290300220d7d200e2005542219ad7d220e420052200e501b2010200b7c220e2014200a200f54200a200f511bad7c220f201641106a29030022057d22042019200a200d54200a200d511bad220a7d220d4200522006200b7c200e201054ad7c200f200e54ad7c201641186a2903007d200f200554ad7d2004200a54ad7d220b420055200b501b200d200b84501b0d0041004100101b0b201841606a221822142400201720181023201441606a221422162400201641606a221622172400201641186a4180820441186a290300370000201641106a4180820441106a290300370000201641086a4180820441086a2903003700002016410029038082043700002016201410122014290300210b201441086a290300210a201441106a290300210f201441186a2903002110201741606a221422162400201441186a20103703002014200f3703102014200a3703082014200b370300201641606a221622172400201441e001201610382016290300210b201641086a290300210a201641106a290300210f201641186a2903002110201741606a221422162400201441186a20103703002014200f3703102014200a3703082014200b370300201641606a221622172400201420161013201741606a22142217240020182016201410372018201410350d0141004100101b0c010b0240024020180d0041e00021160c010b2015102e2217ad420042004200103e201541186a290300210b201541106a290300210a201541086a290300210f20152903002110201941606a22142216240041c00020141023201641606a2216221824002014201610122016290300201641086a290300201641106a290300201641186a2903002010200f200a200b103d2014101520171021201841606a22162217240020142016101220162802002116201741606a221722192400201420171012201728020041206a4100102e102b201641206a211a0b201941606a2214221724002016201410230240201410360d00201a20141015101b0c020b201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080a0d2abd0e400370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142802002116201841606a22142400201441186a42003703002014200c3703102014200937030820142008370300201641046a2014102020174124101b0c010b201741606a221422162400201820141012201441186a290300210b201441086a290300210a2014290300210f201441106a2903002110201641606a221422162400201641606a221622172400201641186a41a0820441186a290300370000201641106a41a0820441106a290300370000201641086a41a0820441086a290300370000201641002903a082043700002016201410122014290300210e201441086a290300210d201441106a2903002106201441186a2903002105201741606a221422162400201441186a2005370300201420063703102014200d3703082014200e370300201641606a221622172400201441e00120161038200f2016290300832010201641106a2903008384200a201641086a29030083200b201641186a290300834280808080a0c0de8515858484500d00201741606a22162214240041c00020161023201610152117201441606a221422182400201441186a4280808080a0d2abd0e400370300201442003703102014420037030820144200370300201720141020201841606a22142218240020162014101220142802002116201841606a22142400201441186a42003703002014200c3703102014200937030820142008370300201641046a2014102020174124101b0b201541c0016a24000b86860106057f0a7e017f067e037f047e230041e0046b2200210120002400418001101e1a41c00041e0001021024010184104490d00024002400240024002400240024002400240024002400240101722024182bcf7374a0d000240200241dcadedc37c4a0d000240200241e4e8b2917a4a0d00200241db9697ed78460d03200241c1b6e2ae79470d0e0240101a450d0041004100101b0b10331a200041606a22032200240041c00020031023200041606a220022022400200041186a4200370300200042003703102000420037030820004201370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002105200041086a2903002106200041106a2903002107200041186a2903002108200441606a220022022400200041186a2008370300200020073703102000200637030820002005370300200241606a220222042400200041012002103902402005a74101712002290300220942ff008320092005420183220a501b220b421f564200200a7d2209200241086a29030083220c420052200c501b2009200241106a29030083220d4200522009200241186a29030083220e420052200e501b200d200e84501b460d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b20031015210f200441606a220022022400200041186a200e3703002000200d3703102000200c3703082000200b370300200f20001020200a4200520d04200241606a22002202240020032000101220002802002104200241606a220022022400200041186a200837030020002007370310200020063703082000200542807e83370300200441206a20001020200241606a220022022400200041186a420037030020004200370310200042003703082000200b200d84200c200e8484420052ad370300200241606a2202220424002000410520021038200241186a2903002105200241106a290300210a20022903002109200241086a2903002106200441606a2200220224002003200010122005200041186a2903007c200a200041106a29030022057c220a200554ad7c200a2009200029030022057c220820055422042006200041086a29030022097c2004ad7c220520095420052009511bad7c2207200a54ad7c210c0c0d0b200241e5e8b2917a460d04200241de9fb5c47b470d0d0240101a450d0041004100101b0b0240103341ff004b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141c0046a41186a2202290300210a200141c0046a41106a22042903002109200141c0046a41086a2203290300210620012903c0042107412420014180036a101620014180036a200141c0046a101220022903002108200429030021102003290300211120012903c004210e200041606a220f2200240041c400200f1016200041606a22002202240041e40020001016200241606a22022204240020002002101220022903002112200241086a2903002113200241106a2903002114200241186a2903002105200441606a22022204240041e0850420021012024020122002290300582013200241086a29030022125820132012511b2014200241106a2903002212582005200241186a29030022135820052013511b2014201285200520138584501b0d0041004100101b0b200441606a22022204240020002002101202402002290300220542237c22131018ad544100200241086a290300221420132005542203ad7c2212501b200241186a290300200241106a290300221520032012201454201320055a1bad7c2205201554ad7c22134200532005201384501b0d0041004100101b0b200441606a22022204240020002002101220022802002103200441606a220222042400200341046a20021016200441606a220422032400200220041012200141c0026a2004290300200441086a290300200441106a290300200441186a290300103e200141c0026a41186a2903002105200141c0026a41106a2903002113200141c0026a41086a290300211420012903c0022112200341606a22042203240041c00020041023200341606a2203221624002004200310122003290300200341086a290300200341106a290300200341186a2903002012201420132005103d200410152002101f201641606a221622032400200020022016103a200341606a22032217240020162003101202402003290300220542247c22131018ad58200341086a290300221420132005542216ad7c221250221820181b200341106a290300221520162012201454201320055a1bad7c220550200341186a2903002005201554ad7c221350220320031b2005201384501b0d0041004100101b0b201741606a22032216240020042003101220032802002117201641606a220322162400200020031012201741206a200328020041246a20021015102f201641606a220022032400200420022000103a200341606a220222032400200020021012200228020041206a41001021200341606a220022022400200041186a200a370300200020093703102000200637030820002007370300200241606a220222032400200020021013200341606a220022032400200041186a200837030020002010370310200020113703082000200e370300200341606a220322162400200020031013201641606a220022162400200f20001012200220032000290300200041086a290300200041106a290300200041186a290300103f201641606a22022200240020021019200041606a220022032400200220001012200041186a2903002105200041106a2903002113200041086a290300211420002903002112200341606a220022022400200f20001012200041186a2903002115200041106a290300210c200041086a290300210d20002903002119200241606a220024002004200010122012201420132005200720062009200a200e2011201020082019200d200c20152000290300200041086a290300200041106a290300200041186a29030010424100410010270c0d0b02402002418ac7f7977f4a0d00200241ddadedc37c460d05200241c5d397cc7e470d0d0240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141c8046a22022903002105200141d0046a2204350200210a20012903c0042109412420014180036a101620014180036a200141c0046a1012200229030021062004350200210720012903c0042108200041606a220022022400200041186a42003703002000200a3703102000200537030820002009370300410020001020412041051021200241606a220222002400410041c00020021026200041606a220022042400200041186a420037030020002007370310200020063703082000200837030041002000102041202002101f200441606a220022022400410041c00020001026200241606a22022204240020002002102520023100002105200441606a2200240041c00020001023200010152200200542005210212000412010270c0d0b2002418bc7f7977f460d05200241a793ff0f470d0c0240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a220322002400410420031016200041606a220022022400200241606a220222042400200241186a41e0820441186a290300370000200241106a41e0820441106a290300370000200241086a41e0820441086a290300370000200241002903e0820437000020022000101220002903002105200041086a290300210a200041106a2903002109200041186a2903002106200441606a220022022400200041186a2006370300200020093703102000200a37030820002005370300200241606a220222042400200041e0012002103820022903002105200241086a290300210a200241106a2903002109200241186a2903002106200441606a220022022400200041186a2006370300200020093703102000200a37030820002005370300200241606a220222042400200020021013200441606a220422002400200320022004103702402003200410350d0041004100101b0b200041606a220022022400200241606a220222032400200241186a4180830441186a290300370000200241106a4180830441106a290300370000200241086a4180830441086a29030037000020024100290380830437000020022000101220002903002105200041086a290300210a200041106a2903002109200041186a2903002106200341606a220022022400200041186a2006370300200020093703102000200a37030820002005370300200241606a220222032400200041e0012002103820022903002105200241086a290300210a200241106a2903002109200241186a2903002106200341606a220022022400200041186a2006370300200020093703102000200a37030820002005370300200241606a2202220f24002000200210134101210302402004200210350d00200f41606a220022022400200041186a4280808080f0f384afdb00370300200042003703102000420037030820004200370300200241606a2202220f24002000200210132004200210350d00200f41606a220022022400200041186a4280808080f0b4f2ff01370300200042003703102000420037030820004200370300200241606a2202240020002002101320042002103541004721030b41e0002003102141e000412010270c0c0b02400240024002400240024002402002418ddc9094044a0d000240200241b2cffaca004a0d0020024183bcf737460d02200241fca5e0c000470d130240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a220222002400410420021016200041606a22002204240020022000101220012000290300200041086a290300200041106a290300200041186a290300104041002002101f200441606a220022022400200041186a4200370300200042003703102000420037030820004204370300412020001020200241606a220222002400410041c00020021026200041606a22002204240020022000102520002903002105200041086a290300210a200041106a3502002109200441606a22002204240041c00020001023200010152102200441606a22002400200041186a4200370300200020093703102000200a370308200020053703002002200010202002412010270c130b200241b3cffaca00460d02200241dde5e19d02470d120240101a450d0041004100101b0b200141c0006a1018ad420042004200103b20014198016a290300210520014190016a290300210a20014188016a2903002109200141e8006a2903002106200141f0006a2903002107200141f8006a2903002108200141c8006a2903002110200141d0006a2903002111200141c0006a41186a290300210e20012903800121132001290360211420012903402112200041606a220022022400200041186a200e370300200020113703102000201037030820002012370300200241606a220222042400200020021013200441606a220022042400200041186a2008370300200020073703102000200637030820002014370300200441606a220424002000200410132002200420132009200a2005103f4100410010270c120b0240200241c1f089d3064a0d002002418edc909404460d032002419ec2c89a06470d120240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a220222002400410420021016200041606a22002204240020022000101220014180026a2000290300200041086a290300200041106a290300200041186a290300104020014180026a41086a290300210520014180026a41106a290300210a20014180026a41186a29030021092001290380022106200441606a22002204240041c00020001023200010152102200441606a22002400200041186a20093703002000200a37031020002005370308200020063703002002200010202002412010270c120b200241c2f089d306460d03200241b184828507460d04200241a6b1c08a07460d050c110b0240101a450d0041004100101b0b10331a200041606a22032200240041c00020031023200041606a220022022400200041186a4200370300200042003703102000420037030820004200370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002105200041086a2903002106200041106a2903002107200041186a2903002108200441606a220022022400200041186a2008370300200020073703102000200637030820002005370300200241606a220222042400200041012002103902402005a74101712002290300220942ff008320092005420183220a501b220b421f564200200a7d2209200241086a29030083220c420052200c501b2009200241106a29030083220d4200522009200241186a29030083220e420052200e501b200d200e84501b460d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b20031015210f200441606a220022022400200041186a200e3703002000200d3703102000200c3703082000200b370300200f200010200240200a4200520d00200241606a22002202240020032000101220002802002104200241606a220022022400200041186a200837030020002007370310200020063703082000200542807e83370300200441206a20001020200241606a220022022400200041186a420037030020004200370310200042003703082000200b200d84200c200e8484420052ad370300200241606a2202220424002000410520021038200241186a2903002105200241106a290300210a20022903002109200241086a2903002106200441606a2200220224002003200010122005200041186a2903007c200a200041106a29030022057c220a200554ad7c200a2009200029030022057c220820055422042006200041086a29030022097c2004ad7c220520095420052009511bad7c2207200a54ad7c210c0c0f0b41004100102102400240200b200d84200c200e848450450d00420021064200210742002108420021090c010b42a8c5ada4959bfb8629211342c8dfe1c198b5d18156211042f69180c2d492afd3cb00211142e3cacff7e0e2e4973621054200210a4200211442002112420021090340200241606a22002202240020032000101220002903002106200241606a220022022400200041186a2013370300200020103703102000201137030820002005370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002107200041086a2903002108200041106a2903002115200041186a2903002119200441606a220022022400200041186a20193703002000201537031020002008370308200020073703002006200a7ca741206a200010202012200a42207c2206200a54220020142000ad7c22072014542006200a5a1bad7c2208201254210020132010200542017c2215200554220420112004ad7c2219201154201520055a1bad7c221a201054ad7c21132006210a20072114200821122015210520192111201a21102006200b542007200c542007200c511b2008200d5420092000ad7c2209200e542009200e511b2008200d852009200e8584501b0d000b0b200241606a220022022400200320001012200041186a29030020097c200041106a290300220520087c220a200554ad7c200a2000290300220520067c22082005542204200041086a290300220920077c2004ad7c220520095420052009511bad7c2207200a54ad7c210c0c0e0b0240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141c0046a41106a2903002108200141c0046a41086a290300210520012903c004210a200041606a220222002400412420021016200041606a220022042400200220001012200141206a2000290300200041086a290300200041106a290300200041186a2903001040200141206a41186a2903002110200141206a41106a2903002109200141206a41086a290300210620012903202107200441606a220422002400200410190240200410360d00200041606a22032200240020031019200041606a220422002400200441186a2010370300200420093703102004200637030820042007370300200041606a220f220024002004200f1013200f200310350d00200041606a220022042400200041186a2010370300200020093703102000200637030820002007370300410020001020412041051021200441606a220022042400410041c00020001026200441606a2204220324002004101941002004101f41202000101f200341606a220422002400410041c00020041026200041606a22032200240020042003102520032d00000d00200041606a22032200240041c00020031023200041606a220022042400200441606a2204220f2400200441186a41a0830441186a290300370000200441106a41a0830441106a290300370000200441086a41a0830441086a290300370000200441002903a0830437000020042000101220002903002110200041086a2903002111200041106a290300210e200041186a2903002113200f41606a220022042400200041186a20133703002000200e3703102000201137030820002010370300200441606a2204220f2400200041e0012004103820042903002110200441086a2903002111200441106a290300210e200441186a2903002113200310152104200f41606a2200220f2400200041186a20133703002000200e3703102000201137030820002010370300200420001020200f41606a2200220f240020032000101220002802002116200f41606a22032200240020031019201641046a2003101f20044124101b0b200041606a220022042400200041186a42003703002000200942ffffffff0f833703102000200637030820002007370300200441606a220422032400200020041013200341606a220022032400200041186a42003703002000200842ffffffff0f832209370310200020053703082000200a370300200341606a2203220f24002000200310134100410041c08304200420032002102941002002101f200f41606a220022022400200041186a4200370300200042003703102000420037030820004204370300412020001020200241606a220422002400410041c00020041026200041606a22002202240020042000102520002903002106200041086a2903002107200041106a2903002108200041186a2903002110200241606a220022022400200241606a220222032400200241186a41e0830441186a290300370000200241106a41e0830441106a290300370000200241086a41e0830441086a290300370000200241002903e0830437000020022000101220002903002111200041086a290300210e200041106a2903002113200041186a2903002114200341606a220022022400200041186a2014370300200020133703102000200e37030820002011370300200241606a220222032400200041a00120021038200241186a29030021112002290300210e200241086a2903002113200241106a2903002114200341606a22002400200041186a201120108337030020002014200883200984370310200020132007832005843703082000200e200683200a843703002004200010244100410010270c0f0b0240101a450d0041004100101b0b200141a0016a1018ad420042004200103b200141f8016a2903002105200141f0016a290300210a200141e8016a2903002109200141c8016a2903002106200141d0016a2903002107200141d8016a2903002108200141a0016a41086a2903002110200141a0016a41106a2903002111200141a0016a41186a290300210e20012903e001211320012903c001211420012903a0012112200041606a22022200240041c00020021023200041606a2200220424002002200010122000290300200041086a290300200041106a290300200041186a290300103c2002101541001021200441606a220022042400200041186a200e370300200020113703102000201037030820002012370300200441606a220422032400200020041013200341606a220022032400200041186a2008370300200020073703102000200637030820002014370300200341606a2203220f24002000200310132004200320132009200a2005103f200f41606a22042200240020041019200041606a220022032400200420001012200041186a2903002115200041106a290300210c200041086a290300210d20002903002119200341606a220024002002200010122019200d200c2015201220102011200e201420062007200820132009200a20052000290300200041086a290300200041106a290300200041186a29030010424100410010270c0e0b0240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141c0046a41186a2903002119200141c0046a41106a290300210e200141c0046a41086a290300210720012903c00421081041200041606a220022022400200041186a4200370300200042003703102000420037030820004207370300200241606a220222042400200020021013200441606a220022042400200220001025024020002903002205200041106a290300220a83200041086a2903002209200041186a29030022068383427f520d00200441606a220022042400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044111102141004124101b0b200441606a220022022400200041186a4200370300200042003703102000420037030820004207370300200241606a220222042400200020021013200441606a220022042400200041186a2006200a200542017c2210200554220320092003ad7c2211200954201020055a1bad7c2213200a54ad7c370300200020133703102000201137030820002010370300200220001024200441606a22042200240041c00020041023200041606a2200220224002004200010122000290300200041086a290300200041106a290300200041186a290300103c200410154100102102402008200e42ffffffff0f832210842007844200520d00200241606a22032200240041c0002003102320031015210f200041606a220022022400200041186a4280808080a0d2abd0e400370300200042003703102000420037030820004200370300200f20001020200241606a220022022400200320001012200028020041046a41001021200f4124101b0b200241606a220022022400200041186a20063703002000200a3703102000200937030820002005370300410020001020412041021021200241606a220322002400410041c00020031026200041606a220022022400200320001025024020002903002215200041106a350200220c84200041086a290300220d845022170d00200141c0046a41186a2006370300200120053703c004200120093703c8042001200a3703d0044100200141c0046a1020412041041021410041c00020014180036a102620014180036a200141a0046a102520014180046a41086a41c0820441086a29030037030020014180046a41106a41c0820441106a29030037030020014180046a41186a41c0820441186a290300370300200141002903c0820437038004200141a0046a41086a2903002111200141a0046a41106a2903002113200141a0046a41186a290300211420012903a004211220014180046a200141e0036a1012200141e0036a41a001200141c0036a1038200141a0036a41186a2014200141c0036a41186a2903008337030020012013200141c0036a41106a290300833703b00320012011200141c0036a41086a290300833703a8032001201220012903c003833703a00320014180036a200141a0036a1024200241606a220022022400200041186a42003703002000200c3703102000200d37030820002015370300410020001020412041031021200241606a220322002400410041c00020031026200041606a22002202240020032000102520002903002113200041086a2903002111200041186a290300211a200041106a2903002114200241606a220022022400200020112013427f7c2212201354220fad7c427f7c22133703082000201237030020002014427f7c2212200f201320115420132011511bad7c2211370310200041186a201a2012201454ad7c2011201254ad7c427f7c3703002003200010240b200241606a220022022400200041186a4200370300200020103703102000200737030820002008370300410020001020412041031021200241606a220222002400410041c00020021026200041606a22002203240020022000102520002903002111200041086a2903002113200041186a290300211a200041106a2903002114200341606a22002203240020002013201142017c2212201154220fad7c220b3703082000201237030020002014200f200b201354201220115a1bad7c2211370310200041186a201a2011201454ad7c370300200220001024200341606a220022022400200041186a20063703002000200a3703102000200937030820002005370300410020001020412041021021200241606a220322002400410041c00020031026200041606a22002202240020032000102520002903002111200041086a2903002113200041106a2903002114200041186a2903002112200241606a220022022400200241606a2202220f2400200241186a4180840441186a290300370000200241106a4180840441106a290300370000200241086a4180840441086a2903003700002002410029038084043700002002200010122000290300211a200041086a290300210b200041106a290300211b200041186a290300211c200f41606a220022022400200041186a201c3703002000201b3703102000200b3703082000201a370300200241606a2202220f2400200041a00120021038200241186a290300211a2002290300210b200241086a290300211b200241106a290300211c200f41606a220022022400200041186a201a2012833703002000201c2014832010843703102000201b2013832007843703082000200b201183200884370300200320001024200241606a220022022400200041186a42003703002000200c3703102000200d37030820002015370300200241606a220322022400200020031013200241606a220022022400200041186a4200370300200020103703102000200737030820002008370300200241606a220f220224002000200f1013200241606a220022022400200041186a20063703002000200a3703102000200937030820002005370300200241606a2216220224002000201610134100410041a084042003200f20161029024020170d00200241606a22032200240041c0002003102320031015210f200041606a220022022400200041186a4280808080e08dabe3f300370300200042003703102000420037030820004200370300200f20001020200241606a220022022400200320001012200028020041046a41001021200f4124101b0b200241606a220022022400200041186a20193703002000200e3703102000200737030820002008370300200241606a22032202240020002003101320031031450d0a200241606a22002202240041c00020001023200010152103200241606a2202220f2400200241186a4280808080a0c0de851537030042002111200242003703102002420037030820024200370300200320021020200f41606a2202220f240020002002101220022802002116200f41606a2202220f240020021019201641046a2002101f200f41606a2202220f2400200020021012200228020041246a41001021200f41606a2202220f240020002002101220022802002116200f41606a2202220f2400200241186a20063703002002200a3703102002200937030820022005370300201641c4006a20021020200f41606a2202220f24002000200210124180012116200228020041e4006a4180011021102d2113200f41606a2202220f240020042002101220022802002102200f41606a2204220f24002000200410122004290300210e200220014180036a1023200e4284017c2214a7220420014180036a101f200441206a200241206a20014180036a1015103220014180036a200141c0046a101220012903c00420147ca741206a4100102120014180036a200141a0046a101220012903a0042114200f41606a22022204240020002002101220022903002112200441606a220222042400200241186a4200370300200220103703102002200737030820022008370300200441606a2204220f2400200220041013200f41606a2202220f2400200241186a42003703002002420037031020024200370308200242003703002013200420022003200e2014421f7c42e0ffffff0f837c20127da741a4016a20034120102c2102102e210402402002450d000240024020044120490d00422021120c010b102ead2112420021110b200f41606a2202220424002000200210122002290300200241086a290300200241106a290300200241186a2903002012201120112011103d200441606a220222042400200020021012200241186a290300210c200241106a2903002114200241086a29030021132002290300210e200441606a2202220424002000200210120240200e20127c22122002290300220d7d421f56201320117c2012200e542200ad7c220e200241086a29030022157d2012200d54220fad7d22124200522012501b201420117c22122000200e201354200e2013511bad7c2213200241106a290300220d7d2219200f200e201554200e2015511bad220e7d2215420052200c20117c2012201454ad7c2013201254ad7c200241186a2903007d2013200d54ad7d2019200e54ad7d22114200552011501b2015201184501b0d0041004100101b0b200441606a220422002400200320041023200041606a220022022400200241606a220222032400200241186a41c0840441186a290300370000200241106a41c0840441106a290300370000200241086a41c0840441086a290300370000200241002903c0840437000020022000101220002903002111200041086a290300210e200041106a2903002113200041186a2903002114200341606a220022022400200041186a2014370300200020133703102000200e37030820002011370300200241606a220222032400200041e0012002103820022903002111200241086a290300210e200241106a2903002113200241186a2903002114200341606a220022022400200041186a2014370300200020133703102000200e37030820002011370300200241606a220222032400200020021013200341606a22002203240020042002200010372004200010350d0a41004100101b0c0a0b20040d0741e00021040c080b0240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012024020012903c0042205200141c0046a41106a350200220a84200141c0046a41086a2903002209844200520d00200041606a22022200240041c00020021023200210152104200041606a220022032400200041186a4280808080c0ec8ae3897f370300200042003703102000420037030820004200370300200420001020200341606a220322002400200220031012200328020041046a4100102120044124101b0b200041606a220022022400200041186a42003703002000200a3703102000200937030820002005370300410020001020412041031021200241606a220222002400410041c00020021026200041606a22002204240020022000102520002903002105200041086a290300210a200041106a2903002109200041186a2903002106200441606a22002204240041c00020001023200010152102200441606a22002400200041186a2006370300200020093703102000200a370308200020053703002002200010202002412010270c0c0b0240101a450d0041004100101b0b10331a1041200041606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002105200041086a290300210a200041106a2903002109200041186a2903002106200441606a220022022400200241606a220222042400200241186a4180850441186a290300370000200241106a4180850441106a290300370000200241086a4180850441086a29030037000020024100290380850437000020022000101220002903002107200041086a2903002108200041106a2903002110200041186a2903002111200441606a220022022400200041186a2011370300200020103703102000200837030820002007370300200241606a220222042400200041a0012002103820022903002107200241086a2903002108200241106a2903002110200241186a2903002111200441606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222042400200020021013200441606a220022042400200041186a20112006833703002000201020098337031020002008200a8337030820002007200583370300200220001024200441606a220022022400200041186a2006370300200020093703102000200a37030820002005370300200241606a220222042400200020021013200441606a220022042400200041186a4200370300200042003703102000420037030820004200370300200441606a220424002000200410134100410041a085042002200410284100410010270c0b0b0240101a450d0041004100101b0b10331a200041606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002105200041086a290300210a200041106a3502002109200441606a22002204240041c00020001023200010152102200441606a22002400200041186a4200370300200020093703102000200a370308200020053703002002200010202002412010270c0a0b41004101102102400240200b200d84200c200e848450450d00420021064200210742002108420021090c010b42bb8ec8b0a7aa8b87b17f211342b2d4f98bd7bfb3f726211042f3e08ad6afe992fa0c211142f699e8bfabfcf2cf2d21054200210a4200211442002112420021090340200241606a22002202240020032000101220002903002106200241606a220022022400200041186a2013370300200020103703102000201137030820002005370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002107200041086a2903002108200041106a2903002115200041186a2903002119200441606a220022022400200041186a20193703002000201537031020002008370308200020073703002006200a7ca741206a200010202012200a42207c2206200a54220020142000ad7c22072014542006200a5a1bad7c2208201254210020132010200542017c2215200554220420112004ad7c2219201154201520055a1bad7c221a201054ad7c21132006210a20072114200821122015210520192111201a21102006200b542007200c542007200c511b2008200d5420092000ad7c2209200e542009200e511b2008200d852009200e8584501b0d000b0b200241606a220022022400200320001012200041186a29030020097c200041106a290300220520087c220a200554ad7c200a2000290300220520067c22082005542204200041086a290300220920077c2004ad7c220520095420052009511bad7c2207200a54ad7c210c0c080b0240101a450d0041004100101b0b02401033413f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141d8046a2903002105200141d0046a290300210a200141c8046a290300210920012903c0042106200041606a220022022400412420001016200010362104200241606a22022203240020044522042002101402402000200210350d0041004100101b0b02402006200a842009200584844200520d00200341606a22022200240041c0002002102320021015210f200041606a220022032400200041186a428080808080c3ae84db00370300200042003703102000420037030820004200370300200f20001020200341606a22002203240020022000101220002802002102200341606a220022032400200041186a4200370300200042003703102000420037030820004200370300200241046a20001020200f4124101b0b200341606a2200220224002000101941002000101f412041051021200241606a220222002400410041c00020021026200041606a220022032400200041186a20053703002000200a370310200020093703082000200637030041002000102041202002101f200341606a220222002400410041c00020021026200041606a22002203240020022000102520002903002107200041086a2903002108200041106a2903002110200041186a2903002111200341606a220022032400200041186a201137030020002010370310200020083703082000200742807e832004ad84370300200220001024200341606a22002202240041c0002000102320001015220320041021200241606a22022200240020021019200041606a220022042400200041186a20053703002000200a3703102000200937030820002006370300200441606a220424002000200410132003412041c085042002200410284100410010270c080b0240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b200041606a220222002400410420021016200041606a220022042400200220001012200141e0026a2000290300200041086a290300200041106a290300200041186a2903001040200441606a22022200240041c00020021023200041606a2200220424002002200010122000290300200041086a290300200041106a290300200041186a290300103c2002101541001021200441606a22022200240041c00020021023200041606a2200220424002002200010122000290300200041086a290300200041106a290300200041186a290300103c2002101541001021200441606a22002204240041c0002000102320001015220341201021200441606a2204220f240020022004101220042802002102200f41606a2204220f240020002004101220042903002105200220014180036a1023200542207c220aa7220420014180036a101f200441206a200241206a20014180036a1015103220014180036a200141c0046a101220012903c004200a7ca741206a4100102120014180036a200141a0046a101220012903a004210a200f41606a2202240020002002101220032005200a421f7c42e0ffffff0f837c20022903007da741c0006a10270c070b0240101a450d0041004100101b0b02401033411f4b0d0041004100101b0b410420014180036a101620014180036a200141c0046a1012200141c0046a41106a350200210520012903c004210a200141c0046a41086a2903002109104102402009200a200584844200520d00200041606a22022200240041c00020021023200210152104200041606a220022032400200041186a4280808080f0beefa71e370300200042003703102000420037030820004200370300200420001020200341606a220322002400200220031012200328020041046a4100102120044124101b0b200041606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222042400200020021013200441606a22002204240020022000102520002903002106200041086a2903002107200041106a2903002108200041186a2903002110200441606a220022022400200241606a220222042400200241186a4180860441186a290300370000200241106a4180860441106a290300370000200241086a4180860441086a29030037000020024100290380860437000020022000101220002903002111200041086a290300210e200041106a2903002113200041186a2903002114200441606a220022022400200041186a2014370300200020133703102000200e37030820002011370300200241606a220222042400200041a0012002103820022903002111200241086a290300210e200241106a2903002113200241186a2903002114200441606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222042400200020021013200441606a220022042400200041186a2014201083370300200020132008832005843703102000200e20078320098437030820002011200683200a84370300200220001024200441606a220022022400200041186a42003703002000200842ffffffff0f833703102000200737030820002006370300200241606a220222042400200020021013200441606a220022042400200041186a420037030020002005370310200020093703082000200a370300200441606a220424002000200410134100410041a086042002200410284100410010270c060b200141a0026a102e2204ad420042004200103e200141a0026a41186a2903002111200141a0026a41106a290300210e200141a0026a41086a290300211320012903a0022114200f41606a22002202240041c00020001023200241606a2202220324002000200210122002290300200241086a290300200241106a290300200241186a29030020142013200e2011103d2000101520041021200341606a22022203240020002002101220022802002104200341606a2202220f2400200020021012200228020041206a4100102e102b200441206a21160b200f41606a2200220224002004200010230240200010360d00201620001015101b0c020b200241606a22022200240041c00020021023200210152104200041606a220022032400200041186a4280808080a0d2abd0e400370300200042003703102000420037030820004200370300200420001020200341606a2200220324002002200010122000280200210f200341606a220022022400200041186a4200370300200020103703102000200737030820002008370300200f41046a2000102020044124101b0c010b200341606a220022022400200420001012200041186a2903002111200041086a290300210e20002903002113200041106a2903002114200241606a220022022400200241606a220222042400200241186a41e0840441186a290300370000200241106a41e0840441106a290300370000200241086a41e0840441086a290300370000200241002903e0840437000020022000101220002903002112200041086a2903002115200041106a290300210c200041186a290300210d200441606a220022022400200041186a200d3703002000200c3703102000201537030820002012370300200241606a220422022400200041e0012004103820132004290300832014200441106a2903008384200e200441086a290300832011200441186a290300834280808080a0c0de8515858484500d00200241606a22022200240041c00020021023200210152104200041606a220022032400200041186a4280808080a0d2abd0e400370300200042003703102000420037030820004200370300200420001020200341606a2200220324002002200010122000280200210f200341606a220022022400200041186a4200370300200020103703102000200737030820002008370300200f41046a2000102020044124101b0b200241606a22002204240041c00020001023200010152102200441606a22002400200041186a20063703002000200a37031020002009370308200020053703002002200010202002412010270c020b200241606a220022022400200320001012200041186a2903002110200041106a2903002111200041086a290300210e20002903002113200241606a2200220224002003200010122013200e201120102008200029030022147d220a42207c22092005200041086a29030022067d20082014542204ad7d22082009200a54220fad7c22142007200041106a29030022127d22152004200520065420052006511bad22057d2206200f20142008542009200a5a1bad7c220a200c200041186a2903007d2007201254ad7d2015200554ad7d200a200654ad7c103d200241606a22022200240041c00020021023200210152104200041606a2200220f2400200041186a4200370300200042003703102000420037030820004220370300200420001020200f41606a2200220f240020032000101220002802002100200f41606a2203220f240020022003101220032903002105200020014180036a1023200542207c220aa7220320014180036a101f200341206a200041206a20014180036a1015103220014180036a200141c0046a101220012903c004200a7ca741206a4100102120014180036a200141a0046a101220012903a004210a200f41606a2200240020022000101220042005200a421f7c42e0ffffff0f837c20002903007da741c0006a10270c010b200241606a220022022400200320001012200041186a2903002110200041106a2903002111200041086a290300210e20002903002113200241606a2200220224002003200010122013200e201120102008200029030022147d220a42207c22092005200041086a29030022067d20082014542204ad7d22082009200a54220fad7c22142007200041106a29030022127d22152004200520065420052006511bad22057d2206200f20142008542009200a5a1bad7c220a200c200041186a2903007d2007201254ad7d2015200554ad7d200a200654ad7c103d200241606a22022200240041c00020021023200210152104200041606a2200220f2400200041186a4200370300200042003703102000420037030820004220370300200420001020200f41606a2200220f240020032000101220002802002100200f41606a2203220f240020022003101220032903002105200020014180036a1023200542207c220aa7220320014180036a101f200341206a200041206a20014180036a1015103220014180036a200141c0046a101220012903c004200a7ca741206a4100102120014180036a200141a0046a101220012903a004210a200f41606a2200240020022000101220042005200a421f7c42e0ffffff0f837c20002903007da741c0006a10270b41004100101b200141e0046a24000b040010430b040010340bac4c0b047f057e017f017e017f017e017f057e017f027e027f230022002101418001101e1a0240101a450d0041004100101b0b200041606a220022022400200041186a42003703002000420037031020004200370308200042a00137030041c0002000102041e00041051021200241606a220022022400200041186a42808080a0e5c8d3bccd0037030020004200370310200042003703082000420037030041800120001020200241606a22032200240041c00020031023200041606a220022022400200320001012200041186a2903002104200041106a2903002105200041086a290300210620002903002107200241606a220022022400200320001012024002402006200742c0007c22082007542209ad7c220a42005220052009200a200654200820075a1bad7c220642005220042006200554ad7c22074200522007501b2006200784501b0d00200820002903005a200a200041086a29030022055a200a2005511b2006200041106a29030022045a2007200041186a29030022055a20072005511b2006200485200720058584501b0d010b200241606a220022022400200041186a428080808090ee9ea4ce00370300200042003703102000420037030820004200370300410020001020410441c100102141004124101b0b200241606a220022022400200041186a2007370300200020063703102000200a3703082000200837030041c00020001020200310152109200241606a220022022400200041186a4200370300200042003703102000420037030820004204370300200920001020200241606a22002202240020032000101220002802002109200241606a220022022400200041186a4280808080c0ca91a7cd00370300200042003703102000420037030820004200370300200941206a20001020200241606a220b2200240041e000200b1023200041606a220022022400200b200010120240200041086a290300504100200041106a290300200041186a29030084501b0d00200241606a220022022400200041186a428080808090ee9ea4ce00370300200042003703102000420037030820004200370300410020001020410441c100102141004124101b0b200241606a220022022400200041186a4200370300200042003703102000420037030820004200370300200241606a220222092400200020021013200941606a22002209240020022000102520002903002107200041086a2903002106200041106a290300210a200041186a2903002108200941606a220022022400200041186a20083703002000200a3703102000200637030820002007370300200241606a220222092400200041012002103902402007a74101712002290300220642ff0083200620074201832207501b2205421f56420020077d2207200241086a29030083220c420052200c50220d1b2007200241106a29030083220e4200522007200241186a2903008322044200522004501b200e2004845022021b460d00200941606a220022092400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b024020054220544100200d1b410020021b0d00410041001021200941606a220d2200240041004120200d1026200041606a220022022400200b2000101220002903002107200041086a2903002106200041186a290300210f200041106a290300210a200241606a220022022400200020062007421f7c22082007542209ad7c2210370308200020083703002000200a20092010200654200820075a1bad7c2207370310200041186a200f2007200a54ad7c370300200241606a2202220924002000410520021039200241186a2903002108200241106a290300210f20022903002110200241086a2903002111200941606a220022022400200d20001012200041186a2903002112200041106a29030021062000290300210a200041086a2903002107200241606a220022022400200b200010120240024020002903004220544100200041086a290300501b4100200041106a290300200041186a29030084501b0d00201220087c2006200f7c220f200654ad7c200f200a20107c2206200a542200200720117c2000ad7c220a200754200a2007511bad7c2208200f54ad7c21070c010b200241606a220022022400200d20001012200041186a2903002107200041106a2903002108200041086a290300210a200029030021060b200241606a2200220224002000200c2005421f7c220f2005542209ad7c22103703082000200f3703002000200e20092010200c54200f20055a1bad7c2205370310200041186a20042005200e54ad7c370300200241606a2202220924002000410520021039200241186a290300210c200241106a290300210420022903002105200241086a290300210e200941606a220022092400200d20001012200620052000290300220f7c22115a200a200e200041086a29030022057c2011200f542202ad7c220f5a200a200f511b20082004200041106a290300220e7c22042002200f200554200f2005511bad7c22105a2007200c200041186a2903007c2004200e54ad7c2010200454ad7c220e5a2007200e511b20082010852007200e8584501b0d000340200941606a220022022400200041186a2007370300200020083703102000200a37030820002006370300200241606a220222092400200020021013200941606a220022092400200041186a42003703002000420037031020004200370308200042003703002002200010242008200642017c22052006542200200a2000ad7c2204200a54200520065a1bad7c220c2008542100200521062004210a200c210820052011542004200f542004200f511b200c20105420072000ad7c2207200e542007200e511b200c2010852007200e8584501b0d000b0b200941606a220022022400200b20001012200041186a290300210742002105200041106a2903002106200041086a290300210a20002903002108200241606a2200220224000240024002400240024002402008421f56200a420052200a501b200642005220074200522007501b2006200784501b450d002000427f3703102000427f37030820004260370300200041186a427f370300200241606a220222092400200020021013200941606a221322002400200b200220131037410041001021200041606a2202220024004100412020021026200041606a2200220924002013200010122000290300200041106a29030084200041086a290300200041186a290300848450450d01418001210d0c020b200241606a220222092400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b2900003700002002200010122000290300200041106a29030084200041086a290300200041186a290300848450450d0242002107420021064200210a0c030b420021064200210e4200210f4200210a422021074200211042002111420021120340200941606a2200220924002007a741e0006a2000102220002903002108200041086a2903002105200041106a2903002104200041186a290300210c200941606a220022092400200041186a200c370300200020043703102000200537030820002008370300200220001024200941606a22002209240020022000101220002903002108200041086a2903002105200041186a2903002114200041106a2903002104200941606a22002202240020002005200842017c220c2008542209ad7c22153703082000200c3703002000200420092015200554200c20085a1bad7c2208370310200041186a20142008200454ad7c370300200241606a220222092400200020021013200941606a220022092400201320001012200f200642207c2208200654220d200e200dad7c2205200e54200820065a1bad7c2204200f54210d20122011200742207c220c200754221620102016ad7c2214201054200c20075a1bad7c2215201154ad7c2112200821062005210e2004210f200c2107201421102015211120082000290300542005200041086a29030022085420052008511b2004200041106a290300220554200a200dad7c220a200041186a290300220854200a2008511b2004200585200a20088584501b0d000b200ca741e0006a210d0b200941606a22002209240020132000101220002903002108200041086a2903002106200041106a290300210a200041186a2903002107200941606a220022092400200b200010120240200820002903005a2006200041086a29030022085a20062008511b200a200041106a29030022085a2007200041186a29030022065a20072006511b200a200885200720068584501b0d00200941606a221622002400200d20161023200041606a220022092400200941606a2209220d2400200941186a200b41186a290000370000200941106a200b41106a290000370000200941086a200b41086a2900003700002009200b29000037000020092000101220002903002107200041086a2903002106200041106a290300210a200041186a2903002108200d41606a220022092400200041186a20083703002000200a3703102000200637030820002007370300200941606a2209220d2400200041032009103820092802002113200d41606a220022092400200041186a427f3703002000427f3703102000427f3703082000427f370300200941606a2209220d24002000201341f801712009103920092903002107200941086a2903002106200941106a290300210a200941186a2903002108200d41606a220022092400200041186a2008427f853703002000200a427f8537031020002006427f8537030820002007427f85370300200941606a2209220d2400200020091013200d41606a2200220d24002016200920001037200d41606a2209220d2400200d41606a220d22162400200d41186a200041186a290000370000200d41106a200041106a290000370000200d41086a200041086a290000370000200d2000290000370000200d2009101220092903002107200941086a2903002106200941106a290300210a200941186a2903002108201641606a220022092400200041186a20083703002000200a37031020002006370308200020073703002002200010240b200941606a220022022400200241606a220222092400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b29000037000020022000101220002903002107200041086a2903002106200041106a290300210a200041186a2903002108200941606a220022022400200041186a20083703002000200a3703102000200637030820002007370300200241606a2202220924002000410120021038200241186a2903002105200241106a2903002106200241086a290300210a20022903002107200941606a220022022400200041186a4200370300200042003703102000420037030820004200370300200241606a220922022400200020091013200241606a220022022400200041186a20052006200742017c2208200754220d200a200dad7c2204200a54200820075a1bad7c2207200654ad7c3703002000200737031020002004370308200020083703002009200010240c020b200941606a22002209240041800120001022200041186a290300210a200041106a2903002106200041086a2903002107200029030021050b200941606a220022022400200241606a220222092400200241186a200b41186a220d290000370000200241106a200b41106a2216290000370000200241086a200b41086a22132900003700002002200b29000037000020022000101220002903002108200041086a2903002104200041106a290300210c200041186a290300210e200941606a220022022400200041186a200e3703002000200c3703102000200437030820002008370300200241606a220222092400200041032002103820022802002117200941606a220022022400200041186a427f3703002000427f3703102000427f3703082000427f370300200241606a220222092400200020172002103920022903002108200241086a2903002104200241106a290300210c200241186a290300210e200941606a220022022400200241606a220222092400200241186a200d290000370000200241106a2016290000370000200241086a20132900003700002002200b2900003700002002200010122000290300210f200041086a2903002110200041106a2903002111200041186a2903002112200941606a220022022400200041186a201237030020002011370310200020103703082000200f370300200241606a22022209240020004101200210382002290300210f200241086a2903002110200241106a2903002111200241186a2903002112200941606a220022022400200041186a4200370300200042003703102000420037030820004200370300200241606a220922022400200020091013200241606a220022022400200041186a2012200a200e427f858384370300200020112006200c427f8583843703102000201020072004427f8583843703082000200f20052008427f8583843703002009200010240b200310152100200241606a220b220224002000200b1023200241606a220022022400200b200010120240200041086a290300420052200041106a2903002206420052200041186a29030022074200522007501b2006200784501b450d00200241606a220022022400200041186a428080808090ee9ea4ce00370300200042003703102000420037030820004200370300410020001020410441c100102141004124101b0b200241606a220022022400200041186a4200370300200042003703102000420037030820004201370300200241606a220222092400200020021013200941606a22002209240020022000102520002903002107200041086a2903002106200041106a290300210a200041186a2903002108200941606a220022022400200041186a20083703002000200a3703102000200637030820002007370300200241606a220222092400200041012002103902402002290300220642ff008320062007420183220a501b2205421f564200200a7d2206200241086a29030083220c420052200c50220d1b2006200241106a29030083220e4200522006200241186a2903008322044200522004501b200e2004845022021b2007a7410171460d00200941606a220022092400200041186a428080808090ee9ea4ce0037030020004200370310200042003703082000420037030041002000102041044122102141004124101b0b024020054220544100200d1b410020021b0d00200941606a220022022400200041186a4200370300200042003703102000420037030820004201370300410020001020200241606a220d2200240041004120200d1026200041606a220022022400200b2000101220002903002107200041086a2903002106200041186a290300210f200041106a290300210a200241606a220022022400200020062007421f7c22082007542209ad7c2210370308200020083703002000200a20092010200654200820075a1bad7c2207370310200041186a200f2007200a54ad7c370300200241606a2202220924002000410520021039200241186a2903002108200241106a290300210f20022903002110200241086a2903002111200941606a220022022400200d20001012200041186a2903002112200041106a29030021062000290300210a200041086a2903002107200241606a220022022400200b200010120240024020002903004220544100200041086a290300501b4100200041106a290300200041186a29030084501b0d00201220087c2006200f7c220f200654ad7c200f200a20107c2206200a542200200720117c2000ad7c220a200754200a2007511bad7c2208200f54ad7c21070c010b200241606a220022022400200d20001012200041186a2903002107200041106a2903002108200041086a290300210a200029030021060b200241606a2200220224002000200c2005421f7c220f2005542209ad7c22103703082000200f3703002000200e20092010200c54200f20055a1bad7c2205370310200041186a20042005200e54ad7c370300200241606a2202220924002000410520021039200241186a290300210c200241106a290300210420022903002105200241086a290300210e200941606a220022092400200d20001012200620052000290300220f7c22115a200a200e200041086a29030022057c2011200f542202ad7c220f5a200a200f511b20082004200041106a290300220e7c22042002200f200554200f2005511bad7c22105a2007200c200041186a2903007c2004200e54ad7c2010200454ad7c220e5a2007200e511b20082010852007200e8584501b0d000340200941606a220022022400200041186a2007370300200020083703102000200a37030820002006370300200241606a220222092400200020021013200941606a220022092400200041186a42003703002000420037031020004200370308200042003703002002200010242008200642017c22052006542200200a2000ad7c2204200a54200520065a1bad7c220c2008542100200521062004210a200c210820052011542004200f542004200f511b200c20105420072000ad7c2207200e542007200e511b200c2010852007200e8584501b0d000b0b200941606a220022022400200b20001012200041186a290300210742002105200041106a2903002106200041086a290300210a20002903002108200241606a2200220224000240024002400240024002402008421f56200a420052200a501b200642005220074200522007501b2006200784501b450d002000427f3703102000427f37030820004260370300200041186a427f370300200241606a220222092400200020021013200941606a221322002400200b200220131037200041606a22002202240042002106200041186a4200370300200042003703102000420037030820004201370300410020001020200241606a2202220024004100412020021026200041606a2200220924002013200010122000290300200041106a29030084200041086a290300200041186a290300848450450d014220210c0c020b200241606a220222092400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b2900003700002002200010122000290300200041106a29030084200041086a290300200041186a290300848450450d0242002107420021064200210a0c030b4200210e4200210f4200210a422021074200211042002111420021120340200941606a22002209240020032000101220002903002108200941606a220022092400200820077ca72000102220002903002108200041086a2903002105200041106a2903002104200041186a290300210c200941606a220022092400200041186a200c370300200020043703102000200537030820002008370300200220001024200941606a22002209240020022000101220002903002108200041086a2903002105200041186a2903002114200041106a2903002104200941606a22002202240020002005200842017c220c2008542209ad7c22153703082000200c3703002000200420092015200554200c20085a1bad7c2208370310200041186a20142008200454ad7c370300200241606a220222092400200020021013200941606a220022092400201320001012200f200642207c2208200654220d200e200dad7c2205200e54200820065a1bad7c2204200f54210d20122011200742207c220c200754221620102016ad7c2214201054200c20075a1bad7c2215201154ad7c2112200821062005210e2004210f200c2107201421102015211120082000290300542005200041086a29030022085420052008511b2004200041106a290300220554200a200dad7c220a200041186a290300220854200a2008511b2004200585200a20088584501b0d000b0b200941606a22002209240020132000101220002903002108200041086a2903002106200041106a290300210a200041186a2903002107200941606a220022092400200b200010120240200820002903005a2006200041086a29030022085a20062008511b200a200041106a29030022085a2007200041186a29030022065a20072006511b200a200885200720068584501b0d00200941606a22002209240020032000101220002903002107200941606a220d220024002007200c7ca7200d1023200041606a220022092400200941606a220922162400200941186a200b41186a290000370000200941106a200b41106a290000370000200941086a200b41086a2900003700002009200b29000037000020092000101220002903002107200041086a2903002106200041106a290300210a200041186a2903002108201641606a220022092400200041186a20083703002000200a3703102000200637030820002007370300200941606a220922162400200041032009103820092802002103201641606a220022092400200041186a427f3703002000427f3703102000427f3703082000427f370300200941606a2209221624002000200341f801712009103920092903002107200941086a2903002106200941106a290300210a200941186a2903002108201641606a220022092400200041186a2008427f853703002000200a427f8537031020002006427f8537030820002007427f85370300200941606a220922162400200020091013201641606a220022162400200d200920001037201641606a2209220d2400200d41606a220d22162400200d41186a200041186a290000370000200d41106a200041106a290000370000200d41086a200041086a290000370000200d2000290000370000200d2009101220092903002107200941086a2903002106200941106a290300210a200941186a2903002108201641606a220022092400200041186a20083703002000200a37031020002006370308200020073703002002200010240b200941606a220022022400200241606a220222092400200241186a200b41186a290000370000200241106a200b41106a290000370000200241086a200b41086a2900003700002002200b29000037000020022000101220002903002107200041086a2903002106200041106a290300210a200041186a2903002108200941606a220022022400200041186a20083703002000200a3703102000200637030820002007370300200241606a2202220924002000410120021038200241186a2903002105200241106a2903002106200241086a290300210a20022903002107200941606a220022022400200041186a4200370300200042003703102000420037030820004201370300200241606a220922022400200020091013200241606a220022022400200041186a20052006200742017c2208200754220d200a200dad7c2204200a54200820075a1bad7c2207200654ad7c3703002000200737031020002004370308200020083703002009200010240c020b200941606a2200220224002003200010122000280200210d200241606a220022092400200d41206a20001022200041186a290300210a200041106a2903002106200041086a2903002107200029030021050b200941606a220022022400200241606a220222092400200241186a200b41186a220d290000370000200241106a200b41106a2216290000370000200241086a200b41086a22032900003700002002200b29000037000020022000101220002903002108200041086a2903002104200041106a290300210c200041186a290300210e200941606a220022022400200041186a200e3703002000200c3703102000200437030820002008370300200241606a220222092400200041032002103820022802002113200941606a220022022400200041186a427f3703002000427f3703102000427f3703082000427f370300200241606a220222092400200020132002103920022903002108200241086a2903002104200241106a290300210c200241186a290300210e200941606a220022022400200241606a220222092400200241186a200d290000370000200241106a2016290000370000200241086a20032900003700002002200b2900003700002002200010122000290300210f200041086a2903002110200041106a2903002111200041186a2903002112200941606a220022022400200041186a201237030020002011370310200020103703082000200f370300200241606a22022209240020004101200210382002290300210f200241086a2903002110200241106a2903002111200241186a2903002112200941606a220022022400200041186a4200370300200042003703102000420037030820004201370300200241606a220922022400200020091013200241606a220022022400200041186a2012200a200e427f858384370300200020112006200c427f8583843703102000201020072004427f8583843703082000200f20052008427f8583843703002009200010240b200241606a22022200240020021019024020021036450d00200041606a22022200240041c00020021023200210152109200041606a2200220d2400200041186a4280808080f0beefa71e370300200042003703102000420037030820004200370300200920001020200d41606a220d220024002002200d1012200d28020041046a4100102120094124101b0b200041606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222092400200020021013200941606a2200220924002002200010252000290300210a200041086a2903002108200041106a2903002107200041186a2903002106200941606a22022200240020021019200041606a22002209240020022000101220002903002105200041086a2903002104200041106a290300210c200041186a290300210e200941606a220022022400200041186a4200370300200042003703102000420037030820004206370300200241606a220222092400200020021013200941606a220022092400200041186a200e2006843703002000200c200742808080807083843703102000200437030820002005370300200220001024200941606a22022200240041c00020021023200041606a22092200240020091019200041606a2200220d2400200041186a200637030020002007370310200020083703082000200a370300200d41606a220d24002000200d10134100410041c08604200d200910284100101c210020021015220241f08f0520006b4104101d200241041027200124000b0600103010460b0bd3041500418080040b546f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c65640063616c6c206661696c65642077697468206e6f207265766572742064617461000000ffffffff0041f880040b08ffffffffffffffff00419881040b08ffffffffffffffff0041b881040b08ffffffffffffffff0041d481040b2cffffffffffffffffffffffffddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00419c82040b04ffffffff0041bc82040b04ffffffff0041d482040b0cffffffffffffffffffffffff0041fc82040b04ffffffff00419c83040b0480ac58cd0041bc83040b24a9fbf51f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9250041f483040b0cffffffffffffffffffffffff00419484040b2cffffffffffffffffffffffffddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0041dc84040b04ffffffff0041fc84040b04ffffffff00419485040b4cffffffffffffffffffffffff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c310041f885040b08ffffffffffffffff00419486040b4cffffffffffffffffffffffff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00041d88f040b01010041de8f040b0502000000030041ea8f040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600a60f046e616d6501f70e48000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030c67657443616c6c56616c75650406726576657274050666696e697368060b676574436f646553697a650708636f6465436f7079081873746f7261676553746f72654c6974746c65456e6469616e091773746f726167654c6f61644c6974746c65456e6469616e0a096b656363616b3235360b0c656d69744c6f674576656e740c1167657452657475726e4461746153697a650d0e72657475726e44617461436f70790e0c63616c6c436f6e74726163740f0a6765744761734c656674101367657445787465726e616c436f646553697a6511115f5f7761736d5f63616c6c5f63746f7273121a753235365f66726f6d5f6269675f656e6469616e5f62797465731318753235365f746f5f6269675f656e6469616e5f6279746573141f6933325f746f5f627974657333325f6269675f656e6469616e5f6279746573151b6933325f66726f6d5f6269675f656e6469616e5f62797465733332161c777261707065725f63616c6c646174616c6f61645f62797465733332171e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f721815777261707065725f63616c6c646174615f73697a65190e777261707065725f63616c6c65721a1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f1b0e777261707065725f7265766572741c1365766d5f6765745f6d656d6f72795f616464721d10777261707065725f636f6465636f70791e14777261707065725f6d656d6f72795f67756172641f16777261707065725f6d73746f72655f627974657333322013777261707065725f6d73746f72655f753235362112777261707065725f6d73746f72655f7533322212777261707065725f6d6c6f61645f753235362315777261707065725f6d6c6f61645f62797465733332242f777261707065725f7373746f72655f753235365f7573696e675f6c6974746c655f656e6469616e5f686f7374617069252e777261707065725f736c6f61645f753235365f7573696e675f6c6974746c655f656e6469616e5f686f73746170692611777261707065725f6b656363616b323536270e777261707065725f72657475726e280c777261707065725f6c6f6733290c777261707065725f6c6f67342a0f77726974655f63616c6c5f646174612b17777261707065725f72657475726e646174615f636f70792c15777261707065725f63616c6c5f636f6e74726163742d0b777261707065725f6761732e17777261707065725f72657475726e646174615f73697a652f15777261707065725f63616c6c646174615f636f707930137365745f69735f6465706c6f79696e675f74783114777261707065725f657874636f64655f73697a653211777261707065725f646174615f636f7079331d777261707065725f63616c6c646174615f73697a655f6d696e75735f34340f5f5f696e69745f65766d5f686561703512777261707065725f627974657333325f65713616777261707065725f627974657333325f69737a65726f3713777261707065725f627974657333325f616e643810777261707065725f753235365f73686c3910777261707065725f753235365f7368723a13777261707065725f627974657333325f6164643b544d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e6162695f6465636f64655f61646472657373745f61646472657373745f75696e743235363c494d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e5f31373539353d434d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e3e4b4d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e61727261795f616c6c6f636174696f6e5f73697a655f62797465733f404d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66756e5f7472616e7366657246726f6d40404d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66756e5f726571756972654f776e6564413e4d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66756e5f636865636b4f776e657242494d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e66756e5f636865636b4f6e455243373231526563656976656443344d794552433732315f34383539385f6465706c6f7965642e4d794552433732315f34383539385f6465706c6f7965642e696e6974440463616c6c45065f737461727446224d794552433732315f34383539382e4d794552433732315f34383539382e696e697447066465706c6f79071201000f5f5f737461636b5f706f696e74657209110200072e726f6461746101052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_fib_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_fib_wasm.hex new file mode 100644 index 000000000..cfec128ef --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_fib_wasm.hex @@ -0,0 +1 @@ +0000253b0061736d010000000130086000017f60037f7f7f0060017f0060027f7f0060000060017f017f60097f7e7e7e7e7e7e7e7e0060057f7e7e7e7e0002780703656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f707900010319180403050300000003050105030303030400040607040404040405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300070463616c6c001c066465706c6f79001e0aa8321802000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b2800200028001c220041187420004180fe03714108747220004108764180fe0371200041187672720bb40a01057f0240410028028080042202417f4a0d0041001000220236028080040b0240024002400240200041206a20024d0d002002210302402002417f4a0d0041001000220336028080040b200220006b21040240200341e500480d0020012000200410010c020b024041002d008481040d0041a08004410020031001410041013a008481040b2004450d02200041a080046a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d0041001000220236028080040b0240200241e500480d0020012000412010010f0b024041002d008481040d0041a08004410020021001410041013a008481040b2001200041a080046a2d00003a00002001200041a180046a2d00003a00012001200041a280046a2d00003a00022001200041a380046a2d00003a00032001200041a480046a2d00003a00042001200041a580046a2d00003a00052001200041a680046a2d00003a00062001200041a780046a2d00003a00072001200041a880046a2d00003a00082001200041a980046a2d00003a00092001200041aa80046a2d00003a000a2001200041ab80046a2d00003a000b2001200041ac80046a2d00003a000c2001200041ad80046a2d00003a000d2001200041ae80046a2d00003a000e2001200041af80046a2d00003a000f2001200041b080046a2d00003a00102001200041b180046a2d00003a00112001200041b280046a2d00003a00122001200041b380046a2d00003a00132001200041b480046a2d00003a00142001200041b580046a2d00003a00152001200041b680046a2d00003a00162001200041b780046a2d00003a00172001200041b880046a2d00003a00182001200041b980046a2d00003a00192001200041ba80046a2d00003a001a2001200041bb80046a2d00003a001b2001200041bc80046a2d00003a001c2001200041bd80046a2d00003a001d2001200041be80046a2d00003a001e2001200041bf80046a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b8308010d7f230041106b22002400410021010240410028028080042202417f4a0d0041001000220236028080040b02402002450d000240200241034b0d00410021032000410036020c024041002d008481040d0041a08004410020021001410041013a008481040b024002400240200241044f0d0041a0800421012000410c6a21040c010b2002417c71220341a080046a21012000410c6a20036a21044100210503402000410c6a20056a200541a080046a2802003602002003200541046a2205470d000b20022003460d010b200220036b21050340200420012d00003a0000200441016a2104200141016a21012005417f6a22050d000b0b024020024108490d00200241787121060240200241786a22054120490d00024020042001200241787122036a4f0d002001200420036a490d010b2001200541037641016a220520054103712205410420051b6b220741037422056a2108200420056a2109200620056b2106410021020340200420026a2205200120026a22032f00003b0000200541186a200341186a2f00003b0000200541106a200341106a2f00003b0000200541086a200341086a2f00003b00002005411a6a2003411a6a2d00003a0000200541126a200341126a2d00003a00002005410a6a2003410a6a2d00003a0000200541026a200341026a2d00003a0000200341036a2d0000210a2003410b6a2d0000210b200341136a2d0000210c2005411b6a2003411b6a2d00003a0000200541136a200c3a00002005410b6a200b3a0000200541036a200a3a00002005411c6a2003411c6a2d00003a0000200541146a200341146a2d00003a00002005410c6a2003410c6a2d00003a0000200541046a200341046a2d00003a0000200541056a200341056a2d00003a00002005410d6a2003410d6a2d00003a0000200541156a200341156a2d00003a00002005411d6a2003411d6a2d00003a00002005411e6a2003411e6a2f00003b0000200541166a200341166a2f00003b00002005410e6a2003410e6a2f00003b0000200541066a200341066a2f00003b0000200241206a21022007417c6a22070d000b20092104200821010b200641786a21050340200420012900003700002005450d01200541786a2105200141086a2101200441086a21040c000b0b200028020c220141187420014180fe03714108747220014108764180fe03712001411876727221010c010b2000410036020802402002417f4a0d0041001000220236028080040b02400240200241e500480d00200041086a4100410410010c010b024041002d008481040d0041a08004410020021001410041013a008481040b200041002802a080043602080b2000280208220141187420014180fe03714108747220014108764180fe03712001411876727221010b200041106a240020010b2201017f0240410028028080042200417f4a0d0041001000220036028080040b20000b4402017f047e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b1000410028028c810420006a200110030b0c00410028028c810420006a0bb60501037f02400240410028029881042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602948104410020054180807c71360298810441004100280290810420034110746a36029081040c010b4100280294810420044f0d004100200436029481040b410028028c8104220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100522044f0d0020002001200210060f0b0240200441004a200120046b2204200148470d000240410028028080042201417f4a0d0041001000220136028080042001417f4a0d0041001000220136028080040b0240200141e500480d0020002004200210010c020b024041002d008481040d0041a08004410020011001410041013a008481040b2002450d01200441a080046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802988104220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602948104410020024180807c71360298810441004100280290810420014110746a360290810441e0000f0b02404100280294810420004f0d004100200036029481040b41e0000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802988104220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602948104410020074180807c71360298810441004100280290810420014110746a36029081040c010b4100280294810420024f0d004100200236029481040b410028028c810420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802988104220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602948104410020044180807c71360298810441004100280290810420034110746a36029081040c010b4100280294810420024f0d004100200236029481040b410028028c810420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b9103002001410028028c810420006a22002d00003a0000200120002d00013a0001200120002d00023a0002200120002d00033a0003200120002d00043a0004200120002d00053a0005200120002d00063a0006200120002d00073a0007200120002d00083a00082001200041096a2d00003a000920012000410a6a2d00003a000a20012000410b6a2d00003a000b20012000410c6a2d00003a000c20012000410d6a2d00003a000d20012000410e6a2d00003a000e20012000410f6a2d00003a000f2001200041106a2d00003a00102001200041116a2d00003a00112001200041126a2d00003a00122001200041136a2d00003a00132001200041146a2d00003a00142001200041156a2d00003a00152001200041166a2d00003a00162001200041176a2d00003a00172001200041186a2d00003a00182001200041196a2d00003a001920012000411a6a2d00003a001a20012000411b6a2d00003a001b20012000411c6a2d00003a001c20012000411d6a2d00003a001d20012000411e6a2d00003a001e20012000411f6a2d00003a001f0b1000410028028c810420006a200110040b0b00410041013a009080040b2501017f0240410028028080042200417f4a0d0041001000220036028080040b2000417c6a0b7e01027f024041002d008881040d00024002403f0022004102490d004100200041107436028c8104410140001a3f004110742200410028028c81046b21010c010b410041a0810436028c810441a0810521004180800121010b410020003602908104410020013602988104410041013a008881044100410036029481040b0be20103027f017e017f23002209210a0240200520017c220b20015a200620027c200b200554220cad7c220120025a20012002511b200720037c2205200c200120065420012006511bad7c220220035a200820047c2005200754ad7c2002200554ad7c220620045a20062004511b2002200385200620048584501b0d00200941606a220c2400200c41186a428080808090ee9ea4ce00370300200c4200370310200c4200370308200c42003703004100200c101241044111101341004124100e0b2000200b3703002000200137030820002002370310200041186a2006370300200a24000b900304017f027e017f047e230041e0006b2205240002400240200142015620024200522002501b200342005220044200522004501b2003200484501b0d0002402001a70e020200020b420021024201210142002103420021040c010b200541c0006a2001427f7c22062002427f7c220720062001542208ad7c22092003427f7c22062008200920025420092002511bad7c220920042006200354ad7c427f7c22032009200654ad7c101a200541c0006a41186a2903002109200541c0006a41106a290300210a200541c0006a41086a290300210b2005290340210c200541206a2001427e7c2204200720042001542208ad7c220420062008200420025420042002511bad7c220220032002200654ad7c101a2005200c200b200a20092005290320200541206a41086a290300200541206a41106a290300200541206a41186a2903001019200541186a2903002104200541106a2903002103200541086a2903002102200529030021010b200020013703002000200237030820002003370310200041186a2004370300200541e0006a24000be10502047f0c7e230041c0006b220021012000240041800110111a41c00041e00010130240100c4104490d0002400240100b220241abc1b6e47a460d00200241f4ff918806470d020240100d450d0041004100100e0b02401017411f4b0d0041004100100e0b200041606a22022200240041042002100a200041606a22002203240020022000100820012000290300200041086a290300200041106a290300200041186a290300101a200141086a2903002104200141106a2903002105200141186a290300210620012903002107200341606a22002203240041c00020001014200010092102200341606a22002400200041186a20063703002000200537031020002004370308200020073703002002200010120c010b0240100d450d0041004100100e0b02401017411f4b0d0041004100100e0b200041606a22022200240041042002100a200041606a220022032400200220001008200041186a2903002105200041106a2903002106200041086a29030021042000290300210742002108420021094200210a4200210b4201210c4200210d4200210e4200210f0240024003400240200742015620044200522004501b200642005220054200522005501b2006200584501b0d002007a70e020302030b200141206a20082009200a200b200c200d200e200f101920052006427f7c2208200654ad7c20082007427f7c2209200754220020042000ad7c427f7c220620045420062004511bad7c220a200854ad7c427f7c21052009210720062104200a2106200c2108200d2109200e210a200f210b2001290320210c200141206a41086a290300210d200141206a41106a290300210e200141206a41186a290300210f0c000b0b200c2108200d2109200e210a200f210b0b200341606a22002203240041c00020001014200010092102200341606a22002400200041186a200b3703002000200a37031020002009370308200020083703002002200010120b2002412010150b41004100100e200141c0006a24000b0400101b0b040010180b3700101641800110111a41c00041e00010130240100d450d0041004100100e0b41e00041a081054100100f6b4104101041e000410410150b0b280400418080040b04ffffffff00418881040b010100418e81040b05020000000300419a81040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600a606046e616d650180061f000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f707907115f5f7761736d5f63616c6c5f63746f7273081a753235365f66726f6d5f6269675f656e6469616e5f6279746573091b6933325f66726f6d5f6269675f656e6469616e5f627974657333320a1c777261707065725f63616c6c646174616c6f61645f627974657333320b1e777261707065725f63616c6c646174615f6c6f61645f73656c6563746f720c15777261707065725f63616c6c646174615f73697a650d1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f0e0e777261707065725f7265766572740f1365766d5f6765745f6d656d6f72795f616464721010777261707065725f636f6465636f70791114777261707065725f6d656d6f72795f67756172641213777261707065725f6d73746f72655f753235361312777261707065725f6d73746f72655f7533321415777261707065725f6d6c6f61645f62797465733332150e777261707065725f72657475726e16137365745f69735f6465706c6f79696e675f7478171d777261707065725f63616c6c646174615f73697a655f6d696e75735f34180f5f5f696e69745f65766d5f6865617019574669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e636865636b65645f6164645f75696e743235361a514669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e66756e5f6669626f6e616363691b484669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e4669626f6e616363695265637572546573745f34383834355f6465706c6f7965642e696e69741c0463616c6c1d065f73746172741e066465706c6f79071201000f5f5f737461636b5f706f696e74657209080100052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_generative_nft_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_generative_nft_wasm.hex new file mode 100644 index 000000000..6f18b55fc --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_generative_nft_wasm.hex @@ -0,0 +1 @@ +00002df80061736d0100000001420a6000017f60037f7f7f0060017f0060027f7f0060047f7f7f7f0060000060017f017f60057f7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060087e7e7e7e7e7e7e7e0002a2010a03656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e76096b656363616b323536000103656e76066164646d6f64000403656e76066d756c6d6f640004031d1c050303030000030601060303030301030504040201070809050505050405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000a0463616c6c0023066465706c6f7900250aa0421c02000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190bb40a01057f0240410028028080042202417f4a0d0041001000220236028080040b0240024002400240200041206a20024d0d002002210302402002417f4a0d0041001000220336028080040b200220006b21040240200341e500480d0020012000200410010c020b024041002d008482040d0041a08104410020031001410041013a008482040b2004450d02200041a081046a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d0041001000220236028080040b0240200241e500480d0020012000412010010f0b024041002d008482040d0041a08104410020021001410041013a008482040b2001200041a081046a2d00003a00002001200041a181046a2d00003a00012001200041a281046a2d00003a00022001200041a381046a2d00003a00032001200041a481046a2d00003a00042001200041a581046a2d00003a00052001200041a681046a2d00003a00062001200041a781046a2d00003a00072001200041a881046a2d00003a00082001200041a981046a2d00003a00092001200041aa81046a2d00003a000a2001200041ab81046a2d00003a000b2001200041ac81046a2d00003a000c2001200041ad81046a2d00003a000d2001200041ae81046a2d00003a000e2001200041af81046a2d00003a000f2001200041b081046a2d00003a00102001200041b181046a2d00003a00112001200041b281046a2d00003a00122001200041b381046a2d00003a00132001200041b481046a2d00003a00142001200041b581046a2d00003a00152001200041b681046a2d00003a00162001200041b781046a2d00003a00172001200041b881046a2d00003a00182001200041b981046a2d00003a00192001200041ba81046a2d00003a001a2001200041bb81046a2d00003a001b2001200041bc81046a2d00003a001c2001200041bd81046a2d00003a001d2001200041be81046a2d00003a001e2001200041bf81046a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b2201017f0240410028028080042200417f4a0d0041001000220036028080040b20000b4402017f047e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b1000410028028c820420006a200110030b0c00410028028c820420006a0bb60501037f02400240410028029882042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602948204410020054180807c71360298820441004100280290820420034110746a36029082040c010b4100280294820420044f0d004100200436029482040b410028028c8204220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100522044f0d0020002001200210060f0b0240200441004a200120046b2204200148470d000240410028028080042201417f4a0d0041001000220136028080042001417f4a0d0041001000220136028080040b0240200141e500480d0020002004200210010c020b024041002d008482040d0041a08104410020011001410041013a008482040b2002450d01200441a081046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802988204220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602948204410020024180807c71360298820441004100280290820420014110746a360290820441e0000f0b02404100280294820420004f0d004100200036029482040b41e0000b920401037f0240200041206a22022000480d000240024041002802988204220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602948204410020044180807c71360298820441004100280290820420034110746a36029082040c010b4100280294820420024f0d004100200236029482040b410028028c820420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802988204220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602948204410020074180807c71360298820441004100280290820420014110746a36029082040c010b4100280294820420024f0d004100200236029482040b410028028c820420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802988204220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602948204410020044180807c71360298820441004100280290820420034110746a36029082040c010b4100280294820420024f0d004100200236029482040b410028028c820420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000bcc02002001410028028c820420006a22002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b1200410028028c820420006a2001200210070b1000410028028c820420006a200110040b0b00410041013a009081040b0c00200020012002200310080b0c00200020012002200310090b870101017f024041002d008882040d003f00210102400240024020000d0020014102490d010b4100200141107436028c8204410140001a3f004110742200410028028c82046b21010c010b410041a0820436028c820441a0820521004180800121010b410020003602908204410020013602988204410041013a008882044100410036029482040b0bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000ba80505027f067e017f0a7e037f23004180016b22052106200524004200210742002108420021094200210a0340200641206a20012002200320042007220b42017c22072008220c2007200b54220dad7c22082009220e200d2008200c542007200b5a1bad7c2209200a220f2009200e54ad7c220a1020200620062903202203200641206a41086a2903002202200641206a41106a2903002201200641206a41186a2903002210200b42e4007c2204200c2004200b54220dad7c2211200e200d2011200c542004200b5a1bad7c2204200f2004200e54ad7c1020200641186a2903002112200641106a2903002113200641086a29030021112006290300210441908004200641e0006a100b024020062903602214200641e0006a41106a290300221584200641e0006a41086a2903002216200641e0006a41186a290300221784844200520d00410041b0800410144104411210164100412410100b200541606a220d22182400200d41186a2010370300200d2001370310200d2002370308200d2003370300201841606a221822192400200d2018100c201941606a220d22192400200d41186a2012370300200d2013370310200d2011370308200d2004370300201941606a2219221a2400200d2019100c201a41606a220d221a2400200d41186a2017370300200d2015370310200d2016370308200d2014370300201a41606a221a22052400200d201a100c200541606a220d2205240020182019201a200d101b200d200641c0006a100b200641c0006a41186a2903002104200641c0006a41106a2903002103200641c0006a41086a290300210220062903402101200b420656200c420052200c501b200e420052200f420052200f501b200e200f84501b450d000b200020013703002000200237030820002003370310200041186a200437030020064180016a24000bf50e09027f047e017f017e017f017e017f067e057f23004180016b2209210a200924004200210b4200210c4200210d4200210e034041c000200a41e0006a1017200a41e0006a41186a220f2903002110200a41e0006a41106a22112903002112200a41e0006a41086a22132903002114200a2903602115200f200e2216370300200a200d2217370370200a200c2218370368200a200b22193703602015a7221a41206a221b200a41e0006a1015200941606a221c22092400201c41186a4200370300201c4200370310201c4200370308201c4220370300201a201c1015201520142012201042c0004200420042001021201a200a41e0006a1017200a280260211a200941606a221c22092400201b201a201c1018201c200a41e0006a100b200a41e0006a4100200a41c0006a101e200a41c0006a41186a290300210b200a41c0006a41106a2903002115200a41c0006a41086a290300210c200a290340210d41908004200a41e0006a100b0240200a290360220e201129030022108420132903002212200f290300221484844200520d00410041b0800410144104411210164100412410100b200941606a221c221a2400201c41186a2004370300201c2003370310201c2002370308201c2001370300201a41606a221a22092400201c201a100c200941606a221c22092400201c41186a200b370300201c2015370310201c200c370308201c200d370300200941606a2209221b2400201c2009100c201b41606a221c221b2400201c41186a2014370300201c2010370310201c2012370308201c200e370300201b41606a221b221d2400201c201b100c201d41606a221d221c2400201a2009201b201d101b41908004200a41e0006a100b0240200a290360220b201129030022158420132903002204200f290300220384844200520d00410041b0800410144104411210164100412410100b201c41606a221c221a2400201c41186a2008370300201c2007370310201c2006370308201c2005370300201a41606a2209221a2400201c2009100c201a41606a221c221a2400201c41186a2003370300201c2015370310201c2004370308201c200b370300201a41606a221b221a2400201c201b100c201a41606a221a221c2400201d2009201b201a101b41908004200a41e0006a100b0240200a290360220b201129030022158420132903002204200f290300220384844200520d00410041b0800410144104411210164100412410100b201c41606a221c22092400201c41186a2003370300201c2015370310201c2004370308201c200b370300200941606a221b22092400201c201b100c200941606a2209221c2400201a201a201b2009101c41908004200a41e0006a100b0240200a290360220b201129030022158420132903002204200f290300220384844200520d00410041b0800410144104411210164100412410100b201c41606a221c221b2400201c41186a2003370300201c2015370310201c2004370308201c200b370300201b41606a221b221d2400201c201b100c201d41606a221d221c240020092009201b201d101c41908004200a41e0006a100b0240200a290360220b201129030022158420132903002204200f290300220384844200520d00410041b0800410144104411210164100412410100b201c41606a221c221b2400201c41186a2003370300201c2015370310201c2004370308201c200b370300201b41606a221b221e2400201c201b100c201e41606a221c221e2400201d2009201b201c101c41908004200a41e0006a100b0240200a290360220b201129030022158420132903002204200f290300220384844200520d00410041b0800410144104411210164100412410100b201e41606a220f22112400200f41186a2003370300200f2015370310200f2004370308200f200b370300201141606a221122132400200f2011100c201341606a220f22092400201c201a2011200f101c200f200a100b20162017201942017c220b201954220f2018200fad7c220c201854200b20195a1bad7c220d201754ad7c210e200a41186a2903002104200a41106a2903002103200a41086a2903002102200a2903002101201942da005441002018501b41002017201684501b0d000b41908004200a41e0006a100b0240200a2903602219200a41e0006a41106a290300221784200a41e0006a41086a2903002218200a41e0006a41186a290300220b848450450d00410041b0800410144104411210164100412410100b200941606a220f22112400200f41186a2004370300200f2003370310200f2002370308200f2001370300201141606a221122132400200f2011100c201341606a220f22132400200f41186a2008370300200f2007370310200f2006370308200f2005370300201341606a2213221c2400200f2013100c201c41606a220f221c2400200f41186a200b370300200f2017370310200f2018370308200f2019370300201c41606a221c221a2400200f201c100c201a41606a220f240020112013201c200f101b200f200a41206a100b2000200a41206a41106a2903003703102000200a41206a41086a2903003703082000200a290320370300200041186a200a41206a41186a290300370300200a4180016a24000bd20205027f037e017f017e017f230041206b2208240041f0800420082209100b024002402004421f7c220a426083220b20007c220c2000542005200a200454220dad7c220e20017c200c200b54220fad7c220020015420002001511b2006200d200e200554200a20045a1bad7c220420027c2205200f2000200e542000200e511bad7c220120025420072004200654ad7c20037c2005200454ad7c2001200554ad7c220420035420042003511b2001200285200420038584501b0d00200c2009290300582000200941086a29030022035820002003511b2001200941106a2903002202582004200941186a29030022035820042003511b2001200285200420038584501b0d010b410041d080041014410441c10010164100412410100b200841606a22082400200841186a200437030020082001370310200820003703082008200c37030041c00020081015200941206a24000bd40202037f047e230041e0006b220021012000240041800110131a41c00041e00010160240100e4104490d00200041606a2200240041002000100d2000200141c0006a100b200141c0006a41e001200141206a101e200129032042a3aaf7d30485200141306a29030084200141286a290300200141386a290300848450450d000240100f450d004100410010100b0240100e41234b0d004100410010100b4104200141206a100d200141206a200141c0006a100b20012001290340200141c0006a41086a290300200141c0006a41106a290300200141c0006a41186a2202290300101f200141086a2903002103200141106a2903002104200141186a29030021052001290300210641c000200141c0006a101720012802402100200220053703002001200437035020012003370348200120063703402000200141c0006a10152000412010190b410041001010200141e0006a24000b040010220b06004101101d0b5301027f230041206b22002400101a41800110131a41c00041e00010160240100f450d004100410010100b41c000200010172000280200220141a08205410010116b41041012200141041019200041206a24000b0b6d0700418080040b04ffffffff00419080040b2430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000014e487b710041d080040b044e487b7100418881040b08ffffffffffffffff00418882040b010100418e82040b05020000000300419a82040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d6578740085010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790105636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420313736323439626436373332613830343464343537303932656439333237363837323461366630362900fb06046e616d6501d50626000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f707907096b656363616b32353608066164646d6f6409066d756c6d6f640a115f5f7761736d5f63616c6c5f63746f72730b1a753235365f66726f6d5f6269675f656e6469616e5f62797465730c18753235365f746f5f6269675f656e6469616e5f62797465730d1c777261707065725f63616c6c646174616c6f61645f627974657333320e15777261707065725f63616c6c646174615f73697a650f1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f100e777261707065725f726576657274111365766d5f6765745f6d656d6f72795f616464721210777261707065725f636f6465636f70791314777261707065725f6d656d6f72795f67756172641416777261707065725f6d73746f72655f627974657333321513777261707065725f6d73746f72655f753235361612777261707065725f6d73746f72655f7533321712777261707065725f6d6c6f61645f753235361811777261707065725f6b656363616b323536190e777261707065725f72657475726e1a137365745f69735f6465706c6f79696e675f74781b0e777261707065725f6164646d6f641c0e777261707065725f6d756c6d6f641d0f5f5f696e69745f65766d5f686561701e10777261707065725f753235365f7368721f4647656e657261746976654e46545f3134305f6465706c6f7965642e47656e657261746976654e46545f3134305f6465706c6f7965642e66756e5f67656e65726174655f313339204747656e657261746976654e46545f3134305f6465706c6f7965642e47656e657261746976654e46545f3134305f6465706c6f7965642e66756e5f6d696d6353706f6e67655f3837214947656e657261746976654e46545f3134305f6465706c6f7965642e47656e657261746976654e46545f3134305f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e223a47656e657261746976654e46545f3134305f6465706c6f7965642e47656e657261746976654e46545f3134305f6465706c6f7965642e696e6974230463616c6c24065f737461727425066465706c6f79071201000f5f5f737461636b5f706f696e74657209080100052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_merkle_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_merkle_wasm.hex new file mode 100644 index 000000000..8db80c0c2 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_merkle_wasm.hex @@ -0,0 +1 @@ +00003c0d0061736d0100000001560b6000017f60037f7f7f0060017f0060027f7f0060047f7f7f7f0060000060057f7e7e7e7e0060017f017f60087e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060117f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0002a2010a03656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e76096b656363616b323536000103656e76066164646d6f64000403656e76066d756c6d6f6400040321200506030303000003070107030303030103010504040201020806090a050505050405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000a0463616c6c0027066465706c6f7900290ac45c2002000b7501017e2000200420017e200220037e7c20034220882204200142208822027e7c200342ffffffff0f832203200142ffffffff0f8322017e2205422088200320027e7c22034220887c200342ffffffff0f83200420017e7c22034220887c37030820002003422086200542ffffffff0f83843703000bc20200200120002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190bb40a01057f0240410028028080042202417f4a0d0041001000220236028080040b0240024002400240200041206a20024d0d002002210302402002417f4a0d0041001000220336028080040b200220006b21040240200341e500480d0020012000200410010c020b024041002d00c482040d0041e08104410020031001410041013a00c482040b2004450d02200041e081046a210302400240200441077122050d0020042105200121060c010b200121060340200620032d00003a0000200641016a2106200341016a21032005417f6a22050d000b200441787121050b20044108490d02200541786a21050340200620032d00003a0000200620032d00013a0001200620032d00023a0002200620032d00033a0003200620032d00043a0004200620032d00053a0005200620032d00063a0006200620032d00073a00072005450d02200541786a2105200341086a2103200641086a21060c000b0b02402002417f4a0d0041001000220236028080040b0240200241e500480d0020012000412010010f0b024041002d00c482040d0041e08104410020021001410041013a00c482040b2001200041e081046a2d00003a00002001200041e181046a2d00003a00012001200041e281046a2d00003a00022001200041e381046a2d00003a00032001200041e481046a2d00003a00042001200041e581046a2d00003a00052001200041e681046a2d00003a00062001200041e781046a2d00003a00072001200041e881046a2d00003a00082001200041e981046a2d00003a00092001200041ea81046a2d00003a000a2001200041eb81046a2d00003a000b2001200041ec81046a2d00003a000c2001200041ed81046a2d00003a000d2001200041ee81046a2d00003a000e2001200041ef81046a2d00003a000f2001200041f081046a2d00003a00102001200041f181046a2d00003a00112001200041f281046a2d00003a00122001200041f381046a2d00003a00132001200041f481046a2d00003a00142001200041f581046a2d00003a00152001200041f681046a2d00003a00162001200041f781046a2d00003a00172001200041f881046a2d00003a00182001200041f981046a2d00003a00192001200041fa81046a2d00003a001a2001200041fb81046a2d00003a001b2001200041fc81046a2d00003a001c2001200041fd81046a2d00003a001d2001200041fe81046a2d00003a001e2001200041ff81046a2d00003a001f0c020b2004411f4a0d010b200020026b2203411f6a2106024020034107712203450d000340200120046a41003a0000200441016a21042003417f6a22030d000b0b20064107490d00411820046b220641037621000240200641d801490d00200120046a2203200641787122066a2003490d00200341016a220520066a2005490d00200341026a220520066a2005490d00200341036a220520066a2005490d00200341046a220520066a2005490d00200341056a220520066a2005490d00200341066a220520066a2005490d00200341076a220520066a2005490d00200041016a220541fcffffff03712200417c6a21062003410f6a210302400340200341716a41003b0000200341736a41003a00002003410a6a41003600002003410e6a41003b0000200341746a4100360000200341786a41003b00002003417a6a4200370000200341026a4200370000200341106a41003a00002006450d012006417c6a2106200341206a21030c000b0b20052000460d014118200041037420046a22046b41037621000b200120046a2103200041037441086a21060340200341003a0000200341016a21032006417f6a22060d000b0b0b2201017f0240410028028080042200417f4a0d0041001000220036028080040b20000b4402017f047e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802cc820420006a200110030b0c0041002802cc820420006a0bb60501037f0240024041002802d882042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602d48204410020054180807c713602d88204410041002802d0820420034110746a3602d082040c010b41002802d4820420044f0d00410020043602d482040b41002802cc8204220420006a2100024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b0240200220016a100522044f0d0020002001200210060f0b0240200441004a200120046b2204200148470d000240410028028080042201417f4a0d0041001000220136028080042001417f4a0d0041001000220136028080040b0240200141e500480d0020002004200210010c020b024041002d00c482040d0041e08104410020011001410041013a00c482040b2002450d01200441e081046a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d01200441786a21040340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a00072004450d02200441786a2104200141086a2101200041086a21000c000b0b00000b0b7601027f024041002802d88204220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602d48204410020024180807c713602d88204410041002802d0820420014110746a3602d0820441e0000f0b024041002802d4820420004f0d00410020003602d482040b41e0000b920401037f0240200041206a22022000480d000240024041002802d88204220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602d48204410020044180807c713602d88204410041002802d0820420034110746a3602d082040c010b41002802d4820420024f0d00410020023602d482040b41002802cc820420006a220020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200020012d00083a0008200041096a20012d00093a00002000410a6a20012d000a3a00002000410b6a20012d000b3a00002000410c6a20012d000c3a00002000410d6a20012d000d3a00002000410e6a20012d000e3a00002000410f6a20012d000f3a0000200041106a20012d00103a0000200041116a20012d00113a0000200041126a20012d00123a0000200041136a20012d00133a0000200041146a20012d00143a0000200041156a20012d00153a0000200041166a20012d00163a0000200041176a20012d00173a0000200041186a20012d00183a0000200041196a20012d00193a00002000411a6a20012d001a3a00002000411b6a20012d001b3a00002000411c6a20012d001c3a00002000411d6a20012d001d3a00002000411e6a20012d001e3a00002000411f6a20012d001f3a00000f0b00000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802d88204220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602d48204410020074180807c713602d88204410041002802d0820420014110746a3602d082040c010b41002802d4820420024f0d00410020023602d482040b41002802cc820420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bdd0101037f0240200041206a22022000480d000240024041002802d88204220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602d48204410020044180807c713602d88204410041002802d0820420034110746a3602d082040c010b41002802d4820420024f0d00410020023602d482040b41002802cc820420006a220042003703102000420037030820004200370300024020010d00200042003703180f0b200020013a001f20004100360218200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000bcc0200200141002802cc820420006a22002d001f3a0000200120002d001e3a0001200120002d001d3a0002200120002d001c3a0003200120002d001b3a0004200120002d001a3a0005200120002d00193a0006200120002d00183a0007200120002d00173a0008200120002d00163a0009200120002d00153a000a200120002d00143a000b200120002d00133a000c200120002d00123a000d200120002d00113a000e200120002d00103a000f200120002d000f3a0010200120002d000e3a0011200120002d000d3a0012200120002d000c3a0013200120002d000b3a0014200120002d000a3a0015200120002d00093a0016200120002d00083a0017200120002d00073a0018200120002d00063a0019200120002d00053a001a200120002d00043a001b200120002d00033a001c200120002d00023a001d200120002d00013a001e200120002d00003a001f0b120041002802cc820420006a2001200210070b100041002802cc820420006a200110040bbf0701037f0240024041002802d882042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602d48204410020054180807c713602d88204410041002802d0820420034110746a3602d082040c010b41002802d4820420044f0d00410020043602d482040b41002802cc820421030240410028028080042204417f4a0d0041001000220436028080040b200320006a210002400240200420014b0d002002450d0102400240200241077122040d00200221040c010b0340200041003a0000200041016a21002004417f6a22040d000b200241787121040b20024108490d01034020004200370000200041086a2100200441786a22040d000c020b0b02400240200220016a20044d0d002004210302402004417f4a0d0041001000220336028080040b200420016b21050240200341e500480d0020002001200510010c020b024041002d00c482040d0041e08104410020031001410041013a00c482040b2005450d01200141e081046a210402400240200541077122030d0020052103200021010c010b200021010340200120042d00003a0000200141016a2101200441016a21042003417f6a22030d000b200541787121030b20054108490d01200341786a21030340200120042d00003a0000200120042d00013a0001200120042d00023a0002200120042d00033a0003200120042d00043a0004200120042d00053a0005200120042d00063a0006200120042d00073a00072003450d02200341786a2103200441086a2104200141086a21010c000b0b02402004417f4a0d0041001000220436028080040b0240200441e500480d0020002001200210010f0b024041002d00c482040d0041e08104410020041001410041013a00c482040b2002450d01200141e081046a210402400240200241077122010d00200221010c010b0340200020042d00003a0000200041016a2100200441016a21042001417f6a22010d000b200241787121010b20024108490d01200141786a21010340200020042d00003a0000200020042d00013a0001200020042d00023a0002200020042d00033a0003200020042d00043a0004200020042d00053a0005200020042d00063a0006200020042d00073a00072001450d02200141786a2101200441086a2104200041086a21000c000b0b200220056b2201450d00200020056a210002400240200141077122040d00200121040c010b0340200041003a0000200041016a21002004417f6a22040d000b200141787121040b20014108490d00034020004200370000200041086a2100200441786a22040d000b0b0b0b00410041013a00d081040b0c00200020012002200310080b0c00200020012002200310090b870101017f024041002d00c882040d003f00210102400240024020000d0020014102490d010b410020014110743602cc8204410140001a3f00411074220041002802cc82046b21010c010b410041e082043602cc820441e0820521004180800121010b410020003602d08204410020013602d88204410041013a00c88204410041003602d482040b0bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000bc90b0b017f047e017f017e017f017e027f047e017f0c7e027f23004180026b22012400200141c0016a42084200420042001023200141c0016a41186a2903002102200141c0016a41106a2903002103200141c0016a41086a290300210420012903c001210541d08004200141e0016a100c024020012903e001420756200141e0016a41086a220629030022074200522007501b200141e0016a41106a22082903002209420052200141e0016a41186a220a29030022074200522007501b2009200784501b0d004100419080041015410441c10010174100412410110b2005a7220b41206a100f418002101b200141a0016a42084200420042001023200141a0016a41186a290300210c200141a0016a41106a290300210d200141a0016a41086a290300210e20012903a001210f41d08004200141e0016a100c024020012903e001420756200629030022074200522007501b20082903002209420052200a29030022074200522007501b2009200784501b0d004100419080041015410441c10010174100412410110b200fa7221041206a100f418002101b422a2111200141e0016a41106a2108200141e0016a41186a210642002112420021134200211442002107420021094200211542002116034020014190016a2015201642074200100b200141d0006a2007420042074200100b200141f0006a2009420042074200100b20014180016a2007200942004200100b200141c0006a2007420042004200100b200141e0006a2009420042004200100b200b200141e0016a1018200141e0006a41086a290300200141f0006a41086a29030020012903702217200141d0006a41086a2903007c2218201754ad7c2219200141c0006a41086a2903002001290340221a20187c2217201a54ad7c7c2218201954ad7c2001290360221920187c2218201954ad7c20014180016a41086a29030020014190016a41086a2903007c20012903800122192001290390017c221a201954ad7c7c2018201a7c2219201854ad7c201920012903502218420d7c221a201854220a2017200aad7c221b201754201a20185a1bad7c2218201954ad7c2119024020012903e001200756200141e0016a41086a220a290300221720095620172009511b2008290300221c2015562006290300221720165620172016511b201c201585201720168584501b0d00410041f0800410154104413210174100412410110b200620193703002001201a3703e0012001201b3703e801200120183703f001200742058642207c221820057ca7221d200141e0016a10162010200141e0016a101820074201832119024020012903e001200756200a290300221720095620172009511b2008290300221a2015562006290300221720165620172016511b201a201585201720168584501b0d00410041f0800410154104413210174100412410110b20064200370300200142003703f001200142003703e801200120193703e0012018200f7ca7200141e0016a1016200b200141e0016a1018024020012903e001200756200a290300221720095620172009511b200829030022182015562006290300221720165620172016511b2018201585201720168584501b0d00410041f0800410154104413210174100412410110b201d200141e0016a1018200141206a201120122013201420012903e001200a2903002008290300200629030010242015200742017c2217200754220a2009200aad7c2218200954201720075a1bad7c2219201554210a2007420754211d200950211e2015201684211a200141206a41186a2903002114200141206a41106a2903002113200141206a41086a2903002112200129032021112017210720182109201921152016200aad7c2116201d4100201e1b4100201a501b0d000b200120052004200320022011201220132014422a420042004200200f200e200d200c1025200141186a2903002107200141086a2903002109200129030021162000200141106a2903003703102000201637030020002009370308200041186a200737030020014180026a24000bd20205027f037e017f017e017f230041206b2208240041b0800420082209100c024002402004421f7c220a426083220b20007c220c2000542005200a200454220dad7c220e20017c200c200b54220fad7c220020015420002001511b2006200d200e200554200a20045a1bad7c220420027c2205200f2000200e542000200e511bad7c220120025420072004200654ad7c20037c2005200454ad7c2001200554ad7c220420035420042003511b2001200285200420038584501b0d00200c2009290300582000200941086a29030022035820002003511b2001200941106a2903002202582004200941186a29030022035820042003511b2001200285200420038584501b0d010b4100419080041015410441c10010174100412410110b200841606a22082400200841186a200437030020082001370310200820003703082008200c37030041c00020081016200941206a24000bd70206037f017e017f017e017f077e230041206b2205240041d0800420052206100c0240200629030020015a200641086a2207290300220820025a20082002511b200641106a2209290300220a20035a200641186a220b290300220820045a20082004511b200a200385200820048584501b0d004100419080041015410441c10010174100412410110b41c00020061018200629030022082007290300220c2009290300220d200b290300220e2001420586220a42207c220f20024205862001423b88842210200f200a542207ad7c221120034205862002423b8884221220072011201054200f200a5a1bad7c220a20044205862003423b8884200a201254ad7c1022200541606a22052400200541186a20043703002005200337031020052002370308200520013703002008a7200510162000200d3703102000200c37030820002008370300200041186a200e370300200641206a24000bda1103057f0c7e057f230041a0016b220924002009220a4180016a41186a210b200a4180016a41086a210c200a4180016a41106a210d4200210e4200210f42002110420021114200211242002113420021144200211503402015211620142117201321182012211941b08104200a4180016a100c0240200a290380012212200d290300221384200c2903002214200b290300221584844200520d0041004190810410154104411210174100412410110b200941606a221a221b2400201a41186a2004370300201a2003370310201a2002370308201a2001370300201b41606a221b221c2400201a201b100d201c41606a221a221c2400201a41186a2011370300201a2010370310201a200f370308201a200e370300201c41606a221c221d2400201a201c100d201d41606a221a221d2400201a41186a2015370300201a2013370310201a2014370308201a2012370300201d41606a221d22092400201a201d100d200941606a2209221a2400201b201c201d2009101d41b08104200a4180016a100c0240200a290380012212200d290300220484200c2903002203200b290300220284844200520d0041004190810410154104411210174100412410110b201a41606a221a221b2400201a41186a2008370300201a2007370310201a2006370308201a2005370300201b41606a221c221b2400201a201c100d201b41606a221a221b2400201a41186a2002370300201a2004370310201a2003370308201a2012370300201b41606a221d221b2400201a201d100d201b41606a221b221a24002009201c201d201b101d41b08104200a4180016a100c0240200a290380012212200d290300220484200c2903002203200b290300220284844200520d0041004190810410154104411210174100412410110b201a41606a221a221c2400201a41186a2002370300201a2004370310201a2003370308201a2012370300201c41606a221d221c2400201a201d100d201c41606a221c221a2400201b201b201d201c101e41b08104200a4180016a100c0240200a290380012212200d290300220484200c2903002203200b290300220284844200520d0041004190810410154104411210174100412410110b201a41606a221a221d2400201a41186a2002370300201a2004370310201a2003370308201a2012370300201d41606a221d22092400201a201d100d200941606a2209221a2400201c201c201d2009101e41b08104200a4180016a100c0240200a290380012212200d290300220484200c2903002203200b290300220284844200520d0041004190810410154104411210174100412410110b201a41606a221a221d2400201a41186a2002370300201a2004370310201a2003370308201a2012370300201d41606a221d221e2400201a201d100d201e41606a221e221a24002009201c201d201e101e41b08104200a4180016a100c0240200a290380012212200d290300220484200c2903002203200b290300220284844200520d0041004190810410154104411210174100412410110b201a41606a221a221c2400201a41186a2002370300201a2004370310201a2003370308201a2012370300201c41606a221c221d2400201a201c100d201d41606a221a221d2400201e201b201c201a101e201a200a100c41c000200a4180016a1018200b2903002104200d2903002103200c2903002102200a290380012112200b2016370300200a201737039001200a201837038801200a2019370380012012a7221b41206a221c200a4180016a1016201d41606a221a221d2400201a41186a4200370300201a4200370310201a4200370308201a4220370300201b201a1016201220022003200442c0004200420042001022201b200a4180016a1018200a28028001211b201d41606a221a221d2400201c201b201a1019201a200a4180016a100c200a4180016a4100200a41e0006a1020200a41e0006a41186a2903002112200a41e0006a41106a2903002104200a41e0006a41086a2903002103200a290360210241b08104200a4180016a100c0240200a290380012201200d290300221384200c2903002214200b290300221584844200520d0041004190810410154104411210174100412410110b201d41606a221a221b2400201a41186a2011370300201a2010370310201a200f370308201a200e370300201b41606a221b221c2400201a201b100d201c41606a221a221c2400201a41186a2012370300201a2004370310201a2003370308201a2002370300201c41606a221c221d2400201a201c100d201d41606a221a221d2400201a41186a2015370300201a2013370310201a2014370308201a2001370300201d41606a221d22092400201a201d100d200941606a221a22092400201b201c201d201a101d201a200a41206a100c20162017201942017c2212201954221a2018201aad7c2213201854201220195a1bad7c2214201754ad7c2115200a41186a2903002104200a41106a2903002103200a41086a2903002102200a41206a41186a2903002111200a41206a41106a2903002110200a41206a41086a290300210f200a2903002101200a290320210e201942da005441002018501b41002017201684501b0d000b41b08104200a4180016a100c0240200a290380012219200a4180016a41106a290300221784200a4180016a41086a2903002218200a4180016a41186a2903002216848450450d0041004190810410154104411210174100412410110b200941606a220b220c2400200b41186a2004370300200b2003370310200b2002370308200b2001370300200c41606a220c220d2400200b200c100d200d41606a220b220d2400200b41186a2008370300200b2007370310200b2006370308200b2005370300200d41606a220d221a2400200b200d100d201a41606a220b221a2400200b41186a2016370300200b2017370310200b2018370308200b2019370300201a41606a221a221b2400200b201a100d201b41606a220b2400200c200d201a200b101d200b200a41c0006a100c2000200a41c0006a41106a2903003703102000200a41c0006a41086a2903003703082000200a290340370300200041186a200a41c0006a41186a290300370300200a41a0016a24000bb90603067f077e017f230041e0006b221124002001a72212201141c0006a101802402011290340201141c0006a41106a221329030084201141c0006a41086a2214290300201141c0006a41186a22152903008484500d00200da721164200211742002118420021194200211a03402016201141c0006a1018024020112903402017221b562014290300221c2018221d56201c201d511b201329030022182019221c5620152903002217201a562017201a511b2018201c852017201a8584501b0d00410041f0800410154104413210174100412410110b201b42058642207c2217200d7ca7201141c0006a1018024002402011290340201329030084201429030020152903008484500d002012201141c0006a101802402011290340201b5620142903002218201d562018201d511b20132903002219201c5620152903002218201a562018201a511b2019201c852018201a8584501b0d00410041f0800410154104413210174100412410110b201720017ca7201141c0006a1018201141206a20112903402014290300201329030020152903002009200a200b200c1024201141206a41186a290300210c201141206a41106a290300210b201141206a41086a290300210a201129032021090c010b2012201141c0006a101802402011290340201b5620142903002218201d562018201d511b20132903002219201c5620152903002218201a562018201a511b2019201c852018201a8584501b0d00410041f0800410154104413210174100412410110b201720017ca7201141c0006a101820112009200a200b200c20112903402014290300201329030020152903001024201141186a290300210c201141106a290300210b201141086a290300210a201129030021090b2012201141c0006a1018201b42017c221720112903405a201d2017201b54221ead7c2218201429030022195a20182019511b201c201e2018201d542017201b5a1bad7c22192013290300221d5a201a2019201c54ad7c221a2015290300221b5a201a201b511b2019201d85201a201b8584501b450d000b0b2000420037031020004200370308200041186a420037030020002009200585200b20078584200a200685200c200885848450ad370300201141e0006a24000ba70202027f047e230041e0006b220021012000240041800110141a41c00041e00010170240100f4104490d00200041606a2200240041002000100e2000200141c0006a100c200141c0006a41e001200141206a1020200129032042a28b8fc80885200141306a29030084200141286a290300200141386a290300848450450d0002401010450d004100410010110b0240100f41034b0d004100410010110b20011021200141106a2903002102200141186a2903002103200141086a29030021042001290300210541c000200141c0006a101820012802402100200141c0006a41186a4200370300200142003703502001420037034820012005200284200420038484420052ad3703402000200141c0006a101620004120101a0b410041001011200141e0006a24000b040010260b06004101101f0b5301027f230041206b22002400101c41800110141a41c00041e000101702401010450d004100410010110b41c000200010182000280200220141e08205410010126b4104101320014104101a200041206a24000b0b87010900418080040b04ffffffff00419080040b044e487b710041c880040b08ffffffffffffffff0041e880040b0cffffffffffffffff4e487b7100419081040b044e487b710041b081040b2030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010041c882040b01010041ce82040b0502000000030041da82040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d6578740085010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790105636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420313736323439626436373332613830343464343537303932656439333237363837323461366630362900b908046e616d650193082a000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f707907096b656363616b32353608066164646d6f6409066d756c6d6f640a115f5f7761736d5f63616c6c5f63746f72730b085f5f6d756c7469330c1a753235365f66726f6d5f6269675f656e6469616e5f62797465730d18753235365f746f5f6269675f656e6469616e5f62797465730e1c777261707065725f63616c6c646174616c6f61645f627974657333320f15777261707065725f63616c6c646174615f73697a65101a777261707065725f63616c6c76616c75655f6e6f745f7a65726f110e777261707065725f726576657274121365766d5f6765745f6d656d6f72795f616464721310777261707065725f636f6465636f70791414777261707065725f6d656d6f72795f67756172641516777261707065725f6d73746f72655f627974657333321613777261707065725f6d73746f72655f753235361712777261707065725f6d73746f72655f7533321812777261707065725f6d6c6f61645f753235361911777261707065725f6b656363616b3235361a0e777261707065725f72657475726e1b15777261707065725f63616c6c646174615f636f70791c137365745f69735f6465706c6f79696e675f74781d0e777261707065725f6164646d6f641e0e777261707065725f6d756c6d6f641f0f5f5f696e69745f65766d5f686561702010777261707065725f753235365f73687221434d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e66756e5f62656e63686d61726b5f32343422454d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e236a4d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e616c6c6f636174655f6d656d6f72795f61727261795f745f6172726179245f745f75696e743235365f2464796e5f6d656d6f72795f70747224414d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e66756e5f6d696d63486173685f393925404d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e66756e5f7665726966795f31363226364d65726b6c6550726f6f665f3234355f6465706c6f7965642e4d65726b6c6550726f6f665f3234355f6465706c6f7965642e696e6974270463616c6c28065f737461727429066465706c6f79071201000f5f5f737461636b5f706f696e74657209080100052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e63000200000004030005020500000003270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a000000000000000800000005000000750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000b050000007500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_poseidon_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_poseidon_wasm.hex new file mode 100644 index 000000000..a20f8cdae --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_poseidon_wasm.hex @@ -0,0 +1 @@ +000119fd0061736d01000000013f0960027f7f006000006000017f60037f7f7f0060057f7e7e7e7e0060017f017f60017f0060087e7e7e7e7e7e7e7e00600d7f7e7e7e7e7e7e7e7e7e7e7e7e0002780703656e760f67657443616c6c4461746153697a65000203656e760c63616c6c44617461436f7079000303656e760c67657443616c6c56616c7565000603656e7606726576657274000003656e760666696e697368000003656e760b676574436f646553697a65000203656e7608636f6465436f70790003031817010400020200050305000000000101030708040101010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300070463616c6c001b066465706c6f79001d0a889b04170300010b7501017e2000200120047e200220037e7c20034220882204200142208822027e7c200342ffffffff0f832203200142ffffffff0f8322017e2205422088200220037e7c22034220887c200120047e200342ffffffff0f837c22034220887c3703082000200542ffffffff0f832003422086843703000b91041c017f017f017f017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e230041206b2202240010002103200241186a22044200370300200241106a22054200370300200242003703082002420037030020022000200320006b4120200041206a20034b1b10012004310000210620053100002107200231001f2108200231001e2109200231001b210a200231001a210b2002310019210c200231001c210d200231001d210e2002310003210f200231000221102002310001211120023100002112200231000721132002310006211420023100042115200231000521162002310013211720023100122118200231001121192002310017211a2002310016211b2002310014211c2002310015211d2001200231000f200231000e42088684200231000c421886200231000d4210868484200231000b200231000a42088684200231000842188620023100094210868484422086843703102001201a201b42088684201c421886201d4210868484201720184208868420074218862019421086848442208684370308200141186a2013201442088684201542188620164210868484200f2011421086201242188684201042088684844220868437030020012008200942088684200d421886200e42108684200a200b420886842006421886200c42108684844220868484370300200241206a24000b040010000b4a05017f017e017e017e017e230041206b220024002000100220002903082101200029030021022000290310210320002903182104200041206a240020042003200120028484844200520b10004188800428020020006a200110030b0c004188800428020020006a0b8c0303017f017f017f0240419480042802002204200020026a2203490440200341ffff036a220541107620044110766b220440001a4190800420033602004194800420054180807c71360200418c8004418c800428020020044110746a3602000c010b4190800428020020034f0d004190800420033602000b41888004280200220320006a210002400240200141004804402002450d01200120036a210120024107712203047f0340200020012d00003a0000200041016a2100200141016a2101200341016b22030d000b20024178710520020b210320024108490d010340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200041086a2100200141086a2101200341086b22030d000b0c010b1005220441046a22032004480d012003200120026a4b044020002001200210060f0b200341004a200120036b2203200148470d0110001a20002003200210010b0f0b000b7402017f017f20004194800428020022014b0440200041ffff036a220241107620014110766b220140001a4190800420003602004194800420024180807c71360200418c8004418c800428020020014110746a36020041e0000f0b2000419080042802004b04404190800420003602000b41e0000bf70306017f017e017e017e017e017f2000200041206a22024c0440200141186a2903002103200141106a2903002104200141086a290300210520012903002106024020024194800428020022014b0440200241ffff036a220741107620014110766b220140001a4190800420023602004194800420074180807c71360200418c8004418c800428020020014110746a3602000c010b4190800428020020024f0d004190800420023602000b4188800428020020006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b000bcd0103017f017f017f2000200041206a22024c0440024020024194800428020022034b0440200241ffff036a220441107620034110766b220340001a4190800420023602004194800420044180807c71360200418c8004418c800428020020034110746a3602000c010b4190800428020020024f0d004190800420023602000b4188800428020020006a22004200370318200042003703102000420037030820004200370300200020013a001f200020014108763a001e200020014110763a001d200020014118763a001c0f0b000bc30318017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e4188800428020020006a220031001f2102200031001e2103200031001c2104200031001d2105200031001b2106200031001a210720003100182108200031001921092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000f200031000e42088684200031000c421886200031000d4210868484200031000b200031000a420886842000310008421886200031000942108684844220868437031020012016201742088684201842188620194210868484201220134208868420144218862015421086848442208684370308200141186a200e200f42088684201042188620114210868484200a200c421086200d42188684200b420886848442208684370300200120022003420886842004421886200542108684200620074208868420084218862009421086848442208684843703000b10004188800428020020006a200110040b0b004180800441013a00000b5501017f418480042d0000450440418880043f00411074360200410140001a3f0021004184800441013a0000418c800420004110742200360200419480042000418880042802006b3602004190800441003602000b0bbe0207017f017e017e017e017e017e017e230041406a2103027e200141004c0440200041106a2903002107200041086a290300210420002903002105200041186a2903000c010b200141ff014b044042000c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220420014107712200ad220688200341186a29000022084201862000413f73ad22058684210720044201862000417f73413f71ad86200341086a29000022092006888421042009420186200586200329000020068884210520082006880b2106200220053703002002200437030820022007370310200241186a20063703000beb0208017f017e017f017e017e017e017f017f230041406a220a2108200a2400024020052004421f7c220c200454220ead7c220920017c200c426083220b20007c220d200b54220fad7c220b4200522006200e20052009562004200c581bad7c220420027c2205200f2009200b562009200b511bad7c22094200522005200956ad2004200556ad20072004200654ad7c20037c7c7c22044200522004501b2004200984501b4504402000200d582001200b582001200b511b2002200958200320045820032004511b2002200985200320048584501b0d010b200841386a428080808090ee9ea4ce003703002008420037033020084200370328200842003703204100200841206a1010200841186a42003703002008420037031020084200370308200842c10037030041042008101041004124100c0b200a41206b220a2400200a41186a2004370300200a2009370310200a200b370308200a200d37030041c000200a1010200841406b24000bda050e017f017f017e017f017e017e017e017e017e017e017f017f017e017f230041406a2210210d20102400200720088420068450450440200d41386a428080808090ee9ea4ce00370300200d4200370330200d4200370328200d42003703204100200d41206a1010200d41186a4200370300200d4200370310200d4200370308200d42c1003703004104200d101041004124100c0b41c000200d41206a1012200d2903202212200d41286a2903002213200d41306a2903002214200d41386a29030022152005420586220f20064205862005423b8884220520074205862006423b8884220620084205862007423b8884220810172001200f7c2211200958200f201156220ead200220057c7c220f200a58200a200f511b200320067c2207200e2005200f562005200f511bad7c2209200b582007200956ad2006200756ad200420087c7c7c2208200c582008200c511b2009200b852008200c8584501b45044041004100100c0b200120115a2002200f5a2002200f511b200320095a200420085a20042008511b2003200985200420088584501b450440200d41286a2117200d41306a2118201221072013210b2014210a2015211603402001a7200d41206a1009201729030021062018290300210c200d41386a2903002105200d2903202119201041206b220e22102400200e41186a2005370300200e200c370310200e2006370308200e20193703002007a7200e10102003200142207c2206200154220e2002200ead7c220c20025420012006581bad7c2205200354210e2016200a200742207c2201200754221a200b201aad7c2203200b54200120075a1bad7c2202200a54ad7c2116200121072003210b2002210a20062101200c2102200521032006201154200c200f54200c200f511b20052009542004200ead7c220420085420042008511b2005200985200420088584501b0d000b0b200020123703002000201337030820002014370310200041186a2015370300200d41406b24000b89c70356017f017f017e017e017e017e017f017e017e017e017e017e017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017f017e017e017f017e017e017e017e017e017e017e017e017f017e017e017e017f017e017e017e017e017e017e017f017e017e017f017f017f017e017e017e017e017e017e017f017f017e017e017f017f017f017e017f017f017f017f017f017f017f230041c0336b2205240041c000200541a0336a101220052903a0332249200541a8336a2243290300200541b0336a2244290300200541b8336a221129030042e030420042004200101720114298aaead4abb2e9f40e370300200542a198d0b7e5dae1ac503703b03320054293d3ec8dc1a7a6e2143703a833200542ee9cb6a6b08ef5908d7f3703a0332049a72206200541a0336a10102011428ca9c8afa38ad1f800370300200542cdb7f0cf968e96c3d9003703b033200542dfd1a180cd9ac2bd887f3703a833200542e4d0dbcac0febfcbd6003703a033200641206a200541a0336a10102011429e93abf487e9fcef08370300200542b981ea878d8be8941f3703b033200542ece6eadbb08ecae3303703a833200542f5e7bdf690f1fcbc683703a033200641406b200541a0336a1010201142c6dcebfe90cdef932f370300200542c8a7ac99f59e8ae7433703b033200542eeb4afc2ace8d4e1d6003703a833200542d083f0d68fe298cb203703a033200641e0006a200541a0336a10102011428df7adb4cfb5b8952b370300200542b4c4bdeaf3d7af8b243703b033200542e4fd90c0cbc0ffb1b77f3703a833200542f2d985e5ebf7c9c18b7f3703a03320064180016a200541a0336a1010201142fedeafb9a08cf48c03370300200542d5a9dffc86d8fad24c3703b033200542ea87acdbdaaeb0a9d9003703a833200542fab9c4dffd98d1a5663703a033200641a0016a200541a0336a101020114282d5baddaeb9cfc028370300200542bbccd2d787bfdb9b8a7f3703b033200542a98ca7eafae4efdb483703a833200542eda4a1f9fbf0ecfb8e7f3703a033200641c0016a200541a0336a10102011428392afe6b2e7d993273703002005428da8878e8ee7efc0713703b033200542bca58d86a0cae199203703a833200542f896e7efdd95ca84153703a033200641e0016a200541a0336a1010201142c2cfdc93ca8bb1a723370300200542cda9d2d0b2a5afa5673703b033200542d68f96a0e387f5fdee003703a833200542b28cf3b29ec6e7fdb87f3703a03320064180026a200541a0336a10102011428fc3eb98c0a6c9da15370300200542e0eef3fbac968bc3ff003703b0332005429cf6cdd1d082aa88ab7f3703a833200542a8a8dfbce8edffcc4d3703a033200641a0026a200541a0336a1010201142dfe692cfeddabee40d370300200542e3b9deb598fae8ecde003703b033200542b2e2e2dad1d1a2878e7f3703a833200542f6a3a3fbec9df580573703a033200641c0026a200541a0336a1010201142caf7c790fcbfe5e61b370300200542e7eafee9fa8bdc87e0003703b033200542ecbfb8b18fefaca76a3703a8332005429c9bf9a38aa395c0977f3703a033200641e0026a200541a0336a1010201142df9587b9abe182a910370300200542cd86bf8bb083fef7693703b033200542f8a6e2abc2ede8b6473703a833200542d9caf7b4d0f1e5e5173703a03320064180036a200541a0336a1010201142fdfeb9dcc982d2b61f370300200542f4f5eeafedb1df929b7f3703b033200542aca1fbaf87b09299293703a833200542f6cfd8fa81d7a7c5683703a033200641a0036a200541a0336a101020114294a0c291e5be95cb1d3703002005429b9188adf39d80cf523703b033200542c99bbc8bc883b77c3703a833200542858eb2b0d4b6af9a4a3703a033200641c0036a200541a0336a1010201142aff9d6fcefcad6ef043703002005429bd38eea9cf6fda8b07f3703b03320054285e4c0a3feecff98a77f3703a833200542fd98dfb48583f5f18f7f3703a033200641e0036a200541a0336a1010201142c0ecffc7dfb2b6b90637030020054294deb6e790a5cf8d153703b033200542a7c990e4a8a1a8c8867f3703a833200542a8d0aff2b6858af6763703a03320064180046a200541a0336a1010201142d488a1a4c1d6d4cc09370300200542dfbabffdff9a8089b27f3703b0332005428ee1c9b7c0b9a7cd0c3703a833200542b9ebf1da8984f6e09f7f3703a033200641a0046a200541a0336a10102011428ca0ffaea5c4ae9605370300200542948db5d4bba88ca4fc003703b033200542919bd3cdeab08df2c8003703a833200542a6bfaed3c3d0c3fe837f3703a033200641c0046a200541a0336a10102011428eb7abc8e6bdebc50b370300200542afb3e6db928edddeb07f3703b033200542f7dac69287ae95ef827f3703a833200542dc9b99e29397df83163703a033200641e0046a200541a0336a1010201142af8fcc898fb2c5cd11370300200542c78fb09090cab98fda003703b033200542d080eac186acd7e0c9003703a833200542d1fbcaa58e95f4b1b97f3703a03320064180056a200541a0336a1010201142fba2d7b6cdefc28a0337030020054283f7d987beedf494253703b033200542e59dbda788f9b3a52c3703a833200542899aaadabfc1ef8a4e3703a033200641a0056a200541a0336a1010201142eea8d1f0c58586e32c370300200542b5a4e4b9f1a3e5f83c3703b0332005428a9382ec83f7bbbad3003703a833200542e5cafae497e6f2b4be7f3703a033200641c0056a200541a0336a1010201142c4f18df3d1ca8c28370300200542f6e692a09aa5f8e7d0003703b033200542ab9c85d6eddbb28cc2003703a833200542f9e1ef88b1aeb3e9927f3703a033200641e0056a200541a0336a1010201142b4d4eec4b2fc8d9923370300200542d1f2f2f5f2d29f8abb7f3703b033200542fbd381e69ff3f0b4e4003703a833200542b5ed8994ccc5f6fc887f3703a03320064180066a200541a0336a1010201142e3cdd2dece9ebde405370300200542e3fcfea5e7e2b4c0493703b033200542a4cbab9a9be4df81233703a8332005428085d8a6c2a98b86683703a033200641a0066a200541a0336a101020114296a78b8293b6c7bd0a370300200542d2e4e7988a83f682ba7f3703b03320054291dbbb9defebbcded2003703a833200542db8cbfc8a5b6c28f6e3703a033200641c0066a200541a0336a1010201142f59984d9f9e3edb92a370300200542dbe5f4e4f2caa5a1b17f3703b033200542dc8ffdb788d6b8ab713703a833200542c09d81d2e5c6d0fadd003703a033200641e0066a200541a0336a1010201142a193f3d59788ece41a370300200542c3bba4fe9ffdc1a8937f3703b033200542a9e49fdfcdd8bc8c6c3703a833200542e088c3e2b597d8d3f6003703a03320064180076a200541a0336a101020114282e98d84aef38ce012370300200542f9e8fb83e78eecd53f3703b033200542b488c4e5d6c9cfcf263703a833200542c0ffa4eec6c0fb8a907f3703a033200641a0076a200541a0336a1010201142adcb859590b69dba0b370300200542cfe0f9f0b49bc6adff003703b033200542c6d5eea9b2d482c8d2003703a8332005428ec5a6b7e5859aa3827f3703a033200641c0076a200541a0336a1010201142be94c78c9e898abe0337030020054291f1a2b79fc9978e5b3703b033200542eae59b9bf9c68fc2fc003703a833200542c888feeb88d5ced5323703a033200641e0076a200541a0336a101020114294e0dbaaf8a3a0d3053703002005429bfd85f1e18c9d93693703b033200542c1fb819dc98b9b90553703a833200542efe8d8b8eaaeecfec5003703a03320064180086a200541a0336a101020114294d180ccfdbce5d32937030020054284bebaaaddee9ecaee003703b033200542b487a2d9a78fbabbc0003703a833200542eeacaf9cdfded7b3fb003703a033200641a0086a200541a0336a1010201142ebc5cca5c8c1e6a12037030020054282ebe3e0afafe1d1c5003703b033200542dcb085c5acf09cc6ee003703a833200542afa4ffc099b3f8bdd0003703a033200641c0086a200541a0336a1010201142ca9efbec949bea852e370300200542f1bfdcb98c8a88f6947f3703b033200542ed96a1cdf9cebca8bb7f3703a83320054287918bcca0e59b95ca003703a033200641e0086a200541a0336a1010201142a7f6a3f0dca2f49f14370300200542c5d688f4ccefba9c4a3703b033200542d291c184a19a8bc1173703a833200542c8e3f58bcab9b7e8663703a03320064180096a200541a0336a1010201142b8e99c8ecbfdb2b20c370300200542cda7e0e7bdb7a3cbd7003703b033200542bff9f69193cbc5b0783703a833200542f195a7dfa3ecc8a1483703a033200641a0096a200541a0336a1010201142f6879abe848b8cc502370300200542dafe8f8bdca4aafec6003703b033200542f0ec8a96d691cda7673703a833200542d3b48fa0f99d9ba1713703a033200641c0096a200541a0336a1010201142dadfadf88fa2bda72e370300200542f2818ee2b495d0d4df003703b033200542b8cfd0c4cdecf2b5ea003703a8332005428cc6e7edb5ab9deb243703a033200641e0096a200541a0336a1010201142e689cea1bcabf2c000370300200542bb9cdbca8ccee4ebe3003703b033200542f8e0ce81ed9eed92897f3703a8332005428e80e5abd09ee1b1b97f3703a033200641800a6a200541a0336a1010201142c9aef6e59199fcea2e370300200542dec09fb4def58bbf183703b0332005428bb48ee0c9e6c6a4623703a833200542b8f6829d82e8a7c5ba7f3703a033200641a00a6a200541a0336a1010201142d0c6b6c49fb2a6a830370300200542f0c5abadede9cddfcb003703b0332005428c998db1c7c5a8a4343703a83320054286a4cdd3b3bec087997f3703a033200641c00a6a200541a0336a1010201142d3b482aad59fc89f1c370300200542b9ad8dcdd489df8d223703b033200542c1f69990fbb3c4d0703703a833200542ad8dbb92c492a4a9a77f3703a033200641e00a6a200541a0336a101020114283e0f7dabafeb9da10370300200542eeb1b8dbd988c5ca043703b0332005429ea6b8f493c4ecb5443703a833200542ecf2f2eec7f6a184173703a033200641800b6a200541a0336a1010201142f4efffe1f9d2e08c2a370300200542bdd5f0c8d887d5ee3d3703b033200542f5aedf83cc80bec05d3703a833200542efdb8ef282eaa8cd033703a033200641a00b6a200541a0336a1010201142b6bbf88acfccbbba1c370300200542ddaadbb6d5d5efee7e3703b033200542f9b5b2cbc3d7c7a1ba7f3703a83320054291b9f5adb1e2c3d6dc003703a033200641c00b6a200541a0336a101020114298ffe98585d9cfa907370300200542cbb680e7ca87ccdc6a3703b033200542fa99c293b8d1cba79e7f3703a833200542a08d85d7a08bf9979c7f3703a033200641e00b6a200541a0336a1010201142c988c0f2b8e8daab21370300200542d4e2def8ea9df9a8a17f3703b03320054280838beac29e9aae283703a833200542d08eb0b2b7feea888a7f3703a033200641800c6a200541a0336a101020114296cfbfdcd98af08b2f37030020054290ded89e9994d7d6083703b0332005428692fc8ac8898ef4bc7f3703a8332005429e95b59b88a6da9ef4003703a033200641a00c6a200541a0336a101020114288eec19686c7dfa32d370300200542bce185a3e9d5a2cfa77f3703b033200542ca8ee1988184e9ba977f3703a8332005428ee689bf9b96ecb2663703a033200641c00c6a200541a0336a1010201142c3c9c1b3b9c8d4971637030020054291e593ccf7aaa5f0907f3703b033200542bcb5bd9ceccc88ddaf7f3703a833200542abfdd193db9ef8cd583703a033200641e00c6a200541a0336a1010201142c8f4a6efbec6aca62b3703002005429a9a94d7c8a5b3a7263703b0332005428abfcabfa8ad96d4573703a83320054291e6e49189e0e9bbf7003703a033200641800d6a200541a0336a1010201142dce795ecad96efc72c370300200542f7a8a191c69ebedd1d3703b033200542cf8997ece6d9bbd9ed003703a833200542fae08ef0b5f8b9aac2003703a033200641a00d6a200541a0336a1010201142ea8292aff28ecdb71d37030020054299d6d5e6f0a7d1ff723703b033200542add387b09fbdd88d9e7f3703a833200542a9bbd28487b7a3f4653703a033200641c00d6a200541a0336a1010201142f1fcbafa9787c3a520370300200542bda2eefabd96b6e16b3703b033200542b2e2b4b4ab80abf3793703a833200542a9aad9a2dcdea6eacc003703a033200641e00d6a200541a0336a101020114297b0bfe2c3bbaea60c370300200542aff8f0b1bcb6d288cf003703b033200542d3caf0becdcfe0e59e7f3703a833200542828ae7e3dbeebefccf003703a033200641800e6a200541a0336a10102011429991a3a2a1c3b5a517370300200542b0e0a4faf4c885aaa27f3703b033200542e3c0e793f5a892ae1e3703a833200542d4f6f1adc4bbdbb09a7f3703a033200641a00e6a200541a0336a1010201142899bb6fabcef85cb1a370300200542e29bcf97ece9f7ac773703b033200542a19fb0be97988ad56a3703a833200542efa5e3d1c9da85cc3a3703a033200641c00e6a200541a0336a10102011429caec799a496c1b606370300200542ff8983e3cb8ae0f7503703b0332005429af88cd1a6828b90053703a8332005428ac6e285b69caba1827f3703a033200641e00e6a200541a0336a1010201142f599ace0eef893a62a370300200542bbba9b8e8785deca213703b033200542d5d58097f7cbb18e383703a83320054284b0efd0aaccde81273703a033200641800f6a200541a0336a1010201142d4efbce6b6a2cbd513370300200542c9dbf3d394dcfcf4c7003703b033200542d7b3dbb7c4f09fb9de003703a833200542c9acff8c9280bfad653703a033200641a00f6a200541a0336a1010201142968c98d1fca5d59011370300200542e9cea0eec3b093e9193703b03320054299aabd93ecf993d8413703a8332005429ad5b1d6e9d08f97cc003703a033200641c00f6a200541a0336a1010201142ecfac495b2a6d9f700370300200542f7fa8daef182f2cd887f3703b0332005428995f1cad5cfc9e6a67f3703a833200542f19fdfe4c78dd5d2093703a033200641e00f6a200541a0336a1010201142a0ca99ade487d2920e370300200542e6a381babab187938b7f3703b033200542d9ab96a9d6ed9d86c0003703a833200542d3af8ec5ddc6b2ad847f3703a03320064180106a200541a0336a101020114282edf5cecbdbcdfa293703002005428eb1d7f0d98c99a9243703b0332005428cdba4efcdfab0ad393703a83320054289f5bacf97b7a3a2c6003703a033200641a0106a200541a0336a1010201142bafdcfe2f2f3bbab2a37030020054288fbf6edf5ea8ced5f3703b03320054297d4ef85f8c49389da003703a833200542becbbef0acf5daa20e3703a033200641c0106a200541a0336a1010201142dd9ed7f5f8b8d8c11c3703002005428988d7bdd1c5defd6c3703b033200542e8c59da39ab38ad7723703a833200542f1b5aec68ac8d8a06e3703a033200641e0106a200541a0336a10102011428f94c8c5f3ebbf8d15370300200542ebc0c0d79a91cca3403703b033200542bf8f94b2a7d1b9f4837f3703a833200542c5b38cbabee9aae8533703a03320064180116a200541a0336a10102011429d90b68fe48f86e304370300200542c3bafefb88b98ed9413703b033200542d19bdbc58cf9cbfaa97f3703a83320054280e2c7da95ec91b7673703a033200641a0116a200541a0336a1010201142fbcfb4fa80fbded913370300200542d3daedb79fe690ec103703b033200542c4ecdd8aedc3f1c0cb003703a833200542e7d2f0e4ddef86c09e7f3703a033200641c0116a200541a0336a10102011429ddbf0b9e2a6f1d201370300200542faf68596d3f7afbc753703b033200542ac86c8d2c2c9d9f12c3703a833200542e4d1a2a79cd6f390937f3703a033200641e0116a200541a0336a101020114283e7a9a683c3d5d92a3703002005428baaaed6d7eb97e8da003703b033200542dacddcdce68c8bcdca003703a83320054282f6f0dbe5a08e91837f3703a03320064180126a200541a0336a1010201142dbc19c8fa9d8e3a61d37030020054293ac83b6e8daf987203703b033200542f6f7f4cacededad7ac7f3703a833200542c6ecdeaceaa2b5bf9f7f3703a033200641a0126a200541a0336a1010201142a29aa1e2ac9aa58904370300200542abfae7c8e79fe1ab8f7f3703b033200542f1968185a4a2cd92b97f3703a8332005429dde96db80b9b28a153703a033200641c0126a200541a0336a1010201142e198c28be0b1b2a515370300200542c880fcc8d9e2e9a71c3703b03320054292c79b899da7defa987f3703a833200542c6bfa087d9bbdc94043703a033200641e0126a200541a0336a1010201142f8a99fe5acb1e7990b37030020054290eabb9d8988f6f63e3703b033200542b0e1e2c7c889dad9d0003703a833200542a49ba9b7bcc79592c5003703a03320064180136a200541a0336a1010201142c292c3b0e693f9aa09370300200542c5e8acddcf89bed2d4003703b033200542ddcfd2ffeae3b9f8987f3703a833200542ae90e7c1d0b6e5f6817f3703a033200641a0136a200541a0336a1010201142c4caaeb795cc9aba06370300200542bcb5c5b7a0c4f8dc263703b033200542efb8cdfae683bdd3a97f3703a833200542a68c9583ea83d092353703a033200641c0136a200541a0336a1010201142bc84c5e68eb4bd8c0f370300200542f884a7aa8c84ceb7c9003703b03320054296c3c2dee2a1def2383703a833200542fbef8199ff8fdfc8ac7f3703a033200641e0136a200541a0336a1010201142b0eec7baa1d9bbfb043703002005429eccacdff5dfe7e28a7f3703b033200542c9f7f9f683ebd8dacb003703a83320054293dcddb7bdc4e0b92a3703a03320064180146a200541a0336a1010201142f58993a6b6e6a5ab2b370300200542839cb79eda89fbd1413703b033200542dbc8cffd96e2fa88887f3703a833200542d8eeace0efa4a3bb413703a033200641a0146a200541a0336a1010201142d4e0d6ced4bbda9b12370300200542cbb7ac8298f1daeb5c3703b033200542ddd4c5abb8d6e4898e7f3703a833200542efd3fc9bd4cbadff837f3703a033200641c0146a200541a0336a10102011428a90a3e2cf84eda321370300200542ced5a68b91d794f7887f3703b03320054289aac4a3c6c8fdc4a97f3703a833200542e9c7f180fbe5de92947f3703a033200641e0146a200541a0336a1010201142f08aaea485eb87ee0f370300200542a9d4ccd1dea095b61a3703b033200542c28789eacae69bbfe4003703a833200542cdcaafe797b1abaa6a3703a03320064180156a200541a0336a101020114284c0fa8fa5d0ce9b12370300200542d48ddefbf0f9aab45f3703b033200542c3c1efedc5d1fcf7bc7f3703a833200542f2e38285cc8bdaa7947f3703a033200641a0156a200541a0336a1010201142dbf0d7f9a59dbdf221370300200542e8938bbaffa5a9bfad7f3703b0332005428384d1d7b6ad9da1a67f3703a833200542b580a48ddce687c55d3703a033200641c0156a200541a0336a1010201142a3d9f4b4eda28e9216370300200542e288d3a6a2c49cda5f3703b0332005428dd297fa92c9d9b9b57f3703a833200542c7e28edef1e9e4c08a7f3703a033200641e0156a200541a0336a1010201142b4f195bddd8df9fd1e370300200542f886adc4bcdbe6b7763703b033200542bc8a818deeac85e1ab7f3703a833200542c29581d69cab909da17f3703a03320064180166a200541a0336a1010201142d0bbbdbed3d097f50737030020054287e79f9de2c180c3887f3703b03320054285df99dfa5aab5b4543703a8332005429aada2d49699cbb33b3703a033200641a0166a200541a0336a1010201142a395aeb4999fb1d405370300200542e3b6e9fcb0949edab77f3703b0332005429cc2f3f3f5b4c687e5003703a833200542bc81b0bb8bd885ffa97f3703a033200641c0166a200541a0336a1010201142d4ac88e692ee95f820370300200542ac9bfaa2d3b796ff7b3703b033200542888fe78df09886bc3f3703a833200542bfd0cbd1f2f6d5ce2d3703a033200641e0166a200541a0336a1010201142e8faf7d4eddbcbd004370300200542e3e2b8ffe798beb9967f3703b0332005428192f5808dd1e3e6ed003703a833200542e9b6cfd9bee6c2ec9b7f3703a03320064180176a200541a0336a1010201142cefbcdafc1b1a3f427370300200542ecbb94adc2cac7a7643703b033200542e7cee9c8d09cdb89bd7f3703a8332005429aa0b4e6c4aab2cf643703a033200641a0176a200541a0336a1010201142d9bda1a1b8afb4f72f370300200542f683e9cade98f2d2b87f3703b033200542a3e4c0bb9ac3d984ee003703a833200542d1c9f799e4bd90b6173703a033200641c0176a200541a0336a1010201142fcb8d1efee8ef3eb1e370300200542f3b9cafba0a890a1c0003703b0332005428dd4c4899185e5f2947f3703a833200542b8e5bf9dd597aeb9e9003703a033200641e0176a200541a0336a1010201142a3c6fecd9bd38bba153703002005428eccd5b7d898febf153703b033200542ca9b938af6e8e0b3ac7f3703a8332005429ad699aae4979d945f3703a03320064180186a200541a0336a101020114282bdd9bfb88a8ad61a37030020054285e8f7be888dffca483703b0332005429786b0b7cc8a9d88f7003703a833200542858fc3bef2e7c0a7283703a033200641a0186a200541a0336a1010201142908ff5a2c887c7c225370300200542d7e695b0dbb7ebee793703b033200542f1beddcba4cf8b97837f3703a833200542f7f8d9a6d5aceaba6c3703a033200641c0186a200541a0336a1010201142c2ddb0aed6c2e0d215370300200542f3dbdf8cdbaf91bc4e3703b033200542b7c6d4e2a2f7fadbd3003703a833200542e7d4d1f8d987b3ee0d3703a033200641e0186a200541a0336a101020114298f3cec0a4aff58824370300200542e6b2ed8e9ac69ffd0e3703b033200542d0ee89a2e0e693fb5c3703a833200542a7ae9cc6f28bd28a2f3703a03320064180196a200541a0336a1010201142c79a83a9d6f19b17370300200542e6a5db858cb7cdf1133703b033200542a59ad397e1b1eaf4c7003703a8332005429b99adb6efeba2c1d8003703a033200641a0196a200541a0336a1010201142e99b839cf491effb2f370300200542d1f9c3b5e19680ed977f3703b033200542d7bdf8979ed2c3c7af7f3703a833200542d2ab8cf0898c8dc4393703a033200641c0196a200541a0336a1010201142d9ca94a4b9e3e0dc00370300200542989aefb8c4e489f0de003703b033200542f1d1edbdebbec8ca2e3703a833200542bef9b4d8eb9ff99d693703a033200641e0196a200541a0336a1010201142eafebadce8eed4970a370300200542819c81bee5e1cec8867f3703b033200542a8879dd2c88c82d21c3703a83320054292eaf0e4f0b7ebbbfd003703a033200641801a6a200541a0336a1010201142b7a0bfa1e1aaa01237030020054296bd8ef99ff2e7a33a3703b0332005429bcdafcafefee7ac0f3703a8332005428db384afb0a08a95ff003703a033200641a01a6a200541a0336a101020114293f6efc38bc4d58e173703002005429a99fcd9aa80e3e7283703b033200542a3d8d0d2a6d5e5b8393703a833200542a99bafd9a2a5d4f5d0003703a033200641c01a6a200541a0336a1010201142c9fbbd9bd5ea938517370300200542d7f5db86c18f9f84f0003703b033200542d99bd5eef2c2d4e4e0003703a83320054288d0d2e1cebc91889d7f3703a033200641e01a6a200541a0336a1010201142ecccffccf7e7e8d529370300200542eee690d0aee9c4f92e3703b033200542baa3c8e6c1f1f89b4c3703a833200542e1f5ef96fec2b297c8003703a033200641801b6a200541a0336a1010201142d8aef7a79aaff0cd1e370300200542c79aa2a894e3eee87d3703b033200542e8c1da9fa0a9c486673703a833200542f39299cfb6a099ddb57f3703a033200641a01b6a200541a0336a1010201142ad9f98db99af9ae91d370300200542da96ecef9291fdfbd8003703b033200542cfe892ce9a8db6d57e3703a833200542899ebeedbb8887cf9c7f3703a033200641c01b6a200541a0336a1010201142d1f5c580b791efe6223703002005429e8bd5f082bae088c0003703b033200542c98fa7c3fecdd0e6fc003703a833200542b8de92f9b0d9f48edd003703a033200641e01b6a200541a0336a1010201142d3b8dca3c5dc90f80e370300200542ceffc0e2d5f4d5cf3a3703b033200542fc94e5f6d29ed4987d3703a833200542fd9debbe9cf7a4dd553703a033200641801c6a200541a0336a1010201142e29fb2ebeac0a7b01137030020054285d1df81b6e0fcc3723703b033200542a0b38dd08896ba8c133703a8332005428485bab1caff93983b3703a033200641a01c6a200541a0336a1010201142badb85a3d5bcb6b311370300200542b7aff093a4ddcfba9e7f3703b033200542a7c8ffb68798d6e67e3703a833200542afd3eac1b7eba3d8083703a033200641c01c6a200541a0336a1010201142958bea9894b1caf22d370300200542dba790aae384cca0937f3703b033200542d696b095cde9efbf173703a833200542e6c8fbab8391eaaa783703a033200641e01c6a200541a0336a1010201142818beae3ffe9ba83303703002005429dd8a29daf92e9b69a7f3703b0332005429dd1e3bdb1cbbb8d753703a833200542add3c7fbf5b9c0dff4003703a033200641801d6a200541a0336a10102011428095ea8db6f787fa2a370300200542c2defdf1f9ffdbe77d3703b033200542f9f398d2f0d1ffc9293703a83320054286a1d1a8a290939ae2003703a033200641a01d6a200541a0336a1010201142dfaad8a3de899acf11370300200542db8bf2f5a883add3653703b033200542e78bfac4f8e4aa8c877f3703a833200542c3cfa0f2ac9785d9817f3703a033200641c01d6a200541a0336a1010201142dea4a297eef0ed9a18370300200542b7ead8f19acbfac5183703b033200542c7e0a3c1a3989289b57f3703a83320054280b0ffd99797e1fb4f3703a033200641e01d6a200541a0336a1010201142a3bfd3acccc6869028370300200542a0f48cb2ecb2d2bccd003703b03320054292b9c1bcaad8aea9513703a833200542b6ddcbd9dad0b8a0ec003703a033200641801e6a200541a0336a101020114290eac5bea2afbf9f0837030020054280e0e2fbfafd83f4947f3703b033200542f28ec6b8b5dda0a6867f3703a833200542e789b3918cf187bbca003703a033200641a01e6a200541a0336a1010201142d2b2c6bbb594e2b70b370300200542e8f789f5cec3b9ace1003703b033200542d1b0b7baf7bedbe0113703a833200542bba2ffb0cface5839e7f3703a033200641c01e6a200541a0336a1010201142d9a3f98aed9c9ae40e37030020054294b59cb29ddcd9a7e4003703b03320054290bcca86a0b9c4cad8003703a833200542db9e95a1eecdc39c143703a033200641e01e6a200541a0336a1010201142a7e29db3f8c7cff92a370300200542c2a2b8e9beb6b2e01a3703b0332005428da8f39cb9e9f9e96c3703a833200542918ba6a6b8f5cdec003703a033200641801f6a200541a0336a1010201142e7eb92c89fc280a90b370300200542f79cabe3e1b2d7cd503703b0332005428b8bdaeec78aa3ab343703a833200542f8e2c7cac7bcb9a6363703a033200641a01f6a200541a0336a1010201142aac3e6c8d0c5dc960b370300200542aed28a83909ed6ed583703b033200542ac84bab8c2d8dae2a07f3703a833200542c0baa8c481c4a1914a3703a033200641c01f6a200541a0336a101020114294e1b3fcd7a9c3bc1f370300200542e9a791e1b7d6b3c0593703b033200542bbf1a88e99d3d2dad7003703a833200542d4c595b7eda38783603703a033200641e01f6a200541a0336a10102011429efafdfdddf2fab8013703002005429580deafb89adfd4ae7f3703b033200542a8cd8aada3acf0c2083703a833200542b384c1f281d6b3c95a3703a03320064180206a200541a0336a1010201142c9ead5feb5c7c3960c3703002005429bd799ed85d1fdcd323703b033200542d08cb2e9ef9bd085f9003703a833200542f390dad881a7c191f6003703a033200641a0206a200541a0336a101020114295cef0c486e5beb111370300200542b7d69ca78bc5a0adce003703b033200542c3878acfd8f4abdefc003703a8332005428dc39ea0d4e0809cdd003703a033200641c0206a200541a0336a10102011429b88b9efe5b6968a2f3703002005428fe2a08fa98dced6e4003703b03320054292b3f8c4aad29696283703a833200542c0b7c4cba4f0fb91163703a033200641e0206a200541a0336a1010201142bd98a2db96e4fcb71e370300200542c1a9f3eae786ddb6997f3703b03320054292eebaaae7a8a7a4bc7f3703a833200542bb9fcfdad1e1fda1423703a03320064180216a200541a0336a1010201142d0f1cac1f3fca2e50137030020054282f0d5e8a7faa18ae8003703b03320054285d4f0e6b6dee9a0573703a833200542f5909eb2b2f287c4f6003703a033200641a0216a200541a0336a1010201142c5bffaff86aecdbb1f370300200542dcc7c8efdbdaddfc867f3703b033200542a09dc3d880c1a181e8003703a8332005428ecae5afb1bcd7cd0b3703a033200641c0216a200541a0336a1010201142f6e08cf5f4c1ad9125370300200542a9f78782cedbb0d0c0003703b033200542efadc2afbd9484d6213703a83320054299e09794b8d0f2a2c7003703a033200641e0216a200541a0336a10102011429d85c48d80dcaff82337030020054283ffd5e4ddebc1aad2003703b033200542bfd8ada9cfdab28c343703a833200542dbaec9abb584dbf08c7f3703a03320064180226a200541a0336a10102011429ff0eeeeb8d1ebe02b370300200542e8aafbaac5a88bd64a3703b033200542dfa0fecebec6898add003703a833200542d9daa0988982d0ece6003703a033200641a0226a200541a0336a1010201142a3c995cb82d781ca0f370300200542d1fde8edb88f9482f3003703b033200542c9bfec83bacec49be2003703a833200542dfc0c8ebea9aff88807f3703a033200641c0226a200541a0336a1010201142fabd9fe6b09daab023370300200542cee2c1f48db3cadbe7003703b033200542cadccbd2f4e2d6f3173703a833200542a8e1d7cccd919b894b3703a033200641e0226a200541a0336a1010201142f6b2abefcdcbc6c315370300200542decabcd7cb87a0a6807f3703b0332005428096feb6e9cbd6c0b47f3703a833200542c892e2bff684efe5ed003703a03320064180236a200541a0336a10102011429edde3cce6ce959d19370300200542a0bbecf9d2db94c30a3703b033200542d4f28db9cfead397363703a8332005428f84edf7de99dfcacf003703a033200641a0236a200541a0336a1010201142988dbe9ab9c8d29c2a370300200542f0e2eaa7ffadf9cd2f3703b033200542b490cde98af998973b3703a8332005428fdcdebbde80a698643703a033200641c0236a200541a0336a1010201142dfd2e1f5cfa9e5ac1837030020054292a3d1d9dcebd8c53e3703b033200542a7f7909aa2a2b496897f3703a833200542c2a283b687d19b8bb47f3703a033200641e0236a200541a0336a1010201142d89c9498f682c6f00437030020054290e3e7dcbc9b919a013703b033200542cafbaec8dd84ef882b3703a833200542aba6fba79f83cec6c0003703a03320064180246a200541a0336a10102011429d8d8ef4dea7c9ed0f370300200542db98faa6a6bdcde1c0003703b0332005428bbdad84db85ae87b17f3703a833200542a3bec1feabaa95af1f3703a033200641a0246a200541a0336a1010201142bdcfc0d2a9d1afc605370300200542e2dafad6a3ecbea7aa7f3703b0332005428493828eefd0a1f8f5003703a833200542c0e3d3cdaeb7f1eba97f3703a033200641c0246a200541a0336a101020114286c3c7cbe9b9bbc113370300200542abeac7f59ab6abbfc9003703b033200542b0f588f8be87aeda233703a8332005429acbb2e7cc968aa9513703a033200641e0246a200541a0336a1010201142ee8d97828fb292a303370300200542bee1c6e89fcaf28c083703b033200542f796c5cfb99deeb0ff003703a833200542b5d1e78ee0e898f3613703a03320064180256a200541a0336a10102011429685b79087f9effb23370300200542bcf0bfcc9fe8ce793703b033200542dad6cbed858cade5ef003703a833200542d894dcf5faa6f0adaa7f3703a033200641a0256a200541a0336a10102011429184bb9f8eabe8ac0a370300200542cfbda787ff9ca5b7fe003703b03320054292b5cc8adefaffe1183703a833200542f2c5bddd8babd8b1193703a033200641c0256a200541a0336a1010201142d280879c809995f606370300200542bcfabf89b3c7fcc5b57f3703b033200542f89588aa86f4bae2623703a833200542fba0ffba80da8fe1743703a033200641e0256a200541a0336a1010201142b59db899c8db9cc411370300200542c8fd99f4c8ccd5b5c7003703b033200542b4e3f2bdfa9ed0c9b07f3703a83320054281bafee89effc397967f3703a03320064180266a200541a0336a101020114296e8e0be92f4a7eb13370300200542edb3b5bdbaf9f1eada003703b033200542eaffb5a18e9eacf0d2003703a833200542b1c3a490b58de4f0957f3703a033200641a0266a200541a0336a101020114292d0a99ff6ef85cd163703002005429ba4cfd3f7d0f1d8f0003703b033200542d5b8c7dbafa88e8a5e3703a833200542fb8ec3f899be92c57d3703a033200641c0266a200541a0336a101020114297dbbae391abd4f704370300200542d981b9eefad0bca16f3703b033200542efec8bc9ab86acdf3a3703a833200542cda8c1a2a7cba6bf7b3703a033200641e0266a200541a0336a1010201142b9f281eea1eb85b725370300200542bbdcec9ff094dfe60e3703b033200542ce87bcea85b098f6193703a833200542ecd3bde8eddc97fa553703a03320064180276a200541a0336a1010201142dffaaa9b86a58b8830370300200542cf80d8ff92e8abf9653703b033200542adba9790d3c18de6f5003703a833200542b2ddb3f1d3a7a081a07f3703a033200641a0276a200541a0336a1010201142bff7b4feadc8e3cc10370300200542f4b7ac9fc797c5831c3703b033200542a3e9fbcda9ffe8a1043703a833200542928ff39798fcc6e91f3703a033200641c0276a200541a0336a1010201142f6fabcfee9b1b79f19370300200542d8c3e2accba49ffd253703b033200542ef85d6a6afddd8999f7f3703a833200542e0d08dcf87dfddd66c3703a033200641e0276a200541a0336a101020114295b2cba7d3dfa28b18370300200542c7e6ecdb809da39b503703b033200542a5a884f39cace9e3513703a833200542dd96fca8aaaf93b3723703a03320064180286a200541a0336a1010201142abedcede9e808f9c29370300200542b6b199dfeecadd800c3703b033200542eec4cde1fb8ebb94a37f3703a83320054291c2a99fb3abbaf1293703a033200641a0286a200541a0336a1010201142b9bc8fb0f2a59bb210370300200542caccc6bbe7cbabfaa17f3703b033200542b6d5ddfd86dded96f0003703a833200542918ec380f9e7d5df003703a033200641c0286a200541a0336a1010201142c5e2c98dfdc0d7f50b37030020054293fed6d295a7fcba753703b033200542b8f6e986b4cbb0c82f3703a833200542fbafc4d8dc8589e8e4003703a033200641e0286a200541a0336a1010201142b382e383d2a4a1eb1637030020054288b9adb1add9cf865c3703b033200542abb3adaaaef6d6fc303703a833200542b6c6becb8d83fcfd5f3703a03320064180296a200541a0336a1010201142f3f1e499d8a3afb50a370300200542b4e992a0e0a985ba3c3703b033200542fabb87e1bef7d6aa0a3703a8332005429ae09f82e2bacbb37d3703a033200641a0296a200541a0336a1010201142dcf6adb7d3ebe7b31a370300200542fe91b7efc2c9cad08e7f3703b033200542f2e2c0a2ecfdff96b17f3703a833200542e0b0bca6b3b3bcd3f0003703a033200641c0296a200541a0336a1010201142c2add1deb3e4bec009370300200542c7bcfff5e0a1b5ba393703b033200542ef9ebad2adfd88d2263703a833200542d6a7eef8e3a5d6e37b3703a033200641e0296a200541a0336a1010201142ccf086f3b2c4d08d16370300200542c09f8e9df995848cbf7f3703b033200542a0d0a4c6e2aa8fe74e3703a833200542ab8ecb98dc96ebf5033703a033200641802a6a200541a0336a1010201142a08afce3909584ed0a370300200542eabcb5b0faa8df87957f3703b033200542e5c9d5f887afc29fc9003703a8332005428bb4f8beb4fb80c9503703a033200641a02a6a200541a0336a101020114282f5c298f2a6c3b91a3703002005428ec790d6a9b4d181323703b0332005429ba4b8daa2d19ef8533703a833200542d1e89fa0aff3f686b57f3703a033200641c02a6a200541a0336a1010201142cf8abcc7a69ec8c02c370300200542eacff6ceb69899b8817f3703b033200542df8997ddeaffddc1907f3703a833200542d68aa3c7f59d84ed7b3703a033200641e02a6a200541a0336a1010201142bfeae1bacf84a2be1c3703002005429784a1e3898f80bea57f3703b033200542beeef29db1aaba98b97f3703a833200542f09edaa49ac9e1bdee003703a033200641802b6a200541a0336a10102011429cd2e1af9fa6fbec2c370300200542a0f5d3d3f780f99c8e7f3703b033200542f7e7fac8b4b1ab80743703a833200542f79ec7fea3ffc9bdb47f3703a033200641a02b6a200541a0336a1010201142d7e884b4d4f3d3ff23370300200542998786bbf5a5b6b04f3703b033200542d0caf290c3d588f0a57f3703a833200542eadd88c591c7b8a5857f3703a033200641c02b6a200541a0336a1010201142e69ee9a3d1cb96ca09370300200542d0b3f7ee85c8b9f64e3703b03320054287a8ca9a908a8badaf7f3703a833200542ed84818c8fcbfaf85f3703a033200641e02b6a200541a0336a1010201142c2a99781a88ae7c6183703002005428ff2c6bbeb9898bbb67f3703b033200542a6fef494aadde9befc003703a833200542b08cbfe3bec4f4b68a7f3703a033200641802c6a200541a0336a1010201142ffd6e5b299efb8a830370300200542b48ef69894e2a0fb817f3703b03320054295eb8c9beda4f6d35b3703a833200542ffe8c3a7df9bb6e0603703a033200641a02c6a200541a0336a1010201142a9e1a0cb93adc4d715370300200542c2b88d9690d0b280163703b033200542d8abfef1e1a8b9f5ec003703a833200542f8faab988da3a5c19d7f3703a033200641c02c6a200541a0336a1010201142a9dd8caa8893b4d31d37030020054285b3cfc3ffe6e7b6a07f3703b033200542a9d6998ab5fcccf45a3703a833200542cc95b690b3b49394043703a033200641e02c6a200541a0336a1010201142a9dea6938dd2bacb27370300200542cea484c9b39eabfc753703b033200542c59296f3dba7eba7ce003703a833200542cbd3eaee91c8bba3653703a033200641802d6a200541a0336a1010201142cbd6bdd09dbadf9620370300200542f085dd83b396f292033703b033200542cae0a4c7eca5d88a1e3703a833200542e0dacc8ee0b38cd8fc003703a033200641a02d6a200541a0336a1010201142d9eeee828df2d9b609370300200542f2ac8f93baa5a5b5153703b033200542b190d3c7f8b8feeba27f3703a833200542dffce287cc9cebcea27f3703a033200641c02d6a200541a0336a1010201142e2f9c3adf6c3bea705370300200542fb8ef6bad2aca2c0837f3703b03320054299fcc4adcec7e8c6c3003703a833200542a4cbf4a39496e3bce3003703a033200641e02d6a200541a0336a1010201142bed2dfc8bdf08b8b1b370300200542b9bd8bc0a998c2995b3703b033200542c8c2cb9d91a09ad5583703a833200542f1cb85f298dcbde6e4003703a033200641802e6a200541a0336a1010201142d69bd992e183c9f2213703002005429ec7b7d0d29bc7cf7d3703b0332005428eadb1b6c682bfff6d3703a833200542dcddc182dae8ade7453703a033200641a02e6a200541a0336a1010201142c9b5bdc6aeccd5fd1c370300200542bed5cdbde19da0b5223703b03320054292c385bff8ebeab94b3703a83320054288beaff290bcd2a1fb003703a033200641c02e6a200541a0336a10102011429beea981e3efc5900f370300200542b6e7cde59e9ab6f3ba7f3703b03320054281d88291c6e6ebcc2c3703a8332005428082c9f5e6eccfe2293703a033200641e02e6a200541a0336a101020114292d381a3b7c4d4b816370300200542bea5ecb8ffbac3fdaf7f3703b033200542c68aa4b1deddda91443703a833200542a0c6f08af5c3dff7bc7f3703a033200641802f6a200541a0336a10102011429ccba0a4b98bfbd10f370300200542d9f5ef80c5e4b3da2e3703b033200542cc91f3e2c2bcb297be7f3703a833200542f0b0ab96e9d4f48c543703a033200641a02f6a200541a0336a101020114283d3f485cec0839e193703002005428e9098a8c1cdc9e5d7003703b033200542c09992e3859db7b7533703a833200542ba97d5d5b1afb1f4857f3703a033200641c02f6a200541a0336a1010201142a2eb9cbaeff1b79510370300200542c987afee8686cac8fe003703b033200542f8ca81ea9cd2dcb79f7f3703a833200542f8d1e9d5adc5ba8a4e3703a033200641e02f6a200541a0336a1010201142d9b092c785efabf00f370300200542b18be5d6f1add3d2623703b033200542aec7f4debfc9a8b5313703a833200542b1d58f86b799b4d3c0003703a03320064180306a200541a0336a1010201142dbbd9fdefbe2d9b721370300200542cefe9084a2c4daa9083703b033200542fdbdafcfaabbfcd22d3703a833200542a29ae6a3b4cefad2683703a033200641a0306a200541a0336a10102011429fa4c3879099d7d21d3703002005429b94c68cb9a89a9fca003703b033200542bed6f1b9c7d5ec913c3703a833200542e1a2c9c1a2c88bc7783703a033200641c0306a200541a0336a10102001a72206200541a0336a10122011290300211f204429030021202043290300211e20052903a033211b200641206a200541a0336a1012204942407d214e204942207c214f20112903002121204429030021232043290300212520052903a033212b200541c8016a2150200541d0016a2151200541d8016a21520340200541f0326a2037203742e00042001008200541b0326a203f420042e00042001008200541d0326a2037420042e00042001008200541e0326a203f2037420042001008200541a0326a203f4200420042001008200541c0326a2037420042004200100820052903b032221820497ca7200541a0336a101242002044290300220720127c2201200754ad201129030020157c7c200120052903a0332207200a7c221d20075422062006ad20432903002207200d7c7c222420075420072024511bad7c2228200154ad7c222a201d2028842024202a8484504200202a7920287942407d202a4200521b202479201d7942407d20244200521b22014280017c22072028202a8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200202820061b210a4200202420061b21014200201d20061b2107024020060d00200e42ff0185200f84200920138484500d0020054188326a202437000020054180326a2206201d37000042002119200541f8316a420037000020054190326a202837000020054198326a202a370000200542003700f031200542003700e831200542003700e031200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200212f200541d8316a4200370000200541d0316a4200370000200541c8316a4200370000200541b8316a202a370000200542003700c0312005201d3700a031200520243700a831200520283700b031200541a0316a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200212f4200210842000b2107202f200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b20054190316a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180316a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0306a4281808080bfb2fdf0c3004200200742001008200541c0306a4291e1e5cd8789fa99284200200742001008200541e0306a4281808080bfb2fdf0c3004200200142001008200541f0306a4291e1e5cd8789fa992842002001420010082018204f7ca7200541a0336a101242002044290300220720207c2201200754ad2011290300201f7c7c200120052903a0332207201b7c221b20075422062006ad20432903002207201e7c7c221f2007542007201f511bad7c2220200154ad7c221e201b202084201e201f8484504200201e7920207942407d201e4200521b201f79201b7942407d201f4200521b22014280017c2207201e20208442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200202020061b21104200201f20061b21014200201b20061b2107202a200541f8306a290300200541c8306a29030020052903c0302208200541d8306a2903007c220a200854ad7c220c200541e8306a29030020052903e0302212200a7c2208201254ad7c7c220a200c54ad7c20052903f030220c200a7c220a200c54ad7c200529038031220c2005290390317c2212200c54ad20054188316a29030020054198316a2903007c7c7c200a20127c220c200a54ad7c7d200c202856ad7d212a2028200c7d2228201d20052903d030223454220b200820245620082024511bad223154ad212f202420087d2124200bad2133024020060d00200e42ff0185200f84200920138484500d00200541a8306a201f370000200541a0306a2206201b3700004200211920054198306a4200370000200541b0306a2020370000200541b8306a201e370000200542003700903020054200370088302005420037008030200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002138200541f82f6a4200370000200541f02f6a4200370000200541e82f6a4200370000200541d82f6a201e370000200542003700e02f2005201b3700c02f2005201f3700c82f200520203700d02f200541c02f6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021384200210842000b21072038200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b202a202f7d212f202820317d2131202420337d2124201d20347d2128200541b02f6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541a02f6a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541f02e6a4281808080bfb2fdf0c3004200200742001008200541e02e6a4291e1e5cd8789fa99284200200742001008200541802f6a4281808080bfb2fdf0c3004200200142001008200541902f6a4291e1e5cd8789fa992842002001420010082018204e7ca7200541a0336a101242002044290300220720237c2201200754ad201129030020217c7c200120052903a0332207202b7c222120075422062006ad2043290300220720257c7c221d2007542007201d511bad7c222a200154ad7c22232021202a84201d20238484504200202379202a7942407d20234200521b201d7920217942407d201d4200521b22014280017c22072023202a8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210a4200202a20061b210c4200201d20061b21014200202120061b2107200541982f6a290300200541e82e6a29030020052903e02e2208200541f82e6a2903007c220d200854ad7c2208200541882f6a29030020052903802f2212200d7c2234201254ad7c7c220d200854ad7c20052903902f2212200d7c2208201254ad7c20052903a02f220d20052903b02f7c2212200d54ad200541a82f6a290300200541b82f6a2903007c7c7c2125200820127c2218200854ad212b201b20052903f02e223d542235201f203454201f2034511b2139024020060d00200e42ff0185200f84200920138484500d00200541c82e6a201d370000200541c02e6a2206202137000042002119200541b82e6a4200370000200541d02e6a202a370000200541d82e6a2023370000200542003700b02e200542003700a82e200542003700a02e200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002133200541982e6a4200370000200541902e6a4200370000200541882e6a4200370000200541f82d6a2023370000200542003700802e200520213700e02d2005201d3700e82d2005202a3700f02d200541e02d6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021334200210842000b21072033200c4201862012423f88848421012007200d420186200c423f888484210c20082015420186200d423f888484210a201920124201868421070b2025202b7c213a201820205621402039ad2138202020187d213e200541d02d6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c02d6a200c200a4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541902d6a4281808080bfb2fdf0c3004200200742001008200541802d6a4291e1e5cd8789fa99284200200742001008200541a02d6a4281808080bfb2fdf0c3004200200142001008200541b02d6a4291e1e5cd8789fa99284200200142001008200541a02c6a202820242031202f1008200541b02c6a2031202f202820241008200541e02c6a20244200202842001008200541d02c6a20284200202442001008200541f02c6a20284200202842001008200541c02c6a202442002024420010084200200541c82c6a290300200541e82c6a29030020052903e02c2201200541f82c6a2903007c2207200154ad7c2201200541d82c6a29030020052903d02c220820077c2220200854ad7c7c2207200154ad7c20052903c02c220820077c2201200854ad7c20052903b02c220720052903a02c7c2208200754ad200541b82c6a290300200541a82c6a2903007c7c7c200120087c2218200154ad7c222520052903f02c222b20188420202025848450420020257920187942407d20254200521b202079202b7942407d20204200521b22014280017c2207201820258442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210c4200201820061b21104200202020061b21014200202b20061b2107200541b82d6a290300200541882d6a29030020052903802d2208200541982d6a2903007c220a200854ad7c2208200541a82d6a29030020052903a02d220d200a7c2233200d54ad7c7c220a200854ad7c20052903b02d220d200a7c2208200d54ad7c20052903c02d220a20052903d02d7c220d200a54ad200541c82d6a290300200541d82d6a2903007c7c7c2008200d7c220a200854ad7c2136200a202a562139202120052903902d2241542245201d203354201d2033511bad2130202a200a7d2132024020060d00200e42ff0185200f84200920138484500d00200541882c6a2020370000200541802c6a2206202b37000042002119200541f82b6a4200370000200541902c6a2018370000200541982c6a2025370000200542003700f02b200542003700e82b200542003700e02b200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200212a200541d82b6a4200370000200541d02b6a4200370000200541c82b6a4200370000200541b82b6a2025370000200542003700c02b2005202b3700a02b200520203700a82b200520183700b02b200541a02b6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200212a4200210842000b2107202a200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210c201920124201868421070b201e203a7d213a2040ad213b2038203e562140202320367d21232039ad213620302032562139200541902b6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541802b6a2010200c4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d02a6a4281808080bfb2fdf0c3004200200742001008200541c02a6a4291e1e5cd8789fa99284200200742001008200541e02a6a4281808080bfb2fdf0c3004200200142001008200541f02a6a4291e1e5cd8789fa99284200200142001008200541e0296a202b20052903d02a22077d2201202020052903e02a220920052903c02a220a200541d82a6a2903007c220c7c22087d2007202b562206ad7d2207201820052903f02a220d200541c82a6a290300200a200c56ad7c220c200541e82a6a2903002008200954ad7c7c22127c220920052903802b221520052903902b7c220e7c220a7d22132006200820205620082020511bad22087d220f20252009200a56ad2009200d54ad200541f82a6a290300200c201256ad7c7c200e201554ad200541882b6a290300200541982b6a2903007c7c7c7c7d200a201856ad7d2008201356ad7d22081008200541f0296a200f2008200120071008200541a02a6a20074200200142001008200541902a6a20014200200742001008200541b02a6a20014200200142001008200541802a6a200742002007420010084200200541882a6a290300200541a82a6a29030020052903a02a2201200541b82a6a2903007c2207200154ad7c2201200541982a6a29030020052903902a220820077c2220200854ad7c7c2207200154ad7c20052903802a220820077c2201200854ad7c20052903f029220720052903e0297c2208200754ad200541f8296a290300200541e8296a2903007c7c7c200120087c222a200154ad7c221820052903b02a221e202a84201820208484504200201879202a7942407d20184200521b202079201e7942407d20204200521b22014280017c22072018202a8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200202a20061b210a4200202020061b21014200201e20061b2107024020060d00200e42ff0185200f84200920138484500d00200541c8296a2020370000200541c0296a2206201e37000042002119200541b8296a4200370000200541d0296a202a370000200541d8296a2018370000200542003700b029200542003700a829200542003700a029200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200212520054198296a420037000020054190296a420037000020054188296a4200370000200541f8286a201837000020054200370080292005201e3700e028200520203700e8282005202a3700f028200541e0286a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021254200210842000b21072025200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b203a203b7d21252040ad212b201f20347d213a2035ad213b202320367d21232039ad2136201d20337d214a2045ad2142200541d0286a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c0286a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa9928100820054190286a4281808080bfb2fdf0c300420020074200100820054180286a4291e1e5cd8789fa99284200200742001008200541a0286a4281808080bfb2fdf0c3004200200142001008200541b0286a4291e1e5cd8789fa99284200200142001008200541e0276a2031202f201e20052903902822087d2207202020052903a0282209200529038028220a20054198286a2903007c220c7c22017d2008201e562206ad7d22081008200541f0276a20282024202a20052903b028220d20054188286a290300200a200c56ad7c220c200541a8286a2903002001200954ad7c7c22127c220920052903c028221520052903d0287c220e7c220a7d22132006200120205620012020511bad22017d20182009200a56ad2009200d54ad200541b8286a290300200c201256ad7c7c200e201554ad200541c8286a290300200541d8286a2903007c7c7c7c7d200a202a56ad7d2001201356ad7d1008200541b0276a20074200202842001008200541c0276a20084200202842001008200541a0276a20074200202442001008200541d0276a200842002024420010084200200541d8276a290300200541c8276a29030020052903c0272201200541b8276a2903007c2207200154ad7c2201200541a8276a29030020052903a027220820077c221f200854ad7c7c2207200154ad7c20052903d027220820077c2201200854ad7c20052903e027220720052903f0277c2208200754ad200541e8276a290300200541f8276a2903007c7c7c200120087c221d200154ad7c222020052903b027222a201d84201f20208484504200202079201d7942407d20204200521b201f79202a7942407d201f4200521b22014280017c2207201d20208442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201d20061b210a4200201f20061b21014200202a20061b2107024020060d00200e42ff0185200f84200920138484500d0020054188276a201f37000020054180276a2206202a37000042002119200541f8266a420037000020054190276a201d37000020054198276a2020370000200542003700f026200542003700e826200542003700e026200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002124200541d8266a4200370000200541d0266a4200370000200541c8266a4200370000200541b8266a2020370000200542003700c0262005202a3700a0262005201f3700a8262005201d3700b026200541a0266a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021244200210842000b21072024200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b2025202b7d2134203e20387d2133203a203b7d212d201b203d7d212e202320367d2138203220307d213e204a20427d2124202120417d212820054190266a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180266a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0256a4281808080bfb2fdf0c3004200200742001008200541c0256a4291e1e5cd8789fa99284200200742001008200541e0256a4281808080bfb2fdf0c3004200200142001008200541f0256a4291e1e5cd8789fa992842002001420010082020200541f8256a290300200541c8256a29030020052903c0252201200541d8256a2903007c2207200154ad7c2208200541e8256a29030020052903e025220920077c2201200954ad7c7c2207200854ad7c20052903f025220820077c2207200854ad7c20052903802622082005290390267c2209200854ad20054188266a29030020054198266a2903007c7c7c200720097c2208200754ad7c7d2008201d56ad7d201d20087d2207202a20052903d02522085422062001201f562001201f511bad220954ad7d213a200720097d2136201f20017d2006ad7d2120202a20087d212a203f42047d220142395420372001203f542206ad7c42017d22015071203742017d22072006200120375420012037511bad7c22012001200754ad20372007203754ad7c7c42017d845071450440200541e0246a202e202d203320341008200541f0246a20332034202e202d1008200541a0256a202d4200202e4200100820054190256a202e4200202d42001008200541b0256a202e4200202e4200100820054180256a202d4200202d42001008420020054188256a290300200541a8256a29030020052903a0252201200541b8256a2903007c2207200154ad7c220120054198256a290300200529039025220820077c2218200854ad7c7c2207200154ad7c200529038025220820077c2201200854ad7c20052903f024220720052903e0247c2208200754ad200541f8246a290300200541e8246a2903007c7c7c200120087c221b200154ad7c221e20052903b0252221201b842018201e8484504200201e79201b7942407d201e4200521b20187920217942407d20184200521b22014280017c2207201b201e8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201b20061b210a4200201820061b21014200202120061b2107024020060d00200e42ff0185200f84200920138484500d00200541c8246a2018370000200541c0246a2206202137000042002119200541b8246a4200370000200541d0246a201b370000200541d8246a201e370000200542003700b024200542003700a824200542003700a024200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200212320054198246a420037000020054190246a420037000020054188246a4200370000200541f8236a201e3700002005420037008024200520213700e023200520183700e8232005201b3700f023200541e0236a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021234200210842000b21072023200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b200541d0236a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c0236a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa9928100820054190236a4281808080bfb2fdf0c300420020074200100820054180236a4291e1e5cd8789fa99284200200742001008200541a0236a4281808080bfb2fdf0c3004200200142001008200541b0236a4291e1e5cd8789fa99284200200142001008200541a0226a202120052903902322077d2201201820052903a0232209200529038023220a20054198236a2903007c220c7c22087d20072021562206ad7d2207201b20052903b023220d20054188236a290300200a200c56ad7c220c200541a8236a2903002008200954ad7c7c22127c220920052903c023221520052903d0237c220e7c220a7d22132006200820185620082018511bad22087d220f201e2009200a56ad2009200d54ad200541b8236a290300200c201256ad7c7c200e201554ad200541c8236a290300200541d8236a2903007c7c7c7c7d200a201b56ad7d2008201356ad7d22081008200541b0226a200f2008200120071008200541e0226a20074200200142001008200541d0226a20014200200742001008200541f0226a20014200200142001008200541c0226a200742002007420010084200200541c8226a290300200541e8226a29030020052903e0222201200541f8226a2903007c2207200154ad7c2201200541d8226a29030020052903d022220820077c2218200854ad7c7c2207200154ad7c20052903c022220820077c2201200854ad7c20052903b022220720052903a0227c2208200754ad200541b8226a290300200541a8226a2903007c7c7c200120087c221b200154ad7c221e20052903f0222221201b842018201e8484504200201e79201b7942407d201e4200521b20187920217942407d20184200521b22014280017c2207201b201e8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201b20061b210a4200201820061b21014200202120061b2107024020060d00200e42ff0185200f84200920138484500d0020054188226a201837000020054180226a2206202137000042002119200541f8216a420037000020054190226a201b37000020054198226a201e370000200542003700f021200542003700e821200542003700e021200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002123200541d8216a4200370000200541d0216a4200370000200541c8216a4200370000200541b8216a201e370000200542003700c021200520213700a021200520183700a8212005201b3700b021200541a0216a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021234200210842000b21072023200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b20054190216a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180216a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0206a4281808080bfb2fdf0c3004200200742001008200541c0206a4291e1e5cd8789fa99284200200742001008200541e0206a4281808080bfb2fdf0c3004200200142001008200541f0206a4291e1e5cd8789fa99284200200142001008200541a0206a20332034202120052903d02022087d2207201820052903e020220920052903c020220a200541d8206a2903007c220c7c22017d20082021562206ad7d22081008200541b0206a202e202d201b20052903f020220d200541c8206a290300200a200c56ad7c220c200541e8206a2903002001200954ad7c7c22127c220920052903802122152005290390217c220e7c220a7d22132006200120185620012018511bad22017d201e2009200a56ad2009200d54ad200541f8206a290300200c201256ad7c7c200e201554ad20054188216a29030020054198216a2903007c7c7c7c7d200a201b56ad7d2001201356ad7d1008200541f01f6a20074200202e4200100820054180206a20084200202e42001008200541e01f6a20074200202d4200100820054190206a20084200202d42001008420020054198206a29030020054188206a2903002005290380202201200541f81f6a2903007c2207200154ad7c2201200541e81f6a29030020052903e01f220820077c221f200854ad7c7c2207200154ad7c200529039020220820077c2201200854ad7c20052903a020220720052903b0207c2208200754ad200541a8206a290300200541b8206a2903007c7c7c200120087c2218200154ad7c221e20052903f01f2223201884201e201f8484504200201e7920187942407d201e4200521b201f7920237942407d201f4200521b22014280017c22072018201e8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201820061b210a4200201f20061b21014200202320061b2107024020060d00200e42ff0185200f84200920138484500d00200541c81f6a201f370000200541c01f6a2206202337000042002119200541b81f6a4200370000200541d01f6a2018370000200541d81f6a201e370000200542003700b01f200542003700a81f200542003700a01f200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200211d200541981f6a4200370000200541901f6a4200370000200541881f6a4200370000200541f81e6a201e370000200542003700801f200520233700e01e2005201f3700e81e200520183700f01e200541e01e6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200211d4200210842000b2107201d200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b200541d01e6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c01e6a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541901e6a4281808080bfb2fdf0c3004200200742001008200541801e6a4291e1e5cd8789fa99284200200742001008200541a01e6a4281808080bfb2fdf0c3004200200142001008200541b01e6a4291e1e5cd8789fa99284200200142001008200541a01d6a20282024203e20381008200541b01d6a203e2038202820241008200541e01d6a20244200202842001008200541d01d6a20284200202442001008200541f01d6a20284200202842001008200541c01d6a202442002024420010084200200541c81d6a290300200541e81d6a29030020052903e01d2201200541f81d6a2903007c2207200154ad7c2201200541d81d6a29030020052903d01d220820077c221d200854ad7c7c2207200154ad7c20052903c01d220820077c2201200854ad7c20052903b01d220720052903a01d7c2208200754ad200541b81d6a290300200541a81d6a2903007c7c7c200120087c221b200154ad7c222120052903f01d2225201b84201d20218484504200202179201b7942407d20214200521b201d7920257942407d201d4200521b22014280017c2207201b20218442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210c4200201b20061b21104200201d20061b21014200202520061b2107200541b81e6a290300200541881e6a29030020052903801e2208200541981e6a2903007c220a200854ad7c2208200541a81e6a29030020052903a01e220d200a7c222b200d54ad7c7c220a200854ad7c20052903b01e220d200a7c2208200d54ad7c20052903c01e220a20052903d01e7c220d200a54ad200541c81e6a290300200541d81e6a2903007c7c7c2008200d7c220a200854ad7c2134200a2018562135202320052903901e2230542239201f202b54201f202b511bad212f2018200a7d2131024020060d00200e42ff0185200f84200920138484500d00200541881d6a201d370000200541801d6a2206202537000042002119200541f81c6a4200370000200541901d6a201b370000200541981d6a2021370000200542003700f01c200542003700e81c200542003700e01c200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002118200541d81c6a4200370000200541d01c6a4200370000200541c81c6a4200370000200541b81c6a2021370000200542003700c01c200520253700a01c2005201d3700a81c2005201b3700b01c200541a01c6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021184200210842000b21072018200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210c201920124201868421070b201e20347d21342035ad2133202f2031562135200541901c6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541801c6a2010200c4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d01b6a4281808080bfb2fdf0c3004200200742001008200541c01b6a4291e1e5cd8789fa99284200200742001008200541e01b6a4281808080bfb2fdf0c3004200200142001008200541f01b6a4291e1e5cd8789fa99284200200142001008200541e01a6a202520052903d01b22077d2201201d20052903e01b220920052903c01b220a200541d81b6a2903007c220c7c22087d20072025562206ad7d2207201b20052903f01b220d200541c81b6a290300200a200c56ad7c220c200541e81b6a2903002008200954ad7c7c22127c220920052903801c221520052903901c7c220e7c220a7d221320062008201d562008201d511bad22087d220f20212009200a56ad2009200d54ad200541f81b6a290300200c201256ad7c7c200e201554ad200541881c6a290300200541981c6a2903007c7c7c7c7d200a201b56ad7d2008201356ad7d22081008200541f01a6a200f2008200120071008200541a01b6a20074200200142001008200541901b6a20014200200742001008200541b01b6a20014200200142001008200541801b6a200742002007420010084200200541881b6a290300200541a81b6a29030020052903a01b2201200541b81b6a2903007c2207200154ad7c2201200541981b6a29030020052903901b220820077c221d200854ad7c7c2207200154ad7c20052903801b220820077c2201200854ad7c20052903f01a220720052903e01a7c2208200754ad200541f81a6a290300200541e81a6a2903007c7c7c200120087c2218200154ad7c221b20052903b01b221e201884201b201d8484504200201b7920187942407d201b4200521b201d79201e7942407d201d4200521b22014280017c22072018201b8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201820061b210a4200201d20061b21014200201e20061b2107024020060d00200e42ff0185200f84200920138484500d00200541c81a6a201d370000200541c01a6a2206201e37000042002119200541b81a6a4200370000200541d01a6a2018370000200541d81a6a201b370000200542003700b01a200542003700a81a200542003700a01a200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002121200541981a6a4200370000200541901a6a4200370000200541881a6a4200370000200541f8196a201b370000200542003700801a2005201e3700e0192005201d3700e819200520183700f019200541e0196a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021214200210842000b21072021200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b203420337d21212035ad2125201f202b7d212b2039ad2132200541d0196a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c0196a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa9928100820054190196a4281808080bfb2fdf0c300420020074200100820054180196a4291e1e5cd8789fa99284200200742001008200541a0196a4281808080bfb2fdf0c3004200200142001008200541b0196a4291e1e5cd8789fa99284200200142001008200541e0186a203e2038201e20052903901922087d2207201d20052903a0192209200529038019220a20054198196a2903007c220c7c22017d2008201e562206ad7d22081008200541f0186a20282024201820052903b019220d20054188196a290300200a200c56ad7c220c200541a8196a2903002001200954ad7c7c22127c220920052903c019221520052903d0197c220e7c220a7d221320062001201d562001201d511bad22017d201b2009200a56ad2009200d54ad200541b8196a290300200c201256ad7c7c200e201554ad200541c8196a290300200541d8196a2903007c7c7c7c7d200a201856ad7d2001201356ad7d1008200541b0186a20074200202842001008200541c0186a20084200202842001008200541a0186a20074200202442001008200541d0186a200842002024420010084200200541d8186a290300200541c8186a29030020052903c0182201200541b8186a2903007c2207200154ad7c2201200541a8186a29030020052903a018220820077c2224200854ad7c7c2207200154ad7c20052903d018220820077c2201200854ad7c20052903e018220720052903f0187c2208200754ad200541e8186a290300200541f8186a2903007c7c7c200120087c2228200154ad7c221f20052903b018221d202884201f20248484504200201f7920287942407d201f4200521b202479201d7942407d20244200521b22014280017c2207201f20288442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200202820061b210a4200202420061b21014200201d20061b2107024020060d00200e42ff0185200f84200920138484500d0020054188186a202437000020054180186a2206201d37000042002119200541f8176a420037000020054190186a202837000020054198186a201f370000200542003700f017200542003700e817200542003700e017200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002118200541d8176a4200370000200541d0176a4200370000200541c8176a4200370000200541b8176a201f370000200542003700c0172005201d3700a017200520243700a817200520283700b017200541a0176a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021184200210842000b21072018200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b202120257d21342031202f7d2133202b20327d212d202320307d212e20054190176a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180176a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0166a4281808080bfb2fdf0c3004200200742001008200541c0166a4291e1e5cd8789fa99284200200742001008200541e0166a4281808080bfb2fdf0c3004200200142001008200541f0166a4291e1e5cd8789fa99284200200142001008201f200541f8166a290300200541c8166a29030020052903c0162201200541d8166a2903007c2207200154ad7c2208200541e8166a29030020052903e016220920077c2201200954ad7c7c2207200854ad7c20052903f016220820077c2207200854ad7c20052903801722082005290390177c2209200854ad20054188176a29030020054198176a2903007c7c7c200720097c2208200754ad7c7d2008202856ad7d202820087d2207201d20052903d0162208542206200120245620012024511bad220954ad7d2138200720097d213e201d20087d2128202420017d2006ad7d21240b200541e0156a202a202042b1cfdae1f595c3dbb27f42c9c983dd91e8dfcd101008200541b0166a2036203a428ba3a0dd928bdaed7e428bef90e99a829fdf947f1008200541a0166a202a4200428ba3a0dd928bdaed7e4200100820054180166a20204200428ba3a0dd928bdaed7e4200100820054190166a202a4200428bef90e99a829fdf947f42001008200541f0156a20204200428bef90e99a829fdf947f420010084200200541f8156a29030020054188166a2903002005290380162201200541a8166a2903007c2207200154ad7c220120054198166a290300200529039016220820077c2218200854ad7c7c2207200154ad7c20052903f015220820077c2201200854ad7c20052903e015220720052903b0167c2208200754ad200541e8156a290300200541b8166a2903007c7c7c200120087c221e200154ad7c222320052903a016222b201e84201820238484504200202379201e7942407d20234200521b201879202b7942407d20184200521b22014280017c2207201e20238442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b21084200201e20061b210a4200201820061b21014200202b20061b2107024020060d00200e42ff0185200f84200920138484500d00200541c8156a2018370000200541c0156a2206202b37000042002119200541b8156a4200370000200541d0156a201e370000200541d8156a2023370000200542003700b015200542003700a815200542003700a015200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200211b20054198156a420037000020054190156a420037000020054188156a4200370000200541f8146a202337000020054200370080152005202b3700e014200520183700e8142005201e3700f014200541e0146a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200211b4200210842000b2107201b200c4201862012423f88848421012007200d420186200c423f888484210a20082015420186200d423f8884842108201920124201868421070b200541d0146a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c0146a200a20084281808080bfb2fdf0c3004291e1e5cd8789fa9928100820054190146a4281808080bfb2fdf0c300420020074200100820054180146a4291e1e5cd8789fa99284200200742001008200541a0146a4281808080bfb2fdf0c3004200200142001008200541b0146a4291e1e5cd8789fa99284200200142001008200541a0136a202e202d42bcf9f6fea4a8c6f0ea0042c681e7dd93bcd0f6161008200541f0136a2033203442e087a4e2bda891e35642d5d4fbdefd93b78a937f1008200541e0136a202e420042e087a4e2bda891e35642001008200541c0136a202d420042e087a4e2bda891e35642001008200541d0136a202e420042d5d4fbdefd93b78a937f42001008200541b0136a202d420042d5d4fbdefd93b78a937f420010084200200541b8136a290300200541c8136a29030020052903c0132201200541e8136a2903007c2207200154ad7c2201200541d8136a29030020052903d013220820077c221b200854ad7c7c2207200154ad7c20052903b013220820077c2201200854ad7c20052903a013220720052903f0137c2208200754ad200541a8136a290300200541f8136a2903007c7c7c200120087c2221200154ad7c222520052903e013222f202184201b2025848450420020257920217942407d20254200521b201b79202f7942407d201b4200521b22014280017c2207202120258442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200202120061b21104200201b20061b21014200202f20061b21072023200541b8146a29030020054188146a290300200529038014220820054198146a2903007c220a200854ad7c220c200541a8146a29030020052903a0142212200a7c2208201254ad7c7c220a200c54ad7c20052903b014220c200a7c220a200c54ad7c20052903c014220c20052903d0147c2212200c54ad200541c8146a290300200541d8146a2903007c7c7c200a20127c220c200a54ad7c7d200c201e56ad7d201e200c7d220a202b200529039014220c54220b200820185620082018511bad221254ad7d2131200a20127d2130201820087d200bad7d2132202b200c7d213d024020060d00200e42ff0185200f84200920138484500d0020054188136a201b37000020054180136a2206202f37000042002119200541f8126a420037000020054190136a202137000020054198136a2025370000200542003700f012200542003700e812200542003700e012200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002118200541d8126a4200370000200541d0126a4200370000200541c8126a4200370000200541b8126a2025370000200542003700c0122005202f3700a0122005201b3700a812200520213700b012200541a0126a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021184200210842000b21072018200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b20054190126a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180126a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0116a4281808080bfb2fdf0c3004200200742001008200541c0116a4291e1e5cd8789fa99284200200742001008200541e0116a4281808080bfb2fdf0c3004200200142001008200541f0116a4291e1e5cd8789fa99284200200142001008200541e0106a20282024428ddca0ffcbfbf98b7642898ba8fe80f4aec82b1008200541b0116a203e203842ede6d9f1f4f6a48df90042fbc8ace7c0ecaa83771008200541a0116a2028420042ede6d9f1f4f6a48df9004200100820054180116a2024420042ede6d9f1f4f6a48df9004200100820054190116a2028420042fbc8ace7c0ecaa837742001008200541f0106a2024420042fbc8ace7c0ecaa8377420010084200200541f8106a29030020054188116a2903002005290380112201200541a8116a2903007c2207200154ad7c220120054198116a290300200529039011220820077c2218200854ad7c7c2207200154ad7c20052903f010220820077c2201200854ad7c20052903e010220720052903b0117c2208200754ad200541e8106a290300200541b8116a2903007c7c7c200120087c221e200154ad7c222320052903a011222b201e84201820238484504200202379201e7942407d20234200521b201879202b7942407d20184200521b22014280017c2207201e20238442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d221042005242002006410047ad7d220f420052200f501b420220087d221342ff015642002001200bad7c7d220e420052200e501b20061b7222061b21154200201e20061b21144200201820061b210a4200202b20061b210c2025200541f8116a290300200541c8116a29030020052903c0112201200541d8116a2903007c2207200154ad7c2208200541e8116a29030020052903e011220920077c2201200954ad7c7c2207200854ad7c20052903f011220820077c2207200854ad7c20052903801222082005290390127c2209200854ad20054188126a29030020054198126a2903007c7c7c200720097c2208200754ad7c7d2008202156ad7d202120087d2207202f20052903d011220854220b2001201b562001201b511bad220954ad7d20317c200720097d220720307c2209200754ad7c2009202f20087d2207203d7c220820075422292029ad201b20017d200bad7d220720327c7c220120075420012007511bad7c2207200954ad7c22092009200742a2cffaf397c9eed7c7007c220d200754ad7c200d20084281808080bfb2fdf0c3007d221c200854220b2001200bad7c4292e1e5cd8789fa99287d221220015420012012511bad7c2222200d54ad7c42aac0c689aece93b2307d20084281808080bfb2fdf0c3005420014291e1e5cd8789fa99285420014291e1e5cd8789fa9928511b200742ddb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b230511b200742ddb0858ce8b691a8b87f85200942a9c0c689aece93b2308584501b220b1b213d20072022200b1b213020012012200b1b212f2008201c200b1b2132024020060d00201342ff0185201084200e200f8484500d00200541c8106a2018370000200541c0106a2206202b37000042002119200541b8106a4200370000200541d0106a201e370000200541d8106a2023370000200542003700b010200542003700a810200542003700a010200641ff012013a76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad22098884210c200641186a290000200186200641106a290000220a420188200988842115200a2001862007420188200b417f73413f71ad8884210d20082001862112027e201342017c220a2010200a2013542206200e2006ad7c2208200e54200a20135a1bad7c220e842008200f200e201054ad7c22228484504504404200211b20054198106a420037000020054190106a420037000020054188106a4200370000200541f80f6a202337000020054200370080102005202b3700e00f200520183700e80f2005201e3700f00f200541e00f6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021072016210c2017210d42000c010b4200211b4200210742000b2101201b200c4201862012423f888484210a2001200d420186200c423f888484211420072015420186200d423f88848421152019201242018684210c0b200541d00f6a200c200a42ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c00f6a201420154281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541900f6a4281808080bfb2fdf0c3004200200c42001008200541800f6a4291e1e5cd8789fa99284200200c42001008200541a00f6a4281808080bfb2fdf0c3004200200a42001008200541b00f6a4291e1e5cd8789fa99284200200a42001008200541a00e6a202a202042cab7e79be48edbe1b97f4280c9c6e9eecffcb4291008200541f00e6a2036203a42f1aeaff0cd97d0945642defbf08a94babfe42c1008200541e00e6a202a420042f1aeaff0cd97d0945642001008200541c00e6a2020420042f1aeaff0cd97d0945642001008200541d00e6a202a420042defbf08a94babfe42c42001008200541b00e6a2020420042defbf08a94babfe42c420010084200200541b80e6a290300200541c80e6a29030020052903c00e2201200541e80e6a2903007c2207200154ad7c2201200541d80e6a29030020052903d00e220820077c221b200854ad7c7c2207200154ad7c20052903b00e220820077c2201200854ad7c20052903a00e220720052903f00e7c2208200754ad200541a80e6a290300200541f80e6a2903007c7c7c200120087c2221200154ad7c222520052903e00e2231202184201b2025848450420020257920217942407d20254200521b201b7920317942407d201b4200521b22014280017c2207202120258442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200202120061b21104200201b20061b21014200203120061b2107203d2023200541b80f6a290300200541880f6a29030020052903800f2208200541980f6a2903007c220a200854ad7c220c200541a80f6a29030020052903a00f2212200a7c2208201254ad7c7c220a200c54ad7c20052903b00f220c200a7c220a200c54ad7c20052903c00f220c20052903d00f7c2212200c54ad200541c80f6a290300200541d80f6a2903007c7c7c200a20127c220c200a54ad7c7d200c201e56ad7d201e200c7d220a202b20052903900f220c54220b200820185620082018511bad221254ad7d7c21232030200a20127d7c220a203054ad2130200a2032202b200c7d7c223d20325422292029ad202f201820087d200bad7d7c7c221e202f54201e202f511bad7c222f200a542135203d4281808080bfb2fdf0c3007d2253203d54220b201e200bad7c4292e1e5cd8789fa99287d224a201e54201e204a511b2139024020060d00200e42ff0185200f84200920138484500d00200541880e6a201b370000200541800e6a2206203137000042002119200541f80d6a4200370000200541900e6a2021370000200541980e6a2025370000200542003700f00d200542003700e80d200542003700e00d200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002118200541d80d6a4200370000200541d00d6a4200370000200541c80d6a4200370000200541b80d6a2025370000200542003700c00d200520313700a00d2005201b3700a80d200520213700b00d200541a00d6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021184200210842000b21072018200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b202320307c21322035ad213b202f42a2cffaf397c9eed7c7007c21412039ad2142200541900d6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541800d6a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d00c6a4281808080bfb2fdf0c3004200200742001008200541c00c6a4291e1e5cd8789fa99284200200742001008200541e00c6a4281808080bfb2fdf0c3004200200142001008200541f00c6a4291e1e5cd8789fa99284200200142001008200541e00b6a202e202d42c1fbd89483b99ccccc0042b9d88be09ebf86922e1008200541b00c6a2033203442a3fcc7bde8a28cd92942c0aceee3c887ddceb87f1008200541a00c6a202e420042a3fcc7bde8a28cd92942001008200541800c6a202d420042a3fcc7bde8a28cd92942001008200541900c6a202e420042c0aceee3c887ddceb87f42001008200541f00b6a202d420042c0aceee3c887ddceb87f420010084200200541f80b6a290300200541880c6a29030020052903800c2201200541a80c6a2903007c2207200154ad7c2201200541980c6a29030020052903900c220820077c2218200854ad7c7c2207200154ad7c20052903f00b220820077c2201200854ad7c20052903e00b220720052903b00c7c2208200754ad200541e80b6a290300200541b80c6a2903007c7c7c200120087c2223200154ad7c222b20052903a00c22302023842018202b8484504200202b7920237942407d202b4200521b20187920307942407d20184200521b22014280017c22072023202b8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200202320061b21104200201820061b21014200203020061b21072025200541f80c6a290300200541c80c6a29030020052903c00c2208200541d80c6a2903007c220a200854ad7c220c200541e80c6a29030020052903e00c2212200a7c2208201254ad7c7c220a200c54ad7c20052903f00c220c200a7c220a200c54ad7c20052903800d220c20052903900d7c2212200c54ad200541880d6a290300200541980d6a2903007c7c7c200a20127c220c200a54ad7c7d200c202156ad7d2021200c7d220a203120052903d00c220c54220b2008201b562008201b511bad221254ad7d213c200a20127d2146201b20087d200bad7d21472031200c7d2148024020060d00200e42ff0185200f84200920138484500d00200541c80b6a2018370000200541c00b6a2206203037000042002119200541b80b6a4200370000200541d00b6a2023370000200541d80b6a202b370000200542003700b00b200542003700a80b200542003700a00b200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200211b200541980b6a4200370000200541900b6a4200370000200541880b6a4200370000200541f80a6a202b370000200542003700800b200520303700e00a200520183700e80a200520233700f00a200541e00a6a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200211b4200210842000b2107201b200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b2032203b7c2131202f2041562135204120427c2142200541d00a6a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c00a6a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541900a6a4281808080bfb2fdf0c3004200200742001008200541800a6a4291e1e5cd8789fa99284200200742001008200541a00a6a4281808080bfb2fdf0c3004200200142001008200541b00a6a4291e1e5cd8789fa99284200200142001008200541a0096a2028202442bd8abcc8e68ed698977f42b6f38d9980be9c88101008200541f0096a203e203842fab7e287da8ab3d54842e5e0fefa89c2d3c6141008200541e0096a2028420042fab7e287da8ab3d54842001008200541c0096a2024420042fab7e287da8ab3d54842001008200541d0096a2028420042e5e0fefa89c2d3c61442001008200541b0096a2024420042e5e0fefa89c2d3c614420010084200200541b8096a290300200541c8096a29030020052903c0092201200541e8096a2903007c2207200154ad7c2201200541d8096a29030020052903d009220820077c221b200854ad7c7c2207200154ad7c20052903b009220820077c2201200854ad7c20052903a009220720052903f0097c2208200754ad200541a8096a290300200541f8096a2903007c7c7c200120087c2221200154ad7c222520052903e0092232202184201b2025848450420020257920217942407d20254200521b201b7920327942407d201b4200521b22014280017c2207202120258442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d221042005242002006410047ad7d220f420052200f501b420220087d221342ff015642002001200bad7c7d220e420052200e501b20061b7222061b21154200202120061b21144200201b20061b210a4200203220061b210c202b200541b80a6a290300200541880a6a29030020052903800a2201200541980a6a2903007c2207200154ad7c2208200541a80a6a29030020052903a00a220920077c2201200954ad7c7c2207200854ad7c20052903b00a220820077c2207200854ad7c20052903c00a220820052903d00a7c2209200854ad200541c80a6a290300200541d80a6a2903007c7c7c200720097c2208200754ad7c7d2008202356ad7d202320087d2207203020052903900a220854220b200120185620012018511bad220954ad7d203c7c200720097d220720467c2209200754ad7c2009203020087d220720487c220820075422292029ad201820017d200bad7d220720477c7c220120075420012007511bad7c2207200954ad7c22092009200742a2cffaf397c9eed7c7007c220d200754ad7c200d20084281808080bfb2fdf0c3007d221c200854220b2001200bad7c4292e1e5cd8789fa99287d221220015420012012511bad7c2222200d54ad7c42aac0c689aece93b2307d20084281808080bfb2fdf0c3005420014291e1e5cd8789fa99285420014291e1e5cd8789fa9928511b200742ddb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b230511b200742ddb0858ce8b691a8b87f85200942a9c0c689aece93b2308584501b220b1b214620072022200b1b213020012012200b1b213b2008201c200b1b213c024020060d00201342ff0185201084200e200f8484500d0020054188096a201b37000020054180096a2206203237000042002119200541f8086a420037000020054190096a202137000020054198096a2025370000200542003700f008200542003700e808200542003700e008200641ff012013a76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad22098884210c200641186a290000200186200641106a290000220a420188200988842115200a2001862007420188200b417f73413f71ad8884210d20082001862112027e201342017c220a2010200a2013542206200e2006ad7c2208200e54200a20135a1bad7c220e842008200f200e201054ad7c222284845045044042002118200541d8086a4200370000200541d0086a4200370000200541c8086a4200370000200541b8086a2025370000200542003700c008200520323700a0082005201b3700a808200520213700b008200541a0086a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021072016210c2017210d42000c010b420021184200210742000b21012018200c4201862012423f888484210a2001200d420186200c423f888484211420072015420186200d423f88848421152019201242018684210c0b203142a9c0c689aece93b230852147202f42ddb0858ce8b691a8b87f8521482035ad214b2041204256213520054190086a200c200a42ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180086a201420154281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0076a4281808080bfb2fdf0c3004200200c42001008200541c0076a4291e1e5cd8789fa99284200200c42001008200541e0076a4281808080bfb2fdf0c3004200200a42001008200541f0076a4291e1e5cd8789fa99284200200a42001008200541e0066a202a202042dc8ce0b1d4cce7af0d42b3fea8c3c6bd8898141008200541b0076a2036203a42a7e386ade69d91b13242d3eeece2a8bcdee6661008200541a0076a202a420042a7e386ade69d91b1324200100820054180076a2020420042a7e386ade69d91b1324200100820054190076a202a420042d3eeece2a8bcdee66642001008200541f0066a2020420042d3eeece2a8bcdee666420010084200200541f8066a29030020054188076a2903002005290380072201200541a8076a2903007c2207200154ad7c220120054198076a290300200529039007220820077c2220200854ad7c7c2207200154ad7c20052903f006220820077c2201200854ad7c20052903e006220720052903b0077c2208200754ad200541e8066a290300200541b8076a2903007c7c7c200120087c2218200154ad7c222320052903a007222b20188420202023848450420020237920187942407d20234200521b202079202b7942407d20204200521b22014280017c2207201820238442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200201820061b21104200202020061b21014200202b20061b210720462025200541f8076a290300200541c8076a29030020052903c0072208200541d8076a2903007c220a200854ad7c220c200541e8076a29030020052903e0072212200a7c2208201254ad7c7c220a200c54ad7c20052903f007220c200a7c220a200c54ad7c200529038008220c2005290390087c2212200c54ad20054188086a29030020054198086a2903007c7c7c200a20127c220c200a54ad7c7d200c202156ad7d2021200c7d220a203220052903d007220c54220b2008201b562008201b511bad221254ad7d7c2030200a20127d7c220a203054ad7c200a203c2032200c7d7c2230203c5422292029ad203b201b20087d200bad7d7c7c222a203b54202a203b511bad7c2221200a54ad7c223242a9c0c689aece93b23085211b202142ddb0858ce8b691a8b87f852125202142a2cffaf397c9eed7c7007c2208202154ad2136200820304281808080bfb2fdf0c3007d2241203054220b202a200bad7c4292e1e5cd8789fa99287d223a202a54202a203a511bad7c223b2008542139024020060d00200e42ff0185200f84200920138484500d00200541c8066a2020370000200541c0066a2206202b37000042002119200541b8066a4200370000200541d0066a2018370000200541d8066a2023370000200542003700b006200542003700a806200542003700a006200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c22228484504504404200213c20054198066a420037000020054190066a420037000020054188066a4200370000200541f8056a202337000020054200370080062005202b3700e005200520203700e805200520183700f005200541e0056a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300221f4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c211d2009200188211a4200212703402013420186200f423f88842209201d201a4201862013423f8884221a7d2009202656ad7d201f20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b4200213c4200210842000b2107203c200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b203142a9c0c689aece93b230512140203142a9c0c689aece93b230542145202f42ddb0858ce8b691a8b87f54214c2047204884213c201e4291e1e5cd8789fa992851214d201e4291e1e5cd8789fa9928542154203d4281808080bfb2fdf0c3005421552031204b7c21462035ad2147203242a9c0c689aece93b230512135203242a9c0c689aece93b230542156202142ddb0858ce8b691a8b87f542157201b2025842148202a4291e1e5cd8789fa9928512158202a4291e1e5cd8789fa992854215920304281808080bfb2fdf0c30054215a203220367c21362039ad214b200541d0056a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541c0056a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa9928100820054190056a4281808080bfb2fdf0c300420020074200100820054180056a4291e1e5cd8789fa99284200200742001008200541a0056a4281808080bfb2fdf0c3004200200142001008200541b0056a4291e1e5cd8789fa99284200200142001008200541a0046a202e202d4299fb9bc5f0dfc3d3827f42a5a0ebca9685b0b6171008200541f0046a203320344291d2b8c7bcf5b7b6b17f42b6af9fc7e5a5f8ab501008200541e0046a202e42004291d2b8c7bcf5b7b6b17f42001008200541c0046a202d42004291d2b8c7bcf5b7b6b17f42001008200541d0046a202e420042b6af9fc7e5a5f8ab5042001008200541b0046a202d420042b6af9fc7e5a5f8ab50420010084200200541b8046a290300200541c8046a29030020052903c0042201200541e8046a2903007c2207200154ad7c2201200541d8046a29030020052903d004220820077c221f200854ad7c7c2207200154ad7c20052903b004220820077c2201200854ad7c20052903a004220720052903f0047c2208200754ad200541a8046a290300200541f8046a2903007c7c7c200120087c221d200154ad7c221b20052903e0042225201d84201b201f8484504200201b79201d7942407d201b4200521b201f7920257942407d201f4200521b22014280017c2207201b201d8442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d220f42005242002006410047ad7d22134200522013501b420220087d220e42ff015642002001200bad7c7d22094200522009501b20061b7222061b210d4200201d20061b21104200201f20061b21014200202520061b21072023200541b8056a29030020054188056a290300200529038005220820054198056a2903007c220a200854ad7c220c200541a8056a29030020052903a0052212200a7c2208201254ad7c7c220a200c54ad7c20052903b005220c200a7c220a200c54ad7c20052903c005220c20052903d0057c2212200c54ad200541c8056a290300200541d8056a2903007c7c7c200a20127c220c200a54ad7c7d200c201856ad7d2018200c7d220a202b200529039005220c54220b200820205620082020511bad221254ad7d2123200a20127d2134202020087d200bad7d2133202b200c7d212b024020060d00200e42ff0185200f84200920138484500d0020054188046a201f37000020054180046a2206202537000042002119200541f8036a420037000020054190046a201d37000020054198046a201b370000200542003700f003200542003700e803200542003700e003200641ff01200ea76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad220a8884210c200641186a290000200186200641106a290000220d420188200a88842115200d2001862007420188200b417f73413f71ad8884210d20082001862112027e200e42017c220a200f200a200e54220620092006ad7c2208200954200a200e5a1bad7c220e8420082013200e200f54ad7c222284845045044042002120200541d8036a4200370000200541d0036a4200370000200541c8036a4200370000200541b8036a201b370000200542003700c003200520253700a0032005201f3700a8032005201d3700b003200541a0036a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021082016210c2017210d42000c010b420021204200210842000b21072020200c4201862012423f88848421012007200d420186200c423f888484211020082015420186200d423f888484210d201920124201868421070b204c204520401b2139203c50214020552054204d1b2145204620477c213c2057205620351b2135204850214c205a205920581b214d2036204b7c213620054190036a2007200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820054180036a2010200d4281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541d0026a4281808080bfb2fdf0c3004200200742001008200541c0026a4291e1e5cd8789fa99284200200742001008200541e0026a4281808080bfb2fdf0c3004200200142001008200541f0026a4291e1e5cd8789fa99284200200142001008200541e0016a2028202442bfb289c0e3fd9fdd1742f4d7c0b3a581ffd1191008200541b0026a203e203842e0ab97e9f19ae793f30042f7fe90b8b0e091a2a67f1008200541a0026a2028420042e0ab97e9f19ae793f3004200100820054180026a2024420042e0ab97e9f19ae793f3004200100820054190026a2028420042f7fe90b8b0e091a2a67f42001008200541f0016a2024420042f7fe90b8b0e091a2a67f420010084200200541f8016a29030020054188026a2903002005290380022201200541a8026a2903007c2207200154ad7c220120054198026a290300200529039002220820077c2224200854ad7c7c2207200154ad7c20052903f001220820077c2201200854ad7c20052903e001220720052903b0027c2208200754ad200541e8016a290300200541b8026a2903007c7c7c200120087c2228200154ad7c222020052903a002221820288420202024848450420020207920287942407d20204200521b20247920187942407d20244200521b22014280017c2207202020288442005222061b2208420256220b42002001200756ad20061b22014200522001501b2206ad7d221042005242002006410047ad7d220f420052200f501b420220087d221342ff015642002001200bad7c7d220e420052200e501b20061b7222061b21154200202820061b21144200202420061b210a4200201820061b210c201b200541f8026a290300200541c8026a29030020052903c0022201200541d8026a2903007c2207200154ad7c2208200541e8026a29030020052903e002220920077c2201200954ad7c7c2207200854ad7c20052903f002220820077c2207200854ad7c20052903800322082005290390037c2209200854ad20054188036a29030020054198036a2903007c7c7c200720097c2208200754ad7c7d2008201d56ad7d201d20087d2207202520052903d002220854220b2001201f562001201f511bad220954ad7d20237c200720097d220720347c2209200754ad7c2009202520087d2207202b7c220820075422292029ad201f20017d200bad7d220720337c7c220120075420012007511bad7c2207200954ad7c22092009200742a2cffaf397c9eed7c7007c220d200754ad7c200d20084281808080bfb2fdf0c3007d221c200854220b2001200bad7c4292e1e5cd8789fa99287d221220015420012012511bad7c2222200d54ad7c42aac0c689aece93b2307d20084281808080bfb2fdf0c3005420014291e1e5cd8789fa99285420014291e1e5cd8789fa9928511b200742ddb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b230511b200742ddb0858ce8b691a8b87f85200942a9c0c689aece93b2308584501b220b1b212320072022200b1b211d20012012200b1b211f2008201c200b1b211b024020060d00201342ff0185201084200e200f8484500d0020502024370000200541c0016a2206201837000042002119200541b8016a42003700002051202837000020522020370000200542003700b001200542003700a801200542003700a001200641ff012013a76b220b410376411f716b220641086a2900002207200b410771220bad22018620062900002208420188200b413f73ad22098884210c200641186a290000200186200641106a290000220a420188200988842115200a2001862007420188200b417f73413f71ad8884210d20082001862112027e201342017c220a2010200a2013542206200e2006ad7c2208200e54200a20135a1bad7c220e842008200f200e201054ad7c22228484504504404200212520054198016a420037000020054190016a420037000020054188016a4200370000200541f8006a20203700002005420037008001200520183700602005202437006820052028370070200541e0006a200aa7220b410376411f716a220641106a2900002207200a420783220188200641186a2900002209420186200b410771220b413f73ad2210868421132007420186200b417f73413f71ad86200641086a290000221420018884210f2014420186201086200629000020018884211042dcb0858ce8b691a8b87f220742ddb0858ce8b691a8b87f54ad20074280808080bfb2fdf0c300222d4281808080bfb2fdf0c3005422062006ad4290e1e5cd8789fa99287c221c4291e1e5cd8789fa992854201c4291e1e5cd8789fa9928511bad7c2226200754ad7c42a8c0c689aece93b2307c212e2009200188211a4200212703402013420186200f423f88842209202e201a4201862013423f8884221a7d2009202656ad7d202d20104201862015423f8884221454201c200f4201862010423f88842201542001201c511bad202620097d56ad7d423f87220742ddb0858ce8b691a8b87f8322107d2216201420074281808080bfb2fdf0c300832217542206200120074291e1e5cd8789fa992883220f542001200f511bad22197d2113201a200742a9c0c689aece93b230837d2009201054ad7d2016201954ad7d211a2001200f7d2006ad7d210f201420177d21102008200a42017d2209200a542206ad7c42017d2201200851210b20012008542129200e42017d2214200e54212c2012423f882116200c423f8821172015420186200d423f88842115202720124201868421122007420183221921272009210a20012108201420062029200b1bad7c2207210e200c4201862016842216210c200d4201862017842217210d200720098420012007201454ad2022202cad7c7c42017d2222848450450d000b420021072016210c2017210d42000c010b420021254200210742000b21012025200c4201862012423f888484210a2001200d420186200c423f888484211420072015420186200d423f88848421152019201242018684210c0b2045203920401b2106203c42aac0c689aece93b2307d210d204d2035204c1b210b203642aac0c689aece93b2307d210e200541d0006a200c200a42ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200541406b201420154281808080bfb2fdf0c3004291e1e5cd8789fa99281008200541106a4281808080bfb2fdf0c3004200200c4200100820054291e1e5cd8789fa99284200200c42001008200541206a4281808080bfb2fdf0c3004200200a42001008200541306a4291e1e5cd8789fa99284200200a42001008201b2018200529031022017d7c22084281808080bfb2fdf0c300542008201b54222cad201f2024200529032022092005290300220a200541186a2903007c220c7c22077d20012018562229ad7d7c7c22014291e1e5cd8789fa99285420014291e1e5cd8789fa9928511b201d202820052903302212200541086a290300200a200c56ad7c2215200541286a2903002007200954ad7c7c22137c22092005290340220f20052903507c22107c220a7d22142029200720245620072024511bad221c7d7c220c202c2001201f542001201f511bad7c220742ddb0858ce8b691a8b87f542007200c54ad200c201d54ad202320202009200a56ad2009201254ad200541386a2903002013201554ad7c7c200f201056ad200541c8006a290300200541d8006a2903007c7c7c7c7d200a202856ad7d2014201c54ad7d7c7c7c220942a9c0c689aece93b23054200942a9c0c689aece93b230511b200742ddb0858ce8b691a8b87f85200942a9c0c689aece93b2308584501b21292009200742a2cffaf397c9eed7c7007c220a200754ad7c200a20084281808080bfb2fdf0c3007d2213200854222c2001202cad7c4292e1e5cd8789fa99287d220c2001542001200c511bad7c220f200a54ad7c42aac0c689aece93b2307d21102037203f42ff0185845004402011428080808090ee9ea4ce00370300200542003703b033200542003703a833200542003703a0334100200541a0336a101020054198336a4200370300200542003703903320054200370388332005421137038033410420054180336a101041004124100c0b2031200d20061b2115202f204220061b2112201e204a20061b210d203d205320061b210a2032200e200b1b211f2021203b200b1b2120202a203a200b1b211e20302041200b1b211b2009201020291b21212007200f20291b21232001200c20291b21252008201320291b212b203f42017c42ff0183223f42c100540d000b2000200a3703002000200d37030820002012370310200041186a2015370300200541c0336a24000b953426017f017e017e017f017e017e017e017f017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017e017f017f017e017e230041e0086b22002400418001100f1a41c00041e00010110240100a4104490d004100200041c0086a1009200041c0086a41e001200041a0086a101602400240200041a8086a290300200041b8086a290300842204200041b0086a290300220220002903a008220142feb1d5b005858484504504402001428afb84e60885200284200484500d012001429eb7b1db0e8520028420048450450d03100a41034d044041004100100c0b41c000200041c0086a101220002903c0082201200041c8086a2903002202200041d0086a2903002204200041d8086a2207290300220542c0004200420042001017200742a1a288b0d1bbdafe08370300200042a4c0ace1d8dfffe8947f3703d00820004283cde9f59f8fc69b2e3703c8082000429ca4bcf4d6d7fbdea47f3703c0082001a72203200041c0086a1010200742f3f7a092ccc7c08b2a370300200042a9f6b0c0a5be87b3053703d00820004296e49fefd4f2e2a7c4003703c808200042918bcabbbaa5d6c8e0003703c008200341206a200041c0086a101020004180086a2001200220042005101920004190086a290300210120004188086a290300210220004198086a2903002104200029038008210541c000200041c0086a101220002802c008210320074200370300200042003703d008200042003703c8082000200542f6fbf1e7ddf9eba9b97f85200142f4d8aae3d8e0fec76d8584200242a384d6e2d5faa1ce1585200442b8808cdb97d4b2890385848450ad3703c0082003200041c0086a10100c020b100b044041004100100c0b0240100a220341c3004b0d0041004100100c200341234b0d0041004100100c0b200041206a420442004200420042024200420042002003ad420042004200101820002000290320200041286a290300200041306a290300200041386a2903001019200041086a2903002101200041106a2903002102200041186a29030021042000290300210541c000200041c0086a101220002802c0082103200041d8086a2004370300200020023703d008200020013703c808200020053703c0082003200041c0086a10100c010b100b044041004100100c0b100a41234d044041004100100c0b4104200041c0086a1009200041a0076a20002903c0082212200041c8086a2903002215200041d0086a2903002224200041d8086a29030022251008200041b0076a20242025201220151008200041e0076a20154200201242001008200041d0076a20124200201542001008200041f0076a20124200201242001008200041c0076a201542002015420010084200200041c8076a290300200041e8076a29030020002903e0072201200041f8076a2903007c2202200154ad7c2201200041d8076a29030020002903d007220420027c220c200454ad7c7c2202200154ad7c20002903c007220420027c2201200454ad7c20002903b007220220002903a0077c2204200254ad200041b8076a290300200041a8076a2903007c7c7c200120047c220e200154ad7c221320002903f007221a200e84200c20138484504200201379200e7942407d20134200521b200c79201a7942407d200c4200521b22014280017c2202200e20138442005222031b2204420256220742002001200256ad20031b22014200522001501b2203ad7d220842005242002003410047ad7d220d420052200d501b420220047d220542ff0156420020012007ad7c7d22094200522009501b20031b7222031b21044200200e20031b21064200200c20031b21014200201a20031b2102024020030d00200542ff01852008842009200d8484500d0020004188076a200c37000020004180076a2203201a370000200041f8066a420037000020004190076a200e37000020004198076a2013370000200042003700f006200042003700e806200042003700e006200341ff012005a76b2207410376411f716b220341086a290000220220074107712207ad220186200329000022044201882007413f73ad22068884210b200341186a290000200186200341106a290000220a420188200688842114200a20018620024201882007417f73413f71ad8884210a20042001862111027e200542017c220620082005200656220320092003ad7c220420095420052006581bad7c2209842004200d2008200956ad7c221c848450450440200041d8066a4200370000200041d0066a4200370000200041c8066a4200370000200041b8066a2013370000200042003700c0062000201a3700a0062000200c3700a8062000200e3700b006200041a0066a2006a72207410376411f716a220341106a29000022022006420783220188200341186a290000220542018620074107712207413f73ad220f8684210d20024201862007417f73413f71ad86200341086a29000022102001888421082010420186200f86200329000020018884210f42dcb0858ce8b691a8b87f220242ddb0858ce8b691a8b87f54ad20024280808080bfb2fdf0c30022204281808080bfb2fdf0c3005422032003ad4290e1e5cd8789fa99287c221b4291e1e5cd8789fa992854201b4291e1e5cd8789fa9928511bad7c221d200254ad7c42a8c0c689aece93b2307c2121200520018821190340200d4201862008423f8884220520212019420186200d423f888422197d2005201d56ad7d2020200f4201862014423f8884221054201b2008420186200f423f88842201542001201b511bad201d20057d56ad7d423f87220242ddb0858ce8b691a8b87f83220f7d2216201020024281808080bfb2fdf0c300832217542203200120024291e1e5cd8789fa99288322085420012008511bad22187d210d2019200242a9c0c689aece93b230837d2005200f54ad7d2016201854ad7d2119200120087d2003ad7d2108201020177d210f2004200642017d22052006542203ad7c42017d2201200451210720012004542122200942017d221020095421232011423f882116200b423f8821172014420186200a423f88842114201e201142018684211120024201832218211e200521062001210420102003202220071bad7c22022109200b4201862016842216210b200a4201862017842217210a200220058420012002201054ad201c2023ad7c7c42017d221c848450450d000b420021042016210b2017210a42000c010b4200210442000b2102201f200b4201862011423f88848421012002200a420186200b423f888484210620042014420186200a423f8884842104201820114201868421020b20004190066a2002200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820004180066a200620044281808080bfb2fdf0c3004291e1e5cd8789fa99281008200041d0056a4281808080bfb2fdf0c3004200200242001008200041c0056a4291e1e5cd8789fa99284200200242001008200041e0056a4281808080bfb2fdf0c3004200200142001008200041f0056a4291e1e5cd8789fa99284200200142001008200041e0046a201a20002903d00522027d2201200c20002903e005220520002903c0052206200041d8056a2903007c220b7c22047d2002201a562203ad7d2202200e20002903f005220a200041c8056a2903002006200b56ad7c220b200041e8056a2903002004200554ad7c7c22117c220520002903800622142000290390067c22097c22067d220d20032004200c562004200c511bad22047d220820132005200656ad2005200a54ad200041f8056a290300200b201156ad7c7c2009201454ad20004188066a29030020004198066a2903007c7c7c7c7d2006200e56ad7d2004200d56ad7d22041008200041f0046a20082004200120021008200041a0056a2002420020014200100820004190056a20014200200242001008200041b0056a2001420020014200100820004180056a20024200200242001008420020004188056a290300200041a8056a29030020002903a0052201200041b8056a2903007c2202200154ad7c220120004198056a290300200029039005220420027c220c200454ad7c7c2202200154ad7c200029038005220420027c2201200454ad7c20002903f004220220002903e0047c2204200254ad200041f8046a290300200041e8046a2903007c7c7c200120047c220e200154ad7c221320002903b005221a200e84200c20138484504200201379200e7942407d20134200521b200c79201a7942407d200c4200521b22014280017c2202200e20138442005222031b2204420256220742002001200256ad20031b22014200522001501b2203ad7d220842005242002003410047ad7d220d420052200d501b420220047d220542ff0156420020012007ad7c7d22094200522009501b20031b7222031b21044200200e20031b21064200200c20031b21014200201a20031b2102024020030d00200542ff01852008842009200d8484500d00200041c8046a200c370000200041c0046a2203201a37000042002118200041b8046a4200370000200041d0046a200e370000200041d8046a2013370000200042003700b004200042003700a804200042003700a004200341ff012005a76b2207410376411f716b220341086a290000220220074107712207ad220186200329000022044201882007413f73ad22068884210b200341186a290000200186200341106a290000220a420188200688842114200a20018620024201882007417f73413f71ad8884210a20042001862111027e200542017c220620082005200656220320092003ad7c220420095420052006581bad7c2209842004200d2008200956ad7c221c84845045044020004198046a420037000020004190046a420037000020004188046a4200370000200041f8036a201337000020004200370080042000201a3700e0032000200c3700e8032000200e3700f003200041e0036a2006a72207410376411f716a220341106a29000022022006420783220188200341186a290000220542018620074107712207413f73ad220f8684210d20024201862007417f73413f71ad86200341086a29000022102001888421082010420186200f86200329000020018884210f42dcb0858ce8b691a8b87f220242ddb0858ce8b691a8b87f54ad20024280808080bfb2fdf0c30022204281808080bfb2fdf0c3005422032003ad4290e1e5cd8789fa99287c221b4291e1e5cd8789fa992854201b4291e1e5cd8789fa9928511bad7c221d200254ad7c42a8c0c689aece93b2307c2121200520018821194200211e0340200d4201862008423f8884220520212019420186200d423f888422197d2005201d56ad7d2020200f4201862014423f8884221054201b2008420186200f423f88842201542001201b511bad201d20057d56ad7d423f87220242ddb0858ce8b691a8b87f83220f7d2216201020024281808080bfb2fdf0c300832217542203200120024291e1e5cd8789fa99288322085420012008511bad22187d210d2019200242a9c0c689aece93b230837d2005200f54ad7d2016201854ad7d2119200120087d2003ad7d2108201020177d210f2004200642017d22052006542203ad7c42017d2201200451210720012004542122200942017d221020095421232011423f882116200b423f8821172014420186200a423f88842114201e201142018684211120024201832218211e200521062001210420102003202220071bad7c22022109200b4201862016842216210b200a4201862017842217210a200220058420012002201054ad201c2023ad7c7c42017d221c848450450d000b420021042016210b2017210a42000c010b4200210442000b2102201f200b4201862011423f88848421012002200a420186200b423f888484210620042014420186200a423f8884842104201820114201868421020b200041d0036a2002200142ddb0858ce8b691a8b87f42a9c0c689aece93b2301008200041c0036a200620044281808080bfb2fdf0c3004291e1e5cd8789fa9928100820004190036a4281808080bfb2fdf0c300420020024200100820004180036a4291e1e5cd8789fa99284200200242001008200041a0036a4281808080bfb2fdf0c3004200200142001008200041b0036a4291e1e5cd8789fa99284200200142001008200041e0026a20242025201a20002903900322047d2202200c20002903a0032205200029038003220620004198036a2903007c220b7c22017d2004201a562203ad7d22041008200041f0026a20122015200e20002903b003220a20004188036a2903002006200b56ad7c220b200041a8036a2903002001200554ad7c7c22117c220520002903c003221420002903d0037c22097c22067d220d20032001200c562001200c511bad22017d20132005200656ad2005200a54ad200041b8036a290300200b201156ad7c7c2009201454ad200041c8036a290300200041d8036a2903007c7c7c7c7d2006200e56ad7d2001200d56ad7d1008200041b0026a20024200201242001008200041c0026a20044200201242001008200041a0026a20024200201542001008200041d0026a200442002015420010084200200041d8026a290300200041c8026a29030020002903c0022201200041b8026a2903007c2202200154ad7c2201200041a8026a29030020002903a002220420027c2212200454ad7c7c2202200154ad7c20002903d002220420027c2201200454ad7c20002903e002220220002903f0027c2204200254ad200041e8026a290300200041f8026a2903007c7c7c200120047c2215200154ad7c220c20002903b002220e201584200c20128484504200200c7920157942407d200c4200521b201279200e7942407d20124200521b22014280017c2202200c20158442005222031b2204420256220742002001200256ad20031b22014200522001501b2203ad7d220842005242002003410047ad7d220d420052200d501b420220047d220542ff0156420020012007ad7c7d22094200522009501b20031b7222031b21044200201520031b21064200201220031b21014200200e20031b2102024020030d00200542ff01852008842009200d8484500d0020004188026a201237000020004180026a2203200e37000042002118200041f8016a420037000020004190026a201537000020004198026a200c370000200042003700f001200042003700e801200042003700e001200341ff012005a76b2207410376411f716b220341086a290000220220074107712207ad220186200329000022044201882007413f73ad22068884210b200341186a290000200186200341106a290000220a420188200688842114200a20018620024201882007417f73413f71ad8884210a20042001862111027e200542017c220620082005200656220320092003ad7c220420095420052006581bad7c2209842004200d2008200956ad7c221c84845045044042002113200041d8016a4200370000200041d0016a4200370000200041c8016a4200370000200041b8016a200c370000200042003700c0012000200e3700a001200020123700a801200020153700b001200041a0016a2006a72207410376411f716a220341106a29000022022006420783220188200341186a290000220542018620074107712207413f73ad220f8684210d20024201862007417f73413f71ad86200341086a29000022102001888421082010420186200f86200329000020018884210f42dcb0858ce8b691a8b87f220242ddb0858ce8b691a8b87f54ad20024280808080bfb2fdf0c30022204281808080bfb2fdf0c3005422032003ad4290e1e5cd8789fa99287c221b4291e1e5cd8789fa992854201b4291e1e5cd8789fa9928511bad7c221d200254ad7c42a8c0c689aece93b2307c2121200520018821194200211e0340200d4201862008423f8884220520212019420186200d423f888422197d2005201d56ad7d2020200f4201862014423f8884221054201b2008420186200f423f88842201542001201b511bad201d20057d56ad7d423f87220242ddb0858ce8b691a8b87f83220f7d2216201020024281808080bfb2fdf0c300832217542203200120024291e1e5cd8789fa99288322085420012008511bad22187d210d2019200242a9c0c689aece93b230837d2005200f54ad7d2016201854ad7d2119200120087d2003ad7d2108201020177d210f2004200642017d22052006542203ad7c42017d2201200451210720012004542122200942017d221020095421232011423f882116200b423f8821172014420186200a423f88842114201e201142018684211120024201832218211e200521062001210420102003202220071bad7c22022109200b4201862016842216210b200a4201862017842217210a200220058420012002201054ad201c2023ad7c7c42017d221c848450450d000b420021042016210b2017210a42000c010b420021134200210442000b21022013200b4201862011423f88848421012002200a420186200b423f888484210620042014420186200a423f8884842104201820114201868421020b20004190016a2002200142ddb0858ce8b691a8b87f42a9c0c689aece93b230100820004180016a200620044281808080bfb2fdf0c3004291e1e5cd8789fa99281008200041d0006a4281808080bfb2fdf0c3004200200242001008200041406b4291e1e5cd8789fa99284200200242001008200041e0006a4281808080bfb2fdf0c3004200200142001008200041f0006a4291e1e5cd8789fa9928420020014200100841c000200041c0086a101220002802c0082103200041d8086a200c200041f8006a290300200041c8006a29030020002903402201200041d8006a2903007c2202200154ad7c2204200041e8006a2903002000290360220520027c2201200554ad7c7c2202200454ad7c2000290370220420027c2202200454ad7c20002903800122042000290390017c2205200454ad20004188016a29030020004198016a2903007c7c7c200220057c2204200254ad7c7d2004201556ad7d201520047d2202200e20002903502204542207200120125620012012511bad220554ad7d3703002000200e20047d3703c0082000201220017d2007ad7d3703c8082000200220057d3703d0082003200041c0086a10100b2003412010130b41004100100c200041e0086a24000b0400101a0b040010150b5202017f017f230041206b220024001014418001100f1a41c00041e0001011100b044041004100100c0b41c0002000101220002802002201419880044100100d6b4104100e200141041013200041206a24000b0b1d0300418480040b010100418a80040b05020000000300419680040b010100db05046e616d6501bf051e000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020c67657443616c6c56616c75650306726576657274040666696e697368050b676574436f646553697a650608636f6465436f707907115f5f7761736d5f63616c6c5f63746f727308085f5f6d756c7469330919777261707065725f63616c6c646174616c6f61645f753235360a15777261707065725f63616c6c646174615f73697a650b1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f0c0e777261707065725f7265766572740d1365766d5f6765745f6d656d6f72795f616464720e10777261707065725f636f6465636f70790f14777261707065725f6d656d6f72795f67756172641013777261707065725f6d73746f72655f753235361112777261707065725f6d73746f72655f7533321212777261707065725f6d6c6f61645f75323536130e777261707065725f72657475726e14137365745f69735f6465706c6f79696e675f7478150f5f5f696e69745f65766d5f686561701610777261707065725f753235365f736872173f506f736569646f6e5f3532315f6465706c6f7965642e506f736569646f6e5f3532315f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e1868506f736569646f6e5f3532315f6465706c6f7965642e506f736569646f6e5f3532315f6465706c6f7965642e6162695f6465636f64655f617661696c61626c655f6c656e6774685f745f6172726179245f745f75696e743235365f24325f6d656d6f72795f7074721938506f736569646f6e5f3532315f6465706c6f7965642e506f736569646f6e5f3532315f6465706c6f7965642e66756e5f686173685f3439301a30506f736569646f6e5f3532315f6465706c6f7965642e506f736569646f6e5f3532315f6465706c6f7965642e696e69741b0463616c6c1c065f73746172741d066465706c6f79071201000f5f5f737461636b5f706f696e7465720085010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790105636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420313736323439626436373332613830343464343537303932656439333237363837323461366630362900ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000a3040b2e64656275675f6c696e65130200000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e63000200000000050206000000032704030100050209000000030805030a010005020d000000037f052c010005021000000005180601000502150000000372050c060100050216000000037e050b010005021d000000037b0100050222000000030805260100050225000000050c06010005022600000003750523060100050231000000051006010005023a000000051e0100050241000000030105160601000502440000000302051f0100050247000000050506010005024c0000000302051006010005024d0000000313052201000502500000000370051f0100050253000000037e050f010005025c0000000302050506010005026100000003020511060100050262000000030e050c01000502630000000301050301000502680000000369050b01000502710000000307051f0100050276000000050b010005027700000003100503010005027b00000000010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e67657310000000480000000000000001000000000000000100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f93084d0000006b0000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003e000000420000000400ed02029f4a000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a000000000000000800000006000000750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000b060000007500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_factory_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_factory_wasm.hex new file mode 100644 index 000000000..c7ab90dbc --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_factory_wasm.hex @@ -0,0 +1 @@ +0001e4fa0061736d010000000177106000017f60037f7f7f0060017f0060027f7f0060077f7f7f7f7f7f7f0060087f7f7f7f7f7f7f7f017f60057e7f7f7f7f017f6000017e60017f017f60000060057f7f7f7f7f0060037f7f7f017f60077e7f7f7f7f7f7f017f60087e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060047e7e7e7e0002ea021303656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e760c73746f7261676553746f7265000303656e760b73746f726167654c6f6164000303656e76096b656363616b323536000103656e760c656d69744c6f674576656e74000403656e760e637265617465436f6e7472616374000503656e761167657452657475726e4461746153697a65000003656e760e72657475726e44617461436f7079000103656e760c63616c6c436f6e7472616374000603656e760a6765744761734c656674000703656e761367657445787465726e616c436f646553697a65000803656e761367657445787465726e616c436f6465486173680003033a390903030300020003080108030303030301030a0a0b010c0700090000080301090801010d0e090d09090f090e0e09090f0f0f0e0d09090909090405017001010105030100040608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300130463616c6c0048066465706c6f79004b0a93ab013902000b8b0301187e200031001f2102200031001e2103200031001b2104200031001a21052000310018210620003100192107200031001c2108200031001d21092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842004200542088684200642188620074210868484422086200842188620094210868484843703000be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190bdd0302047f187e230041206b2202240010002103200241186a22044200370300200241106a22054200370300200242003703082002420037030020022000200320006b4120200041206a20034b1b10012004310000210620053100002107200231001f2108200231001e2109200231001b210a200231001a210b2002310019210c200231001c210d200231001d210e2002310003210f200231000221102002310001211120023100002112200231000721132002310006211420023100042115200231000521162002310013211720023100122118200231001121192002310017211a2002310016211b2002310014211c2002310015211d2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d42108684848437031020012017201842088684200742188620194210868484422086201a201b42088684201c421886201d421086848484370308200141186a200f20114210862012421886842010420886848442208620132014420886842015421886201642108684848437030020012008200942088684200a200b420886842006421886200c4210868484422086200d421886200e421086848484370300200241206a24000b040010000b17002000410c6a100220004100360208200042003702000b4402017f047e230041206b220024002000100320002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802e8fa0920006a200110040b0c0041002802e8fa0920006a0b8b0301037f0240024041002802f4fa092203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602f0fa09410020054180807c713602f4fa09410041002802ecfa0920034110746a3602ecfa090c010b41002802f0fa0920044f0d00410020043602f0fa090b41002802e8fa09220420006a21000240024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d010340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200041086a2100200141086a2101200441786a22040d000c020b0b0240200220016a100622044f0d0020002001200210070f0b200441004a200120046b2204200148470d0110001a20002004200210010b0f0b00000b7601027f024041002802f4fa09220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602f0fa09410020024180807c713602f4fa09410041002802ecfa0920014110746a3602ecfa0941e0000f0b024041002802f0fa0920004f0d00410020003602f0fa090b41e0000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802f4fa09220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602f0fa09410020074180807c713602f4fa09410041002802ecfa0920014110746a3602ecfa090c010b41002802f0fa0920024f0d00410020023602f0fa090b41002802e8fa0920006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bce0101037f0240200041206a22022000480d000240024041002802f4fa09220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602f0fa09410020044180807c713602f4fa09410041002802ecfa0920034110746a3602ecfa090c010b41002802f0fa0920024f0d00410020023602f0fa090b41002802e8fa0920006a22004200370318200042003703102000420037030820004200370300200020013a001f200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b950301187e41002802e8fa0920006a220031001f2102200031001e2103200031001c2104200031001d2105200031001b2106200031001a210720003100182108200031001921092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842006200742088684200842188620094210868484422086200442188620054210868484843703000be30503017f047e027f230041c0006b22022400200041086a2903002103200041106a2903002104200029030021052002200041186a29030022064228883c0022200220064238883c0020200220044228883c002a200220044238883c0028200220064220883c0023200220064230883c0021200220034228883c0032200220034238883c0030200220044220883c002b200220044230883c002920022003a722004108763a0036200220004118763a003420022006a722073a0027200220074108763a0026200220074118763a002420022004a722083a002f200220084108763a002e200220084118763a002c200220074110763a0025200220084110763a002d200220054228883c003a200220054238883c0038200220003a0037200220004110763a0035200220034220883c0033200220034230883c0031200220054220883c003b200220054230883c003920022005a722003a003f200220004108763a003e200220004118763a003c200220004110763a003d2002200141186a29030022034228883c0002200220034238883c00002002200141106a29030022044228883c000a200220044238883c0008200220034220883c0003200220034230883c00012002200141086a29030022054228883c0012200220054238883c0010200220044220883c000b200220044230883c000920022005a722004108763a0016200220004118763a001420022003a722073a0007200220074108763a0006200220074118763a000420022004a722083a000f200220084108763a000e200220084118763a000c200220074110763a0005200220084110763a000d2002200129030022034228883c001a200220034238883c0018200220003a0017200220004110763a0015200220054220883c0013200220054230883c0011200220034220883c001b200220034230883c001920022003a722003a001f200220004108763a001e200220004118763a001c200220004110763a001d200241206a20021008200241c0006a24000b8f0604017f047e027f147e230041c0006b22022400200041086a2903002103200041106a2903002104200029030021052002200041186a29030022064228883c0022200220064238883c0020200220044228883c002a200220044238883c0028200220064220883c0023200220064230883c0021200220034228883c0032200220034238883c0030200220044220883c002b200220044230883c002920022003a722004108763a0036200220004118763a003420022006a722073a0027200220074108763a0026200220074118763a002420022004a722083a002f200220084108763a002e200220084118763a002c200220074110763a0025200220084110763a002d200220054228883c003a200220054238883c0038200220003a0037200220004110763a0035200220034220883c0033200220034230883c0031200220054220883c003b200220054230883c003920022005a722003a003f200220004108763a003e200220004118763a003c200220004110763a003d200241206a20021009200231001f2103200231001e2104200231001b2105200231001a2106200231001821092002310019210a200231001c210b200231001d210c2002310003210d2002310002210e2002310001210f200231000021102002310007211120023100062112200231000421132002310005211420023100132115200231001221162002310010211720023100112118200231001721192002310016211a2002310014211b2002310015211c2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d421086848484370310200120152016420886842017421886201842108684844220862019201a42088684201b421886201c421086848484370308200141186a200d200f421086201042188684200e42088684844220862011201242088684201342188620144210868484843703002001200320044208868420052006420886842009421886200a4210868484422086200b421886200c421086848484370300200241c0006a24000b120041002802e8fa0920006a20012002100a0b100041002802e8fa0920006a200110050b1a0041002802e8fa0920006a200141032002200320044100100b0bd50603017f047e037f230041c0006b22052400200041086a2903002106200041106a2903002107200029030021082005200041186a29030022094228883c0022200520094238883c0020200520074228883c002a200520074238883c0028200520094220883c0023200520094230883c0021200520064228883c0032200520064238883c0030200520074220883c002b200520074230883c002920052006a722004108763a0036200520004118763a003420052009a7220a3a00272005200a4108763a00262005200a4118763a002420052007a7220b3a002f2005200b4108763a002e2005200b4118763a002c2005200a4110763a00252005200b4110763a002d200520084228883c003a200520084238883c0038200520003a0037200520004110763a0035200520064220883c0033200520064230883c0031200520084220883c003b200520084230883c003920052008a722003a003f200520004108763a003e200520004118763a003c200520004110763a003d02402002417c6a220c20024e0d0041002802e8fa0920016a22022800002100200341086a2903002106200341106a2903002107200329030021082005200341186a29030022094228883c0002200520094238883c0000200520074228883c000a200520074238883c0008200520094220883c0003200520094230883c0001200520064228883c0012200520064238883c0010200520074220883c000b200520074230883c000920052006a722034108763a0016200520034118763a001420052009a7220a3a00072005200a4108763a00062005200a4118763a000420052007a7220b3a000f2005200b4108763a000e2005200b4118763a000c2005200a4110763a00052005200b4110763a000d200520084228883c001a200520084238883c0018200520033a0017200520034110763a0015200520064220883c0013200520064230883c0011200520084220883c001b200520084230883c001920052008a722033a001f200520034108763a001e200520034118763a001c200520034110763a001d0240200541206a2002200041187420004180fe03714108747220004108764180fe037120004118767272220041046a2203200320026a200c20006b200541012004410c6a100c450d0041ae8004411710040b200541c0006a24000f0b00000bfe0201037f024020004102470d00419980044114100441000f0b02402002450d000240100d220320024e0d00024020000d000240024041002802f4fa092202200320016a22004f0d00200041ffff036a220441107620024110766b220240001a410020003602f0fa09410020044180807c713602f4fa09410041002802ecfa0920024110746a3602ecfa090c010b41002802f0fa0920004f0d00410020003602f0fa090b41002802e8fa0920016a41002003100e41010f0b024020030d0041c68004411f10042000450f0b024020034180084a0d0041e0f20941002003100e41e0f209200310042000450f0b41808004411810042000450f0b0240024041002802f4fa092204200220016a22034f0d00200341ffff036a220541107620044110766b220440001a410020033602f0fa09410020054180807c713602f4fa09410041002802ecfa0920044110746a3602ecfa090c010b41002802f0fa0920034f0d00410020033602f0fa090b41002802e8fa0920016a41002002100e0b2000450b860101037f0240024041002802f4fa092203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602f0fa09410020054180807c713602f4fa09410041002802ecfa0920034110746a3602ecfa090c010b41002802f0fa0920044f0d00410020043602f0fa090b41002802e8fa0920006a20012002100e0b9c0303017f047e027f230041206b22072400200241086a2903002108200241106a29030021092002290300210a2007200241186a290300220b4228883c00022007200b4238883c0000200720094228883c000a200720094238883c00082007200b4220883c00032007200b4230883c0001200720084228883c0012200720084238883c0010200720094220883c000b200720094230883c000920072008a722024108763a0016200720024118763a00142007200ba7220c3a00072007200c4108763a00062007200c4118763a000420072009a7220d3a000f2007200d4108763a000e2007200d4118763a000c2007200c4110763a00052007200d4110763a000d2007200a4228883c001a2007200a4238883c0018200720023a0017200720024110763a0015200720084220883c0013200720084230883c00112007200a4220883c001b2007200a4230883c00192007200aa722023a001f200720024108763a001e200720024118763a001c200720024110763a001d20002001410c6a200741002802e8fa0920036a2004100f2005200610272102200741206a240020020b040010100b0400100d0b0b00410041013a00e0fa090b3701027f41002d00e0fa09210010062101024020000d0020010f0b024010002200410048200120006a2200200148470d0020000f0b00000b040010060b09002000410c6a10110b0b002000410c6a200110120bc40201037f0240024041002802f4fa092203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602f0fa09410020054180807c713602f4fa09410041002802ecfa0920034110746a3602ecfa090c010b41002802f0fa0920044f0d00410020043602f0fa090b02402002450d0041002802e8fa09220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d000340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a0007200441086a2104200041086a2100200141786a22010d000b0b0b5601017f024041002d00e4fa090d0041003f004110743602e8fa09410140001a3f002100410041013a00e4fa094100200041107422003602ecfa094100200041002802e8fa096b3602f4fa09410041003602f0fa090b0b3301017f41002101024020002903004200520d0020002903084200520d0020002903104200520d0020002903185021010b20010bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a101e200941186a42003703002009420037031020094200370308200942c10037030041042009101e41004124101a0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c0002008101e200941c0006a24000b920403027f027e017f23004180016b22092400200941e0006a41186a220a2004370300200920033703702009200237036820092001370360200941e0006a200941c0006a102202402009290340200556200941c0006a41086a290300220b200656200b2006511b200941c0006a41106a290300220c200756200941c0006a41186a220d290300220b200856200b2008511b200c200785200b20088584501b0d00200a428080808090ee9ea4ce003703002009420037037020094200370368200942003703604100200941e0006a101e200d42003703002009420037035020094200370348200942323703404104200941c0006a101e41004124101a0b200a20043703002009200137036020092002370368200920033703704100200941e0006a101e41004120200941c0006a1023200920092900403700002009200929004837000820092009290050370010200920092900583700182009200941206a1014200941206a41186a2903002101200941206a41106a2903002103200941206a41086a290300210420092903202102200042003703202000200420067c200220057c2205200254220aad7c220637030820002005370300200041386a4200370300200041306a4200370300200041286a42003703002000200320077c2207200a200620045420062004511bad7c2206370310200041186a200120087c2007200354ad7c2006200754ad7c37030020094180016a24000be90309017f027e017f027e017f017e017f017e017f230041a0016b2200240002401019450d0041004100101a0b0240101741234b0d0041004100101a0b410420004180016a101620004180016a41086a290300210120004180016a41106a290300210220004180016a41186a2203290300210420002903800121052003420037030020004200370390012000420037038801200042033703800120004180016a200041e0006a102202402000290360200556200041e0006a41086a2206290300220720015620072001511b200041e0006a41106a22082903002209200256200041e0006a41186a290300220720045620072004511b2009200285200720048584501b0d0041004100101a0b2000420342004200420020052001200220041037200041086a2903002104200041106a29030021012000280220210a20002903002102200041c0006a41186a200041186a290300370300200020013703502000200437034820002002370340200041c0006a20004180016a102220004180016a200a410374200041e0006a103520062903002104200835020021012000290360210241c00020004180016a1020200028028001210620034200370300200020013703900120002004370388012000200237038001200620004180016a101e200641201024200041a0016a24000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a101e200941186a42003703002009420037031020094200370308200942c10037030041042009101e41004124101a0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c0002008101e200941c0006a24000ba60203017f017e027f23004180016b2200240002401019450d0041004100101a0b0240101741034b0d0041004100101a0b41c000200041e0006a102020002903602201200041e8006a290300200041f0006a290300200041e0006a41186a290300428cf2054200420042001039200041c0006a41186a42003703002000420037035020004200370348200042ecf1053703402001a72202200041c0006a101e200241206a220341f080044100101b6b41ecf10510312002200041e0006a102020032000280260200041206a1023200020002900203700002000200029002837000820002000290030370010200020002900383700182000200041e0006a101441c000200041c0006a102020002802402202200041e0006a101e20024120102420004180016a24000bff0405017f037e017f047e037f230041a0026b2200240002401019450d0041004100101a0b0240101741234b0d0041004100101a0b410420004180026a101620004180026a41086a290300210120002903800221020240410020004180026a41106a290300220342808080801054410020004180026a41186a22042903002205501b200342808080801085200584501b0d0041004100101a0b200041c0006a101820002900402105200029004821062000290050210720002900582108200041c0016a41186a22094200370300200042003703d001200042003703c801200042013703c001200041c0016a20004180026a102220004180026a4100200041e0016a103520002008370018200020073700102000200637000820002005370000200041e0016a41086a220a2903002105200041e0016a41106a220b350200210620002903e00121072000200041206a101420072000290320852006200041206a41106a35020085842005200041206a41086a290300858450ad420042004200103c20094200370300200042003703d001200042003703c801200042013703c001200041c0016a200041a0016a1022200041b4016a3502002105200041a0016a41186a2903002106200442003703002000200342ffffffff0f83370390022000200137038802200020023703800220004180026a4100200041e0016a103420004180016a41186a4200370300200041e0006a41186a20063703002000420037039001200042003703880120004201370380012000200a290300370368200020002903e0013703602000200b35020020054220868437037020004180016a200041e0006a102141c00020004180026a102020002802800241001024200041a0026a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102020052802202106200441606a22042400200441186a428080808080b4dee10837030020044200370310200442003703082004420037030020062004101e200541186a4200370300200542003703102005420037030820054220370300200641046a2005101e200541206a41186a22044200370300200542003703302005420037032820054214370320200641246a200541206a101e200442d6e085bbb7ae9ab7d500370300200542c984c9fae488889d3237033020054280808080e0a991a2c40037032820054200370320200641c4006a200541206a101e200641e400101a0b200541c0006a24000bd20206027f027e017f017e017f057e230041c0006b2200240002401019450d0041004100101a0b0240101741c3004b0d0041004100101a0b4104200041206a1016200041286a220129030021022000290320210302404100200041306a22042903002205428080808010544100200041386a22062903002207501b200542808080801085200784501b0d0041004100101a0b4124200041206a10162001290300210820002903202109024041002004290300220a4280808080105441002006290300220b501b200a42808080801085200b84501b0d0041004100101a0b2000200320022005200720092008200a200b103e200041086a2903002105200041106a35020021072000290300210a41c000200041206a102020002802202101200041386a420037030020002007370330200020053703282000200a3703202001200041206a101e200141201024200041c0006a24000b9d2b06017f037e057f017e207f057e23004180026b220924002001200585200342ffffffff0f83220a200742ffffffff0f83220b85220c84200220068584420052ad4200420042001042200120052001200554200220065420022006511b200a200b54200c501b220d1b220a20032007200d1b42ffffffff0f83220b8420022006200d1b220c84420052ad42004200420010432009220e41e0016a41186a220f4200370300200e200b3703f001200e200c3703e801200e200a3703e0014100200e41e0016a101e200e41a0016a41186a4200370300200e42003703b001200e42003703a801200e42023703a0014120200e41a0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41c0016a1014200f4200370300200e20072003200d1b42ffffffff0f8322073703f001200e20062002200d1b22033703e801200e20052001200d1b22013703e0014100200e41e0016a101e4120200e41c0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41a0016a1014200e41a0016a200e41e0016a1022200e41e0016a4100200e41c0016a1035200e2903c001200e41c0016a41106a35020084200e41c0016a41086a2903008450ad420042004200104441c000200e41e0016a1020200f2903002102200e41e0016a41106a22102903002105200e41e0016a41086a22112903002112200e2903e0012106200f4200370300200e200b3703f001200e200c3703e801200e200a3703e001200e41e0016a41e000200e41c0016a10342006a7220d41206a2213200e41c0016a101e200f4200370300200e20073703f001200e20033703e801200e20013703e001200e41e0016a41e000200e41c0016a1034200d41346a200e41c0016a101e200e41206a41186a4200370300200e4200370330200e4200370328200e4228370320200d200e41206a101e200620122005200242c8004200420042001039200d200e41e0016a10202013200e2802e001200e1023200e2d001f2113200e2d001e2114200e2d001d2115200e2d001c2116200e2d001b2117200e2d001a2118200e2d00192119200e2d0018211a200e2d0017211b200e2d0016211c200e2d0015211d200e2d0014211e200e2d0013211f200e2d00122120200e2d00112121200e2d00102122200e2d000f2123200e2d000e2124200e2d000d2125200e2d000c2126200e2d000b2127200e2d000a2128200e2d00092129200e2d0008212a200e2d0007212b200e2d0006212c200e2d0005212d200e2d0004212e200e2d0003212f200e2d00022130200e2d00012131200e2d0000213241c000200e41e0016a10200240200e2903e001220642948e7a5441002011290300501b41002010290300200f29030084501b0d00200f428080808090ee9ea4ce00370300200e42003703f001200e42003703e801200e42003703e0014100200e41e0016a101e200e41c0016a41186a4200370300200e42003703d001200e42003703c801200e42c1003703c0014104200e41c0016a101e41004124101a0b2006a7221041f080044100101b6b41ecf1051031200941606a220d220f2400200d41186a4200370300200d4200370310200d4200370308200d4200370300200f41606a2209220f2400200f41606a220f22112400200f20133a001f200f20143a001e200f20153a001d200f20163a001c200f20173a001b200f20183a001a200f20193a0019200f201a3a0018200f201b3a0017200f201c3a0016200f201d3a0015200f201e3a0014200f201f3a0013200f20203a0012200f20213a0011200f20223a0010200f20233a000f200f20243a000e200f20253a000d200f20263a000c200f20273a000b200f20283a000a200f20293a0009200f202a3a0008200f202b3a0007200f202c3a0006200f202d3a0005200f202e3a0004200f202f3a0003200f20303a0002200f20313a0001200f20323a0000200f2009101420092903002106200941086a2903002102200941106a2903002105200941186a2903002112201141606a2209220f2400200941186a2012370300200920053703102009200237030820092006370300200f41606a220f22302400200d201041ecf1052009200f1026200f2d00002120200f2d00012121200f2d00022122200f2d00032123200f2d00042124200f2d00052125200f2d00062126200f2d00072127200f2d00082128200f2d00092129200f2d000a212a200f2d000b212b200f2d000c212c200f2d000d212d200f2d000e212e200f2d000f212f200f2d00102109200f2d00112110200f2d00122111200f2d00132113200f2d00142114200f2d00152115200f2d00162116200f2d00172117200f2d00182118200f2d00192119200f2d001a211a200f2d001b211b200f2d001c211c200f2d001d211d200f2d001e211e200f2d001f211f203041606a220f220d2400200f201f3a001f200f201e3a001e200f201d3a001d200f201c3a001c200f201b3a001b200f201a3a001a200f20193a0019200f20183a0018200f20173a0017200f20163a0016200f20153a0015200f20143a0014200f20133a0013200f20113a0012200f20103a0011200f20093a0010200f202f3a000f200f202e3a000e200f202d3a000d200f202c3a000c200f202b3a000b200f202a3a000a200f20293a0009200f20283a0008200f20273a0007200f20263a0006200f20253a0005200f20243a0004200f20233a0003200f20223a0002200f20213a0001200f20203a0000200d41606a220d22302400200d201f3a001f200d201e3a001e200d201d3a001d200d201c3a001c200d201b3a001b200d201a3a001a200d20193a0019200d20183a0018200d20173a0017200d20163a0016200d20153a0015200d20143a0014200d20133a0013200d20113a0012200d20103a0011200d20093a0010200d202f3a000f200d202e3a000e200d202d3a000d200d202c3a000c200d202b3a000b200d202a3a000a200d20293a0009200d20283a0008200d20273a0007200d20263a0006200d20253a0005200d20243a0004200d20233a0003200d20223a0002200d20213a0001200d20203a00000240200d1033450d0041c000200e41e0016a1020200e2802e001220d4100102b1028200d102b101a0b200f2900002106200f2900082102203041606a220d220f2400200f41606a220f22202400200f201f3a001f200f201e3a001e200f201d3a001d200f201c3a001c200f201b3a001b200f201a3a001a200f20193a0019200f20183a0018200f20173a0017200f20163a0016200f20153a0015200f20143a0014200f20133a0013200f20113a0012200f20103a0011200f20093a0010200f2002370008200f2006370000200f200d1014200d41086a2903002106200d2903002102200d41106a3502002105200e41a0016a41186a22104200370300200e42003703b001200e42003703a801200e42043703a001200e41a0016a200e41e0016a1022200e41e0016a4100200e41c0016a1035200e41c0016a41106a220f2903002112200e41c0016a41086a220d2903002133200e41c0016a41186a22092903002134200e2903c0012135200e41e0016a41186a4200370300200e42003703f001200e42003703e801200e42003703e001200e41e0016a4100200e41c0016a103402402035200e2903c001852012200f29030085842033200d29030085203420092903008584844200520d00202041606a220f220d2400200f41186a4200370300200f2005370310200f2006370308200f2002370300200d41606a220d22112400200f200d1015200d2900002112200d2900082133200d2900102134200d2900182135201141606a220f220d2400200f2035370018200f2034370010200f2033370008200f2012370000200d41606a220d22112400200f200d1030200d2900002112200d2900082133200d2900102134200d2900182135201141606a220f22202400200f2035370018200f2034370010200f2033370008200f2012370000200f200e41c0016a101420104200370300200e42003703b001200e42003703a801200e42043703a001200e41a0016a200e4180016a1022200e41c0016a4100200e41e0016a1035200e41e0016a4100200e41e0006a103420094200370300200e42003703d001200e42003703c801200e42043703c001200e41c0016a200e41e0006a10210b202041606a220f220d2400200f41186a4200370300200f2005370310200f2006370308200f2002370300200d41606a220d22092400200f200d1015200d2900002112200d2900082133200d2900102134200d2900182135200941606a220f220d2400200f2035370018200f2034370010200f2033370008200f20123700000240200f102f0d0041004100101a0b41c000200e41e0016a1020200e41e0016a41086a2903002133200e41e0016a41106a2903002134200e41e0016a41186a22092903002135200e2903e0012112200d41606a220f220d2400200f41186a22142035370300200f2034370310200f2033370308200f201237030020094200370300200e42003703f001200e42003703e801200e42d592f3c2043703e001200e41e0016a41e001200e41c0016a1034200e41c0016a41086a2903002133200e41c0016a41106a2903002134200e41c0016a41186a2903002135200e2903c0012136200d41606a220d22112400200d41186a2035370300200d2034370310200d2033370308200d20363703002012a72210200d101e20094200370300200e200b3703f001200e200c3703e801200e200a3703e001201041046a200e41e0016a101e20094200370300200e20073703f001200e20033703e801200e20013703e001201041246a200e41e0016a101e102a2112201141606a220d22092400200d41186a4200370300200d2005370310200d2006370308200d2002370300200941606a220922112400200d2009101520092900002133200929000821342009290010213520092900182136201141606a220d22092400200d2036370018200d2035370010200d2034370008200d2033370000200941606a220922132400200941186a4200370300200942003703102009420037030820094200370300024002402012200d2009201041c4002010410010290d0041c000200e41e0016a1020200e2802e001220f4100102b1028200f102b101a0c010b102b1a200f290300200f41086a290300200f41106a2903002014290300420042004200420010390b200e41e0016a41186a220f4200370300200e200a3703e001200e200c3703e801200e200b3703f0014100200e41e0016a101e200e41a0016a41186a220d4200370300200e42003703b001200e42003703a801200e42023703a0014120200e41a0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41c0016a1014200f4200370300200e20073703f001200e20033703e801200e20013703e0014100200e41e0016a101e4120200e41c0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41a0016a1014200e41a0016a41086a22092903002112200e41a0016a41106a22102903002133200e2903a0012134200d200d2903002235370300200e20333703b001200e20123703a801200e20343703a001200e41a0016a200e4180016a1022200e4194016a22113502002136200e4180016a41186a22142903002137200f4200370300200e20053703f001200e20063703e801200e20023703e001200e41e0016a4100200e41c0016a1034200e41e0006a41186a22152035370300200e41c0006a41186a22162037370300200e2033370370200e2012370368200e2034370360200e200e41c0016a41086a2217290300370348200e200e2903c001370340200e200e41c0016a41106a2218350200203642208684370350200e41e0006a200e41c0006a1021200f4200370300200e20073703f001200e20033703e801200e20013703e0014100200e41e0016a101e200d4200370300200e42003703b001200e42003703a801200e42023703a0014120200e41a0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41c0016a1014200f4200370300200e200b3703f001200e200c3703e801200e200a3703e0014100200e41e0016a101e4120200e41c0016a101e410041c000200e4180016a1023200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41a0016a10142009290300211220102903002133200e2903a0012134200d200d2903002235370300200e20333703b001200e20123703a801200e20343703a001200e41a0016a200e4180016a10222011350200213620142903002137200f4200370300200e20053703f001200e20063703e801200e20023703e001200e41e0016a4100200e41c0016a10342015203537030020162037370300200e2033370370200e2012370368200e2034370360200e2017290300370348200e200e2903c001370340200e2018350200203642208684370350200e41e0006a200e41c0006a1021420342004200420020022006200542001046200f4200370300200e42003703f001200e42003703e801200e42033703e001200e41e0016a200e41c0016a102241c000200e41e0016a1020200e2802e0012111200f4200370300200e20053703f001200e20063703e801200e20023703e0012011200e41e0016a101e201141206a200e41c0016a101e201341606a220f220d2400200f41186a4281d0aefbd097929b0d370300200f42858bebba92f5ced134370310200f42cdab8dec8abec5e959370308200f42e9a1a3d1afe3f8fe5e370300200d41606a220d22092400200f200d1015200d2900002112200d2900082133200d2900102134200d2900182135200941606a220f220d2400200f2035370018200f2034370010200f2033370008200f2012370000200d41606a220d22092400200d41186a4200370300200d200b370310200d200c370308200d200a370300200941606a220922102400200d200910152009290000210a2009290008210b2009290010210c20092900182112201041606a220d22092400200d2012370018200d200c370010200d200b370008200d200a370000200941606a220922102400200941186a4200370300200920073703102009200337030820092001370300201041606a2210221324002009201010152010290000210a2010290008210b2010290010210c20102900182107201341606a22092400200920073700182009200c3700102009200b3700082009200a370000201141c000200f200d20091025200020053703102000200637030820002002370300200041186a4200370300200e4180026a24000b880301027f230041a0016b2209240020094180016a41186a220a42003703002009200342ffffffff0f833703900120092002370388012009200137038001410020094180016a101e200941c0006a41186a42003703002009420037035020094200370348200942023703404120200941c0006a101e410041c000200941206a1023200920092900203700002009200929002837000820092009290030370010200920092900383700182009200941e0006a1014200a42003703002009200742ffffffff0f833703900120092006370388012009200537038001410020094180016a101e4120200941e0006a101e410041c000200941206a1023200920092900203700002009200929002837000820092009290030370010200920092900383700182009200941c0006a1014200941c0006a20094180016a102220094180016a4100200941e0006a1035200941e8006a2903002103200929036021022000200941f0006a3502003703102000200337030820002002370300200041186a4200370300200941a0016a24000bd20206027f027e017f017e017f057e230041c0006b2200240002401019450d0041004100101a0b0240101741c3004b0d0041004100101a0b4104200041206a1016200041286a220129030021022000290320210302404100200041306a22042903002205428080808010544100200041386a22062903002207501b200542808080801085200784501b0d0041004100101a0b4124200041206a10162001290300210820002903202109024041002004290300220a4280808080105441002006290300220b501b200a42808080801085200b84501b0d0041004100101a0b2000200320022005200720092008200a200b103f200041086a2903002105200041106a35020021072000290300210a41c000200041206a102020002802202101200041386a420037030020002007370330200020053703282000200a3703202001200041206a101e200141201024200041c0006a24000bff0405017f037e017f047e037f230041a0026b2200240002401019450d0041004100101a0b0240101741234b0d0041004100101a0b410420004180026a101620004180026a41086a290300210120002903800221020240410020004180026a41106a290300220342808080801054410020004180026a41186a22042903002205501b200342808080801085200584501b0d0041004100101a0b200041c0006a101820002900402105200029004821062000290050210720002900582108200041c0016a41186a22094200370300200042003703d001200042003703c801200042013703c001200041c0016a20004180026a102220004180026a4100200041e0016a103520002008370018200020073700102000200637000820002005370000200041e0016a41086a220a2903002105200041e0016a41106a220b350200210620002903e00121072000200041206a101420072000290320852006200041206a41106a35020085842005200041206a41086a290300858450ad420042004200103c20094200370300200042003703d001200042003703c801200042003703c001200041c0016a200041a0016a1022200041b4016a3502002105200041a0016a41186a2903002106200442003703002000200342ffffffff0f83370390022000200137038802200020023703800220004180026a4100200041e0016a103420004180016a41186a4200370300200041e0006a41186a20063703002000420037039001200042003703880120004200370380012000200a290300370368200020002903e0013703602000200b35020020054220868437037020004180016a200041e0006a102141c00020004180026a102020002802800241001024200041a0026a24000b9f0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102020052802202106200441606a22042400200441186a428080808080b4dee10837030020044200370310200442003703082004420037030020062004101e200541186a4200370300200542003703102005420037030820054220370300200641046a2005101e200541206a41186a2204420037030020054200370330200542003703282005421e370320200641246a200541206a101e200442d6e085bbb7ae9ab7d500370300200542d49c95a29489889d32370330200542c48885fac5a9d0a1c9003703282005428080ccaab4ead4a2d200370320200641c4006a200541206a101e200641e400101a0b200541c0006a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102020052802202106200441606a22042400200441186a428080808080b4dee10837030020044200370310200442003703082004420037030020062004101e200541186a4200370300200542003703102005420037030820054220370300200641046a2005101e200541206a41186a22044200370300200542003703302005420037032820054217370320200641246a200541206a101e200442d6e085bbb7ae9ab7d500370300200542df9ec9aaa48b889d3237033020054280a6cdaaa48a91a2c10037032820054200370320200641c4006a200541206a101e200641e400101a0b200541c0006a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102020052802202106200441606a22042400200441186a428080808080b4dee10837030020044200370310200442003703082004420037030020062004101e200541186a4200370300200542003703102005420037030820054220370300200641046a2005101e200541206a41186a22044200370300200542003703302005420037032820054216370320200641246a200541206a101e200442d6e085bbb7ae9ab7d500370300200542dfa4a58a848a889d323703302005428080cca2b5aa92acc50037032820054200370320200641c4006a200541206a101e200641e400101a0b200541c0006a24000b920403027f027e017f23004180016b22092400200941e0006a41186a220a2004370300200920033703702009200237036820092001370360200941e0006a200941c0006a102202402009290340200556200941c0006a41086a290300220b200656200b2006511b200941c0006a41106a290300220c200756200941c0006a41186a220d290300220b200856200b2008511b200c200785200b20088584501b0d00200a428080808090ee9ea4ce003703002009420037037020094200370368200942003703604100200941e0006a101e200d42003703002009420037035020094200370348200942323703404104200941c0006a101e41004124101a0b200a20043703002009200137036020092002370368200920033703704100200941e0006a101e41004120200941c0006a1023200920092900403700002009200929004837000820092009290050370010200920092900583700182009200941206a1014200941206a41186a2903002101200941206a41106a2903002103200941206a41086a290300210420092903202102200042003703202000200420067c200220057c2205200254220aad7c220637030820002005370300200041386a4200370300200041306a4200370300200041286a42003703002000200320077c2207200a200620045420062004511bad7c2206370310200041186a200120087c2007200354ad7c2006200754ad7c37030020094180016a24000beb0607027f047e017f017e017f037e027f230041c0026b220824002008220941e0006a41186a2003370300200920023703702009200137036820092000370360200941e0006a200941c0006a10222009290340210a0240200941c0006a41086a290300220b504100200941c0006a41106a290300220c200941c0006a41186a290300220d84501b0d00200941a0026a41186a428080808090ee9ea4ce00370300200942003703b002200942003703a802200942003703a0024100200941a0026a101e20094180026a41186a420037030020094200370390022009420037038802200942c10037038002410420094180026a101e41004124101a0b200841606a2208220e2400200841186a2003370300200820023703102008200137030820082000370300200e41606a220e2400200e200c200a42017c220f200a542210200b2010ad7c2211200b54200f200a5a1bad7c2212370310200e2011370308200e200f370300200e41186a200d2012200c54ad7c3703002008200e102120092000200120022003200a200b200c200d1045200941086a290300210a200941106a29030021032009280220210820092903002102200941e0016a41186a200941186a290300220d370300200920033703f0012009200a3703e801200920023703e001200941e0016a200941c0016a1022200941c0016a41086a290300210f200941c0016a41106a2903002111200941c0016a41186a290300211220092903c0012113200941a0026a41186a220e42003703002009427f3703a8022009427f3703a002200942ffffffff0f3703b002200941a0026a2008410374220820094180026a103420094180026a41086a2210290300210120094180026a41106a2214290300210020094180026a41186a2215290300210b200929038002210c200e42003703002009200642ffffffff0f833703b002200920053703a802200920043703a002200941a0026a200820094180026a1034200941a0016a41186a200d37030020094180016a41186a200b2015290300832012200b427f858384370300200920033703b0012009200a3703a801200920023703a0012009200020142903008320112000427f8583843703900120092001201029030083200f2001427f858384370388012009200c200929038002832013200c427f85838437038001200941a0016a20094180016a1021200941c0026a24000b9f0805017f027e027f027e027f230041e0006b22002400418001101d1a41c00041e000101f024010174104490d004100200041c0006a1016200041c0006a41e001200041206a1035024002400240024002400240024002402000290320220142f1b8e4a70656200041286a2903002202420052220320025022041b200041306a2903002205420052200041386a29030022064200552006501b220720052006845022081b0d0002402001428aa3f7f10156200320041b200720081b0d00200142d8fcf90b852005842002200684220684500d0220014295e8adca008520058420068450450d0902401019450d0041004100101a0b0240101741034b0d0041004100101a0b200041186a42003703002000420037031020004200370308200042013703002000200041c0006a1022200041c0006a4100200041206a1035200041286a2903002106200041306a35020021052000290320210141c000200041c0006a102020002802402103200041c0006a41186a42003703002000200537035020002006370348200020013703402003200041c0006a101e2003412010240c090b2001428ba3f7f101852005842002200684220684500d02200142bdfe90a70285200584200684500d03200142a3d7bcba058520058420068450450d0802401019450d0041004100101a0b0240101741034b0d0041004100101a0b200041386a4200370300200042003703302000420037032820004203370320200041206a200041c0006a102241c000200041206a102020002802202203200041c0006a101e2003412010240c080b024020014295a799ce0c56200320041b200720081b0d00200142f2b8e4a706852005842002200684220684500d04200142f6959d970a8520058420068450450d08103b0c080b20014296a799ce0c852005842002200684220684500d0420014285f290b50e85200584200684500d05200142ed83a4a30f85200584200684500d060c070b02401019450d0041004100101a0b0240101741034b0d0041004100101a0b200041186a42003703002000420037031020004200370308200042003703002000200041c0006a1022200041c0006a4100200041206a1035200041286a2903002106200041306a35020021052000290320210141c000200041c0006a102020002802402103200041c0006a41186a42003703002000200537035020002006370348200020013703402003200041c0006a101e2003412010240c060b10380c050b02401019450d0041004100101a0b0240101741034b0d0041004100101a0b200041186a42003703002000420037031020004200370308200042043703002000200041206a1022200041206a4100200041c0006a103541c000200041206a102020002802202203200041c0006a101e2003412010240c040b103a0c030b103d0c020b10400c010b10410b41004100101a200041e0006a24000b040010470b040010320bd80505037f017e037f047e017f230041c0016b22002400418001101d1a41c00041e000101f02401019450d0041004100101a0b102e2101102d210241c000200041a0016a102020002903a0012203200041a8016a2204290300200041b0016a2205290300200041b8016a22062903002002ad22072001ad22087d220942002007200854ad7d220a200a200a10362003a7220220012009a7101c02402009421f56200a4200522201200a50220b1b2001200a420055200b1b200720085a1b0d0041004100101a0b2002200041a0016a10202004290300210720002903a0012108024041002005290300220a42808080801054410020062903002209501b200a42808080801085200984501b0d0041004100101a0b200041a0016a41186a22014200370300200042003703b001200042003703a801200042003703a001200041a0016a410020004180016a1034200041e0006a41186a22024200370300200042003703702000420037036820004204370360200041e0006a200041c0006a102220004180016a4100200041a0016a1035200041a0016a4100200041206a103420004180016a41186a420037030020004200370390012000420037038801200042043703800120004180016a200041206a102120024200370300200042003703702000420037036820004201370360200041e0006a200041c0006a1022200041d4006a3502002109200041c0006a41186a2903002103200142003703002000200a42ffffffff0f833703b001200020073703a801200020083703a001200041a0016a410020004180016a1034200041206a41186a4200370300200041186a2003370300200042003703302000420037032820004201370320200020004188016a2903003703082000200029038001370300200020004190016a350200200942208684370310200041206a2000102141c000200041a0016a102020002802a001220141f8fa094100101b6b4104101c200141041024200041c0016a24000b0600102c104a0b0be1f2051100418080040b656f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c6564006372656174653220636f6e7472616374206661696c65640063616c6c206661696c65642077697468206e6f2072657665727420646174610041f180040b81ec050178e80061736d0100000001f401186000017f60037f7f7f0060017f0060027f7f0060077f7f7f7f7f7f7f0060057e7f7f7f7f017f60047e7f7f7f017f6000017e60017f017f60000060057f7e7e7e7e0060047f7f7f7f0060057f7f7f7f7f0060037f7f7f017f60077e7f7f7f7f7f7f017f60067e7f7f7f7f7f017f60087e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e0060047e7e7e7e0060147e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e00600c7e7e7e7e7e7e7e7e7e7e7e7e00600d7f7e7e7e7e7e7e7e7e7e7e7e7e00601c7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060107e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e000286031503656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760a67657441646472657373000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e760c73746f7261676553746f7265000303656e760b73746f726167654c6f6164000303656e76096b656363616b323536000103656e760c656d69744c6f674576656e74000403656e761167657452657475726e4461746153697a65000003656e760e72657475726e44617461436f7079000103656e760c63616c6c436f6e7472616374000503656e760a63616c6c537461746963000603656e760a676574436861696e4964000203656e760a6765744761734c656674000703656e7611676574426c6f636b54696d657374616d70000703656e761367657445787465726e616c436f646553697a650008035f5e090a03030300020200030801080303030103030103010b0c0d010e0f020707000109080901010909100a1111091213100a09090914091510091109090915090914091211161109091212121212141712121110121012120a1212090909090405017001010105030100030608017f01418080040b072e04066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300150463616c6c0070066465706c6f7900720ac1a9055e02000b7501017e2000200420017e200220037e7c20034220882204200142208822027e7c200342ffffffff0f832203200142ffffffff0f8322017e2205422088200320027e7c22034220887c200342ffffffff0f83200420017e7c22034220887c37030820002003422086200542ffffffff0f83843703000b8b0301187e200031001f2102200031001e2103200031001b2104200031001a21052000310018210620003100192107200031001c2108200031001d21092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842004200542088684200642188620074210868484422086200842188620094210868484843703000be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190bdd0302047f187e230041206b2202240010002103200241186a22044200370300200241106a22054200370300200242003703082002420037030020022000200320006b4120200041206a20034b1b10012004310000210620053100002107200231001f2108200231001e2109200231001b210a200231001a210b2002310019210c200231001c210d200231001d210e2002310003210f200231000221102002310001211120023100002112200231000721132002310006211420023100042115200231000521162002310013211720023100122118200231001121192002310017211a2002310016211b2002310014211c2002310015211d2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d42108684848437031020012017201842088684200742188620194210868484422086201a201b42088684201c421886201d421086848484370308200141186a200f20114210862012421886842010420886848442208620132014420886842015421886201642108684848437030020012008200942088684200a200b420886842006421886200c4210868484422086200d421886200e421086848484370300200241206a24000b040010000b17002000410c6a100220004100360208200042003702000b09002000410c6a10030b4402017f047e230041206b220024002000100420002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802d8880420006a200110050b0c0041002802d8880420006a0b8b0301037f0240024041002802e488042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e08804410020054180807c713602e48804410041002802dc880420034110746a3602dc88040c010b41002802e0880420044f0d00410020043602e088040b41002802d88804220420006a21000240024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d010340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200041086a2100200141086a2101200441786a22040d000c020b0b0240200220016a100722044f0d0020002001200210080f0b200441004a200120046b2204200148470d0110001a20002004200210010b0f0b00000b7601027f024041002802e48804220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602e08804410020024180807c713602e48804410041002802dc880420014110746a3602dc880441e0000f0b024041002802e0880420004f0d00410020003602e088040b41e0000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802e48804220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602e08804410020074180807c713602e48804410041002802dc880420014110746a3602dc88040c010b41002802e0880420024f0d00410020023602e088040b41002802d8880420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bce0101037f0240200041206a22022000480d000240024041002802e48804220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602e08804410020044180807c713602e48804410041002802dc880420034110746a3602dc88040c010b41002802e0880420024f0d00410020023602e088040b41002802d8880420006a22004200370318200042003703102000420037030820004200370300200020013a001f200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b950301187e41002802d8880420006a220031001f2102200031001e2103200031001c2104200031001d2105200031001b2106200031001a210720003100182108200031001921092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842006200742088684200842188620094210868484422086200442188620054210868484843703000bc40201037f0240024041002802e488042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e08804410020054180807c713602e48804410041002802dc880420034110746a3602dc88040c010b41002802e0880420044f0d00410020043602e088040b02402002450d0041002802d88804220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d000340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a0007200441086a2104200041086a2100200141786a22010d000b0b0be30503017f047e027f230041c0006b22022400200041086a2903002103200041106a2903002104200029030021052002200041186a29030022064228883c0022200220064238883c0020200220044228883c002a200220044238883c0028200220064220883c0023200220064230883c0021200220034228883c0032200220034238883c0030200220044220883c002b200220044230883c002920022003a722004108763a0036200220004118763a003420022006a722073a0027200220074108763a0026200220074118763a002420022004a722083a002f200220084108763a002e200220084118763a002c200220074110763a0025200220084110763a002d200220054228883c003a200220054238883c0038200220003a0037200220004110763a0035200220034220883c0033200220034230883c0031200220054220883c003b200220054230883c003920022005a722003a003f200220004108763a003e200220004118763a003c200220004110763a003d2002200141186a29030022034228883c0002200220034238883c00002002200141106a29030022044228883c000a200220044238883c0008200220034220883c0003200220034230883c00012002200141086a29030022054228883c0012200220054238883c0010200220044220883c000b200220044230883c000920022005a722004108763a0016200220004118763a001420022003a722073a0007200220074108763a0006200220074118763a000420022004a722083a000f200220084108763a000e200220084118763a000c200220074110763a0005200220084110763a000d2002200129030022034228883c001a200220034238883c0018200220003a0017200220004110763a0015200220054220883c0013200220054230883c0011200220034220883c001b200220034230883c001920022003a722003a001f200220004108763a001e200220004118763a001c200220004110763a001d200241206a20021009200241c0006a24000b8f0604017f047e027f147e230041c0006b22022400200041086a2903002103200041106a2903002104200029030021052002200041186a29030022064228883c0022200220064238883c0020200220044228883c002a200220044238883c0028200220064220883c0023200220064230883c0021200220034228883c0032200220034238883c0030200220044220883c002b200220044230883c002920022003a722004108763a0036200220004118763a003420022006a722073a0027200220074108763a0026200220074118763a002420022004a722083a002f200220084108763a002e200220084118763a002c200220074110763a0025200220084110763a002d200220054228883c003a200220054238883c0038200220003a0037200220004110763a0035200220034220883c0033200220034230883c0031200220054220883c003b200220054230883c003920022005a722003a003f200220004108763a003e200220004118763a003c200220004110763a003d200241206a2002100a200231001f2103200231001e2104200231001b2105200231001a2106200231001821092002310019210a200231001c210b200231001d210c2002310003210d2002310002210e2002310001210f200231000021102002310007211120023100062112200231000421132002310005211420023100132115200231001221162002310010211720023100112118200231001721192002310016211a2002310014211b2002310015211c2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d421086848484370310200120152016420886842017421886201842108684844220862019201a42088684201b421886201c421086848484370308200141186a200d200f421086201042188684200e42088684844220862011201242088684201342188620144210868484843703002001200320044208868420052006420886842009421886200a4210868484422086200b421886200c421086848484370300200241c0006a24000b120041002802d8880420006a20012002100b0b100041002802d8880420006a200110060b1a0041002802d8880420006a200141012002410041004100100c0b1a0041002802d8880420006a200141022002200341004100100c0b1a0041002802d8880420006a200141032002200320044100100c0bfe0201037f024020004102470d00419980044114100541000f0b02402002450d000240100d220320024e0d00024020000d000240024041002802e488042202200320016a22004f0d00200041ffff036a220441107620024110766b220240001a410020003602e08804410020044180807c713602e48804410041002802dc880420024110746a3602dc88040c010b41002802e0880420004f0d00410020003602e088040b41002802d8880420016a41002003100e41010f0b024020030d0041ae8004411f10052000450f0b024020034180084a0d0041d0800441002003100e41d08004200310052000450f0b41808004411810052000450f0b0240024041002802e488042204200220016a22034f0d00200341ffff036a220541107620044110766b220440001a410020033602e08804410020054180807c713602e48804410041002802dc880420044110746a3602dc88040c010b41002802e0880420034f0d00410020033602e088040b41002802d8880420016a41002002100e0b2000450b860101037f0240024041002802e488042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e08804410020054180807c713602e48804410041002802dc880420034110746a3602dc88040c010b41002802e0880420044f0d00410020043602e088040b41002802d8880420006a20012002100e0b9c0303017f047e027f230041206b22072400200241086a2903002108200241106a29030021092002290300210a2007200241186a290300220b4228883c00022007200b4238883c0000200720094228883c000a200720094238883c00082007200b4220883c00032007200b4230883c0001200720084228883c0012200720084238883c0010200720094220883c000b200720094230883c000920072008a722024108763a0016200720024118763a00142007200ba7220c3a00072007200c4108763a00062007200c4118763a000420072009a7220d3a000f2007200d4108763a000e2007200d4118763a000c2007200c4110763a00052007200d4110763a000d2007200a4228883c001a2007200a4238883c0018200720023a0017200720024110763a0015200720084220883c0013200720084230883c00112007200a4220883c001b2007200a4230883c00192007200aa722023a001f200720024108763a001e200720024118763a001c200720024110763a001d20002001410c6a200741002802d8880420036a2004100f20052006102d2102200741206a240020020b1d0020002001410c6a41002802d8880420026a2003101020042005102d0bc70302037f187e230041206b22012400200141186a22024200370300200141106a220342003703002001420037030820014200370300200110112002310000210420033100002105200131001f2106200131001e2107200131001b2108200131001a21092001310019210a200131001c210b200131001d210c2001310003210d2001310002210e2001310001210f200131000021102001310007211120013100062112200131000421132001310005211420013100132115200131001221162001310011211720013100172118200131001621192001310014211a2001310015211b2000200131000a420886200131000b84200131000842188620013100094210868484422086200131000e420886200131000f84200131000c421886200131000d421086848484370310200020152016420886842005421886201742108684844220862018201942088684201a421886201b421086848484370308200041186a200d200f421086201042188684200e42088684844220862011201242088684201342188620144210868484843703002000200620074208868420082009420886842004421886200a4210868484422086200b421886200c421086848484370300200141206a24000b040010120b040010130b0400100d0bfb0201037f0240024041002802e488042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602e08804410020054180807c713602e48804410041002802dc880420034110746a3602dc88040c010b41002802e0880420044f0d00410020043602e088040b41002802d8880420006a2100024002401000220420014b0d002002450d0102400240200241077122010d00200221010c010b0340200041003a0000200041016a21002001417f6a22010d000b200241787121010b20024108490d01034020004200370000200041086a2100200141786a22010d000c020b0b0240200220016a20044d0d0020002001200420016b22041001200220046b2202450d01200020046a210002400240200241077122010d00200221010c010b0340200041003a0000200041016a21002001417f6a22010d000b200241787121010b20024108490d01034020004200370000200041086a2100200141786a22010d000c020b0b20002001200210010b0b0b00410041013a00d088040b09002000410c6a10140b5601017f024041002d00d488040d0041003f004110743602d88804410140001a3f002100410041013a00d488044100200041107422003602dc88044100200041002802d888046b3602e48804410041003602e088040b0bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000b800402037f057e230041a0026b22002400103c200041e0016a41186a4200370300200042003703f001200042003703e8012000420c3703e001200041e0016a200041c0016a102720004180026a41186a2201420037030020004200370390022000420037038802200042013703800220004180026a410020004180016a1039200041a0016a41186a22024200370300200042003703b001200042003703a8012000420c3703a001200041a0016a20004180016a1026200041c0006a101b200020002900403700002000200029004837000820002000290050370010200020002900583700182000200041206a1017200041206a41086a2903002103200041206a41106a350200210420002903202105200041c0016a41186a4200370300200042003703d001200042003703c801200042053703c001200041c0016a200041a0016a1027200041b4016a3502002106200229030021072001420037030020002004370390022000200337038802200020053703800220004180026a4100200041e0016a103920004180016a41186a4200370300200041e0006a41186a20073703002000420037039001200042003703880120004205370380012000200041e0016a41086a290300370368200020002903e0013703602000200041e0016a41106a35020020064220868437037020004180016a200041e0006a1026200041a0026a24000b8a0803047f0b7e017f230041a0046b22002400200041206a420a420042004200103e2000280220210120004180046a41186a220242a0e085bbb7ae9ab7d5003703002000428080808080808099d6003703900420004200370388042000420037038004200141206a220320004180046a1022200120004180046a10242003200028028004200041e0026a102820002900e002210420002900e802210520002900f002210620002900f802210720004201420042004200103e20002802002101200242808080808080808031370300200042003703900420004200370388042000420037038004200141206a220320004180046a1022200120004180046a10242003200028028004200041c0026a102820002900c002210820002900c802210920002900d002210a20002900d802210b20004180046a1031200041a0026a101c200020002900a0023700e001200020002900a8023700e801200020002900b0023700f001200020002900b8023700f801200041e0016a20004180026a101720004180026a41086a290300210c20004180026a41106a350200210d200029038002210e41c000200041e0036a1024200020073700d801200020063700d001200020053700c801200020043700c001200041e0036a41186a22032903002105200041e0036a41106a2903002106200041e0036a41086a290300210720002903e0032104200041c0016a200041c0036a10172000200b3700b8012000200a3700b001200020093700a801200020083700a001200041a0016a200041e0036a1017200041a0036a41186a42bdfce3dde9f8f0b98b7f370300200042f998e7bacf89b397d1003703b003200042caf5bfd8f9e2decf233703a8032000428f80e5d9a2aad7d3a97f3703a0032004a7220141206a220f200041a0036a1022200141c0006a200041c0036a1022200141e0006a200041e0036a102220014180016a20004180046a1022200242003703002000200d370390042000200c370388042000200e37038004200141a0016a20004180046a102220004180016a41186a420037030020004200370390012000420037038801200042a00137038001200120004180016a1022200420072006200542c001420042004200103d200120004180046a1024200f200028028004200041e0006a102820002000290060370040200020002900683700482000200029007037005020002000290078370058200041c0006a200041e0036a1017200041c0036a41186a4200370300200042003703d003200042003703c803200042033703c003200041c0036a200041a0036a1027200041e0036a410020004180046a103a20004180046a410020004180036a103920034200370300200042003703f003200042003703e803200042033703e003200041e0036a20004180036a1026200041a0046a24000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a1022200941186a42003703002009420037031020094200370308200942c10037030041042009102241004124101e0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c00020081022200941c0006a24000bf40206027f077e017f017e017f017e230041c0006b2205210620052400024020025041002003200484501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1022200641186a42003703002006420037031020064200370308200642c10037030041042006102241004124101e0b41c000200641206a102420062903202207200641286a2903002208200641306a2903002209200641206a41186a290300220a2001421f7c220b426083220c42207c220d2002200b200154220ead7c220f200d200c542210ad7c22112003200e200f200254200b20015a1bad7c220b20102011200f54200d200c5a1bad7c220c2004200b200354ad7c200c200b54ad7c103d200541606a22052400200541186a20043703002005200337031020052002370308200520013703002007a720051022200020093703102000200837030820002007370300200041186a200a370300200641c0006a24000b9e0304027f017e017f067e23002209210a02402001421f7c220b2005542002200b200154220cad7c220d200654200d2006511b2003200c200d200254200b20015a1bad7c220b2007542004200b200354ad7c220d200853200d2008511b200b200785200d20088584501b0d0041004100101e0b200941606a220924002001a7200910192009290300210d0240200941086a290300220b504100200941106a290300220e200941186a290300220f84501b0d0041004100101e0b0240200d200142207c22107c2211200558200b200220102001542209ad7c22127c2011200d54220cad7c220520065820052006511b200e200320092012200254201020015a1bad7c22017c2202200c2005200b542005200b511bad7c2206200758200f20042001200354ad7c22037c2002200e54ad7c2006200254ad7c220220085820022008511b2006200785200220088584501b0d0041004100101e0b2000200d37032020002010370300200041286a200b37030020002012370308200041306a200e37030020002001370310200041386a200f370300200041186a2003370300200a24000bea0508037f037e017f017e017f017e017f0b7e230041e0006b2209210a200924000240200520017d42ff0056200620027d2005200154220bad7d220c420052200c501b200720037d220c200b200620025420062002511bad220d7d220e420052200820047d2007200354ad7d200c200d54ad7d220c420055200c501b200e200c84501b0d0041004100101e0b2001a7220b200a41c0006a1019200a41c0006a41186a220f2903002110200a41c0006a41106a22112903002112200a41c0006a41086a22132903002114200a2903402115200b41206a200a41c0006a1019200f29030021162011290300211720132903002118200a2903402119200b41c0006a200a41c0006a10192013290300211a200a290340211b024041002011290300220d428080808010544100200f290300220e501b200d42808080801085200e84501b0d0041004100101e0b200941606a22092400200b41e0006a200910192009290300211c0240200941086a290300220c504100200941106a290300221d200941186a290300221e84501b0d0041004100101e0b200a201c20017c2201200c20027c2001201c542209ad7c2202201d20037c220120092002200c542002200c511bad7c2202201e20047c2001201d54ad7c2002200154ad7c2005200620072008103f200a41086a2903002102200a41186a2903002106200a41106a2903002101200a41286a2903002105200a41386a2903002103200a41306a2903002107200a290300210c2000200a290320370380012000200c3703602000201b3703402000201937032020002012370310200020153703002000201437030820004190016a200737030020004198016a200337030020004188016a2005370300200041f0006a2001370300200041f8006a2006370300200041e8006a2002370300200041d0006a200d370300200041d8006a200e370300200041c8006a201a370300200041306a2017370300200041386a2016370300200041286a2018370300200041186a2010370300200a41e0006a24000be30503017f147e037f230041c0026b220024000240101d450d0041004100101e0b20004204420042004200101aad420042004200104020004198016a290300210120004190016a290300210220004188016a2903002103200041f8006a2903002104200041f0006a2903002105200041e8006a2903002106200041d8006a2903002107200041d0006a2903002108200041c8006a2903002109200041386a290300210a200041306a290300210b200041286a290300210c200041186a290300210d200041106a290300210e200041086a290300210f200029038001211020002903602111200029034021122000290320211320002903002114200041e0016a41186a4200370300200042003703f001200042003703e8012000420c3703e001200041e0016a200041a0026a1027200041a0026a410020004180026a103a20002903800242018520004180026a41106a2903008420004180026a41086a29030020004180026a41186a2215290300848450ad420042004200104220154200370300200042003703900220004200370388022000420c3703800220004180026a200041e0016a1027200041a0026a41186a22164200370300200042003703b002200042003703a802200042003703a002200041a0026a4100200041a0016a1039200041c0016a41186a22174200370300200042003703d001200042003703c8012000420c3703c001200041c0016a200041a0016a10262014200f200e200d2013200c200b200a201220092008200720112006200520042010200320022001104320154200370300200042003703900220004200370388022000420c3703800220004180026a200041e0016a102720164200370300200042003703b002200042003703a802200042013703a002200041a0026a4100200041a0016a103920174200370300200042003703d001200042003703c8012000420c3703c001200041c0016a200041a0016a102641c000200041a0026a102420002802a00241001029200041c0026a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054211370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542c5968dfac489889d323703302005428080808080808080c40037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000b8a4e0a047f047e047f017e017f067e027f017e0f7f167e230041e0076b221424002000200484200220068484200120058420032007848484420052ad420042004200105d201422154180076a41186a2216420037030020154200370390072015420037038807201542083703800720154180076a201541c0076a1027201541c0076a4100201541a0076a103a201541a8076a2217290300211820152903a00721192016420037030020154200370390072015420037038807201542083703800720154180076a201541c0076a1027201541c0076a41f000201541a0076a103a2017290300211a20152903a007211b201541a0076a41186a4200370300201542003703b007201542003703a807201542083703a007201541a0076a201541c0076a10272019200056201842ffffffffffff3f8322182001562018200151221c1b4100200220038450221d1b201b200456201a42ffffffffffff3f83221a200556201a200551221e1b4100200620078450221f1b71ad420042004200105e2016420037030020154200370390072015420037038807201542063703800720154180076a201541c0076a1027201541c0076a4100201541a0076a103a20172903002120201541b0076a2221350200212220152903a00721232016420037030020154200370390072015420037038807201542073703800720154180076a201541c0076a1027201541c0076a4100201541a0076a103a20082023852022200a42ffffffff0f8322248584200920208584420052200820152903a0072225852024202135020022268584200920172903002227858442005271ad420042004200105f02402000200284200120038484500d00202320202022420020082009200a200b200020012002200310620b02402004200684200520078484500d00202520272026420020082009200a200b200420052006200710620b02402010201284201120138484500d00201441606a221622142400201641186a22284200370300201620243703102016200937030820162008370300201441606a221722142400201741186a222942003703002017420037031020174200370308201742dcd0c78601370300201441606a2214222124002014101b2014290000210a2014290008210b2014290010212a2014280018212b20142d001c212c20142d001d212d20142d001e212e20142d001f212f202141606a2214222124002014202f3a001f2014202e3a001e2014202d3a001d2014202c3a001c2014202b3600182014202a3700102014200b3700082014200a370000202141606a2221222b2400202141186a22302003370300202120023703102021200137030820212000370300202b41606a222b22312400202b41186a22322007370300202b2006370310202b2005370308202b2004370300203141606a223322312400203341186a200f3703002033200e3703102033200d3703082033200c370300203141606a223122342400203141186a22352013370300203120123703102031201137030820312010370300203441606a223422362400203441186a4200370300203420243703102034200937030820342008370300203641606a2236223724002034203610182036290000210a203629000821132036290010211220362900182111203741606a2234223724002034201137001820342012370010203420133700082034200a3700000240203410370d0041004100101e0b41c000201541c0076a1024201541c0076a41086a2903002113201541c0076a41106a2903002112201541c0076a41186a2236290300211120152903c007210a203741606a223422372400203441186a201137030020342012370310203420133703082034200a370300201741086a2903002113201741106a29030021122017290300211120362029290300370300201520123703d007201520133703c807201520113703c007201541c0076a41e001201541a0076a1039201541a0076a41086a2903002113201541a0076a41106a2903002112201541a0076a41186a2238290300211120152903a0072110203741606a222922372400202941186a2011370300202920123703102029201337030820292010370300200aa722172029102220142900002113201429000821122014290010211120142800182139203741606a222922142400201441606a2214223724002014202f3a001f2014202e3a001e2014202d3a001d2014202c3a001c20142039360018201420113700102014201237000820142013370000201420291017203141086a2903002112203141106a290300211120352903002110202b41086a290300210b202b41106a290300210f2032290300210e202141086a290300210d202141106a290300210c2030290300212a2029290300213a202941086a290300213b202941106a350200213c2033280200211420312903002113202b290300213d2021290300213e203642003703002015203c3703d0072015203b3703c8072015203a3703c007201741046a201541c0076a10222036202a3703002015200c3703d0072015200d3703c8072015203e3703c007201741246a201541c0076a10222036200e3703002015200f3703d0072015200b3703c8072015203d3703c007201741c4006a201541c0076a102220384200370300201542003703b007201542003703a80720154280013703a007201741e4006a201541a0076a102220362010370300201520113703d007201520123703c807201520133703c00720174184016a201541c0076a1022200a42a4017c220aa720142013a7222b103520364200370300201542003703d007201542003703c807201542003703c0072013200a7ca7201541c0076a10221032210a201641086a2903002113201641106a29030021122028290300211120162903002110203741606a221422162400201441186a2011370300201420123703102014201337030820142010370300201641606a22162221240020142016101820162900002113201629000821122016290010211120162900182110202141606a22162214240020162010370018201620113700102016201237000820162013370000201441606a222122142400202141186a42003703002021420037031020214200370308202142003703000240200a201620212017202b411f6a41607141a4016a20174100102f0d0041c000201541c0076a102420152802c007221641001034102e20161034101e0c010b10341a2034290300203441086a290300203441106a290300203441186a290300420042004200420010440b201441606a2214221624002014101c2014290000210a201429000821132014290010211220142900182111201641606a221622142400201441606a2214222124002014201137001820142012370010201420133700082014200a37000020142016101720162903002113201641086a2903002112201641106a350200211141c000201541c0076a1024201541c0076a41086a2903002110201541c0076a41106a290300210b201541c0076a41186a2217290300210f20152903c007210a202141606a221422162400201441186a200f3703002014200b370310201420103703082014200a37030020174200370300201542003703d007201542003703c807201542b1848285073703c007201541c0076a41e001201541a0076a1039201541a0076a41086a2903002110201541a0076a41106a290300210b201541a0076a41186a290300210f20152903a007210e201641606a2216222b2400201641186a200f3703002016200b370310201620103703082016200e370300200aa722212016102220174200370300201520113703d007201520123703c807201520133703c007202141046a201541c0076a10221032210a202b41606a221622172400201641186a4200370300201620223703102016202037030820162023370300201741606a2217222b240020162017101820172900002120201729000821222017290010212320172900182113202b41606a2216221724002016201337001820162023370010201620223700082016202037000002400240200a2016202141242021412010300d0041c000201541c0076a102420152802c007221441001034102e20141034101e0c010b0240024010344120490d0020142903002220201441086a290300201441106a290300201441186a290300422042004200420010442020a721140c010b1034211620142903002220201441086a290300201441106a290300201441186a2903002016ad42004200420010442020a721142016411f4b0d0041004100101e0b2014201541c0076a1024201541d8076a2903002113201541d0076a290300210b201541c8076a290300212020152903c00721230b201741606a2214221624002014101c201429000021222014290008210a2014290010211220142900182111201641606a221622142400201441606a22142221240020142011370018201420123700102014200a370008201420223700002014201610172016290300210a201641086a2903002112201641106a350200211141c000201541c0076a1024201541c0076a41086a2903002110201541c0076a41106a290300210f201541c0076a41186a2217290300210e20152903c0072122202141606a221422162400201441186a200e3703002014200f370310201420103703082014202237030020174200370300201542003703d007201542003703c807201542b1848285073703c007201541c0076a41e001201541a0076a1039201541a0076a41086a2903002110201541a0076a41106a290300210f201541a0076a41186a290300210e20152903a007210d201641606a2216222b2400201641186a200e3703002016200f370310201620103703082016200d3703002022a722212016102220174200370300201520113703d007201520123703c8072015200a3703c007202141046a201541c0076a102210322122202b41606a221622172400201641186a4200370300201620263703102016202737030820162025370300201741606a2217222b24002016201710182017290000210a201729000821122017290010211120172900182110202b41606a2216221724002016201037001820162011370010201620123700082016200a3700000240024020222016202141242021412010300d0041c000201541c0076a102420152802c007221441001034102e20141034101e0c010b0240024010344120490d0020142903002222201441086a290300201441106a290300201441186a290300422042004200420010442022a721140c010b1034211620142903002222201441086a290300201441106a290300201441186a2903002016ad42004200420010442022a721142016411f4b0d0041004100101e0b2014201541c0076a1024201541d8076a2903002112201541d0076a2903002125201541c8076a290300212220152903c007210a0b02400240024002400240201920005a201820015a201c1b200250200350221420141b201d1b0d00201541c0076a41186a2216428080808090ee9ea4ce0037030042002111201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a22214200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e2023201920007d220f562020201820017d20192000542214ad7d22265620202026511b200b420020027d221020142018200154201c1bad220e7d2227562013420020032002420052ad7c2010200e54ad7c7d22105620132010511b200b202785201320108584501b0d010c030b420021112023201920007d220f562020201820017d20192000542214ad7d22265620202026511b200b420020027d221020142018200154201c1bad220e7d2227562013420020032002420052ad7c2010200e54ad7c7d22105620132010511b200b202785201320108584501b450d020c010b2016428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a102220214200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b02402023200f5a202020265a202020265122141b200b20275a201320105a20132010511b200b202785201320108584501b0d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b200b20277d22112023200f542216202020265420141bad220e7d213f201320107d200b202754ad7d2011200e54ad7d2140202020267d2016ad7d210d2023200f7d21110c010b4200210d4200213f420021400b02400240024002400240201b20045a201a20055a201e1b200650200750221420141b201f1b0d00201541c0076a41186a2216428080808090ee9ea4ce0037030042002110201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a22214200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e200a201b20047d220e562022201a20057d201b2004542214ad7d22275620222027511b2025420020067d22262014201a200554201e1bad220c7d220f562012420020072006420052ad7c2026200c54ad7c7d22265620122026511b2025200f85201220268584501b0d010c030b42002110200a201b20047d220e562022201a20057d201b2004542214ad7d22275620222027511b2025420020067d22262014201a200554201e1bad220c7d220f562012420020072006420052ad7c2026200c54ad7c7d22265620122026511b2025200f85201220268584501b450d020c010b2016428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a102220214200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b0240200a200e5a202220275a202220275122141b2025200f5a201220265a20122026511b2025200f85201220268584501b0d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b2025200f7d2210200a200e542216202220275420141bad220c7d2141201220267d2025200f54ad7d2010200c54ad7d2142202220277d2016ad7d210c200a200e7d21100c010b4200210c42002141420021420b2011201084203f20418484200d200c8420402042848484420052ad4200420042001060201541c0066a2023420042e80742001016201541e0066a2020420042e80742001016201541f0066a2023202042004200101620154190066a200b420042e8074200101620154180066a2013420042e80742001016201541b0066a20234200420042001016201541d0066a20204200420042001016201541a0066a2023420042004200101620152903c006213d024020152903880642005220154190066a41086a29030022262015290380067c222a2026547220152903d006223a201541e0066a41086a29030020152903e0062226201541c0066a41086a2903007c2227202654ad7c223b201541b0066a41086a29030020152903b006222620277c220f202654ad7c7c223c7c222620152903f0067c2227201529039006223e20152903a0067c22437c220e2027542214201541d0066a41086a290300203c203b54ad7c2026203a54ad7c201541f0066a41086a2903007c2027202654ad7c2227202a201541a0066a41086a2903007c2043203e54ad7c7c2014ad7c222620275420262027511b72450d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b201541c0056a20114200420342001016201541e0056a200d4200420342001016201541f0056a2011200d42004200101620154190056a203f420042034200101620154180056a20404200420342001016201541b0056a20114200420042001016201541d0056a200d4200420042001016201541a0056a2011420042004200101620152903c005213e024020152903880542005220154190056a41086a29030022272015290380057c223c2027547220152903d0052243201541e0056a41086a29030020152903e0052227201541c0056a41086a2903007c222a202754ad7c2244201541b0056a41086a29030020152903b0052227202a7c222a202754ad7c7c22457c222720152903f0057c223b201529039005224620152903a0057c22477c223a203b542214201541d0056a41086a2903002045204454ad7c2027204354ad7c201541f0056a41086a2903007c203b202754ad7c223b203c201541a0056a41086a2903007c2047204654ad7c7c2014ad7c2227203b542027203b511b724101470d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b0240203d203e5a200f202a5a200f202a5122141b200e203a5a202620275a20262027511b200e203a85202620278584501b0d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b201541c0046a200a420042e80742001016201541e0046a2022420042e80742001016201541f0046a200a202242004200101620154190046a2025420042e8074200101620154180046a2012420042e80742001016201541b0046a200a4200420042001016201541d0046a20224200420042001016201541a0046a200a4200420042001016200e203a7d2245203d203e542216200f202a5420141bad2246542114202620277d213c200e203a54ad210e20152903c0042143024020152903880442005220154190046a41086a29030022262015290380047c22442026547220152903d0042247201541e0046a41086a29030020152903e0042226201541c0046a41086a2903007c2227202654ad7c2248201541b0046a41086a29030020152903b004222620277c223a202654ad7c7c22497c222620152903f0047c2227201529039004224a20152903a0047c224b7c223b2027542221201541d0046a41086a2903002049204854ad7c2026204754ad7c201541f0046a41086a2903007c2027202654ad7c22272044201541a0046a41086a2903007c204b204a54ad7c7c2021ad7c222620275420262027511b724101470d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b2014ad2147203c200e7d210e200f202a7d21482016ad2149201541c0036a20104200420342001016201541e0036a200c4200420342001016201541f0036a2010200c42004200101620154190036a2041420042034200101620154180036a20424200420342001016201541b0036a20104200420042001016201541d0036a200c4200420042001016201541a0036a2010420042004200101620152903c0032144024020152903880342005220154190036a41086a29030022272015290380037c224a2027547220152903d003224b201541e0036a41086a29030020152903e0032227201541c0036a41086a2903007c220f202754ad7c224c201541b0036a41086a29030020152903b0032227200f7c222a202754ad7c7c224d7c222720152903f0037c220f201529039003224e20152903a0037c224f7c223c200f542214201541d0036a41086a290300204d204c54ad7c2027204b54ad7c201541f0036a41086a2903007c200f202754ad7c220f204a201541a0036a41086a2903007c204f204e54ad7c7c2014ad7c2227200f542027200f511b724101470d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b204520467d2145200e20477d2146204820497d210f203d203e7d210e0240204320445a203a202a5a203a202a5122141b203b203c5a202620275a20262027511b203b203c85202620278584501b0d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b201541d0026a200e4200204320447d223d42001016201541c0026a200f4200203d42001016201541e0026a200e4200203a202a7d20432044542216ad7d223e42001016201541f0026a200f4200203e4200101620154190026a200e200f42004200101620154180026a203d203e420042001016201541c0016a203e4200204542001016201541d0016a20464200203d42001016201541a0026a20454200203d42001016201541e0016a200f4200203b203c7d223d2016203a202a5420141bad223a7d222a42001016201541f0016a202620277d203b203c54ad7d203d203a54ad7d22264200200e42001016201541b0026a202a4200200e4200101620152903d002213a02402045204684420052202a202684420052712046420052203e4200527120152903d8014200527220152903c80142005272201541a0026a41086a290300222720152903d00120152903c0017c7c222a20275472722026420052200f4200527120152903f8014200527220152903e80142005272201541b0026a41086a290300222620152903f00120152903e0017c7c223b202654727220152903f002223c201541c0026a41086a29030020152903c0022226201541d0026a41086a2903007c2227202654ad7c223d201541e0026a41086a29030020152903e002222620277c220f202654ad7c7c223e7c222620152903900222432015290380027c22447c222720152903a002224520152903b0027c22467c220e2027542214201541f0026a41086a290300203e203d54ad7c2026203c54ad7c20154190026a41086a29030020154180026a41086a2903007c2044204354ad7c7c2027202654ad7c2227202a203b7c2046204554ad7c7c2014ad7c222620275420262027511b72410171450d00201541c0076a41186a428080808090ee9ea4ce00370300201542003703d007201542003703c807201542003703c0074100201541c0076a1022201541a0076a41186a4200370300201542003703b007201542003703a807201542113703a0074104201541a0076a102241004124101e0b201541f0006a20194200201b42001016201541e0006a20184200201b4200101620154180016a20194200201a4200101620154190016a20184200201a42001016201541b0016a201b201a420042001016201541a0016a201920184200420010162015201529039001223b201541e0006a41086a29030020152903602227201541f0006a41086a2903007c222a202754ad7c223c20154180016a41086a290300201529038001223d202a7c2227203d54ad7c7c223d7c222a20152903a001223e20152903b0017c22437c224420154190016a41086a290300203d203c54ad7c202a203b54ad7c201541a0016a41086a290300201541b0016a41086a2903007c2043203e54ad7c7c2044202a54ad7c42c0843d42001016201541d0006a2015290370222a420042c0843d42001016201541306a2027420042c0843d42001016201541106a202a2027420042001016201541c0006a202a4200420042001016201541206a20274200420042001016203a20152903505a200f2015290340222a2015290330223a201541d0006a41086a2903007c223b7c22275a200f2027511b200e2015290320223c201541306a41086a290300203b203a54ad7c223a201541c0006a41086a2903002027202a54ad7c7c222a7c22272015290310223b20152903007c223d7c220f5a2026201541206a41086a290300202a203a54ad7c2027203c54ad7c201541106a41086a290300201541086a2903007c203d203b54ad7c7c200f202754ad7c22275a20262027511b200e200f85202620278584501bad420042004200106120232020200b2013200a2022202520122019201842004200201b201a420042001063201741606a2214221624002014101b201429000021192014290008211b201429001021182014290018211a201641606a221622142400201441606a2214221724002014201a370018201420183700102014201b3700082014201937000020142016101720162903002119201641086a290300211b201641106a350200211841c000201541c0076a102420152802c0072114201541c0076a41186a221620403703002015203f3703d0072015200d3703c807201520113703c0072014201541c0076a102220162042370300201520413703d0072015200c3703c807201520103703c007201441206a201541c0076a102220162003370300201520023703d007201520013703c807201520003703c007201441c0006a201541c0076a102220162007370300201520063703d007201520053703c807201520043703c007201441e0006a201541c0076a1022201741606a221622172400201641186a42cbb2b2a3faabb6c557370300201642dfcef0afa89bf4a8e500370310201642d5f1feabf6c6f38966370308201642a2b0e78ac090cce863370300201741606a22172221240020162017101820172900002105201729000821012017290010210620172900182102202141606a22162217240020162002370018201620063700102016200137000820162005370000201741606a221722212400201741186a4200370300201720183703102017201b37030820172019370300202141606a2221222b240020172021101820212900002105202129000821012021290010210620212900182102202b41606a22172221240020172002370018201720063700102017200137000820172005370000202141606a2221222b2400202141186a4200370300202120243703102021200937030820212008370300202b41606a222b223124002021202b1018202b2900002105202b2900082101202b2900102106202b2900182102203141606a22212400202120023700182021200637001020212001370008202120053700002014418001201620172021102c201541e0076a24000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a1022200941186a42003703002009420037031020094200370308200942c10037030041042009102241004124101e0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c00020081022200941c0006a24000bf40206027f077e017f017e017f017e230041c0006b2205210620052400024020025041002003200484501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1022200641186a42003703002006420037031020064200370308200642c10037030041042006102241004124101e0b41c000200641206a102420062903202207200641286a2903002208200641306a2903002209200641206a41186a290300220a2001421f7c220b426083220c42207c220d2002200b200154220ead7c220f200d200c542210ad7c22112003200e200f200254200b20015a1bad7c220b20102011200f54200d200c5a1bad7c220c2004200b200354ad7c200c200b54ad7c1044200541606a22052400200541186a20043703002005200337031020052002370308200520013703002007a720051022200020093703102000200837030820002007370300200041186a200a370300200641c0006a24000bf20204047f017e017f037e230041e0006b220024000240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b2000420a420042004200104520002802002101200041c0006a41186a220242a0e085bbb7ae9ab7d5003703002000428080808080808099d6003703502000420037034820004200370340200141206a2203200041c0006a102241c000200041c0006a102420002903402104200041206a41186a42003703002000420037033020004200370328200042203703202004a72205200041206a10222001200041c0006a1024200041c8006a2903002106200041d0006a29030021072000290340210820022002290300370300200020073703502000200637034820002008370340200541206a200041c0006a1022200442c0007c2204a720032008a72201102520024200370300200042003703502000420037034820004200370340200820047ca7200041c0006a102220052001411f6a41607141c0006a1029200041e0006a24000bb10302037f057e230041e0006b220024000240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b200041186a220142003703002000420037031020004200370308200042083703002000200041c0006a1027200041c0006a4100200041206a103a200041286a2202290300210320002903202104200142003703002000420037031020004200370308200042083703002000200041c0006a1027200041c0006a41f000200041206a103a2002290300210520002903202106200142003703002000420037031020004200370308200042083703002000200041c0006a1027200041c0006a41e001200041206a103a2000350220210741c000200041c0006a102420002802402101200041c0006a41186a22024200370300200042003703502000200342ffffffffffff3f83370348200020043703402001200041c0006a102220024200370300200042003703502000200542ffffffffffff3f8337034820002006370340200141206a200041c0006a102220024200370300200042003703502000420037034820002007370340200141c0006a200041c0006a1022200141e0001029200041e0006a24000bfb0206027f027e017f017e017f057e230041e0006b220024000240101d450d0041004100101e0b0240101a41c3004b0d0041004100101e0b4104200041c0006a1019200041c0006a41086a220129030021022000290340210302404100200041c0006a41106a22042903002205428080808010544100200041c0006a41186a22062903002207501b200542808080801085200784501b0d0041004100101e0b4124200041c0006a101920062903002108200429030021092001290300210a2000290340210b200041c0006a101b200020002900403700002000200029004837000820002000290050370010200020002900583700182000200041206a10172000290320200041206a41086a290300200041206a41106a290300200041206a41186a2903002003200220052007200b200a20092008104941c000200041c0006a102420002802402101200642003703002000420037035020004200370348200042013703402001200041c0006a1022200141201029200041e0006a24000ba30704027f017e017f037e230041c0036b220c2400200c41a0036a41186a220d4200370300200c20013703a803200c20003703a003200c200242ffffffff0f83220e3703b0034100200c41a0036a1022200c41e0026a41186a220f4200370300200c42003703f002200c42003703e802200c42023703e0024120200c41e0026a1022410041c000200c41c0026a1028200c200c2900c0023700a002200c200c2900c8023700a802200c200c2900d0023700b002200c200c2900d8023700b802200c41a0026a200c4180036a1017200d4200370300200c200642ffffffff0f8322103703b003200c20053703a803200c20043703a0034100200c41a0036a10224120200c4180036a1022410041c000200c41c0026a1028200c200c2900c0023700a002200c200c2900c8023700a802200c200c2900d0023700b002200c200c2900d8023700b802200c41a0026a200c41e0026a1017200c41e8026a2903002102200c41f0026a2903002106200c2903e0022111200c4180036a41186a200f2903002212370300200c200637039003200c200237038803200c201137038003200c4180036a200c41e0026a1027200d200b370300200c200a3703b003200c20093703a803200c20083703a003200c41a0036a4100200c41a0026a1039200c41c0026a41186a2012370300200c20063703d002200c20023703c802200c20113703c002200c41c0026a200c41a0026a102641c000200c41a0036a1024200c2802a003210f200d200b370300200c200a3703b003200c20093703a803200c20083703a003200f200c41a0036a1022200c4180026a41186a42dbfab1dfdebcf8ad8c7f370300200c42f389fae8a7a8dca75137039002200c429ed2c8bd8f98c5815d37038802200c42a5f28ebe8cd98290db0037038002200c4180026a200c41e0016a1018200c41a0016a41186a4200370300200c200e3703b001200c20013703a801200c20003703a001200c200c2900e0013700c001200c200c2900e8013700c801200c200c2900f0013700d001200c200c2900f8013700d801200c41a0016a200c4180016a1018200c41c0006a41186a4200370300200c2010370350200c2005370348200c2004370340200c200c29008001370060200c200c29008801370068200c200c29009001370070200c200c29009801370078200c41c0006a200c41206a1018200c200c290020370000200c200c290028370008200c200c290030370010200c200c290038370018200f4120200c41c0016a200c41e0006a200c102c200c41c0036a24000b980306027f027e017f017e017f057e230041c0006b220024000240101d450d0041004100101e0b0240101a41e3004b0d0041004100101e0b4104200041206a1019200041286a220129030021022000290320210302404100200041306a22042903002205428080808010544100200041386a22062903002207501b200542808080801085200784501b0d0041004100101e0b4124200041206a10192001290300210820002903202109024041002004290300220a4280808080105441002006290300220b501b200a42808080801085200b84501b0d0041004100101e0b41c400200041206a10192000200320022005200720092008200a200b2000290320200041206a41086a290300200041206a41106a290300200041206a41186a2204290300104b200041106a2903002105200041186a2903002107200041086a290300210a2000290300210b41c000200041206a1024200028022021012004420037030020004200370330200042003703282000200b200584200a20078484420052ad3703202001200041206a1022200141201029200041c0006a24000b840c06037f017e017f037e087f087e23004180026b220d2400200d220e41e0016a41186a220f4200370300200e200342ffffffff0f8322103703f001200e20023703e801200e20013703e0014100200e41e0016a1022200e41a0016a41186a22114200370300200e42003703b001200e42003703a801200e42023703a0014120200e41a0016a1022410041c000200e4180016a1028200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41c0016a1017200e41c0006a101b200e200e290040370000200e200e290048370008200e200e290050370010200e200e290058370018200e200e41206a1017200e41206a41086a2903002112200e41206a41106a3502002113200e2903202114200f4200370300200e20133703f001200e20123703e801200e20143703e0014100200e41e0016a10224120200e41c0016a1022410041c000200e4180016a1028200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41a0016a1017200e41a0016a200e41e0016a1027200e41e0016a4100200e41c0016a103a0240200e2903c001200e41c0016a41106a221529030083200e41c0016a41086a2216290300200e41c0016a41186a22172903008383427f510d00200d41606a220d22182400200d41186a2219200c370300200d41106a221a200b370300200d41086a221b200a370300200d2009370300200f4200370300200e20103703f001200e20023703e801200e20013703e0014100200e41e0016a102220114200370300200e42003703b001200e42003703a801200e42023703a0014120200e41a0016a1022410041c000200e4180016a1028200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41c0016a1017201841606a2218221c24002018101b20182900002112201829000821132018290010211420182900182110201c41606a221c22182400201841606a22182400201820103700182018201437001020182013370008201820123700002018201c1017201c2903002112201c41086a2903002113201c41106a3502002114200f4200370300200e20143703f001200e20133703e801200e20123703e0014100200e41e0016a10224120200e41c0016a1022410041c000200e4180016a1028200e200e29008001370060200e200e29008801370068200e200e29009001370070200e200e29009801370078200e41e0006a200e41a0016a1017200e41a0016a41086a2903002112200e41a0016a41106a2903002113200e2903a001211420112011290300221d370300200e20133703b001200e20123703a801200e20143703a001200e41a0016a200e41e0016a1027200e41e0016a4100200e41c0016a103a0240200e2903c001221e200d290300221f5a20162903002210201b29030022205a2010202051220d1b20152903002221201a29030022225a20172903002223201929030022245a20232024511b2021202285202320248584501b0d00200e41e0016a41186a428080808090ee9ea4ce00370300200e42003703f001200e42003703e801200e42003703e0014100200e41e0016a1022200e41c0016a41186a4200370300200e42003703d001200e42003703c801200e42113703c0014104200e41c0016a102241004124101e0b200e41c0016a41186a201d370300200e20143703c001200e20123703c801200e20133703d001200e41c0016a200e41a0016a1027200e41e0016a41186a202320247d2021202254ad7d202120227d2221201e201f5422182010202054200d1bad222254ad7d370300200e202120227d3703f001200e201020207d2018ad7d3703e801200e201e201f7d3703e001200e41e0016a4100200e41e0006a1039200e4180016a41186a201d370300200e201337039001200e201237038801200e201437038001200e4180016a200e41e0006a10260b200120022003200420052006200720082009200a200b200c1055200042003703102000420037030820004201370300200041186a4200370300200e4180026a24000bbf0503017f047e087f230041a0026b22082400200841c0006a101b200829004021092008290048210a2008290050210b2008290058210c200841c0016a41186a220d4200370300200842003703d001200842003703c801200842053703c001200841c0016a20084180026a102720084180026a4100200841e0016a103a2008200c3700182008200b3700102008200a37000820082009370000200841e0016a41086a220e2903002109200841e0016a41106a220f350200210a20082903e001210b2008200841206a1017200b200829032085200a200841206a41106a35020085842009200841206a41086a290300858450ad4200420042001064200d4200370300200842003703d001200842003703c801200842063703c001200841c0016a200841a0016a1027200841b4016a22103502002109200841a0016a41186a2211290300210a20084180026a41186a221242003703002008200242ffffffff0f83370390022008200137038802200820003703800220084180026a4100200841e0016a103920084180016a41186a22134200370300200841e0006a41186a2214200a3703002008420037039001200842003703880120084206370380012008200e290300370368200820082903e0013703602008200f35020020094220868437037020084180016a200841e0006a1026200d4200370300200842003703d001200842003703c801200842073703c001200841c0016a200841a0016a10272010350200210220112903002101201242003703002008200642ffffffff0f83370390022008200537038802200820043703800220084180026a4100200841e0016a103920134200370300201420013703002008420037039001200842003703880120084207370380012008200e290300370368200820082903e0013703602008200f35020020024220868437037020084180016a200841e0006a1026200841a0026a24000ba90505017f037e017f017e027f230041c0016b220024000240101d450d0041004100101e0b0240101a41234b0d0041004100101e0b4104200041a0016a1019200041a0016a41086a290300210120002903a001210202404100200041a0016a41106a2903002203428080808010544100200041a0016a41186a22042903002205501b200342808080801085200584501b0d0041004100101e0b200041e0006a41186a420037030020004200370370200042003703682000420c370360200041e0006a200041a0016a1027200041a0016a410020004180016a103a20002903800142018520004180016a41106a2903008420004180016a41086a29030020004180016a41186a2206290300848450ad420042004200104220064200370300200042003703900120004200370388012000420c3703800120004180016a200041e0006a102720044200370300200042003703b001200042003703a801200042003703a001200041a0016a4100200041206a1039200041c0006a41186a2207420037030020004200370350200042003703482000420c370340200041c0006a200041206a1026200020032003200320032002200120032005104e200041086a2903002103200041106a2903002105200041186a29030021012000290300210220064200370300200042003703900120004200370388012000420c3703800120004180016a200041e0006a102720044200370300200042003703b001200042003703a801200042013703a001200041a0016a4100200041206a10392007420037030020004200370350200042003703482000420c370340200041c0006a200041206a102641c000200041a0016a102420002802a001210620042001370300200020053703b001200020033703a801200020023703a0012006200041a0016a1022200641201029200041c0016a24000baa550a047f047e017f017e017f0a7e027f297e027f017e230041c00b6b220924002009220a41e00a6a41186a220b4200370300200a42003703f00a200a42003703e80a200a42083703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a4100200a41800b6a103a200a41800b6a41086a220c290300210d200a2903800b210e200b4200370300200a42003703f00a200a42003703e80a200a42083703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a41f000200a41800b6a103a200c290300210f200a2903800b2110200a41800b6a41186a22114200370300200a42003703900b200a42003703880b200a42083703800b200a41800b6a200a41a00b6a1027200b4200370300200a42003703f00a200a42003703e80a200a42063703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a4100200a41800b6a103a200c2903002112200a41800b6a41106a22133502002114200a2903800b2115200a41800a6a101c200a200a2900800a3700c009200a200a2900880a3700c809200a200a2900900a3700d009200a200a2900980a3700d809200a41c0096a200a41e0096a1017200a41e0096a41086a2903002116200a41e0096a41106a3502002117200a2903e009211841c000200a41a00b6a1024200a41a00b6a41186a220b2903002119200a41a00b6a41106a290300211a200a41a00b6a41086a290300211b200a2903a00b211c200b4200370300200a42003703b00b200a42003703a80b200a42b1848285073703a00b200a41a00b6a41e001200a41800b6a1039200a41a0096a41186a2011290300370300200a20132903003703b009200a200c2903003703a809200a200a2903800b3703a009201ca7220c200a41a0096a1022200b4200370300200a20173703b00b200a20163703a80b200a20183703a00b200c41046a200a41a00b6a102210322116200a4180096a41186a4200370300200a201437039009200a201237038809200a201537038009200a4180096a200a41e0086a1018200a200a2900e0083700c008200a200a2900e8083700c808200a200a2900f0083700d008200a200a2900f8083700d808024002402016200a41c0086a200c4124200c412010300d0041c000200a41a00b6a1024200a2802a00b220c41001034102e200c1034101e0c010b0240024010344120490d00201c201b201a2019422042004200420010440c010b201c201b201a20191034220bad4200420042001044200b411f4b0d0041004100101e0b200c200a41a00b6a1024200a41b80b6a2903002115200a41b00b6a2903002114200a41a80b6a2903002112200a2903a00b211c0b200d42ffffffffffff3f83211d200941606a220c22092400200c41186a2015370300200c2014370310200c2012370308200c201c370300200a41e00a6a41186a4200370300200a42003703f00a200a42003703e80a200a42073703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a4100200a41800b6a103a200a41800b6a41086a2213290300210d200a41800b6a41106a221e3502002112200a2903800b2114200941606a2209220b24002009101c2009290000211c200929000821152009290010211620092900182117200b41606a220b22092400200941606a2209221f24002009201737001820092016370010200920153700082009201c3700002009200b1017200b2903002115200b41086a2903002116200b41106a350200211741c000200a41a00b6a1024200a41a00b6a41086a2903002118200a41a00b6a41106a2903002119200a41a00b6a41186a2211290300211a200a2903a00b211c201f41606a2209220b2400200941186a201a37030020092019370310200920183703082009201c37030020114200370300200a42003703b00b200a42003703a80b200a42b1848285073703a00b200a41a00b6a41e001200a41800b6a103920132903002118201e2903002119200a41800b6a41186a290300211a200a2903800b211b200b41606a220b221e2400200b41186a201a370300200b2019370310200b2018370308200b201b370300201ca72213200b102220114200370300200a20173703b00b200a20163703a80b200a20153703a00b201341046a200a41a00b6a10221032211c201e41606a220b22112400200b41186a4200370300200b2012370310200b200d370308200b2014370300201141606a2211221e2400200b201110182011290000210d201129000821122011290010211420112900182115201e41606a220b221e2400200b2015370018200b2014370010200b2012370008200b200d37000002400240201c200b201341242013412010300d0041c000200a41a00b6a1024200a2802a00b220941001034102e20091034101e0c010b0240024010344120490d002009290300221c200941086a290300200941106a290300200941186a29030042204200420042001044201ca721090c010b1034210b2009290300221c200941086a290300200941106a290300200941186a290300200bad4200420042001044201ca72109200b411f4b0d0041004100101e0b2009200a41a00b6a1024200a41b80b6a2903002120200a41b00b6a2903002121200a41a80b6a2903002122200a2903a00b21230b200f42ffffffffffff3f8321240240200c2903002225200e5a200c41086a2903002226201d5a2026201d5122091b4101200c41106a2903002227200c41186a290300222884501b0d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b20272025200e54220c2026201d5420091bad221c54ad210d2026201d7d210f200cad21120240202320105a202220245a2022202451220c1b41012021202084501b0d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b2027201c7d21292028200d7d212a200f20127d212b2025200e7d212c200a41a0086a200e201d4200420020102024420042001066200a41a0086a41186a290300212d200a41a0086a41106a290300212e200a41a0086a41086a290300212f200a2903a0082130200a41e00a6a41186a4200370300200a42003703f00a200a42003703e80a200a42003703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a4100200a41800b6a103a2021202320105422092022202454200c1bad221c7d213120202021201c54ad7d2132202220247d2009ad7d2133202320107d213402400240200a2903800b2235200a41800b6a41106a290300223684200a41800b6a41086a2903002237200a41800b6a41186a29030022388484500d00200a41f0076a202c4200203542001016200a41e0076a202b4200203542001016200a4180086a202c4200203742001016200a4190086a202b4200203742001016200a41a0076a20352037420042001016200a41b0076a202c202b420042001016200a41f0066a202b4200203642001016200a4190076a20384200202c42001016200a41d0076a20364200202c42001016200a41e0066a20374200202942001016200a4180076a202a4200203542001016200a41c0076a20294200203542001016200a2903f007211a02402029202a844200522036203884223942005271202a420052203742005271200a2903880742005272200a2903e80642005272200a41c0076a41086a290300221c200a29038007200a2903e0067c7c2212201c5472722038420052202b42005271200a2903980742005272200a2903f80642005272200a41d0076a41086a290300221c200a29039007200a2903f0067c7c2214201c547272200a290390082215200a41e0076a41086a290300200a2903e007221c200a41f0076a41086a2903007c220d201c54ad7c2216200a4180086a41086a290300200a29038008221c200d7c220f201c54ad7c7c22177c221c200a2903b0072218200a2903a0077c221b7c220d200a2903c007223a200a2903d0077c223b7c2219200d54220c200a4190086a41086a2903002017201654ad7c201c201554ad7c200a41b0076a41086a290300200a41a0076a41086a2903007c201b201854ad7c7c200d201c54ad7c220d201220147c203b203a54ad7c7c200cad7c221c200d54201c200d511b72410171450d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b0240200e201d84220d4200520d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42123703800b4104200a41800b6a102241004124101e0b4200201c200d50201a201984200f201c848450724200201d79200e7942c0007c201d4200521b22124280017c220d201c7920197942c0007c201c4200521b200f79201a7942c0007c200f4200521b22144280017c22152019201c84420052220c1b2216542209200d201254ad221242002015201454ad200c1b22145420122014511b220cad7d223b4200524200200c410047ad7d223a420052203a501b200d20167d221b42ff0156201220147d2009ad7d22184200522018501b200c1b72220c1b213c42002019200c1b213d4200200f200c1b213e4200201a200c1b213f0240200c0d00201b42ff0185203b842018203a8484500d00200a41a0066a41286a200f370000200a41c0066a220c201a37000042002140200a41a0066a41186a4200370000200a41a0066a41306a2019370000200a41a0066a41386a201c370000200a42003700b006200a42003700a806200a42003700a006200c41ff01201ba76b2209410376411f716b220c41086a290000221220094107712209ad220d86200c29000022164201882009413f73ad221588842114200c41186a290000200d86200c41106a29000022414201882015888421172041200d8620124201882009417f73413f71ad888421152016200d86211602400240201b42017c2212203b2012201b54220c2018200cad7c220d2018542012201b5a1bad7c221884200d203a2018203b54ad7c2242848450450d004200213e4200211c4200210d0c010b4200213e200a41e0056a41386a4200370000200a41e0056a41306a4200370000200a41e0056a41286a4200370000200a41e0056a41186a201c370000200a420037008006200a201a3700e005200a200f3700e805200a20193700f005200e427f7c223c200e54220c201d200cad7c427f7c2241201d542041201d511bad221c427f7c2243201c54ad427f7c213d200a41e0056a2012a72209410376411f716a220c41106a290000220f2012420783221c88200c41186a290000223a42018620094107712209413f73ad221b86842119200c41086a290000223b201c88200f4201862009417f73413f71ad8684211a200c290000201c88203b420186201b8684211b203a201c8821444200214503402019420186201a423f8884220f201b4201862017423f8884223a203d20444201862019423f888422447d2043200f54ad7d2043200f7d203c203a542041201a420186201b423f8884221c542041201c511bad54ad7d423f87223b200e83221b54220c201c203b201d83221a54201c201a511bad22467d21192044200f204654ad7d2144201c201a7d200cad7d211a203a201b7d211b200d2012427f7c220f201254220cad7c427f7c221c200d512109201c200d54210b2018427f7c223a20185421112016423f8821462014423f882147420020174201862015423f888484211720452016420186842116203b42018322402145200f2112201c210d203a200c200b20091bad7c223b2118420020462014420186848422462114420020472015420186848422472115200f203b84201c20422011ad7c203b203a54ad7c427f7c2242848450450d000b4200211c4200210d20462114204721150b203e20144201862016423f888484213e201c20154201862014423f888484213d200d20174201862015423f888484213c2040201642018684213f0b200a41b0056a20344200203542001016200a41a0056a20334200203542001016200a41c0056a20344200203742001016200a41d0056a20334200203742001016200a41e0046a20352037420042001016200a41f0046a20342033420042001016200a41b0046a20334200203642001016200a41d0046a20384200203442001016200a4190056a20364200203442001016200a41a0046a20374200203142001016200a41c0046a20324200203542001016200a4180056a20314200203542001016200a2903b005211a024020312032844200522039420052712032420052203742005271200a2903c80442005272200a2903a80442005272200a4180056a41086a290300221c200a2903c004200a2903a0047c7c2212201c5472722038420052203342005271200a2903d80442005272200a2903b80442005272200a4190056a41086a290300221c200a2903d004200a2903b0047c7c2214201c547272200a2903d0052215200a41a0056a41086a290300200a2903a005221c200a41b0056a41086a2903007c220d201c54ad7c2216200a41c0056a41086a290300200a2903c005221c200d7c220f201c54ad7c7c22177c221c200a2903f0042218200a2903e0047c221b7c220d200a29038005223a200a290390057c223b7c2219200d54220c200a41d0056a41086a2903002017201654ad7c201c201554ad7c200a41f0046a41086a290300200a41e0046a41086a2903007c201b201854ad7c7c200d201c54ad7c220d201220147c203b203a54ad7c7c200cad7c221c200d54201c200d511b72410171450d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b02402010202484220d4200520d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42123703800b4104200a41800b6a102241004124101e0b4200201c200d50201a201984200f201c84845072420020247920107942c0007c20244200521b22124280017c220d201c7920197942c0007c201c4200521b200f79201a7942c0007c200f4200521b22144280017c22152019201c84420052220c1b2216542209200d201254ad221242002015201454ad200c1b22145420122014511b220cad7d22414200524200200c410047ad7d223b420052203b501b200d20167d223a42ff0156201220147d2009ad7d221b420052201b501b200c1b72220c1b211242002019200c1b21144200200f200c1b21184200201a200c1b210d0240200c0d00203a42ff0185204184201b203b8484500d00200a41e0036a41286a200f370000200a4180046a220c201a37000042002135200a41e0036a41186a4200370000200a41e0036a41306a2019370000200a41e0036a41386a201c370000200a42003700f003200a42003700e803200a42003700e003200c41ff01203aa76b2209410376411f716b220c41086a290000221220094107712209ad220d86200c29000022164201882009413f73ad221588842114200c41186a290000200d86200c41106a29000022184201882015888421172018200d8620124201882009417f73413f71ad888421152016200d86211602400240203a42017c221220412012203a54220c201b200cad7c220d201b542012203a5a1bad7c221884200d203b2018204154ad7c22428484500d0042002136200a41a0036a41386a4200370000200a41a0036a41306a4200370000200a41a0036a41286a4200370000200a41a0036a41186a201c370000200a42003700c003200a201a3700a003200a200f3700a803200a20193700b0032010427f7c2237201054220c2024200cad7c427f7c224120245420412024511bad221c427f7c2243201c54ad427f7c2140200a41a0036a2012a72209410376411f716a220c41106a290000220f2012420783221c88200c41186a290000223a42018620094107712209413f73ad221b86842119200c41086a290000223b201c88200f4201862009417f73413f71ad8684211a200c290000201c88203b420186201b8684211b203a201c8821444200214503402019420186201a423f8884220f201b4201862017423f8884223a204020444201862019423f888422447d2043200f54ad7d2043200f7d2037203a542041201a420186201b423f8884221c542041201c511bad54ad7d423f87223b201083221b54220c201c203b202483221a54201c201a511bad22467d21192044200f204654ad7d2144201c201a7d200cad7d211a203a201b7d211b200d2012427f7c220f201254220cad7c427f7c221c200d512109201c200d54210b2018427f7c223a20185421112016423f8821462014423f882147420020174201862015423f888484211720452016420186842116203b42018322352145200f2112201c210d203a200c200b20091bad7c223b2118420020462014420186848422462114420020472015420186848422472115200f203b84201c20422011ad7c203b203a54ad7c427f7c2242848450450d000b4200211c4200210d20462114204721150c010b420021364200211c4200210d0b203620144201862016423f8884842118201c20154201862014423f8884842114200d20174201862015423f88848421122035201642018684210d0b203f200d203f200d541b203f200d203e20185422091b203e2018511b203f200d203d201454220b203c201254220c203c20125122111b22131b203d201485203c2012858450221f1b210d203d2014200b1b203d2014200c1b20111b210f203e201820091b203e201820131b201f1b211c203c2012200c1b21120c010b200a41f0026a202c4200203442001016200a41e0026a202b4200203442001016200a4180036a202c4200203342001016200a4190036a202b4200203342001016200a41a0026a20342033420042001016200a41b0026a202c202b420042001016200a41f0016a202b4200203142001016200a4190026a20324200202c42001016200a41d0026a20314200202c42001016200a41e0016a20334200202942001016200a4180026a202a4200203442001016200a41c0026a20294200203442001016200a2903f002214802402029202a84420052203120328442005271202a420052203342005271200a2903880242005272200a2903e80142005272200a41c0026a41086a290300221c200a29038002200a2903e0017c7c220f201c5472722032420052202b42005271200a2903980242005272200a2903f80142005272200a41d0026a41086a290300221c200a29039002200a2903f0017c7c2212201c547272200a290390032214200a41e0026a41086a290300200a2903e002221c200a41f0026a41086a2903007c220d201c54ad7c2215200a4180036a41086a290300200a29038003221c200d7c223f201c54ad7c7c22167c221c200a2903b0022217200a2903a0027c22187c220d200a2903c0022219200a2903d0027c221a7c2239200d54220c200a4190036a41086a2903002016201554ad7c201c201454ad7c200a41b0026a41086a290300200a41a0026a41086a2903007c2018201754ad7c7c200d201c54ad7c221c200f20127c201a201954ad7c7c200cad7c223e201c54203e201c511b72410171450d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b420021400240024002402048420356203f420052203f501b2039420052203e420052203e501b2039203e84501b0d002048203984203f203e8484420052ad213d4200213c420021370c010b024002402048420188203f423f8684221c42017c221520485a203f4201882039423f8684220f2015201c54220cad7c220d203f5a200d203f511b2039420188203e423f86842212200c200d200f542015201c5a1bad7c220f20395a203e420188200f201254ad7c221c203e5a201c203e511b200f203985201c203e8584501b450d002048213d203f21402039213c203e21370c010b200a41a0016a41286a211f200a41c0016a2113200a41a0016a41306a2149200a41a0016a41386a214a034002402015223d200f223c84200d2240201c22378484221c4200520d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42123703800b4104200a41800b6a102241004124101e0b4200203e201c502048203984203f203e848450724200203779203c7942c0007c20374200521b204079203d7942c0007c20404200521b221c4280017c220d203c203784420052220c1b220f203e7920397942c0007c203e4200521b203f7920487942c0007c203f4200521b22124280017c22142039203e8442005222091b221554220b4200200d201c54ad200c1b221c42002014201254ad20091b220d54201c200d511b220cad7d223a4200524200200c410047ad7d221b420052201b501b200f20157d221a42ff0156201c200d7d200bad7d22194200522019501b200c1b72220c1b211c42002039200c1b210d4200203f200c1b210f42002048200c1b21120240200c0d00201a42ff0185203a842019201b8484500d00201f203f3700002013204837000042002135200a41a0016a41186a420037000020492039370000204a203e370000200a42003700b001200a42003700a801200a42003700a001201341ff01201aa76b2209410376411f716b220c41086a290000220d20094107712209ad221c86200c290000220f4201882009413f73ad221288842115200c41186a290000201c86200c41106a29000022144201882012888421182014201c86200d4201882009417f73413f71ad88842116200f201c86211702400240201a42017c2214203a2014201a54220c2019200cad7c220f2019542014201a5a1bad7c221984200f201b2019203a54ad7c22428484500d004200214b200a41e0006a41386a4200370000200a41e0006a41306a4200370000200a41e0006a41286a4200370000200a41e0006a41186a203e370000200a420037008001200a2048370060200a203f370068200a2039370070200a41e0006a2014a72209410376411f716a220c41106a290000220d2014420783221c88200c41186a290000221242018620094107712209413f73ad223a8684211a200c41086a290000223b201c88200d4201862009417f73413f71ad8684211b200c290000201c88203b420186203a8684213a2037203c427f7c220d203c54ad7c200d203d427f7c2236203d54220c2040200cad7c427f7c224120405420412040511bad7c2243200d54ad7c427f7c21382012201c882144420021450340201a420186201b423f8884221220382044420186201a423f888422447d2043201254ad7d204320127d2036203a4201862018423f8884223b542041201b420186203a423f8884221c542041201c511bad54ad7d423f87220d203c83223a7d2246203b200d203d83224754220c201c200d204083221b54201c201b511bad22357d211a2044200d2037837d2012203a54ad7d2046203554ad7d2144201c201b7d200cad7d211b203b20477d213a200f2014427f7c2212201454220cad7c427f7c221c200f512109201c200f54210b2019427f7c223b20195421112017423f8821462015423f882147420020184201862016423f888484211820452017420186842117200d4201832235214520122114201c210f203b200c200b20091bad7c220d21194200204620154201868484224621154200204720164201868484224721162012200d84201c20422011ad7c200d203b54ad7c427f7c2242848450450d000b4200211c4200211220462115204721160c010b4200214b4200211c420021120b204b20154201862017423f888484210f201c20164201862015423f888484210d201220184201862016423f888484211c203520174201868421120b02402012203d7c221520125a200f20407c2015201254220cad7c2212200f5a2012200f5122091b200d203c7c2214200c2012200f5420091bad7c220f200d5a201c20377c2014200d54ad7c200f201454ad7c2214201c5a2014201c511b200f200d852014201c8584501b0d00200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b20154201882012423f86842215203d542012420188200f423f8684220d204054200d2040511b200f4201882014423f8684220f203c542014420188221c203754201c2037511b200f203c85201c20378584501b0d000b0b203d42e7075620404200522040501b203c42005220374200522037501b203c203784501b0d010b200a41a00b6a41186a428080808090ee9ea4ce00370300200a42003703b00b200a42003703a80b200a42003703a00b4100200a41a00b6a1022200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a42113703800b4104200a41800b6a102241004124101e0b420042004200420042e80742004200420010672037203c427f7c2212203c54ad7c2012203d4298787c220d203d54220c2040200cad7c427f7c221c204054201c2040511bad7c220f201254ad7c427f7c21120b200d200f84201c20128484420052ad42004200420010652005200620072008200d201c200f2012106720252026202720282023202220212020200e201d420042002010202442004200106302402030202e84202f202d8484500d00200a41e00a6a41186a220c4200370300200a42003703f00a200a42003703e80a200a42083703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a4100200a41800b6a103a200a41800b6a41086a22092903002117200a2903800b2114200c4200370300200a42003703f00a200a42003703e80a200a42083703e00a200a41e00a6a200a41a00b6a1027200a41a00b6a41f000200a41800b6a103a200a41c0006a200a2903800b22154200201442001016200a41206a200929030042ffffffffffff3f8322164200201442001016200a41306a20154200201742ffffffffffff3f83221742001016200a41106a20164200201742001016200a41d0006a20142017420042001016200a20152016420042001016200a41800b6a41186a4200370300200a42003703900b200a42003703880b200a420b3703800b200a41c0006a41086a2903002116200a2903202114200a41206a41086a2903002117200a2903302115200a41800b6a200a41e00a6a1027200a2015201420167c22167c22183703a80b200a41106a41086a2903002119200a41d0006a41086a290300211a200a41086a290300211b200a200a290310223a20172016201454ad7c2216200a41306a41086a2903002018201554ad7c7c22157c2214200a2903002217200a2903507c22187c223b3703b00b200a41a00b6a41186a20192015201654ad7c2014203a54ad7c201b201a7c2018201754ad7c7c203b201454ad7c370300200a200a2903403703a00b200a41a00b6a4100200a41a00a6a1039200a41c00a6a41186a4200370300200a42003703d00a200a42003703c80a200a420b3703c00a200a41c00a6a200a41a00a6a10260b201e41606a220c22092400200c101b200c2900002114200c2900082115200c2900102116200c2900182117200941606a2209220c2400200c41606a220c220b2400200c2017370018200c2016370010200c2015370008200c2014370000200c2009101720092903002114200941086a2903002115200941106a350200211641c000200a41a00b6a1024200a2802a00b2111200a41a00b6a41186a220c202a370300200a20293703b00b200a202b3703a80b200a202c3703a00b2011200a41a00b6a1022200c2032370300200a20313703b00b200a20333703a80b200a20343703a00b201141206a200a41a00b6a1022200b41606a220c22092400200c41186a42f5a0b5c5fceba690cc00370300200c42eacaaec490dcf8898f7f370310200c42efdff1d090edff86d600370308200c42cfb8889cc0e9d39c26370300200941606a2209220b2400200c200910182009290000211720092900082118200929001021192009290018211a200b41606a220c22092400200c201a370018200c2019370010200c2018370008200c2017370000200941606a2209220b2400200941186a4200370300200920163703102009201537030820092014370300200b41606a220b221324002009200b1018200b2900002114200b2900082115200b2900102116200b2900182117201341606a2209240020092017370018200920163700102009201537000820092014370000201141c000200c2009102b2000200f3703102000201c3703082000200d370300200041186a2012370300200a41c00b6a24000bf10204017f037e017f017e230041a0016b220024000240101d450d0041004100101e0b0240101a41234b0d0041004100101e0b410420004180016a101920004188016a290300210120002903800121020240410020004190016a290300220342808080801054410020004180016a41186a22042903002205501b200342808080801085200584501b0d0041004100101e0b20044200370300200020013703880120002002370380012000200342ffffffff0f8337039001410020004180016a1022200041e0006a41186a42003703002000420037037020004200370368200042013703604120200041e0006a1022410041c000200041206a1028200020002900203700002000200029002837000820002000290030370010200020002900383700182000200041c0006a1017200041c0006a200041e0006a1027200041e0006a410020004180016a103a41c000200041e0006a10242000280260220420004180016a1022200441201029200041a0016a24000bf10204017f037e017f017e230041a0016b220024000240101d450d0041004100101e0b0240101a41234b0d0041004100101e0b410420004180016a101920004188016a290300210120002903800121020240410020004190016a290300220342808080801054410020004180016a41186a22042903002205501b200342808080801085200584501b0d0041004100101e0b20044200370300200020013703880120002002370380012000200342ffffffff0f8337039001410020004180016a1022200041e0006a41186a42003703002000420037037020004200370368200042043703604120200041e0006a1022410041c000200041206a1028200020002900203700002000200029002837000820002000290030370010200020002900383700182000200041c0006a1017200041c0006a200041e0006a1027200041e0006a410020004180016a103a41c000200041e0006a10242000280260220420004180016a1022200441201029200041a0016a24000b8c0606017f037e017f017e027f047e230041e0016b220024000240101d450d0041004100101e0b0240101a41234b0d0041004100101e0b4104200041c0016a1019200041c0016a41086a290300210120002903c001210202404100200041c0016a41106a2903002203428080808010544100200041c0016a41186a22042903002205501b200342808080801085200584501b0d0041004100101e0b20004180016a41186a4200370300200042003703900120004200370388012000420c3703800120004180016a200041c0016a1027200041c0016a4100200041a0016a103a20002903a001420185200041a0016a41106a29030084200041a0016a41086a290300200041a0016a41186a2206290300848450ad420042004200104220064200370300200042003703b001200042003703a8012000420c3703a001200041a0016a20004180016a102720044200370300200042003703d001200042003703c801200042003703c001200041c0016a4100200041c0006a1039200041e0006a41186a2207420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a102620002003200320032003200320032003200320022001200320051052200041286a2903002103200041306a2903002105200041386a2903002101200041086a2903002102200041106a2903002108200041186a29030021092000290320210a2000290300210b20064200370300200042003703b001200042003703a8012000420c3703a001200041a0016a20004180016a102720044200370300200042003703d001200042003703c801200042013703c001200041c0016a4100200041c0006a10392007420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a102641c000200041c0016a102420002802c001210620042009370300200020083703d001200020023703c8012000200b3703c0012006200041c0016a102220042001370300200020053703d001200020033703c8012000200a3703c001200641206a200041c0016a1022200641c0001029200041e0016a24000bfb4f0a047f047e017f017e017f0e7e027f047e037f237e23004180096b220d2400200d220e41a0086a41186a220f4200370300200e42003703b008200e42003703a808200e42083703a008200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a200e41c0086a41086a22102903002111200e2903c0082112200f4200370300200e42003703b008200e42003703a808200e42083703a008200e41a0086a200e41e0086a1027200e41e0086a41f000200e41c0086a103a20102903002113200e2903c0082114200e41c0086a41186a22154200370300200e42003703d008200e42003703c808200e42083703c008200e41c0086a200e41e0086a1027200f4200370300200e42003703b008200e42003703a808200e42063703a008200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a20102903002116200e41c0086a41106a22173502002118200e2903c0082119200f4200370300200e42003703b008200e42003703a808200e42073703a008200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a2010290300211a2017350200211b200e2903c008211c200e41c0076a101c200e200e2900c00737008007200e200e2900c80737008807200e200e2900d00737009007200e200e2900d80737009807200e4180076a200e41a0076a1017200e41a0076a41086a290300211d200e41a0076a41106a350200211e200e2903a007211f41c000200e41e0086a1024200e41e0086a41186a220f2903002120200e41e0086a41106a2903002121200e41e0086a41086a2903002122200e2903e0082123200f4200370300200e42003703f008200e42003703e808200e42b1848285073703e008200e41e0086a41e001200e41c0086a1039200e41e0066a41186a2015290300370300200e20172903003703f006200e20102903003703e806200e200e2903c0083703e0062023a72210200e41e0066a1022200f4200370300200e201e3703f008200e201d3703e808200e201f3703e008201041046a200e41e0086a10221032211d200e41c0066a41186a4200370300200e20183703d006200e20163703c806200e20193703c006200e41c0066a200e41a0066a1018200e200e2900a00637008006200e200e2900a80637008806200e200e2900b00637009006200e200e2900b8063700980602400240201d200e4180066a201041242010412010300d0041c000200e41e0086a1024200e2802e008221041001034102e20101034101e0c010b0240024010344120490d002023202220212020422042004200420010440c010b20232022202120201034220fad4200420042001044200f411f4b0d0041004100101e0b2010200e41e0086a1024200e41f8086a290300211f200e41f0086a290300211e200e41e8086a290300211d200e2903e00821230b201142ffffffffffff3f832124201342ffffffffffff3f832125200d41606a221522102400201541186a201f3703002015201e3703102015201d37030820152023370300201041606a2210220f24002010101c2010290000212320102900082111201029001021132010290018211d200f41606a220f22102400201041606a2210221724002010201d3700182010201337001020102011370008201020233700002010200f1017200f2903002111200f41086a2903002113200f41106a350200211d41c000200e41e0086a1024200e41e0086a41086a290300211e200e41e0086a41106a290300211f200e41e0086a41186a220d2903002120200e2903e0082123201741606a2210220f2400201041186a20203703002010201f3703102010201e37030820102023370300200d4200370300200e42003703f008200e42003703e808200e42b1848285073703e008200e41e0086a41e001200e41c0086a1039200e41c0086a41086a290300211e200e41c0086a41106a290300211f200e41c0086a41186a2903002120200e2903c0082121200f41606a220f22262400200f41186a2020370300200f201f370310200f201e370308200f20213703002023a72217200f1022200d4200370300200e201d3703f008200e20133703e808200e20113703e008201741046a200e41e0086a102210322123202641606a220f220d2400200f41186a4200370300200f201b370310200f201a370308200f201c370300200d41606a220d22262400200f200d1018200d2900002111200d2900082113200d290010211d200d290018211e202641606a220f220d2400200f201e370018200f201d370010200f2013370008200f2011370000024002402023200f201741242017412010300d0041c000200e41e0086a1024200e2802e008221041001034102e20101034101e0c010b0240024010344120490d0020102903002223201041086a290300201041106a290300201041186a290300422042004200420010442023a721100c010b1034210f20102903002223201041086a290300201041106a290300201041186a290300200fad42004200420010442023a72110200f411f4b0d0041004100101e0b2010200e41e0086a1024200e41f8086a290300211d200e41f0086a2903002113200e41e8086a2903002111200e2903e00821230b200d41606a222622102400202641186a201d370300202620133703102026201137030820262023370300201041606a2210220f24002010101c2010290000212320102900082111201029001021132010290018211d200f41606a220f22102400201041606a2210220d24002010201d3700182010201337001020102011370008201020233700002010200f1017200f2903002123200f41086a2903002111200f41106a3502002113200e41e0086a41186a22274200370300200e20133703f008200e20113703e808200e20233703e0084100200e41e0086a1022200e41c0086a41186a22104200370300200e42003703d008200e42003703c808200e42013703c0084120200e41c0086a1022410041c000200e4180086a1028200e200e290080083700e007200e200e290088083700e807200e200e290090083700f007200e200e290098083700f807200e41e0076a200e41a0086a1017200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a200e41c0086a41086a220f2903002128200e41c0086a41106a221729030021292010290300212a200e2903c008212b200d41606a222c220d2400202c41186a202a370300202c2029370310202c2028370308202c202b370300200e41e0056a201220244200420020142025420042001066200e41e0056a41086a2903002123200e41e0056a41106a2903002111200e41e0056a41186a2903002113200e2903e005211d200d41606a222d222e2400202d41186a2013370300202d2011370310202d2023370308202d201d370300200e41a0086a41186a4200370300200e42003703b008200e42003703a808200e42003703a008200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a2010290300211e2017290300212f200f2903002130200e2903c0082131200e4180056a202b42002015290300222342001016200e41f0046a20284200202342001016200e4190056a202b4200201541086a290300221142001016200e41a0056a20284200201142001016200e41b0056a202b2028420042001016200e41c0056a20232011420042001016200e41d0046a20284200201541106a290300221342001016200e41c0046a201541186a290300221d4200202b42001016200e41d0056a20134200202b42001016200e41a0046a20114200202942001016200e41b0046a202a4200202342001016200e41e0046a20294200202342001016200e29038005213202402029202a8422334200522013201d8442005271202a420052201142005271200e2903b80442005272200e2903a80442005272200e41e0046a41086a2903002223200e2903b004200e2903a0047c7c22132023547272201d420052202842005271200e2903c80442005272200e2903d80442005272200e41d0056a41086a2903002223200e2903c004200e2903d0047c7c221d2023547272200e2903a005221f200e41f0046a41086a290300200e2903f0042223200e4180056a41086a2903007c2211202354ad7c2220200e4190056a41086a290300200e29039005222320117c2234202354ad7c7c22217c2223200e2903b0052222200e2903c0057c22357c2211200e2903e0042236200e2903d0057c22377c2238201154220f200e41a0056a41086a2903002021202054ad7c2023201f54ad7c200e41b0056a41086a290300200e41c0056a41086a2903007c2035202254ad7c7c2011202354ad7c22232013201d7c2037203654ad7c7c200fad7c223920235420392023511b72410171450d002027428080808090ee9ea4ce00370300200e42003703f008200e42003703e808200e42003703e0084100200e41e0086a102220104200370300200e42003703d008200e42003703c808200e42113703c0084104200e41c0086a102241004124101e0b02402031202f842030201e8484223a4200520d00200e41e0086a41186a428080808090ee9ea4ce00370300200e42003703f008200e42003703e808200e42003703e0084100200e41e0086a1022200e41c0086a41186a4200370300200e42003703d008200e42003703c808200e42123703c0084104200e41c0086a102241004124101e0b42002039203a502227203220388420342039848450724200201e79223b202f79223c42c0007c201e4200521b203079223d203179223e42c0007c20304200521b22234280017c2211202f201e84223f42005222101b221f20397920387942c0007c20394200521b20347920327942c0007c20344200521b22134280017c221d2038203984420052220f1b222054220d42002011202354ad20101b22234200201d201354ad200f1b22135420232013511b2210ad7d223742005242002010410047ad7d221d420052201d501b201f20207d221142ff0156202320137d200dad7d22234200522023501b20101b7222101b21404200203820101b21414200203420101b21424200203220101b2143024020100d00201142ff01852037842023201d8484500d00200e41e0036a41286a2034370000200e4180046a2210203237000042002144200e41e0036a41186a4200370000200e41e0036a41306a2038370000200e41e0036a41386a2039370000200e42003700f003200e42003700e803200e42003700e003201041ff012011a76b220f410376411f716b221041086a290000221f200f410771220fad22138620102900002222420188200f413f73ad222188842120201041186a290000201386201041106a29000022364201882021888421352036201386201f420188200f417f73413f71ad888421212022201386212202400240201142017c221f2037201f201154221020232010ad7c2213202354201f20115a1bad7c2236842013201d2036203754ad7c2245848450450d004200214642002123420021110c010b42002146200e41a0036a41386a4200370000200e41a0036a41306a4200370000200e41a0036a41286a4200370000200e41a0036a41186a2039370000200e42003700c003200e20323700a003200e20343700a803200e20383700b003200e41a0036a201fa7220f410376411f716a221041106a2900002211201f420783222388201041186a290000221d420186200f410771220f413f73ad224786842137201041086a29000022482023882011420186200f417f73413f71ad8684214920102900002023882048420186204786842147201e202f427f7c2211202f54ad7c20112031427f7c224a203154221020302010ad7c427f7c224b203054204b2030511bad7c224c201154ad7c427f7c214d201d202388214e4200214f034020374201862049423f8884221d204d204e4201862037423f8884224e7d204c201d54ad7d204c201d7d204a20474201862035423f8884224854204b20494201862047423f8884222354204b2023511bad54ad7d423f872211202f8322477d22502048201120318322515422102023201120308322495420232049511bad22447d2137204e2011201e837d201d204754ad7d2050204454ad7d214e202320497d2010ad7d2149204820517d21472013201f427f7c221d201f542210ad7c427f7c2223201351210f2023201354210d2036427f7c224820365421172022423f8821502020423f882151420020354201862021423f8884842135204f202242018684212220114201832244214f201d211f2023211320482010200d200f1bad7c22112136420020502020420186848422502120420020512021420186848422512121201d201184202320452017ad7c2011204854ad7c427f7c2245848450450d000b420021234200211120502120205121210b204620204201862022423f8884842142202320214201862020423f8884842141201120354201862021423f8884842140204420224201868421430b200e41f0026a202b42002026290300222342001016200e41e0026a20284200202342001016200e4180036a202b4200202641086a290300221142001016200e4190036a20284200201142001016200e41b0026a202b2028420042001016200e41a0026a20232011420042001016200e41f0016a20284200202641106a290300221342001016200e41e0016a202641186a290300221d4200202b42001016200e41d0026a20134200202b42001016200e4180026a20114200202942001016200e4190026a202a4200202342001016200e41c0026a20294200202342001016200e2903f0022146024020334200522013201d8442005271202a420052201142005271200e2903980242005272200e2903880242005272200e41c0026a41086a2903002223200e29039002200e290380027c7c22132023547272201d420052202842005271200e2903e80142005272200e2903f80142005272200e41d0026a41086a2903002223200e2903e001200e2903f0017c7c221d2023547272200e29039003221f200e41e0026a41086a290300200e2903e0022223200e41f0026a41086a2903007c2211202354ad7c2220200e4180036a41086a290300200e29038003222320117c224d202354ad7c7c22217c2223200e2903b0022222200e2903a0027c22357c2211200e2903c0022236200e2903d0027c22377c22292011542210200e4190036a41086a2903002021202054ad7c2023201f54ad7c200e41b0026a41086a290300200e41a0026a41086a2903007c2035202254ad7c7c2011202354ad7c22232013201d7c2037203654ad7c7c2010ad7c222820235420282023511b72410171450d00200e41e0086a41186a428080808090ee9ea4ce00370300200e42003703f008200e42003703e808200e42003703e0084100200e41e0086a1022200e41c0086a41186a4200370300200e42003703d008200e42003703c808200e42113703c0084104200e41c0086a102241004124101e0b0240203a4200520d00200e41e0086a41186a428080808090ee9ea4ce00370300200e42003703f008200e42003703e808200e42003703e0084100200e41e0086a1022200e41c0086a41186a4200370300200e42003703d008200e42003703c808200e42123703c0084104200e41c0086a102241004124101e0b4200202820272046202984204d2028848450724200203b203c42c0007c201e4200521b203d203e42c0007c20304200521b22234280017c2211203f42005222101b221320287920297942c0007c20284200521b204d7920467942c0007c204d4200521b221d4280017c221f2029202884420052220f1b222054220d42002011202354ad20101b22234200201f201d54ad200f1b22115420232011511b2210ad7d224742005242002010410047ad7d22494200522049501b201320207d223742ff0156202320117d200dad7d22364200522036501b20101b7222101b21234200202920101b21114200204d20101b21134200204620101b211d024020100d00203742ff0185204784203620498484500d00200e41a0016a41286a204d370000200e41c0016a2210204637000042002144200e41a0016a41186a4200370000200e41a0016a41306a2029370000200e41a0016a41386a2028370000200e42003700b001200e42003700a801200e42003700a001201041ff012037a76b220f410376411f716b221041086a2900002211200f410771220fad22238620102900002213420188200f413f73ad221d88842120201041186a290000202386201041106a290000221f420188201d88842135201f2023862011420188200f417f73413f71ad888421212013202386212202400240203742017c221f2047201f203754221020362010ad7c2213203654201f20375a1bad7c223684201320492036204754ad7c22458484500d004200212a200e41e0006a41386a4200370000200e41e0006a41306a4200370000200e41e0006a41286a4200370000200e41e0006a41186a2028370000200e420037008001200e2046370060200e204d370068200e2029370070200e41e0006a201fa7220f410376411f716a221041106a2900002211201f420783222388201041186a290000221d420186200f410771220f413f73ad224786842137201041086a29000022482023882011420186200f417f73413f71ad8684214920102900002023882048420186204786842147201e202f427f7c2211202f54ad7c20112031427f7c222b203154221020302010ad7c427f7c224b203054204b2030511bad7c224c201154ad7c427f7c214a201d202388214e4200214f034020374201862049423f8884221d204a204e4201862037423f8884224e7d204c201d54ad7d204c201d7d202b20474201862035423f8884224854204b20494201862047423f8884222354204b2023511bad54ad7d423f872211202f8322477d22502048201120318322515422102023201120308322495420232049511bad22447d2137204e2011201e837d201d204754ad7d2050204454ad7d214e202320497d2010ad7d2149204820517d21472013201f427f7c221d201f542210ad7c427f7c2223201351210f2023201354210d2036427f7c224820365421172022423f8821502020423f882151420020354201862021423f8884842135204f202242018684212220114201832244214f201d211f2023211320482010200d200f1bad7c22112136420020502020420186848422502120420020512021420186848422512121201d201184202320452017ad7c2011204854ad7c427f7c2245848450450d000b420021234200211d20502120205121210c010b4200212a420021234200211d0b202a20204201862022423f8884842113202320214201862020423f8884842111201d20354201862021423f88848421232044202242018684211d0b2031203258203020345820302034511b202f203858201e203958201e2039511b202f203885201e20398584501b20312046582030204d582030204d511b202f202958201e202858201e2028511b202f202985201e20288584501b71ad4200420042001068202e41606a2210220f24002010101c2010290000211e2010290008211f2010290010212020102900182121200f41606a220f22102400201041606a2210220d240020102021370018201020203700102010201f3700082010201e3700002010200f1017200f290300200f41086a290300200f41106a3502004200202c290300202c41086a290300202c41106a290300202c41186a290300106920192016201842002009200a200b200c20432042204120401062201c201a201b42002009200a200b200c201d2013201120231062200d41606a2210220f24002010101c2010290000211e2010290008211f2010290010212020102900182121200f41606a220f22102400201041606a22102217240020102021370018201020203700102010201f3700082010201e3700002010200f1017200f290300211f200f41086a2903002120200f41106a350200212141c000200e41e0086a1024200e41e0086a41086a2903002122200e41e0086a41106a2903002135200e41e0086a41186a220d2903002136200e2903e008211e201741606a2210220f2400201041186a203637030020102035370310201020223703082010201e370300200d4200370300200e42003703f008200e42003703e808200e42b1848285073703e008200e41e0086a41e001200e41c0086a1039200e41c0086a41086a2903002122200e41c0086a41106a2903002135200e41c0086a41186a2903002136200e2903c0082130200f41606a220f222c2400200f41186a2036370300200f2035370310200f2022370308200f2030370300201ea72217200f1022200d4200370300200e20213703f008200e20203703e808200e201f3703e008201741046a200e41e0086a10221032211e202c41606a220f220d2400200f41186a4200370300200f2018370310200f2016370308200f2019370300200d41606a220d222c2400200f200d1018200d290000211f200d2900082120200d2900102121200d2900182122202c41606a220f220d2400200f2022370018200f2021370010200f2020370008200f201f37000002400240201e200f201741242017412010300d0041c000200e41e0086a1024200e2802e008221041001034102e20101034101e0c010b0240024010344120490d002010290300221e201041086a290300201041106a290300201041186a29030042204200420042001044201ea721100c010b1034210f2010290300221e201041086a290300201041106a290300201041186a290300200fad4200420042001044201ea72110200f411f4b0d0041004100101e0b2010200e41e0086a1024200e41f8086a2903002121200e41f0086a2903002120200e41e8086a290300211f200e2903e008211e0b2015201e3703002015201f37030820152020370310201541186a2021370300200d41606a2210220f24002010101c2010290000211e2010290008211f2010290010212020102900182121200f41606a220f22102400201041606a22102217240020102021370018201020203700102010201f3700082010201e3700002010200f1017200f290300211f200f41086a2903002120200f41106a350200212141c000200e41e0086a1024200e41e0086a41086a2903002122200e41e0086a41106a2903002135200e41e0086a41186a220d2903002136200e2903e008211e201741606a2210220f2400201041186a203637030020102035370310201020223703082010201e370300200d4200370300200e42003703f008200e42003703e808200e42b1848285073703e008200e41e0086a41e001200e41c0086a1039200e41c0086a41086a2903002122200e41c0086a41106a2903002135200e41c0086a41186a2903002136200e2903c0082130200f41606a220f222c2400200f41186a2036370300200f2035370310200f2022370308200f2030370300201ea72217200f1022200d4200370300200e20213703f008200e20203703e808200e201f3703e008201741046a200e41e0086a10221032211e202c41606a220f220d2400200f41186a4200370300200f201b370310200f201a370308200f201c370300200d41606a220d222c2400200f200d1018200d290000211f200d2900082120200d2900102121200d2900182122202c41606a220f220d2400200f2022370018200f2021370010200f2020370008200f201f37000002400240201e200f201741242017412010300d0041c000200e41e0086a1024200e2802e008221041001034102e20101034101e0c010b0240024010344120490d002010290300221e201041086a290300201041106a290300201041186a29030042204200420042001044201ea721100c010b1034210f2010290300221e201041086a290300201041106a290300201041186a290300200fad4200420042001044201ea72110200f411f4b0d0041004100101e0b2010200e41e0086a1024200e41f8086a2903002121200e41f0086a2903002120200e41e8086a290300211f200e2903e008211e0b2026201e3703002026201f37030820262020370310202641186a20213703002015290300201541086a290300201541106a290300201541186a290300201e201f202020212012202442004200201420254200420010630240202d290300202d41106a29030084202d41086a290300202d41186a2903008484500d00200e41a0086a41186a22104200370300200e42003703b008200e42003703a808200e42083703a008200e41a0086a200e41e0086a1027200e41e0086a4100200e41c0086a103a200e41c0086a41086a220f2903002121200e2903c008211e20104200370300200e42003703b008200e42003703a808200e42083703a008200e41a0086a200e41e0086a1027200e41e0086a41f000200e41c0086a103a200e41c0006a200e2903c008221f4200201e42001016200e41206a200f29030042ffffffffffff3f8322204200201e42001016200e41306a201f4200202142ffffffffffff3f83222142001016200e41106a20204200202142001016200e41d0006a201e2021420042001016200e201f2020420042001016200e41c0086a41186a4200370300200e42003703d008200e42003703c808200e420b3703c008200e41c0006a41086a2903002120200e290320211e200e41206a41086a2903002121200e290330211f200e41c0086a200e41a0086a1027200e201f201e20207c22207c22223703e808200e41106a41086a2903002135200e41d0006a41086a2903002136200e41086a2903002130200e200e290310223720212020201e54ad7c2220200e41306a41086a2903002022201f54ad7c7c221f7c221e200e2903002221200e2903507c22227c22493703f008200e41e0086a41186a2035201f202054ad7c201e203754ad7c203020367c2022202154ad7c7c2049201e54ad7c370300200e200e2903403703e008200e41e0086a4100200e41e0076a1039200e4180086a41186a4200370300200e420037039008200e420037038808200e420b37038008200e4180086a200e41e0076a10260b200d41606a2210220f24002010101b2010290000211e2010290008211f2010290010212020102900182121200f41606a220f22102400201041606a2210220d240020102021370018201020203700102010201f3700082010201e3700002010200f1017200f290300211e200f41086a290300211f200f41106a350200212041c000200e41e0086a1024200e2802e0082115200e41e0086a41186a22102040370300200e20413703f008200e20423703e808200e20433703e0082015200e41e0086a102220102023370300200e20113703f008200e20133703e808200e201d3703e008201541206a200e41e0086a1022200d41606a2210220f2400201041186a4281a5c9d8f0a5d0e65c370300201042ccc4ccdcb0a6ffd89c7f370310201042f7e9cfdd92d18493a47f37030820104296c9cd8cd8cddbcb897f370300200f41606a220f220d24002010200f1018200f2900002121200f2900082122200f2900102135200f2900182136200d41606a2210220f240020102036370018201020353700102010202237000820102021370000200f41606a220f220d2400200f41186a4200370300200f2020370310200f201f370308200f201e370300200d41606a220d22172400200f200d1018200d290000211e200d290008211f200d2900102120200d2900182121201741606a220f220d2400200f2021370018200f2020370010200f201f370008200f201e370000200d41606a220d22172400200d41186a4200370300200d200b42ffffffff0f83370310200d200a370308200d2009370300201741606a221722262400200d201710182017290000211e2017290008211f2017290010212020172900182121202641606a220d2400200d2021370018200d2020370010200d201f370008200d201e370000201541c0002010200f200d102c2000201d370320200020413703102000204237030820002043370300200041386a2023370300200041306a2011370300200041286a2013370300200041186a2040370300200e4180096a24000be90204047f017e017f037e230041e0006b220024000240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004206420042004200104520002802002101200041c0006a41186a2202428080c8b1d5a592a7d500370300200042003703502000420037034820004200370340200141206a2203200041c0006a102241c000200041c0006a102420002903402104200041206a41186a42003703002000420037033020004200370328200042203703202004a72205200041206a10222001200041c0006a1024200041c8006a2903002106200041d0006a29030021072000290340210820022002290300370300200020073703502000200637034820002008370340200541206a200041c0006a1022200442c0007c2204a720032008a72201102520024200370300200042003703502000420037034820004200370340200820047ca7200041c0006a102220052001411f6a41607141c0006a1029200041e0006a24000bfb0206027f027e017f017e017f057e230041e0006b220024000240101d450d0041004100101e0b0240101a41c3004b0d0041004100101e0b4104200041c0006a1019200041c0006a41086a220129030021022000290340210302404100200041c0006a41106a22042903002205428080808010544100200041c0006a41186a22062903002207501b200542808080801085200784501b0d0041004100101e0b4124200041c0006a101920062903002108200429030021092001290300210a2000290340210b200041c0006a101b200020002900403700002000200029004837000820002000290050370010200020002900583700182000200041206a10172000290320200041206a41086a290300200041206a41106a290300200041206a41186a2903002003200220052007200b200a20092008105541c000200041c0006a102420002802402101200642003703002000420037035020004200370348200042013703402001200041c0006a1022200141201029200041e0006a24000bf90d0c037f017e037f027e017f027e017f017e027f027e017f027e230041a0016b220c2400200c220d4180016a41186a220e4200370300200d200137038801200d200037038001200d200242ffffffff0f83220f370390014100200d4180016a1022200d41e0006a41186a22104200370300200d4200370370200d4200370368200d42013703604120200d41e0006a1022410041c000200d41206a1028200d200d290020370000200d200d290028370008200d200d290030370010200d200d290038370018200d200d41c0006a1017200d41c0006a41086a22112903002102200d41c0006a41106a22122903002113200d2903402114200d41c0006a41186a221520152903002216370300200d2013370350200d2002370348200d2014370340200d41c0006a200d4180016a1027200d4180016a4100200d41e0006a103a0240200d290360221720085a200d41e0006a41086a2218290300221920095a2019200951221a1b200d41e0006a41106a221b290300221c200a5a2010290300221d200b5a201d200b511b201c200a85201d200b8584501b0d00200e428080808090ee9ea4ce00370300200d420037039001200d420037038801200d4200370380014100200d4180016a102220104200370300200d4200370370200d4200370368200d42113703604104200d41e0006a102241004124101e0b20102016370300200d2014370360200d2002370368200d2013370370200d41e0006a200d41c0006a1027200e201d200b7d201c200a54ad7d201c200a7d221c2017200854221e2019200954201a1bad221d54ad7d370300200d201c201d7d37039001200d201920097d201ead7d37038801200d201720087d37038001200d4180016a4100200d1039200d41206a41186a2016370300200d2013370330200d2002370328200d2014370320200d41206a200d1026200e4200370300200d200642ffffffff0f83221f37039001200d200537038801200d2004370380014100200d4180016a102220104200370300200d4200370370200d4200370368200d42013703604120200d41e0006a1022410041c000200d41206a1028200d200d290020370000200d200d290028370008200d200d290030370010200d200d290038370018200d200d41c0006a10172011290300210220122903002113200d2903402114201520152903002206370300200d2013370350200d2002370348200d2014370340200d41c0006a200d4180016a1027200d4180016a4100200d41e0006a103a0240200d290360221c20087c2220201c5a2018290300221920097c2020201c542215ad7c221c20195a201c201951220e1b201b290300221d200a7c22172015201c201954200e1bad7c2219201d5a20102903002216200b7c2017201d54ad7c2019201754ad7c221720165a20172016511b2019201d85201720168584501b0d00200d4180016a41186a428080808090ee9ea4ce00370300200d420037039001200d420037038801200d4200370380014100200d4180016a1022200d41e0006a41186a4200370300200d4200370370200d4200370368200d42113703604104200d41e0006a102241004124101e0b200d41e0006a41186a2006370300200d2014370360200d2002370368200d2013370370200d41e0006a200d41c0006a1027200d4180016a41186a22102017370300200d201937039001200d201c37038801200d202037038001200d4180016a4100200d1039200d41206a41186a2006370300200d2013370330200d2002370328200d2014370320200d41206a200d102641c000200d4180016a1024200d2802800121112010200b370300200d200a37039001200d200937038801200d2008370380012011200d4180016a1022200c41606a221022152400201041186a429b918bdfd1d594f95d370300201042aa9bdee18f8dace1e90037031020104296c2929e96fee995957f370308201042efe78ea9dfc9d6fa28370300201541606a2215220e24002010201510182015290000210b2015290008210a2015290010210920152900182108200e41606a22102215240020102008370018201020093700102010200a3700082010200b370000201541606a2215220e2400201541186a42003703002015200f3703102015200137030820152000370300200e41606a220e220c24002015200e1018200e290000210b200e290008210a200e2900102109200e2900182108200c41606a2215220e240020152008370018201520093700102015200a3700082015200b370000200e41606a220e220c2400200e41186a4200370300200e201f370310200e2005370308200e2004370300200c41606a220c22122400200e200c1018200c290000210b200c290008210a200c2900102109200c2900182108201241606a220e2400200e2008370018200e2009370010200e200a370008200e200b3700002011412020102015200e102c200d41a0016a24000bb70405017f037e017f017e027f230041a0016b220024000240101d450d0041004100101e0b0240101a41234b0d0041004100101e0b410420004180016a101920004180016a41086a290300210120002903800121020240410020004180016a41106a290300220342808080801054410020004180016a41186a22042903002205501b200342808080801085200584501b0d0041004100101e0b200041c0006a41186a420037030020004200370350200042003703482000420c370340200041c0006a20004180016a102720004180016a4100200041e0006a103a2000290360420185200041e0006a41106a29030084200041e0006a41086a290300200041e0006a41186a2206290300848450ad42004200420010422006420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a10272004420037030020004200370390012000420037038801200042003703800120004180016a410020001039200041206a41186a2207420037030020004200370330200042003703282000420c370320200041206a20001026200220012003200510572006420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a10272004420037030020004200370390012000420037038801200042013703800120004180016a4100200010392007420037030020004200370330200042003703282000420c370320200041206a2000102641c00020004180016a102420002802800141001029200041a0016a24000bae1205047f017e017f0c7e037f230041c0026b220424002004220541e0016a41186a22064200370300200542003703f001200542003703e801200542063703e001200541e0016a200541a0026a1027200541a0026a410020054180026a103a20054180026a41086a2207290300210820054180026a41106a2209350200210a200529038002210b20064200370300200542003703f001200542003703e801200542073703e001200541e0016a200541a0026a1027200541a0026a410020054180026a103a2007290300210c2009350200210d200529038002210e200541c0016a101c200520052900c00137008001200520052900c80137008801200520052900d00137009001200520052900d8013700980120054180016a200541a0016a1017200541a0016a41086a290300210f200541a0016a41106a350200211020052903a001211141c000200541a0026a1024200541a0026a41186a22062903002112200541a0026a41106a2903002113200541a0026a41086a290300211420052903a002211520064200370300200542003703b002200542003703a802200542b1848285073703a002200541a0026a41e00120054180026a1039200541e0006a41186a20054180026a41186a290300370300200520092903003703702005200729030037036820052005290380023703602015a72209200541e0006a102220064200370300200520103703b0022005200f3703a802200520113703a002200941046a200541a0026a10221032210f200541c0006a41186a42003703002005200a370350200520083703482005200b370340200541c0006a200541206a10182005200529002037000020052005290028370008200520052900303700102005200529003837001802400240200f2005200941242009412010300d0041c000200541a0026a102420052802a002220741001034102e20071034101e200441606a2207220624000c010b200441606a220722062400024010344120490d002015201420132012422042004200420010442009200710240c010b201520142013201210342204ad420042004200104402402004411f4b0d0041004100101e0b2009200710240b200541e0016a41186a4200370300200542003703f001200542003703e801200542083703e001200541e0016a200541a0026a1027200541a0026a410020054180026a103a02402007290300221020052903800222115a200741086a290300221520054180026a41086a221629030042ffffffffffff3f83220f5a2015200f5122091b4101200741106a2903002212200741186a290300221384501b0d00200541a0026a41186a428080808090ee9ea4ce00370300200542003703b002200542003703a802200542003703a0024100200541a0026a102220054180026a41186a4200370300200542003703900220054200370388022005421137038002410420054180026a102241004124101e0b200b2008200a42002000200120022003201020117d2015200f7d20102011542207ad7d201220072015200f5420091bad22157d20132012201554ad7d1062200641606a220722092400200741186a42003703002007200d3703102007200c3703082007200e370300200941606a220922062400200941186a2003370300200920023703102009200137030820092000370300200641606a2206220424002006101c200629000021152006290008210f2006290010210320062900182102200441606a220422062400200641606a22062217240020062002370018200620033700102006200f370008200620153700002006200410172004290300210f200441086a2903002103200441106a350200210241c000200541a0026a1024200541a0026a41086a2903002101200541a0026a41106a2903002100200541a0026a41186a2218290300210820052903a0022115201741606a220622042400200641186a200837030020062000370310200620013703082006201537030020184200370300200542003703b002200542003703a802200542b1848285073703a002200541a0026a41e00120054180026a10392016290300210120054180026a41106a290300210020054180026a41186a2903002108200529038002210a200441606a220422172400200441186a200837030020042000370310200420013703082004200a3703002015a722162004102220184200370300200520023703b002200520033703a8022005200f3703a002201641046a200541a0026a102210322115201741606a220422182400200441186a42003703002004200d3703102004200c3703082004200e370300201841606a2218221724002004201810182018290000210f201829000821032018290010210220182900182101201741606a2204221824002004200137001820042002370010200420033700082004200f3700000240024020152004201641242016412010300d0041c000200541a0026a102420052802a002220641001034102e20061034101e201841606a220424000c010b201841606a22042400024010344120490d0020062903002215200641086a290300200641106a290300200641186a290300422042004200420010442015a7200410240c010b1034211820062903002215200641086a290300200641106a290300200641186a2903002018ad42004200420010442015a7210602402018411f4b0d0041004100101e0b2006200410240b200541e0016a41186a4200370300200542003703f001200542003703e801200542083703e001200541e0016a200541a0026a1027200541a0026a41f00020054180026a103a02402004290300220320052903800222025a200441086a290300221520054180026a41086a29030042ffffffffffff3f83220f5a2015200f5122061b4101200441106a2903002201200441186a290300220084501b0d00200541a0026a41186a428080808090ee9ea4ce00370300200542003703b002200542003703a802200542003703a0024100200541a0026a102220054180026a41186a4200370300200542003703900220054200370388022005421137038002410420054180026a102241004124101e0b2007290300200741086a290300200741106a290300200741186a2903002009290300200941086a290300200941106a290300200941186a290300200320027d2015200f7d20032002542207ad7d200120072015200f5420061bad22157d20002001201554ad7d1062200541c0026a24000b960602057f137e230041206b220924000240200520017d42df0156200620027d2005200154220aad7d22054200522005501b200720037d2205200a200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101e0b2001a7220a20091019200941086a220b29030021032009290300210702404100200941106a220c2903002202428080808010544100200941186a220d2903002206501b200242808080801085200684501b0d0041004100101e0b200a41206a20091019200b29030021042009290300210802404100200c2903002201428080808010544100200d2903002205501b200142808080801085200584501b0d0041004100101e0b200a41c0006a20091019200941186a220b290300210e200941106a220c290300210f200941086a220d290300211020092903002111200a41e0006a20091019200b2903002112200c2903002113200d290300211420092903002115200a4180016a20091019024020092903002216428002544100200d2903002217501b4100200c2903002218200b290300221984501b0d0041004100101e0b200a41a0016a20091019200d290300211a200c290300211b200b290300211c2009290300211d200a41c0016a20091019200d290300211e200c290300211f200b2903002120200020092903003703c0012000201d3703a0012000201637038001200020153703602000201137034020002008370320200020023703102000200337030820002007370300200041d8016a2020370300200041d0016a201f370300200041c8016a201e370300200041b8016a201c370300200041b0016a201b370300200041a8016a201a37030020004198016a201937030020004190016a201837030020004188016a2017370300200041f8006a2012370300200041f0006a2013370300200041e8006a2014370300200041d8006a200e370300200041d0006a200f370300200041c8006a2010370300200041386a2005370300200041306a2001370300200041286a2004370300200041186a2006370300200941206a24000baf110b047f017e017f017e017f027e017f087e017f077e017f230041a0016b221c24001033200c584101200d501b4101200e200f84501bad420042004200106a201c221d41c0006a41186a221e4200370300201d4200370350201d4200370348201d4203370340201d41c0006a201d4180016a1027201d4180016a4100201d41e0006a103a201d41e0006a41186a221f2903002120201d41e0006a41106a22212903002122201d41e0006a41086a22232903002124201d2903602125201d4180016a41186a222642fff2c695e1b5fbb8ee00370300201d4290a0bcfff086d88fcd0037039001201d42caa29889e0d5bed1df0037038801201d42c9cd84ebc59099ce1637038001201d4180016a4100201d41e0006a1039201f29030021272021290300212820232903002129201d290360212a20264200370300201d200242ffffffff0f83222b37039001201d200137038801201d2000370380014100201d4180016a1022201f4200370300201d4200370370201d4200370368201d42043703604120201d41e0006a1022410041c000201d41c0006a1028201d201d290040370000201d201d290048370008201d201d290050370010201d201d290058370018201d201d41206a1017201d41206a41086a290300212c201d41206a41106a290300212d201d290320212e201e201d41206a41186a222f2903002230370300201d202d370350201d202c370348201d202e370340201d41c0006a201d4180016a1027201d4180016a4100201d41e0006a103a0240201d2903602231202129030022328320232903002233201f29030022348383427f520d002026428080808090ee9ea4ce00370300201d420037039001201d420037038801201d4200370380014100201d4180016a1022201f4200370300201d4200370370201d4200370368201d42113703604104201d41e0006a102241004124101e0b201f2030370300201d202e370360201d202c370368201d202d370370201d41e0006a201d41c0006a1027201d203142017c223537038001201d203320352031542221ad7c223637038801201d203220212036203354203520315a1bad7c223537039001202620342035203254ad7c370300201d4180016a4100201d1039202f2030370300201d202d370330201d202c370328201d202e370320201d41206a201d102641c000201d4180016a10242026290300212d201d4180016a41106a2223290300212e201d4180016a41086a221e2903002130201d29038001212c20262027370300201d202837039001201d202937038801201d202a37038001202ca7222141206a222f201d4180016a102220264200370300201d202b37039001201d200137038801201d200037038001202141c0006a201d4180016a102220264200370300201d200642ffffffff0f8337039001201d200537038801201d200437038001202141e0006a201d4180016a10222026200b370300201d200a37039001201d200937038801201d20083703800120214180016a201d4180016a102220262034370300201d203237039001201d203337038801201d203137038001202141a0016a201d4180016a10222026200f370300201d200e37039001201d200d37038801201d200c37038001202141c0016a201d4180016a1022201c41606a221c22372400201c41186a4200370300201c4200370310201c4200370308201c42c0013703002021201c1022202c2030202e202d42e00142004200420010442021201d4180016a1024201d28028001211c203741606a222122372400202f201c202110282021290000212c2021290008212d2021290010212e2021290018213241c000201d4180016a1024202629030021332023290300210c201e290300210d201d290380012131203741606a222122232400202120323700182021202e3700102021202d3700082021202c3700002021201d4180016a1017201f42808080808080c08019370300201d4200370370201d4200370368201d42003703602031a7221c41206a221e201d41e0006a1022201f2020370300201d2022370370201d2024370368201d2025370360201c41226a201d41e0006a1022201c41c2006a201d4180016a1022202341606a2221221f2400202141186a42003703002021420037031020214200370308202142c200370300201c202110222031200d200c203342e2004200420042001044201c201d4180016a1024201d28028001211c201f41606a2221221f2400201e201c20211028202129000021312021290008212c2021290010212d2021290018212e41c000201d4180016a1024201d280280012121201f41606a221f221c2400201f202e370018201f202d370010201f202c370008201f2031370000201f201d4180016a10172021201d4180016a102220264200370300201d420037039001201d420037038801201d201042ff018337038001202141206a201d4180016a102220262017370300201d201637039001201d201537038801201d201437038001202141c0006a201d4180016a10222026201b370300201d201a37039001201d201937038801201d201837038001202141e0006a201d4180016a1022201c41606a2226221f2400202641186a420037030020264200370310202642003703082026420037030041002026102210322131201f41606a2226221f2400202641186a4200370300202642003703102026420037030820264201370300201f41606a221f221c24002026201f1018201f290000212c201f290008212d201f290010212e201f2900182132201c41606a22262400202620323700182026202e3700102026202d3700082026202c37000002402031202620214180014100412010300d0041c000201d4180016a1024201d28028001222641001034102e20261034101e0b4100201d4180016a1024201d4180016a4100201d41e0006a1039201d2903602231201d41f0006a350200222c84201d41e8006a290300222d844200522031200085202c202b8584202d200185845071ad420042004200106b2000200120022003200420052006200720082009200a200b1049201d41a0016a24000b960301027f230041a0016b2209240020094180016a41186a220a42003703002009200342ffffffff0f833703900120092002370388012009200137038001410020094180016a1022200941c0006a41186a42003703002009420037035020094200370348200942023703404120200941c0006a1022410041c000200941206a1028200920092900203700002009200929002837000820092009290030370010200920092900383700182009200941e0006a1017200a42003703002009200742ffffffff0f833703900120092006370388012009200537038001410020094180016a10224120200941e0006a1022410041c000200941206a1028200920092900203700002009200929002837000820092009290030370010200920092900383700182009200941c0006a1017200941c0006a20094180016a102720094180016a4100200941e0006a103a200941e0006a41186a2903002103200941e8006a2903002102200929036021012000200941f0006a2903003703102000200237030820002001370300200041186a2003370300200941a0016a24000bc60301047f230041a0016b220024000240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b200041c0006a41186a420037030020004200370350200042003703482000420c370340200041c0006a20004180016a102720004180016a4100200041e0006a103a2000290360420185200041f0006a29030084200041e8006a290300200041e0006a41186a2201290300848450ad42004200420010422001420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a102720004180016a41186a2202420037030020004200370390012000420037038801200042003703800120004180016a410020001039200041206a41186a2203420037030020004200370330200042003703282000420c370320200041206a20001026105c2001420037030020004200370370200042003703682000420c370360200041e0006a200041c0006a10272002420037030020004200370390012000420037038801200042013703800120004180016a4100200010392003420037030020004200370330200042003703282000420c370320200041206a2000102641c00020004180016a102420002802800141001029200041a0016a24000baa0e08037f017e017f057e017f047e037f017e230041c0026b220024002000220141e0016a41186a4200370300200142003703f001200142003703e801200142063703e001200141e0016a200141a0026a1027200141a0026a410020014180026a103a20014180026a41086a2202290300210320014180026a41106a220435020021052001290380022106200141c0016a101c200120012900c00137008001200120012900c80137008801200120012900d00137009001200120012900d8013700980120014180016a200141a0016a1017200141a0016a41086a2903002107200141a0016a41106a350200210820012903a001210941c000200141a0026a1024200141a0026a41186a220a290300210b200141a0026a41106a290300210c200141a0026a41086a290300210d20012903a002210e200a4200370300200142003703b002200142003703a802200142b1848285073703a002200141a0026a41e00120014180026a1039200141e0006a41186a20014180026a41186a29030037030020012004290300370370200120022903003703682001200129038002370360200ea72202200141e0006a1022200a4200370300200120083703b002200120073703a802200120093703a002200241046a200141a0026a102210322107200141c0006a41186a4200370300200120053703502001200337034820012006370340200141c0006a200141206a1018200120012900203700002001200129002837000820012001290030370010200120012900383700180240024020072001200241242002412010300d0041c000200141a0026a102420012802a002220241001034102e20021034101e200041606a2204220a24000c010b200041606a2204220a24000240024010344120490d00200e200d200c200b422042004200420010440c010b200e200d200c200b10342200ad42004200420010442000411f4b0d0041004100101e0b2002200410240b200141e0016a41186a4200370300200142003703f001200142003703e801200142073703e001200141e0016a200141a0026a1027200141a0026a410020014180026a103a20014180026a41086a220f290300210320014180026a41106a221035020021052001290380022106200a41606a2202220a24002002101c2002290000210e200229000821072002290010210820022900182109200a41606a220a22022400200241606a2202221124002002200937001820022008370010200220073700082002200e3700002002200a1017200a2903002107200a41086a2903002108200a41106a350200210941c000200141a0026a1024200141a0026a41086a290300210b200141a0026a41106a290300210c200141a0026a41186a2200290300210d20012903a002210e201141606a2202220a2400200241186a200d3703002002200c3703102002200b3703082002200e37030020004200370300200142003703b002200142003703a802200142b1848285073703a002200141a0026a41e00120014180026a1039200f290300210b2010290300210c20014180026a41186a290300210d2001290380022112200a41606a220a22102400200a41186a200d370300200a200c370310200a200b370308200a2012370300200ea7220f200a102220004200370300200120093703b002200120083703a802200120073703a002200f41046a200141a0026a10221032210e201041606a220a22002400200a41186a4200370300200a2005370310200a2003370308200a2006370300200041606a220022102400200a2000101820002900002103200029000821052000290010210620002900182107201041606a220a22002400200a2007370018200a2006370010200a2005370008200a200337000002400240200e200a200f4124200f412010300d0041c000200141a0026a102420012802a002220241001034102e20021034101e200041606a220a24000c010b200041606a220a24000240024010344120490d002002290300220e200241086a290300200241106a290300200241186a29030042204200420042001044200ea721020c010b103421002002290300220e200241086a290300200241106a290300200241186a2903002000ad4200420042001044200ea721022000411f4b0d0041004100101e0b2002200a10240b200141e0016a41186a22024200370300200142003703f001200142003703e801200142083703e001200141e0016a200141a0026a1027200141a0026a410020014180026a103a20014180026a41086a2200290300210e200129038002210320024200370300200142003703f001200142003703e801200142083703e001200141e0016a200141a0026a1027200141a0026a41f00020014180026a103a2004290300200441086a290300200441106a290300200441186a290300200a290300200a41086a290300200a41106a290300200a41186a2903002003200e42ffffffffffff3f8342004200200129038002200029030042ffffffffffff3f83420042001063200141c0026a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054225370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42808080a0e5a9d5a7cd00370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101e0b200541e0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054221370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a428080808080808080d900370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101e0b200541e0006a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054215370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542cc82d9f29489889d32370330200542808080f8c4ea97a2c90037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054224370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a4280808080c0cad3aacf00370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101e0b200541e0006a24000b8d0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005420c370320200641246a200541206a1022200442d6e085bbb7ae9ab7d50037030020054280808080b089889d323703302005420037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000b8a0603027f047e037f230041a0026b220c240041c000200c4180026a1024200c41e0016a41186a4280808080b097e782a97f370300200c42003703f001200c42003703e801200c42003703e001200c4180026a41186a220d290300210e200c4190026a290300210f200c4188026a2903002110200c290380022211a7221241206a2213200c41e0016a1022200d4200370300200c200642ffffffff0f8337039002200c200537038802200c200437038002201241246a200c4180026a1022200d200b370300200c200a37039002200c200937038802200c200837038002201241c4006a200c4180026a1022200c41c0016a41186a4200370300200c42003703d001200c42003703c801200c42c4003703c0012012200c41c0016a102220112010200f200e42e40042004200420010442012200c41a0016a1024200c2802a001210d10322106200c4180016a41186a2003370300200c200237039001200c200137038801200c200037038001200c4180016a200c41e0006a1018200c41206a41186a4200370300200c4200370330200c4200370328200c4200370320200c200c290060370040200c200c290068370048200c200c290070370050200c200c290078370058410021122006200c41c0006a200c41206a2013200d41004100102f21130240024010340d0041e000210d0c010b200c1034ad420042004200106c200c280200220d41206a41001034102e0b02402013450d00200d200c4180026a10240240200c29038002200c4190026a221229030084200c4188026a2213290300200c4198026a221429030084844200520d00410121120c010b200d200c4180026a10240240200c29038002421f56201329030022064200522006501b20122903002205420052201429030022064200552006501b2005200684501b0d0041004100101e0b200d41206a200c4180026a10240240200c2903800222062006200c4190026a290300220584200c4188026a290300200c4198026a29030084220484420052ad85200584200484500d0041004100101e0b2006a721120b2012ad420042004200106d200c41a0026a24000b83280b037f037e017f017e017f047e017f107e027f017e067f23004180056b22102400200142808080808080c0005441002002200384501b200542808080808080c0005441002006200784501b71ad420042004200106e103321072010221141a0046a41186a22124200370300201142003703b004201142003703a804201142083703a004201141a0046a201141e0046a1027201141e0046a41e001201141c0046a103a200742ffffffff0f8321130240200720112903c0047d42ffffffff0f832214500d002008200942ffffffffffff3f832215845022160d00200c200d42ffffffffffff3f832217845022180d00420021194200200d42108842ffffffff0f8322072016200c421088200d4230868422062007200c423086221a84845072420020157920087942c0007c20154200521b22034280017c220d20077920067942c0007c20074200521b201a79428001201a4200521b22024280017c221b200620078442005222161b221c54221d200d200354ad22034200201b200254ad20161b22025420032002511b2216ad7d221e42005242002016410047ad7d221f420052201f501b200d201c7d222042ff0156200320027d201dad7d22214200522021501b20161b7222161b21024200200620161b21224200201a20161b210d024002402016450d00420021030c010b42002103202042ff0185201e842021201f8484500d0020114180036a41286a201a37000042002123201141a0036a2216420037000020114180036a41186a420037000020114180036a41306a200637000020114180036a41386a2007370000201142003700900320114200370088032011420037008003201641ff012020a76b221d410376411f716b221641086a2900002203201d410771221dad220d862016290000221c420188201d413f73ad221b88842102201641186a290000200d86201641106a2900002222420188201b888421242022200d862003420188201d417f73413f71ad8884211b201c200d86211c02400240202042017c2203201e2003202054221620212016ad7c220d202154200320205a1bad7c222084200d201f2020201e54ad7c2225848450450d004200212642002107420021060c010b42002126201141c0026a41386a4200370000201141c0026a41306a4200370000201141c0026a41286a4200370000201141c0026a41186a2007370000201142003700e002201142003700c0022011201a3700c802201120063700d0022008427f7c2227200854221620152016ad7c427f7c222820155420282015511bad2207427f7c2229200754ad427f7c212a201141c0026a2003a7221d410376411f716a221641106a29000022062003420783220788201641186a290000221e420186201d410771221d413f73ad221f8684211a201641086a29000022222007882006420186201d417f73413f71ad8684212120162900002007882022420186201f8684211f201e200788212b4200212c0340201a4201862021423f88842206201f4201862024423f8884221e202a202b420186201a423f8884222b7d2029200654ad7d202920067d2027201e5420282021420186201f423f888422075420282007511bad54ad7d423f872222200883221f5422162007202220158322215420072021511bad222d7d211a202b2006202d54ad7d212b200720217d2016ad7d2121201e201f7d211f200d2003427f7c22062003542216ad7c427f7c2207200d51211d2007200d54212e2020427f7c221e202054212f201c423f88212d2002423f88213042002024420186201b423f8884842124202c201c42018684211c20224201832223212c200621032007210d201e2016202e201d1bad7c222221204200202d20024201868484222d210242002030201b42018684842230211b200620228420072025202fad7c2022201e54ad7c427f7c2225848450450d000b4200210742002106202d21022030211b0b20262002420186201c423f888484210d2007201b4201862002423f888484212220062024420186201b423f88848421022023201c4201868421030b201141b0026a20144200202220021016201141f0016a20034200201442001016201141e0016a200d4200201442001016201141a0026a2003200d42004200101620114180026a2003420042004200101620114190026a200d4200420042001016201141a0046a41186a22314200370300201142003703b004201142003703a804201142093703a004201141a0046a201141e0046a1027201141e0046a4100201141c0046a103a201141c0046a41086a22322903002107201141d0046a2233290300210d201141c0046a41186a2234290300212020112903c004210620344200370300201142003703d004201142003703c804201142093703c004201141f0016a41086a290300212420112903e0012103201141e0016a41086a290300211a201129038002210220114180026a41086a290300212120114190026a41086a290300211f201129039002211b201141a0026a41086a290300211e201141b0026a41086a290300212220112903a002211c20112903b002212820112903f0012125201141c0046a201141a0046a10272011200620257c22253703e004201120072002200320247c22247c22297c20252006542216ad7c22063703e8042011200d201b201a2024200354ad7c222420212029200254ad7c7c221a7c2203201c20287c22217c22287c22022016200620075420062007511bad7c22073703f004201141e0046a41186a22352020201f201a202454ad7c2003201b54ad7c201e20227c2021201c54ad7c7c2028200354ad7c7c2002200d54ad7c2007200254ad7c370300201141e0046a4100201141e0036a103920114180046a41186a223642003703002011420037039004201142003703880420114209370380044200200942108842ffffffff0f83220720182008421088200942308684220620072008423086221a848450724200201779200c7942c0007c20174200521b22034280017c220d20077920067942c0007c20074200521b201a79428001201a4200521b22024280017c221b200620078442005222161b221c54221d200d200354ad22034200201b200254ad20161b22025420032002511b2216ad7d221e42005242002016410047ad7d221f420052201f501b200d201c7d222442ff0156200320027d201dad7d22214200522021501b20161b7222161b21034200200620161b21024200201a20161b210d20114180046a201141e0036a1026024020160d00202442ff0185201e842021201f8484500d00201141a0016a41286a201a37000042002108201141c0016a22164200370000201141a0016a41186a4200370000201141a0016a41306a2006370000201141a0016a41386a2007370000201142003700b001201142003700a801201142003700a001201641ff012024a76b221d410376411f716b221641086a2900002203201d410771221dad220d862016290000221c420188201d413f73ad221b88842102201641186a290000200d86201641106a2900002222420188201b888421202022200d862003420188201d417f73413f71ad8884211b201c200d86211c02400240202442017c2203201e2003202454221620212016ad7c220d202154200320245a1bad7c222484200d201f2024201e54ad7c22258484500d0042002127201141e0006a41386a4200370000201141e0006a41306a4200370000201141e0006a41286a4200370000201141e0006a41186a20073700002011420037008001201142003700602011201a37006820112006370070200c427f7c2215200c54221620172016ad7c427f7c222820175420282017511bad2207427f7c2229200754ad427f7c2123201141e0006a2003a7221d410376411f716a221641106a29000022062003420783220788201641186a290000221e420186201d410771221d413f73ad221f8684211a201641086a29000022222007882006420186201d417f73413f71ad8684212120162900002007882022420186201f8684211f201e200788212b4200212c0340201a4201862021423f88842206201f4201862020423f8884221e2023202b420186201a423f8884222b7d2029200654ad7d202920067d2015201e5420282021420186201f423f888422075420282007511bad54ad7d423f872222200c83221f5422162007202220178322215420072021511bad222d7d211a202b2006202d54ad7d212b200720217d2016ad7d2121201e201f7d211f200d2003427f7c22062003542216ad7c427f7c2207200d51211d2007200d54212e2024427f7c221e202454212f201c423f88212d2002423f88213042002020420186201b423f8884842120202c201c42018684211c20224201832208212c200621032007210d201e2016202e201d1bad7c222221244200202d20024201868484222d210242002030201b42018684842230211b200620228420072025202fad7c2022201e54ad7c427f7c2225848450450d000b4200210742002106202d21022030211b0c010b4200212742002107420021060b20272002420186201c423f888484210d2007201b4201862002423f888484210220062020420186201b423f88848421032008201c4201868421190b201141d0006a20144200200220031016201141106a201942002014420010162011200d4200201442001016201141c0006a2019200d420042001016201141206a20194200420042001016201141306a200d420042004200101620314200370300201142003703b004201142003703a8042011420a3703a004201141a0046a201141e0046a1027201141e0046a4100201141c0046a103a203229030021072033290300210d2034290300212020112903c004210620344200370300201142003703d004201142003703c8042011420a3703c004201141106a41086a290300212420112903002103201141086a290300211a20112903202102201141206a41086a2903002121201141306a41086a290300211f2011290330211b201141c0006a41086a290300211e201141d0006a41086a29030021222011290340211c2011290350212820112903102125201141c0046a201141a0046a10272011200620257c22253703e004201120072002200320247c22247c22297c20252006542216ad7c22063703e8042011200d201b201a2024200354ad7c222420212029200254ad7c7c221a7c2203201c20287c22217c22287c22022016200620075420062007511bad7c22073703f00420352020201f201a202454ad7c2003201b54ad7c201e20227c2021201c54ad7c7c2028200354ad7c7c2002200d54ad7c2007200254ad7c370300201141e0046a4100201141e0036a103920364200370300201142003703900420114200370388042011420a3703800420114180046a201141e0036a10260b20124200370300201142003703b004201142003703a804201142083703a004201141a0046a20114180046a102720114180046a410e6a330100210720114180046a41106a2234290300210d20114180046a41186a22182903002106201141e0046a41186a22164200370300201142003703f0042011200142ffffffffffff3f833703e804201120003703e004201141e0046a4100201141c0046a1039201141e0036a41186a221d4200370300201141c0036a41186a222e2006370300201142003703f003201142003703e803201142083703e0032011200d3703d003201120112903c0043703c0032011201141c0046a41086a222f29030042ffffffffffff3f832007423086843703c803201141e0036a201141c0036a102620124200370300201142003703b004201142003703a804201142083703a004201141a0046a20114180046a102720114180046a41086a223129030021072011419c046a350200210d201129038004210620164200370300201142003703f0042011200542ffffffffffff3f833703e804201120043703e004201141e0046a41f000201141c0046a1039201d4200370300202e201141c0046a41186a350200200d42208684370300201142003703f003201142003703e803201142083703e003201120063703c0032011201141c0046a41106a2903003703d0032011201141c0046a410e6a330100423086200742ffffffffffff3f83843703c803201141e0036a201141c0036a102620124200370300201142003703b004201142003703a804201142083703a004201141a0046a20114180046a1027203129030021072034290300210d20183502002106201129038004210320164200370300201142003703f004201142003703e804201120133703e004201141e0046a41e001201141c0046a1039201d4200370300202e200620113502dc0442208684370300201142003703f003201142003703e803201142083703e0032011200d3703d003201120073703c803201120033703c003201141e0036a201141c0036a102620124200370300201142003703b004201142003703a804201142083703a004201141a0046a201141e0046a1027201141e0046a4100201141c0046a103a202f290300210720112903c004210d20124200370300201142003703b004201142003703a804201142083703a004201141a0046a201141e0046a1027201141e0046a41f000201141c0046a103a202f290300210620112903c004210341c000201141e0046a102420112802e004212e20164200370300201142003703f0042011200742ffffffffffff3f833703e8042011200d3703e004202e201141e0046a102220164200370300201142003703f0042011200642ffffffffffff3f833703e804201120033703e004202e41206a201141e0046a1022201041606a2216221d2400201641186a42a4e281b7a9d3c7a01c370300201642aeafac93f7bec8971c3703102016428ecaafbcccd6f2f1897f370308201642d1f5eeff9ff5c09506370300201d41606a221d222f24002016201d1018201d2900002107201d290008210d201d2900102106201d2900182103202f41606a2216240020162003370018201620063700102016200d37000820162007370000202e41c0002016102a20114180056a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054214370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542c984c9fae488889d3237033020054280808080e0a991a2c40037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054228370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42c48ad1f294a9d3afd900370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101e0b200541e0006a24000bda400b027f017e017f027e017f0e7e017f097e047f0d7e017f230041c0086b22092400200941e0076a41186a4200370300200942003703f007200942003703e807200942053703e007200941e0076a200941a0086a1027200941a0086a410020094180086a103a20094180086a41086a220a290300210b20094180086a41106a220c350200210d200929038008210e41c000200941a0086a1024200941a0086a41186a220f2903002110200941a0086a41106a2903002111200941a0086a41086a290300211220092903a0082113200f4200370300200942003703b008200942003703a808200942d8fcf90b3703a008200941a0086a41e00120094180086a103920094180076a41186a20094180086a41186a2903003703002009200c290300370390072009200a290300370388072009200929038008370380072013a7220a20094180076a102210322114200941e0066a41186a42003703002009200d3703f0062009200b3703e8062009200e3703e006200941e0066a200941c0066a1018200920092900c0063700a006200920092900c8063700a806200920092900d0063700b006200920092900d8063700b806024002402014200941a0066a200a4104200a412010300d0041c000200941a0086a102420092802a008220a41001034102e200a1034101e0c010b0240024010344120490d002013201220112010422042004200420010440c010b20132012201120101034220cad4200420042001044200c411f4b0d0041004100101e0b200a200941a0086a1024200941a8086a290300211520092903a00821164100200941b0086a2903002217428080808010544100200941b8086a2903002218501b201742808080801085201884501b0d0041004100101e0b200941e0076a41186a4200370300200942003703f007200942003703e8072009420b3703e007200941e0076a200941a0086a1027200941a0086a410020094180086a103a20094180086a41186a290300211920094190086a290300211a20094188086a290300211b200929038008211c024002402016201742ffffffff0f8384201584221d4200520d00201c201a84201b20198484500d0120094180086a41186a4200370300200942003703900820094200370388082009420b3703800820094180086a200941e0076a1027200941a0086a41186a4200370300200942003703b008200942003703a808200942003703a008200941a0086a4100200941a0076a1039200941c0076a41186a4200370300200942003703d007200942003703c8072009420b3703c007200941c0076a200941a0076a10260c010b201c201a84201b2019848450221e0d004200211f20094180066a20054200200142001016200941e0056a200642ffffffffffff3f8322134200200142001016200941f0056a20054200200242ffffffffffff3f83220b42001016200941d0056a20134200200b4200101620094190066a2001200b420042001016200941c0056a2005201342004200101602400240200929038006222042035620092903f005221320092903e005220520094180066a41086a2903007c22017c22214200522021501b20092903d005220b200941e0056a41086a2903002001200554ad7c2205200941f0056a41086a2903002021201354ad7c7c22017c221320092903c005220d2009290390067c220e7c2222420052200941d0056a41086a2903002001200554ad7c2013200b54ad7c200941c0056a41086a29030020094190066a41086a2903007c200e200d54ad7c7c2022201354ad7c22234200522023501b20222023842224501b0d002020202284202120238484420052ad212542002126420021270c010b024020204201882021423f8684221342017c220e20205a20214201882022423f86842201200e201354220aad7c220520215a20052021511b20224201882023423f8684220b200a2005200154200e20135a1bad7c220120225a20234201882001200b54ad7c221320235a20132023511b2001202285201320238584501b450d00202021252021211f20222126202321270c010b20094180056a41286a2128200941a0056a212920094180056a41306a212a20094180056a41386a212b03400240200e222520012226842005221f20132227848422134200520d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421237038008410420094180086a102241004124101e0b4200202320135020202022842021202384845072420020277920267942c0007c20274200521b201f7920257942c0007c201f4200521b22134280017c22052026202784420052220a1b220120237920227942c0007c20234200521b20217920207942c0007c20214200521b220b4280017c220d2024420052220c1b220e54220f42002005201354ad200a1b22134200200d200b54ad200c1b22055420132005511b220aad7d222c4200524200200a410047ad7d22024200522002501b2001200e7d220642ff0156201320057d200fad7d22124200522012501b200a1b72220a1b211342002022200a1b210542002021200a1b210142002020200a1b210b0240200a0d00200642ff0185202c84201220028484500d0020282021370000202920203700004200212d20094180056a41186a4200370000202a2022370000202b2023370000200942003700900520094200370088052009420037008005202941ff012006a76b220c410376411f716b220a41086a2900002205200c410771220cad221386200a2900002201420188200c413f73ad220b8884210e200a41186a290000201386200a41106a290000220d420188200b88842111200d2013862005420188200c417f73413f71ad888421142001201386211002400240200642017c220d202c200d200654220a2012200aad7c2201201254200d20065a1bad7c221284200120022012202c54ad7c222e8484500d004200212f200941c0046a41386a4200370000200941c0046a41306a4200370000200941c0046a41286a4200370000200941c0046a41186a2023370000200942003700e004200920203700c004200920213700c804200920223700d004200941c0046a200da7220c410376411f716a220a41106a2900002205200d420783221388200a41186a290000220b420186200c410771220c413f73ad222c86842106200a41086a29000022302013882005420186200c417f73413f71ad86842102200a2900002013882030420186202c8684212c20272026427f7c2205202654ad7c20052025427f7c2231202554220a201f200aad7c427f7c2232201f542032201f511bad7c2233200554ad7c427f7c2134200b201388213542002136034020064201862002423f8884220b203420354201862006423f888422357d2033200b54ad7d2033200b7d2031202c4201862011423f888422305420322002420186202c423f888422135420322013511bad54ad7d423f872205202683222c7d223720302005202583223854220a20132005201f8322025420132002511bad222d7d2106203520052027837d200b202c54ad7d2037202d54ad7d2135201320027d200aad7d2102203020387d212c2001200d427f7c220b200d54220aad7c427f7c2213200151210c2013200154210f2012427f7c223020125421392010423f882137200e423f882138420020114201862014423f8884842111203620104201868421102005420183222d2136200b210d201321012030200a200f200c1bad7c2205211242002037200e42018684842237210e420020382014420186848422382114200b2005842013202e2039ad7c2005203054ad7c427f7c222e848450450d000b420021134200210b2037210e203821140c010b4200212f420021134200210b0b202f200e4201862010423f888484210120132014420186200e423f8884842105200b20114201862014423f8884842113202d201042018684210b0b0240200b20257c220e200b5a2001201f7c200e200b54220aad7c220b20015a200b200151220c1b200520267c220d200a200b200154200c1bad7c220120055a201320277c200d200554ad7c2001200d54ad7c220d20135a200d2013511b2001200585200d20138584501b0d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421137038008410420094180086a102241004124101e0b200e420188200b423f8684220e202554200b4201882001423f86842205201f542005201f511b2001420188200d423f86842201202654200d420188221320275420132027511b2001202685201320278584501b0d000b0b02400240201c4204544100201b501b4100201a2019842224501b450d00420021344201212142002123420021310c010b0240201c420188201b423f8684221342017c220e201c5a201b420188201a423f86842201200e201354220aad7c2205201b5a2005201b511b201a4201882019423f8684220b200a2005200154200e20135a1bad7c2201201a5a20194201882001200b54ad7c221320195a20132019511b2001201a85201320198584501b450d00201c2121201b2134201a2123201921310c010b20094180046a41286a2128200941a0046a212920094180046a41306a212a20094180046a41386a212b03400240200e222120012223842005223420132231848422134200520d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421237038008410420094180086a102241004124101e0b42002019201350201e72420020317920237942c0007c20314200521b20347920217942c0007c20344200521b22134280017c22052023203184420052220a1b2201201979201a7942c0007c20194200521b201b79201c7942c0007c201b4200521b220b4280017c220d2024420052220c1b220e54220f42002005201354ad200a1b22134200200d200b54ad200c1b22055420132005511b220aad7d222c4200524200200a410047ad7d22024200522002501b2001200e7d220642ff0156201320057d200fad7d22124200522012501b200a1b72220a1b21134200201a200a1b21054200201b200a1b21014200201c200a1b210b0240200a0d00200642ff0185202c84201220028484500d002028201b3700002029201c3700004200212d20094180046a41186a4200370000202a201a370000202b2019370000200942003700900420094200370088042009420037008004202941ff012006a76b220c410376411f716b220a41086a2900002205200c410771220cad221386200a2900002201420188200c413f73ad220b8884210e200a41186a290000201386200a41106a290000220d420188200b88842111200d2013862005420188200c417f73413f71ad888421142001201386211002400240200642017c220d202c200d200654220a2012200aad7c2201201254200d20065a1bad7c221284200120022012202c54ad7c222e8484500d004200212f200941c0036a41386a4200370000200941c0036a41306a4200370000200941c0036a41286a4200370000200941c0036a41186a2019370000200942003700e0032009201c3700c0032009201b3700c8032009201a3700d003200941c0036a200da7220c410376411f716a220a41106a2900002205200d420783221388200a41186a290000220b420186200c410771220c413f73ad222c86842106200a41086a29000022302013882005420186200c417f73413f71ad86842102200a2900002013882030420186202c8684212c20312023427f7c2205202354ad7c20052021427f7c2222202154220a2034200aad7c427f7c223220345420322034511bad7c2233200554ad7c427f7c2120200b201388213542002136034020064201862002423f8884220b202020354201862006423f888422357d2033200b54ad7d2033200b7d2022202c4201862011423f888422305420322002420186202c423f888422135420322013511bad54ad7d423f872205202383222c7d223720302005202183223854220a2013200520348322025420132002511bad222d7d2106203520052031837d200b202c54ad7d2037202d54ad7d2135201320027d200aad7d2102203020387d212c2001200d427f7c220b200d54220aad7c427f7c2213200151210c2013200154210f2012427f7c223020125421392010423f882137200e423f882138420020114201862014423f8884842111203620104201868421102005420183222d2136200b210d201321012030200a200f200c1bad7c2205211242002037200e42018684842237210e420020382014420186848422382114200b2005842013202e2039ad7c2005203054ad7c427f7c222e848450450d000b420021134200210b2037210e203821140c010b4200212f420021134200210b0b202f200e4201862010423f888484210120132014420186200e423f8884842105200b20114201862014423f8884842113202d201042018684210b0b0240200b20217c220e200b5a200120347c200e200b54220aad7c220b20015a200b200151220c1b200520237c220d200a200b200154200c1bad7c220120055a201320317c200d200554ad7c2001200d54ad7c220d20135a200d2013511b2001200585200d20138584501b0d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421137038008410420094180086a102241004124101e0b200e420188200b423f8684220e202154200b4201882001423f8684220520345420052034511b2001420188200d423f86842201202354200d420188221320315420132031511b2001202385201320318584501b0d000b0b2025202158201f203458201f203451220a1b2026202358202720315820272031511b2026202385202720318584501b0d00200941e0076a41186a4200370300200942003703f007200942003703e807200942003703e007200941e0076a200941a0086a1027200941a0086a410020094180086a103a200941e0026a20092903800822134200202520217d220542001016200941d0026a20094180086a41086a29030022014200200542001016200941f0026a20134200201f20347d2025202154220cad7d220b4200101620094180036a20014200200b42001016200941a0036a2005200b42004200101620094190036a2013200142004200101620094180026a20014200202620237d220e200c201f203454200a1bad22147d220d4200101620094190026a202720317d2026202354ad7d200e201454ad7d220e4200201342001016200941b0036a200d4200201342001016200941b0026a200b420020094190086a290300221342001016200941a0026a20094180086a41186a220c29030022144200200542001016200941c0026a2013420020054200101620092903e002210202402013201484420052200d200e84420052712014420052200b4200527120092903a8024200527220092903b80242005272200941c0026a41086a290300221320092903a00220092903b0027c7c220d2013547272200e4200522001420052712009290398024200527220092903880242005272200941b0036a41086a29030022132009290390022009290380027c7c22012013547272200929038003220e200941d0026a41086a29030020092903d0022213200941e0026a41086a2903007c2205201354ad7c2214200941f0026a41086a29030020092903f002221320057c220b201354ad7c7c22107c2213200929039003221120092903a0037c22127c220520092903c002222c20092903b0037c22307c2206200554220a20094180036a41086a2903002010201454ad7c2013200e54ad7c20094190036a41086a290300200941a0036a41086a2903007c2012201154ad7c7c2005201354ad7c2205200d20017c2030202c54ad7c7c200aad7c221320055420132005511b72410171450d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a1022200c4200370300200942003703900820094200370388082009421137038008410420094180086a102241004124101e0b200941c0016a20254200420542001016200941e0016a201f4200420542001016200941f0016a2025201f42004200101620094190016a2026420042054200101620094180016a20274200420542001016200941b0016a20254200420042001016200941d0016a201f4200420042001016200941a0016a2025420042004200101620092903c001210e024020092903880142005220094190016a41086a29030022052009290380017c22102005547220092903d0012211200941e0016a41086a29030020092903e0012205200941c0016a41086a2903007c2201200554ad7c2212200941b0016a41086a29030020092903b001220520017c2201200554ad7c7c222c7c220520092903f0017c2214200929039001223020092903a0017c22327c220d201454220a200941d0016a41086a290300202c201254ad7c2005201154ad7c200941f0016a41086a2903007c2014200554ad7c22142010200941a0016a41086a2903007c2032203054ad7c7c200aad7c220520145420052014511b724101470d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421137038008410420094180086a102241004124101e0b02402021200e7c2226200e5a203420017c2026202154220aad7c222e20015a202e2001511b2023200d7c2201200a202e203454202e2034511bad7c2233200d5a203120057c2001202354ad7c2033200154ad7c223220055a20322005511b2033200d85203220058584501b0d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421137038008410420094180086a102241004124101e0b02402026203384202e2032848422054200520d00200941a0086a41186a428080808090ee9ea4ce00370300200942003703b008200942003703a808200942003703a0084100200941a0086a102220094180086a41186a4200370300200942003703900820094200370388082009421237038008410420094180086a102241004124101e0b2026200256202e200b56202e200b511b2033200656203220135620322013511b2033200685203220138584501b0d00420020132005502002200684200b201384845072420020327920337942c0007c20324200521b202e7920267942c0007c202e4200521b22054280017c22012033203284420052220a1b220e20137920067942c0007c20134200521b200b7920027942c0007c200b4200521b220d4280017c22142006201384420052220c1b221054220f42002001200554ad200a1b220142002014200d54ad200c1b220d542001200d511b220aad7d22304200524200200a410047ad7d222c420052202c501b200e20107d220542ff01562001200d7d200fad7d22124200522012501b200a1b72220a1b210142002006200a1b210d4200200b200a1b213542002002200a1b210e0240200a0d00200542ff01852030842012202c8484500d00200941c0006a41286a200b370000200941e0006a220a20023700004200211f200941c0006a41186a4200370000200941c0006a41306a2006370000200941c0006a41386a2013370000200942003700502009420037004820094200370040200a41ff012005a76b220c410376411f716b220a41086a290000220d200c410771220cad220186200a2900002210420188200c413f73ad22148884210e200a41186a290000200186200a41106a29000022354201882014888421112035200186200d420188200c417f73413f71ad888421142010200186211002400240200542017c220d2030200d200554220a2012200aad7c2201201254200d20055a1bad7c2212842001202c2012203054ad7c22368484500d0042002125200941386a4200370000200941306a4200370000200941286a4200370000200941186a201337000020094200370020200920023700002009200b370008200920063700102009200da7220c410376411f716a220a41106a2900002205200d420783221388200a41186a290000220b420186200c410771220c413f73ad222c86842106200a41086a29000022302013882005420186200c417f73413f71ad86842102200a2900002013882030420186202c8684212c20322033427f7c2205203354ad7c20052026427f7c2234202654220a202e200aad7c427f7c2235202e542035202e511bad7c2237200554ad7c427f7c2123200b20138821384200212d034020064201862002423f8884220b202320384201862006423f888422387d2037200b54ad7d2037200b7d2034202c4201862011423f888422305420352002420186202c423f888422135420352013511bad54ad7d423f872205203383222c7d222720302005202683223154220a20132005202e8322025420132002511bad221f7d2106203820052032837d200b202c54ad7d2027201f54ad7d2138201320027d200aad7d2102203020317d212c2001200d427f7c220b200d54220aad7c427f7c2213200151210c2013200154210f2012427f7c223020125421392010423f882127200e423f882131420020114201862014423f8884842111202d20104201868421102005420183221f212d200b210d201321012030200a200f200c1bad7c2205211242002027200e42018684842227210e420020312014420186848422312114200b200584201320362039ad7c2005203054ad7c427f7c2236848450450d000b42002113420021052027210e203121140c010b4200212542002113420021050b2025200e4201862010423f888484213520132014420186200e423f888484210d200520114201862014423f8884842101201f201042018684210e0b2016201520172018200e2035200d200110670b2000420037031020004200370308200041186a42003703002000201d420052ad370300200941c0086a24000bca0c08037f027e017f017e037f037e017f047e230041a0016b220824002008220941c0006a41186a220a4200370300200942003703502009420037034820094200370340200941c0006a20094180016a102720094180016a4100200941e0006a103a02402009290360220b20047c220c200b5a200941e0006a41086a220d290300220e20057c200c200b54220fad7c220b200e5a200b200e5122101b200941e0006a41106a2211290300221220067c2213200f200b200e5420101bad7c220e20125a200941e0006a41186a220f290300221420077c2013201254ad7c200e201354ad7c221320145a20132014511b200e201285201320148584501b0d0020094180016a41186a428080808090ee9ea4ce00370300200942003703900120094200370388012009420037038001410020094180016a1022200f42003703002009420037037020094200370368200942113703604104200941e0006a102241004124101e0b200f4200370300200942003703702009420037036820094200370360200941e0006a200941c0006a102720094180016a41186a221020133703002009200e370390012009200b370388012009200c3703800120094180016a410020091039200941206a41186a22154200370300200942003703302009420037032820094200370320200941206a20091026201042003703002009200242ffffffff0f8322163703900120092001370388012009200037038001410020094180016a1022200f42003703002009420037037020094200370368200942013703604120200941e0006a1022410041c000200941c0006a1028200920092900403700002009200929004837000820092009290050370010200920092900583700182009200941206a1017200941206a41086a290300210e200941206a41106a290300210b20092903202112200a201529030022173703002009200b3703502009200e37034820092012370340200941c0006a20094180016a102720094180016a4100200941e0006a103a02402009290360221320047c221820135a200d290300221420057c2018201354220aad7c221320145a2013201451220d1b2011290300220c20067c2219200a2013201454200d1bad7c2214200c5a200f290300220220077c2019200c54ad7c2014201954ad7c221920025a20192002511b2014200c85201920028584501b0d0020094180016a41186a428080808090ee9ea4ce00370300200942003703900120094200370388012009420037038001410020094180016a1022200941e0006a41186a42003703002009420037037020094200370368200942113703604104200941e0006a102241004124101e0b200941e0006a41186a2017370300200920123703602009200e3703682009200b370370200941e0006a200941c0006a102720094180016a41186a220f201937030020092014370390012009201337038801200920183703800120094180016a410020091039200941206a41186a20173703002009200b3703302009200e37032820092012370320200941206a2009102641c00020094180016a10242009280280012110200f2007370300200920063703900120092005370388012009200437038001201020094180016a1022200841606a220f22082400200f41186a429b918bdfd1d594f95d370300200f42aa9bdee18f8dace1e900370310200f4296c2929e96fee995957f370308200f42efe78ea9dfc9d6fa28370300200841606a2208220a2400200f2008101820082900002105200829000821042008290010210620082900182107200a41606a220f22082400200f2007370018200f2006370010200f2004370008200f2005370000200841606a2208220a2400200841186a4200370300200842003703102008420037030820084200370300200a41606a220a220d24002008200a1018200a2900002105200a2900082104200a2900102106200a2900182107200d41606a2208220a240020082007370018200820063700102008200437000820082005370000200a41606a220a220d2400200a41186a4200370300200a2016370310200a2001370308200a2000370300200d41606a220d22112400200a200d1018200d2900002105200d2900082104200d2900102106200d2900182107201141606a220a2400200a2007370018200a2006370010200a2004370008200a200537000020104120200f2008200a102c200941a0016a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054228370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42c48ab992d5cad0afd900370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101e0b200541e0006a24000bbd0c0b037f017e017f027e027f027e017f017e027f027e017f230041a0016b22082400200822094180016a41186a220a4200370300200920013703880120092000370380012009200242ffffffff0f83220b37039001410020094180016a1022200941e0006a41186a220c42003703002009420037037020094200370368200942013703604120200941e0006a1022410041c000200941c0006a1028200920092900403700002009200929004837000820092009290050370010200920092900583700182009200941206a1017200941206a41086a2903002102200941206a41106a290300210d2009290320210e200941c0006a41186a220f200941206a41186a221029030022113703002009200d370350200920023703482009200e370340200941c0006a20094180016a102720094180016a4100200941e0006a103a02402009290360221220045a200941e0006a41086a2213290300221420055a201420055122151b200941e0006a41106a2216290300221720065a200c290300221820075a20182007511b2017200685201820078584501b0d00200a428080808090ee9ea4ce00370300200942003703900120094200370388012009420037038001410020094180016a1022200c42003703002009420037037020094200370368200942113703604104200941e0006a102241004124101e0b200c20113703002009200e370360200920023703682009200d370370200941e0006a200941c0006a1027200a201820077d2017200654ad7d201720067d221720122004542219201420055420151bad221854ad7d3703002009201720187d370390012009201420057d2019ad7d370388012009201220047d3703800120094180016a410020091039201020113703002009200d370330200920023703282009200e370320200941206a20091026200f4200370300200942003703502009420037034820094200370340200941c0006a20094180016a102720094180016a4100200941e0006a103a02402009290360221420045a2013290300220220055a2002200551220a1b2016290300220d20065a200c290300220e20075a200e2007511b200d200685200e20078584501b0d0020094180016a41186a428080808090ee9ea4ce00370300200942003703900120094200370388012009420037038001410020094180016a1022200941e0006a41186a42003703002009420037037020094200370368200942113703604104200941e0006a102241004124101e0b200941e0006a41186a4200370300200942003703702009420037036820094200370360200941e0006a200941c0006a102720094180016a41186a220c200e20077d200d200654ad7d200d20067d220d2014200454220f2002200554200a1bad220e54ad7d3703002009200d200e7d370390012009200220057d200fad7d370388012009201420047d3703800120094180016a410020091039200941206a41186a4200370300200942003703302009420037032820094200370320200941206a2009102641c00020094180016a10242009280280012110200c2007370300200920063703900120092005370388012009200437038001201020094180016a1022200841606a220c22082400200c41186a429b918bdfd1d594f95d370300200c42aa9bdee18f8dace1e900370310200c4296c2929e96fee995957f370308200c42efe78ea9dfc9d6fa28370300200841606a2208220a2400200c2008101820082900002107200829000821062008290010210520082900182104200a41606a220c22082400200c2004370018200c2005370010200c2006370008200c2007370000200841606a2208220a2400200841186a42003703002008200b3703102008200137030820082000370300200a41606a220a220f24002008200a1018200a2900002107200a2900082106200a2900102105200a2900182104200f41606a2208220a240020082004370018200820053700102008200637000820082007370000200a41606a220a220f2400200a41186a4200370300200a4200370310200a4200370308200a4200370300200f41606a220f22132400200a200f1018200f2900002107200f2900082106200f2900102105200f2900182104201341606a220a2400200a2004370018200a2005370010200a2006370008200a200737000020104120200c2008200a102c200941a0016a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054212370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542d292c1c2d588889d3237033020054280808080808080a2c50037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000b9f0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005421c370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542cc82d9f29489889d32370330200542c19c9dcab4ea97a2c90037032820054280808080d0c8d4aad400370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000bf40206027f077e017f017e017f017e230041c0006b2205210620052400024020025041002003200484501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1022200641186a42003703002006420037031020064200370308200642c10037030041042006102241004124101e0b41c000200641206a102420062903202207200641286a2903002208200641306a2903002209200641206a41186a290300220a2001421f7c220b426083220c42207c220d2002200b200154220ead7c220f200d200c542210ad7c22112003200e200f200254200b20015a1bad7c220b20102011200f54200d200c5a1bad7c220c2004200b200354ad7c200c200b54ad7c1044200541606a22052400200541186a20043703002005200337031020052002370308200520013703002007a720051022200020093703102000200837030820002007370300200041186a200a370300200641c0006a24000b9f0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005421a370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542d39c8592c58a889d32370330200542cc9285b2f4cbd4a2c60037032820054280808080808080a2c500370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000b960201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054213370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542c6a495b2f589889d323703302005428080808080e0d5a7cc0037032820054200370320200641c4006a200541206a1022200641e400101e0b200541c0006a24000b8e1c06017f027e027f027e037f047e230041e0026b2200240041800110211a41c00041e00010230240101a4104490d004100200041c0026a1019200041c0026a41e001200041a0026a103a02400240024002400240024002400240024002400240024002400240024002400240024020002903a002220142c1f089d30656200041a8026a2903002202420052220320025022041b200041b0026a2903002205420052200041b8026a290300220642005520065022071b220820052006845022091b0d000240200142dce5e19d0256200320041b200820091b0d000240200142b2cffaca0056200242005220041b2005420052200642005520071b20091b0d002001429f9bb011852005842002200684220684500d0320014283bcf73785200584200684500d04200142ace38bc8008520058420068450450d1410470c140b200142b3cffaca00852005842002200684220684500d0420014281adf8ef0085200584200684500d05200142dd9bd8c0018520058420068450450d130240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004198026a420037030020004200370390022000420037038802200042003703800220004180026a200041a0026a1027200041a0026a4100200041c0026a103a41c000200041a0026a102420002802a0022204200041c0026a10222004412010290c130b024020014294ca93b203562002420052220320041b2005420052200642005520071b220820091b0d00200142dde5e19d02852005842002200684220684500d062001429ff0b7850385200584200684500d07200142e7caf389038520058420068450450d130240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b41c000200041c0026a102420002802c0022104200041d8026a4200370300200042003703d002200042003703c802200042123703c0022004200041c0026a10222004412010290c130b0240200142d481a7c80556200320041b200820091b0d0020014295ca93b203852005842002200684220684500d08200142d592f3c2048520058420068450450d130240101d450d0041004100101e0b0240101a41c3004b0d0041004100101e0b4104200041c0026a1019200041c8026a2204290300210a20002903c002210b02404100200041d0026a22092903002201428080808010544100200041d8026a22032903002206501b200142808080801085200684501b0d0041004100101e0b4124200041c0026a10192004290300210c20002903c002210d024041002009290300220542808080801054410020032903002202501b200542808080801085200284501b0d0041004100101e0b200b200a20012006200d200c20052002104c41c000200041c0026a102420002802c002410010290c130b200142d581a7c805852005842002200684220684500d0820014293a9f5d1058520058420068450450d120240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004198026a4200370300200042003703900220004200370388022000420a3703800220004180026a200041a0026a1027200041a0026a4100200041c0026a103a41c000200041a0026a102420002802a0022204200041c0026a10222004412010290c120b0240200142d5f4e9d40b56200320041b200820091b0d000240200142fffbbaf607562002420052220320041b2005420052200642005520071b220820091b0d00200142c2f089d306852005842002200684220684500d0a200142b18482850785200584200684500d0b200142bdf893a3078520058420068450450d130240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004198026a4200370300200042003703900220004200370388022000420b3703800220004180026a200041a0026a1027200041a0026a4100200041c0026a103a41c000200041a0026a102420002802a0022204200041c0026a10222004412010290c130b0240200142c0b6e2ae0956200320041b200820091b0d0020014280fcbaf607852005842002200684220684500d0c200142c496bfcd088520058420068450450d1310510c130b200142c1b6e2ae09852005842002200684220684500d0c200142bbb996c80a8520058420068450450d1210540c120b0240200142a6c1c8900d562002420052220320041b2005420052200642005520071b220820091b0d00200142d6f4e9d40b852005842002200684220684500d0d200142f79e97e10b85200584200684500d0e200142d582e8a20c8520058420068450450d120240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004180026a41186a420037030020004200370390022000420037038802200042053703800220004180026a200041c0026a1027200041c0026a4100200041a0026a103a200041a8026a2903002101200041b0026a350200210620002903a002210541c000200041c0026a102420002802c0022104200041c0026a41186a4200370300200020063703d002200020013703c802200020053703c0022004200041c0026a10222004412010290c120b0240200142bdda8beb0d56200320041b200820091b0d00200142a7c1c8900d852005842002200684220684500d0f200142cfd996a80d8520058420068450450d120240101d450d0041004100101e0b20004204420042004200101aad42004200420010582000290300200041086a290300200041106a290300200041186a2903002000290320200041286a290300200041306a290300200041386a2903002000290340200041c8006a290300200041d0006a290300200041d8006a2903002000290360200041e8006a290300200041f0006a290300200041f8006a29030020002903800120004188016a29030020004190016a29030020004198016a29030020002903a001200041a8016a290300200041b0016a290300200041b8016a29030020002903c001200041c8016a290300200041d0016a290300200041d8016a290300105941c000200041c0026a102420002802c002410010290c120b200142beda8beb0d852005842002200684220684500d0f200142e995dbff0f85200584200684500d100c110b10410c100b10460c0f0b10480c0e0b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004180026a41186a420037030020004200370390022000420037038802200042063703800220004180026a200041c0026a1027200041c0026a4100200041a0026a103a200041a8026a2903002101200041b0026a350200210620002903a002210541c000200041c0026a102420002802c0022104200041c0026a41186a4200370300200020063703d002200020013703c802200020053703c0022004200041c0026a10222004412010290c0d0b104a0c0c0b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b200041b8026a42fff2c695e1b5fbb8ee0037030020004290a0bcfff086d88fcd003703b002200042caa29889e0d5bed1df003703a802200042c9cd84ebc59099ce163703a002200041a0026a4100200041c0026a103941c000200041a0026a102420002802a0022204200041c0026a10222004412010290c0b0b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004198026a420037030020004200370390022000420037038802200042033703800220004180026a200041a0026a1027200041a0026a4100200041c0026a103a41c000200041a0026a102420002802a0022204200041c0026a10222004412010290c0a0b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004198026a420037030020004200370390022000420037038802200042093703800220004180026a200041a0026a1027200041a0026a4100200041c0026a103a41c000200041a0026a102420002802a0022204200041c0026a10222004412010290c090b104d0c080b104f0c070b10500c060b10530c050b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b41c000200041c0026a102420002802c0022104200041d8026a4200370300200042003703d002200042003703c802200042e8073703c0022004200041c0026a10222004412010290c040b10560c030b0240101d450d0041004100101e0b0240101a41034b0d0041004100101e0b20004180026a41186a420037030020004200370390022000420037038802200042073703800220004180026a200041c0026a1027200041c0026a4100200041a0026a103a200041a8026a2903002101200041b0026a350200210620002903a002210541c000200041c0026a102420002802c0022104200041c0026a41186a4200370300200020063703d002200020013703c802200020053703c0022004200041c0026a10222004412010290c020b0240101d450d0041004100101e0b0240101a41c3004b0d0041004100101e0b4104200041c0026a1019200041c8026a2204290300210a20002903c002210b02404100200041d0026a22092903002201428080808010544100200041d8026a22032903002206501b200142808080801085200684501b0d0041004100101e0b4124200041c0026a10192004290300210c20002903c002210d024041002009290300220542808080801054410020032903002202501b200542808080801085200284501b0d0041004100101e0b200041e0016a200b200a20012006200d200c20052002105a200041e8016a2903002101200041f0016a2903002106200041e0016a41186a290300210520002903e001210241c000200041c0026a102420002802c0022104200041c0026a41186a2005370300200020063703d002200020013703c802200020023703c0022004200041c0026a10222004412010290c010b105b0b41004100101e200041e0026a24000b0400106f0b040010380b5501027f230041206b22002400103641800110211a41c00041e00010230240101d450d0041004100101e0b103b41c000200010242000280200220141e888044100101f6b41041020200141041029200041206a24000b0b710400418080040b4d6f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c65640063616c6c206661696c65642077697468206e6f2072657665727420646174610041d488040b01010041da88040b0502000000030041e688040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600d631046e616d6501ae3173000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030a67657441646472657373040c67657443616c6c56616c75650506726576657274060666696e697368070b676574436f646553697a650808636f6465436f7079090c73746f7261676553746f72650a0b73746f726167654c6f61640b096b656363616b3235360c0c656d69744c6f674576656e740d1167657452657475726e4461746153697a650e0e72657475726e44617461436f70790f0c63616c6c436f6e7472616374100a63616c6c537461746963110a676574436861696e4964120a6765744761734c6566741311676574426c6f636b54696d657374616d70141367657445787465726e616c436f646553697a6515115f5f7761736d5f63616c6c5f63746f727316085f5f6d756c746933171a753235365f66726f6d5f6269675f656e6469616e5f62797465731818753235365f746f5f6269675f656e6469616e5f62797465731919777261707065725f63616c6c646174616c6f61645f753235361a15777261707065725f63616c6c646174615f73697a651b0e777261707065725f63616c6c65721c18777261707065725f63757272656e745f636f6e74726163741d1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f1e0e777261707065725f7265766572741f1365766d5f6765745f6d656d6f72795f616464722010777261707065725f636f6465636f70792114777261707065725f6d656d6f72795f67756172642213777261707065725f6d73746f72655f753235362312777261707065725f6d73746f72655f7533322412777261707065725f6d6c6f61645f75323536250d777261707065725f6d636f70792613777261707065725f7373746f72655f753235362712777261707065725f736c6f61645f753235362811777261707065725f6b656363616b323536290e777261707065725f72657475726e2a0c777261707065725f6c6f67312b0c777261707065725f6c6f67322c0c777261707065725f6c6f67332d0f77726974655f63616c6c5f646174612e17777261707065725f72657475726e646174615f636f70792f15777261707065725f63616c6c5f636f6e74726163743012777261707065725f73746174696363616c6c3117777261707065725f63757272656e745f636861696e6964320b777261707065725f6761733312777261707065725f74696d655f7374616d703417777261707065725f72657475726e646174615f73697a653515777261707065725f63616c6c646174615f636f707936137365745f69735f6465706c6f79696e675f74783714777261707065725f657874636f64655f73697a65380f5f5f696e69745f65766d5f686561703910777261707065725f753235365f73686c3a10777261707065725f753235365f7368723b44556e69737761705632506169725f313235332e556e69737761705632506169725f313235332e636f6e7374727563746f725f556e69737761705632506169725f313235333c45556e69737761705632506169725f313235332e556e69737761705632506169725f313235332e636f6e7374727563746f725f556e6973776170563245524332305f313739363d39556e69737761705632506169725f313235332e556e69737761705632506169725f313235332e66696e616c697a655f616c6c6f636174696f6e3e4f556e69737761705632506169725f313235332e556e69737761705632506169725f313235332e616c6c6f636174655f6d656d6f72795f61727261795f745f737472696e675f6d656d6f72795f7074723f57556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e6162695f6465636f64655f745f62797465735f63616c6c646174615f7074724078556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f75696e74323536745f75696e74323536745f61646472657373745f62797465735f63616c6c646174615f707472414e556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f737761705f31313733429701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f34636338376630373566303462646661636362306463353465633062393866393136396231353037613765383365633865653937653334643661373764623461434b556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f737761705f313137335f696e6e6572444b556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e4561556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e616c6c6f636174655f6d656d6f72795f61727261795f745f737472696e675f6d656d6f72795f707472464e556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f6e616d655f313435374754556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f67657452657365727665735f3333314851556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f617070726f76655f313635314949556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f617070726f76655f313630334a56556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f7472616e7366657246726f6d5f313731354b4d556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f7472616e7366657246726f6d5f313731354c4a556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f696e697469616c697a655f3431304d4d556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f6d696e745f3737354e4a556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f6d696e745f3737355f696e6e65724f53556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f62616c616e63654f665f313437335050556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f6e6f6e6365735f31343932514d556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f6275726e5f393436524a556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f6275726e5f3934365f696e6e65725350556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f73796d626f6c5f313436315452556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f7472616e736665725f31363731554a556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f7472616e736665725f31363331564e556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f736b696d5f31323232574b556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f736b696d5f313232325f696e6e6572588601556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f61646472657373745f61646472657373745f75696e74323536745f75696e74323536745f75696e7438745f62797465733332745f627974657333325947556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f7065726d69745f313739355a51556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e6765747465725f66756e5f616c6c6f77616e63655f313438305b4e556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e65787465726e616c5f66756e5f73796e635f313235325c4b556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f73796e635f313235325f696e6e65725d9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f303533333934393364613765326362653737653137626561646636623931313332656233303739333934393566356631373937626638386439353533396538335e9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f336633353465663434396232613962303831323230636532316635373639313030383131306236353365646331393164383238386536306365663538626235665f9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f32356433393530323665366534646434653938303863376436643364643166343561626166343837346165373166373136316666663538646530333135346433609701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f31306532656663333264386133316433623263313161353435623365643039633264626162633538656636646534303333393239643030303265343235623637619701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f35306231353962626239373566353434383730356462373965616664323132626139316332306665356131313061313337353932333935343564333333396166624d556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f736166655472616e736665725f3337366347556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f7570646174655f353236649701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f36653664326361616533656431393061323538366639623537366465393262633830656162373230303261636563323236316262656438396436386133623337659701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f363539316339663562663166656661616431303962373661323065323563383537623639363038306339353231393166383632323066303031613833363633656648556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f6d696e744665655f3633306746556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f6d696e745f31353532689701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f353765626662346464386235303832636462613066323363313730373765336230656362393738326135316530653961313565396263386334623330633536326946556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e66756e5f5f6275726e5f313537396a9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f343737393765616166366466366463326566646231653832343230393430306138323933616666346331653766366439306663633462336533626131386138376b9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f326438393366633966356661323439346333396563656338326466323737386233333232363435386363636533623961353666353337323433376435346135366c60556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e616c6c6f636174655f6d656d6f72795f61727261795f745f62797465735f6d656d6f72795f7074726d9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f643837333364663938333933656332336432313162316465323265636231346262396365333532653134376362626265313963313165313265393062376666326e9701556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f613564316630386364363661316135396538343161323836633766326338373733313162356433333164323331356364326665336335663035653833333932386f3c556e69737761705632506169725f313235335f6465706c6f7965642e556e69737761705632506169725f313235335f6465706c6f7965642e696e6974700463616c6c71065f737461727472066465706c6f79071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e63000200000004030005020500000003270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c00000062000000710041feec090b1995020a2e64656275675f6c6f630000000075000000020093080041a3ed090b0875000000020093080041b7ed090b0875000000020093080041c7ed090b6637000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f93080041b9ee090b0875000000020093080041c9ee090b125d0000006000000008009308ed02019f93080041e3ee090b2a3c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f004196ef090b13c4030b2e64656275675f696e666fb4010000040041aeef090b090401fd0000000c008a0041beef090bb8020800000005000000750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000b050000007500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d280041fdf1090b26032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a0041aaf2090b2c032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d0041e4fa090b01010041eafa090b0503000000040041f6fa090b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600e317046e616d6501b4174c000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030c67657443616c6c56616c75650406726576657274050666696e697368060b676574436f646553697a650708636f6465436f7079080c73746f7261676553746f7265090b73746f726167654c6f61640a096b656363616b3235360b0c656d69744c6f674576656e740c0e637265617465436f6e74726163740d1167657452657475726e4461746153697a650e0e72657475726e44617461436f70790f0c63616c6c436f6e7472616374100a6765744761734c656674111367657445787465726e616c436f646553697a65121367657445787465726e616c436f64654861736813115f5f7761736d5f63616c6c5f63746f7273141a753235365f66726f6d5f6269675f656e6469616e5f62797465731518753235365f746f5f6269675f656e6469616e5f62797465731619777261707065725f63616c6c646174616c6f61645f753235361715777261707065725f63616c6c646174615f73697a65180e777261707065725f63616c6c6572191a777261707065725f63616c6c76616c75655f6e6f745f7a65726f1a0e777261707065725f7265766572741b1365766d5f6765745f6d656d6f72795f616464721c10777261707065725f636f6465636f70791d14777261707065725f6d656d6f72795f67756172641e13777261707065725f6d73746f72655f753235361f12777261707065725f6d73746f72655f7533322012777261707065725f6d6c6f61645f753235362113777261707065725f7373746f72655f753235362212777261707065725f736c6f61645f753235362311777261707065725f6b656363616b323536240e777261707065725f72657475726e250c777261707065725f6c6f6733260f777261707065725f63726561746532270f77726974655f63616c6c5f646174612817777261707065725f72657475726e646174615f636f70792915777261707065725f63616c6c5f636f6e74726163742a0b777261707065725f6761732b17777261707065725f72657475726e646174615f73697a652c137365745f69735f6465706c6f79696e675f74782d22777261707065725f63757272656e745f636f6e74726163745f636f64655f73697a652e2b777261707065725f63757272656e745f636f6e74726163745f707572655f636f6e74726163745f73697a652f14777261707065725f657874636f64655f73697a653014777261707065725f657874636f64655f686173683111777261707065725f646174615f636f7079320f5f5f696e69745f65766d5f686561703316777261707065725f627974657333325f69737a65726f3410777261707065725f753235365f73686c3510777261707065725f753235365f736872363d556e69737761705632466163746f72795f3233332e556e69737761705632466163746f72795f3233332e66696e616c697a655f616c6c6f636174696f6e3776556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e73746f726167655f61727261795f696e6465785f6163636573735f745f6172726179245f745f616464726573735f2464796e5f73746f726167653854556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f616c6c50616972735f3334394f556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e3a55556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f504149525f484153485f31373b5b556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f736574466565546f5365747465725f3233323c9b01556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f366536643263616165336564313930613235383666396235373664653932626338306561623732303032616365633232363162626564383964363861336233373d57556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f637265617465506169725f3139343e4e556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e66756e5f637265617465506169725f3139343f51556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e6765747465725f66756e5f676574506169725f33304053556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f676574506169725f33304155556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e65787465726e616c5f66756e5f736574466565546f5f323133429b01556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f31616632656339303937623266386263326463666561353361396162346232636461623432666132396539613965303464636231346234656663633861613730439b01556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f39666433343936643531333931313036663937643963313264373564396566323534336132313765656166346239633532633666646265323366343561356165449b01556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f37353937613333313764316634373939386265623236366666613862356631663962653036343332316630313535326566303863316665396565623737376462457a556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e73746f726167655f61727261795f696e6465785f6163636573735f745f6172726179245f745f616464726573735f2464796e5f73746f726167655f707472467c556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e61727261795f707573685f66726f6d5f745f616464726573735f746f5f745f6172726179245f745f616464726573735f2464796e5f73746f726167655f7074724740556e69737761705632466163746f72795f3233335f6465706c6f7965642e556e69737761705632466163746f72795f3233335f6465706c6f7965642e696e6974480463616c6c49065f73746172744a2e556e69737761705632466163746f72795f3233332e556e69737761705632466163746f72795f3233332e696e69744b066465706c6f79071201000f5f5f737461636b5f706f696e74657209110200072e726f6461746101052e6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e6300020000000403000502ffffffff03270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a0000000000000008000000ffffffff750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000bffffffff7500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_router_wasm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_router_wasm.hex new file mode 100644 index 000000000..8b65c8114 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/sol_uniswapv2_router_wasm.hex @@ -0,0 +1 @@ +000228440061736d0100000001bb031b6000017f60037f7f7f0060017f0060027f7f0060057e7f7f7f7f017f60047e7f7f7f017f6000017e60017f017f60000060057f7e7e7e7e0060037f7f7f017f60077e7f7f7f7f7f7f017f60067e7f7f7f7f7f017f60087e7e7e7e7e7e7e7e0060047e7e7e7e0060217f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e00600d7f7e7e7e7e7e7e7e7e7e7e7e7e0060097f7e7e7e7e7e7e7e7e00601d7f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e00602d7f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060297f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060187e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060197f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060147e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0060257f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e00600c7e7e7e7e7e7e7e7e7e7e7e7e0060107e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e0002e2021303656e760f67657443616c6c4461746153697a65000003656e760c63616c6c44617461436f7079000103656e760967657443616c6c6572000203656e760a67657441646472657373000203656e760c67657443616c6c56616c7565000203656e7606726576657274000303656e760666696e697368000303656e760b676574436f646553697a65000003656e7608636f6465436f7079000103656e760c73746f7261676553746f7265000303656e760b73746f726167654c6f6164000303656e76096b656363616b323536000103656e761167657452657475726e4461746153697a65000003656e760e72657475726e44617461436f7079000103656e760c63616c6c436f6e7472616374000403656e760a63616c6c537461746963000503656e760a6765744761734c656674000603656e7611676574426c6f636b54696d657374616d70000603656e761367657445787465726e616c436f646553697a65000703757408090303030002020200030708010703030301010301030a010b0c06060001080000070801010d080e0f10111108120d101111081011130812081211141515110816100812080e0e081217111808101411081308180816190d0e0e101a190e0d0e0e0e0e1608090e0e0e0e09100e0e08080808080405017001010105030100030608017f01418080040b073004066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300130463616c6c008301066465706c6f790086010abeec077402000b7501017e2000200420017e200220037e7c20034220882204200142208822027e7c200342ffffffff0f832203200142ffffffff0f8322017e2205422088200320027e7c22034220887c200342ffffffff0f83200420017e7c22034220887c37030820002003422086200542ffffffff0f83843703000b8b0301187e200031001f2102200031001e2103200031001b2104200031001a21052000310018210620003100192107200031001c2108200031001d21092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842004200542088684200642188620074210868484422086200842188620094210868484843703000be90202047e017f200041086a2903002102200041106a2903002103200029030021042001200041186a29030022054228883c0002200120054238883c0000200120034228883c000a200120034238883c000820012005a722003a0007200120054220883c0003200120054230883c0001200120024228883c0012200120024238883c001020012003a722063a000f200120034220883c000b200120034230883c0009200120004108763a0006200120004118763a0004200120064108763a000e200120064118763a000c200120004110763a000520012002a722004108763a0016200120004118763a0014200120064110763a000d20012004a722064108763a001e200120064118763a001c200120044228883c001a200120044238883c0018200120003a0017200120004110763a0015200120024220883c0013200120024230883c0011200120063a001f200120064110763a001d200120044220883c001b200120044230883c00190bdd0302047f187e230041206b2202240010002103200241186a22044200370300200241106a22054200370300200242003703082002420037030020022000200320006b4120200041206a20034b1b10012004310000210620053100002107200231001f2108200231001e2109200231001b210a200231001a210b2002310019210c200231001c210d200231001d210e2002310003210f200231000221102002310001211120023100002112200231000721132002310006211420023100042115200231000521162002310013211720023100122118200231001121192002310017211a2002310016211b2002310014211c2002310015211d2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d42108684848437031020012017201842088684200742188620194210868484422086201a201b42088684201c421886201d421086848484370308200141186a200f20114210862012421886842010420886848442208620132014420886842015421886201642108684848437030020012008200942088684200a200b420886842006421886200c4210868484422086200d421886200e421086848484370300200241206a24000b040010000b17002000410c6a100220004100360208200042003702000b09002000410c6a10030ba10302017f187e230041206b2201240020011004200131001f2102200131001e2103200131001b2104200131001a21052001310018210620013100192107200131001c2108200131001d21092001310003210a2001310002210b2001310001210c2001310000210d2001310007210e2001310006210f200131000421102001310005211120013100132112200131001221132001310010211420013100112115200131001721162001310016211720013100142118200131001521192000200131000a420886200131000b84200131000842188620013100094210868484422086200131000e420886200131000f84200131000c421886200131000d42108684848437031020002012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200041186a200a200c421086200d42188684200b4208868484422086200e200f420886842010421886201142108684848437030020002002200342088684200420054208868420064218862007421086848442208620084218862009421086848484370300200141206a24000b4402017f047e230041206b220024002000100420002903082101200029030021022000290310210320002903182104200041206a240020042003200220018484844200520b100041002802f8880420006a200110050b0c0041002802f8880420006a0b08004100410010060b8b0301037f02400240410028028489042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602808904410020054180807c713602848904410041002802fc880420034110746a3602fc88040c010b4100280280890420044f0d004100200436028089040b41002802f88804220420006a21000240024002402001417f4a0d002002450d01200420016a210102400240200241077122040d00200221040c010b0340200020012d00003a0000200041016a2100200141016a21012004417f6a22040d000b200241787121040b20024108490d010340200020012d00003a0000200020012d00013a0001200020012d00023a0002200020012d00033a0003200020012d00043a0004200020012d00053a0005200020012d00063a0006200020012d00073a0007200041086a2100200141086a2101200441786a22040d000c020b0b0240200220016a100722044f0d0020002001200210080f0b200441004a200120046b2204200148470d0110001a20002004200210010b0f0b00000b7601027f024041002802848904220120004f0d00200041ffff036a220241107620014110766b220140001a410020003602808904410020024180807c713602848904410041002802fc880420014110746a3602fc880441e0000f0b02404100280280890420004f0d004100200036028089040b41e0000bf60303017f047e017f0240200041206a22022000480d00200141186a2903002103200141106a2903002104200141086a2903002105200129030021060240024041002802848904220120024f0d00200241ffff036a220741107620014110766b220140001a410020023602808904410020074180807c713602848904410041002802fc880420014110746a3602fc88040c010b4100280280890420024f0d004100200236028089040b41002802f8880420006a220120054228883c0012200120054238883c0010200120043c000f200120044228883c000a200120044238883c0008200120033c000720012005a722004108763a0016200120004118763a0014200120044220883c000b200120044230883c0009200120034228883c0002200120034238883c000020012004a722024108763a000e200120024118763a000c200120034220883c0003200120034230883c0001200120024110763a000d20012003a722024108763a0006200120024118763a0004200120024110763a000520012006a722024108763a001e200120024118763a001c200120064228883c001a200120064238883c0018200120053c0017200120004110763a0015200120054220883c0013200120054230883c0011200120063c001f200120024110763a001d200120064220883c001b200120064230883c00190f0b00000bce0101037f0240200041206a22022000480d000240024041002802848904220320024f0d00200241ffff036a220441107620034110766b220340001a410020023602808904410020044180807c713602848904410041002802fc880420034110746a3602fc88040c010b4100280280890420024f0d004100200236028089040b41002802f8880420006a22004200370318200042003703102000420037030820004200370300200020013a001f200020014108763a001e200020014110763a001d200020014118763a001c0f0b00000b950301187e41002802f8880420006a220031001f2102200031001e2103200031001c2104200031001d2105200031001b2106200031001a210720003100182108200031001921092000310003210a2000310002210b2000310001210c2000310000210d2000310007210e2000310006210f200031000421102000310005211120003100132112200031001221132000310010211420003100112115200031001721162000310016211720003100142118200031001521192001200031000a420886200031000b84200031000842188620003100094210868484422086200031000e420886200031000f84200031000c421886200031000d42108684848437031020012012201342088684201442188620154210868484422086201620174208868420184218862019421086848484370308200141186a200a200c421086200d42188684200b4208868484422086200e200f4208868420104218862011421086848484370300200120022003420886842006200742088684200842188620094210868484422086200442188620054210868484843703000bc40201037f02400240410028028489042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602808904410020054180807c713602848904410041002802fc880420034110746a3602fc88040c010b4100280280890420044f0d004100200436028089040b02402002450d0041002802f88804220320006a2104200320016a210002400240200241077122010d00200221010c010b0340200420002d00003a0000200441016a2104200041016a21002001417f6a22010d000b200241787121010b20024108490d000340200420002d00003a0000200420002d00013a0001200420002d00023a0002200420002d00033a0003200420002d00043a0004200420002d00053a0005200420002d00063a0006200420002d00073a0007200441086a2104200041086a2100200141786a22010d000b0b0bc40c03017f047e227f23004180016b22032400200141086a2903002104200141106a2903002105200129030021062003200141186a2903002207a722083a006720032005a722093a006f20032007420888a7220a3a006620032007421888a7220b3a006420032007422888a7220c3a006220032007423888a7220d3a006020032005420888a7220e3a006e20032005421888a7220f3a006c20032007421088a722103a006520032007422088a722113a006320032007423088a722123a006120032004420888a722133a007620032004421888a722143a007420032005421088a722153a006d20032005422088a722163a006b20032005422888200742188684a722173a006a20032005423888200742088684a722183a006820032004422888200542188684a722193a007220032004423888200542088684a7221a3a007020032005423088200742108684a7221b3a006920032006420888a7221c3a007e20032006421888a7221d3a007c20032006422888200442188684a7221e3a007a20032006423888200442088684a7221f3a007820032004a722203a007720032004421088a722213a007520032004422088a722223a007320032004423088200542108684a722233a007120032006a722243a007f20032006421088a722253a007d20032006422088a722263a007b20032006423088200442108684a722273a00792003200241186a29030022044228883c0042200320044238883c00402003200241106a29030022054228883c004a200320054238883c0048200320044220883c0043200320044230883c00412003200241086a29030022074228883c0052200320074238883c0050200320054220883c004b200320054230883c004920032007a722014108763a0056200320014118763a005420032004a722283a0047200320284108763a0046200320284118763a004420032005a722293a004f200320294108763a004e200320294118763a004c200320284110763a0045200320294110763a004d2003200229030022044228883c005a200320044238883c0058200320013a0057200320014110763a0055200320074220883c0053200320074230883c0051200320044220883c005b200320044230883c005920032004a722013a005f200320014108763a005e200320014118763a005c200320014110763a005d2003200a3a00262003200b3a00242003200c3a00222003200d3a00202003200e3a002e2003200f3a002c200320173a002a200320183a0028200320083a0027200320103a0025200320113a0023200320123a0021200320133a0036200320143a0034200320193a00322003201a3a0030200320093a002f200320153a002d200320163a002b2003201b3a00292003201c3a003e2003201d3a003c2003201e3a003a2003201f3a0038200320203a0037200320213a0035200320223a0033200320233a0031200320243a003f200320253a003d200320263a003b200320273a0039200320032d002041f3006a3a0020200320032d002141e5006a3a0021200320032d002241f4006a3a0022200320032d002341e9006a3a0023200320032d002441ed006a3a0024200320032d002541ed006a3a0025200320032d002641f5006a3a0026200320032d002741f4006a3a0027200320032d002841e1006a3a0028200320032d002941e2006a3a0029200320032d002a41ec006a3a002a200320032d002b41e5006a3a002b200320032d002c41df006a3a002c200341206a2003100a02400240200331001e420886200331001f84200331001a420886200331001b84200331001842188620033100194210868484422086200331001c421886200331001d421086848484200331000a420886200331000b84200331000842188620033100094210868484422086200331000e420886200331000f84200331000c421886200331000d42108684848484200331001242088620033100138420033100104218862003310011421086848420033100014210862003310000421886842003310002420886842003310003848442208620033100164208862003310017842003310014421886200331001542108684848420033100064208862003310007842003310004421886200331000542108684848484500d0041808004411a10050c010b200341e0006a200341c0006a1009200341013a001f200341206a200310090b20034180016a24000b8f0604017f047e027f147e230041c0006b22022400200041086a2903002103200041106a2903002104200029030021052002200041186a29030022064228883c0022200220064238883c0020200220044228883c002a200220044238883c0028200220064220883c0023200220064230883c0021200220034228883c0032200220034238883c0030200220044220883c002b200220044230883c002920022003a722004108763a0036200220004118763a003420022006a722073a0027200220074108763a0026200220074118763a002420022004a722083a002f200220084108763a002e200220084118763a002c200220074110763a0025200220084110763a002d200220054228883c003a200220054238883c0038200220003a0037200220004110763a0035200220034220883c0033200220034230883c0031200220054220883c003b200220054230883c003920022005a722003a003f200220004108763a003e200220004118763a003c200220004110763a003d200241206a2002100a200231001f2103200231001e2104200231001b2105200231001a2106200231001821092002310019210a200231001c210b200231001d210c2002310003210d2002310002210e2002310001210f200231000021102002310007211120023100062112200231000421132002310005211420023100132115200231001221162002310010211720023100112118200231001721192002310016211a2002310014211b2002310015211c2001200231000a420886200231000b84200231000842188620023100094210868484422086200231000e420886200231000f84200231000c421886200231000d421086848484370310200120152016420886842017421886201842108684844220862019201a42088684201b421886201c421086848484370308200141186a200d200f421086201042188684200e42088684844220862011201242088684201342188620144210868484843703002001200320044208868420052006420886842009421886200a4210868484422086200b421886200c421086848484370300200241c0006a24000b120041002802f8880420006a20012002100b0b100041002802f8880420006a200110060bfe0201037f024020004102470d0041b480044114100541000f0b02402002450d000240100c220320024e0d00024020000d0002400240410028028489042202200320016a22004f0d00200041ffff036a220441107620024110766b220240001a410020003602808904410020044180807c713602848904410041002802fc880420024110746a3602fc88040c010b4100280280890420004f0d004100200036028089040b41002802f8880420016a41002003100d41010f0b024020030d0041c98004411f10052000450f0b024020034180084a0d0041f0800441002003100d41f08004200310052000450f0b419b8004411810052000450f0b02400240410028028489042204200220016a22034f0d00200341ffff036a220541107620044110766b220440001a410020033602808904410020054180807c713602848904410041002802fc880420044110746a3602fc88040c010b4100280280890420034f0d004100200336028089040b41002802f8880420016a41002002100d0b2000450b860101037f02400240410028028489042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602808904410020054180807c713602848904410041002802fc880420034110746a3602fc88040c010b4100280280890420044f0d004100200436028089040b41002802f8880420006a20012002100d0b9c0303017f047e027f230041206b22072400200241086a2903002108200241106a29030021092002290300210a2007200241186a290300220b4228883c00022007200b4238883c0000200720094228883c000a200720094238883c00082007200b4220883c00032007200b4230883c0001200720084228883c0012200720084238883c0010200720094220883c000b200720094230883c000920072008a722024108763a0016200720024118763a00142007200ba7220c3a00072007200c4108763a00062007200c4118763a000420072009a7220d3a000f2007200d4108763a000e2007200d4118763a000c2007200c4110763a00052007200d4110763a000d2007200a4228883c001a2007200a4238883c0018200720023a0017200720024110763a0015200720084220883c0013200720084230883c00112007200a4220883c001b2007200a4230883c00192007200aa722023a001f200720024108763a001e200720024118763a001c200720024110763a001d20002001410c6a200741002802f8880420036a2004100e20052006102a2102200741206a240020020b1d0020002001410c6a41002802f8880420026a2003100f20042005102a0b040010100b040010110b0400100c0bfb0201037f02400240410028028489042203200220006a22044f0d00200441ffff036a220541107620034110766b220340001a410020043602808904410020054180807c713602848904410041002802fc880420034110746a3602fc88040c010b4100280280890420044f0d004100200436028089040b41002802f8880420006a2100024002401000220420014b0d002002450d0102400240200241077122010d00200221010c010b0340200041003a0000200041016a21002001417f6a22010d000b200241787121010b20024108490d01034020004200370000200041086a2100200141786a22010d000c020b0b0240200220016a20044d0d0020002001200420016b22041001200220046b2202450d01200020046a210002400240200241077122010d00200221010c010b0340200041003a0000200041016a21002001417f6a22010d000b200241787121010b20024108490d01034020004200370000200041086a2100200141786a22010d000c020b0b20002001200210010b0b0b00410041013a00f088040b3701027f41002d00f08804210010072101024020000d0020010f0b024010002200410048200120006a2200200148470d0020000f0b00000b040010070b09002000410c6a10120b5601017f024041002d00f488040d0041003f004110743602f88804410140001a3f002100410041013a00f488044100200041107422003602fc88044100200041002802f888046b36028489044100410036028089040b0bd20204017f047e017f027e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341206a22082000290300370000200341186a4200370000200341386a200041186a290300370000200341306a200041106a290300370000200341286a200041086a29030037000020034200370010200342003700082003420037000020082001410376411f716b220041086a290000220520014107712203ad220786200029000022094201882003413f73ad220488842106200041186a290000200786200041106a290000220a420188200488842104200a20078620054201882003417f73413f71ad88842105200920078621070b200220073703002002200637030820022005370310200241186a20043703000bc90202017f067e230041c0006b210302400240200141004a0d00200041186a2903002104200041106a2903002105200041086a2903002106200029030021070c010b0240200141ff014d0d00420021074200210642002105420021040c010b200341386a4200370000200341306a4200370000200341286a4200370000200341186a200041186a29030037000020034200370020200320002903003700002003200041106a2903003700102003200041086a29030037000820032001410376411f716a220341106a290000220620014107712200ad220488200341186a29000022084201862000413f73ad220786842105200341086a290000220920048820064201862000417f73413f71ad8684210620032900002004882009420186200786842107200820048821040b200220073703002002200637030820022005370310200241186a20043703000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a1022200941186a42003703002009420037031020094200370308200942c10037030041042009102241004124101d0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c00020081022200941c0006a24000bad0506027f027e017f017e017f157e230041e0006b220024000240101c450d0041004100101d0b0240101841c3014b0d0041004100101d0b4104200041c0006a1017200041c8006a220129030021022000290340210302404100200041d0006a22042903002205428080808010544100200041d8006a22062903002207501b200542808080801085200784501b0d0041004100101d0b4124200041c0006a101720062903002108200429030021092001290300210a2000290340210b41c400200041c0006a10172006290300210c2004290300210d2001290300210e2000290340210f41e400200041c0006a101720062903002110200429030021112001290300211220002903402113418401200041c0006a10172001290300211420002903402115024041002004290300221642808080801054410020062903002217501b201642808080801085201784501b0d0041004100101d0b41a401200041c0006a1017200041c0006a41186a22042903002118200041c0006a41106a2903002119200041c0006a41086a290300211a2000290340221b102f5a4101201a501b41012019201884501bad420042004200103b2000200520052005200520052005200520052003200220052007200b200a20092008200f200e200d200c20132012201120102015201420162017201b201a20192018103c200041286a2903002105200041306a2903002107200041386a2903002116200041086a2903002117200041106a2903002118200041186a29030021192000290320211a2000290300210241c000200041c0006a102420002802402101200420193703002000201837035020002017370348200020023703402001200041c0006a10222004201637030020002007370350200020053703482000201a370340200141206a200041c0006a1022200141c0001029200041e0006a24000b950201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a22044200370300200542003703302005420037032820054218370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542bae495a3d7ee9ba932370330200542c48ac9ca848ad6a22037032820054200370320200641c4006a200541206a1022200641e400101d0b200541c0006a24000bc30a03027f077e047f230041c0036b222124002021222241e0026a41186a42ebebe4fcb28587a751370300202242dea0e0bdc4f6b08d6a3703f002202242b1f48ed6d0a7eb857e3703e802202242bfa3ffbd899593d51a3703e002202241e0026a202241c0026a1027202241c0026a41186a2903002123202241c0026a41106a2903002124202241c0026a41086a290300212520222903c0022126202241a0026a101a202220222900a0023700e001202220222900a8023700e801202220222900b0023700f001202220222900b8023700f801202241e0016a20224180026a101520224180026a41086a290300212720224180026a41106a35020021282022290380022129102f201d584101201e501b4101201f202084501bad420042004200103b2022201d201d201d201d201d201d201d201d2009200a200b200c2026202520242023200d200e200f2010201120122013201420152016201720182029202720284200201d201d201d201d105f202241386a290300211d202241306a290300211e202241286a29030021202022290320211f2009200a200b200c2019201a201b201c20222903002218202241086a2903002217202241106a2903002216202241186a2903002215106a202241c0016a41186a42ebebe4fcb28587a751370300202242dea0e0bdc4f6b08d6a3703d001202242b1f48ed6d0a7eb857e3703c801202242bfa3ffbd899593d51a3703c001202241c0016a202241a0016a102720224180016a41186a42003703002022202241a0016a41106a350200220b370390012022202241a0016a41086a290300220a37038801202220222903a00122093703800120224180016a202241e0006a1016202220222900603700402022202229006837004820222022290070370050202220222900783700580240202241c0006a10350d0041004100101d0b41c000202241a0036a1024202241a0036a41086a2903002114202241a0036a41106a2903002113202241a0036a41186a222a290300211220222903a003210c202141606a2221222b2400202141186a201237030020212013370310202120143703082021200c370300202a4200370300202242003703b003202242003703a803202242cdfae9f0023703a003202241a0036a41e00120224180036a103720224180036a41086a290300211420224180036a41106a290300211320224180036a41186a29030021122022290380032111202b41606a222b222c2400202b41186a2012370300202b2013370310202b2014370308202b2011370300200ca7222d202b1022202a201d3703002022201e3703b003202220203703a8032022201f3703a003202d41046a202241a0036a1022102e210c202c41606a222b222a2400202b41186a4200370300202b200b370310202b200a370308202b2009370300202a41606a222a222c2400202b202a1016202a290000210b202a290008210a202a2900102109202a2900182114202c41606a222b222a2400202b2014370018202b2009370010202b200a370008202b200b370000202a41606a222a2400202a41186a4200370300202a4200370310202a4200370308202a420037030002400240200c202b202a202d4124202d4100102c0d0041c000202241a0036a102420222802a003222141001030102b20211030101d0c010b10301a2021290300202141086a290300202141106a290300202141186a290300420042004200420010420b2019201a201b201c201f2020201e201d106b2000201f370320200020163703102000201737030820002018370300200041306a201e370300200041286a2020370300200041186a2015370300200041386a201d370300202241c0036a24000bef1a09017f077e017f057e017f027e017f037e017f23004180056b220d24002001200384200220048484420052ad420042004200107c20052007842006200884844200522009200b84200a200c848442005271ad420042004200105a200d4180046a2001420042e50742001014200d41a0046a2002420042e50742001014200d41b0046a20012002420042001014200d41d0036a2003420042e50742001014200d41c0036a2004420042e50742001014200d41f0036a20014200420042001014200d4190046a20024200420042001014200d41e0036a20014200420042001014200d2903800421010240200d2903c803420052200d41d0036a41086a2903002202200d2903c0037c220e20025472200d29039004220f200d41a0046a41086a290300200d2903a0042202200d4180046a41086a2903007c2204200254ad7c2210200d41f0036a41086a290300200d2903f003220320047c2202200354ad7c7c22117c2204200d2903b0047c2212200d2903d0032213200d2903e0037c22147c22032012542215200d4190046a41086a2903002011201054ad7c2004200f54ad7c200d41b0046a41086a2903007c2012200454ad7c2212200e200d41e0036a41086a2903007c2014201354ad7c7c2015ad7c220420125420042012511b724101470d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b200d4190036a20014200200942001014200d4180036a20024200200942001014200d41a0036a20014200200a42001014200d41b0036a20024200200a42001014200d41c0026a2009200a420042001014200d41d0026a20012002420042001014200d4190026a20024200200b42001014200d41b0026a200c4200200142001014200d41f0026a200b4200200142001014200d4180026a200a4200200342001014200d41a0026a20044200200942001014200d41e0026a20034200200942001014200d29039003210f02402003200484420052200b200c84420052712004420052200a42005271200d2903a80242005272200d2903880242005272200d41e0026a41086a290300220a200d2903a002200d290380027c7c220b200a547272200c420052200242005271200d2903b80242005272200d2903980242005272200d41f0026a41086a290300220a200d2903b002200d290390027c7c220c200a547272200d2903b0032210200d4180036a41086a290300200d29038003220a200d4190036a41086a2903007c2209200a54ad7c2211200d41a0036a41086a290300200d2903a003220a20097c2212200a54ad7c7c22137c220a200d2903d0022214200d2903c0027c22167c2209200d2903e0022217200d2903f0027c22187c220e2009542215200d41b0036a41086a2903002013201154ad7c200a201054ad7c200d41d0026a41086a290300200d41c0026a41086a2903007c2016201454ad7c7c2009200a54ad7c2209200b200c7c2018201754ad7c7c2015ad7c220a200954200a2009511b72410171450d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b200d41c0016a2005420042e80742001014200d41e0016a2006420042e80742001014200d41f0016a20052006420042001014200d4190016a2007420042e80742001014200d4180016a2008420042e80742001014200d41b0016a20054200420042001014200d41d0016a20064200420042001014200d41a0016a20054200420042001014200d2903c001210b0240200d29038801420052200d4190016a41086a2903002209200d290380017c220820095472200d2903d0012207200d41e0016a41086a290300200d2903e0012209200d41c0016a41086a2903007c2205200954ad7c2210200d41b0016a41086a290300200d2903b001220920057c2205200954ad7c7c22117c2209200d2903f0017c2206200d290390012213200d2903a0017c22147c220c2006542215200d41d0016a41086a2903002011201054ad7c2009200754ad7c200d41f0016a41086a2903007c2006200954ad7c22062008200d41a0016a41086a2903007c2014201354ad7c7c2015ad7c220920065420092006511b724101470d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b0240200b20017c2219200b5a200520027c2019200b542215ad7c221a20055a201a200551221b1b200c20037c22012015201a200554201b1bad7c221c200c5a200920047c2001200c54ad7c201c200154ad7c221d20095a201d2009511b201c200c85201d20098584501b0d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b02402019201c84201a201d848422094200520d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42123703c0044104200d41c0046a102241004124101d0b4200200a200950200f200e842012200a848450724200201d79201c7942c0007c201d4200521b201a7920197942c0007c201a4200521b22094280017c2201201c201d8442005222151b2205200a79200e7942c0007c200a4200521b201279200f7942c0007c20124200521b22024280017c2204200e200a84420052221b1b220c54221e42002001200954ad20151b220142002004200254ad201b1b22025420012002511b2215ad7d220742005242002015410047ad7d22084200522008501b2005200c7d220942ff0156200120027d201ead7d22024200522002501b20151b7222151b21014200200e20151b21054200201220151b21034200200f20151b2104024020150d00200942ff0185200784200220088484500d00200d41c0006a41286a2012370000200d41e0006a2215200f37000042002118200d41c0006a41186a4200370000200d41c0006a41306a200e370000200d41c0006a41386a200a370000200d4200370050200d4200370048200d4200370040201541ff012009a76b221b410376411f716b221541086a2900002205201b410771221bad2201862015290000220b420188201b413f73ad220c88842104201541186a290000200186201541106a2900002203420188200c8884210620032001862005420188201b417f73413f71ad8884210c200b200186210b02400240200942017c220520072005200954221520022015ad7c2201200254200520095a1bad7c220384200120082003200754ad7c22108484500d004200211f200d41386a4200370000200d41306a4200370000200d41286a4200370000200d41186a200a370000200d4200370020200d200f370000200d2012370008200d200e370010200d2005a7221b410376411f716a221541106a29000022092005420783220a88201541186a2900002202420186201b410771221b413f73ad220f86842112201541086a2900002208200a882009420186201b417f73413f71ad8684210e2015290000200a882008420186200f8684210f201d201c427f7c2209201c54ad7c20092019427f7c22202019542215201a2015ad7c427f7c2207201a542007201a511bad7c2211200954ad7c427f7c21212002200a8821134200211403402012420186200e423f88842202202120134201862012423f888422137d2011200254ad7d201120027d2020200f4201862006423f88842208542007200e420186200f423f8884220a542007200a511bad54ad7d423f872209201c83220f7d2216200820092019832217542215200a2009201a83220e54200a200e511bad22187d211220132009201d837d2002200f54ad7d2016201854ad7d2113200a200e7d2015ad7d210e200820177d210f20012005427f7c22022005542215ad7c427f7c220a200151211b200a200154211e2003427f7c22082003542122200b423f8821162004423f88211742002006420186200c423f88848421062014200b42018684210b20094201832218211420022105200a210120082015201e201b1bad7c2209210342002016200442018684842216210442002017200c42018684842217210c2002200984200a20102022ad7c2009200854ad7c427f7c2210848450450d000b4200210a42002109201621042017210c0c010b4200211f4200210a420021090b201f2004420186200b423f8884842103200a200c4201862004423f888484210520092006420186200c423f88848421012018200b4201868421040b200020043703002000200337030820002005370310200041186a2001370300200d4180056a24000bc20304027f017e017f087e23002209210a02402001421f7c220b2005542002200b200154220cad7c220d200654200d2006511b2003200c200d200254200b20015a1bad7c220b2007542004200b200354ad7c220d200853200d2008511b200b200785200d20088584501b0d0041004100101d0b200941606a220924002001a7200910172009290300210b0240200941086a290300220d504100200941106a290300220e200941186a290300220f84501b0d0041004100101d0b0240200b4205862210200142207c22117c2212200558200d420586200b423b88842213200220112001542209ad7c22147c2012201054220cad7c220520065820052006511b200e420586200d423b88842210200320092014200254201120015a1bad7c22017c2202200c200520135420052013511bad7c2206200758200f420586200e423b888420042001200354ad7c22037c2002201054ad7c2006200254ad7c220220085820022008511b2006200785200220088584501b0d0041004100101d0b2000200b37032020002011370300200041286a200d37030020002014370308200041306a200e37030020002001370310200041386a200f370300200041186a2003370300200a24000bcc0608037f037e017f017e017f017e017f0a7e230041e0006b2209210a200924000240200520017d429f0156200620027d2005200154220bad7d220c420052200c501b200720037d220c200b200620025420062002511bad220d7d220e420052200820047d2007200354ad7d200c200d54ad7d220c420055200c501b200e200c84501b0d0041004100101d0b2001a7220b200a41c0006a1017200a41c0006a41186a220f2903002110200a41c0006a41106a22112903002112200a41c0006a41086a22132903002114200a2903402115200b41206a200a41c0006a1017200f29030021162011290300211720132903002118200a2903402119200941606a22092400200b41c0006a200910172009290300210d0240200941086a290300220c504100200941106a290300220e200941186a290300221a84501b0d0041004100101d0b200a200d20017c2201200c20027c2001200d542209ad7c2202200e20037c220120092002200c542002200c511bad7c2202201a20047c2001200e54ad7c2002200154ad7c2005200620072008103e200a41386a2903002101200a41306a2903002105200a41286a2903002103200a41186a2903002107200a41106a290300210c200a41086a2903002104200a2903202108200a290300210d200b41e0006a200a41c0006a10172013290300210e200a290340211a0240410020112903002202428080808010544100200f2903002206501b200242808080801085200684501b0d0041004100101d0b200b4180016a200a41c0006a1017200a41c8006a290300211b200a41d0006a290300211c200a41c0006a41186a290300211d2000200a2903403703a0012000201a37038001200020083703602000200d37034020002019370320200020123703102000201437030820002015370300200041b8016a201d370300200041b0016a201c370300200041a8016a201b37030020004198016a200637030020004190016a200237030020004188016a200e370300200041f0006a2005370300200041e8006a2003370300200041d8006a2007370300200041d0006a200c370300200041c8006a2004370300200041386a2016370300200041306a2017370300200041286a2018370300200041186a2010370300200041f8006a2001370300200a41e0006a24000bd10703017f187e047f230041a0026b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad420042004200103f200041b8016a2903002102200041b0016a2903002103200041a8016a290300210420004198016a290300210520004190016a290300210620004188016a2903002107200041f8006a2903002108200041f0006a2903002109200041e8006a290300210a200041d8006a290300210b200041d0006a290300210c200041c8006a290300210d200041206a41186a290300210e200041206a41106a290300210f200041206a41086a2903002110200041d8016a2903002111200041d0016a2903002112200041c8016a290300211320002903a0012114200029038001211520002903602116200029034021172000290320211820002903c001102f5a41012013501b41012012201184501bad420042004200103b2000200220022002200220182010200f200e2017200d200c200b2016200a200920082015200720062005201420042003200220022002200220021041200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c00020004180026a102420004180026a41186a2219290300210620004180026a41106a221a290300210420004180026a41086a221b29030021052000290380022118200041e0016a41186a4200370300200042003703f001200042003703e801200042203703e0012018a7221c200041e0016a10222003a720004180026a1024201b2903002111201a29030021122000290380022117201920192903002209370300200020123703900220002011370388022000201737038002201c41206a20004180026a1022201842c0007c210202400240201720128420112009848450450d002002210a0c010b200620042002201854221920052019ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a720004180026a10242002a720004180026a10222010200142017c22062001542219200f2019ad7c2207200f54200620015a1bad7c220820105421192014200e200242207c220a200254221a200d201aad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b2005200354221a200c201aad7c2215200c54200520035a1bad7c2216200b54ad7c2113200a21022001210d200f210e200621012007210f20082110200521032015210c2016210b2006201754200720115420072011511b200820125420042019ad7c220420095420042009511b2008201285200420098584501b0d000b0b201c200a20187da71029200041a0026a24000b87270c027f017e027f027e017f017e017f017e017f037e217f057e230041c0016b221d211e201d240002402011201384201220148484221f4200520d00201e41a0016a41186a2220428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a22214200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d2020428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a102220214200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b200d20114205867ca741606a201e41a0016a1017201e41a0016a41086a22212903002122201e2903a001212302404100201e41a0016a41106a22242903002225428080808010544100201e41a0016a41186a22262903002227501b202542808080801085202784501b0d0041004100101d0b201d41606a221d22202400201d41186a42ebebe4fcb28587a751370300201d42dea0e0bdc4f6b08d6a370310201d42b1f48ed6d0a7eb857e370308201d42bfa3ffbd899593d51a370300202041606a222022282400201d202010272020290300202385202041106a350200202542ffffffff0f838584202041086a2903002022858450ad420042004200106c202841606a221d22202400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202041606a222022282400201d20201027202041186a2903002125202041106a2903002122202041086a290300212320202903002127201e41e0006a200d200e200f201020112012201320141018ad4200420042001043201e41c0006a20272023202220252005200620072008201e290360201e41e0006a41086a290300201e41e0006a41106a290300201e41e0006a41186a2903001061201e41c0006a41186a2903002106201e41c0006a41106a2903002105201e41c0006a41086a2903002122201e2903402225a72220201e41a0016a10240240201e2903a00122072024290300222384202129030022082026290300222984844200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d0b2020201e41a0016a10240240201e2903a0012007427f7c222756201e41a8016a2221290300222a20082027200754221dad7c427f7c220756202a2007511b201e41b0016a2224290300222b2023427f7c222a201d200720085420072008511bad7c220856201e41a0016a41186a221d29030022072029202a202354ad7c2008202a54ad7c427f7c22235620072023511b202b200885200720238584501b0d00201d428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b2027420586202542207c22087ca7201e41a0016a1024201e2903a00120095a20212903002207200a5a2007200a511b2024290300220a200b5a201d2903002207200c5a2007200c511b200a200b852007200c8584501bad420042004200106d0240201f4200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b200da72224201e41a0016a1017201e41a0016a41086a2903002127201e2903a001212a02404100201e41a0016a41106a290300220c428080808010544100201e41a0016a41186a2903002207501b200c42808080801085200784501b0d0041004100101d0b202841606a221d22212400201d1019201d2d001f212c201d2d001e212d201d2d001d212e201d2d001c212f201d2d001b2130201d2d001a2131201d2d00192132201d2d00182133201d2d00172134201d2d00162135201d2d00152136201d2d00142137201d2d00132138201d2d00122139201d2d0011213a201d2d0010213b201d2d000f213c201d2d000e213d201d2d000d213e201d2d000c213f201d2d000b2140201d2d000a2141201d2d00092142201d2d00082143201d2d00072144201d2d00062145201d2d00052146201d2d00042147201d2d00032148201d2d00022149201d2d0001214a201d2d0000214b202141606a221d22212400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202141606a2221224c2400201d20211027202141186a2903002109202141106a2903002129202141086a290300212b2021290300214d0240201f4200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b2024201e41a0016a1017201e41a8016a290300214e201e2903a001214f02404100201e41b0016a290300220b428080808010544100201e41b8016a290300220a501b200b42808080801085200a84501b0d0041004100101d0b0240201142015620124200522012501b201342005220144200522014501b2013201484501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b202441206a201e41a0016a1017201e41a0016a41086a221d2903002150201e2903a001215102404100201e41a0016a41106a2221290300221f428080808010544100201e41a0016a41186a22242903002223501b201f42808080801085202384501b0d0041004100101d0b201e41206a204d202b20292009204f204e200b200a20512050201f2023106e201e41206a41186a290300210b201e41206a41106a290300210a201e41206a41086a290300211f201e29032021232020201e41a0016a10240240201e2903a001202129030084201d290300202429030084844200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b2008a7201e41a0016a1024201e41a0016a41186a22242903002109201e41a0016a41106a22262903002129201e41a0016a41086a2228290300212b201e2903a001214d204c41606a2221221d2400201d41606a221d224c2400201d202c3a001f201d202d3a001e201d202e3a001d201d202f3a001c201d20303a001b201d20313a001a201d20323a0019201d20333a0018201d20343a0017201d20353a0016201d20363a0015201d20373a0014201d20383a0013201d20393a0012201d203a3a0011201d203b3a0010201d203c3a000f201d203d3a000e201d203e3a000d201d203f3a000c201d20403a000b201d20413a000a201d20423a0009201d20433a0008201d20443a0007201d20453a0006201d20463a0005201d20473a0004201d20483a0003201d20493a0002201d204a3a0001201d204b3a0000201d20211015202a2027200c20072021290300202141086a290300202141106a290300202141186a2903002023201f200a200b204d202b20292009106f204c41606a221d22212400201d101a201d290000210c201d2900082107201d290010210b201d290018210a202141606a2221221d2400201d41606a221d222c2400201d200a370018201d200b370010201d2007370008201d200c370000201d20211015202141086a290300210c20212903002107202141106a350200210b201e200d200e200f201020112012201320141018ad42004200420010432025202220052006201e290300201e41086a290300201e41106a290300201e41186a2903002007200c200b42001070202c41606a221d22212400201d41186a42ebebe4fcb28587a751370300201d42dea0e0bdc4f6b08d6a370310201d42b1f48ed6d0a7eb857e370308201d42bfa3ffbd899593d51a370300202141606a2221222c2400201d20211027202141086a290300211320212903002111202141106a350200210d2020201e41a0016a10240240201e2903a00122122026290300220c84202829030022142024290300220f84844200520d002024428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d0b2020201e41a0016a10240240201e2903a0012012427f7c2207562028290300221020142007201254221dad7c427f7c22125620102012511b2026290300220e200c427f7c2210201d201220145420122014511bad7c22145620242903002212200f2010200c54ad7c2014201054ad7c427f7c220c562012200c511b200e2014852012200c8584501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b200742058620087ca7201e41a0016a1024201e41a0016a41186a22242903002112201e41a0016a41106a2226290300210c201e41a0016a41086a22282903002107201e2903a0012110202c41606a221d22212400201d41186a4200370300201d200d370310201d2013370308201d2011370300202141606a2221222c2400201d20211016202129000021142021290008210f2021290010210e2021290018210b202c41606a221d22212400201d200b370018201d200e370010201d200f370008201d20143700000240201d10350d0041004100101d0b41c000201e41a0016a10242028290300210f2026290300210e2024290300210b201e2903a0012114202141606a221d22212400201d41186a200b370300201d200e370310201d200f370308201d201437030020244200370300201e42003703b001201e42003703a801201e42cdfae9f0023703a001201e41a0016a41e001201e4180016a1037201e4180016a41086a290300210f201e4180016a41106a290300210e201e4180016a41186a290300210b201e29038001210a202141606a222122282400202141186a200b3703002021200e3703102021200f3703082021200a3703002014a722262021102220242012370300201e200c3703b001201e20073703a801201e20103703a001202641046a201e41a0016a1022102e2114202841606a222122242400202141186a42003703002021200d3703102021201337030820212011370300202441606a2224222824002021202410162024290000211220242900082113202429001021112024290018210d202841606a2221222424002021200d370018202120113700102021201337000820212012370000202441606a22242400202441186a4200370300202442003703102024420037030820244200370300024002402014202120242026412420264100102c0d0041c000201e41a0016a1024201e2802a001221d41001030102b201d1030101d0c010b10301a201d290300201d41086a290300201d41106a290300201d41186a290300420042004200420010420b2020201e41a0016a10240240201e2903a0012212201e41b0016a2221290300221384201e41a8016a22242903002214201e41a0016a41186a221d290300220c84844200520d00201d428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d0b2020201e41a0016a10240240201e2903a0012012427f7c2211562024290300220d201420112012542220ad7c427f7c221256200d2012511b202129030022072013427f7c220d2020201220145420122014511bad7c221456201d2903002212200c200d201354ad7c2014200d54ad7c427f7c22135620122013511b2007201485201220138584501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b201142058620087ca7201e41a0016a10242015201620172018201e2903a001201e41a8016a290300201e41b0016a290300201e41a0016a41186a290300106b200020053703102000202237030820002025370300200041186a2006370300201e41c0016a24000beb0205027f017e017f037e017f230041c0006b22082109200824000240024020052004421f7c220a200454220bad7c220c20017c200a426083220d20007c220e200d54220fad7c220d4200522006200b200c200554200a20045a1bad7c220420027c2205200f200d200c54200d200c511bad7c220c42005220072004200654ad7c20037c2005200454ad7c200c200554ad7c22044200522004501b200c200484501b0d00200e20005a200d20015a200d2001511b200c20025a200420035a20042003511b200c200285200420038584501b0d010b200941206a41186a428080808090ee9ea4ce003703002009420037033020094200370328200942003703204100200941206a1022200941186a42003703002009420037031020094200370308200942c10037030041042009102241004124101d0b200841606a22082400200841186a20043703002008200c3703102008200d3703082008200e37030041c00020081022200941c0006a24000be00605027f077e017f037e037f230041c0006b220d210e200d2400024020065041002007200884501b0d00200e41206a41186a428080808090ee9ea4ce00370300200e4200370330200e4200370328200e42003703204100200e41206a1022200e41186a4200370300200e4200370310200e4200370308200e42c1003703004104200e102241004124101d0b41c000200e41206a1024200e290320220f200e41286a2903002210200e41306a2903002211200e41206a41186a29030022122005420586221342207c221420064205862005423b8884221520142013542216ad7c221720074205862006423b8884221820162017201554201420135a1bad7c221420084205862007423b888422172014201854ad7c1042200d41606a220d22162400200d41186a2008370300200d2007370310200d2006370308200d2005370300200fa7200d10220240201320017c2219200958201520027c2019201354220dad7c2214200a582014200a511b201820037c2207200d201420155420142015511bad7c220a200b58201720047c2007201854ad7c200a200754ad7c2205200c582005200c511b200a200b852005200c8584501b0d0041004100101d0b02402019200158201420025820142002511b200a200358200520045820052004511b200a200385200520048584501b0d00200e41306a211a200e41206a41186a211b200e41286a211c200f21072010210c201121182012210b03402001a7200e41206a10172018200742207c2206200754220d200c200dad7c2209200c54200620075a1bad7c2217201854ad2115201c2903002108200e290320210c02404100201a2903002207428080808010544100201b2903002213501b200742808080801085201384501b0d0041004100101d0b200b20157c210b201641606a220d22162400200d41186a2013370300200d2007370310200d2008370308200d200c3703002006a7200d10222003200142207c2213200154220d2002200dad7c2215200254201320015a1bad7c2208200354210d200621072009210c201721182013210120152102200821032013201954201520145420152014511b2008200a542004200dad7c220420055420042005511b2008200a85200420058584501b0d000b0b2000200f3703002000201037030820002011370310200041186a2012370300200e41c0006a24000ba90204027f017e017f017e230041206b2209210a2009240002402001421f7c220b2005542002200b200154220cad7c220d200654200d2006511b2003200c200d200254200b20015a1bad7c220b2007542004200b200354ad7c220d200853200d2008511b200b200785200d20088584501b0d0041004100101d0b200941606a220924002001a720091017200a200142207c220b2002200b200154220cad7c220d2003200c200d200254200b20015a1bad7c220120042001200354ad7c2009290300200941086a290300200941106a290300200941186a29030020052006200720081043200a41186a2903002101200a41086a2903002102200a29030021032000200a41106a2903003703102000200337030020002002370308200041186a2001370300200a41206a24000bbb0302037f087e230041c0006b2209210a200924000240200520017d423f56200620027d2005200154220bad7d220c420052200c501b200720037d220c200b200620025420062002511bad220d7d220e420052200820047d2007200354ad7d200c200d54ad7d220c420055200c501b200e200c84501b0d0041004100101d0b2001a7220b200a41206a1017200a41206a41186a290300210f200a41206a41106a2903002110200a41206a41086a2903002111200a2903202112200941606a22092400200b41206a200910172009290300210d0240200941086a290300220c504100200941106a290300220e200941186a290300221384501b0d0041004100101d0b200a200d20017c2201200c20027c2001200d542209ad7c2202200e20037c220120092002200c542002200c511bad7c2202201320047c2001200e54ad7c2002200154ad7c20052006200720081044200a41086a2903002102200a41186a2903002106200a41106a29030021012000200a290300370320200020103703102000201237030020002011370308200041306a2001370300200041386a2006370300200041286a2002370300200041186a200f370300200a41c0006a24000be60608017f097e027f037e027f017e017f0b7e230041a0016b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad4200420042001045200041d8006a2903002102200041d0006a2903002103200041c8006a2903002104200041206a41186a2903002105200041206a41106a2903002106200041206a41086a2903002107200029034021082000290320210920004180016a41186a220a42bc8be38eeadb88d3c500370300200042a5d7c98092aab3f27737039001200042e69aace283adc3f63e37038801200042c0d483caa5d2ddd1113703800120004180016a200041e0006a102720002000290360200041e0006a41086a290300200041e0006a41106a290300200041e0006a41186a220b290300200920072006200520082004200320021047200041186a290300210c200041106a290300210d200041086a290300210e2000290300210341c00020004180016a1024200a290300210620004180016a41106a220f290300210420004180016a41086a221029030021052000290380012111200b42003703002000420037037020004200370368200042203703602011a72212200041e0006a10222003a720004180016a102420102903002113200f29030021142000290380012115200a200a2903002209370300200020143703900120002013370388012000201537038001201241206a20004180016a1022201142c0007c210202400240201520148420132009848450450d00200221160c010b200620042002201154220a2005200aad7c2217200554200220115a1bad7c2218200454ad7c21194200211a4200211b420021040340200342207c2205a720004180016a10242002a720004180016a1022201b200142017c2206200154220a201a200aad7c2207201a54200620015a1bad7c2208201b54210a20192018200242207c2216200254220b2017200bad7c2201201754201620025a1bad7c221a201854ad7c2119200c200d2005200354220b200e200bad7c221c200e54200520035a1bad7c221d200d54ad7c210c2016210220012117201a2118200621012007211a2008211b20052103201c210e201d210d2006201554200720135420072013511b20082014542004200aad7c220420095420042009511b2008201485200420098584501b0d000b0b2012201620117da71029200041a0016a24000bf9120a037f017e017f017e017f067e017f057e047f087e230041c0016b220d24002009a7220e200d41a0016a1024200d2903a001420156200d41a0016a41086a220f29030022104200522010501b200d41a0016a41106a22112903002212420052200d41a0016a41186a221329030022104200522010501b2012201084501bad420042004200107d200e200d41a0016a1024200d41e0006a200d2903a0012210200f29030022122011290300221420132903002215107e200d41e0006a41186a2903002116200d41e0006a41106a2903002117200d41e0006a41086a2903002118200d2903602119024020125041002014201584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d42c100370380014104200d4180016a102241004124101d0b2019a7221a41206a10182010a74105741031201a200d41a0016a10240240200d2903a00122122011290300221484200f29030022102013290300221b84844200520d00200d41a0016a41186a428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4211370380014104200d4180016a102241004124101d0b201a200d41a0016a10240240200d2903a0012012427f7c221556200d41a8016a220f290300221c201020152012542213ad7c427f7c221256201c2012511b200d41b0016a2211290300221d2014427f7c221c2013201220105420122010511bad7c221056200d41a0016a41186a22132903002212201b201c201454ad7c2010201c54ad7c427f7c22145620122014511b201d201085201220148584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20132008370300200d20053703a001200d20063703a801200d20073703b0012015420586201942207c221e7ca7200d41a0016a1022200e200d41a0016a1024024002400240200d2903a001221c2011290300220684200f29030022082013290300221d84844200520d00200d41a0016a41186a428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4211370380014104200d4180016a102241004124101d427f2107427f2115427f2112427f21100c010b201c427f7c22072006427f7c22102007201c54221320082013ad7c427f7c221520085420152008511bad7c2212842015201d2010200654ad7c2012201054ad7c427f7c22108484500d010b200942207c211f200d41a0016a41106a210f200d41a0016a41186a2113200d41a0016a41086a2111200d41d8006a2120200d41d0006a2121200d41c8006a2122034020102110201221142015211220072115200e200d41a0016a10240240200d2903a001201c427e7c2209562011290300220720082009201c542223ad7c427f7c221c562007201c511b200f29030022242006427f7c22052023201c200854201c2008511bad7c2207562013290300221b201d2005200654ad7c2007200554ad7c427f7c220856201b2008511b2024200785201b20088584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20094205862205201f7ca7200d41a0016a10242011290300211b200f350200211d200d2903a0012124200e200d41a0016a10240240200d2903a0012015562011290300220620125620062012511b200f29030022252014562013290300220620105620062010511b2025201485200620108584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20154205862225201f7ca7200d41a0016a1024200d41206a20012002200320042024201b201d4200200d2903a0012011290300200f3502004200107f2020290300211b2021290300211d20222903002124200d41206a41186a2903002126200d41206a41106a2903002127200d41206a41086a2903002128200d2903402129200d290320212a201a200d41a0016a10240240200d2903a0012015562011290300220620125620062012511b200f290300222b2014562013290300220620105620062010511b202b201485200620108584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b2025201e7ca7200d41a0016a1024200d200d2903a0012011290300200f2903002013290300202a20282027202620292024201d201b1055200d41186a2903002106200d41106a290300211b200d41086a290300211d200d2903002124201a200d41a0016a10240240200d2903a00120095620112903002209201c562009201c511b200f29030022092007562013290300221c200856201c2008511b2009200785201c20088584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20132006370300200d20243703a001200d201d3703a801200d201b3703b0012005201e7ca7200d41a0016a10222015211c20122108201421062010211d2015427f7c22072014427f7c22092007201554222320122023ad7c427f7c221520125420152012511bad7c221284201520102009201454ad7c2012200954ad7c427f7c2210848450450d000b0b200020193703002000201837030820002017370310200041186a2016370300200d41c0016a24000ba90904037f027e027f217e230041206b220924000240200520017d42df0256200620027d2005200154220aad7d22054200522005501b200720037d2205200a200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101d0b2001a7220a20091017200941086a220b290300210c2009290300210d02404100200941106a220e2903002202428080808010544100200941186a220f2903002206501b200242808080801085200684501b0d0041004100101d0b200a41206a20091017200b29030021102009290300211102404100200e2903002201428080808010544100200f2903002205501b200142808080801085200584501b0d0041004100101d0b200a41c0006a20091017200941186a220b2903002112200941106a220e2903002113200941086a220f290300211420092903002115200a41e0006a20091017200b2903002116200e2903002117200f290300211820092903002119200a4180016a20091017200b290300211a200e290300211b200f290300211c2009290300211d200a41a0016a20091017200f290300211e2009290300211f02404100200e2903002203428080808010544100200b2903002207501b200342808080801085200784501b0d0041004100101d0b200a41c0016a20091017200b2903002120200e2903002121200f290300212220092903002123200a41e0016a200910170240200929030022042004200e290300220884200f2903002224200b290300222584222684420052ad85200884202684500d0041004100101d0b200a4180026a20091017024020092903002226428002544100200941086a220b2903002227501b4100200941106a220e2903002228200941186a220f290300222984501b0d0041004100101d0b200a41a0026a20091017200b290300212a200e290300212b200f290300212c2009290300212d200a41c0026a20091017200b290300212e200e290300212f200f2903002130200020092903003703c0022000202d3703a0022000202637038002200020043703e001200020233703c0012000201f3703a0012000201d37038001200020193703602000201537034020002011370320200020023703102000200c3703082000200d370300200041d8026a2030370300200041d0026a202f370300200041c8026a202e370300200041b8026a202c370300200041b0026a202b370300200041a8026a202a37030020004198026a202937030020004190026a202837030020004188026a2027370300200041f8016a2025370300200041f0016a2008370300200041e8016a2024370300200041d8016a2020370300200041d0016a2021370300200041c8016a2022370300200041b8016a2007370300200041b0016a2003370300200041a8016a201e37030020004198016a201a37030020004190016a201b37030020004188016a201c370300200041f8006a2016370300200041f0006a2017370300200041e8006a2018370300200041d8006a2012370300200041d0006a2013370300200041c8006a2014370300200041386a2005370300200041306a2001370300200041286a2010370300200041186a2006370300200941206a24000bd2100b027f037e207f037e017f037e017f017e017f017e027f230041c0036b222d2400202d222e41e0026a41186a42bc8be38eeadb88d3c500370300202e42a5d7c98092aab3f2773703f002202e42e69aace283adc3f63e3703e802202e42c0d483caa5d2ddd1113703e002202e41e0026a202e41c0026a1027202e41c0006a202e2903c002202e41c0026a41086a290300202e41c0026a41106a290300202e41c0026a41186a29030020012002200320042005200620072008106e202e41c0006a41086a290300212f202e41c0006a41106a3502002130202e2903402131202e41a0026a1019202e2d00bf022132202e2d00be022133202e2d00bd022134202e2d00bc022135202e2d00bb022136202e2d00ba022137202e2d00b9022138202e2d00b8022139202e2d00b702213a202e2d00b602213b202e2d00b502213c202e2d00b402213d202e2d00b302213e202e2d00b202213f202e2d00b1022140202e2d00b0022141202e2d00af022142202e2d00ae022143202e2d00ad022144202e2d00ac022145202e2d00ab022146202e2d00aa022147202e2d00a9022148202e2d00a8022149202e2d00a702214a202e2d00a602214b202e2d00a502214c202e2d00a402214d202e2d00a302214e202e2d00a202214f202e2d00a1022150202e2d00a0022151202e4180026a101a202e202e290080023700c001202e202e290088023700c801202e202e290090023700d001202e202e290098023700d801202e41c0016a202e41e0016a1015202e41a0016a41186a4200370300202e20303703b001202e202f3703a801202e20313703a001202e41e0016a41086a2903002152202e41e0016a41106a3502002153202e2903e0012154202e41a0016a202e4180016a1016202e202e29008001370060202e202e29008801370068202e202e29009001370070202e202e29009801370078200c427f201d201f84201e202084845022551b211e200b427f20551b211f200a427f20551b211d2009427f20551b21560240202e41e0006a10350d0041004100101d0b41c000202e41a0036a1024202e41a0036a41086a2903002157202e41a0036a41106a2903002158202e41a0036a41186a2259290300215a202e2903a0032120202d41606a225b22552400205b41186a205a370300205b2058370310205b2057370308205b202037030020594200370300202e42003703b003202e42003703a803202e42cfd996a80d3703a003202e41a0036a41e001202e4180036a1037202e4180036a41086a2903002157202e4180036a41106a2903002158202e4180036a41186a290300215a202e29038003215c205541606a2255225d2400205541186a205a37030020552058370310205520573703082055205c3703002020a7222d20551022205d41606a225d22552400205541606a2255225e2400205520323a001f205520333a001e205520343a001d205520353a001c205520363a001b205520373a001a205520383a0019205520393a00182055203a3a00172055203b3a00162055203c3a00152055203d3a00142055203e3a00132055203f3a0012205520403a0011205520413a0010205520423a000f205520433a000e205520443a000d205520453a000c205520463a000b205520473a000a205520483a0009205520493a00082055204a3a00072055204b3a00062055204c3a00052055204d3a00042055204e3a00032055204f3a0002205520503a0001205520513a00002055205d1015205d2903002120205d41086a2903002157205d41106a350200215820594200370300202e20583703b003202e20573703a803202e20203703a003202d41046a202e41a0036a102220594200370300202e20533703b003202e20523703a803202e20543703a003202d41246a202e41a0036a10222059201e370300202e201f3703b003202e201d3703a803202e20563703a003202d41c4006a202e41a0036a10222059201c370300202e201b3703b003202e201a3703a803202e20193703a003202d41e4006a202e41a0036a102220594200370300202e42003703b003202e42003703a803202e202142ff01833703a003202d4184016a202e41a0036a102220592028370300202e20273703b003202e20263703a803202e20253703a003202d41a4016a202e41a0036a10222059202c370300202e202b3703b003202e202a3703a803202e20293703a003202d41c4016a202e41a0036a1022102e2120205e41606a225522592400205541186a4200370300205520303703102055202f37030820552031370300205941606a2259225d24002055205910162059290000212f20592900082130205929001021312059290018211e205d41606a2255225924002055201e37001820552031370010205520303700082055202f370000205941606a22592400205941186a420037030020594200370310205942003703082059420037030002400240202020552059202d41e401202d4100102c0d0041c000202e41a0036a1024202e2802a003225541001030102b20551030101d0c010b10301a205b290300205b41086a290300205b41106a290300205b41186a290300420042004200420010420b102f2019584101201a501b4101201b201c84501bad420042004200103b202e20082008200820082008200820082008200120022003200420052006200720082009200a200b200c200d200e200f2010201120122013201420152016201720182008200820082008105f202e41186a2903002108202e41286a2903002107202e41386a2903002106202e41306a2903002105202e41086a2903002104202e41106a2903002103202e29030021022000202e290320370320200020033703102000200237030020002004370308200041306a2005370300200041386a2006370300200041286a2007370300200041186a2008370300202e41c0036a24000bd10703017f187e047f230041a0026b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad420042004200103f200041b8016a2903002102200041b0016a2903002103200041a8016a290300210420004198016a290300210520004190016a290300210620004188016a2903002107200041f8006a2903002108200041f0006a2903002109200041e8006a290300210a200041d8006a290300210b200041d0006a290300210c200041c8006a290300210d200041206a41186a290300210e200041206a41106a290300210f200041206a41086a2903002110200041d8016a2903002111200041d0016a2903002112200041c8016a290300211320002903a0012114200029038001211520002903602116200029034021172000290320211820002903c001102f5a41012013501b41012012201184501bad420042004200103b2000200220022002200220182010200f200e2017200d200c200b2016200a20092008201520072006200520142004200320022002200220022002104b200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c00020004180026a102420004180026a41186a2219290300210620004180026a41106a221a290300210420004180026a41086a221b29030021052000290380022118200041e0016a41186a4200370300200042003703f001200042003703e801200042203703e0012018a7221c200041e0016a10222003a720004180026a1024201b2903002111201a29030021122000290380022117201920192903002209370300200020123703900220002011370388022000201737038002201c41206a20004180026a1022201842c0007c210202400240201720128420112009848450450d002002210a0c010b200620042002201854221920052019ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a720004180026a10242002a720004180026a10222010200142017c22062001542219200f2019ad7c2207200f54200620015a1bad7c220820105421192014200e200242207c220a200254221a200d201aad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b2005200354221a200c201aad7c2215200c54200520035a1bad7c2216200b54ad7c2113200a21022001210d200f210e200621012007210f20082110200521032015210c2016210b2006201754200720115420072011511b200820125420042019ad7c220420095420042009511b2008201285200420098584501b0d000b0b201c200a20187da71029200041a0026a24000bb91406027f047e047f037e207f067e23004180026b221d2400201d221e41a0016a41186a42bc8be38eeadb88d3c500370300201e42a5d7c98092aab3f2773703b001201e42e69aace283adc3f63e3703a801201e42c0d483caa5d2ddd1113703a001201e41a0016a201e4180016a1027201e4180016a41186a290300211f201e4180016a41106a2903002120201e4180016a41086a2903002121201e290380012122201e41e0006a200d200e200f201020112012201320141018ad4200420042001043201e41c0006a202220212020201f2005200620072008201e290360201e41e0006a41086a290300201e41e0006a41106a290300201e41e0006a41186a2903001061201e41c0006a41186a2903002105201e41c0006a41106a290300211f201e41c0006a41086a2903002120201e2903402208a72223201e41e0016a10240240201e2903e0012206201e41e0016a41106a2224290300222184201e41e0016a41086a22252903002207201e41e0016a41186a2226290300222784844200520d002026428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42113703c0014104201e41c0016a102241004124101d0b2023201e41e0016a10240240201e2903e0012006427f7c22225620252903002228200720222006542225ad7c427f7c22065620282006511b202429030022292021427f7c22282025200620075420062007511bad7c2207562026290300220620272028202154ad7c2007202854ad7c427f7c22215620062021511b2029200785200620218584501b0d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b2022420586200842207c22227ca7201e41e0016a1024201e2903e00120095a201e41e8016a22252903002207200a5a2007200a511b201e41f0016a222a2903002206200b5a201e41e0016a41186a22262903002207200c5a2007200c511b2006200b852007200c8584501bad420042004200106d0240201120138420122014848422064200520d002026428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b200da72224201e41e0016a101720252903002128201e2903e001210902404100202a290300220c42808080801054410020262903002207501b200c42808080801085200784501b0d0041004100101d0b201d41606a221d22262400201d1019201d2d001f2125201d2d001e212a201d2d001d212b201d2d001c212c201d2d001b212d201d2d001a212e201d2d0019212f201d2d00182130201d2d00172131201d2d00162132201d2d00152133201d2d00142134201d2d00132135201d2d00122136201d2d00112137201d2d00102138201d2d000f2139201d2d000e213a201d2d000d213b201d2d000c213c201d2d000b213d201d2d000a213e201d2d0009213f201d2d00082140201d2d00072141201d2d00062142201d2d00052143201d2d00042144201d2d00032145201d2d00022146201d2d00012147201d2d00002148202641606a221d22262400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202641606a222622492400201d20261027202641186a2903002127202641106a2903002129202641086a290300214a2026290300214b024020064200520d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b2024201e41e0016a1017201e41e0016a41086a290300214c201e2903e001214d02404100201e41e0016a41106a2903002206428080808010544100201e41e0016a41186a290300220b501b200642808080801085200b84501b0d0041004100101d0b0240201142015620124200522012501b201342005220144200522014501b2013201484501b0d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b202441206a201e41e0016a1017201e41e0016a41086a221d290300214e201e2903e001214f02404100201e41e0016a41106a2226290300220a428080808010544100201e41e0016a41186a22242903002221501b200a42808080801085202184501b0d0041004100101d0b201e41206a204b204a20292027204d204c2006200b204f204e200a2021106e201e41206a41186a2903002106201e41206a41106a290300210b201e41206a41086a290300210a201e29032021212023201e41e0016a10240240201e2903e001202629030084201d290300202429030084844200520d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b2022a7201e41e0016a1024201e41e0016a41186a2903002122201e41e0016a41106a2903002127201e41e0016a41086a2903002129201e2903e001214a204941606a2226221d2400201d41606a221d2400201d20253a001f201d202a3a001e201d202b3a001d201d202c3a001c201d202d3a001b201d202e3a001a201d202f3a0019201d20303a0018201d20313a0017201d20323a0016201d20333a0015201d20343a0014201d20353a0013201d20363a0012201d20373a0011201d20383a0010201d20393a000f201d203a3a000e201d203b3a000d201d203c3a000c201d203d3a000b201d203e3a000a201d203f3a0009201d20403a0008201d20413a0007201d20423a0006201d20433a0005201d20443a0004201d20453a0003201d20463a0002201d20473a0001201d20483a0000201d2026101520092028200c20072026290300202641086a290300202641106a290300202641186a2903002021200a200b2006204a202920272022106f201e200d200e200f201020112012201320141018ad420042004200104320082020201f2005201e290300201e41086a290300201e41106a290300201e41186a290300201520162017201810702000201f3703102000202037030820002008370300200041186a2005370300201e4180026a24000bd10703017f187e047f230041a0026b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad420042004200103f200041b8016a2903002102200041b0016a2903002103200041a8016a290300210420004198016a290300210520004190016a290300210620004188016a2903002107200041f8006a2903002108200041f0006a2903002109200041e8006a290300210a200041d8006a290300210b200041d0006a290300210c200041c8006a290300210d200041206a41186a290300210e200041206a41106a290300210f200041206a41086a2903002110200041d8016a2903002111200041d0016a2903002112200041c8016a290300211320002903a0012114200029038001211520002903602116200029034021172000290320211820002903c001102f5a41012013501b41012012201184501bad420042004200103b2000200220022002200220182010200f200e2017200d200c200b2016200a20092008201520072006200520142004200320022002200220022002104d200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c00020004180026a102420004180026a41186a2219290300210620004180026a41106a221a290300210420004180026a41086a221b29030021052000290380022118200041e0016a41186a4200370300200042003703f001200042003703e801200042203703e0012018a7221c200041e0016a10222003a720004180026a1024201b2903002111201a29030021122000290380022117201920192903002209370300200020123703900220002011370388022000201737038002201c41206a20004180026a1022201842c0007c210202400240201720128420112009848450450d002002210a0c010b200620042002201854221920052019ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a720004180026a10242002a720004180026a10222010200142017c22062001542219200f2019ad7c2207200f54200620015a1bad7c220820105421192014200e200242207c220a200254221a200d201aad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b2005200354221a200c201aad7c2215200c54200520035a1bad7c2216200b54ad7c2113200a21022001210d200f210e200621012007210f20082110200521032015210c2016210b2006201754200720115420072011511b200820125420042019ad7c220420095420042009511b2008201285200420098584501b0d000b0b201c200a20187da71029200041a0026a24000bf0240a027f017e027f027e017f017e017f017e227f087e230041c0016b221d211e201d240002402011201384201220148484221f4200520d00201e41a0016a41186a2220428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a22214200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d2020428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a102220214200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b200d20114205867ca741606a201e41a0016a1017201e41a0016a41086a22212903002122201e2903a001212302404100201e41a0016a41106a22242903002225428080808010544100201e41a0016a41186a22262903002227501b202542808080801085202784501b0d0041004100101d0b201d41606a221d22202400201d41186a42ebebe4fcb28587a751370300201d42dea0e0bdc4f6b08d6a370310201d42b1f48ed6d0a7eb857e370308201d42bfa3ffbd899593d51a370300202041606a222022282400201d202010272020290300202385202041106a350200202542ffffffff0f838584202041086a2903002022858450ad420042004200106c202841606a221d22202400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202041606a222022282400201d20201027202041186a2903002125202041106a2903002122202041086a290300212320202903002127201e41e0006a200d200e200f201020112012201320141018ad4200420042001043201e41c0006a20272023202220252005200620072008201e290360201e41e0006a41086a290300201e41e0006a41106a290300201e41e0006a41186a2903001047201e41c0006a41186a2903002108201e41c0006a41106a2903002107201e41c0006a41086a2903002106201e2903402225a72220201e41a0016a10240240201e2903a0012024290300842021290300202629030084844200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b202542207c2205a72226201e41a0016a1024201e2903a001200958201e41a8016a22212903002209200a582009200a511b201e41b0016a22292903002209200b58201e41a0016a41186a221d290300220a200c58200a200c511b2009200b85200a200c8584501bad42004200420010710240201f4200520d00201d428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b200da72224201e41a0016a101720212903002123201e2903a0012127024041002029290300220c428080808010544100201d290300220b501b200c42808080801085200b84501b0d0041004100101d0b202841606a221d22212400201d1019201d2d001f2129201d2d001e212a201d2d001d212b201d2d001c212c201d2d001b212d201d2d001a212e201d2d0019212f201d2d00182130201d2d00172131201d2d00162132201d2d00152133201d2d00142134201d2d00132135201d2d00122136201d2d00112137201d2d00102138201d2d000f2139201d2d000e213a201d2d000d213b201d2d000c213c201d2d000b213d201d2d000a213e201d2d0009213f201d2d00082140201d2d00072141201d2d00062142201d2d00052143201d2d00042144201d2d00032145201d2d00022146201d2d00012147201d2d00002148202141606a221d22212400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202141606a222122492400201d20211027202141186a290300214a202141106a290300214b202141086a290300214c2021290300214d0240201f4200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b2024201e41a0016a1017201e41a0016a41086a290300214e201e2903a001214f02404100201e41a0016a41106a290300220a428080808010544100201e41a0016a41186a290300221f501b200a42808080801085201f84501b0d0041004100101d0b0240201142015620124200522012501b201342005220144200522014501b2013201484501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b202441206a201e41a0016a1017201e41a0016a41086a221d2903002150201e2903a001215102404100201e41a0016a41106a22212903002209428080808010544100201e41a0016a41186a22242903002222501b200942808080801085202284501b0d0041004100101d0b201e41206a204d204c204b204a204f204e200a201f2051205020092022106e201e41206a41186a290300210a201e41206a41106a290300211f201e41206a41086a2903002109201e29032021222020201e41a0016a10240240201e2903a001202129030084201d290300202429030084844200520d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b2026201e41a0016a1024201e41a0016a41186a2224290300214a201e41a0016a41106a2226290300214b201e41a0016a41086a2228290300214c201e2903a001214d204941606a2221221d2400201d41606a221d22492400201d20293a001f201d202a3a001e201d202b3a001d201d202c3a001c201d202d3a001b201d202e3a001a201d202f3a0019201d20303a0018201d20313a0017201d20323a0016201d20333a0015201d20343a0014201d20353a0013201d20363a0012201d20373a0011201d20383a0010201d20393a000f201d203a3a000e201d203b3a000d201d203c3a000c201d203d3a000b201d203e3a000a201d203f3a0009201d20403a0008201d20413a0007201d20423a0006201d20433a0005201d20443a0004201d20453a0003201d20463a0002201d20473a0001201d20483a0000201d2021101520272023200c200b2021290300202141086a290300202141106a290300202141186a29030020222009201f200a204d204c204b204a106f204941606a221d22212400201d101a201d290000210c201d290008210b201d290010210a201d290018211f202141606a2221221d2400201d41606a221d22292400201d201f370018201d200a370010201d200b370008201d200c370000201d20211015202141086a290300210c2021290300210b202141106a350200210a201e200d200e200f201020112012201320141018ad42004200420010432025200620072008201e290300201e41086a290300201e41106a290300201e41186a290300200b200c200a42001070202941606a221d22212400201d41186a42ebebe4fcb28587a751370300201d42dea0e0bdc4f6b08d6a370310201d42b1f48ed6d0a7eb857e370308201d42bfa3ffbd899593d51a370300202141606a222122292400201d20211027202141086a290300211320212903002111202141106a350200210d2020201e41a0016a10240240201e2903a00122122026290300220c84202829030022142024290300220e84844200520d002024428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d0b2020201e41a0016a10240240201e2903a0012012427f7c2210562028290300220f20142010201254221dad7c427f7c221256200f2012511b2026290300220b200c427f7c220f201d201220145420122014511bad7c22145620242903002212200e200f200c54ad7c2014200f54ad7c427f7c220c562012200c511b200b2014852012200c8584501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b201042058620057ca7201e41a0016a1024201e41a0016a41186a22242903002112201e41a0016a41106a2226290300210c201e41a0016a41086a22282903002110201e2903a001210f202941606a221d22212400201d41186a4200370300201d200d370310201d2013370308201d2011370300202141606a222122292400201d20211016202129000021142021290008210e2021290010210b2021290018210a202941606a221d22212400201d200a370018201d200b370010201d200e370008201d20143700000240201d10350d0041004100101d0b41c000201e41a0016a10242028290300210e2026290300210b2024290300210a201e2903a0012114202141606a221d22212400201d41186a200a370300201d200b370310201d200e370308201d201437030020244200370300201e42003703b001201e42003703a801201e42cdfae9f0023703a001201e41a0016a41e001201e4180016a1037201e4180016a41086a290300210e201e4180016a41106a290300210b201e4180016a41186a290300210a201e29038001211f202141606a222122282400202141186a200a3703002021200b3703102021200e3703082021201f3703002014a722262021102220242012370300201e200c3703b001201e20103703a801201e200f3703a001202641046a201e41a0016a1022102e2114202841606a222122242400202141186a42003703002021200d3703102021201337030820212011370300202441606a2224222824002021202410162024290000211220242900082113202429001021112024290018210d202841606a2221222424002021200d370018202120113700102021201337000820212012370000202441606a22242400202441186a4200370300202442003703102024420037030820244200370300024002402014202120242026412420264100102c0d0041c000201e41a0016a1024201e2802a001221d41001030102b201d1030101d0c010b10301a201d290300201d41086a290300201d41106a290300201d41186a290300420042004200420010420b2020201e41a0016a10240240201e2903a0012212201e41b0016a2221290300221384201e41a8016a22242903002214201e41a0016a41186a221d290300220c84844200520d00201d428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4211370380014104201e4180016a102241004124101d0b2020201e41a0016a10240240201e2903a0012012427f7c2211562024290300220d201420112012542220ad7c427f7c221256200d2012511b202129030022102013427f7c220d2020201220145420122014511bad7c221456201d2903002212200c200d201354ad7c2014200d54ad7c427f7c22135620122013511b2010201485201220138584501b0d00201e41a0016a41186a428080808090ee9ea4ce00370300201e42003703b001201e42003703a801201e42003703a0014100201e41a0016a1022201e4180016a41186a4200370300201e420037039001201e420037038801201e4232370380014104201e4180016a102241004124101d0b201142058620057ca7201e41a0016a10242015201620172018201e2903a001201e41a8016a290300201e41b0016a290300201e41a0016a41186a290300106b200020073703102000200637030820002025370300200041186a2008370300201e41c0016a24000bb00802057f1f7e230041206b220924000240200520017d42bf0256200620027d2005200154220aad7d22054200522005501b200720037d2205200a200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101d0b2001a7220a20091017200941086a220b29030021042009290300210802404100200941106a220c2903002202428080808010544100200941186a220d2903002206501b200242808080801085200684501b0d0041004100101d0b200a41206a20091017200d290300210e200c290300210f200b290300211020092903002111200a41c0006a20091017200d2903002112200c2903002113200b290300211420092903002115200a41e0006a20091017200d2903002116200c2903002117200b290300211820092903002119200a4180016a20091017200b290300211a2009290300211b02404100200c2903002201428080808010544100200d2903002205501b200142808080801085200584501b0d0041004100101d0b200a41a0016a20091017200941186a220b290300211c200941106a220c290300211d200941086a220d290300211e2009290300211f200a41c0016a200910170240200929030022032003200c290300220784200d2903002220200b290300222184222284420052ad85200784202284500d0041004100101d0b200a41e0016a20091017024020092903002222428002544100200d2903002223501b4100200c2903002224200b290300222584501b0d0041004100101d0b200a4180026a20091017200941086a220b2903002126200941106a220c2903002127200941186a220d290300212820092903002129200a41a0026a20091017200b290300212a200c290300212b200d290300212c200020092903003703a0022000202937038002200020223703e001200020033703c0012000201f3703a0012000201b37038001200020193703602000201537034020002011370320200020023703102000200437030820002008370300200041b8026a202c370300200041b0026a202b370300200041a8026a202a37030020004198026a202837030020004190026a202737030020004188026a2026370300200041f8016a2025370300200041f0016a2024370300200041e8016a2023370300200041d8016a2021370300200041d0016a2007370300200041c8016a2020370300200041b8016a201c370300200041b0016a201d370300200041a8016a201e37030020004198016a200537030020004190016a200137030020004188016a201a370300200041f8006a2016370300200041f0006a2017370300200041e8006a2018370300200041d8006a2012370300200041d0006a2013370300200041c8006a2014370300200041386a200e370300200041306a200f370300200041286a2010370300200041186a2006370300200941206a24000bf7100b027f047e207f027e017f037e017f017e017f017e027f230041e0036b222924002029222a4180036a41186a42bc8be38eeadb88d3c500370300202a42a5d7c98092aab3f27737039003202a42e69aace283adc3f63e37038803202a42c0d483caa5d2ddd11137038003202a4180036a202a41e0026a1027202a41c0026a41186a42ebebe4fcb28587a751370300202a42dea0e0bdc4f6b08d6a3703d002202a42b1f48ed6d0a7eb857e3703c802202a42bfa3ffbd899593d51a3703c002202a41e0026a41186a290300212b202a41e0026a41106a290300212c202a41e0026a41086a290300212d202a2903e002212e202a41c0026a202a41a0026a1027202a41206a202e202d202c202b2001200220032004202a2903a002202a41a0026a41086a290300202a41a0026a41106a290300202a41a0026a41186a290300106e202a41206a41086a290300212b202a41206a41106a350200212c202a290320212d202a4180026a1019202a2d009f02212f202a2d009e022130202a2d009d022131202a2d009c022132202a2d009b022133202a2d009a022134202a2d0099022135202a2d0098022136202a2d0097022137202a2d0096022138202a2d0095022139202a2d009402213a202a2d009302213b202a2d009202213c202a2d009102213d202a2d009002213e202a2d008f02213f202a2d008e022140202a2d008d022141202a2d008c022142202a2d008b022143202a2d008a022144202a2d0089022145202a2d0088022146202a2d0087022147202a2d0086022148202a2d0085022149202a2d008402214a202a2d008302214b202a2d008202214c202a2d008102214d202a2d008002214e202a41e0016a101a202a202a2900e0013700a001202a202a2900e8013700a801202a202a2900f0013700b001202a202a2900f8013700b801202a41a0016a202a41c0016a1015202a4180016a41186a4200370300202a202c37039001202a202b37038801202a202d37038001202a41c0016a41086a290300212e202a41c0016a41106a350200214f202a2903c0012150202a4180016a202a41e0006a1016202a202a290060370040202a202a290068370048202a202a290070370050202a202a2900783700582008427f2019201b84201a201c84845022511b211a2007427f20511b211b2006427f20511b21192005427f20511b21520240202a41c0006a10350d0041004100101d0b41c000202a41c0036a1024202a41c0036a41086a2903002153202a41c0036a41106a2903002154202a41c0036a41186a22552903002156202a2903c003211c202941606a225722512400205741186a205637030020572054370310205720533703082057201c37030020554200370300202a42003703d003202a42003703c803202a42cfd996a80d3703c003202a41c0036a41e001202a41a0036a1037202a41a0036a41086a2903002153202a41a0036a41106a2903002154202a41a0036a41186a2903002156202a2903a0032158205141606a225122592400205141186a2056370300205120543703102051205337030820512058370300201ca7222920511022205941606a225922512400205141606a2251225a24002051202f3a001f205120303a001e205120313a001d205120323a001c205120333a001b205120343a001a205120353a0019205120363a0018205120373a0017205120383a0016205120393a00152051203a3a00142051203b3a00132051203c3a00122051203d3a00112051203e3a00102051203f3a000f205120403a000e205120413a000d205120423a000c205120433a000b205120443a000a205120453a0009205120463a0008205120473a0007205120483a0006205120493a00052051204a3a00042051204b3a00032051204c3a00022051204d3a00012051204e3a00002051205910152059290300211c205941086a2903002153205941106a350200215420554200370300202a20543703d003202a20533703c803202a201c3703c003202941046a202a41c0036a102220554200370300202a204f3703d003202a202e3703c803202a20503703c003202941246a202a41c0036a10222055201a370300202a201b3703d003202a20193703c803202a20523703c003202941c4006a202a41c0036a102220552018370300202a20173703d003202a20163703c803202a20153703c003202941e4006a202a41c0036a102220554200370300202a42003703d003202a42003703c803202a201d42ff01833703c00320294184016a202a41c0036a102220552024370300202a20233703d003202a20223703c803202a20213703c003202941a4016a202a41c0036a102220552028370300202a20273703d003202a20263703c803202a20253703c003202941c4016a202a41c0036a1022102e211c205a41606a225122552400205141186a42003703002051202c3703102051202b3703082051202d370300205541606a2255225924002051205510162055290000212b2055290008212c2055290010212d2055290018211a205941606a2251225524002051201a3700182051202d3700102051202c3700082051202b370000205541606a22552400205541186a420037030020554200370310205542003703082055420037030002400240201c20512055202941e40120294100102c0d0041c000202a41c0036a1024202a2802c003225141001030102b20511030101d0c010b10301a2057290300205741086a290300205741106a290300205741186a290300420042004200420010420b102f20155841012016501b41012017201884501bad420042004200103b202a2018201820182018200120022003200420052006200720082009200a200b200c200d200e200f201020112012201320142015201620172018105c202a41186a2903002118202a41086a2903002117202a29030021162000202a41106a2903003703102000201637030020002017370308200041186a2018370300202a41e0036a24000b981d06027f017e017f047e227f0c7e23004180016b22182119201824000240200c200e84200d200f8484221a4200520d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b2008a7221b201941e0006a1017201941e0006a41086a290300211c2019290360211d02404100201941e0006a41106a290300221e428080808010544100201941e0006a41186a290300221f501b201e42808080801085201f84501b0d0041004100101d0b201841606a2218222024002018101920182d001f212120182d001e212220182d001d212320182d001c212420182d001b212520182d001a212620182d0019212720182d0018212820182d0017212920182d0016212a20182d0015212b20182d0014212c20182d0013212d20182d0012212e20182d0011212f20182d0010213020182d000f213120182d000e213220182d000d213320182d000c213420182d000b213520182d000a213620182d0009213720182d0008213820182d0007213920182d0006213a20182d0005213b20182d0004213c20182d0003213d20182d0002213e20182d0001213f20182d00002140202041606a221822202400201841186a42bc8be38eeadb88d3c500370300201842a5d7c98092aab3f277370310201842e69aace283adc3f63e370308201842c0d483caa5d2ddd111370300202041606a222022412400201820201027202041186a2903002142202041106a2903002143202041086a2903002144202029030021450240201a4200520d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b201b201941e0006a1017201941e8006a29030021462019290360214702404100201941f0006a2903002248428080808010544100201941f8006a2903002249501b204842808080801085204984501b0d0041004100101d0b0240200c420156200d420052200d501b200e420052200f420052200f501b200e200f84501b0d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b201b41206a201941e0006a1017201941e0006a41086a290300214a2019290360214b02404100201941e0006a41106a290300224c428080808010544100201941e0006a41186a290300224d501b204c42808080801085204d84501b0d0041004100101d0b201941206a20452044204320422047204620482049204b204a204c204d106e201941206a41186a2903002148201941206a41106a2903002149201941206a41086a290300214c2019290320214d204141606a222022182400201841606a2218221b2400201820213a001f201820223a001e201820233a001d201820243a001c201820253a001b201820263a001a201820273a0019201820283a0018201820293a00172018202a3a00162018202b3a00152018202c3a00142018202d3a00132018202e3a00122018202f3a0011201820303a0010201820313a000f201820323a000e201820333a000d201820343a000c201820353a000b201820363a000a201820373a0009201820383a0008201820393a00072018203a3a00062018203b3a00052018203c3a00042018203d3a00032018203e3a00022018203f3a0001201820403a0000201820201015201d201c201e201f2020290300202041086a290300202041106a290300202041186a290300204d204c204920482000200120022003106f0240201a4200520d00201941e0006a41186a2218428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a222042003703002019420037035020194200370348201942113703404104201941c0006a102241004124101d2018428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022202042003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b2008200c4205867ca741606a2221201941e0006a1017201941e0006a41086a221829030021482019290360214902404100201941e0006a41106a2222290300221e428080808010544100201941e0006a41186a2220290300221f501b201e42808080801085201f84501b0d0041004100101d0b41c000201941e0006a102420202903002101202229030021002018290300211c2019290360211f202042003703002019420037037020194200370368201942b184828507370360201941e0006a41e001201941c0006a1037201941c0006a41086a290300214c201941c0006a41106a290300214d201941c0006a41186a290300210320192903402102201b41606a221822222400201841186a20033703002018204d3703102018204c37030820182002370300201fa7221b20181022202042003703002019201242ffffffff0f83224c3703702019201137036820192010370360201b41046a201941e0006a1022102e214d202241606a221822202400201841186a42003703002018201e42ffffffff0f833703102018204837030820182049370300202041606a2220222224002018202010162020290000211e202029000821482020290010214920202900182103202241606a2218222024002018200337001820182049370010201820483700082018201e37000002400240204d2018201b4124201b4120102d0d0041c000201941e0006a10242019280260221841001030102b20181030101d0c010b0240024010304120490d00201f201c20002001422042004200420010420c010b201f201c2000200110302218ad42004200420010422018411f4b0d0041004100101d0b201b201941e0006a1024201941f8006a2903002149201941f0006a2903002148201941e8006a290300211f2019290360211e0b202041606a221822202400201841186a2049370300201820483703102018201f3703082018201e370300201920082009200a200b200c200d200e200f1018ad42004200420010432019290300201941086a290300201941106a290300201941186a290300201020112012201310720240201a4200520d00201941e0006a41186a221b428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a222242003703002019420037035020194200370348201942113703404104201941c0006a102241004124101d201b428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022202242003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b2021201941e0006a1017201941e0006a41086a290300210e2019290360210c02404100201941e0006a41106a290300220f428080808010544100201941e0006a41186a290300220d501b200f42808080801085200d84501b0d0041004100101d0b41c000201941e0006a1024201941e0006a41086a2903002108201941e0006a41106a290300211a201941e0006a41186a222129030021122019290360210d202041606a2220221b2400202041186a20123703002020201a370310202020083703082020200d370300202142003703002019420037037020194200370368201942b184828507370360201941e0006a41e001201941c0006a1037201941c0006a41086a2903002108201941c0006a41106a290300211a201941c0006a41186a29030021122019290340211e201b41606a221b22232400201b41186a2012370300201b201a370310201b2008370308201b201e370300200da72222201b1022202142003703002019204c3703702019201137036820192010370360202241046a201941e0006a1022102e210d202341606a221b22212400201b41186a4200370300201b200f42ffffffff0f83370310201b200e370308201b200c370300202141606a222122232400201b202110162021290000210f2021290008210e2021290010210c20212900182111202341606a221b2400201b2011370018201b200c370010201b200e370008201b200f37000002400240200d201b2022412420224120102d0d0041c000201941e0006a10242019280260222041001030102b20201030101d201841186a2903002111201841106a290300210e201841086a290300210f201829030021080c010b0240024010304120490d002020290300220f202041086a290300202041106a290300202041186a29030042204200420042001042200fa721200c010b1030211b2020290300220f202041086a290300202041106a290300202041186a290300201bad4200420042001042200fa72120201b411f4b0d0041004100101d0b2020201941e0006a10242019290360221a201829030022085a201941e0006a41086a290300220d201841086a290300220f5a200d200f511b201941e0006a41106a290300220c201841106a290300220e5a201941e0006a41186a22202903002210201841186a29030022115a20102011511b200c200e85201020118584501b0d002020428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942113703404104201941c0006a102241004124101d0b201a20087d20045a200d200f7d201a2008542218ad7d220820055a20082005511b200c200e7d22082018200d200f54200d200f511bad220f7d220d20065a201020117d200c200e54ad7d2008200f54ad7d220f20075a200f2007511b200d200685200f20078584501bad420042004200106d20194180016a24000b911e0a027f017e027f047e017f027e217f087e017f017e23004180016b22182119201824000240200c200e84200d200f8484221a4200520d00201941e0006a41186a221b428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a221c42003703002019420037035020194200370348201942113703404104201941c0006a102241004124101d201b428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201c42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b2008200c4205867ca741606a201941e0006a1017201941e0006a41086a290300211d2019290360211e02404100201941e0006a41106a290300221f428080808010544100201941e0006a41186a2903002220501b201f42808080801085202084501b0d0041004100101d0b201841606a2218221b2400201841186a42ebebe4fcb28587a751370300201842dea0e0bdc4f6b08d6a370310201842b1f48ed6d0a7eb857e370308201842bfa3ffbd899593d51a370300201b41606a221b222124002018201b1027201b290300201e85201b41106a350200201f42ffffffff0f838584201b41086a290300201d858450ad420042004200106c0240201a4200520d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b2008a7221c201941e0006a1017201941e0006a41086a29030021222019290360212302404100201941e0006a41106a290300221f428080808010544100201941e0006a41186a290300221d501b201f42808080801085201d84501b0d0041004100101d0b202141606a2218221b24002018101920182d001f212420182d001e212520182d001d212620182d001c212720182d001b212820182d001a212920182d0019212a20182d0018212b20182d0017212c20182d0016212d20182d0015212e20182d0014212f20182d0013213020182d0012213120182d0011213220182d0010213320182d000f213420182d000e213520182d000d213620182d000c213720182d000b213820182d000a213920182d0009213a20182d0008213b20182d0007213c20182d0006213d20182d0005213e20182d0004213f20182d0003214020182d0002214120182d0001214220182d00002143201b41606a2218221b2400201841186a42bc8be38eeadb88d3c500370300201842a5d7c98092aab3f277370310201842e69aace283adc3f63e370308201842c0d483caa5d2ddd111370300201b41606a221b224424002018201b1027201b41186a2903002145201b41106a2903002146201b41086a2903002147201b29030021480240201a4200520d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b201c201941e0006a1017201941e8006a29030021492019290360214a02404100201941f0006a290300221a428080808010544100201941f8006a290300221e501b201a42808080801085201e84501b0d0041004100101d0b0240200c420156200d420052200d501b200e420052200f420052200f501b200e200f84501b0d00201941e0006a41186a428080808090ee9ea4ce003703002019420037037020194200370368201942003703604100201941e0006a1022201941c0006a41186a42003703002019420037035020194200370348201942323703404104201941c0006a102241004124101d0b201c41206a201941e0006a1017201941e0006a41086a221c290300214b2019290360214c02404100201941e0006a41106a224d2903002220428080808010544100201941e0006a41186a2221290300224e501b202042808080801085204e84501b0d0041004100101d0b201941206a2048204720462045204a2049201a201e204c204b2020204e106e201941206a41186a290300211a201941206a41106a290300211e201941206a41086a29030021202019290320214e204441606a221b22182400201841606a221822442400201820243a001f201820253a001e201820263a001d201820273a001c201820283a001b201820293a001a2018202a3a00192018202b3a00182018202c3a00172018202d3a00162018202e3a00152018202f3a0014201820303a0013201820313a0012201820323a0011201820333a0010201820343a000f201820353a000e201820363a000d201820373a000c201820383a000b201820393a000a2018203a3a00092018203b3a00082018203c3a00072018203d3a00062018203e3a00052018203f3a0004201820403a0003201820413a0002201820423a0001201820433a00002018201b101520232022201f201d201b290300201b41086a290300201b41106a290300201b41186a290300204e2020201e201a2000200120022003106f204441606a2218221b24002018101a2018290000211a2018290008211f2018290010211d2018290018211e201b41606a221b22182400201841606a2218222424002018201e3700182018201d3700102018201f3700082018201a3700002018201b1015201b41086a290300211a201b290300211f201b41106a350200211d201920082009200a200b200c200d200e200f1018ad42004200420010432019290300201941086a290300201941106a290300201941186a290300201f201a201d42001072202441606a2218221b2400201841186a42ebebe4fcb28587a751370300201842dea0e0bdc4f6b08d6a370310201842b1f48ed6d0a7eb857e370308201842bfa3ffbd899593d51a370300201b41606a221b222424002018201b1027201b290300210d201b41086a290300210e201b41106a350200210c202441606a2218221b24002018101a2018290000210f201829000821082018290010211a2018290018211f201b41606a221b22182400201841606a2218222424002018201f3700182018201a370010201820083700082018200f3700002018201b1015201b2903002108201b41086a290300211a201b41106a350200211f41c000201941e0006a10242021290300210b204d290300210a201c29030021092019290360210f202142003703002019420037037020194200370368201942b184828507370360201941e0006a41e001201941c0006a1037201941c0006a41086a290300211d201941c0006a41106a290300211e201941c0006a41186a29030021202019290340214e202441606a2218221b2400201841186a20203703002018201e3703102018201d3703082018204e370300200fa7221c20181022202142003703002019201f3703702019201a37036820192008370360201c41046a201941e0006a1022102e2108201b41606a2218221b2400201841186a42003703002018200c3703102018200e3703082018200d370300201b41606a221b222124002018201b1016201b290000210d201b290008210e201b290010210c201b290018211a202141606a2218221b24002018201a3700182018200c3700102018200e3700082018200d3700000240024020082018201c4124201c4120102d0d0041c000201941e0006a10242019280260221841001030102b20181030101d0c010b0240024010304120490d00200f2009200a200b422042004200420010420c010b200f2009200a200b10302218ad42004200420010422018411f4b0d0041004100101d0b201c201941e0006a1024201941f8006a290300210f201941f0006a290300210e201941e8006a290300210d2019290360210c0b201b41606a2218221b2400201841186a200f3703002018200e3703102018200d3703082018200c370300200c20045a200d20055a200d2005511b200e20065a200f20075a200f2007511b200e200685200f20078584501bad420042004200106d201b41606a221b221c2400201b41186a42ebebe4fcb28587a751370300201b42dea0e0bdc4f6b08d6a370310201b42b1f48ed6d0a7eb857e370308201b42bfa3ffbd899593d51a370300201c41606a221c22212400201b201c1027201c2903002108201c41086a2903002107201c41106a3502002106202141606a221b221c2400201b41186a4200370300201b2006370310201b2007370308201b2008370300201c41606a221c22212400201b201c1016201c2900002105201c290008211a201c290010211f201c290018211d202141606a221b221c2400201b201d370018201b201f370010201b201a370008201b20053700000240201b10350d0041004100101d0b41c000201941e0006a1024201941e0006a41086a290300211a201941e0006a41106a290300211f201941e0006a41186a2221290300211d20192903602105201c41606a221b221c2400201b41186a201d370300201b201f370310201b201a370308201b2005370300202142003703002019420037037020194200370368201942cdfae9f002370360201941e0006a41e001201941c0006a1037201941c0006a41086a290300211a201941c0006a41106a290300211f201941c0006a41186a290300211d2019290340211e201c41606a221c22252400201c41186a201d370300201c201f370310201c201a370308201c201e3703002005a72224201c10222021200f3703002019200e3703702019200d3703682019200c370360202441046a201941e0006a1022102e210f202541606a221c22212400201c41186a4200370300201c2006370310201c2007370308201c2008370300202141606a222122252400201c202110162021290000210d2021290008210e2021290010210c20212900182108202541606a221c22212400201c2008370018201c200c370010201c200e370008201c200d370000202141606a22212400202141186a420037030020214200370310202142003703082021420037030002400240200f201c20212024412420244100102c0d0041c000201941e0006a10242019280260221b41001030102b201b1030101d0c010b10301a201b290300201b41086a290300201b41106a290300201b41186a290300420042004200420010420b20102011201220132018290300201841086a290300201841106a290300201841186a290300106b20194180016a24000bf90508037f037e017f017e017f017e017f067e230041e0006b2209210a200924000240200520017d42ff0056200620027d2005200154220bad7d220c420052200c501b200720037d220c200b200620025420062002511bad220d7d220e420052200820047d2007200354ad7d200c200d54ad7d220c420055200c501b200e200c84501b0d0041004100101d0b2001a7220b200a41c0006a1017200a41c0006a41186a220f2903002110200a41c0006a41106a22112903002112200a41c0006a41086a22132903002114200a2903402115200941606a22092400200b41206a200910172009290300210d0240200941086a290300220c504100200941106a290300220e200941186a290300221684501b0d0041004100101d0b200a200d20017c2201200c20027c2001200d542209ad7c2202200e20037c220120092002200c542002200c511bad7c2202201620047c2001200e54ad7c2002200154ad7c2005200620072008103e200a41386a2903002101200a41306a2903002105200a41286a2903002103200a41186a2903002107200a41106a290300210c200a41086a2903002104200a2903202108200a290300210d200b41c0006a200a41c0006a10172013290300210e200a29034021160240410020112903002202428080808010544100200f2903002206501b200242808080801085200684501b0d0041004100101d0b200b41e0006a200a41c0006a1017200a41c8006a2903002117200a41d0006a2903002118200a41c0006a41186a29030021192000200a2903403703800120002016370360200020083703402000200d37032020002012370310200020143703082000201537030020004198016a201937030020004190016a201837030020004188016a2017370300200041f8006a2006370300200041f0006a2002370300200041e8006a200e370300200041d0006a2005370300200041c8006a2003370300200041386a2007370300200041306a200c370300200041286a2004370300200041186a2010370300200041d8006a2001370300200a41e0006a24000b980706017f147e037f017e017f037e23004180026b2200240042002101200041206a42044200420042001018ad420042004200105220004198016a290300210220004190016a290300210320004188016a2903002104200041f8006a2903002105200041f0006a2903002106200041e8006a2903002107200041d8006a2903002108200041d0006a2903002109200041c8006a290300210a200041206a41186a290300210b200041206a41106a290300210c200041206a41086a290300210d200041b8016a290300210e200041b0016a290300210f200041a8016a2903002110200029038001211120002903602112200029034021132000290320211420002903a001102f5a41012010501b4101200f200e84501bad420042004200103b200020022002200220022014200d200c200b2013200a200920082012200720062005201120042003200220022002200220021054200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c000200041e0016a1024200041e0016a41186a22152903002106200041e0016a41106a22162903002104200041e0016a41086a2217290300210520002903e0012118200041c0016a41186a4200370300200042003703d001200042003703c801200042203703c0012018a72219200041c0016a10222003a7200041e0016a1024201729030021112016290300211220002903e001211a201520152903002209370300200020123703f001200020113703e8012000201a3703e001201941206a200041e0016a1022201842c0007c210202400240201a20128420112009848450450d002002210a0c010b200620042002201854221520052015ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a7200041e0016a10242002a7200041e0016a10222010200142017c22062001542215200f2015ad7c2207200f54200620015a1bad7c220820105421152014200e200242207c220a2002542216200d2016ad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b20052003542216200c2016ad7c221b200c54200520035a1bad7c221c200b54ad7c2113200a21022001210d200f210e200621012007210f2008211020052103201b210c201c210b2006201a54200720115420072011511b200820125420042015ad7c220420095420042009511b2008201285200420098584501b0d000b0b2019200a20187da7102920004180026a24000be4200c027f017e027f027e017f017e017f017e027f077e027f037e230041e0016b2219211a201924000240200d200f84200e20108484221b4200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2009a7221c201a41c0016a1017201a41c0016a41086a221d290300211e201a2903c001211f02404100201a41c0016a41106a22202903002221428080808010544100201a41c0016a41186a22222903002223501b202142808080801085202384501b0d0041004100101d0b201941606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a2224222524002019202410272024290300201f85202441106a350200202142ffffffff0f838584202441086a290300201e858450ad420042004200106c202541606a221922242400201941186a42bc8be38eeadb88d3c500370300201942a5d7c98092aab3f277370310201942e69aace283adc3f63e370308201942c0d483caa5d2ddd111370300202441606a222422252400201920241027202441186a2903002121202441106a290300211e202441086a290300211f20242903002123202541606a2219222424002019101b201941186a2903002126201941106a2903002127201941086a290300212820192903002129201a41e0006a2009200a200b200c200d200e200f20101018ad4200420042001043201a41c0006a2023201f201e20212029202820272026201a290360201a41e0006a41086a290300201a41e0006a41106a290300201a41e0006a41186a2903001061201a41c0006a41186a2903002123201a41c0006a41106a2903002126201a41c0006a41086a2903002127201a2903402221a72225201a41c0016a10240240201a2903c001221f2020290300222884201d290300221e2022290300222a84844200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42113703a0014104201a41a0016a102241004124101d0b2025201a41c0016a10240240201a2903c001201f427f7c222956201a41c0016a41086a2220290300222b201e2029201f542219ad7c427f7c221f56202b201f511b201a41c0016a41106a2222290300222c2028427f7c222b2019201f201e54201f201e511bad7c221e56201a41c0016a41186a221d290300221f202a202b202854ad7c201e202b54ad7c427f7c222856201f2028511b202c201e85201f20288584501b0d00201d428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2029420586202142207c22287ca7201a41c0016a1024201a2903c00120055a2020290300221e20065a201e2006511b2022290300221f20075a201d290300221e20085a201e2008511b201f200785201e20088584501bad420042004200106d202441606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a2224222d2400201920241027202441086a29030021082024290300211e202441106a350200211f2025201a41c0016a10240240201a2903c0012022290300842020290300201d29030084844200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2028a72222201a41c0016a1024201a41c0016a41186a221d2903002106201a41c0016a41106a22202903002128201a41c0016a41086a222e2903002129201a2903c001212b202d41606a221922242400201941186a42003703002019201f370310201920083703082019201e370300202441606a2224222d240020192024101620242900002107202429000821052024290010212a2024290018212c202d41606a2219222424002019202c3700182019202a37001020192005370008201920073700000240201910350d0041004100101d0b41c000201a41c0016a1024202e29030021052020290300212a201d290300212c201a2903c0012107202441606a221922242400201941186a202c3703002019202a3703102019200537030820192007370300201d4200370300201a42003703d001201a42003703c801201a42b09b8c870d3703c001201a41c0016a41e001201a41a0016a1037201a41a0016a41086a2903002105201a41a0016a41106a290300212a201a41a0016a41186a290300212c201a2903a001212f202441606a2224221d2400202441186a202c3703002024202a370310202420053703082024202f3703002007a7222020241022102e2107201d41606a2224221d2400202441186a42003703002024201f370310202420083703082024201e370300201d41606a221d222d24002024201d1016201d2900002108201d290008211e201d290010211f201d2900182105202d41606a2224221d2400202420053700182024201f3700102024201e37000820242008370000201d41606a221d222d2400201d41186a2006370300201d2028370310201d2029370308201d202b3703000240024020072024201d2020410420204100102c0d0041c000201a41c0016a1024201a2802c001221941001030102b20191030101d0c010b10301a2019290300201941086a290300201941106a290300201941186a290300420042004200420010420b202d41606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a2224221d2400201920241027202441086a290300210620242903002128202441106a3502002129201d41606a221922242400201941186a42bc8be38eeadb88d3c500370300201942a5d7c98092aab3f277370310201942e69aace283adc3f63e370308201942c0d483caa5d2ddd111370300202441606a222422202400201920241027202441186a290300212b202441106a2903002105202441086a290300212a2024290300212c0240201b4200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b201c201a41c0016a1017201a41c0016a41086a290300211b201a2903c001212f02404100201a41c0016a41106a2903002208428080808010544100201a41c0016a41186a290300221e501b200842808080801085201e84501b0d0041004100101d0b0240200d420156200e420052200e501b200f42005220104200522010501b200f201084501b0d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b201c41206a201a41c0016a1017201a41c0016a41086a22192903002130201a2903c001213102404100201a41c0016a41106a2224290300221f428080808010544100201a41d8016a221d2903002207501b201f42808080801085200784501b0d0041004100101d0b201a41206a202c202a2005202b202f201b2008201e20312030201f2007106e201a41206a41106a290300211e201a41206a41086a290300211f201a29032021072025201a41c0016a10240240201a2903c0012024290300842019290300201d29030084844200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2022201a41c0016a102441c000201a41a0016a1024201a41a0016a41086a290300212b201a41a0016a41106a2903002105201a41a0016a41186a221d290300211b201a2903a0012108202041606a221922242400201941186a201b370300201920053703102019202b37030820192008370300201d4200370300201a42003703b001201a42003703a801201a42bbb996c80a3703a001201a41a0016a41e001201a4180016a1037201a4180016a41086a290300212b201a4180016a41106a2903002105201a4180016a41186a290300211b201a29038001212a202441606a2224221c2400202441186a201b370300202420053703102024202b3703082024202a3703002008a7222520241022201d4200370300201a201e42ffffffff0f833703b001201a201f3703a801201a20073703a001202541046a201a41a0016a1022202541246a201a41c0016a1022102e2108201c41606a2224221d2400202441186a4200370300202420293703102024200637030820242028370300201d41606a221d221c24002024201d1016201d290000211e201d290008211f201d2900102107201d2900182106201c41606a2224221d240020242006370018202420073700102024201f3700082024201e370000201d41606a221d2400201d41186a4200370300201d4200370310201d4200370308201d420037030002400240024020082024201d202541c40020254120102c0d0041c000201a41c0016a1024201a2802c001221941001030102b20191030101d0c010b0240024010304120490d0020192903002208201941086a290300201941106a290300201941186a290300422042004200420010422008a721190c010b1030212420192903002208201941086a290300201941106a290300201941186a2903002024ad42004200420010422008a721192024411f4b0d0041004100101d0b2019201a41c0016a10240240201a2903c00122082008201a41d0016a290300221e84201a41c8016a290300201a41d8016a290300842208844200522219ad85201e84200884500d0041004100101d0b20190d010b201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42013703a0014104201a41a0016a102241004124101d0b201a2009200a200b200c200d200e200f20101018ad42004200420010432021202720262023201a290300201a41086a290300201a41106a290300201a41186a29030020112012201320141070200020263703102000202737030820002021370300200041186a2023370300201a41e0016a24000b9b1c07017f0a7e027f047e017f037e017f23004180056b220d24002001200384200220048484420052ad42004200420010810120052007842006200884844200522009200b84200a200c848442005271ad420042004200105a200d41f0036a20054200200142001014200d41e0036a20064200200142001014200d4180046a20054200200242001014200d4190046a20064200200242001014200d41b0046a20012002420042001014200d41a0046a20052006420042001014200d4190036a20064200200342001014200d4180036a20044200200542001014200d41d0036a20034200200542001014200d41a0036a20024200200742001014200d41b0036a20084200200142001014200d41c0036a20074200200142001014200d2903f0032105024020072008844200522003200484420052712008420052200242005271200d2903b80342005272200d2903a80342005272200d41c0036a41086a2903002208200d2903b003200d2903a0037c7c220e20085472722004420052200642005271200d2903880342005272200d2903980342005272200d41d0036a41086a2903002206200d29038003200d290390037c7c220f2006547272200d290390042210200d41e0036a41086a290300200d2903e0032206200d41f0036a41086a2903007c2208200654ad7c2211200d4180046a41086a290300200d29038004220720087c2206200754ad7c7c22127c2208200d2903a0042213200d2903b0047c22147c2207200d2903c0032215200d2903d0037c22167c22172007542218200d4190046a41086a2903002012201154ad7c2008201054ad7c200d41a0046a41086a290300200d41b0046a41086a2903007c2014201354ad7c7c2007200854ad7c2208200e200f7c2016201554ad7c7c2018ad7c220720085420072008511b72410171450d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b200d41c0026a2005420042e80742001014200d41e0026a2006420042e80742001014200d41f0026a20052006420042001014200d4190026a2017420042e80742001014200d4180026a2007420042e80742001014200d41b0026a20054200420042001014200d41d0026a20064200420042001014200d41a0026a20054200420042001014200d2903c002210f0240200d29038802420052200d4190026a41086a2903002206200d290380027c220820065472200d2903d0022210200d41e0026a41086a290300200d2903e0022206200d41c0026a41086a2903007c2205200654ad7c2211200d41b0026a41086a290300200d2903b002220620057c2207200654ad7c7c22127c2206200d2903f0027c2205200d290390022213200d2903a0027c22147c220e2005542218200d41d0026a41086a2903002012201154ad7c2006201054ad7c200d41f0026a41086a2903007c2005200654ad7c22062008200d41a0026a41086a2903007c2014201354ad7c7c2018ad7c220820065420082006511b724101470d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b0240200920015a200a20025a200a20025122181b200b20035a200c20045a200c2004511b200b200385200c20048584501b0d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b200d41b0016a200920017d2206420042e50742001014200d41d0016a200a20027d20092001542219ad7d2201420042e50742001014200d41e0016a20062001420042001014200d41f0016a200b20037d22052019200a20025420181bad22027d420042e50742001014200d4180016a200c20047d200b200354ad7d2005200254ad7d420042e50742001014200d41a0016a20064200420042001014200d41c0016a20014200420042001014200d4190016a20064200420042001014200d2903b001211a0240200d29038801420052200d41f0016a41086a2903002202200d290380017c220420025472200d2903c0012203200d41d0016a41086a290300200d2903d0012202200d41b0016a41086a2903007c2201200254ad7c2206200d41a0016a41086a290300200d2903a001220220017c221b200254ad7c7c22057c2202200d2903e0017c2201200d2903f001220c200d290390017c220a7c221c2001542218200d41c0016a41086a2903002005200654ad7c2002200354ad7c200d41e0016a41086a2903007c2001200254ad7c22022004200d4190016a41086a2903007c200a200c54ad7c7c2018ad7c221d200254201d2002511b724101470d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b0240201a201c84201b201d84844200520d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42123703c0044104200d41c0046a102241004124101d0b42002008201a201c84201b201d848450200f200e8420072008848450724200201d79201c7942c0007c201d4200521b201b79201a7942c0007c201b4200521b22024280017c2201201c201d8442005222181b2204200879200e7942c0007c20084200521b200779200f7942c0007c20074200521b22034280017c2206200e20088442005222191b220554221e42002001200254ad20181b220242002006200354ad20191b22015420022001511b2218ad7d221142005242002018410047ad7d22104200522010501b200420057d220342ff0156200220017d201ead7d22094200522009501b20181b7222181b21064200200e20181b21014200200720181b21044200200f20181b2102024020180d00200342ff0185201184200920108484500d00200d41c0006a41286a2007370000200d41e0006a2218200f37000042002117200d41c0006a41186a4200370000200d41c0006a41306a200e370000200d41c0006a41386a2008370000200d4200370050200d4200370048200d4200370040201841ff012003a76b2219410376411f716b221841086a290000220120194107712219ad220286201829000022044201882019413f73ad220688842105201841186a290000200286201841106a290000220c42018820068884210b200c20028620014201882019417f73413f71ad8884210c2004200286210a02400240200342017c220620112006200354221820092018ad7c2204200954200620035a1bad7c220984200420102009201154ad7c22118484500d004200211f200d41386a4200370000200d41306a4200370000200d41286a4200370000200d41186a2008370000200d4200370020200d200f370000200d2007370008200d200e370010200d2006a72219410376411f716a221841106a29000022012006420783220288201841186a290000220342018620194107712219413f73ad220e86842108201841086a290000220f20028820014201862019417f73413f71ad868421072018290000200288200f420186200e8684210e201d201c427f7c2201201c54ad7c2001201a427f7c2220201a542218201b2018ad7c427f7c2210201b542010201b511bad7c2212200154ad7c427f7c21212003200288211342002114034020084201862007423f88842203202120134201862008423f888422137d2012200354ad7d201220037d2020200e420186200b423f8884220f5420102007420186200e423f888422025420102002511bad54ad7d423f872201201c83220e7d2215200f2001201a83221654221820022001201b8322075420022007511bad22177d210820132001201d837d2003200e54ad7d2015201754ad7d2113200220077d2018ad7d2107200f20167d210e20042006427f7c22032006542218ad7c427f7c220220045121192002200454211e2009427f7c220f2009542122200a423f8821152005423f8821164200200b420186200c423f888484210b2014200a42018684210a2001420183221721142003210620022104200f2018201e20191bad7c2201210942002015200542018684842215210542002016200c42018684842216210c2003200184200220112022ad7c2001200f54ad7c427f7c2211848450450d000b4200210242002103201521052016210c0c010b4200211f42002102420021030b201f2005420186200a423f88848421042002200c4201862005423f88848421012003200b420186200c423f88848421062017200a4201868421020b02402002200183200420068383427f520d00200d41e0046a41186a428080808090ee9ea4ce00370300200d42003703f004200d42003703e804200d42003703e0044100200d41e0046a1022200d41c0046a41186a4200370300200d42003703d004200d42003703c804200d42113703c0044104200d41c0046a102241004124101d0b2000200242017c22033703002000200420032002542218ad7c22053703082000200120182005200454200320025a1bad7c2202370310200041186a20062002200154ad7c370300200d4180056a24000bd10703017f187e047f230041a0026b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad420042004200103f200041b8016a2903002102200041b0016a2903002103200041a8016a290300210420004198016a290300210520004190016a290300210620004188016a2903002107200041f8006a2903002108200041f0006a2903002109200041e8006a290300210a200041d8006a290300210b200041d0006a290300210c200041c8006a290300210d200041206a41186a290300210e200041206a41106a290300210f200041206a41086a2903002110200041d8016a2903002111200041d0016a2903002112200041c8016a290300211320002903a0012114200029038001211520002903602116200029034021172000290320211820002903c001102f5a41012013501b41012012201184501bad420042004200103b2000200220022002200220182010200f200e2017200d200c200b2016200a200920082015200720062005201420042003200220022002200220021057200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c00020004180026a102420004180026a41186a2219290300210620004180026a41106a221a290300210420004180026a41086a221b29030021052000290380022118200041e0016a41186a4200370300200042003703f001200042003703e801200042203703e0012018a7221c200041e0016a10222003a720004180026a1024201b2903002111201a29030021122000290380022117201920192903002209370300200020123703900220002011370388022000201737038002201c41206a20004180026a1022201842c0007c210202400240201720128420112009848450450d002002210a0c010b200620042002201854221920052019ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a720004180026a10242002a720004180026a10222010200142017c22062001542219200f2019ad7c2207200f54200620015a1bad7c220820105421192014200e200242207c220a200254221a200d201aad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b2005200354221a200c201aad7c2215200c54200520035a1bad7c2216200b54ad7c2113200a21022001210d200f210e200621012007210f20082110200521032015210c2016210b2006201754200720115420072011511b200820125420042019ad7c220420095420042009511b2008201285200420098584501b0d000b0b201c200a20187da71029200041a0026a24000ba91204027f047e257f087e23004180026b221d2400201d221e41a0016a41186a42bc8be38eeadb88d3c500370300201e42a5d7c98092aab3f2773703b001201e42e69aace283adc3f63e3703a801201e42c0d483caa5d2ddd1113703a001201e41a0016a201e4180016a1027201e4180016a41186a290300211f201e4180016a41106a2903002120201e4180016a41086a2903002121201e290380012122201e41e0006a200d200e200f201020112012201320141018ad4200420042001043201e41c0006a202220212020201f2005200620072008201e290360201e41e0006a41086a290300201e41e0006a41106a290300201e41e0006a41186a2903001047201e41c0006a41186a2903002108201e41c0006a41106a2903002107201e41c0006a41086a2903002106201e2903402205a72223201e41e0016a10240240201e2903e001201e41e0016a41106a222429030084201e41e0016a41086a2225290300201e41e0016a41186a222629030084844200520d002026428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b202341206a2227201e41e0016a1024201e2903e00120095820252903002209200a582009200a511b20242903002209200b582026290300220a200c58200a200c511b2009200b85200a200c8584501bad420042004200107102402011201384201220148484220a4200520d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b200da72224201e41e0016a1017201e41e0016a41086a2903002121201e2903e001212202404100201e41e0016a41106a290300220c428080808010544100201e41e0016a41186a290300220b501b200c42808080801085200b84501b0d0041004100101d0b201d41606a221d22262400201d1019201d2d001f2125201d2d001e2128201d2d001d2129201d2d001c212a201d2d001b212b201d2d001a212c201d2d0019212d201d2d0018212e201d2d0017212f201d2d00162130201d2d00152131201d2d00142132201d2d00132133201d2d00122134201d2d00112135201d2d00102136201d2d000f2137201d2d000e2138201d2d000d2139201d2d000c213a201d2d000b213b201d2d000a213c201d2d0009213d201d2d0008213e201d2d0007213f201d2d00062140201d2d00052141201d2d00042142201d2d00032143201d2d00022144201d2d00012145201d2d00002146202641606a221d22262400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202641606a222622472400201d20261027202641186a2903002148202641106a2903002149202641086a290300214a2026290300214b0240200a4200520d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b2024201e41e0016a1017201e41e8016a290300214c201e2903e001214d02404100201e41f0016a290300220a428080808010544100201e41f8016a2903002209501b200a42808080801085200984501b0d0041004100101d0b0240201142015620124200522012501b201342005220144200522014501b2013201484501b0d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b202441206a201e41e0016a1017201e41e0016a41086a221d290300214e201e2903e001214f02404100201e41e0016a41106a2226290300221f428080808010544100201e41e0016a41186a22242903002220501b201f42808080801085202084501b0d0041004100101d0b201e41206a204b204a20492048204d204c200a2009204f204e201f2020106e201e41206a41186a290300210a201e41206a41106a2903002109201e41206a41086a290300211f201e29032021202023201e41e0016a10240240201e2903e001202629030084201d290300202429030084844200520d00201e41e0016a41186a428080808090ee9ea4ce00370300201e42003703f001201e42003703e801201e42003703e0014100201e41e0016a1022201e41c0016a41186a4200370300201e42003703d001201e42003703c801201e42323703c0014104201e41c0016a102241004124101d0b2027201e41e0016a1024201e41e0016a41186a2903002148201e41e0016a41106a2903002149201e41e0016a41086a290300214a201e2903e001214b204741606a2226221d2400201d41606a221d2400201d20253a001f201d20283a001e201d20293a001d201d202a3a001c201d202b3a001b201d202c3a001a201d202d3a0019201d202e3a0018201d202f3a0017201d20303a0016201d20313a0015201d20323a0014201d20333a0013201d20343a0012201d20353a0011201d20363a0010201d20373a000f201d20383a000e201d20393a000d201d203a3a000c201d203b3a000b201d203c3a000a201d203d3a0009201d203e3a0008201d203f3a0007201d20403a0006201d20413a0005201d20423a0004201d20433a0003201d20443a0002201d20453a0001201d20463a0000201d2026101520222021200c200b2026290300202641086a290300202641106a290300202641186a2903002020201f2009200a204b204a20492048106f201e200d200e200f201020112012201320141018ad42004200420010432005200620072008201e290300201e41086a290300201e41106a290300201e41186a29030020152016201720181070200020073703102000200637030820002005370300200041186a2008370300201e4180026a24000be61207027f017e017f017e017f1b7e017f23004180036b220024000240101c450d0041004100101d0b0240101841e3004b0d0041004100101d0b4104200041e0026a1017200041f0026a22012903002102200041e0026a41186a22032903002104200041e0026a41086a2205290300210620002903e00221074124200041e0026a101720012903002108200329030021092005290300210a20002903e002210b41c400200041e0026a10172001290300210c2003290300210d2005290300210e20002903e002210f2007200284200620048484420052ad4200420042001059200b200884200a2009848422104200522201200f200c84200e200d848442005271ad420042004200105a200041e0016a20074200200f42001014200041d0016a20064200200f42001014200041f0016a20074200200e4200101420004180026a20064200200e4200101420004190026a20072006420042001014200041a0026a200f200e420042001014200041b0016a20064200200c42001014200041a0016a200d4200200742001014200041b0026a200c420020074200101420004180016a200e420020024200101420004190016a20044200200f42001014200041c0016a20024200200f4200101420002903e001211102402002200484420052200c200d84420052712004420052200e420052712000290398014200527220002903880142005272200041c0016a41086a29030022072000290390012000290380017c7c22022007547272200d42005220064200527120002903a8014200527220002903b80142005272200041b0026a41086a290300220620002903a00120002903b0017c7c22042006547272200029038002220c200041d0016a41086a29030020002903d0012206200041e0016a41086a2903007c2207200654ad7c220d200041f0016a41086a29030020002903f001220620077c2207200654ad7c7c22127c2206200029039002221320002903a0027c22147c220e20002903c001221520002903b0027c22167c220f200e54220520004180026a41086a2903002012200d54ad7c2006200c54ad7c20004190026a41086a290300200041a0026a41086a2903007c2014201354ad7c7c200e200654ad7c220e200220047c2016201554ad7c7c2005ad7c2206200e542006200e511b72410171450d002003428080808090ee9ea4ce00370300200042003703f002200042003703e802200042003703e0024100200041e0026a1022200041c0026a41186a4200370300200042003703d002200042003703c802200042113703c0024104200041c0026a102241004124101d0b024020010d00200041e0026a41186a428080808090ee9ea4ce00370300200042003703f002200042003703e802200042003703e0024100200041e0026a1022200041c0026a41186a4200370300200042003703d002200042003703c802200042123703c0024104200041c0026a102241004124101d0b420020062010502011200f842007200684845072420020097920087942c0007c20094200521b200a79200b7942c0007c200a4200521b220e4280017c2202200820098442005222031b2204200679200f7942c0007c20064200521b20077920117942c0007c20074200521b220c4280017c220d200f20068442005222011b221054220542002002200e54ad20031b220e4200200d200c54ad20011b220254200e2002511b2203ad7d221542005242002003410047ad7d22144200522014501b200420107d221242ff0156200e20027d2005ad7d22134200522013501b20031b7222031b210e4200200f20031b21024200200720031b21164200201120031b2104024020030d00201242ff0185201584201320148484500d00200041c0006a41286a2007370000200041e0006a2203201137000042002117200041c0006a41186a4200370000200041c0006a41306a200f370000200041c0006a41386a2006370000200042003700502000420037004820004200370040200341ff012012a76b2201410376411f716b220341086a290000220220014107712201ad220e862003290000220d4201882001413f73ad220c88842104200341186a290000200e86200341106a2900002216420188200c888421102016200e8620024201882001417f73413f71ad8884210c200d200e86210d02400240201242017c220220152002201254220320132003ad7c220e201354200220125a1bad7c221284200e20142012201554ad7c22188484500d0042002119200041386a4200370000200041306a4200370000200041286a4200370000200041186a20063700002000420037002020002011370000200020073700082000200f37001020002002a72201410376411f716a220341106a29000022072002420783220688200341186a290000220f42018620014107712201413f73ad221486842111200341086a290000221520068820074201862001417f73413f71ad868421132003290000200688201542018620148684211420092008427f7c2207200854ad7c2007200b427f7c221a200b542203200a2003ad7c427f7c2216200a542016200a511bad7c221b200754ad7c427f7c211c200f200688211d4200211e034020114201862013423f8884220f201c201d4201862011423f8884221d7d201b200f54ad7d201b200f7d201a20144201862010423f8884221554201620134201862014423f888422065420162006511bad54ad7d423f87220720088322147d221f20152007200b83222054220320062007200a8322135420062013511bad22177d2111201d20072009837d200f201454ad7d201f201754ad7d211d200620137d2003ad7d2113201520207d2114200e2002427f7c220f2002542203ad7c427f7c2206200e5121012006200e5421052012427f7c22152012542121200d423f88211f2004423f88212042002010420186200c423f8884842110201e200d42018684210d20074201832217211e200f21022006210e20152003200520011bad7c220721124200201f20044201868484221f210442002020200c42018684842220210c200f200784200620182021ad7c2007201554ad7c427f7c2218848450450d000b4200210642002107201f21042020210c0c010b4200211942002106420021070b20192004420186200d423f88848421162006200c4201862004423f888484210220072010420186200c423f888484210e2017200d4201868421040b41c000200041e0026a102420002802e0022103200041f8026a200e370300200020023703f002200020163703e802200020043703e0022003200041e0026a102220034120102920004180036a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054225370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42808080a0e5a9d5a7cd00370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054228370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42d9a8a5a294a9d5a8c900370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bc80406027f027e017f017e017f157e230041c0006b220024000240101c450d0041004100101d0b0240101841c3014b0d0041004100101d0b4104200041206a1017200041286a220129030021022000290320210302404100200041306a22042903002205428080808010544100200041386a22062903002207501b200542808080801085200784501b0d0041004100101d0b4124200041206a101720062903002108200429030021092001290300210a2000290320210b41c400200041206a10172006290300210c2004290300210d2001290300210e2000290320210f41e400200041206a101720062903002110200429030021112001290300211220002903202113418401200041206a10172001290300211420002903202115024041002004290300221642808080801054410020062903002217501b201642808080801085201784501b0d0041004100101d0b41a401200041206a1017200041206a41186a22042903002118200041206a41106a2903002119200041206a41086a290300211a2000290320221b102f5a4101201a501b41012019201884501bad420042004200103b200020052005200520052003200220052007200b200a20092008200f200e200d200c20132012201120102015201420162017201b201a20192018105c200041086a2903002105200041106a2903002107200041186a29030021162000290300211741c000200041206a102420002802202101200420163703002000200737033020002005370328200020173703202001200041206a1022200141201029200041c0006a24000b990f03027f077e047f23004180046b221d2400201d221e41a0036a41186a42ebebe4fcb28587a751370300201e42dea0e0bdc4f6b08d6a3703b003201e42b1f48ed6d0a7eb857e3703a803201e42bfa3ffbd899593d51a3703a003201e41a0036a201e4180036a1027201e4180036a41186a290300211f201e4180036a41106a2903002120201e4180036a41086a2903002121201e290380032122201e41e0026a101a201e201e2900e0023700a002201e201e2900e8023700a802201e201e2900f0023700b002201e201e2900f8023700b802201e41a0026a201e41c0026a1015201e41c0026a41086a2903002123201e41c0026a41106a3502002124201e2903c0022125102f2019584101201a501b4101201b201c84501bad420042004200103b201e200720072007200720072007200720072005200620072008202220212020201f2009200a200b200c200d200e200f2010201120122013201420252023202442002007200720072007105f201e41386a2903002119201e41306a290300211a201e41286a290300211c201e290320211b201e4180026a101a201e201e290080023700c001201e201e290088023700c801201e201e290090023700d001201e201e290098023700d801201e41c0016a201e41e0016a1015201e41e0016a41086a2903002113201e41e0016a41106a3502002112201e2903e001211141c000201e41e0036a1024201e41e0036a41186a22262903002110201e41e0036a41106a290300210f201e41e0036a41086a290300210e201e2903e003211420264200370300201e42003703f003201e42003703e803201e42b1848285073703e003201e41e0036a41e001201e41c0036a1037201e41a0016a41186a201e41c0036a41186a290300370300201e201e41c0036a41106a2903003703b001201e201e41c0036a41086a2903003703a801201e201e2903c0033703a0012014a72227201e41a0016a102220264200370300201e20123703f003201e20133703e803201e20113703e003202741046a201e41e0036a1022102e2113201e4180016a41186a4200370300201e200742ffffffff0f8337039001201e200637038801201e200537038001201e4180016a201e41e0006a1016201e201e290060370040201e201e290068370048201e201e290070370050201e201e290078370058024002402013201e41c0006a2027412420274120102d0d0041c000201e41e0036a1024201e2802e003222741001030102b20271030101d0c010b0240024010304120490d002014200e200f2010422042004200420010420c010b2014200e200f201010302226ad42004200420010422026411f4b0d0041004100101d0b2027201e41e0036a1024201e41f8036a2903002111201e41f0036a2903002112201e41e8036a2903002113201e2903e00321140b200520062007200820152016201720182014201320122011106a201d41606a2227221d2400202741186a42ebebe4fcb28587a751370300202742dea0e0bdc4f6b08d6a370310202742b1f48ed6d0a7eb857e370308202742bfa3ffbd899593d51a370300201d41606a221d222624002027201d1027201d2903002107201d41086a2903002106201d41106a3502002105202641606a2227221d2400202741186a4200370300202720053703102027200637030820272007370300201d41606a221d222624002027201d1016201d2900002108201d2900082114201d2900102113201d2900182112202641606a2227221d2400202720123700182027201337001020272014370008202720083700000240202710350d0041004100101d0b41c000201e41e0036a1024201e41e0036a41086a2903002114201e41e0036a41106a2903002113201e41e0036a41186a22262903002112201e2903e0032108201d41606a2227221d2400202741186a201237030020272013370310202720143703082027200837030020264200370300201e42003703f003201e42003703e803201e42cdfae9f0023703e003201e41e0036a41e001201e41c0036a1037201e41c0036a41086a2903002114201e41c0036a41106a2903002113201e41c0036a41186a2903002112201e2903c0032111201d41606a221d22282400201d41186a2012370300201d2013370310201d2014370308201d20113703002008a72229201d102220262019370300201e201a3703f003201e201c3703e803201e201b3703e003202941046a201e41e0036a1022102e2108202841606a221d22262400201d41186a4200370300201d2005370310201d2006370308201d2007370300202641606a222622282400201d2026101620262900002107202629000821062026290010210520262900182114202841606a221d22262400201d2014370018201d2005370010201d2006370008201d2007370000202641606a22262400202641186a4200370300202642003703102026420037030820264200370300024002402008201d20262029412420294100102c0d0041c000201e41e0036a1024201e2802e003222741001030102b20271030101d0c010b10301a2027290300202741086a290300202741106a290300202741186a290300420042004200420010420b2015201620172018201b201c201a2019106b2000201a3703102000201c3703082000201b370300200041186a2019370300201e4180046a24000bff280a027f017e017f047e027f077e017f017e027f077e23004180016b221421152014240002402008200a842009200b848422164200520d00201541e0006a41186a428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a42003703002015420037035020154200370348201542323703404104201541c0006a102241004124101d0b2004a72217201541e0006a1017201541e0006a41086a29030021182015290360211902404100201541e0006a41106a290300221a428080808010544100201541e0006a41186a290300221b501b201a42808080801085201b84501b0d0041004100101d0b201441606a2214221c2400201441186a42ebebe4fcb28587a751370300201442dea0e0bdc4f6b08d6a370310201442b1f48ed6d0a7eb857e370308201442bfa3ffbd899593d51a370300201c41606a221c221d24002014201c1027201c290300201985201c41106a350200201a42ffffffff0f838584201c41086a2903002018858450ad420042004200106c201d41606a2214221c24002014101b201441186a290300211a201441106a2903002118201441086a29030021192014290300211b201c41606a2214221c2400201441186a42ebebe4fcb28587a751370300201442dea0e0bdc4f6b08d6a370310201442b1f48ed6d0a7eb857e370308201442bfa3ffbd899593d51a370300201c41606a221c221d24002014201c1027201c290300211e201c41086a290300211f201c41106a3502002120201d41606a2214221c2400201441186a4200370300201420203703102014201f3703082014201e370300201c41606a221c221d24002014201c1016201c2900002121201c2900082122201c2900102123201c2900182124201d41606a2214221c2400201420243700182014202337001020142022370008201420213700000240201410350d0041004100101d0b41c000201541e0006a1024201541e0006a41086a2903002122201541e0006a41106a2903002123201541e0006a41186a221d290300212420152903602121201c41606a2214221c2400201441186a22252024370300201420233703102014202237030820142021370300201d42003703002015420037037020154200370368201542b09b8c870d370360201541e0006a41e001201541c0006a1037201541c0006a41086a2903002122201541c0006a41106a2903002123201541c0006a41186a290300212420152903402126201c41606a221c221d2400201c41186a2024370300201c2023370310201c2022370308201c20263703002021a72227201c1022102e2121201d41606a221c221d2400201c41186a4200370300201c2020370310201c201f370308201c201e370300201d41606a221d22282400201c201d1016201d290000211e201d290008211f201d2900102120201d2900182122202841606a221c221d2400201c2022370018201c2020370010201c201f370008201c201e370000201d41606a221d22282400201d41186a201a370300201d2018370310201d2019370308201d201b370300024002402021201c201d2027410420274100102c0d0041c000201541e0006a10242015280260221441001030102b20141030101d0c010b10301a2014290300201441086a290300201441106a2903002025290300420042004200420010420b202841606a2214221c2400201441186a42ebebe4fcb28587a751370300201442dea0e0bdc4f6b08d6a370310201442b1f48ed6d0a7eb857e370308201442bfa3ffbd899593d51a370300201c41606a221c221d24002014201c1027201c41086a2903002122201c2903002123201c41106a3502002124201d41606a2214221c2400201441186a42bc8be38eeadb88d3c500370300201442a5d7c98092aab3f277370310201442e69aace283adc3f63e370308201442c0d483caa5d2ddd111370300201c41606a221c222724002014201c1027201c41186a2903002126201c41106a2903002129201c41086a290300212a201c290300212b024020164200520d00201541e0006a41186a428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a42003703002015420037035020154200370348201542323703404104201541c0006a102241004124101d0b2017201541e0006a1017201541e0006a41086a290300212c2015290360212d02404100201541e0006a41106a290300221e428080808010544100201541e0006a41186a290300221f501b201e42808080801085201f84501b0d0041004100101d0b0240200842015620094200522009501b200a420052200b420052200b501b200a200b84501b0d00201541e0006a41186a428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a42003703002015420037035020154200370348201542323703404104201541c0006a102241004124101d0b201741206a201541e0006a1017201541e0006a41086a2214290300212e2015290360212f02404100201541e0006a41106a221c2903002220428080808010544100201541e0006a41186a221d2903002221501b202042808080801085202184501b0d0041004100101d0b201541206a202b202a20292026202d202c201e201f202f202e20202021106e201541206a41086a290300211f201541206a41106a35020021202015290320212141c000201541e0006a102420142903002126201c2903002129201d290300212a2015290360211e202741606a2214221c2400201441186a202a37030020142029370310201420263703082014201e370300201d42003703002015420037037020154200370368201542bbb996c80a370360201541e0006a41e001201541c0006a1037201541c0006a41086a2903002126201541c0006a41106a2903002129201541c0006a41186a290300212a2015290340212b201c41606a221c22272400201c41186a202a370300201c2029370310201c2026370308201c202b370300201ea72217201c1022201d4200370300201520203703702015201f37036820152021370360201741046a201541e0006a1022201d201a37030020152018370370201520193703682015201b370360201741246a201541e0006a1022102e211a202741606a221c221d2400201c41186a4200370300201c2024370310201c2022370308201c2023370300201d41606a221d22272400201c201d1016201d2900002118201d2900082119201d290010211b201d290018211e202741606a221c221d2400201c201e370018201c201b370010201c2019370008201c2018370000201d41606a221d22272400201d41186a4200370300201d4200370310201d4200370308201d4200370300024002400240201a201c201d201741c40020174120102c0d0041c000201541e0006a10242015280260221441001030102b20141030101d0c010b0240024010304120490d002014290300221a201441086a290300201441106a290300201441186a29030042204200420042001042201aa721140c010b1030211c2014290300221a201441086a290300201441106a290300201441186a290300201cad4200420042001042201aa72114201c411f4b0d0041004100101d0b2014201541e0006a102402402015290360221a201a201541f0006a290300221884201541e8006a290300201541f8006a29030084221a844200522214ad85201884201a84500d0041004100101d0b20140d010b201541e0006a41186a428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a42003703002015420037035020154200370348201542013703404104201541c0006a102241004124101d0b024020164200520d00201541e0006a41186a2214428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a221c42003703002015420037035020154200370348201542113703404104201541c0006a102241004124101d2014428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201c42003703002015420037035020154200370348201542323703404104201541c0006a102241004124101d0b200420084205867ca741606a2228201541e0006a1017201541e0006a41086a221429030021192015290360211b02404100201541e0006a41106a221c290300221a428080808010544100201541e0006a41186a221d2903002218501b201a42808080801085201884501b0d0041004100101d0b41c000201541e0006a10242014290300211e201c290300211f201d290300212020152903602118202741606a2214221c2400201441186a20203703002014201f3703102014201e37030820142018370300201d42003703002015420037037020154200370368201542b184828507370360201541e0006a41e001201541c0006a1037201541c0006a41086a290300211e201541c0006a41106a290300211f201541c0006a41186a290300212020152903402121201c41606a221c22272400201c41186a2020370300201c201f370310201c201e370308201c20213703002018a72217201c1022201d42003703002015200e42ffffffff0f8322183703702015200d3703682015200c370360201741046a201541e0006a1022102e211e202741606a221c221d2400201c41186a4200370300201c201a42ffffffff0f83370310201c2019370308201c201b370300201d41606a221d22272400201c201d1016201d290000211a201d2900082119201d290010211b201d290018211f202741606a221c221d2400201c201f370018201c201b370010201c2019370008201c201a37000002400240201e201c2017412420174120102d0d0041c000201541e0006a10242015280260221441001030102b20141030101d0c010b0240024010304120490d002014290300221a201441086a290300201441106a290300201441186a29030042204200420042001042201aa721140c010b1030211c2014290300221a201441086a290300201441106a290300201441186a290300201cad4200420042001042201aa72114201c411f4b0d0041004100101d0b2014201541e0006a1024201541f8006a290300211e201541f0006a290300211b201541e8006a29030021192015290360211a0b201d41606a2214221c2400201441186a201e3703002014201b370310201420193703082014201a3703002015200420052006200720082009200a200b1018ad42004200420010432015290300201541086a290300201541106a290300201541186a290300200c200d200e200f1072024020164200520d00201541e0006a41186a221d428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a221742003703002015420037035020154200370348201542113703404104201541c0006a102241004124101d201d428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201742003703002015420037035020154200370348201542323703404104201541c0006a102241004124101d0b2028201541e0006a1017201541e0006a41086a290300210a2015290360210802404100201541e0006a41106a290300220b428080808010544100201541e0006a41186a2903002209501b200b42808080801085200984501b0d0041004100101d0b41c000201541e0006a1024201541e0006a41086a2903002104201541e0006a41106a2903002116201541e0006a41186a2217290300210e20152903602109201c41606a221c221d2400201c41186a200e370300201c2016370310201c2004370308201c2009370300201742003703002015420037037020154200370368201542b184828507370360201541e0006a41e001201541c0006a1037201541c0006a41086a2903002104201541c0006a41106a2903002116201541c0006a41186a290300210e2015290340211a201d41606a221d22282400201d41186a200e370300201d2016370310201d2004370308201d201a3703002009a72227201d102220174200370300201520183703702015200d3703682015200c370360202741046a201541e0006a1022102e2109202841606a221d22172400201d41186a4200370300201d200b42ffffffff0f83370310201d200a370308201d2008370300201741606a221722282400201d201710162017290000210b2017290008210a201729001021082017290018210d202841606a221d2400201d200d370018201d2008370010201d200a370008201d200b370000024002402009201d2027412420274120102d0d0041c000201541e0006a10242015280260221c41001030102b201c1030101d201441186a290300210d201441106a290300210a201441086a290300210b201429030021040c010b0240024010304120490d00201c290300220b201c41086a290300201c41106a290300201c41186a29030042204200420042001042200ba7211c0c010b1030211d201c290300220b201c41086a290300201c41106a290300201c41186a290300201dad4200420042001042200ba7211c201d411f4b0d0041004100101d0b201c201541e0006a102420152903602216201429030022045a201541e0006a41086a2903002209201441086a290300220b5a2009200b511b201541e0006a41106a2903002208201441106a290300220a5a201541e0006a41186a221c290300220c201441186a290300220d5a200c200d511b2008200a85200c200d8584501b0d00201c428080808090ee9ea4ce003703002015420037037020154200370368201542003703604100201541e0006a1022201541c0006a41186a42003703002015420037035020154200370348201542113703404104201541c0006a102241004124101d0b201620047d20005a2009200b7d20162004542214ad7d220420015a20042001511b2008200a7d220420142009200b542009200b511bad220b7d220920025a200c200d7d2008200a54ad7d2004200b54ad7d220b20035a200b2003511b2009200285200b20038584501bad420042004200106d20154180016a24000ba40602057f137e230041206b220924000240200520017d42df0156200620027d2005200154220aad7d22054200522005501b200720037d2205200a200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101d0b2001a7220a20091017200941086a220b29030021042009290300210802404100200941106a220c2903002202428080808010544100200941186a220d2903002206501b200242808080801085200684501b0d0041004100101d0b200a41206a20091017200b290300210e2009290300210f02404100200c2903002201428080808010544100200d2903002205501b200142808080801085200584501b0d0041004100101d0b200a41c0006a20091017200941186a220b2903002110200941106a220c2903002111200941086a220d290300211220092903002113200a41e0006a20091017200b2903002114200c2903002115200d290300211620092903002117200a4180016a20091017200b2903002118200c2903002119200d290300211a2009290300211b200a41a0016a20091017200d290300211c2009290300211d02404100200c2903002203428080808010544100200b2903002207501b200342808080801085200784501b0d0041004100101d0b200a41c0016a20091017200d290300211e200c290300211f200b2903002120200020092903003703c0012000201d3703a0012000201b3703800120002017370360200020133703402000200f370320200020023703102000200437030820002008370300200041d8016a2020370300200041d0016a201f370300200041c8016a201e370300200041b8016a2007370300200041b0016a2003370300200041a8016a201c37030020004198016a201837030020004190016a201937030020004188016a201a370300200041f8006a2014370300200041f0006a2015370300200041e8006a2016370300200041d8006a2010370300200041d0006a2011370300200041c8006a2012370300200041386a2005370300200041306a2001370300200041286a200e370300200041186a2006370300200941206a24000bf41005027f057e017f047e037f230041a0036b222524002025222641c0026a41186a42bc8be38eeadb88d3c500370300202642a5d7c98092aab3f2773703d002202642e69aace283adc3f63e3703c802202642c0d483caa5d2ddd1113703c002202641c0026a202641a0026a1027202620262903a002202641a0026a41086a290300202641a0026a41106a290300202641a0026a41186a2903002009200a200b200c200d200e200f2010106e202641086a2903002110202641106a350200210c2026290300212720264180026a101920262900800221282026290088022129202629009002212a202629009802212b41c00020264180036a102420264180036a41186a222c290300212d20264180036a41106a290300212e20264180036a41086a290300212f2026290380032130202c420037030020264200370390032026420037038803202642dde5e19d023703800320264180036a41e001202641e0026a1037202641e0016a41186a202641e0026a41186a2903003703002026202641e0026a41106a2903003703f0012026202641e0026a41086a2903003703e801202620262903e0023703e0012030a72231202641e0016a10222026202b3700b8012026202a3700b001202620293700a801202620283700a001202641a0016a202641c0016a1015202641c0016a41086a2903002128202641c0016a41106a350200212920262903c001212a202c4200370300202620293703900320262028370388032026202a37038003203141046a20264180036a1022202c42003703002026200c3703900320262010370388032026202737038003203141246a20264180036a1022202c2014370300202620133703900320262012370388032026201137038003203141c4006a20264180036a1022102e211420264180016a41186a42003703002026200c370390012026201037038801202620273703800120264180016a202641e0006a1016202641206a41186a420037030020264200370330202642003703282026420037032020262026290060370040202620262900683700482026202629007037005020262026290078370058024002402014202641c0006a202641206a203141e40020314120102c0d0041c00020264180036a1024202628028003223141001030102b20311030101d0c010b0240024010304120490d002030202f202e202d422042004200420010420c010b2030202f202e202d1030222cad4200420042001042202c411f4b0d0041004100101d0b203120264180036a10242026290380032230203020264190036a29030022148420264188036a29030020264198036a29030084223084420052ad85201484203084500d0041004100101d0b41c00020264180036a102420264180036a41086a290300213020264180036a41106a290300211320264180036a41186a223229030021122026290380032114202541606a2231222c2400203141186a2012370300203120133703102031203037030820312014370300420021302032420037030020264200370390032026420037038803202642c496bfcd083703800320264180036a41e001202641e0026a1037202641e0026a41086a2903002113202641e0026a41106a2903002112202641e0026a41186a290300211120262903e0022128202c41606a222c22252400202c41186a2011370300202c2012370310202c2013370308202c20283703002014a72233202c1022203242003703002026201f42ffffffff0f83370390032026201e370388032026201d37038003203341046a20264180036a1022102e2114202541606a222c22252400202c41186a4200370300202c200c370310202c2010370308202c2027370300202541606a222522322400202c20251016202529000021102025290008210c2025290010212720252900182113203241606a222c22252400202c2013370018202c2027370010202c200c370008202c2010370000202541606a22252400202541186a4200370300202542003703102025420037030820254200370300024002402014202c202520334124203341c000102c0d0041c00020264180036a1024202628028003223141001030102b20311030101d4200210c42002127420021144200211342002112420021114200211f0c010b02400240103041c000490d0020312903002210203141086a290300203141106a290300203141186a29030042c00042004200420010422010a721310c010b1030212c20312903002210203141086a290300203141106a290300203141186a290300202cad42004200420010422010a72131202c413f4b0d0041004100101d0b203120264180036a102420264198036a222c290300211f20264190036a2225290300211120264188036a223329030021122026290380032113203141206a20264180036a1024202c2903002114202529030021272033290300210c20262903800321300b2009200d85200b42ffffffff0f832210200f42ffffffff0f83221e85221d84200a200e8584420052ad42004200420010752009200d2009200d54200a200e54200a200e511b2010201e54201d501b22311b220d200b200f20311b42ffffffff0f83220f84200a200e20311b220e84420052ad4200420042001076201320302009200d852010200f8584200a200e85845022311b221020155a2012200c20311b220920165a20092016511b2011202720311b220d20175a201f201420311b220a20185a200a2018511b200d201785200a20188584501bad42004200420010732030201320311b221820195a200c201220311b220f201a5a200f201a511b2027201120311b220b201b5a2014201f20311b220e201c5a200e201c511b200b201b85200e201c8584501bad4200420042001074200020183703202000200d3703102000200937030820002010370300200041386a200e370300200041306a200b370300200041286a200f370300200041186a200a370300202641a0036a24000be60608017f097e027f037e027f017e017f0b7e230041a0016b220024000240101c450d0041004100101d0b42002101200041206a42044200420042001018ad4200420042001045200041d8006a2903002102200041d0006a2903002103200041c8006a2903002104200041206a41186a2903002105200041206a41106a2903002106200041206a41086a2903002107200029034021082000290320210920004180016a41186a220a42bc8be38eeadb88d3c500370300200042a5d7c98092aab3f27737039001200042e69aace283adc3f63e37038801200042c0d483caa5d2ddd1113703800120004180016a200041e0006a102720002000290360200041e0006a41086a290300200041e0006a41106a290300200041e0006a41186a220b290300200920072006200520082004200320021061200041186a290300210c200041106a290300210d200041086a290300210e2000290300210341c00020004180016a1024200a290300210620004180016a41106a220f290300210420004180016a41086a221029030021052000290380012111200b42003703002000420037037020004200370368200042203703602011a72212200041e0006a10222003a720004180016a102420102903002113200f29030021142000290380012115200a200a2903002209370300200020143703900120002013370388012000201537038001201241206a20004180016a1022201142c0007c210202400240201520148420132009848450450d00200221160c010b200620042002201154220a2005200aad7c2217200554200220115a1bad7c2218200454ad7c21194200211a4200211b420021040340200342207c2205a720004180016a10242002a720004180016a1022201b200142017c2206200154220a201a200aad7c2207201a54200620015a1bad7c2208201b54210a20192018200242207c2216200254220b2017200bad7c2201201754201620025a1bad7c221a201854ad7c2119200c200d2005200354220b200e200bad7c221c200e54200520035a1bad7c221d200d54ad7c210c2016210220012117201a2118200621012007211a2008211b20052103201c210e201d210d2006201554200720135420072013511b20082014542004200aad7c220420095420042009511b2008201485200420098584501b0d000b0b2012201620117da71029200041a0016a24000b8c100a037f017e017f017e017f067e017f027e047f097e230041c0016b220d24002009a7220e200d41a0016a1024200d2903a001420156200d41a0016a41086a220f29030022104200522010501b200d41a0016a41106a22112903002212420052200d41a0016a41186a221329030022104200522010501b2012201084501bad420042004200107d200e200d41a0016a1024200d41e0006a200d2903a0012210200f29030022122011290300221420132903002215107e200d41e0006a41186a2903002116200d41e0006a41106a2903002117200d41e0006a41086a2903002118200d2903602119024020125041002014201584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d42c100370380014104200d4180016a102241004124101d0b2019a7221a41206a10182010a74105741031201a200d41a0016a10240240200d2903a001201129030084200f290300201329030084844200520d00200d41a0016a41186a428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b200d41a0016a41186a22132008370300200d20053703a001200d20063703a801200d20073703b001201942207c221ba7200d41a0016a1022200942207c211c200d41a0016a41086a210f200d41a0016a41106a2111200d41d8006a211d200d41d0006a211e200d41c8006a211f420021074200211042002108420021090340200e200d41a0016a10240240200d2903a00122052011290300221284200f29030022062013290300221584844200520d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4211370380014104200d4180016a102241004124101d0b024020072005427f7c2214542010200620142005542220ad7c427f7c22055420102005511b20082012427f7c22142020200520065420052006511bad7c220654200920152014201254ad7c2006201454ad7c427f7c22055420092005511b2008200685200920058584501b450d00200e200d41a0016a10240240200d2903a001200756200f290300220620105620062010511b201129030022052008562013290300220620095620062009511b2005200885200620098584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20074205862221201c7ca7200d41a0016a1024200f290300212220113502002123200d2903a0012124200e200d41a0016a10240240200d2903a001200742017c220556200f2903002206201020052007542220ad7c22125620062012511b20112903002225200820202012201054200520075a1bad7c2214562013290300221520092014200854ad7c22065620152006511b2025201485201520068584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20054205862215201c7ca7200d41a0016a1024200d41206a20012002200320042024202220234200200d2903a001200f29030020113502004200107f201d2903002122201e2903002123201f2903002124200d41206a41186a2903002125200d41206a41106a2903002126200d41206a41086a2903002127200d2903402128200d2903202129201a200d41a0016a10240240200d2903a001200756200f290300220720105620072010511b201129030022072008562013290300221020095620102009511b2007200885201020098584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b2021201b7ca7200d41a0016a1024200d200d2903a001200f2903002011290300201329030020292027202620252028202420232022103d200d41186a2903002110200d41106a2903002108200d41086a2903002107200d2903002121201a200d41a0016a10240240200d2903a001200556200f290300220920125620092012511b201129030022222014562013290300220920065620092006511b2022201485200920068584501b0d002013428080808090ee9ea4ce00370300200d42003703b001200d42003703a801200d42003703a0014100200d41a0016a1022200d4180016a41186a4200370300200d420037039001200d420037038801200d4232370380014104200d4180016a102241004124101d0b20132010370300200d20213703a001200d20073703a801200d20083703b0012015201b7ca7200d41a0016a1022200521072012211020142108200621090c010b0b200020193703002000201837030820002017370310200041186a2016370300200d41c0016a24000bd0110b027f047e207f027e017f037e017f017e017f017e027f23004180046b222924002029222a41a0036a41186a42bc8be38eeadb88d3c500370300202a42a5d7c98092aab3f2773703b003202a42e69aace283adc3f63e3703a803202a42c0d483caa5d2ddd1113703a003202a41a0036a202a4180036a1027202a41e0026a41186a42ebebe4fcb28587a751370300202a42dea0e0bdc4f6b08d6a3703f002202a42b1f48ed6d0a7eb857e3703e802202a42bfa3ffbd899593d51a3703e002202a4180036a41186a290300212b202a4180036a41106a290300212c202a4180036a41086a290300212d202a29038003212e202a41e0026a202a41c0026a1027202a41c0006a202e202d202c202b2001200220032004202a2903c002202a41c0026a41086a290300202a41c0026a41106a290300202a41c0026a41186a290300106e202a41c0006a41086a290300212b202a41c0006a41106a350200212c202a290340212d202a41a0026a1019202a2d00bf02212f202a2d00be022130202a2d00bd022131202a2d00bc022132202a2d00bb022133202a2d00ba022134202a2d00b9022135202a2d00b8022136202a2d00b7022137202a2d00b6022138202a2d00b5022139202a2d00b402213a202a2d00b302213b202a2d00b202213c202a2d00b102213d202a2d00b002213e202a2d00af02213f202a2d00ae022140202a2d00ad022141202a2d00ac022142202a2d00ab022143202a2d00aa022144202a2d00a9022145202a2d00a8022146202a2d00a7022147202a2d00a6022148202a2d00a5022149202a2d00a402214a202a2d00a302214b202a2d00a202214c202a2d00a102214d202a2d00a002214e202a4180026a101a202a202a290080023700c001202a202a290088023700c801202a202a290090023700d001202a202a290098023700d801202a41c0016a202a41e0016a1015202a41a0016a41186a4200370300202a202c3703b001202a202b3703a801202a202d3703a001202a41e0016a41086a290300212e202a41e0016a41106a350200214f202a2903e0012150202a41a0016a202a4180016a1016202a202a29008001370060202a202a29008801370068202a202a29009001370070202a202a290098013700782008427f2019201b84201a201c84845022511b211a2007427f20511b211b2006427f20511b21192005427f20511b21520240202a41e0006a10350d0041004100101d0b41c000202a41e0036a1024202a41e0036a41086a2903002153202a41e0036a41106a2903002154202a41e0036a41186a22552903002156202a2903e003211c202941606a225722512400205741186a205637030020572054370310205720533703082057201c37030020554200370300202a42003703f003202a42003703e803202a42cfd996a80d3703e003202a41e0036a41e001202a41c0036a1037202a41c0036a41086a2903002153202a41c0036a41106a2903002154202a41c0036a41186a2903002156202a2903c0032158205141606a225122592400205141186a2056370300205120543703102051205337030820512058370300201ca7222920511022205941606a225922512400205141606a2251225a24002051202f3a001f205120303a001e205120313a001d205120323a001c205120333a001b205120343a001a205120353a0019205120363a0018205120373a0017205120383a0016205120393a00152051203a3a00142051203b3a00132051203c3a00122051203d3a00112051203e3a00102051203f3a000f205120403a000e205120413a000d205120423a000c205120433a000b205120443a000a205120453a0009205120463a0008205120473a0007205120483a0006205120493a00052051204a3a00042051204b3a00032051204c3a00022051204d3a00012051204e3a00002051205910152059290300211c205941086a2903002153205941106a350200215420554200370300202a20543703f003202a20533703e803202a201c3703e003202941046a202a41e0036a102220554200370300202a204f3703f003202a202e3703e803202a20503703e003202941246a202a41e0036a10222055201a370300202a201b3703f003202a20193703e803202a20523703e003202941c4006a202a41e0036a102220552018370300202a20173703f003202a20163703e803202a20153703e003202941e4006a202a41e0036a102220554200370300202a42003703f003202a42003703e803202a201d42ff01833703e00320294184016a202a41e0036a102220552024370300202a20233703f003202a20223703e803202a20213703e003202941a4016a202a41e0036a102220552028370300202a20273703f003202a20263703e803202a20253703e003202941c4016a202a41e0036a1022102e211c205a41606a225122552400205141186a42003703002051202c3703102051202b3703082051202d370300205541606a2255225924002051205510162055290000212b2055290008212c2055290010212d2055290018211a205941606a2251225524002051201a3700182051202d3700102051202c3700082051202b370000205541606a22552400205541186a420037030020554200370310205542003703082055420037030002400240201c20512055202941e40120294100102c0d0041c000202a41e0036a1024202a2802e003225141001030102b20511030101d0c010b10301a2057290300205741086a290300205741106a290300205741186a290300420042004200420010420b102f20155841012016501b41012017201884501bad420042004200103b202a20182018201820182018201820182018200120022003200420052006200720082009200a200b200c200d200e200f201020112012201320142015201620172018103c202a41186a2903002118202a41286a2903002117202a41386a2903002116202a41306a2903002115202a41086a2903002104202a41106a2903002103202a29030021022000202a290320370320200020033703102000200237030020002004370308200041306a2015370300200041386a2016370300200041286a2017370300200041186a2018370300202a4180046a24000bf30602057f177e230041206b220924000240200520017d42ff0156200620027d2005200154220aad7d22054200522005501b200720037d2205200a200620025420062002511bad22027d2206420052200820047d2007200354ad7d2005200254ad7d22024200552002501b2006200284501b0d0041004100101d0b2001a7220a20091017200941086a220b29030021042009290300210802404100200941106a220c2903002202428080808010544100200941186a220d2903002206501b200242808080801085200684501b0d0041004100101d0b200a41206a20091017200b290300210e2009290300210f02404100200c2903002201428080808010544100200d2903002205501b200142808080801085200584501b0d0041004100101d0b200a41c0006a20091017200941186a220b2903002110200941106a220c2903002111200941086a220d290300211220092903002113200a41e0006a20091017200b2903002114200c2903002115200d290300211620092903002117200a4180016a20091017200b2903002118200c2903002119200d290300211a2009290300211b200a41a0016a20091017200b290300211c200c290300211d200d290300211e2009290300211f200a41c0016a20091017200d29030021202009290300212102404100200c2903002203428080808010544100200b2903002207501b200342808080801085200784501b0d0041004100101d0b200a41e0016a20091017200d2903002122200c2903002123200b2903002124200020092903003703e001200020213703c0012000201f3703a0012000201b3703800120002017370360200020133703402000200f370320200020023703102000200437030820002008370300200041f8016a2024370300200041f0016a2023370300200041e8016a2022370300200041d8016a2007370300200041d0016a2003370300200041c8016a2020370300200041b8016a201c370300200041b0016a201d370300200041a8016a201e37030020004198016a201837030020004190016a201937030020004188016a201a370300200041f8006a2014370300200041f0006a2015370300200041e8006a2016370300200041d8006a2010370300200041d0006a2011370300200041c8006a2012370300200041386a2005370300200041306a2001370300200041286a200e370300200041186a2006370300200941206a24000bb20603017f1f7e027f23004180036b220024000240101c450d0041004100101d0b200041e0006a42044200420042001018ad4200420042001063200041b8026a2903002101200041b0026a2903002102200041a8026a290300210320004198026a290300210420004190026a290300210520004188026a2903002106200041f8016a2903002107200041f0016a2903002108200041e8016a2903002109200041d8016a290300210a200041d0016a290300210b200041c8016a290300210c200041e0006a41d8006a290300210d200041e0006a41d0006a290300210e200041e0006a41c8006a290300210f200041e0006a41386a2903002110200041e0006a41306a2903002111200041e0006a41286a2903002112200041e0006a41186a2903002113200041e0006a41106a2903002114200041e0006a41086a2903002115200041d8026a2903002116200041d0026a2903002117200041c8026a290300211820002903a0022119200029038002211a20002903e001211b20002903c001211c20002903a001211d200029038001211e2000290360211f20002903c002102f5a41012018501b41012017201684501bad420042004200103b2000200120012001200120012001200120012001200120012001201f201520142013201e201220112010201d200f200e200d201c200c200b200a201b200920082007201a200620052004201920032002200120012001200120011065200041c8006a2903002101200041d0006a2903002102200041d8006a2903002103200041286a2903002104200041306a2903002105200041386a2903002106200041086a2903002107200041106a2903002108200041186a29030021092000290340210a2000290320210b2000290300210c41c000200041e0026a102420002802e0022120200041e0026a41186a22212009370300200020083703f002200020073703e8022000200c3703e0022020200041e0026a102220212006370300200020053703f002200020043703e8022000200b3703e002202041206a200041e0026a102220212003370300200020023703f002200020013703e8022000200a3703e002202041c0006a200041e0026a1022202041e000102920004180036a24000b9f0a01037f230041c0046b222d2400202d41206a200d200e200f2010201120122013201420152016201720182019201a201b201c201d201e201f202020212022202320241077202d41e0036a41186a42bc8be38eeadb88d3c500370300202d42a5d7c98092aab3f2773703f003202d42e69aace283adc3f63e3703e803202d42c0d483caa5d2ddd1113703e003202d41d8006a2903002121202d41d0006a2903002120202d41c8006a290300211f202d41206a41186a290300211e202d41206a41106a290300211d202d41206a41086a290300211c202d290340211b202d290320211a202d41e0036a202d41c0036a1027202d202d2903c003202d41c0036a41086a290300202d41c0036a41106a290300202d41c0036a41186a290300200d200e200f20102011201220132014106e202d41186a2903002119202d41106a2903002124202d41086a2903002123202d2903002122202d41a0036a1019202d202d2900a0033700e002202d202d2900a8033700e802202d202d2900b0033700f002202d202d2900b8033700f802202d41e0026a202d4180036a1015200d200e200f2010202d29038003202d4180036a41086a290300202d4180036a41106a290300202d4180036a41186a2903002022202320242019201a201c201d201e106f202d41c0026a1019202d202d2900c00237008002202d202d2900c80237008802202d202d2900d00237009002202d202d2900d80237009802202d4180026a202d41a0026a10152011201220132014202d2903a002202d41a0026a41086a290300202d41a0026a41106a290300202d41a0026a41186a2903002022202320242019201b201f20202021106f41c000202d41a0046a1024202d41a0046a41186a222e2903002112202d41a0046a41106a2903002111202d41a0046a41086a2903002110202d2903a0042114202e4200370300202d42003703b004202d42003703a804202d42c2f089d3063703a004202d41a0046a41e001202d4180046a1037202d41e0016a41186a202d4180046a41186a290300370300202d202d4180046a41106a2903003703f001202d202d4180046a41086a2903003703e801202d202d290380043703e0012014a7222f202d41e0016a1022202e4200370300202d202742ffffffff0f833703b004202d20263703a804202d20253703a004202f41046a202d41a0046a1022102e2113202d41c0016a41186a4200370300202d202442ffffffff0f833703d001202d20233703c801202d20223703c001202d41c0016a202d41a0016a1016202d41e0006a41186a4200370300202d4200370370202d4200370368202d4200370360202d202d2900a00137008001202d202d2900a80137008801202d202d2900b00137009001202d202d2900b80137009801024002402013202d4180016a202d41e0006a202f4124202f4120102c0d0041c000202d41a0046a1024202d2802a004222f41001030102b202f1030101d0c010b0240024010304120490d002014201020112012422042004200420010420c010b20142010201120121030222ead4200420042001042202e411f4b0d0041004100101d0b202f202d41a0046a1024202d41b8046a2903002111202d41b0046a2903002112202d41a8046a2903002113202d2903a00421140b200020143703402000201b3703202000201a370300200041c8006a2013370300200041286a201f3703002000201c370308200041d0006a2012370300200041306a20203703002000201d370310200041d8006a2011370300200041386a2021370300200041186a201e370300202d41c0046a24000bf70506027f027e017f017e017f147e23004180016b220024000240101841c3014b0d0041004100101d0b4104200041e0006a1017200041e8006a220129030021022000290360210302404100200041f0006a22042903002205428080808010544100200041f8006a22062903002207501b200542808080801085200784501b0d0041004100101d0b4124200041e0006a101720062903002108200429030021092001290300210a2000290360210b41c400200041e0006a10172006290300210c2004290300210d2001290300210e2000290360210f41e400200041e0006a101720062903002110200429030021112001290300211220002903602113418401200041e0006a10172001290300211420002903602115024041002004290300221642808080801054410020062903002217501b201642808080801085201784501b0d0041004100101d0b41a401200041e0006a1017200041e0006a41186a22042903002118200041e0006a41106a2903002119200041e0006a41086a290300211a2000290360102f5a4101201a501b41012019201884501bad420042004200103b20002005200520052005200520052005200520052005200520052003200220052007200b200a20092008200f200e200d200c2013201220112010201520142016201720052005200520051067200041c8006a2903002105200041d0006a2903002107200041d8006a2903002116200041286a2903002117200041306a2903002102200041386a2903002103200041086a2903002108200041106a2903002109200041186a290300210a2000290340210b2000290320210c2000290300210d41c000200041e0006a1024200028026021012004200a37030020002009370370200020083703682000200d3703602001200041e0006a10222004200337030020002002370370200020173703682000200c370360200141206a200041e0006a10222004201637030020002007370370200020053703682000200b370360200141c0006a200041e0006a1022200141e000102920004180016a24000bbd2103027f047e227f23004180056b222524002025222641a0046a41186a42ebebe4fcb28587a751370300202642dea0e0bdc4f6b08d6a3703b004202642b1f48ed6d0a7eb857e3703a804202642bfa3ffbd899593d51a3703a004202641a0046a20264180046a102720264180046a41186a290300212720264180046a41106a290300212820264180046a41086a2903002129202629038004212a202641e0036a101b202641206a200d200e200f2010202a202920282027201120122013201420262903e003202641e0036a41086a290300202641e0036a41106a290300202641e0036a41186a29030020152016201720182019201a201b201c1077202641c0036a41186a42bc8be38eeadb88d3c500370300202642a5d7c98092aab3f2773703d003202642e69aace283adc3f63e3703c803202642c0d483caa5d2ddd1113703c003202641d8006a290300211c202641d0006a290300211b202641c8006a290300211a202641206a41186a2903002116202641206a41106a2903002115202641206a41086a29030021142026290340211920262903202113202641c0036a202641a0036a102720264180036a41186a42ebebe4fcb28587a751370300202642dea0e0bdc4f6b08d6a37039003202642b1f48ed6d0a7eb857e37038803202642bfa3ffbd899593d51a37038003202641a0036a41186a2903002118202641a0036a41106a2903002117202641a0036a41086a290300211220262903a003211120264180036a202641e0026a102720262011201220172018200d200e200f201020262903e002202641e0026a41086a290300202641e0026a41106a290300202641e0026a41186a290300106e202641186a2903002111202641106a2903002112202641086a290300211820262903002117202641c0026a1019202620262900c00237008002202620262900c80237008802202620262900d00237009002202620262900d8023700980220264180026a202641a0026a1015200d200e200f201020262903a002202641a0026a41086a290300202641a0026a41106a290300202641a0026a41186a29030020172018201220112013201420152016106f202641e0016a41186a42ebebe4fcb28587a751370300202642dea0e0bdc4f6b08d6a3703f001202642b1f48ed6d0a7eb857e3703e801202642bfa3ffbd899593d51a3703e001202641e0016a202641c0016a1027202641a0016a41186a42003703002026202641c0016a41106a350200220f3703b0012026202641c0016a41086a290300220e3703a801202620262903c001220d3703a001202641a0016a20264180016a101620262026290080013700602026202629008801370068202620262900900137007020262026290098013700780240202641e0006a10350d0041004100101d0b41c000202641e0046a1024202641e0046a41086a2903002111202641e0046a41106a2903002127202641e0046a41186a222b290300212820262903e0042110202541606a2225222c2400202541186a2028370300202520273703102025201137030820252010370300202b4200370300202642003703f004202642003703e804202642b09b8c870d3703e004202641e0046a41e001202641c0046a1037202641c0046a41086a2903002111202641c0046a41106a2903002127202641c0046a41186a290300212820262903c0042129202c41606a222b222c2400202b41186a2028370300202b2027370310202b2011370308202b20293703002010a7222d202b1022102e2110202c41606a222b222c2400202b41186a4200370300202b200f370310202b200e370308202b200d370300202c41606a222c222e2400202b202c1016202c290000210f202c290008210e202c290010210d202c2900182111202e41606a222b222c2400202b2011370018202b200d370010202b200e370008202b200f370000202c41606a222c222e2400202c41186a201c370300202c201b370310202c201a370308202c2019370300024002402010202b202c202d4104202d4100102c0d0041c000202641e0046a102420262802e004222541001030102b20251030101d0c010b10301a2025290300202541086a290300202541106a290300202541186a290300420042004200420010420b202e41606a2225222b2400202541186a42ebebe4fcb28587a751370300202542dea0e0bdc4f6b08d6a370310202542b1f48ed6d0a7eb857e370308202542bfa3ffbd899593d51a370300202b41606a222b222d24002025202b1027202b290300210f202b41086a290300210e202b41106a350200210d41c000202641e0046a1024202641e0046a41086a2903002111202641e0046a41106a2903002127202641e0046a41186a222c290300212820262903e0042110202d41606a2225222b2400202541186a2028370300202520273703102025201137030820252010370300202c4200370300202642003703f004202642003703e804202642bbb996c80a3703e004202641e0046a41e001202641c0046a1037202641c0046a41086a2903002111202641c0046a41106a2903002127202641c0046a41186a290300212820262903c0042129202b41606a222b222e2400202b41186a2028370300202b2027370310202b2011370308202b20293703002010a7222d202b1022202c42003703002026201242ffffffff0f8322123703f004202620183703e804202620173703e004202d41046a202641e0046a1022202c201c3703002026201b3703f0042026201a3703e804202620193703e004202d41246a202641e0046a1022102e2110202e41606a222b222c2400202b41186a4200370300202b200d370310202b200e370308202b200f370300202c41606a222c222e2400202b202c1016202c290000210f202c290008210e202c290010210d202c2900182111202e41606a222b222c2400202b2011370018202b200d370010202b200e370008202b200f370000202c41606a222c222e2400202c41186a4200370300202c4200370310202c4200370308202c42003703000240024002402010202b202c202d41c400202d4120102c0d0041c000202641e0046a102420262802e004222541001030102b20251030101d0c010b0240024010304120490d0020252903002210202541086a290300202541106a290300202541186a290300422042004200420010422010a721250c010b1030212b20252903002210202541086a290300202541106a290300202541186a290300202bad42004200420010422010a72125202b411f4b0d0041004100101d0b2025202641e0046a1024024020262903e00422102010202641f0046a290300220f84202641e8046a290300202641f8046a290300842210844200522225ad85200f84201084500d0041004100101d0b20250d010b202641e0046a41186a428080808090ee9ea4ce00370300202642003703f004202642003703e804202642003703e0044100202641e0046a1022202641c0046a41186a4200370300202642003703d004202642003703c804202642013703c0044104202641c0046a102241004124101d0b41c000202641e0046a1024202641e0046a41086a290300210f202641e0046a41106a290300210e202641e0046a41186a222c290300210d20262903e0042110202e41606a2225222b2400202541186a200d3703002025200e3703102025200f37030820252010370300202c4200370300202642003703f004202642003703e804202642c2f089d3063703e004202641e0046a41e001202641c0046a1037202641c0046a41086a290300210f202641c0046a41106a290300210e202641c0046a41186a290300210d20262903c0042111202b41606a222b222e2400202b41186a200d370300202b200e370310202b200f370308202b20113703002010a7222d202b1022202c42003703002026201f42ffffffff0f833703f0042026201e3703e8042026201d3703e004202d41046a202641e0046a1022102e2110202e41606a222b222c2400202b41186a4200370300202b2012370310202b2018370308202b2017370300202c41606a222c222e2400202b202c1016202c290000210f202c290008210e202c290010210d202c2900182118202e41606a222b222c2400202b2018370018202b200d370010202b200e370008202b200f370000202c41606a222c222e2400202c41186a4200370300202c4200370310202c4200370308202c4200370300024002402010202b202c202d4124202d4120102c0d0041c000202641e0046a102420262802e004222541001030102b20251030101d0c010b0240024010304120490d0020252903002210202541086a290300202541106a290300202541186a290300422042004200420010422010a721250c010b1030212b20252903002210202541086a290300202541106a290300202541186a290300202bad42004200420010422010a72125202b411f4b0d0041004100101d0b2025202641e0046a1024202641f8046a2903002117202641f0046a2903002118202641e8046a290300210d20262903e004210e0b202e41606a2225222b24002025101b02402025290300201956202541086a2903002210201a562010201a511b202541106a290300220f201b56202541186a2903002210201c562010201c511b200f201b852010201c8584501b450d00202b41606a2225222b24002025101920252d001f212c20252d001e212d20252d001d212e20252d001c212f20252d001b213020252d001a213120252d0019213220252d0018213320252d0017213420252d0016213520252d0015213620252d0014213720252d0013213820252d0012213920252d0011213a20252d0010213b20252d000f213c20252d000e213d20252d000d213e20252d000c213f20252d000b214020252d000a214120252d0009214220252d0008214320252d0007214420252d0006214520252d0005214620252d0004214720252d0003214820252d0002214920252d0001214a20252d0000214b202b41606a2225222b24002025101b02402025290300221120195a202541086a2903002210201a5a2010201a51224c1b202541106a290300220f201b5a202541186a2903002212201c5a2012201c511b200f201b852012201c8584501b0d00202641e0046a41186a428080808090ee9ea4ce00370300202642003703f004202642003703e804202642003703e0044100202641e0046a1022202641c0046a41186a4200370300202642003703d004202642003703c804202642113703c0044104202641c0046a102241004124101d0b202b41606a222b22252400202541606a222524002025202c3a001f2025202d3a001e2025202e3a001d2025202f3a001c202520303a001b202520313a001a202520323a0019202520333a0018202520343a0017202520353a0016202520363a0015202520373a0014202520383a0013202520393a00122025203a3a00112025203b3a00102025203c3a000f2025203d3a000e2025203e3a000d2025203f3a000c202520403a000b202520413a000a202520423a0009202520433a0008202520443a0007202520453a0006202520463a0005202520473a0004202520483a0003202520493a00022025204a3a00012025204b3a00002025202b1015202b290300202b41086a290300202b41106a290300202b41186a290300201120197d2010201a7d20112019542225ad7d200f201b7d221120252010201a54204c1bad22107d2012201c7d200f201b54ad7d2011201054ad7d106b0b2000200e3703402000201937032020002013370300200041c8006a200d370300200041286a201a37030020002014370308200041d0006a2018370300200041306a201b37030020002015370310200041d8006a2017370300200041386a201c370300200041186a201637030020264180056a24000b980706017f147e037f017e017f037e23004180026b2200240042002101200041206a42044200420042001018ad420042004200105220004198016a290300210220004190016a290300210320004188016a2903002104200041f8006a2903002105200041f0006a2903002106200041e8006a2903002107200041d8006a2903002108200041d0006a2903002109200041c8006a290300210a200041206a41186a290300210b200041206a41106a290300210c200041206a41086a290300210d200041b8016a290300210e200041b0016a290300210f200041a8016a2903002110200029038001211120002903602112200029034021132000290320211420002903a001102f5a41012010501b4101200f200e84501bad420042004200103b200020022002200220022014200d200c200b2013200a200920082012200720062005201120042003200220022002200220021069200041186a2903002113200041106a290300210b200041086a290300210c2000290300210341c000200041e0016a1024200041e0016a41186a22152903002106200041e0016a41106a22162903002104200041e0016a41086a2217290300210520002903e0012118200041c0016a41186a4200370300200042003703d001200042003703c801200042203703c0012018a72219200041c0016a10222003a7200041e0016a1024201729030021112016290300211220002903e001211a201520152903002209370300200020123703f001200020113703e8012000201a3703e001201941206a200041e0016a1022201842c0007c210202400240201a20128420112009848450450d002002210a0c010b200620042002201854221520052015ad7c220d200554200220185a1bad7c220e200454ad7c21144200210f42002110420021040340200342207c2205a7200041e0016a10242002a7200041e0016a10222010200142017c22062001542215200f2015ad7c2207200f54200620015a1bad7c220820105421152014200e200242207c220a2002542216200d2016ad7c2201200d54200a20025a1bad7c220f200e54ad7c21142013200b20052003542216200c2016ad7c221b200c54200520035a1bad7c221c200b54ad7c2113200a21022001210d200f210e200621012007210f2008211020052103201b210c201c210b2006201a54200720115420072011511b200820125420042015ad7c220420095420042009511b2008201285200420098584501b0d000b0b2019200a20187da7102920004180026a24000bea280b027f017e027f027e017f017e017f017e047f0a7e1c7f230041e0016b2219211a201924000240200d200f84200e20108484221b4200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2009a7221c201a41c0016a1017201a41c0016a41086a221d290300211e201a2903c001211f02404100201a41c0016a41106a22202903002221428080808010544100201a41c0016a41186a22222903002223501b202142808080801085202384501b0d0041004100101d0b201941606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a2224222524002019202410272024290300201f85202441106a350200202142ffffffff0f838584202441086a290300201e858450ad420042004200106c202541606a221922242400201941186a42bc8be38eeadb88d3c500370300201942a5d7c98092aab3f277370310201942e69aace283adc3f63e370308201942c0d483caa5d2ddd111370300202441606a222422262400201920241027202441186a2903002121202441106a290300211e202441086a290300211f20242903002123201a41e0006a2009200a200b200c200d200e200f20101018ad4200420042001043201a41c0006a2023201f201e20212005200620072008201a290360201a41e0006a41086a290300201a41e0006a41106a290300201a41e0006a41186a2903001047201a41c0006a41186a2903002108201a41c0006a41106a2903002107201a41c0006a41086a2903002106201a2903402205a72225201a41c0016a10240240201a2903c001202029030084201d290300202229030084844200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b202541206a2220201a41c0016a1024201a41c0016a41086a2222290300211e201a41c0016a41106a2227290300211f201a41c0016a41186a221d2903002121201a2903c0012123202641606a2219222424002019101b2023201929030058201e201941086a290300222358201e2023511b201f201941106a2903002223582021201941186a290300221e582021201e511b201f2023852021201e8584501bad4200420042001071202441606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a222422262400201920241027202441086a29030021212024290300211e202441106a350200211f2025201a41c0016a10240240201a2903c0012027290300842022290300201d29030084844200520d00201d428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2020201a41c0016a1024201d2903002128202729030021292022290300212a201a2903c001212b202641606a221922242400201941186a42003703002019201f370310201920213703082019201e370300202441606a2224221d2400201920241016202429000021232024290008212c2024290010212d2024290018212e201d41606a2219222424002019202e3700182019202d3700102019202c370008201920233700000240201910350d0041004100101d0b41c000201a41c0016a1024201a41c0016a41086a290300212c201a41c0016a41106a290300212d201a41c0016a41186a221d290300212e201a2903c0012123202441606a221922242400201941186a2226202e3703002019202d3703102019202c37030820192023370300201d4200370300201a42003703d001201a42003703c801201a42b09b8c870d3703c001201a41c0016a41e001201a41a0016a1037201a41a0016a41086a290300212c201a41a0016a41106a290300212d201a41a0016a41186a290300212e201a2903a001212f202441606a2224221d2400202441186a202e3703002024202d3703102024202c3703082024202f3703002023a7222220241022102e2123201d41606a2224221d2400202441186a42003703002024201f370310202420213703082024201e370300201d41606a221d222724002024201d1016201d2900002121201d290008211e201d290010211f201d290018212c202741606a2224221d24002024202c3700182024201f3700102024201e37000820242021370000201d41606a221d22272400201d41186a2028370300201d2029370310201d202a370308201d202b3703000240024020232024201d2022410420224100102c0d0041c000201a41c0016a1024201a2802c001221941001030102b20191030101d0c010b10301a2019290300201941086a290300201941106a2903002026290300420042004200420010420b202741606a221922242400201941186a42ebebe4fcb28587a751370300201942dea0e0bdc4f6b08d6a370310201942b1f48ed6d0a7eb857e370308201942bfa3ffbd899593d51a370300202441606a2224221d2400201920241027202441086a290300212820242903002129202441106a350200212a201d41606a221922242400201941186a42bc8be38eeadb88d3c500370300201942a5d7c98092aab3f277370310201942e69aace283adc3f63e370308201942c0d483caa5d2ddd111370300202441606a222422222400201920241027202441186a290300212b202441106a290300212c202441086a290300212d2024290300212e0240201b4200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b201c201a41c0016a1017201a41c0016a41086a290300211b201a2903c001212f02404100201a41c0016a41106a2903002221428080808010544100201a41c0016a41186a290300221e501b202142808080801085201e84501b0d0041004100101d0b0240200d420156200e420052200e501b200f42005220104200522010501b200f201084501b0d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b201c41206a201a41c0016a1017201a41c0016a41086a22192903002130201a2903c001213102404100201a41c0016a41106a2224290300221f428080808010544100201a41d8016a221d2903002223501b201f42808080801085202384501b0d0041004100101d0b201a41206a202e202d202c202b202f201b2021201e20312030201f2023106e201a41206a41106a290300211e201a41206a41086a290300211f201a29032021232025201a41c0016a10240240201a2903c0012024290300842019290300201d29030084844200520d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2020201a41c0016a102441c000201a41a0016a1024201a41a0016a41086a290300211b201a41a0016a41106a290300212b201a41a0016a41186a221d290300212c201a2903a0012121202241606a221922242400201941186a202c3703002019202b3703102019201b37030820192021370300201d4200370300201a42003703b001201a42003703a801201a42bbb996c80a3703a001201a41a0016a41e001201a4180016a1037201a4180016a41086a290300211b201a4180016a41106a290300212b201a4180016a41186a290300212c201a29038001212d202441606a222422222400202441186a202c3703002024202b3703102024201b3703082024202d3703002021a7221c20241022201d4200370300201a201e42ffffffff0f833703b001201a201f3703a801201a20233703a001201c41046a201a41a0016a1022201c41246a201a41c0016a1022102e2121202241606a2224221d2400202441186a42003703002024202a3703102024202837030820242029370300201d41606a221d222224002024201d1016201d290000211e201d290008211f201d2900102123201d290018211b202241606a2224221d24002024201b370018202420233700102024201f3700082024201e370000201d41606a221d22222400201d41186a4200370300201d4200370310201d4200370308201d420037030002400240024020212024201d201c41c400201c4120102c0d0041c000201a41c0016a1024201a2802c001221941001030102b20191030101d0c010b0240024010304120490d0020192903002221201941086a290300201941106a290300201941186a290300422042004200420010422021a721190c010b1030212420192903002221201941086a290300201941106a290300201941186a2903002024ad42004200420010422021a721192024411f4b0d0041004100101d0b2019201a41c0016a10240240201a2903c00122212021201a41d0016a290300221e84201a41c8016a290300201a41d8016a290300842221844200522219ad85201e84202184500d0041004100101d0b20190d010b201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42013703a0014104201a41a0016a102241004124101d0b201a2009200a200b200c200d200e200f20101018ad42004200420010432005200620072008201a290300201a41086a290300201a41106a290300201a41186a29030020112012201320141070202241606a2219221c24002019101b201941186a2903002110201941106a290300210e201941086a290300210f2019290300210d2025201a41c0016a10240240201a2903c001201a41c0016a41106a222429030084201a41c0016a41086a221d290300201a41c0016a41186a221929030084844200520d002019428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2020201a41c0016a10240240200d201a2903c00156200f201d290300220d56200f200d511b200e2024290300220d5620102019290300220f562010200f511b200e200d852010200f8584501b450d00201c41606a2219222424002019101920192d001f211d20192d001e211c20192d001d212220192d001c212720192d001b212620192d001a213220192d0019213320192d0018213420192d0017213520192d0016213620192d0015213720192d0014213820192d0013213920192d0012213a20192d0011213b20192d0010213c20192d000f213d20192d000e213e20192d000d213f20192d000c214020192d000b214120192d000a214220192d0009214320192d0008214420192d0007214520192d0006214620192d0005214720192d0004214820192d0003214920192d0002214a20192d0001214b20192d0000214c202441606a2219222424002019101b201941186a2903002110201941106a290300210e201941086a290300210f2019290300210d2025201a41c0016a10240240201a2903c001201a41c0016a41106a222529030084201a41c0016a41086a224d290300201a41c0016a41186a221929030084844200520d002019428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42323703a0014104201a41a0016a102241004124101d0b2020201a41c0016a10240240200d201a2903c001220b5a200f204d29030022095a200f20095122201b200e202529030022215a20102019290300220c5a2010200c511b200e2021852010200c8584501b0d00201a41c0016a41186a428080808090ee9ea4ce00370300201a42003703d001201a42003703c801201a42003703c0014100201a41c0016a1022201a41a0016a41186a4200370300201a42003703b001201a42003703a801201a42113703a0014104201a41a0016a102241004124101d0b202441606a222422192400201941606a221924002019201d3a001f2019201c3a001e201920223a001d201920273a001c201920263a001b201920323a001a201920333a0019201920343a0018201920353a0017201920363a0016201920373a0015201920383a0014201920393a00132019203a3a00122019203b3a00112019203c3a00102019203d3a000f2019203e3a000e2019203f3a000d201920403a000c201920413a000b201920423a000a201920433a0009201920443a0008201920453a0007201920463a0006201920473a0005201920483a0004201920493a00032019204a3a00022019204b3a00012019204c3a00002019202410152024290300202441086a290300202441106a290300202441186a290300200d200b7d200f20097d200d200b542219ad7d200e20217d220d2019200f20095420201bad220f7d2010200c7d200e202154ad7d200d200f54ad7d106b0b200020053703002000200637030820002007370310200041186a2008370300201a41e0016a24000bc00603027f047e037f230041c0026b220c2400200c41a0026a41186a220d4200370300200c42003703b002200c42003703a802200c42bbb996c80a3703a002200c41a0026a41e001200c4180026a1037200c35029c02210e41c000200c41a0026a1024200c41e0016a41186a200e422086370300200c42003703f001200c42003703e801200c42003703e001200d290300210e200c41b0026a290300210f200c41a8026a2903002110200c2903a0022211a7221241206a2213200c41e0016a1022200d4200370300200c200642ffffffff0f833703b002200c20053703a802200c20043703a002201241246a200c41a0026a1022200d200b370300200c200a3703b002200c20093703a802200c20083703a002201241c4006a200c41a0026a1022200c41c0016a41186a4200370300200c42003703d001200c42003703c801200c42c4003703c0012012200c41c0016a102220112010200f200e42e40042004200420010422012200c41a0016a1024200c2802a001210d102e2106200c4180016a41186a2003370300200c200237039001200c200137038801200c200037038001200c4180016a200c41e0006a1016200c41206a41186a4200370300200c4200370330200c4200370328200c4200370320200c200c290060370040200c200c290068370048200c200c290070370050200c200c290078370058410021122006200c41c0006a200c41206a2013200d41004100102c21130240024010300d0041e000210d0c010b200c1030ad4200420042001079200c280200220d41206a41001030102b0b02402013450d00200d200c41a0026a10240240200c2903a002200c41b0026a221229030084200c41a8026a2213290300200c41b8026a221429030084844200520d00410121120c010b200d200c41a0026a10240240200c2903a002421f56201329030022064200522006501b20122903002205420052201429030022064200552006501b2005200684501b0d0041004100101d0b200d41206a200c41a0026a10240240200c2903a00222062006200c41b0026a290300220584200c41a8026a290300200c41b8026a29030084220484420052ad85200584200484500d0041004100101d0b2006a721120b2012ad420042004200107a200c41c0026a24000b9a0202037f017e230041e0016b22082400200841206a420042004200420010792008280220220941206a220a1018410010312009200841c0016a102420082802c0012109102e210b200841a0016a41186a2003370300200820023703b001200820013703a801200820003703a001200841a0016a20084180016a1016200841c0006a41186a20073703002008200637035020082005370348200820043703402008200829008001370060200820082900880137006820082008290090013700702008200829009801370078200b200841e0006a200841c0006a200a200941004100102c210902401030450d0020081030ad4200420042001079200828020041206a41001030102b0b2009ad420042004200107b200841e0016a24000b9e0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005421d370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542bae495a3d7ee9ba932370330200542c492b18ae4cad3a420370328200542808080c0c4aa90a8df00370320200641c4006a200541206a1022200641e400101d0b200541c0006a24000bc10201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a2204420037030020054200370350200542003703482005422b370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42cf9a85fac5aa95a8d40037030020054280808080808095a7d5003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000b9e0c09017f037e017f017e027f047e017f047e037f230041e0016b220d24002005200985200742ffffffff0f83220e200b42ffffffff0f83220f852210842006200a8584420052ad42004200420010752005200920052009542006200a542006200a511b200e200f542010501b22111b220f2007200b20111b42ffffffff0f832210842006200a20111b221284420052ad420042004200107641c000200d221341c0016a1024201341c0016a41186a22142903002115201341c0016a41106a2903002116201341c0016a41086a290300211720132903c001210e20144200370300201342003703d001201342003703c801201342bdfe90a7023703c001201341c0016a41e001201341a0016a1037201341e0006a41186a201341a0016a41186a2903003703002013201341a0016a41106a2903003703702013201341a0016a41086a290300370368201320132903a001370360200ea72214201341e0006a1022102e2118201341c0006a41186a42003703002013200342ffffffff0f8322033703502013200237034820132001370340201341c0006a201341206a10162013201329002037000020132013290028370008201320132900303700102013201329003837001802400240201820132014410420144120102d0d0041c000201341c0016a102420132802c001221441001030102b20141030101d0c010b0240024010304120490d00200e201720162015422042004200420010420c010b200e20172016201510302219ad42004200420010422019411f4b0d0041004100101d0b2014201341c0016a1024201341d8016a290300211a201341d0016a290300211b201341c8016a290300211c20132903c001211d0b201341c0016a41186a22144200370300201342003703d001201342003703c801201342ff013703c001201341c0016a41f801201341a0016a103720133100bf01211841c000201341c0016a102420142903002115201341c0016a41106a221e2903002116201341c0016a41086a221f290300211720132903c001210e20144200370300201320103703d001201320123703c8012013200f3703c001201341c0016a41e000201341a0016a1037200ea7221941206a2220201341a0016a1022201442003703002013200b200720111b42ffffffff0f833703d0012013200a200620111b3703c80120132009200520111b3703c001201341c0016a41e000201341a0016a1037201941346a201341a0016a1022200d41606a2211220d2400201141186a4200370300201142003703102011420037030820114228370300201920111022200e20172016201542c80042004200420010422019201341c0016a102420132802c0012119200d41606a2211220d240020202019201110282011290000210620112900082109201129001021052011290018210b41c000201341c0016a102420142903002107201e290300210e201f290300210f20132903c001210a200d41606a2211221924002011200b3700182011200537001020112009370008201120063700002011201341c0016a1015201341a0016a41186a220d2018423886370300201342003703b001201342003703a801201342003703a001200aa7221141206a221e201341a0016a1022200d4200370300201320033703b001201320023703a801201320013703a001201341a0016a41e00020134180016a1037201141216a20134180016a1022201141356a201341c0016a10222014201a3703002013201b3703d0012013201c3703c8012013201d3703c001201141d5006a201341c0016a1022201941606a221422192400201441186a42003703002014420037031020144200370308201442d500370300201120141022200a200f200e200742f50042004200420010422011201341c0016a102420132802c0012114201941606a221122192400201e2014201110282011290000210a201129000821062011290010210920112900182105201941606a221124002011200537001820112009370010201120063700082011200a3700002011201341c0016a1015201341c0016a4100201341a0016a1038201341a0016a41086a290300210a20132903a00121062000201341a0016a41106a3502003703102000200a37030820002006370300200041186a4200370300201341e0016a24000bf50603027f047e037f230041c0026b22102400201041a0026a41186a22114200370300201042003703b002201042003703a802201042dde5e19d023703a002201041a0026a41e00120104180026a1037201035029c02211241c000201041a0026a1024201041e0016a41186a2012422086370300201042003703f001201042003703e801201042003703e00120112903002112201041b0026a2903002113201041a8026a290300211420102903a0022215a7221641206a2217201041e0016a1022201142003703002010200642ffffffff0f833703b002201020053703a802201020043703a002201641246a201041a0026a1022201142003703002010200a42ffffffff0f833703b002201020093703a802201020083703a002201641c4006a201041a0026a10222011200f3703002010200e3703b0022010200d3703a8022010200c3703a002201641e4006a201041a0026a1022201041c0016a41186a4200370300201042003703d001201042003703c801201042e4003703c0012016201041c0016a1022201520142013201242840142004200420010422016201041a0016a102420102802a0012111102e210620104180016a41186a200337030020102002370390012010200137038801201020003703800120104180016a201041e0006a1016201041206a41186a420037030020104200370330201042003703282010420037032020102010290060370040201020102900683700482010201029007037005020102010290078370058410021162006201041c0006a201041206a2017201141004100102c21170240024010300d0041e00021110c010b20101030ad42004200420010792010280200221141206a41001030102b0b02402017450d002011201041a0026a1024024020102903a002201041b0026a221629030084201041a8026a2217290300201041b8026a221829030084844200520d00410121160c010b2011201041a0026a1024024020102903a002421f56201729030022064200522006501b20162903002205420052201829030022064200552006501b2005200684501b0d0041004100101d0b201141206a201041a0026a1024024020102903a00222062006201041b0026a290300220584201041a8026a290300201041b8026a29030084220484420052ad85200584200484500d0041004100101d0b2006a721160b2016ad420042004200108001201041c0026a24000b921b09017f027e067f077e017f077e037f0a7e057f230041a0016b220c2400200042207c210d200442207c210e2000a7210f2004a72110200c22114180016a41186a211220114180016a41086a211320114180016a41106a2114420021154200210442002116420021000340201020114180016a1024024020112903800122172014290300221884201329030022192012290300221a84844200520d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142113703604104201141e0006a102241004124101d0b0240024020152017427f7c221b5420042019201b201754221cad7c427f7c22175420042017511b20162018427f7c221b201c201720195420172019511bad7c2219542000201a201b201854ad7c2019201b54ad7c427f7c22175420002017511b2016201985200020178584501b450d00201020114180016a102402402011290380012015562013290300221920045620192004511b201429030022172016562012290300221920005620192000511b2017201685201920008584501b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142323703604104201141e0006a102241004124101d0b2015420586200e7ca720114180016a1024201329030021192014350200211d2011290380012117201020114180016a10240240201129038001201542017c221e56201329030022182004201e201554221cad7c221f562018201f511b2014290300221b2016201c201f200454201e20155a1bad7c2220562012290300221820002020201654ad7c221a562018201a511b201b2020852018201a8584501b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142323703604104201141e0006a102241004124101d0b201e4205862221200e7ca720114180016a10242017201129038001221885201d201435020022228522238420192013290300221b8584420052ad42004200420010752017201820172018541b201720182019201b5422241b2019201b5122251b20172018201d202254221c1b20235022261b201d2022201c1b842019201b20241b2019201b201c1b20261b84420052ad4200420042001076200f20114180016a10240240201129038001201e5620132903002223201f562023201f511b2014290300222720205620122903002223201a562023201a511b20272020852023201a8584501b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142323703604104201141e0006a102241004124101d0b200d20217ca720114180016a102420132903002128201429030021292012290300212a201129038001212b201020114180016a102420172018562019201b5620251b211c201d20225621240240201129038001222c420156201329030022234200522023501b20142903002221420052201229030022274200522027501b2021202784501b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142113703604104201141e0006a102241004124101d0b201c202420261b211c2008212d2009212e200a212f2015202c427e7c223054200420232030202c542226ad7c427f7c222c542004202c511b20162021427f7c22302026202c202354202c2023511bad7c222354200020272030202154ad7c2023203054ad7c427f7c22215420002021511b2016202385200020218584501b450d01200c41606a222622242400202641186a42bc8be38eeadb88d3c500370300202642a5d7c98092aab3f277370310202642e69aace283adc3f63e370308202642c0d483caa5d2ddd111370300202441606a2224220c240020262024102720002016201542027c2223201554222620042026ad7c2227200454202320155a1bad7c222c201654ad7c2121202441186a2903002130202441106a290300212d202441086a290300212e2024290300212f02402015427e542004427f522004427f511b2016427f522000427f522000427f511b2016200083427f511b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142113703604104201141e0006a102241004124101d0b201020114180016a102402402011290380012023562013290300220020275620002027511b20142903002204202c562012290300220020215620002021511b2004202c85200020218584501b0d002012428080808090ee9ea4ce00370300201142003703900120114200370388012011420037038001410020114180016a1022201141e0006a41186a42003703002011420037037020114200370368201142323703604104201141e0006a102241004124101d0b2023420586200e7ca720114180016a1024201141c0006a202f202e202d20302018201b20224200201129038001201329030020143502004200106e201141c0006a41106a290300212f201141c0006a41086a290300212e2011290340212d0c010b201141a0016a24000f0b4200202a201c1b211542002029201c1b212342002028201c1b21214200202b201c1b2127202a4200201c1b212c20294200201c1b212920284200201c1b2128202b4200201c1b212a200c41606a221c22262400201c41186a42bc8be38eeadb88d3c500370300201c42a5d7c98092aab3f277370310201c42e69aace283adc3f63e370308201c42c0d483caa5d2ddd111370300202641606a222622242400201c20261027201141206a2026290300202641086a290300202641106a290300202641186a29030020172019201d42002018201b20224200106e201141206a41086a2903002100201141206a41106a350200210420112903202116202441606a221c22262400201c41186a220c4200370300201c2004370310201c2000370308201c20163703002011420042004200420010792011280200223141206a2232101841001031202641606a222622242400202641186a4200370300202620043703102026200037030820262016370300202441606a22242225240020262024101620242900002100202429000821042024290010211620242900182119202541606a222622242400202620193700182026201637001020262004370008202620003700000240202610350d0041004100101d0b41c00020114180016a10242013290300210420142903002116201229030021192011290380012100202441606a222422262400202441186a2233201937030020242016370310202420043703082024200037030020124200370300201142003703900120114200370388012011429f9bb0113703800120114180016a41e001201141e0006a1037201141e0006a41086a2903002104201141e0006a41106a2903002116201141e0006a41186a2234290300211920112903602117202641606a222522352400202541186a20193703002025201637031020252004370308202520173703002000a72226202510222012202c370300201120293703900120112028370388012011202a37038001202641046a20114180016a102220122015370300201120233703900120112021370388012011202737038001202641246a20114180016a1022201242003703002011202f42ffffffff0f83370390012011202e370388012011202d37038001202641c4006a20114180016a10222034420037030020114200370370201142003703682011428001370360202641e4006a201141e0006a1022203120114180016a1024201329030021162014290300211520112903800121042012201229030037030020112015370390012011201637038801201120043703800120264184016a20114180016a1022200042a4017c2200a720322004a72231102520124200370300201142003703900120114200370388012011420037038001200420007ca720114180016a1022102e2100201c41086a2903002104201c41106a2903002116200c2903002115201c2903002119203541606a221c22252400201c41186a2015370300201c2016370310201c2004370308201c2019370300202541606a2225220c2400201c2025101620252900002104202529000821162025290010211520252900182119200c41606a221c22252400201c2019370018201c2015370010201c2016370008201c2004370000202541606a2225220c2400202541186a4200370300202542003703102025420037030820254200370300024002402000201c202520262031411f6a41607141a4016a20264100102c0d0041c00020114180016a1024201128028001221c41001030102b201c1030101d0c010b10301a2024290300202441086a290300202441106a2903002033290300420042004200420010420b201e2115201f210420202116201a21000c000b0bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054227370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a4280a8b9aaf5a9d3a0df00370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bb52a10017f017e057f087e017f057e047f017e017f027e0b7f017e057f017e017f057e230041c0016b22082400200042207c21092000a7210a2008220b41a0016a41186a210c200b41a0016a41086a210d200b41a0016a41106a210e4200210f4200211042002111420021000340200a200b41a0016a10240240200b2903a0012212200e290300221384200d2903002214200c290300221584844200520d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a1022200b4180016a41186a4200370300200b420037039001200b420037038801200b4211370380014104200b4180016a102241004124101d0b024002400240200f2012427f7c2216542010201420162012542217ad7c427f7c22125420102012511b20112013427f7c22162017201220145420122014511bad7c221454200020152016201354ad7c2014201654ad7c427f7c22125420002012511b2011201485200020128584501b450d00200a200b41a0016a10240240200b2903a001200f56200d290300221420105620142010511b200e2903002212201156200c290300221420005620142000511b2012201185201420008584501b0d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a1022200b4180016a41186a4200370300200b420037039001200b420037038801200b4232370380014104200b4180016a102241004124101d0b200f42058620097ca7200b41a0016a1024200d2903002114200e3502002115200b2903a0012112200a200b41a0016a10240240200b2903a001200f42017c221856200d290300221320102018200f542217ad7c22195620132019511b200e29030022162011201720192010542018200f5a1bad7c221a56200c29030022132000201a201154ad7c221b562013201b511b2016201a852013201b8584501b0d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a1022200b4180016a41186a4200370300200b420037039001200b420037038801200b4232370380014104200b4180016a102241004124101d0b201842058620097ca7200b41a0016a1024200d2903002113200e350200211c200b2903a0012116200841606a2217221d2400201741186a4200370300201720153703102017201437030820172012370300201d41606a221e221f2400201e41186a22204200370300201e201c370310201e2013370308201e201637030020122016852015201c85222184201420138584420052ad42004200420010752012201620122016541b20122016201420135422221b20142013511b201220162015201c54221d1b20215022081b22212015201c201d1b2223842014201320221b20142013201d1b20081b222484420052ad4200420042001076201f41606a221d221f2400201d41186a4200370300201d2023370310201d2024370308201d2021370300201f41606a221f22222400201f41186a42bc8be38eeadb88d3c500370300201f42a5d7c98092aab3f277370310201f42e69aace283adc3f63e370308201f42c0d483caa5d2ddd111370300202241606a222222082400201f20221027200b41e0006a2022290300202241086a290300202241106a290300202241186a290300201220142015420020162013201c4200106e200b41e0006a41086a2903002114200b41e0006a41106a3502002112200b2903602113200841606a221f22222400201f41186a4200370300201f2012370310201f2014370308201f201337030041c000200b41a0016a1024200d2903002115200e290300211c200c2903002121200b2903a0012116202241606a222222082400202241186a222520213703002022201c3703102022201537030820222016370300200c4200370300200b42003703b001200b42003703a801200b42ace38bc8003703a001200b41a0016a41e001200b4180016a1037200b4180016a41086a22262903002115200b4180016a41106a2227290300211c200b4180016a41186a22282903002121200b290380012123200841606a220822292400200841186a20213703002008201c37031020082015370308200820233703002016a7222a20081022102e2116202941606a220822292400200841186a4200370300200820123703102008201437030820082013370300202941606a2229222b240020082029101620292900002114202929000821122029290010211320292900182115202b41606a220822292400200820153700182008201337001020082012370008200820143700000240024020162008202a4104202a41e000102d0d0041c000200b41a0016a1024200b2802a001222241001030102b20221030101d420021144200211c42002112420021210c010b02400240103041e000490d0020222903002214202241086a290300202241106a290300202529030042e00042004200420010422014a721220c010b1030210820222903002214202241086a290300202241106a29030020252903002008ad42004200420010422014a72122200841df004b0d0041004100101d0b2022200b41a0016a1024200b2903a00121120240200d290300222142808080808080c000544100200e290300200c29030084501b0d0041004100101d0b202241206a200b41a0016a1024200b2903a00121140240200d290300221c42808080808080c000544100200e290300200c29030084501b0d0041004100101d0b202241c0006a200b41a0016a1024200b2903a001428080808010544100200d290300501b4100200e290300200c29030084501b0d0041004100101d0b201d41106a222c3502002123201741106a222d3502002113201d41086a222e2903002124201741086a222f2903002116201d290300213020172903002115202941606a222222082400202241186a22314200370300202242003703102022202142ffffffffffff3f832221201c42ffffffffffff3f83221c20152030852013202385842016202485845022291b37030820222012201420291b370300200841606a2208222a2400200841186a22324200370300200842003703102008201c202120291b37030820082014201220291b370300201f41086a22332903002112201f41106a2234350200211c201f290300212141c000200b41a0016a1024200d2903002123200e2903002124200c2903002130200b2903a0012114202a41606a2229222a2400202941186a22352030370300202920243703102029202337030820292014370300200c4200370300200b42003703b001200b42003703a801200b42b1848285073703a001200b41a0016a41e001200b4180016a1037202629030021232027290300212420282903002130200b290380012136202a41606a222a222b2400202a41186a2030370300202a2024370310202a2023370308202a20363703002014a72225202a1022200c4200370300200b201c3703b001200b20123703a801200b20213703a001202541046a200b41a0016a1022102e2114202b41606a222a222b2400202a41186a4200370300202a2013370310202a2016370308202a2015370300202b41606a222b22372400202a202b1016202b2900002112202b2900082113202b2900102116202b2900182115203741606a222a222b2400202a2015370018202a2016370010202a2013370008202a201237000002402014202a2025412420254120102d0d0041c000200b41a0016a1024200b2802a001222941001030102b20291030101d20312903002116202241106a2903002112202241086a2903002114202229030021150c030b024010304120490d0020292903002214202941086a290300202941106a2903002035290300422042004200420010422014a721290c020b1030212a20292903002214202941086a290300202941106a2903002035290300202aad42004200420010422014a72129202a411f4b0d0141004100101d0c010b200b41c0016a24000f0b2029200b41a0016a1024200b2903a0012223202229030022155a200d2903002213202241086a29030022145a20132014511b200e290300221c202241106a29030022125a200c2903002221203129030022165a20212016511b201c201285202120168584501b0d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a102220284200370300200b420037039001200b420037038801200b4211370380014104200b4180016a102241004124101d0b200b41c0006a202320157d201320147d20232015542222ad7d201c20127d22232022201320145420132014511bad22137d202120167d201c201254ad7d2023201354ad7d20152014201220162008290300200841086a290300200841106a2903002032290300103d202d3502002114202c3502002112202f2903002121202e2903002123200b41c0006a41086a2903002113200b41c0006a41106a2903002116200b41c0006a41186a290300211520172903002124201d2903002130200b290340211c200a200b41a0016a1024203020248520122014858420232021858421230240200b2903a00122124202544100200d2903002214501b4100200e2903002221200c290300223884501b450d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a102220284200370300200b420037039001200b420037038801200b4211370380014104200b4180016a102241004124101d0b20235021172004212420052130200621360240200f2012427e7c222354201020142023201254221dad7c427f7c22125420102012511b20112021427f7c2223201d201220145420122014511bad7c221454200020382023202154ad7c2014202354ad7c427f7c22125420002012511b2011201485200020128584501b450d00202b41606a221d22222400201d41186a42bc8be38eeadb88d3c500370300201d42a5d7c98092aab3f277370310201d42e69aace283adc3f63e370308201d42c0d483caa5d2ddd111370300202241606a2222222b2400201d2022102720002011200f42027c2214200f54221d2010201dad7c22212010542014200f5a1bad7c2223201154ad7c211220202903002124201e41106a2903002130201e41086a2903002136202241186a2903002138202241106a2903002139202241086a290300213a2022290300213b201e290300213c0240200f427e542010427f522010427f511b2011427f522000427f522000427f511b2011200083427f511b0d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a102220284200370300200b420037039001200b420037038801200b4211370380014104200b4180016a102241004124101d0b200a200b41a0016a10240240200b2903a001201456200d290300220020215620002021511b200e2903002210202356200c290300220020125620002012511b2010202385200020128584501b0d00200c428080808090ee9ea4ce00370300200b42003703b001200b42003703a801200b42003703a0014100200b41a0016a102220284200370300200b420037039001200b420037038801200b4232370380014104200b4180016a102241004124101d0b201442058620097ca7200b41a0016a1024200b41206a203b203a20392038203c203620302024200b2903a001200d290300200e3502004200106e200b41206a41106a2903002136200b41206a41086a2903002130200b29032021240b2015420020171b210f2016420020171b21142013420020171b2112201c420020171b21214200201520171b21154200201620171b21164200201320171b21134200201c20171b211c2033290300210020343502002110201f2903002111202b41606a2217221d2400201741186a22084200370300201720103703102017200037030820172011370300200b42004200420042001079200b280200222941206a221e101841001031201d41606a221d221f2400201d41186a4200370300201d2010370310201d2000370308201d2011370300201f41606a221f22222400201d201f1016201f2900002100201f2900082110201f2900102111201f2900182123202241606a221d221f2400201d2023370018201d2011370010201d2010370008201d20003700000240201d10350d0041004100101d0b41c000200b41a0016a1024200d2903002110200e2903002111200c2903002123200b2903a0012100201f41606a221f221d2400201f41186a222b2023370300201f2011370310201f2010370308201f2000370300200c4200370300200b42003703b001200b42003703a801200b429f9bb0113703a001200b41a0016a41e001200b4180016a1037202629030021102027290300211120282903002123200b290380012138201d41606a2222222a2400202241186a20233703002022201137031020222010370308202220383703002000a7221d20221022200c2015370300200b20163703b001200b20133703a801200b201c3703a001201d41046a200b41a0016a1022200c200f370300200b20143703b001200b20123703a801200b20213703a001201d41246a200b41a0016a1022200c4200370300200b203642ffffffff0f833703b001200b20303703a801200b20243703a001201d41c4006a200b41a0016a102220284200370300200b420037039001200b420037038801200b42800137038001201d41e4006a200b4180016a10222029200b41a0016a1024200d2903002111200e290300210f200b2903a0012110200c200c290300370300200b200f3703b001200b20113703a801200b20103703a001201d4184016a200b41a0016a1022200042a4017c2200a7201e2010a722291025200c4200370300200b42003703b001200b42003703a801200b42003703a001201020007ca7200b41a0016a1022102e2100201741086a2903002110201741106a29030021112008290300210f20172903002114202a41606a221722222400201741186a200f370300201720113703102017201037030820172014370300202241606a22222208240020172022101620222900002110202229000821112022290010210f20222900182114200841606a221722222400201720143700182017200f3700102017201137000820172010370000202241606a222222082400202241186a420037030020224200370310202242003703082022420037030002400240200020172022201d2029411f6a41607141a4016a201d4100102c0d0041c000200b41a0016a1024200b2802a001221741001030102b20171030101d0c010b10301a201f290300201f41086a290300201f41106a290300202b290300420042004200420010420b2018210f20192110201a2111201b21000c000b0bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054226370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a428080d0f2d4ead3a6c100370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054226370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a428080d0f2d4ead3a6c100370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bb80201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054225370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a4280808098d5e8d4a9c500370300200542003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000b9e0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005421e370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542f9e48593a7ac9aa632370330200542c1bebd92d5c896903a3703282005428080cc9ad5c894a2c400370320200641c4006a200541206a1022200641e400101d0b200541c0006a24000b8d3408027f037e017f047e017f037e027f137e230041c0076b221924002019221a41e0066a41186a42bc8be38eeadb88d3c500370300201a42a5d7c98092aab3f2773703f006201a42e69aace283adc3f63e3703e806201a42c0d483caa5d2ddd1113703e006201a41e0066a201a41c0066a1027201a41c0066a41086a290300211b201a41c0066a41106a350200211c201a2903c006211d41c000201a41a0076a1024201a41a0076a41186a221e290300211f201a41a0076a41106a2903002120201a41a0076a41086a2903002121201a2903a0072122201e4200370300201a42003703b007201a42003703a807201a4285f290b50e3703a007201a41a0076a41e001201a4180076a1037201a41a0066a41186a201a4180076a41186a290300370300201a201a4180076a41106a2903003703b006201a201a4180076a41086a2903003703a806201a201a290380073703a0062022a72223201a41a0066a1022201e4200370300201a200342ffffffff0f8322243703b007201a20023703a807201a20013703a007202341046a201a41a0076a1022201e4200370300201a200742ffffffff0f8322253703b007201a20063703a807201a20053703a007202341246a201a41a0076a1022102e2126201a4180066a41186a4200370300201a201c37039006201a201b37038806201a201d37038006201a4180066a201a41e0056a1016201a201a2900e0053700c005201a201a2900e8053700c805201a201a2900f0053700d005201a201a2900f8053700d8050240024002402026201a41c0056a202341c40020234120102d0d0041c000201a41a0076a1024201a2802a007222341001030102b20231030101d0c010b0240024010304120490d00202220212020201f422042004200420010420c010b202220212020201f1030221ead4200420042001042201e411f4b0d0041004100101d0b2023201a41a0076a1024201a41a8076a290300211b201a2903a007211c02404100201a41b0076a2903002222428080808010544100201a41b8076a290300221d501b202242808080801085201d84501b0d0041004100101d0b201c202242ffffffff0f8384201b8450450d010b201941606a222322192400202341186a42bc8be38eeadb88d3c500370300202342a5d7c98092aab3f277370310202342e69aace283adc3f63e370308202342c0d483caa5d2ddd111370300201941606a2219222724002023201910272019290300211b201941086a290300211c201941106a350200211d41c000201a41a0076a1024201a41a0076a41086a2903002126201a41a0076a41106a290300211f201a41a0076a41186a221e2903002120201a2903a0072122202741606a222322192400202341186a20203703002023201f3703102023202637030820232022370300201e4200370300201a42003703b007201a42003703a807201a4296a799ce0c3703a007201a41a0076a41e001201a4180076a1037201a4180076a41086a2903002126201a4180076a41106a290300211f201a4180076a41186a2903002120201a290380072121201941606a221922272400201941186a20203703002019201f37031020192026370308201920213703002022a7222820191022201e4200370300201a20243703b007201a20023703a807201a20013703a007202841046a201a41a0076a1022201e4200370300201a20253703b007201a20063703a807201a20053703a007202841246a201a41a0076a1022102e2122202741606a2219221e2400201941186a42003703002019201d3703102019201c3703082019201b370300201e41606a221e222724002019201e1016201e290000211b201e290008211c201e290010211d201e2900182126202741606a221e22192400201e2026370018201e201d370010201e201c370008201e201b370000201941606a222722192400202741186a420037030020274200370310202742003703082027420037030002402022201e2027202841c40020284120102c0d0041c000201a41a0076a1024201a2802a007222341001030102b20231030101d0c010b0240024010304120490d0020232903002222202341086a290300202341106a290300202341186a290300422042004200420010422022a721230c010b1030211e20232903002222202341086a290300202341106a290300202341186a290300201ead42004200420010422022a72123201e411f4b0d0041004100101d0b2023201a41a0076a10244100201a41b0076a2903002222428080808010544100201a41b8076a290300221b501b202242808080801085201b84501b0d0041004100101d0b201941606a222322192400202341186a42bc8be38eeadb88d3c500370300202342a5d7c98092aab3f277370310202342e69aace283adc3f63e370308202342c0d483caa5d2ddd111370300201941606a22192400202320191027201a4180056a2019290300201941086a290300201941106a290300201941186a29030020012002200320042005200620072008107f02400240201a290380052229201a2903a005222a84201a4180056a41106a290300222b201a4180056a41306a290300222c8484201a4180056a41086a290300222d201a4180056a41286a290300222e84201a4180056a41186a290300222f201a4180056a41386a290300223084848450450d0020092103200a2106200b2105200c21020c010b2009200b84200a200c8484420052ad42004200420010592029202b84202d202f848422314200522223202a202c84202e20308484223242005271ad420042004200105a201a41b0046a20094200202a42001014201a41a0046a200a4200202a42001014201a41c0046a20094200202e42001014201a41d0046a200a4200202e42001014201a41f0046a202a202e420042001014201a41e0046a2009200a420042001014201a41d0036a200a4200202c42001014201a41f0036a20304200200942001014201a4190046a202c4200200942001014201a41c0036a202e4200200b42001014201a41e0036a200c4200202a42001014201a4180046a200b4200202a42001014201a2903b004211d0240200b200c84420052202c203084223342005271200c420052202e42005271201a2903e80342005272201a2903c80342005272201a4180046a41086a2903002202201a2903e003201a2903c0037c7c220620025472722030420052200a42005271201a2903f80342005272201a2903d80342005272201a4190046a41086a2903002202201a2903f003201a2903d0037c7c22032002547272201a2903d0042207201a41a0046a41086a290300201a2903a0042202201a41b0046a41086a2903007c2201200254ad7c2222201a41c0046a41086a290300201a2903c004220220017c2205200254ad7c7c22087c2202201a2903e0042204201a2903f0047c221b7c2201201a290380042226201a290390047c221f7c221c2001542219201a41d0046a41086a2903002008202254ad7c2002200754ad7c201a41e0046a41086a290300201a41f0046a41086a2903007c201b200454ad7c7c2001200254ad7c2201200620037c201f202654ad7c7c2019ad7c220220015420022001511b72410171450d00201a41a0076a41186a428080808090ee9ea4ce00370300201a42003703b007201a42003703a807201a42003703a0074100201a41a0076a1022201a4180076a41186a4200370300201a420037039007201a420037038807201a4211370380074104201a4180076a102241004124101d0b024020230d00201a41a0076a41186a428080808090ee9ea4ce00370300201a42003703b007201a42003703a807201a42003703a0074100201a41a0076a1022201a4180076a41186a4200370300201a420037039007201a420037038807201a4212370380074104201a4180076a102241004124101d0b42002002203150201d201c8420052002848450724200202f79202b7942c0007c202f4200521b202d7920297942c0007c202d4200521b22014280017c2206202b202f84223442005222231b2203200279201c7942c0007c20024200521b200579201d7942c0007c20054200521b22074280017c2222201c20028442005222191b220854221e42002006200154ad20231b220142002022200754ad20191b22065420012006511b2223ad7d222142005242002023410047ad7d22204200522020501b200320087d221f42ff0156200120067d201ead7d22264200522026501b20231b7222231b21014200201c20231b21074200200520231b211b4200201d20231b2122024020230d00201f42ff0185202184202620208484500d00201a4180036a41286a2005370000201a41a0036a2223201d37000042002135201a4180036a41186a4200370000201a4180036a41306a201c370000201a4180036a41386a2002370000201a420037009003201a420037008803201a420037008003202341ff01201fa76b2219410376411f716b222341086a290000220620194107712219ad220186202329000022034201882019413f73ad222288842107202341186a290000200186202341106a2900002208420188202288842104200820018620064201882019417f73413f71ad888421222003200186210802400240201f42017c220320212003201f54222320262023ad7c22062026542003201f5a1bad7c221b8420062020201b202154ad7c22218484500d0042002136201a41c0026a41386a4200370000201a41c0026a41306a4200370000201a41c0026a41286a4200370000201a41c0026a41186a2002370000201a42003700e002201a201d3700c002201a20053700c802201a201c3700d002201a41c0026a2003a72219410376411f716a222341106a29000022012003420783220288202341186a290000220542018620194107712219413f73ad22268684211c202341086a290000221f20028820014201862019417f73413f71ad8684211d2023290000200288201f420186202686842126202f202b427f7c2201202b54ad7c20012029427f7c22372029542223202d2023ad7c427f7c2220202d542020202d511bad7c2224200154ad7c427f7c213820052002882125420021390340201c420186201d423f8884220520382025420186201c423f888422257d2024200554ad7d202420057d203720264201862004423f8884221f542020201d4201862026423f888422025420202002511bad54ad7d423f872201202b8322267d223a201f2001202983223b54222320022001202d83221d542002201d511bad22357d211c20252001202f837d2005202654ad7d203a203554ad7d21252002201d7d2023ad7d211d201f203b7d212620062003427f7c22052003542223ad7c427f7c220220065121192002200654211e201b427f7c221f201b5421272008423f88213a2007423f88213b420020044201862022423f8884842104203920084201868421082001420183223521392005210320022106201f2023201e20191bad7c2201211b4200203a20074201868484223a21074200203b20224201868484223b21222005200184200220212027ad7c2001201f54ad7c427f7c2221848450450d000b4200210242002101203a2107203b21220c010b4200213642002102420021010b203620074201862008423f888484211b200220224201862007423f8884842107200120044201862022423f8884842101203520084201868421220b02402022200d58201b200e58201b200e511b2007200f58200120105820012010511b2007200f85200120108584501b0d00200d200f84200e20108484420052ad420042004200105920324200522223203142005271ad420042004200105a201a41f0016a200d4200202942001014201a41e0016a200e4200202942001014201a4180026a200d4200202d42001014201a4190026a200e4200202d42001014201a41b0026a2029202d420042001014201a41a0026a200d200e420042001014201a4180016a200e4200202b42001014201a41a0016a202f4200200d42001014201a41d0016a202b4200200d42001014201a4190016a202d4200200f42001014201a41b0016a20104200202942001014201a41c0016a200f4200202942001014201a2903f00121260240200f2010844200522034420052712010420052202d42005271201a2903b80142005272201a2903980142005272201a41c0016a41086a2903002202201a2903b001201a290390017c7c22062002547272202f420052200e42005271201a2903a80142005272201a2903880142005272201a41d0016a41086a2903002202201a2903a001201a290380017c7c22052002547272201a290390022203201a41e0016a41086a290300201a2903e0012202201a41f0016a41086a2903007c2201200254ad7c2207201a4180026a41086a290300201a29038002220220017c221c200254ad7c7c22227c2202201a2903a0022208201a2903b0027c22047c2201201a2903c001221b201a2903d0017c221f7c221d2001542219201a4190026a41086a2903002022200754ad7c2002200354ad7c201a41a0026a41086a290300201a41b0026a41086a2903007c2004200854ad7c7c2001200254ad7c2202200620057c201f201b54ad7c7c2019ad7c220120025420012002511b72410171450d00201a41a0076a41186a428080808090ee9ea4ce00370300201a42003703b007201a42003703a807201a42003703a0074100201a41a0076a1022201a4180076a41186a4200370300201a420037039007201a420037038807201a4211370380074104201a4180076a102241004124101d0b024020230d00201a41a0076a41186a428080808090ee9ea4ce00370300201a42003703b007201a42003703a807201a42003703a0074100201a41a0076a1022201a4180076a41186a4200370300201a420037039007201a420037038807201a4212370380074104201a4180076a102241004124101d0b420020012032502026201d84201c2001848450724200203079202c7942c0007c20304200521b202e79202a7942c0007c202e4200521b22024280017c2206203342005222231b2205200179201d7942c0007c20014200521b201c7920267942c0007c201c4200521b22034280017c2207201d20018442005222191b222254221e42002006200254ad20231b220242002007200354ad20191b22065420022006511b2223ad7d222142005242002023410047ad7d22204200522020501b200520227d221b42ff0156200220067d201ead7d221f420052201f501b20231b7222231b21024200201d20231b21054200201c20231b21064200202620231b2103024020230d00201b42ff0185202184201f20208484500d00201a41c0006a41286a201c370000201a41e0006a2223202637000042002135201a41c0006a41186a4200370000201a41c0006a41306a201d370000201a41c0006a41386a2001370000201a4200370050201a4200370048201a4200370040202341ff01201ba76b2219410376411f716b222341086a290000220620194107712219ad220286202329000022054201882019413f73ad220388842107202341186a290000200286202341106a2900002222420188200388842104202220028620064201882019417f73413f71ad888421222005200286210802400240201b42017c220320212003201b542223201f2023ad7c2206201f542003201b5a1bad7c221b8420062020201b202154ad7c22218484500d0042002129201a41386a4200370000201a41306a4200370000201a41286a4200370000201a41186a2001370000201a4200370020201a2026370000201a201c370008201a201d370010201a2003a72219410376411f716a222341106a29000022012003420783220288202341186a290000220542018620194107712219413f73ad22268684211c202341086a290000221f20028820014201862019417f73413f71ad8684211d2023290000200288201f4201862026868421262030202c427f7c2201202c54ad7c2001202a427f7c222d202a542223202e2023ad7c427f7c2220202e542020202e511bad7c2224200154ad7c427f7c212f20052002882125420021390340201c420186201d423f88842205202f2025420186201c423f888422257d2024200554ad7d202420057d202d20264201862004423f8884221f542020201d4201862026423f888422025420202002511bad54ad7d423f872201202c8322267d223a201f2001202a83223b54222320022001202e83221d542002201d511bad22357d211c202520012030837d2005202654ad7d203a203554ad7d21252002201d7d2023ad7d211d201f203b7d212620062003427f7c22052003542223ad7c427f7c220220065121192002200654211e201b427f7c221f201b5421272008423f88213a2007423f88213b420020044201862022423f8884842104203920084201868421082001420183223521392005210320022106201f2023201e20191bad7c2201211b4200203a20074201868484223a21074200203b20224201868484223b21222005200184200220212027ad7c2001201f54ad7c427f7c2221848450450d000b4200210242002101203a2107203b21220c010b4200212942002102420021010b202920074201862008423f8884842106200220224201862007423f8884842105200120044201862022423f8884842102203520084201868421030b024020032009582006200a582006200a511b2005200b582002200c582002200c511b2005200b852002200c8584501b0d00201a41a0076a41186a428080808090ee9ea4ce00370300201a42003703b007201a42003703a807201a42003703a0074100201a41a0076a1022201a4180076a41186a4200370300201a420037039007201a420037038807201a4201370380074104201a4180076a102241004124101d0b200320115a200620125a20062012511b200520135a200220145a20022014511b2005201385200220148584501bad42004200420010730c010b202220155a201b20165a201b2016511b200720175a200120185a20012018511b2007201785200120188584501bad420042004200107420092103200a2106200b2105200c21022022210d201b210e2007210f200121100b2000200d37032020002003370300200041286a200e37030020002006370308200041306a200f37030020002005370310200041386a2010370300200041186a2002370300201a41c0076a24000bf40202017f047e230041e0016b2200240020004180016a1019200041e0006a41186a42ebebe4fcb28587a751370300200042dea0e0bdc4f6b08d6a370370200042b1f48ed6d0a7eb857e370368200042bfa3ffbd899593d51a3703602000290080012101200029008801210220002900900121032000290098012104200041e0006a200041c0006a102720002004370018200020033700102000200237000820002001370000200041c0006a41086a2903002101200041c0006a41106a3502002102200029034021032000200041206a1015024020032000290320852002200041206a41106a35020085842001200041206a41086a2903008584500d00200041c0016a41186a428080808090ee9ea4ce00370300200042003703d001200042003703c801200042003703c0014100200041c0016a1022200041a0016a41186a4200370300200042003703b001200042003703a801200042013703a0014104200041a0016a102241004124101d0b200041e0016a24000bf40206027f077e017f017e017f017e230041c0006b2205210620052400024020025041002003200484501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1022200641186a42003703002006420037031020064200370308200642c10037030041042006102241004124101d0b41c000200641206a102420062903202207200641286a2903002208200641306a2903002209200641206a41186a290300220a2001421f7c220b426083220c42207c220d2002200b200154220ead7c220f200d200c542210ad7c22112003200e200f200254200b20015a1bad7c220b20102011200f54200d200c5a1bad7c220c2004200b200354ad7c200c200b54ad7c1042200541606a22052400200541186a20043703002005200337031020052002370308200520013703002007a720051022200020093703102000200837030820002007370300200041186a200a370300200641c0006a24000bc10201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a2204420037030020054200370350200542003703482005422d370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42e6c0c8abe6ec9cb7e100370300200542808080a0d68cdbb4e1003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bc90201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054234370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42e1e4d1838289d5a220370300200542e1cc8191d7ccd9b9ee0037033020054280808080c0ac99b6e90037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bc10201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a2204420037030020054200370350200542003703482005422b370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42cf9a85fac5aa95a8ce0037030020054280808080808095a7d5003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000b9e0201037f230041c0006b2204210520042400024020002002842001200384844200520d0041c000200541206a102420052802202106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541206a41186a2204420037030020054200370330200542003703282005421e370320200641246a200541206a1022200442d6e085bbb7ae9ab7d500370300200542f9e48593a7ac9aa632370330200542c99885b2e5a992903a3703282005428080a0a29588d4afc400370320200641c4006a200541206a1022200641e400101d0b200541c0006a24000be70204027f077e017f027e230041c0006b2205210620052400024020025041002003200484501b0d00200641206a41186a428080808090ee9ea4ce003703002006420037033020064200370328200642003703204100200641206a1022200641186a42003703002006420037031020064200370308200642c10037030041042006102241004124101d0b41c000200641206a102420062903202207200641286a2903002208200641306a2903002209200641206a41186a290300220a2001420586220b42207c220c20024205862001423b8884220d200c200b54220ead7c220f20034205862002423b88842210200e200f200d54200c200b5a1bad7c220b20044205862003423b8884200b201054ad7c1042200541606a22052400200541186a20043703002005200337031020052002370308200520013703002007a720051022200020093703102000200837030820002007370300200041186a200a370300200641c0006a24000b950906017f047e017f017e047f017e230041e0016b220d24004200210e2005200985200742ffffffff0f83220f200b42ffffffff0f832210852211842006200a8584420052ad42004200420010752005200920052009542006200a542006200a511b200f2010542011501b22121b22102007200b20121b42ffffffff0f832211842006200a20121b221384420052ad4200420042001076200d2212200120022003200420052006200720082009200a200b200c106e201241086a2903002109201241106a350200210b2012290300210741c000201241c0016a1024201241c0016a41186a22142903002108201241c0016a41106a2903002104201241c0016a41086a290300210320122903c001210a20144200370300201242003703d001201242003703c801201242ace38bc8003703c001201241c0016a41e001201241a0016a103720124180016a41186a201241a0016a41186a2903003703002012201241a0016a41106a290300370390012012201241a0016a41086a29030037038801201220122903a00137038001200aa7221420124180016a1022102e210c201241e0006a41186a42003703002012200b3703702012200937036820122007370360201241e0006a201241c0006a10162012201229004037002020122012290048370028201220122900503700302012201229005837003802400240200c201241206a20144104201441e000102d0d0041c000201241c0016a102420122802c001220d41001030102b200d1030101d4200210b4200210a42002109420021070c010b02400240103041e000490d00200a20032004200842e0004200420042001042200d41a07f6a220d24000c010b200a20032004200810302215ad4200420042001042200d41a07f6a220d2400201541df004b0d0041004100101d0b2014201241c0016a102420122903c00121090240201241c8016a2215290300220a42808080808080c000544100201241d0016a22162903002207201241d8016a2217290300220c84501b0d0041004100101d0b201441206a201241c0016a102420122903c001210e02402015290300220b42808080808080c000544100201629030022082017290300220484501b0d0041004100101d0b201441c0006a201241c0016a1024024020122903c0012203428080808010544100201241c8016a2903002202501b4100201241d0016a2903002201201241c0016a41186a290300221884501b0d0041004100101d0b200d2003370340200d200e370320200d2009370300200d41c8006a2002370300200d41286a200b370300200d200a370308200d41d0006a2001370300200d41306a2008370300200d2007370310200d41d8006a2018370300200d41386a2004370300200d41186a200c370300200b42ffffffffffff3f83210b200a42ffffffffffff3f8321074200210a0b200041386a200a200a2005201085200f2011858420062013858450220d1b370300200041306a200a200a200d1b370300200041286a200b2007200d1b3703002000200e2009200d1b370320200041186a200a200a200d1b3703002000200a200a200d1b37031020002007200b200d1b37030820002009200e200d1b370300201241e0016a24000bca0201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a22044200370300200542003703502005420037034820054231370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42f28cc9abe6ec9cb7e100370300200542e5d8a58be68cc8b6ef003703302005428080808080808080e40037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000bc10201037f230041e0006b2204210520042400024020002002842001200384844200520d0041c000200541c0006a102420052802402106200441606a22042400200441186a428080808080b4dee108370300200442003703102004420037030820044200370300200620041022200541186a4200370300200542003703102005420037030820054220370300200641046a20051022200541c0006a41186a2204420037030020054200370350200542003703482005422c370340200641246a200541c0006a102220044200370300200542003703502005420037034820054200370340200641c4006a200541c0006a1022200541206a41186a42cd82fda2d58a94aad50037030020054280808080c0cad3aacf003703302005420037032820054200370320200641e4006a200541206a10222006418401101d0b200541e0006a24000b8e2b06017f027e027f027e037f177e230041c0106b2200240041800110211a41c00041e0001023024010184104490d004100200041a0106a1017200041a0106a41e00120004180106a1038024002400240024002400240024002400240024002400240024002400240024002400240200029038010220142edb78fc0085620004188106a2903002202420052220320025022041b20004190106a290300220542005220004198106a290300220642005520065022071b220820052006845022091b0d000240200142c9b297d10456200320041b200820091b0d000240200142f39483f80156200242005220041b2005420052200642005520071b20091b0d00200142ecb9d413852005842002200684220684500d03200142d4a1b52a85200584200684500d04200142e5dfaec6018520058420068450450d1410400c140b200142f49483f801852005842002200684220684500d04200142dcb2d68c0285200584200684500d05200142b9aeb4c7038520058420068450450d13104a0c130b0240200142c692ebc80756200242005220041b2005420052200642005520071b20091b0d00200142cab297d104852005842002200684220684500d0620014284b3b5d80585200584200684500d0720014295afc7e0058520058420068450450d130240101c450d0041004100101d0b200041a0066a42044200420042001018ad420042004200103f200041b8076a2903002105200041b0076a2903002101200041a8076a290300210620004198076a290300210220004190076a290300210a20004188076a290300210b200041f8066a290300210c200041f0066a290300210d200041e8066a290300210e200041d8066a290300210f200041d0066a2903002110200041c8066a2903002111200041b8066a2903002112200041b0066a2903002113200041a8066a2903002114200041d8076a2903002115200041d0076a2903002116200041c8076a290300211720002903a0072118200029038007211920002903e006211a20002903c006211b20002903a006211c20002903c007102f5a41012017501b41012016201584501bad420042004200103b201c201420132012201b20112010200f201a200e200d200c2019200b200a200220182006200120052005200520052005105041c000200041a0106a102420002802a010410010290c130b200142c792ebc807852005842002200684220684500d07200142b5d5cdff0785200584200684500d08200142d984e3af088520058420068450450d120240101c450d0041004100101d0b0240101841e3004b0d0041004100101d0b4104200041a0106a1017200041a0106a41186a22042903002105200041a0106a41106a22092903002101200041a0106a41086a2203290300210620002903a01021024124200041a0106a10172004290300210a2009290300210b2003290300210c20002903a010210d41c400200041a0106a1017200041a0096a2002200620012005200d200c200b200a20002903a0102003290300200929030020042903001055200041a0096a41086a2903002105200041a0096a41106a2903002101200041a0096a41186a290300210620002903a009210241c000200041a0106a102420002802a010210920042006370300200020013703b010200020053703a810200020023703a0102009200041a0106a10222009412010290c120b0240200142d482e8a20c56200320041b200820091b0d000240200142eaf3a5f90a56200242005220041b2005420052200642005520071b20091b0d00200142eeb78fc008852005842002200684220684500d0a200142c88cf1ea0a85200584200684500d0b200142ecbb85eb0a8520058420068450450d1310580c130b200142ebf3a5f90a852005842002200684220684500d0b20014295bde7b70b85200584200684500d0c200142ded78ad50b8520058420068450450d120240101c450d0041004100101d0b200041a00b6a42044200420042001018ad420042004200105e200041d80c6a2903002105200041d00c6a2903002101200041c80c6a2903002106200041b80c6a2903002102200041b00c6a290300210a200041a80c6a290300210b200041980c6a290300210c200041900c6a290300210d200041880c6a290300210e200041f80b6a290300210f200041f00b6a2903002110200041e80b6a2903002111200041a00b6a41386a2903002112200041a00b6a41306a2903002113200041a00b6a41286a2903002114200041a00b6a41186a2903002115200041a00b6a41106a2903002116200041a00b6a41086a2903002117200041f80c6a2903002118200041f00c6a2903002119200041e80c6a290300211a20002903c00c211b20002903a00c211c20002903800c211d20002903e00b211e20002903c00b211f20002903a00b212020002903e00c102f5a4101201a501b41012019201884501bad420042004200103b200041e00a6a200520052005200520052005200520052020201720162015201f201420132012201e20112010200f201d200e200d200c201c200b200a2002201b2006200120052005200520052005105f200041e00a6a41286a2903002105200041e00a6a41306a2903002101200041e00a6a41386a2903002106200041e00a6a41086a2903002102200041e00a6a41106a290300210a200041e00a6a41186a290300210b20002903800b210c20002903e00a210d41c000200041a0106a102420002802a0102104200041a0106a41186a2209200b3703002000200a3703b010200020023703a8102000200d3703a0102004200041a0106a102220092006370300200020013703b010200020053703a8102000200c3703a010200441206a200041a0106a1022200441c00010290c120b0240200142ffed8cc70e56200242005220041b2005420052200642005520071b20091b0d00200142d582e8a20c852005842002200684220684500d0d2001429fccb2830d85200584200684500d0e200142aaf0e4f60d8520058420068450450d120240101c450d0041004100101d0b200041c00d6a42044200420042001018ad420042004200104e200041800d6a20002903c00d200041c00d6a41086a290300200041c00d6a41106a290300200041c00d6a41186a29030020002903e00d200041c00d6a41286a290300200041c00d6a41306a290300200041c00d6a41386a29030020002903800e200041880e6a290300200041900e6a290300200041980e6a29030020002903a00e200041a80e6a290300200041b00e6a290300200041b80e6a29030020002903c00e200041c80e6a290300200041d00e6a290300200041d80e6a29030020002903e00e200041e80e6a290300200041f00e6a290300200041f80e6a29030020002903800f200041880f6a290300200041900f6a290300200041980f6a29030020002903a00f200041a80f6a290300200041b00f6a290300200041b80f6a29030020002903c00f200041c80f6a290300200041d00f6a290300200041d80f6a29030020002903e00f200041e80f6a290300200041f00f6a290300200041f80f6a2903001062200041800d6a41286a2903002105200041800d6a41306a2903002101200041800d6a41386a2903002106200041800d6a41086a2903002102200041800d6a41106a290300210a200041800d6a41186a290300210b20002903a00d210c20002903800d210d41c000200041a0106a102420002802a0102104200041a0106a41186a2209200b3703002000200a3703b010200020023703a8102000200d3703a0102004200041a0106a102220092006370300200020013703b010200020053703a8102000200c3703a010200441206a200041a0106a1022200441c00010290c120b20014280ee8cc70e852005842002200684220684500d0e20014299ae97980f85200584200684500d0f200142c1b6efd90f85200584200684500d100c110b103a0c100b0240101c450d0041004100101d0b0240101841e3004b0d0041004100101d0b4104200041a0106a1017200041a0106a41186a22042903002105200041a0106a41106a22092903002101200041a0106a41086a2203290300210620002903a01021024124200041a0106a10172004290300210a2009290300210b2003290300210c20002903a010210d41c400200041a0106a101720002002200620012005200d200c200b200a20002903a010200329030020092903002004290300103d200041086a2903002105200041106a2903002101200041186a29030021062000290300210241c000200041a0106a102420002802a010210920042006370300200020013703b010200020053703a810200020023703a0102009200041a0106a10222009412010290c0f0b10460c0e0b0240101c450d0041004100101d0b200041e0006a42044200420042001018ad4200420042001048200041206a2000290360200041e0006a41086a290300200041e0006a41106a290300200041e0006a41186a290300200029038001200041e0006a41286a290300200041e0006a41306a290300200041e0006a41386a29030020002903a001200041a8016a290300200041b0016a290300200041b8016a29030020002903c001200041c8016a290300200041d0016a290300200041d8016a29030020002903e001200041e8016a290300200041f0016a290300200041f8016a29030020002903800220004188026a29030020004190026a29030020004198026a29030020002903a002200041a8026a290300200041b0026a290300200041b8026a29030020002903c002200041c8026a290300200041d0026a290300200041d8026a29030020002903e002200041e8026a290300200041f0026a290300200041f8026a29030020002903800320004188036a29030020004190036a29030020004198036a29030020002903a003200041a8036a290300200041b0036a290300200041b8036a2903001049200041206a41286a2903002105200041206a41306a2903002101200041206a41386a2903002106200041206a41086a2903002102200041206a41106a290300210a200041206a41186a290300210b2000290340210c2000290320210d41c000200041a0106a102420002802a0102104200041a0106a41186a2209200b3703002000200a3703b010200020023703a8102000200d3703a0102004200041a0106a102220092006370300200020013703b010200020053703a8102000200c3703a010200441206a200041a0106a1022200441c00010290c0d0b104c0c0c0b0240101c450d0041004100101d0b200041e0036a42044200420042001018ad420042004200104e200041c0036a20002903e003200041e0036a41086a290300200041e0036a41106a290300200041e0036a41186a29030020002903800420004188046a29030020004190046a29030020004198046a29030020002903a004200041a8046a290300200041b0046a290300200041b8046a29030020002903c004200041c8046a290300200041d0046a290300200041d8046a29030020002903e004200041e8046a290300200041f0046a290300200041f8046a29030020002903800520004188056a29030020004190056a29030020004198056a29030020002903a005200041a8056a290300200041b0056a290300200041b8056a29030020002903c005200041c8056a290300200041d0056a290300200041d8056a29030020002903e005200041e8056a290300200041f0056a290300200041f8056a29030020002903800620004188066a29030020004190066a29030020004198066a290300104f200041c0036a41086a2903002105200041c0036a41106a2903002101200041c0036a41186a290300210620002903c003210241c000200041a0106a102420002802a0102104200041a0106a41186a2006370300200020013703b010200020053703a810200020023703a0102004200041a0106a10222004412010290c0b0b0240101c450d0041004100101d0b200041e0076a42044200420042001018ad420042004200103f200041f8086a2903002105200041f0086a2903002101200041e8086a2903002106200041d8086a2903002102200041d0086a290300210a200041c8086a290300210b200041b8086a290300210c200041b0086a290300210d200041a8086a290300210e20004198086a290300210f20004190086a290300211020004188086a2903002111200041f8076a2903002112200041f0076a2903002113200041e8076a290300211420004198096a290300211520004190096a290300211620004188096a290300211720002903e008211820002903c008211920002903a008211a200029038008211b20002903e007211c200029038009102f5a41012017501b41012016201584501bad420042004200103b201c201420132012201b20112010200f201a200e200d200c2019200b200a200220182006200120052005200520052005105141c000200041a0106a102420002802a010410010290c0a0b10530c090b10560c080b0240101c450d0041004100101d0b0240101841034b0d0041004100101d0b200041b8106a220942ebebe4fcb28587a751370300200042dea0e0bdc4f6b08d6a3703b010200042b1f48ed6d0a7eb857e3703a810200042bfa3ffbd899593d51a3703a010200041a0106a20004180106a102720004188106a290300210520004190106a3502002101200029038010210641c000200041a0106a102420002802a010210420094200370300200020013703b010200020053703a810200020063703a0102004200041a0106a10222004412010290c070b105b0c060b200041c0096a42044200420042001018ad4200420042001052200041b80a6a2903002105200041b00a6a2903002101200041a80a6a2903002106200041980a6a2903002102200041900a6a290300210a200041880a6a290300210b200041f8096a290300210c200041f0096a290300210d200041e8096a290300210e200041d8096a290300210f200041d0096a2903002110200041c8096a2903002111200041d80a6a2903002112200041d00a6a2903002113200041c80a6a290300211420002903a00a211520002903800a211620002903e009211720002903c009211820002903c00a102f5a41012014501b41012013201284501bad420042004200103b201820112010200f2017200e200d200c2016200b200a200220152006200120052005200520052005105d41c000200041a0106a102420002802a010410010290c050b0240101c450d0041004100101d0b0240101841034b0d0041004100101d0b200041b8106a220942bc8be38eeadb88d3c500370300200042a5d7c98092aab3f2773703b010200042e69aace283adc3f63e3703a810200042c0d483caa5d2ddd1113703a010200041a0106a20004180106a102720004188106a290300210520004190106a3502002101200029038010210641c000200041a0106a102420002802a010210420094200370300200020013703b010200020053703a810200020063703a0102004200041a0106a10222004412010290c040b10600c030b10640c020b10660c010b10680b024010180d001078101f0b41004100101d200041c0106a24000b05001082010b040010360bd00606047f017e037f047e017f037e230041c0006b220021012000240041c00110211a41c00041e00010230240101c450d0041004100101d0b103421021033210341c000200141206a102420012903202204200141286a2205290300200141306a2206290300200141386a22072903002003ad22082002ad22097d220a42002008200954ad7d220b200b200b10392004a722032002200aa710200240200a423f56200b4200522202200b50220c1b2002200b420055200c1b200820095a1b0d0041004100101d0b2003200141206a1024200529030021042001290320210d024041002006290300220b42808080801054410020072903002208501b200b42808080801085200884501b0d0041004100101d0b200341206a200141206a1024200141206a41086a290300210e2001290320210f02404100200141206a41106a2903002209428080808010544100200141206a41186a2202290300220a501b200942808080801085200a84501b0d0041004100101d0b20022008370300200120043703282001200d3703202001200b370330418001200141206a1022200141186a200a370300200120093703102001200e3703082001200f37030041a0012001102241c000200141206a102420012802202203418889044100101e6b41041020200041606a220022022400418001200010242000290300210b200041086a2903002108200041106a2903002109200041186a290300210a200241606a220022022400200041186a42bc8be38eeadb88d3c500370300200042a5d7c98092aab3f277370310200042e69aace283adc3f63e370308200042c0d483caa5d2ddd111370300200241606a220222052400200241186a200a37030020022009370310200220083703082002200b3703002001200020021026200541606a22002202240041a001200010242000290300210b200041086a2903002108200041106a2903002109200041186a290300210a200241606a220022022400200041186a42ebebe4fcb28587a751370300200042dea0e0bdc4f6b08d6a370310200042b1f48ed6d0a7eb857e370308200042bfa3ffbd899593d51a370300200241606a22022400200241186a200a37030020022009370310200220083703082002200b3703002001200020021026200341041029200141c0006a24000b070010321085010b0b8c010400418080040b68696d6d757461626c6520736c6f7420616c726561647920736574006f7574206c656e677468206973206e6f7420656e6f7567680063616c6c20636f6e7472616374206661696c65640063616c6c206661696c65642077697468206e6f2072657665727420646174610041f488040b01010041fa88040b05020000000300418689040b0101002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874009b010970726f64756365727302086c616e67756167650103433939000c70726f6365737365642d62790205636c616e675631312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290e486f6d656272657720636c616e670631362e302e3600de4b046e616d6501b64b8701000f67657443616c6c4461746153697a65010c63616c6c44617461436f7079020967657443616c6c6572030a67657441646472657373040c67657443616c6c56616c75650506726576657274060666696e697368070b676574436f646553697a650808636f6465436f7079090c73746f7261676553746f72650a0b73746f726167654c6f61640b096b656363616b3235360c1167657452657475726e4461746153697a650d0e72657475726e44617461436f70790e0c63616c6c436f6e74726163740f0a63616c6c537461746963100a6765744761734c6566741111676574426c6f636b54696d657374616d70121367657445787465726e616c436f646553697a6513115f5f7761736d5f63616c6c5f63746f727314085f5f6d756c746933151a753235365f66726f6d5f6269675f656e6469616e5f62797465731618753235365f746f5f6269675f656e6469616e5f62797465731719777261707065725f63616c6c646174616c6f61645f753235361815777261707065725f63616c6c646174615f73697a65190e777261707065725f63616c6c65721a18777261707065725f63757272656e745f636f6e74726163741b11777261707065725f63616c6c76616c75651c1a777261707065725f63616c6c76616c75655f6e6f745f7a65726f1d0e777261707065725f7265766572741e1365766d5f6765745f6d656d6f72795f616464721f0c777261707065725f73746f702010777261707065725f636f6465636f70792114777261707065725f6d656d6f72795f67756172642213777261707065725f6d73746f72655f753235362312777261707065725f6d73746f72655f7533322412777261707065725f6d6c6f61645f75323536250d777261707065725f6d636f70792614777261707065725f736574696d6d757461626c652715777261707065725f6c6f6164696d6d757461626c652811777261707065725f6b656363616b323536290e777261707065725f72657475726e2a0f77726974655f63616c6c5f646174612b17777261707065725f72657475726e646174615f636f70792c15777261707065725f63616c6c5f636f6e74726163742d12777261707065725f73746174696363616c6c2e0b777261707065725f6761732f12777261707065725f74696d655f7374616d703017777261707065725f72657475726e646174615f73697a653115777261707065725f63616c6c646174615f636f707932137365745f69735f6465706c6f79696e675f74783322777261707065725f63757272656e745f636f6e74726163745f636f64655f73697a65342b777261707065725f63757272656e745f636f6e74726163745f707572655f636f6e74726163745f73697a653514777261707065725f657874636f64655f73697a65360f5f5f696e69745f65766d5f686561703710777261707065725f753235365f73686c3810777261707065725f753235365f736872393d556e69737761705632526f757465725f323033392e556e69737761705632526f757465725f323033392e66696e616c697a655f616c6c6f636174696f6e3a5f556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f72656d6f76654c69717569646974794554485f3533343b9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f316139643366333432396436663764363031653739613536333838656261656566383739633137386636646133386530386135303964396533393934623661363c5c556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c69717569646974794554485f3533345f696e6e65723d51556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f676574416d6f756e744f75745f323834343e6b556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f745f6172726179245f745f616464726573735f2464796e5f63616c6c646174615f7074723f9501556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f75696e74323536745f75696e74323536745f6172726179245f745f616464726573735f2464796e5f63616c6c646174615f707472745f61646472657373745f75696e743235364063556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f737761704578616374546f6b656e73466f724554485f313430324160556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374546f6b656e73466f724554485f313430325f696e6e6572424f556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66696e616c697a655f616c6c6f636174696f6e437a556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f617661696c61626c655f6c656e6774685f745f6172726179245f745f616464726573735f2464796e5f6d656d6f72795f7074724469556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f745f6172726179245f745f616464726573735f2464796e5f6d656d6f72795f7074724578556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f75696e74323536745f6172726179245f745f616464726573735f2464796e5f6d656d6f72795f707472465a556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f676574416d6f756e7473496e5f323033384751556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f676574416d6f756e7473496e5f3330363548ab01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f61646472657373745f61646472657373745f75696e74323536745f75696e74323536745f75696e74323536745f61646472657373745f75696e74323536745f626f6f6c745f75696e7438745f62797465733332745f62797465733332495d556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c6971756964697479576974685065726d69745f3631364a66556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f737761704578616374546f6b656e73466f72546f6b656e735f313032364b63556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374546f6b656e73466f72546f6b656e735f313032365f696e6e65724c63556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f73776170546f6b656e73466f7245786163744554485f313239314d60556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f73776170546f6b656e73466f7245786163744554485f313239315f696e6e65724ea201556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f61646472657373745f75696e74323536745f75696e74323536745f75696e74323536745f61646472657373745f75696e74323536745f626f6f6c745f75696e7438745f62797465733332745f627974657333324f7d556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c6971756964697479455448576974685065726d6974537570706f7274696e674665654f6e5472616e73666572546f6b656e735f383338508001556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374546f6b656e73466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e735f313734395f696e6e6572517d556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374546f6b656e73466f72455448537570706f7274696e674665654f6e5472616e73666572546f6b656e735f313933385f696e6e6572528c01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f75696e74323536745f6172726179245f745f616464726573735f2464796e5f63616c6c646174615f707472745f61646472657373745f75696e743235365363556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f737761704578616374455448466f72546f6b656e735f313138335460556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374455448466f72546f6b656e735f313138335f696e6e65725550556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f676574416d6f756e74496e5f323839395666556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f73776170546f6b656e73466f724578616374546f6b656e735f313039355763556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f73776170546f6b656e73466f724578616374546f6b656e735f313039355f696e6e65725853556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f71756f74655f31393538599b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f623365613063643732393032386566626337333761643363646531643464383534653666326331333662333534666261656139333839643638626333613134365a9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f376538643662323635313733646262643837623362396532626634323338626561366361663262326262656236336638353961373338616563396537363163385b7c556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f72656d6f76654c6971756964697479455448537570706f7274696e674665654f6e5472616e73666572546f6b656e735f3736335c79556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c6971756964697479455448537570706f7274696e674665654f6e5472616e73666572546f6b656e735f3736335f696e6e65725d7d556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f737761704578616374455448466f72546f6b656e73537570706f7274696e674665654f6e5472616e73666572546f6b656e735f313834355f696e6e65725e8c01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f61646472657373745f61646472657373745f75696e74323536745f75696e74323536745f75696e74323536745f61646472657373745f75696e743235365f59556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c69717569646974795f3437315f696e6e6572605b556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f676574416d6f756e74734f75745f323031386152556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f676574416d6f756e74734f75745f323938306260556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f72656d6f76654c6971756964697479455448576974685065726d69745f363935639501556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e6162695f6465636f64655f7475706c655f745f61646472657373745f61646472657373745f75696e74323536745f75696e74323536745f75696e74323536745f75696e74323536745f61646472657373745f75696e743235366459556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f6164644c69717569646974795f3237366556556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f6164644c69717569646974795f3237365f696e6e6572665c556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f6164644c69717569646974794554485f3337386759556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f6164644c69717569646974794554485f3337385f696e6e65726863556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e65787465726e616c5f66756e5f73776170455448466f724578616374546f6b656e735f313530376960556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f73776170455448466f724578616374546f6b656e735f313530375f696e6e65726a51556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f736166655472616e736665725f323531346b54556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f736166655472616e736665724554485f323538356c9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f363433356434376137636566343334313666386635393664363662656162316233303937303732386631343335643937313433386637643839623063666239346d9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f643465613637626561353531383931616233366265373236623865363331313831323436303334646666636664356330626266616431653964313732393433326e4c556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f70616972466f725f323639396f55556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f736166655472616e7366657246726f6d5f323536307049556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f5f737761705f393534719b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f626231383030346364323265616164376561333933643138346561366163316466313432386462333662623666626666386166343836323332643638616532637267556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f5f73776170537570706f7274696e674665654f6e5472616e73666572546f6b656e735f31363731739b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f64316433326564633233326263316461323135306435393035363763356436333231616465386138306564636432343835653630363864303138633766643637749b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f35303836373366613939646435353537316337373431313134623430373534373835333039643161323137313032326364376335636161616533386663376236759b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f34646463336361333561386237636361613031366162373032353266646633333936646564346634666438333735663935623165396439393739306663646361769b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f646230646461356137336163333132326531376466303937666132636263653263353136316234356432306337643663663336336433623134373339326338337751556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f5f6164644c69717569646974795f3139357843556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f5f36347964556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e616c6c6f636174655f6d656d6f72795f61727261795f745f62797465735f6d656d6f72795f7074727a9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f646165613639343231656562313136346531363363333666336434333439663064623365633465306431333831626435626634666166353334393663323631317b9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f343364376265633232336563663965623036656131343765376435363462633731633234343836363264363261346561383663653731666334353138623335307c9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f656332316230303665623337656632306430663461626361626433346465363835346661363861663438323934323434653032363364633035633164626261657d9b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f373533373735353163653066636364363363356636363438333036663966393136363037663361653530636666623338343330643239616439383162383232327e74556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e616c6c6f636174655f6d656d6f72795f61727261795f745f6172726179245f745f75696e743235365f2464796e5f6d656d6f72795f7074727f50556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e66756e5f67657452657365727665735f3237343980019b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f3366386661663938616665393334346236643462306537356230313031323539626632383239313462336235613933323063363931386236653237656465316381019b01556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e726571756972655f68656c7065725f745f737472696e676c69746572616c5f33356662373831303539303930633330616163616432306532396232653430653637663231373631376663343666383630333165643465623134393233613832820140556e69737761705632526f757465725f323033395f6465706c6f7965642e556e69737761705632526f757465725f323033395f6465706c6f7965642e696e697483010463616c6c8401065f737461727485012e556e69737761705632526f757465725f323033392e556e69737761705632526f757465725f323033392e696e69748601066465706c6f79071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100ed020a2e64656275675f737472790078006c6f77007761736973646b3a2f2f7631322e302f6275696c642f636f6d70696c65722d72740064755f696e740074695f696e740064695f696e74006c6f6e67206c6f6e6720696e74006c6f6e67206c6f6e6720756e7369676e656420696e740075696e7436345f740074776f726473007200616c6c006c6f7765725f6d61736b0068696768007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e732f6d756c7469332e6300620061005f5f696e74313238005f5f6d756c746933005f5f6d756c6464693300626974735f696e5f64776f72645f3200636c616e672076657273696f6e2031312e302e30202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742031373632343962643637333261383034346434353730393265643933323736383732346136663036290000dd020b2e64656275675f6c696e654d0100000400c2000000010101fb0e0d0001010101000000010000017761736973646b3a2f2f7631322e302f6275696c642f696e7374616c6c2f6f70742f776173692d73646b2f73686172652f776173692d737973726f6f742f696e636c7564652f62697473007761736973646b3a2f2f7631322e302f7372632f6c6c766d2d70726f6a6563742f636f6d70696c65722d72742f6c69622f6275696c74696e730000616c6c74797065732e6800010000696e745f74797065732e68000200006d756c7469332e63000200000004030005020500000003270105030a44052c2d05180658050c06037258050b1e6f052660050c063c052306037520051006ac051e9003693c05160603184a051f2205050658036620051006031c4a0522031320050f036e20051f920505065803612005110603214a050c030e20050321051f037058050b037958970503031020020400010100fa010d2e64656275675f616262726576011101250e1305030e10171b0e110112060000022400030e3e0b0b0b00000316004913030e3a0b3b0b0000042e01030e3a0b3b0b27194913200b0000050500030e3a0b3b0b49130000063400030e3a0b3b0b491300000717010b0b3a0b3b0b0000080d00030e49133a0b3b0b380b00000913010b0b3a0b3b0b00000a2600491300000b2e01110112064018974219030e3a0b3b0b271949133f1900000c05000217030e3a0b3b0b491300000d34000217030e3a0b3b0b491300000e1d0131135517580b590b570b00000f0500311300001034000217311300001134001c0d311300001234001c0f3113000000002e0d2e64656275675f72616e6765730f00000047000000480000005c000000620000007100000000000000000000000095020a2e64656275675f6c6f6300000000750000000200930800000000000000000000000075000000020093080000000000000000000000007500000002009308000000000000000037000000390000000600ed02029f930839000000470000000600ed00059f930847000000480000000c00ed00059f9308ed02029f930848000000700000000600ed00059f930870000000710000000600ed02029f930871000000740000000600ed02019f9308000000000000000000000000750000000200930800000000000000005d0000006000000008009308ed02019f930800000000000000003c000000420000000400ed02029f51000000590000000400ed02029f59000000750000000400ed00039f000000000000000000c4030b2e64656275675f696e666fb40100000400000000000401fd0000000c008a000000000000000800000005000000750000000260000000050403380000002a000000022603430000006400000001aa024d000000070804e30000000313990000000105cf00000003132d00000005cd00000003132d00000006740000000314ab00000006ed00000003150d010000067a000000031612010000066b00000003182d0000000003a400000031000000024f02d1000000051003b60000006d000000025d071002520876000000990000000253000872000000d2000000025c000910025408040000002d0000000256000885000000f0000000025708000003fb0000003800000002250306010000650000000191023f00000005080a260000000a2d0000000b050000007500000007ed03000000009fda0000000328990000000c00000000cf0000000328990000000c14000000cd0000000328990000000d2800000000000000032bab0000000daa000000020000000329ab0000000dbe00000074000000032dab0000000e4a00000000000000032e0b0f560000000f61000000103c0000006c00000011207700000012ffffffff0f8200000010d80000008d000000000000000000000000000000000000b88de88b35ecbf3c141e3caae2baf35834d18f630000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_erc20_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_erc20_evm.hex new file mode 100644 index 000000000..2443d64f6 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_erc20_evm.hex @@ -0,0 +1 @@ +60806040523480156200001157600080fd5b50604051620017bb380380620017bb8339818101604052810190620000379190620003df565b6040518060400160405280600481526020017f476f6c64000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474c4400000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062000681565b508060049081620000c6919062000681565b505050620000db3382620000e260201b60201c565b506200089f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620001575760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016200014e9190620007ad565b60405180910390fd5b6200016b600083836200016f60201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620001c5578060026000828254620001b89190620007f9565b925050819055506200029b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101562000254578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200024b9392919062000845565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002e6578060026000828254039250508190555062000333565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000392919062000882565b60405180910390a3505050565b600080fd5b6000819050919050565b620003b981620003a4565b8114620003c557600080fd5b50565b600081519050620003d981620003ae565b92915050565b600060208284031215620003f857620003f76200039f565b5b60006200040884828501620003c8565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049357607f821691505b602082108103620004a957620004a86200044b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d4565b6200051f8683620004d4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005626200055c6200055684620003a4565b62000537565b620003a4565b9050919050565b6000819050919050565b6200057e8362000541565b620005966200058d8262000569565b848454620004e1565b825550505050565b600090565b620005ad6200059e565b620005ba81848462000573565b505050565b5b81811015620005e257620005d6600082620005a3565b600181019050620005c0565b5050565b601f8211156200063157620005fb81620004af565b6200060684620004c4565b8101602085101562000616578190505b6200062e6200062585620004c4565b830182620005bf565b50505b505050565b600082821c905092915050565b6000620006566000198460080262000636565b1980831691505092915050565b600062000671838362000643565b9150826002028217905092915050565b6200068c8262000411565b67ffffffffffffffff811115620006a857620006a76200041c565b5b620006b482546200047a565b620006c1828285620005e6565b600060209050601f831160018114620006f95760008415620006e4578287015190505b620006f0858262000663565b86555062000760565b601f1984166200070986620004af565b60005b8281101562000733578489015182556001820191506020850194506020810190506200070c565b868310156200075357848901516200074f601f89168262000643565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007958262000768565b9050919050565b620007a78162000788565b82525050565b6000602082019050620007c460008301846200079c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200080682620003a4565b91506200081383620003a4565b92508282019050808211156200082e576200082d620007ca565b5b92915050565b6200083f81620003a4565b82525050565b60006060820190506200085c60008301866200079c565b6200086b602083018562000834565b6200087a604083018462000834565b949350505050565b600060208201905062000899600083018462000834565b92915050565b610f0c80620008af6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806340c10f191161006657806340c10f191461015d57806370a082311461017957806395d89b41146101a9578063a9059cbb146101c7578063dd62ed3e146101f75761009e565b806306fdde03146100a3578063095ea7b3146100c157806318160ddd146100f157806323b872dd1461010f578063313ce5671461013f575b600080fd5b6100ab610227565b6040516100b89190610b60565b60405180910390f35b6100db60048036038101906100d69190610c1b565b6102b9565b6040516100e89190610c76565b60405180910390f35b6100f96102dc565b6040516101069190610ca0565b60405180910390f35b61012960048036038101906101249190610cbb565b6102e6565b6040516101369190610c76565b60405180910390f35b610147610315565b6040516101549190610d2a565b60405180910390f35b61017760048036038101906101729190610c1b565b61031e565b005b610193600480360381019061018e9190610d45565b61032c565b6040516101a09190610ca0565b60405180910390f35b6101b1610374565b6040516101be9190610b60565b60405180910390f35b6101e160048036038101906101dc9190610c1b565b610406565b6040516101ee9190610c76565b60405180910390f35b610211600480360381019061020c9190610d72565b610429565b60405161021e9190610ca0565b60405180910390f35b60606003805461023690610de1565b80601f016020809104026020016040519081016040528092919081815260200182805461026290610de1565b80156102af5780601f10610284576101008083540402835291602001916102af565b820191906000526020600020905b81548152906001019060200180831161029257829003601f168201915b5050505050905090565b6000806102c46104b0565b90506102d18185856104b8565b600191505092915050565b6000600254905090565b6000806102f16104b0565b90506102fe8582856104ca565b61030985858561055e565b60019150509392505050565b60006012905090565b6103288282610652565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606004805461038390610de1565b80601f01602080910402602001604051908101604052809291908181526020018280546103af90610de1565b80156103fc5780601f106103d1576101008083540402835291602001916103fc565b820191906000526020600020905b8154815290600101906020018083116103df57829003601f168201915b5050505050905090565b6000806104116104b0565b905061041e81858561055e565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b6104c583838360016106d4565b505050565b60006104d68484610429565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146105585781811015610548578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161053f93929190610e21565b60405180910390fd5b610557848484840360006106d4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105d05760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016105c79190610e58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106425760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106399190610e58565b60405180910390fd5b61064d8383836108ab565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106c45760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106bb9190610e58565b60405180910390fd5b6106d0600083836108ab565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107465760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161073d9190610e58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107b85760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016107af9190610e58565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080156108a5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161089c9190610ca0565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108fd5780600260008282546108f19190610ea2565b925050819055506109d0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610989578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161098093929190610e21565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a195780600260008282540392505081905550610a66565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ac39190610ca0565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610b0a578082015181840152602081019050610aef565b60008484015250505050565b6000601f19601f8301169050919050565b6000610b3282610ad0565b610b3c8185610adb565b9350610b4c818560208601610aec565b610b5581610b16565b840191505092915050565b60006020820190508181036000830152610b7a8184610b27565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610bb282610b87565b9050919050565b610bc281610ba7565b8114610bcd57600080fd5b50565b600081359050610bdf81610bb9565b92915050565b6000819050919050565b610bf881610be5565b8114610c0357600080fd5b50565b600081359050610c1581610bef565b92915050565b60008060408385031215610c3257610c31610b82565b5b6000610c4085828601610bd0565b9250506020610c5185828601610c06565b9150509250929050565b60008115159050919050565b610c7081610c5b565b82525050565b6000602082019050610c8b6000830184610c67565b92915050565b610c9a81610be5565b82525050565b6000602082019050610cb56000830184610c91565b92915050565b600080600060608486031215610cd457610cd3610b82565b5b6000610ce286828701610bd0565b9350506020610cf386828701610bd0565b9250506040610d0486828701610c06565b9150509250925092565b600060ff82169050919050565b610d2481610d0e565b82525050565b6000602082019050610d3f6000830184610d1b565b92915050565b600060208284031215610d5b57610d5a610b82565b5b6000610d6984828501610bd0565b91505092915050565b60008060408385031215610d8957610d88610b82565b5b6000610d9785828601610bd0565b9250506020610da885828601610bd0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610df957607f821691505b602082108103610e0c57610e0b610db2565b5b50919050565b610e1b81610ba7565b82525050565b6000606082019050610e366000830186610e12565b610e436020830185610c91565b610e506040830184610c91565b949350505050565b6000602082019050610e6d6000830184610e12565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ead82610be5565b9150610eb883610be5565b9250828201905080821115610ed057610ecf610e73565b5b9291505056fea2646970667358221220165e3472be1fec0f83c3f985c51ebab8bf4df9d22e7459a0e495be01df5d8d9a64736f6c634300081400330000000000000000000000000000000000c097ce7bc90715b34b9f1000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_factory_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_factory_evm.hex new file mode 100644 index 000000000..f7024dfe4 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_factory_evm.hex @@ -0,0 +1 @@ +60806040525f6004553480156012575f80fd5b506040516127fa3803806127fa833981016040819052602f916053565b600180546001600160a01b0319166001600160a01b0392909216919091179055607e565b5f602082840312156062575f80fd5b81516001600160a01b03811681146077575f80fd5b9392505050565b61276f8061008b5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806364f91c721161006357806364f91c721461010e578063a2e74af614610116578063c9c653961461012b578063e6a439051461013e578063f46901ed14610171575f80fd5b8063017e7e581461009f578063094b7415146100ce5780631e3dd18b146100e157806324e43f3d146100f4578063574f2ba314610106575b5f80fd5b5f546100b1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6001546100b1906001600160a01b031681565b6100b16100ef3660046105f0565b610184565b6004545b6040519081526020016100c5565b6003546100f8565b6100f86101ac565b610129610124366004610622565b6101d9565b005b6100b1610139366004610642565b610251565b6100b161014c366004610642565b600260209081525f92835260408084209091529082529020546001600160a01b031681565b61012961017f366004610622565b610571565b60038181548110610193575f80fd5b5f918252602090912001546001600160a01b0316905081565b6040516101bb602082016105e3565b6020820181038252601f19601f820116604052508051906020012081565b6001546001600160a01b0316331461022f5760405162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b60448201526064015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f816001600160a01b0316836001600160a01b0316036102b35760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056323a204944454e544943414c5f41444452455353455300006044820152606401610226565b5f80836001600160a01b0316856001600160a01b0316106102d55783856102d8565b84845b90925090506001600160a01b0382166103335760405162461bcd60e51b815260206004820152601760248201527f556e697377617056323a205a45524f5f414444524553530000000000000000006044820152606401610226565b6001600160a01b038281165f908152600260209081526040808320858516845290915290205416156103a05760405162461bcd60e51b8152602060048201526016602482015275556e697377617056323a20504149525f45584953545360501b6044820152606401610226565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b166034820152604801604051602081830303815290604052805190602001206040516103eb906105e3565b8190604051809103905ff5905080158015610408573d5f803e3d5ffd5b5060045490935061044657604051833f90610425602082016105e3565b601f1982820381018352601f90910116604052805160209190910120600455505b60405163485cc95560e01b81526001600160a01b038381166004830152828116602483015284169063485cc955906044015f604051808303815f87803b15801561048e575f80fd5b505af11580156104a0573d5f803e3d5ffd5b505050506001600160a01b038281165f8181526002602081815260408084208787168086529083528185208054978b166001600160a01b031998891681179091559383528185208686528352818520805488168517905560038054600181018255958190527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9095018054909716841790965592548351928352908201527f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9910160405180910390a3505092915050565b6001546001600160a01b031633146105c25760405162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b6044820152606401610226565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b6120c68061067483390190565b5f60208284031215610600575f80fd5b5035919050565b80356001600160a01b038116811461061d575f80fd5b919050565b5f60208284031215610632575f80fd5b61063b82610607565b9392505050565b5f8060408385031215610653575f80fd5b61065c83610607565b915061066a60208401610607565b9050925092905056fe60806040526001600c55348015610014575f80fd5b50604080518082018252600a8152692ab734b9bbb0b8102b1960b11b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527fbfcc8ef98ffbf7b6c3fec7bf5185b566b9863e35a9d83acd49ad6824b5969738918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120600355600580546001600160a01b03191633179055611fbb8061010b5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80636a627842116100f3578063ba9a7a5611610093578063d21220a71161006e578063d21220a7146103fc578063d505accf1461040f578063dd62ed3e14610422578063fff6cae91461044c575f80fd5b8063ba9a7a56146103cd578063bc25cf77146103d6578063c45a0155146103e9575f80fd5b80637ecebe00116100ce5780637ecebe001461034e57806389afcb441461036d57806395d89b4114610395578063a9059cbb146103ba575f80fd5b80636a6278421461031357806370a08231146103265780637464fc3d14610345575f80fd5b806323b872dd1161015e5780633644e515116101395780633644e515146102e5578063485cc955146102ee5780635909c0d5146103015780635a3d54931461030a575f80fd5b806323b872dd1461029157806330adf81f146102a4578063313ce567146102cb575f80fd5b8063022c0d9f146101a557806306fdde03146101ba5780630902f1ac146101f9578063095ea7b31461022d5780630dfe16811461025057806318160ddd1461027b575b5f80fd5b6101b86101b3366004611bbe565b610454565b005b6101e36040518060400160405280600a8152602001692ab734b9bbb0b8102b1960b11b81525081565b6040516101f09190611c4e565b60405180910390f35b610201610959565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101f0565b61024061023b366004611c83565b610983565b60405190151581526020016101f0565b600654610263906001600160a01b031681565b6040516001600160a01b0390911681526020016101f0565b6102835f5481565b6040519081526020016101f0565b61024061029f366004611cad565b610999565b6102837f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102d3601281565b60405160ff90911681526020016101f0565b61028360035481565b6101b86102fc366004611ceb565b610a10565b61028360095481565b610283600a5481565b610283610321366004611d22565b610a8f565b610283610334366004611d22565b60016020525f908152604090205481565b610283600b5481565b61028361035c366004611d22565b60046020525f908152604090205481565b61038061037b366004611d22565b610d4f565b604080519283526020830191909152016101f0565b6101e3604051806040016040528060068152602001652aa72496ab1960d11b81525081565b6102406103c8366004611c83565b6110a4565b6102836103e881565b6101b86103e4366004611d22565b6110b0565b600554610263906001600160a01b031681565b600754610263906001600160a01b031681565b6101b861041d366004611d3d565b6111c0565b610283610430366004611ceb565b600260209081525f928352604080842090915290825290205481565b6101b86113d0565b600c5460011461047f5760405162461bcd60e51b815260040161047690611dae565b60405180910390fd5b5f600c558415158061049057505f84115b6104ea5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056323a20494e53554646494349454e545f4f55545055545f416044820152641353d5539560da1b6064820152608401610476565b5f806104f4610959565b5091509150816001600160701b0316871080156105195750806001600160701b031686105b61056f5760405162461bcd60e51b815260206004820152602160248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152605960f81b6064820152608401610476565b6006546007545f9182916001600160a01b039182169190811690891682148015906105ac5750806001600160a01b0316896001600160a01b031614155b6105f05760405162461bcd60e51b8152602060048201526015602482015274556e697377617056323a20494e56414c49445f544f60581b6044820152606401610476565b8a1561060157610601828a8d6114ef565b891561061257610612818a8c6114ef565b861561067a576040516304347a1760e21b81526001600160a01b038a16906310d1e85c9061064c9033908f908f908e908e90600401611dd9565b5f604051808303815f87803b158015610663575f80fd5b505af1158015610675573d5f803e3d5ffd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156106bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e09190611e24565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610725573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107499190611e24565b925050505f89856001600160701b03166107639190611e4f565b831161076f575f61078c565b6107828a6001600160701b038716611e4f565b61078c9084611e4f565b90505f6107a28a6001600160701b038716611e4f565b83116107ae575f6107cb565b6107c18a6001600160701b038716611e4f565b6107cb9084611e4f565b90505f8211806107da57505f81115b6108325760405162461bcd60e51b8152602060048201526024808201527f556e697377617056323a20494e53554646494349454e545f494e5055545f414d60448201526313d5539560e21b6064820152608401610476565b5f61083e836003611e62565b61084a866103e8611e62565b6108549190611e4f565b90505f610862836003611e62565b61086e866103e8611e62565b6108789190611e4f565b90506108906001600160701b03808916908a16611e62565b61089d90620f4240611e62565b6108a78284611e62565b10156108e45760405162461bcd60e51b815260206004820152600c60248201526b556e697377617056323a204b60a01b6044820152606401610476565b50506108f284848888611605565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b5f61098f3384846117bc565b5060015b92915050565b6001600160a01b0383165f9081526002602090815260408083203384529091528120545f19146109fb576001600160a01b0384165f908152600260209081526040808320338452909152812080548492906109f5908490611e4f565b90915550505b610a0684848461181d565b5060019392505050565b6005546001600160a01b03163314610a615760405162461bcd60e51b81526020600482015260146024820152732ab734b9bbb0b82b191d102327a92124a22222a760611b6044820152606401610476565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b5f600c54600114610ab25760405162461bcd60e51b815260040161047690611dae565b5f600c81905580610ac1610959565b506006546040516370a0823160e01b81523060048201529294509092505f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b349190611e24565b6007546040516370a0823160e01b81523060048201529192505f916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba39190611e24565b90505f610bb96001600160701b03861684611e4f565b90505f610bcf6001600160701b03861684611e4f565b90505f610bdc87876118bc565b5f8054919250819003610c1b576103e8610bfe610bf98587611e62565b6119f0565b610c089190611e4f565b9850610c165f6103e8611a5e565b610c62565b610c5f6001600160701b038916610c328387611e62565b610c3c9190611e8d565b6001600160701b038916610c508487611e62565b610c5a9190611e8d565b611ae4565b98505b5f8911610cc25760405162461bcd60e51b815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152671657d3525395115160c21b6064820152608401610476565b610ccc8a8a611a5e565b610cd886868a8a611605565b8115610d0157600854610cfd906001600160701b03600160701b820481169116611e62565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b5f80600c54600114610d735760405162461bcd60e51b815260040161047690611dae565b5f600c81905580610d82610959565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b03908116929116905f9083906370a0823190602401602060405180830381865afa158015610dd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfd9190611e24565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e689190611e24565b305f90815260016020526040812054919250610e8488886118bc565b5f5490915080610e948685611e62565b610e9e9190611e8d565b9a5080610eab8585611e62565b610eb59190611e8d565b99505f8b118015610ec557505f8a115b610f225760405162461bcd60e51b815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c495155494449546044820152671657d0955493915160c21b6064820152608401610476565b610f2c3084611afb565b610f37878d8d6114ef565b610f42868d8c6114ef565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015610f84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa89190611e24565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a0823190602401602060405180830381865afa158015610fed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110119190611e24565b935061101f85858b8b611605565b811561104857600854611044906001600160701b03600160701b820481169116611e62565b600b555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b5f61098f33848461181d565b600c546001146110d25760405162461bcd60e51b815260040161047690611dae565b5f600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161116e91849186916001600160701b03169083906370a08231906024015b602060405180830381865afa15801561113b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115f9190611e24565b6111699190611e4f565b6114ef565b6008546040516370a0823160e01b81523060048201526111b69183918691600160701b90046001600160701b0316906001600160a01b038416906370a0823190602401611120565b50506001600c5550565b428410156112055760405162461bcd60e51b8152602060048201526012602482015271155b9a5cddd85c158c8e881156141254915160721b6044820152606401610476565b6003546001600160a01b0388165f90815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761125783611ea0565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016112d092919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611338573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061136e5750886001600160a01b0316816001600160a01b0316145b6113ba5760405162461bcd60e51b815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e4154555245000000006044820152606401610476565b6113c58989896117bc565b505050505050505050565b600c546001146113f25760405162461bcd60e51b815260040161047690611dae565b5f600c556006546040516370a0823160e01b81523060048201526114e8916001600160a01b0316906370a0823190602401602060405180830381865afa15801561143e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114629190611e24565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114cc9190611e24565b6008546001600160701b0380821691600160701b900416611605565b6001600c55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f9283929087169161154a9190611eb8565b5f604051808303815f865af19150503d805f8114611583576040519150601f19603f3d011682016040523d82523d5f602084013e611588565b606091505b50915091508180156115b25750805115806115b25750808060200190518101906115b29190611ece565b6115fe5760405162461bcd60e51b815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c45440000000000006044820152606401610476565b5050505050565b6001600160701b03841180159061162357506001600160701b038311155b6116655760405162461bcd60e51b8152602060048201526013602482015272556e697377617056323a204f564552464c4f5760681b6044820152606401610476565b5f61167564010000000042611eed565b60085490915063ffffffff600160e01b90910481168203908116158015906116a557506001600160701b03841615155b80156116b957506001600160701b03831615155b15611724578063ffffffff166116e1856116d286611b7b565b6001600160e01b031690611b93565b600980546001600160e01b03929092169290920201905563ffffffff811661170c846116d287611b7b565b600a80546001600160e01b0392909216929092020190555b506008805463ffffffff8316600160e01b026001600160e01b036001600160701b03888116600160701b9081026001600160e01b03199095168b83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a15050505050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383165f9081526001602052604081208054839290611844908490611e4f565b90915550506001600160a01b0382165f9081526001602052604081208054839290611870908490611f00565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181091815260200190565b5f8060055f9054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa15801561190e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119329190611f13565b600b546001600160a01b0382161580159450919250906119dd5780156119d8575f61196c610bf96001600160701b03808816908916611e62565b90505f611978836119f0565b9050808211156119d5575f61198d8284611e4f565b5f546119999190611e62565b90505f826119a8856005611e62565b6119b29190611f00565b90505f6119bf8284611e8d565b905080156119d1576119d18782611a5e565b5050505b50505b6119e8565b80156119e8575f600b555b505092915050565b5f6003821115611a4f5750805f611a08600283611e8d565b611a13906001611f00565b90505b81811015611a4957905080600281611a2e8186611e8d565b611a389190611f00565b611a429190611e8d565b9050611a16565b50919050565b8115611a59575060015b919050565b805f80828254611a6e9190611f00565b90915550506001600160a01b0382165f9081526001602052604081208054839290611a9a908490611f00565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b5f818310611af25781611af4565b825b9392505050565b6001600160a01b0382165f9081526001602052604081208054839290611b22908490611e4f565b92505081905550805f80828254611b399190611e4f565b90915550506040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611ad8565b5f610993600160701b6001600160701b038416611f2e565b5f611af46001600160701b03831684611f57565b6001600160a01b0381168114611bbb575f80fd5b50565b5f805f805f60808688031215611bd2575f80fd5b85359450602086013593506040860135611beb81611ba7565b9250606086013567ffffffffffffffff811115611c06575f80fd5b8601601f81018813611c16575f80fd5b803567ffffffffffffffff811115611c2c575f80fd5b886020828401011115611c3d575f80fd5b959894975092955050506020019190565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215611c94575f80fd5b8235611c9f81611ba7565b946020939093013593505050565b5f805f60608486031215611cbf575f80fd5b8335611cca81611ba7565b92506020840135611cda81611ba7565b929592945050506040919091013590565b5f8060408385031215611cfc575f80fd5b8235611d0781611ba7565b91506020830135611d1781611ba7565b809150509250929050565b5f60208284031215611d32575f80fd5b8135611af481611ba7565b5f805f805f805f60e0888a031215611d53575f80fd5b8735611d5e81611ba7565b96506020880135611d6e81611ba7565b95506040880135945060608801359350608088013560ff81168114611d91575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b602080825260119082015270155b9a5cddd85c158c8e881313d0d2d151607a1b604082015260600190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b5f60208284031215611e34575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561099357610993611e3b565b808202811582820484141761099357610993611e3b565b634e487b7160e01b5f52601260045260245ffd5b5f82611e9b57611e9b611e79565b500490565b5f60018201611eb157611eb1611e3b565b5060010190565b5f82518060208501845e5f920191825250919050565b5f60208284031215611ede575f80fd5b81518015158114611af4575f80fd5b5f82611efb57611efb611e79565b500690565b8082018082111561099357610993611e3b565b5f60208284031215611f23575f80fd5b8151611af481611ba7565b6001600160e01b038181168382168181029092169181830481148215176119e8576119e8611e3b565b5f6001600160e01b03831680611f6f57611f6f611e79565b6001600160e01b0392909216919091049291505056fea264697066735822122069d1969467da85f8f756cc7a7c482a637463ed92f069bd94fda33b627321e97664736f6c634300081a0033a2646970667358221220f043b5722358aa350058e37c4ad4710c83a4e9c018138f834344ac0e917a9ef364736f6c634300081a0033000000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d87 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_router_evm.hex b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_router_evm.hex new file mode 100644 index 000000000..0f0d75f42 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_bytecode/uniswapv2_router_evm.hex @@ -0,0 +1 @@ +60c0604052348015600e575f80fd5b5060405161410c38038061410c833981016040819052602b91605b565b6001600160a01b039182166080521660a0526087565b80516001600160a01b03811681146056575f80fd5b919050565b5f8060408385031215606b575f80fd5b6072836041565b9150607e602084016041565b90509250929050565b60805160a051613ef86102145f395f818161015a0152818161035a01528181610507015281816105560152818161060c0152818161082a01528181610b5201528181610c8a01528181610fcc015281816110ac01528181611155015281816111e3015281816112ff01528181611388015281816115c50152818161167b0152818161170701528181611782015281816117f201528181611c2201528181611e0401528181611e5901528181611e8d01528181611f1e015281816120510152818161216001526121e901525f818161041501528181610688015281816107580152818161090b0152818161094201528181610a3201528181610bce01528181610c6801528181610d970152818161125d015281816113ba015281816114fe0152818161182401528181611a3601528181611bd201528181611c0001528181611d1f01528181611e37015281816120cb0152818161221b01528181612ad901528181612b2901528181612de101528181612f7f015281816132ce0152818161336e01526133e10152613ef85ff3fe60806040526004361061014a575f3560e01c80638803dbee116100b3578063c45a01551161006d578063c45a015514610404578063d06ca61f14610437578063ded9382a14610456578063e8e3370014610475578063f305d719146104af578063fb3bdb41146104c2575f80fd5b80638803dbee1461032a578063ad5c464814610349578063ad615dec14610394578063af2979eb146103b3578063b6f9de95146103d2578063baa2abde146103e5575f80fd5b80634a25d94a116101045780634a25d94a1461027c5780635b0d59841461029b5780635c11d795146102ba578063791ac947146102d95780637ff36ab5146102f857806385f8c2591461030b575f80fd5b806302751cec1461018d578063054d50d4146101c657806318cbafe5146101f35780631f00ca741461021f5780632195995c1461023e57806338ed17391461025d575f80fd5b3661018957336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018757610187613580565b005b5f80fd5b348015610198575f80fd5b506101ac6101a73660046135bb565b6104d5565b604080519283526020830191909152015b60405180910390f35b3480156101d1575f80fd5b506101e56101e0366004613615565b6105cb565b6040519081526020016101bd565b3480156101fe575f80fd5b5061021261020d36600461367f565b6105df565b6040516101bd91906136ed565b34801561022a575f80fd5b50610212610239366004613743565b610904565b348015610249575f80fd5b506101ac610258366004613837565b61093a565b348015610268575f80fd5b5061021261027736600461367f565b610a0a565b348015610287575f80fd5b5061021261029636600461367f565b610b25565b3480156102a6575f80fd5b506101e56102b53660046138df565b610c61565b3480156102c5575f80fd5b506101876102d436600461367f565b610d46565b3480156102e4575f80fd5b506101876102f336600461367f565b610fa1565b610212610306366004613972565b6111be565b348015610316575f80fd5b506101e5610325366004613615565b6114ca565b348015610335575f80fd5b5061021261034436600461367f565b6114d6565b348015610354575f80fd5b5061037c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bd565b34801561039f575f80fd5b506101e56103ae366004613615565b611591565b3480156103be575f80fd5b506101e56103cd3660046135bb565b61159d565b6101876103e0366004613972565b6116e4565b3480156103f0575f80fd5b506101ac6103ff3660046139d4565b611a0d565b34801561040f575f80fd5b5061037c7f000000000000000000000000000000000000000000000000000000000000000081565b348015610442575f80fd5b50610212610451366004613743565b611bcb565b348015610461575f80fd5b506101ac6104703660046138df565b611bf8565b348015610480575f80fd5b5061049461048f366004613a42565b611ce2565b604080519384526020840192909252908201526060016101bd565b6104946104bd3660046135bb565b611dda565b6102126104d0366004613972565b61202c565b5f8082428110156105015760405162461bcd60e51b81526004016104f890613ab9565b60405180910390fd5b610530897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611a0d565b909350915061054089868561236b565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b15801561059f575f80fd5b505af11580156105b1573d5f803e3d5ffd5b505050506105bf8583612497565b50965096945050505050565b5f6105d7848484612572565b949350505050565b606081428110156106025760405162461bcd60e51b81526004016104f890613ab9565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610639600182613b04565b81811061064857610648613b17565b905060200201602081019061065d9190613b2b565b6001600160a01b0316146106835760405162461bcd60e51b81526004016104f890613b4d565b6106e07f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061264b92505050565b91508682600184516106f29190613b04565b8151811061070257610702613b17565b602002602001015110156107285760405162461bcd60e51b81526004016104f890613b84565b6107ea86865f81811061073d5761073d613b17565b90506020020160208101906107529190613b2b565b336107cb7f00000000000000000000000000000000000000000000000000000000000000008a8a5f81811061078957610789613b17565b905060200201602081019061079e9190613b2b565b8b8b60018181106107b1576107b1613b17565b90506020020160208101906107c69190613b2b565b6127c7565b855f815181106107dd576107dd613b17565b60200260200101516128c5565b610828828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152503092506129fe915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185516108669190613b04565b8151811061087657610876613b17565b60200260200101516040518263ffffffff1660e01b815260040161089c91815260200190565b5f604051808303815f87803b1580156108b3575f80fd5b505af11580156108c5573d5f803e3d5ffd5b505050506108f98483600185516108dc9190613b04565b815181106108ec576108ec613b17565b6020026020010151612497565b509695505050505050565b60606109317f00000000000000000000000000000000000000000000000000000000000000008484612bf1565b90505b92915050565b5f805f6109687f00000000000000000000000000000000000000000000000000000000000000008f8f6127c7565b90505f87610976578c610979565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906109b4903390309086908f908e908e908e90600401613bcf565b5f604051808303815f87803b1580156109cb575f80fd5b505af11580156109dd573d5f803e3d5ffd5b505050506109f08f8f8f8f8f8f8f611a0d565b809450819550505050509b509b9950505050505050505050565b60608142811015610a2d5760405162461bcd60e51b81526004016104f890613ab9565b610a8a7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061264b92505050565b9150868260018451610a9c9190613b04565b81518110610aac57610aac613b17565b60200260200101511015610ad25760405162461bcd60e51b81526004016104f890613b84565b610ae786865f81811061073d5761073d613b17565b6108f9828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129fe915050565b60608142811015610b485760405162461bcd60e51b81526004016104f890613ab9565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610b7f600182613b04565b818110610b8e57610b8e613b17565b9050602002016020810190610ba39190613b2b565b6001600160a01b031614610bc95760405162461bcd60e51b81526004016104f890613b4d565b610c267f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612bf192505050565b915086825f81518110610c3b57610c3b613b17565b602002602001015111156107285760405162461bcd60e51b81526004016104f890613c10565b5f80610cae7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006127c7565b90505f86610cbc578b610cbf565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610cfa903390309086908e908d908d908d90600401613bcf565b5f604051808303815f87803b158015610d11575f80fd5b505af1158015610d23573d5f803e3d5ffd5b50505050610d358d8d8d8d8d8d61159d565b9d9c50505050505050505050505050565b8042811015610d675760405162461bcd60e51b81526004016104f890613ab9565b610df685855f818110610d7c57610d7c613b17565b9050602002016020810190610d919190613b2b565b33610df07f000000000000000000000000000000000000000000000000000000000000000089895f818110610dc857610dc8613b17565b9050602002016020810190610ddd9190613b2b565b8a8a60018181106107b1576107b1613b17565b8a6128c5565b5f8585610e04600182613b04565b818110610e1357610e13613b17565b9050602002016020810190610e289190613b2b565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e929190613c57565b9050610ed18686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250612d70915050565b86818787610ee0600182613b04565b818110610eef57610eef613b17565b9050602002016020810190610f049190613b2b565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6f9190613c57565b610f799190613b04565b1015610f975760405162461bcd60e51b81526004016104f890613b84565b5050505050505050565b8042811015610fc25760405162461bcd60e51b81526004016104f890613ab9565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585610ff9600182613b04565b81811061100857611008613b17565b905060200201602081019061101d9190613b2b565b6001600160a01b0316146110435760405162461bcd60e51b81526004016104f890613b4d565b61105885855f818110610d7c57610d7c613b17565b6110958585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250612d70915050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156110f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111d9190613c57565b90508681101561113f5760405162461bcd60e51b81526004016104f890613b84565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b15801561119e575f80fd5b505af11580156111b0573d5f803e3d5ffd5b50505050610f978482612497565b606081428110156111e15760405162461bcd60e51b81526004016104f890613ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061121d5761121d613b17565b90506020020160208101906112329190613b2b565b6001600160a01b0316146112585760405162461bcd60e51b81526004016104f890613b4d565b6112b57f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061264b92505050565b91508682600184516112c79190613b04565b815181106112d7576112d7613b17565b602002602001015110156112fd5760405162461bcd60e51b81526004016104f890613b84565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0835f8151811061133e5761133e613b17565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b15801561136f575f80fd5b505af1158015611381573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6113eb7f000000000000000000000000000000000000000000000000000000000000000089895f818110610dc857610dc8613b17565b845f815181106113fd576113fd613b17565b60200260200101516040518363ffffffff1660e01b81526004016114369291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af1158015611452573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114769190613c6e565b61148257611482613580565b6114c0828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129fe915050565b5095945050505050565b5f6105d784848461302e565b606081428110156114f95760405162461bcd60e51b81526004016104f890613ab9565b6115567f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612bf192505050565b915086825f8151811061156b5761156b613b17565b60200260200101511115610ad25760405162461bcd60e51b81526004016104f890613c10565b5f6105d784848461310e565b5f81428110156115bf5760405162461bcd60e51b81526004016104f890613ab9565b6115ee887f00000000000000000000000000000000000000000000000000000000000000008989893089611a0d565b6040516370a0823160e01b81523060048201529093506116659150899086906001600160a01b038316906370a0823190602401602060405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116609190613c57565b61236b565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156116c4575f80fd5b505af11580156116d6573d5f803e3d5ffd5b505050506108f98483612497565b80428110156117055760405162461bcd60e51b81526004016104f890613ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685855f81811061174157611741613b17565b90506020020160208101906117569190613b2b565b6001600160a01b03161461177c5760405162461bcd60e51b81526004016104f890613b4d565b5f3490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b1580156117d9575f80fd5b505af11580156117eb573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118557f000000000000000000000000000000000000000000000000000000000000000089895f818110610dc857610dc8613b17565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af115801561189f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c39190613c6e565b6118cf576118cf613580565b5f86866118dd600182613b04565b8181106118ec576118ec613b17565b90506020020160208101906119019190613b2b565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611947573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196b9190613c57565b90506119aa8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250612d70915050565b878188886119b9600182613b04565b8181106119c8576119c8613b17565b90506020020160208101906119dd9190613b2b565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f30565b5f808242811015611a305760405162461bcd60e51b81526004016104f890613ab9565b5f611a5c7f00000000000000000000000000000000000000000000000000000000000000008c8c6127c7565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af1158015611aaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ad39190613c6e565b5060405163226bf2d160e21b81526001600160a01b0387811660048301525f9182918416906389afcb449060240160408051808303815f875af1158015611b1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b409190613c89565b915091505f611b4f8e8e6131ab565b509050806001600160a01b03168e6001600160a01b031614611b72578183611b75565b82825b90975095508a871015611b9a5760405162461bcd60e51b81526004016104f890613cab565b89861015611bba5760405162461bcd60e51b81526004016104f890613cf1565b505050505097509795505050505050565b60606109317f0000000000000000000000000000000000000000000000000000000000000000848461264b565b5f805f611c467f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006127c7565b90505f87611c54578c611c57565b5f195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611c92903390309086908f908e908e908e90600401613bcf565b5f604051808303815f87803b158015611ca9575f80fd5b505af1158015611cbb573d5f803e3d5ffd5b50505050611ccd8e8e8e8e8e8e6104d5565b909f909e509c50505050505050505050505050565b5f805f8342811015611d065760405162461bcd60e51b81526004016104f890613ab9565b611d148c8c8c8c8c8c6132a1565b90945092505f611d457f00000000000000000000000000000000000000000000000000000000000000008e8e6127c7565b9050611d538d3383886128c5565b611d5f8c3383876128c5565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af1158015611da4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc89190613c57565b92505050985098509895505050505050565b5f805f8342811015611dfe5760405162461bcd60e51b81526004016104f890613ab9565b611e2c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6132a1565b90945092505f611e7d7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006127c7565b9050611e8b8b3383886128c5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015611ee4575f80fd5b505af1158015611ef6573d5f803e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af1158015611f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8c9190613c6e565b611f9857611f98613580565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303815f875af1158015611fdd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120019190613c57565b92508334111561201e5761201e336120198634613b04565b612497565b505096509650969350505050565b6060814281101561204f5760405162461bcd60e51b81526004016104f890613ab9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686865f81811061208b5761208b613b17565b90506020020160208101906120a09190613b2b565b6001600160a01b0316146120c65760405162461bcd60e51b81526004016104f890613b4d565b6121237f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250612bf192505050565b915034825f8151811061213857612138613b17565b6020026020010151111561215e5760405162461bcd60e51b81526004016104f890613c10565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0835f8151811061219f5761219f613b17565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b1580156121d0575f80fd5b505af11580156121e2573d5f803e3d5ffd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61224c7f000000000000000000000000000000000000000000000000000000000000000089895f818110610dc857610dc8613b17565b845f8151811061225e5761225e613b17565b60200260200101516040518363ffffffff1660e01b81526004016122979291906001600160a01b03929092168252602082015260400190565b6020604051808303815f875af11580156122b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d79190613c6e565b6122e3576122e3613580565b612321828787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508992506129fe915050565b815f8151811061233357612333613b17565b60200260200101513411156114c0576114c033835f8151811061235857612358613b17565b6020026020010151346120199190613b04565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916123c69190613d37565b5f604051808303815f865af19150503d805f81146123ff576040519150601f19603f3d011682016040523d82523d5f602084013e612404565b606091505b509150915081801561242e57508051158061242e57508080602001905181019061242e9190613c6e565b6124905760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016104f8565b5050505050565b604080515f808252602082019092526001600160a01b0384169083906040516124c09190613d37565b5f6040518083038185875af1925050503d805f81146124fa576040519150601f19603f3d011682016040523d82523d5f602084013e6124ff565b606091505b505090508061256d5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016104f8565b505050565b5f8084116125d65760405162461bcd60e51b815260206004820152602b60248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960448201526a1394155517d05353d5539560aa1b60648201526084016104f8565b5f831180156125e457505f82115b6126005760405162461bcd60e51b81526004016104f890613d4d565b5f61260d856103e5613d95565b90505f61261a8483613d95565b90505f8261262a876103e8613d95565b6126349190613dac565b90506126408183613dbf565b979650505050505050565b606060028251101561269f5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f50415448000060448201526064016104f8565b815167ffffffffffffffff8111156126b9576126b961372f565b6040519080825280602002602001820160405280156126e2578160200160208202803683370190505b50905082815f815181106126f8576126f8613b17565b6020026020010181815250505f5b600183516127149190613b04565b8110156127bf575f806127668786858151811061273357612733613b17565b6020026020010151878660016127499190613dac565b8151811061275957612759613b17565b60200260200101516134bb565b9150915061278e84848151811061277f5761277f613b17565b60200260200101518383612572565b8461279a856001613dac565b815181106127aa576127aa613b17565b60209081029190910101525050600101612706565b509392505050565b5f805f6127d485856131ab565b915091505f866001600160a01b03166324e43f3d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612815573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128399190613c57565b604080516bffffffffffffffffffffffff19606096871b811660208084019190915295871b81166034830152825180830360280181526048830184528051908701206001600160f81b031960688401529a90961b9095166069860152607d850198909852609d808501919091528751808503909101815260bd9093019096528151910120949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f928392908816916129289190613d37565b5f604051808303815f865af19150503d805f8114612961576040519150601f19603f3d011682016040523d82523d5f602084013e612966565b606091505b50915091508180156129905750805115806129905750808060200190518101906129909190613c6e565b6129f65760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016104f8565b505050505050565b5f5b60018351612a0e9190613b04565b811015612beb575f80848381518110612a2957612a29613b17565b602002602001015185846001612a3f9190613dac565b81518110612a4f57612a4f613b17565b6020026020010151915091505f612a6683836131ab565b5090505f87612a76866001613dac565b81518110612a8657612a86613b17565b602002602001015190505f80836001600160a01b0316866001600160a01b031614612ab257825f612ab5565b5f835b915091505f60028a51612ac89190613b04565b8810612ad45788612b22565b612b227f0000000000000000000000000000000000000000000000000000000000000000878c612b058c6002613dac565b81518110612b1557612b15613b17565b60200260200101516127c7565b9050612b4f7f000000000000000000000000000000000000000000000000000000000000000088886127c7565b6001600160a01b031663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015612b8b576020820181803683370190505b506040518563ffffffff1660e01b8152600401612bab9493929190613dde565b5f604051808303815f87803b158015612bc2575f80fd5b505af1158015612bd4573d5f803e3d5ffd5b505060019099019850612a00975050505050505050565b50505050565b6060600282511015612c455760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f50415448000060448201526064016104f8565b815167ffffffffffffffff811115612c5f57612c5f61372f565b604051908082528060200260200182016040528015612c88578160200160208202803683370190505b509050828160018351612c9b9190613b04565b81518110612cab57612cab613b17565b6020026020010181815250505f60018351612cc69190613b04565b90505b80156127bf575f80612d0b8786612ce1600187613b04565b81518110612cf157612cf1613b17565b602002602001015187868151811061275957612759613b17565b91509150612d33848481518110612d2457612d24613b17565b6020026020010151838361302e565b84612d3f600186613b04565b81518110612d4f57612d4f613b17565b60200260200101818152505050508080612d6890613e30565b915050612cc9565b5f5b60018351612d809190613b04565b81101561256d575f80848381518110612d9b57612d9b613b17565b602002602001015185846001612db19190613dac565b81518110612dc157612dc1613b17565b6020026020010151915091505f612dd883836131ab565b5090505f612e077f000000000000000000000000000000000000000000000000000000000000000085856127c7565b90505f805f80846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612e49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e6d9190613e5b565b506001600160701b031691506001600160701b031691505f80876001600160a01b03168a6001600160a01b031614612ea6578284612ea9565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015612ef5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f199190613c57565b612f239190613b04565b9550612f30868383612572565b9450505050505f80856001600160a01b0316886001600160a01b031614612f5857825f612f5b565b5f835b915091505f60028c51612f6e9190613b04565b8a10612f7a578a612fab565b612fab7f0000000000000000000000000000000000000000000000000000000000000000898e612b058e6002613dac565b604080515f8152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90612fec9086908690869060248101613dde565b5f604051808303815f87803b158015613003575f80fd5b505af1158015613015573d5f803e3d5ffd5b50506001909b019a50612d729950505050505050505050565b5f8084116130935760405162461bcd60e51b815260206004820152602c60248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60448201526b155514155517d05353d5539560a21b60648201526084016104f8565b5f831180156130a157505f82115b6130bd5760405162461bcd60e51b81526004016104f890613d4d565b5f6130c88585613d95565b6130d4906103e8613d95565b90505f6130e18685613b04565b6130ed906103e5613d95565b90506130f98183613dbf565b613104906001613dac565b9695505050505050565b5f80841161316c5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a20494e53554646494349454e545f416044820152641353d5539560da1b60648201526084016104f8565b5f8311801561317a57505f82115b6131965760405162461bcd60e51b81526004016104f890613d4d565b826131a18386613d95565b6105d79190613dbf565b5f80826001600160a01b0316846001600160a01b03160361321c5760405162461bcd60e51b815260206004820152602560248201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604482015264455353455360d81b60648201526084016104f8565b826001600160a01b0316846001600160a01b03161061323c57828461323f565b83835b90925090506001600160a01b03821661329a5760405162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f41444452455353000060448201526064016104f8565b9250929050565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015613315573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133399190613ea7565b6001600160a01b0316036133da576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af11580156133b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d89190613ea7565b505b5f806134077f00000000000000000000000000000000000000000000000000000000000000008b8b6134bb565b91509150815f148015613418575080155b15613428578793508692506134ae565b5f61343489848461310e565b9050878111613468578581101561345d5760405162461bcd60e51b81526004016104f890613cf1565b8894509250826134ac565b5f61347489848661310e565b90508981111561348657613486613580565b878110156134a65760405162461bcd60e51b81526004016104f890613cab565b94508793505b505b5050965096945050505050565b5f805f6134c885856131ab565b5090505f806134d88888886127c7565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613513573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135379190613e5b565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461356e578082613571565b81815b90999098509650505050505050565b634e487b7160e01b5f52600160045260245ffd5b6001600160a01b03811681146135a8575f80fd5b50565b80356135b681613594565b919050565b5f805f805f8060c087890312156135d0575f80fd5b86356135db81613594565b9550602087013594506040870135935060608701359250608087013561360081613594565b9598949750929591949360a090920135925050565b5f805f60608486031215613627575f80fd5b505081359360208301359350604090920135919050565b5f8083601f84011261364e575f80fd5b50813567ffffffffffffffff811115613665575f80fd5b6020830191508360208260051b850101111561329a575f80fd5b5f805f805f8060a08789031215613694575f80fd5b8635955060208701359450604087013567ffffffffffffffff8111156136b8575f80fd5b6136c489828a0161363e565b90955093505060608701356136d881613594565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b81811015613724578351835260209384019390920191600101613706565b509095945050505050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215613754575f80fd5b82359150602083013567ffffffffffffffff811115613771575f80fd5b8301601f81018513613781575f80fd5b803567ffffffffffffffff81111561379b5761379b61372f565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156137c8576137c861372f565b6040529182526020818401810192908101888411156137e5575f80fd5b6020850194505b8385101561380b576137fd856135ab565b8152602094850194016137ec565b50809450505050509250929050565b80151581146135a8575f80fd5b803560ff811681146135b6575f80fd5b5f805f805f805f805f805f6101608c8e031215613852575f80fd5b8b3561385d81613594565b9a5060208c013561386d81613594565b995060408c0135985060608c0135975060808c0135965060a08c013561389281613594565b955060c08c0135945060e08c01356138a98161381a565b93506138b86101008d01613827565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b5f805f805f805f805f806101408b8d0312156138f9575f80fd5b8a3561390481613594565b995060208b0135985060408b0135975060608b0135965060808b013561392981613594565b955060a08b0135945060c08b01356139408161381a565b935061394e60e08c01613827565b999c989b509699959894979396509194610100810135936101209091013592509050565b5f805f805f60808688031215613986575f80fd5b85359450602086013567ffffffffffffffff8111156139a3575f80fd5b6139af8882890161363e565b90955093505060408601356139c381613594565b949793965091946060013592915050565b5f805f805f805f60e0888a0312156139ea575f80fd5b87356139f581613594565b96506020880135613a0581613594565b955060408801359450606088013593506080880135925060a0880135613a2a81613594565b96999598509396929591949193505060c09091013590565b5f805f805f805f80610100898b031215613a5a575f80fd5b8835613a6581613594565b97506020890135613a7581613594565b965060408901359550606089013594506080890135935060a0890135925060c0890135613aa181613594565b979a969950949793969295919450919260e001359150565b60208082526018908201527f556e69737761705632526f757465723a20455850495245440000000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561093457610934613af0565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613b3b575f80fd5b8135613b4681613594565b9392505050565b6020808252601d908201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604082015260600190565b6020808252602b908201527f556e69737761705632526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b60208082526027908201527f556e69737761705632526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b5f60208284031215613c67575f80fd5b5051919050565b5f60208284031215613c7e575f80fd5b8151613b468161381a565b5f8060408385031215613c9a575f80fd5b505080516020909101519092909150565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b5f82518060208501845e5f920191825250919050565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b808202811582820484141761093457610934613af0565b8082018082111561093457610934613af0565b5f82613dd957634e487b7160e01b5f52601260045260245ffd5b500490565b84815283602082015260018060a01b0383166040820152608060608201525f8251806080840152806020850160a085015e5f60a0828501015260a0601f19601f83011684010191505095945050505050565b5f81613e3e57613e3e613af0565b505f190190565b80516001600160701b03811681146135b6575f80fd5b5f805f60608486031215613e6d575f80fd5b613e7684613e45565b9250613e8460208501613e45565b9150604084015163ffffffff81168114613e9c575f80fd5b809150509250925092565b5f60208284031215613eb7575f80fd5b8151613b468161359456fea2646970667358221220e1d62e9f297d0d6dc4d16e0561b9d688918afc9533c6589f3c301321cf03537c64736f6c634300081a0033000000000000000000000000b88de88b35ecbf3c141e3caae2baf35834d18f630000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.sol new file mode 100644 index 000000000..cb07d41a6 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.8.0; + +contract counter{ + + uint public count; + + function increase() public { + count++; + } + + function decrease() public{ + count--; + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.wasm new file mode 100644 index 000000000..38e305b48 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/counter/counter.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b29927a5dbe715f4d95685ffdd6efb7f0232b98a2de08bff101f27671103c858 +size 7233 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Errors.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Errors.sol new file mode 100644 index 000000000..442fc1892 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Errors.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Collection of common custom errors used in multiple contracts + * + * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. + * It is recommended to avoid relying on the error API for critical functionality. + * + * _Available since v5.1._ + */ +library Errors { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error InsufficientBalance(uint256 balance, uint256 needed); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedCall(); + + /** + * @dev The deployment failed. + */ + error FailedDeployment(); + + /** + * @dev A necessary precompile is missing. + */ + error MissingPrecompile(address); +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Math.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Math.sol new file mode 100644 index 000000000..7a4fe2b63 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Math.sol @@ -0,0 +1,749 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol) + +pragma solidity ^0.8.20; + +import {Panic} from "./Panic.sol"; +import {SafeCast} from "./SafeCast.sol"; + +/** + * @dev Standard math utilities missing in the Solidity language. + */ +library Math { + enum Rounding { + Floor, // Toward negative infinity + Ceil, // Toward positive infinity + Trunc, // Toward zero + Expand // Away from zero + } + + /** + * @dev Return the 512-bit addition of two uint256. + * + * The result is stored in two 256 variables such that sum = high * 2²⁵⁶ + low. + */ + function add512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) { + assembly ("memory-safe") { + low := add(a, b) + high := lt(low, a) + } + } + + /** + * @dev Return the 512-bit multiplication of two uint256. + * + * The result is stored in two 256 variables such that product = high * 2²⁵⁶ + low. + */ + function mul512(uint256 a, uint256 b) internal pure returns (uint256 high, uint256 low) { + // 512-bit multiply [high low] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use + // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 + // variables such that product = high * 2²⁵⁶ + low. + assembly ("memory-safe") { + let mm := mulmod(a, b, not(0)) + low := mul(a, b) + high := sub(sub(mm, low), lt(mm, low)) + } + } + + /** + * @dev Returns the addition of two unsigned integers, with a success flag (no overflow). + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { + unchecked { + uint256 c = a + b; + success = c >= a; + result = c * SafeCast.toUint(success); + } + } + + /** + * @dev Returns the subtraction of two unsigned integers, with a success flag (no overflow). + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { + unchecked { + uint256 c = a - b; + success = c <= a; + result = c * SafeCast.toUint(success); + } + } + + /** + * @dev Returns the multiplication of two unsigned integers, with a success flag (no overflow). + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { + unchecked { + uint256 c = a * b; + assembly ("memory-safe") { + // Only true when the multiplication doesn't overflow + // (c / a == b) || (a == 0) + success := or(eq(div(c, a), b), iszero(a)) + } + // equivalent to: success ? c : 0 + result = c * SafeCast.toUint(success); + } + } + + /** + * @dev Returns the division of two unsigned integers, with a success flag (no division by zero). + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { + unchecked { + success = b > 0; + assembly ("memory-safe") { + // The `DIV` opcode returns zero when the denominator is 0. + result := div(a, b) + } + } + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero). + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) { + unchecked { + success = b > 0; + assembly ("memory-safe") { + // The `MOD` opcode returns zero when the denominator is 0. + result := mod(a, b) + } + } + } + + /** + * @dev Unsigned saturating addition, bounds to `2²⁵⁶ - 1` instead of overflowing. + */ + function saturatingAdd(uint256 a, uint256 b) internal pure returns (uint256) { + (bool success, uint256 result) = tryAdd(a, b); + return ternary(success, result, type(uint256).max); + } + + /** + * @dev Unsigned saturating subtraction, bounds to zero instead of overflowing. + */ + function saturatingSub(uint256 a, uint256 b) internal pure returns (uint256) { + (, uint256 result) = trySub(a, b); + return result; + } + + /** + * @dev Unsigned saturating multiplication, bounds to `2²⁵⁶ - 1` instead of overflowing. + */ + function saturatingMul(uint256 a, uint256 b) internal pure returns (uint256) { + (bool success, uint256 result) = tryMul(a, b); + return ternary(success, result, type(uint256).max); + } + + /** + * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant. + * + * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone. + * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute + * one branch when needed, making this function more expensive. + */ + function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) { + unchecked { + // branchless ternary works because: + // b ^ (a ^ b) == a + // b ^ 0 == b + return b ^ ((a ^ b) * SafeCast.toUint(condition)); + } + } + + /** + * @dev Returns the largest of two numbers. + */ + function max(uint256 a, uint256 b) internal pure returns (uint256) { + return ternary(a > b, a, b); + } + + /** + * @dev Returns the smallest of two numbers. + */ + function min(uint256 a, uint256 b) internal pure returns (uint256) { + return ternary(a < b, a, b); + } + + /** + * @dev Returns the average of two numbers. The result is rounded towards + * zero. + */ + function average(uint256 a, uint256 b) internal pure returns (uint256) { + // (a + b) / 2 can overflow. + return (a & b) + (a ^ b) / 2; + } + + /** + * @dev Returns the ceiling of the division of two numbers. + * + * This differs from standard division with `/` in that it rounds towards infinity instead + * of rounding towards zero. + */ + function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { + if (b == 0) { + // Guarantee the same behavior as in a regular Solidity division. + Panic.panic(Panic.DIVISION_BY_ZERO); + } + + // The following calculation ensures accurate ceiling division without overflow. + // Since a is non-zero, (a - 1) / b will not overflow. + // The largest possible result occurs when (a - 1) / b is type(uint256).max, + // but the largest value we can obtain is type(uint256).max - 1, which happens + // when a = type(uint256).max and b = 1. + unchecked { + return SafeCast.toUint(a > 0) * ((a - 1) / b + 1); + } + } + + /** + * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or + * denominator == 0. + * + * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by + * Uniswap Labs also under MIT license. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + (uint256 high, uint256 low) = mul512(x, y); + + // Handle non-overflow cases, 256 by 256 division. + if (high == 0) { + // Solidity will revert if denominator == 0, unlike the div opcode on its own. + // The surrounding unchecked block does not change this fact. + // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. + return low / denominator; + } + + // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0. + if (denominator <= high) { + Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW)); + } + + /////////////////////////////////////////////// + // 512 by 256 division. + /////////////////////////////////////////////// + + // Make division exact by subtracting the remainder from [high low]. + uint256 remainder; + assembly ("memory-safe") { + // Compute remainder using mulmod. + remainder := mulmod(x, y, denominator) + + // Subtract 256 bit number from 512 bit number. + high := sub(high, gt(remainder, low)) + low := sub(low, remainder) + } + + // Factor powers of two out of denominator and compute largest power of two divisor of denominator. + // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. + + uint256 twos = denominator & (0 - denominator); + assembly ("memory-safe") { + // Divide denominator by twos. + denominator := div(denominator, twos) + + // Divide [high low] by twos. + low := div(low, twos) + + // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one. + twos := add(div(sub(0, twos), twos), 1) + } + + // Shift in bits from high into low. + low |= high * twos; + + // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such + // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for + // four bits. That is, denominator * inv ≡ 1 mod 2⁴. + uint256 inverse = (3 * denominator) ^ 2; + + // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also + // works in modular arithmetic, doubling the correct bits in each step. + inverse *= 2 - denominator * inverse; // inverse mod 2⁸ + inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶ + inverse *= 2 - denominator * inverse; // inverse mod 2³² + inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴ + inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸ + inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶ + + // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. + // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is + // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and high + // is no longer required. + result = low * inverse; + return result; + } + } + + /** + * @dev Calculates x * y / denominator with full precision, following the selected rounding direction. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { + return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0); + } + + /** + * @dev Calculates floor(x * y >> n) with full precision. Throws if result overflows a uint256. + */ + function mulShr(uint256 x, uint256 y, uint8 n) internal pure returns (uint256 result) { + unchecked { + (uint256 high, uint256 low) = mul512(x, y); + if (high >= 1 << n) { + Panic.panic(Panic.UNDER_OVERFLOW); + } + return (high << (256 - n)) | (low >> n); + } + } + + /** + * @dev Calculates x * y >> n with full precision, following the selected rounding direction. + */ + function mulShr(uint256 x, uint256 y, uint8 n, Rounding rounding) internal pure returns (uint256) { + return mulShr(x, y, n) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, 1 << n) > 0); + } + + /** + * @dev Calculate the modular multiplicative inverse of a number in Z/nZ. + * + * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0. + * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible. + * + * If the input value is not inversible, 0 is returned. + * + * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the + * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}. + */ + function invMod(uint256 a, uint256 n) internal pure returns (uint256) { + unchecked { + if (n == 0) return 0; + + // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version) + // Used to compute integers x and y such that: ax + ny = gcd(a, n). + // When the gcd is 1, then the inverse of a modulo n exists and it's x. + // ax + ny = 1 + // ax = 1 + (-y)n + // ax ≡ 1 (mod n) # x is the inverse of a modulo n + + // If the remainder is 0 the gcd is n right away. + uint256 remainder = a % n; + uint256 gcd = n; + + // Therefore the initial coefficients are: + // ax + ny = gcd(a, n) = n + // 0a + 1n = n + int256 x = 0; + int256 y = 1; + + while (remainder != 0) { + uint256 quotient = gcd / remainder; + + (gcd, remainder) = ( + // The old remainder is the next gcd to try. + remainder, + // Compute the next remainder. + // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd + // where gcd is at most n (capped to type(uint256).max) + gcd - remainder * quotient + ); + + (x, y) = ( + // Increment the coefficient of a. + y, + // Decrement the coefficient of n. + // Can overflow, but the result is casted to uint256 so that the + // next value of y is "wrapped around" to a value between 0 and n - 1. + x - y * int256(quotient) + ); + } + + if (gcd != 1) return 0; // No inverse exists. + return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative. + } + } + + /** + * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`. + * + * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is + * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that + * `a**(p-2)` is the modular multiplicative inverse of a in Fp. + * + * NOTE: this function does NOT check that `p` is a prime greater than `2`. + */ + function invModPrime(uint256 a, uint256 p) internal view returns (uint256) { + unchecked { + return Math.modExp(a, p - 2, p); + } + } + + /** + * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m) + * + * Requirements: + * - modulus can't be zero + * - underlying staticcall to precompile must succeed + * + * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make + * sure the chain you're using it on supports the precompiled contract for modular exponentiation + * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, + * the underlying function will succeed given the lack of a revert, but the result may be incorrectly + * interpreted as 0. + */ + function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) { + (bool success, uint256 result) = tryModExp(b, e, m); + if (!success) { + Panic.panic(Panic.DIVISION_BY_ZERO); + } + return result; + } + + /** + * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m). + * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying + * to operate modulo 0 or if the underlying precompile reverted. + * + * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain + * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in + * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack + * of a revert, but the result may be incorrectly interpreted as 0. + */ + function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) { + if (m == 0) return (false, 0); + assembly ("memory-safe") { + let ptr := mload(0x40) + // | Offset | Content | Content (Hex) | + // |-----------|------------|--------------------------------------------------------------------| + // | 0x00:0x1f | size of b | 0x0000000000000000000000000000000000000000000000000000000000000020 | + // | 0x20:0x3f | size of e | 0x0000000000000000000000000000000000000000000000000000000000000020 | + // | 0x40:0x5f | size of m | 0x0000000000000000000000000000000000000000000000000000000000000020 | + // | 0x60:0x7f | value of b | 0x<.............................................................b> | + // | 0x80:0x9f | value of e | 0x<.............................................................e> | + // | 0xa0:0xbf | value of m | 0x<.............................................................m> | + mstore(ptr, 0x20) + mstore(add(ptr, 0x20), 0x20) + mstore(add(ptr, 0x40), 0x20) + mstore(add(ptr, 0x60), b) + mstore(add(ptr, 0x80), e) + mstore(add(ptr, 0xa0), m) + + // Given the result < m, it's guaranteed to fit in 32 bytes, + // so we can use the memory scratch space located at offset 0. + success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20) + result := mload(0x00) + } + } + + /** + * @dev Variant of {modExp} that supports inputs of arbitrary length. + */ + function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) { + (bool success, bytes memory result) = tryModExp(b, e, m); + if (!success) { + Panic.panic(Panic.DIVISION_BY_ZERO); + } + return result; + } + + /** + * @dev Variant of {tryModExp} that supports inputs of arbitrary length. + */ + function tryModExp( + bytes memory b, + bytes memory e, + bytes memory m + ) internal view returns (bool success, bytes memory result) { + if (_zeroBytes(m)) return (false, new bytes(0)); + + uint256 mLen = m.length; + + // Encode call args in result and move the free memory pointer + result = abi.encodePacked(b.length, e.length, mLen, b, e, m); + + assembly ("memory-safe") { + let dataPtr := add(result, 0x20) + // Write result on top of args to avoid allocating extra memory. + success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen) + // Overwrite the length. + // result.length > returndatasize() is guaranteed because returndatasize() == m.length + mstore(result, mLen) + // Set the memory pointer after the returned data. + mstore(0x40, add(dataPtr, mLen)) + } + } + + /** + * @dev Returns whether the provided byte array is zero. + */ + function _zeroBytes(bytes memory byteArray) private pure returns (bool) { + for (uint256 i = 0; i < byteArray.length; ++i) { + if (byteArray[i] != 0) { + return false; + } + } + return true; + } + + /** + * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded + * towards zero. + * + * This method is based on Newton's method for computing square roots; the algorithm is restricted to only + * using integer operations. + */ + function sqrt(uint256 a) internal pure returns (uint256) { + unchecked { + // Take care of easy edge cases when a == 0 or a == 1 + if (a <= 1) { + return a; + } + + // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a + // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between + // the current value as `ε_n = | x_n - sqrt(a) |`. + // + // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root + // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is + // bigger than any uint256. + // + // By noticing that + // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)` + // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar + // to the msb function. + uint256 aa = a; + uint256 xn = 1; + + if (aa >= (1 << 128)) { + aa >>= 128; + xn <<= 64; + } + if (aa >= (1 << 64)) { + aa >>= 64; + xn <<= 32; + } + if (aa >= (1 << 32)) { + aa >>= 32; + xn <<= 16; + } + if (aa >= (1 << 16)) { + aa >>= 16; + xn <<= 8; + } + if (aa >= (1 << 8)) { + aa >>= 8; + xn <<= 4; + } + if (aa >= (1 << 4)) { + aa >>= 4; + xn <<= 2; + } + if (aa >= (1 << 2)) { + xn <<= 1; + } + + // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1). + // + // We can refine our estimation by noticing that the middle of that interval minimizes the error. + // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2). + // This is going to be our x_0 (and ε_0) + xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2) + + // From here, Newton's method give us: + // x_{n+1} = (x_n + a / x_n) / 2 + // + // One should note that: + // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a + // = ((x_n² + a) / (2 * x_n))² - a + // = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a + // = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²) + // = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²) + // = (x_n² - a)² / (2 * x_n)² + // = ((x_n² - a) / (2 * x_n))² + // ≥ 0 + // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n + // + // This gives us the proof of quadratic convergence of the sequence: + // ε_{n+1} = | x_{n+1} - sqrt(a) | + // = | (x_n + a / x_n) / 2 - sqrt(a) | + // = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) | + // = | (x_n - sqrt(a))² / (2 * x_n) | + // = | ε_n² / (2 * x_n) | + // = ε_n² / | (2 * x_n) | + // + // For the first iteration, we have a special case where x_0 is known: + // ε_1 = ε_0² / | (2 * x_0) | + // ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2))) + // ≤ 2**(2*e-4) / (3 * 2**(e-1)) + // ≤ 2**(e-3) / 3 + // ≤ 2**(e-3-log2(3)) + // ≤ 2**(e-4.5) + // + // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n: + // ε_{n+1} = ε_n² / | (2 * x_n) | + // ≤ (2**(e-k))² / (2 * 2**(e-1)) + // ≤ 2**(2*e-2*k) / 2**e + // ≤ 2**(e-2*k) + xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5) -- special case, see above + xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9) -- general case with k = 4.5 + xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18) -- general case with k = 9 + xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36) -- general case with k = 18 + xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72) -- general case with k = 36 + xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144) -- general case with k = 72 + + // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision + // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either + // sqrt(a) or sqrt(a) + 1. + return xn - SafeCast.toUint(xn > a / xn); + } + } + + /** + * @dev Calculates sqrt(a), following the selected rounding direction. + */ + function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = sqrt(a); + return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a); + } + } + + /** + * @dev Return the log in base 2 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log2(uint256 x) internal pure returns (uint256 r) { + // If value has upper 128 bits set, log2 result is at least 128 + r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7; + // If upper 64 bits of 128-bit half set, add 64 to result + r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6; + // If upper 32 bits of 64-bit half set, add 32 to result + r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5; + // If upper 16 bits of 32-bit half set, add 16 to result + r |= SafeCast.toUint((x >> r) > 0xffff) << 4; + // If upper 8 bits of 16-bit half set, add 8 to result + r |= SafeCast.toUint((x >> r) > 0xff) << 3; + // If upper 4 bits of 8-bit half set, add 4 to result + r |= SafeCast.toUint((x >> r) > 0xf) << 2; + + // Shifts value right by the current result and use it as an index into this lookup table: + // + // | x (4 bits) | index | table[index] = MSB position | + // |------------|---------|-----------------------------| + // | 0000 | 0 | table[0] = 0 | + // | 0001 | 1 | table[1] = 0 | + // | 0010 | 2 | table[2] = 1 | + // | 0011 | 3 | table[3] = 1 | + // | 0100 | 4 | table[4] = 2 | + // | 0101 | 5 | table[5] = 2 | + // | 0110 | 6 | table[6] = 2 | + // | 0111 | 7 | table[7] = 2 | + // | 1000 | 8 | table[8] = 3 | + // | 1001 | 9 | table[9] = 3 | + // | 1010 | 10 | table[10] = 3 | + // | 1011 | 11 | table[11] = 3 | + // | 1100 | 12 | table[12] = 3 | + // | 1101 | 13 | table[13] = 3 | + // | 1110 | 14 | table[14] = 3 | + // | 1111 | 15 | table[15] = 3 | + // + // The lookup table is represented as a 32-byte value with the MSB positions for 0-15 in the last 16 bytes. + assembly ("memory-safe") { + r := or(r, byte(shr(r, x), 0x0000010102020202030303030303030300000000000000000000000000000000)) + } + } + + /** + * @dev Return the log in base 2, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log2(value); + return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value); + } + } + + /** + * @dev Return the log in base 10 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log10(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >= 10 ** 64) { + value /= 10 ** 64; + result += 64; + } + if (value >= 10 ** 32) { + value /= 10 ** 32; + result += 32; + } + if (value >= 10 ** 16) { + value /= 10 ** 16; + result += 16; + } + if (value >= 10 ** 8) { + value /= 10 ** 8; + result += 8; + } + if (value >= 10 ** 4) { + value /= 10 ** 4; + result += 4; + } + if (value >= 10 ** 2) { + value /= 10 ** 2; + result += 2; + } + if (value >= 10 ** 1) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 10, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log10(value); + return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value); + } + } + + /** + * @dev Return the log in base 256 of a positive value rounded towards zero. + * Returns 0 if given 0. + * + * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. + */ + function log256(uint256 x) internal pure returns (uint256 r) { + // If value has upper 128 bits set, log2 result is at least 128 + r = SafeCast.toUint(x > 0xffffffffffffffffffffffffffffffff) << 7; + // If upper 64 bits of 128-bit half set, add 64 to result + r |= SafeCast.toUint((x >> r) > 0xffffffffffffffff) << 6; + // If upper 32 bits of 64-bit half set, add 32 to result + r |= SafeCast.toUint((x >> r) > 0xffffffff) << 5; + // If upper 16 bits of 32-bit half set, add 16 to result + r |= SafeCast.toUint((x >> r) > 0xffff) << 4; + // Add 1 if upper 8 bits of 16-bit half set, and divide accumulated result by 8 + return (r >> 3) | SafeCast.toUint((x >> r) > 0xff); + } + + /** + * @dev Return the log in base 256, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log256(value); + return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value); + } + } + + /** + * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. + */ + function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { + return uint8(rounding) % 2 == 1; + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/P256.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/P256.sol new file mode 100644 index 000000000..4e14aab37 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/P256.sol @@ -0,0 +1,370 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/P256.sol) +pragma solidity ^0.8.20; + +import {Math} from "./Math.sol"; +import {Errors} from "./Errors.sol"; + +/** + * @dev Implementation of secp256r1 verification and recovery functions. + * + * The secp256r1 curve (also known as P256) is a NIST standard curve with wide support in modern devices + * and cryptographic standards. Some notable examples include Apple's Secure Enclave and Android's Keystore + * as well as authentication protocols like FIDO2. + * + * Based on the original https://github.com/itsobvioustech/aa-passkeys-wallet/blob/d3d423f28a4d8dfcb203c7fa0c47f42592a7378e/src/Secp256r1.sol[implementation of itsobvioustech] (GNU General Public License v3.0). + * Heavily inspired in https://github.com/maxrobot/elliptic-solidity/blob/c4bb1b6e8ae89534d8db3a6b3a6b52219100520f/contracts/Secp256r1.sol[maxrobot] and + * https://github.com/tdrerup/elliptic-curve-solidity/blob/59a9c25957d4d190eff53b6610731d81a077a15e/contracts/curves/EllipticCurve.sol[tdrerup] implementations. + * + * _Available since v5.1._ + */ +library P256 { + struct JPoint { + uint256 x; + uint256 y; + uint256 z; + } + + /// @dev Generator (x component) + uint256 internal constant GX = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296; + /// @dev Generator (y component) + uint256 internal constant GY = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5; + /// @dev P (size of the field) + uint256 internal constant P = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF; + /// @dev N (order of G) + uint256 internal constant N = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; + /// @dev A parameter of the weierstrass equation + uint256 internal constant A = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC; + /// @dev B parameter of the weierstrass equation + uint256 internal constant B = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B; + + /// @dev (P + 1) / 4. Useful to compute sqrt + uint256 private constant P1DIV4 = 0x3fffffffc0000000400000000000000000000000400000000000000000000000; + + /// @dev N/2 for excluding higher order `s` values + uint256 private constant HALF_N = 0x7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8; + + /** + * @dev Verifies a secp256r1 signature using the RIP-7212 precompile and falls back to the Solidity implementation + * if the precompile is not available. This version should work on all chains, but requires the deployment of more + * bytecode. + * + * @param h - hashed message + * @param r - signature half R + * @param s - signature half S + * @param qx - public key coordinate X + * @param qy - public key coordinate Y + * + * IMPORTANT: This function disallows signatures where the `s` value is above `N/2` to prevent malleability. + * To flip the `s` value, compute `s = N - s`. + */ + function verify(bytes32 h, bytes32 r, bytes32 s, bytes32 qx, bytes32 qy) internal view returns (bool) { + (bool valid, bool supported) = _tryVerifyNative(h, r, s, qx, qy); + return supported ? valid : verifySolidity(h, r, s, qx, qy); + } + + /** + * @dev Same as {verify}, but it will revert if the required precompile is not available. + * + * Make sure any logic (code or precompile) deployed at that address is the expected one, + * otherwise the returned value may be misinterpreted as a positive boolean. + */ + function verifyNative(bytes32 h, bytes32 r, bytes32 s, bytes32 qx, bytes32 qy) internal view returns (bool) { + (bool valid, bool supported) = _tryVerifyNative(h, r, s, qx, qy); + if (supported) { + return valid; + } else { + revert Errors.MissingPrecompile(address(0x100)); + } + } + + /** + * @dev Same as {verify}, but it will return false if the required precompile is not available. + */ + function _tryVerifyNative( + bytes32 h, + bytes32 r, + bytes32 s, + bytes32 qx, + bytes32 qy + ) private view returns (bool valid, bool supported) { + if (!_isProperSignature(r, s) || !isValidPublicKey(qx, qy)) { + return (false, true); // signature is invalid, and its not because the precompile is missing + } + + (bool success, bytes memory returndata) = address(0x100).staticcall(abi.encode(h, r, s, qx, qy)); + return (success && returndata.length == 0x20) ? (abi.decode(returndata, (bool)), true) : (false, false); + } + + /** + * @dev Same as {verify}, but only the Solidity implementation is used. + */ + function verifySolidity(bytes32 h, bytes32 r, bytes32 s, bytes32 qx, bytes32 qy) internal view returns (bool) { + if (!_isProperSignature(r, s) || !isValidPublicKey(qx, qy)) { + return false; + } + + JPoint[16] memory points = _preComputeJacobianPoints(uint256(qx), uint256(qy)); + uint256 w = Math.invModPrime(uint256(s), N); + uint256 u1 = mulmod(uint256(h), w, N); + uint256 u2 = mulmod(uint256(r), w, N); + (uint256 x, ) = _jMultShamir(points, u1, u2); + return ((x % N) == uint256(r)); + } + + /** + * @dev Public key recovery + * + * @param h - hashed message + * @param v - signature recovery param + * @param r - signature half R + * @param s - signature half S + * + * IMPORTANT: This function disallows signatures where the `s` value is above `N/2` to prevent malleability. + * To flip the `s` value, compute `s = N - s` and `v = 1 - v` if (`v = 0 | 1`). + */ + function recovery(bytes32 h, uint8 v, bytes32 r, bytes32 s) internal view returns (bytes32 x, bytes32 y) { + if (!_isProperSignature(r, s) || v > 1) { + return (0, 0); + } + + uint256 p = P; // cache P on the stack + uint256 rx = uint256(r); + uint256 ry2 = addmod(mulmod(addmod(mulmod(rx, rx, p), A, p), rx, p), B, p); // weierstrass equation y² = x³ + a.x + b + uint256 ry = Math.modExp(ry2, P1DIV4, p); // This formula for sqrt work because P ≡ 3 (mod 4) + if (mulmod(ry, ry, p) != ry2) return (0, 0); // Sanity check + if (ry % 2 != v) ry = p - ry; + + JPoint[16] memory points = _preComputeJacobianPoints(rx, ry); + uint256 w = Math.invModPrime(uint256(r), N); + uint256 u1 = mulmod(N - (uint256(h) % N), w, N); + uint256 u2 = mulmod(uint256(s), w, N); + (uint256 xU, uint256 yU) = _jMultShamir(points, u1, u2); + return (bytes32(xU), bytes32(yU)); + } + + /** + * @dev Checks if (x, y) are valid coordinates of a point on the curve. + * In particular this function checks that x < P and y < P. + */ + function isValidPublicKey(bytes32 x, bytes32 y) internal pure returns (bool result) { + assembly ("memory-safe") { + let p := P + let lhs := mulmod(y, y, p) // y^2 + let rhs := addmod(mulmod(addmod(mulmod(x, x, p), A, p), x, p), B, p) // ((x^2 + a) * x) + b = x^3 + ax + b + result := and(and(lt(x, p), lt(y, p)), eq(lhs, rhs)) // Should conform with the Weierstrass equation + } + } + + /** + * @dev Checks if (r, s) is a proper signature. + * In particular, this checks that `s` is in the "lower-range", making the signature non-malleable. + */ + function _isProperSignature(bytes32 r, bytes32 s) private pure returns (bool) { + return uint256(r) > 0 && uint256(r) < N && uint256(s) > 0 && uint256(s) <= HALF_N; + } + + /** + * @dev Reduce from jacobian to affine coordinates + * @param jx - jacobian coordinate x + * @param jy - jacobian coordinate y + * @param jz - jacobian coordinate z + * @return ax - affine coordinate x + * @return ay - affine coordinate y + */ + function _affineFromJacobian(uint256 jx, uint256 jy, uint256 jz) private view returns (uint256 ax, uint256 ay) { + if (jz == 0) return (0, 0); + uint256 p = P; // cache P on the stack + uint256 zinv = Math.invModPrime(jz, p); + assembly ("memory-safe") { + let zzinv := mulmod(zinv, zinv, p) + ax := mulmod(jx, zzinv, p) + ay := mulmod(jy, mulmod(zzinv, zinv, p), p) + } + } + + /** + * @dev Point addition on the jacobian coordinates + * Reference: https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2 + * + * Note that: + * + * - `addition-add-1998-cmo-2` doesn't support identical input points. This version is modified to use + * the `h` and `r` values computed by `addition-add-1998-cmo-2` to detect identical inputs, and fallback to + * `doubling-dbl-1998-cmo-2` if needed. + * - if one of the points is at infinity (i.e. `z=0`), the result is undefined. + */ + function _jAdd( + JPoint memory p1, + uint256 x2, + uint256 y2, + uint256 z2 + ) private pure returns (uint256 rx, uint256 ry, uint256 rz) { + assembly ("memory-safe") { + let p := P + let z1 := mload(add(p1, 0x40)) + let zz1 := mulmod(z1, z1, p) // zz1 = z1² + let s1 := mulmod(mload(add(p1, 0x20)), mulmod(mulmod(z2, z2, p), z2, p), p) // s1 = y1*z2³ + let r := addmod(mulmod(y2, mulmod(zz1, z1, p), p), sub(p, s1), p) // r = s2-s1 = y2*z1³-s1 = y2*z1³-y1*z2³ + let u1 := mulmod(mload(p1), mulmod(z2, z2, p), p) // u1 = x1*z2² + let h := addmod(mulmod(x2, zz1, p), sub(p, u1), p) // h = u2-u1 = x2*z1²-u1 = x2*z1²-x1*z2² + + // detect edge cases where inputs are identical + switch and(iszero(r), iszero(h)) + // case 0: points are different + case 0 { + let hh := mulmod(h, h, p) // h² + + // x' = r²-h³-2*u1*h² + rx := addmod( + addmod(mulmod(r, r, p), sub(p, mulmod(h, hh, p)), p), + sub(p, mulmod(2, mulmod(u1, hh, p), p)), + p + ) + // y' = r*(u1*h²-x')-s1*h³ + ry := addmod( + mulmod(r, addmod(mulmod(u1, hh, p), sub(p, rx), p), p), + sub(p, mulmod(s1, mulmod(h, hh, p), p)), + p + ) + // z' = h*z1*z2 + rz := mulmod(h, mulmod(z1, z2, p), p) + } + // case 1: points are equal + case 1 { + let x := x2 + let y := y2 + let z := z2 + let yy := mulmod(y, y, p) + let zz := mulmod(z, z, p) + let m := addmod(mulmod(3, mulmod(x, x, p), p), mulmod(A, mulmod(zz, zz, p), p), p) // m = 3*x²+a*z⁴ + let s := mulmod(4, mulmod(x, yy, p), p) // s = 4*x*y² + + // x' = t = m²-2*s + rx := addmod(mulmod(m, m, p), sub(p, mulmod(2, s, p)), p) + + // y' = m*(s-t)-8*y⁴ = m*(s-x')-8*y⁴ + // cut the computation to avoid stack too deep + let rytmp1 := sub(p, mulmod(8, mulmod(yy, yy, p), p)) // -8*y⁴ + let rytmp2 := addmod(s, sub(p, rx), p) // s-x' + ry := addmod(mulmod(m, rytmp2, p), rytmp1, p) // m*(s-x')-8*y⁴ + + // z' = 2*y*z + rz := mulmod(2, mulmod(y, z, p), p) + } + } + } + + /** + * @dev Point doubling on the jacobian coordinates + * Reference: https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 + */ + function _jDouble(uint256 x, uint256 y, uint256 z) private pure returns (uint256 rx, uint256 ry, uint256 rz) { + assembly ("memory-safe") { + let p := P + let yy := mulmod(y, y, p) + let zz := mulmod(z, z, p) + let m := addmod(mulmod(3, mulmod(x, x, p), p), mulmod(A, mulmod(zz, zz, p), p), p) // m = 3*x²+a*z⁴ + let s := mulmod(4, mulmod(x, yy, p), p) // s = 4*x*y² + + // x' = t = m²-2*s + rx := addmod(mulmod(m, m, p), sub(p, mulmod(2, s, p)), p) + // y' = m*(s-t)-8*y⁴ = m*(s-x')-8*y⁴ + ry := addmod(mulmod(m, addmod(s, sub(p, rx), p), p), sub(p, mulmod(8, mulmod(yy, yy, p), p)), p) + // z' = 2*y*z + rz := mulmod(2, mulmod(y, z, p), p) + } + } + + /** + * @dev Compute G·u1 + P·u2 using the precomputed points for G and P (see {_preComputeJacobianPoints}). + * + * Uses Strauss Shamir trick for EC multiplication + * https://stackoverflow.com/questions/50993471/ec-scalar-multiplication-with-strauss-shamir-method + * + * We optimize this for 2 bits at a time rather than a single bit. The individual points for a single pass are + * precomputed. Overall this reduces the number of additions while keeping the same number of + * doublings + */ + function _jMultShamir( + JPoint[16] memory points, + uint256 u1, + uint256 u2 + ) private view returns (uint256 rx, uint256 ry) { + uint256 x = 0; + uint256 y = 0; + uint256 z = 0; + unchecked { + for (uint256 i = 0; i < 128; ++i) { + if (z > 0) { + (x, y, z) = _jDouble(x, y, z); + (x, y, z) = _jDouble(x, y, z); + } + // Read 2 bits of u1, and 2 bits of u2. Combining the two gives the lookup index in the table. + uint256 pos = ((u1 >> 252) & 0xc) | ((u2 >> 254) & 0x3); + // Points that have z = 0 are points at infinity. They are the additive 0 of the group + // - if the lookup point is a 0, we can skip it + // - otherwise: + // - if the current point (x, y, z) is 0, we use the lookup point as our new value (0+P=P) + // - if the current point (x, y, z) is not 0, both points are valid and we can use `_jAdd` + if (points[pos].z != 0) { + if (z == 0) { + (x, y, z) = (points[pos].x, points[pos].y, points[pos].z); + } else { + (x, y, z) = _jAdd(points[pos], x, y, z); + } + } + u1 <<= 2; + u2 <<= 2; + } + } + return _affineFromJacobian(x, y, z); + } + + /** + * @dev Precompute a matrice of useful jacobian points associated with a given P. This can be seen as a 4x4 matrix + * that contains combination of P and G (generator) up to 3 times each. See the table below: + * + * ┌────┬─────────────────────┐ + * │ i │ 0 1 2 3 │ + * ├────┼─────────────────────┤ + * │ 0 │ 0 p 2p 3p │ + * │ 4 │ g g+p g+2p g+3p │ + * │ 8 │ 2g 2g+p 2g+2p 2g+3p │ + * │ 12 │ 3g 3g+p 3g+2p 3g+3p │ + * └────┴─────────────────────┘ + * + * Note that `_jAdd` (and thus `_jAddPoint`) does not handle the case where one of the inputs is a point at + * infinity (z = 0). However, we know that since `N ≡ 1 mod 2` and `N ≡ 1 mod 3`, there is no point P such that + * 2P = 0 or 3P = 0. This guarantees that g, 2g, 3g, p, 2p, 3p are all non-zero, and that all `_jAddPoint` calls + * have valid inputs. + */ + function _preComputeJacobianPoints(uint256 px, uint256 py) private pure returns (JPoint[16] memory points) { + points[0x00] = JPoint(0, 0, 0); // 0,0 + points[0x01] = JPoint(px, py, 1); // 1,0 (p) + points[0x04] = JPoint(GX, GY, 1); // 0,1 (g) + points[0x02] = _jDoublePoint(points[0x01]); // 2,0 (2p) + points[0x08] = _jDoublePoint(points[0x04]); // 0,2 (2g) + points[0x03] = _jAddPoint(points[0x01], points[0x02]); // 3,0 (p+2p = 3p) + points[0x05] = _jAddPoint(points[0x01], points[0x04]); // 1,1 (p+g) + points[0x06] = _jAddPoint(points[0x02], points[0x04]); // 2,1 (2p+g) + points[0x07] = _jAddPoint(points[0x03], points[0x04]); // 3,1 (3p+g) + points[0x09] = _jAddPoint(points[0x01], points[0x08]); // 1,2 (p+2g) + points[0x0a] = _jAddPoint(points[0x02], points[0x08]); // 2,2 (2p+2g) + points[0x0b] = _jAddPoint(points[0x03], points[0x08]); // 3,2 (3p+2g) + points[0x0c] = _jAddPoint(points[0x04], points[0x08]); // 0,3 (g+2g = 3g) + points[0x0d] = _jAddPoint(points[0x01], points[0x0c]); // 1,3 (p+3g) + points[0x0e] = _jAddPoint(points[0x02], points[0x0c]); // 2,3 (2p+3g) + points[0x0f] = _jAddPoint(points[0x03], points[0x0c]); // 3,3 (3p+3g) + } + + function _jAddPoint(JPoint memory p1, JPoint memory p2) private pure returns (JPoint memory) { + (uint256 x, uint256 y, uint256 z) = _jAdd(p1, p2.x, p2.y, p2.z); + return JPoint(x, y, z); + } + + function _jDoublePoint(JPoint memory p) private pure returns (JPoint memory) { + (uint256 x, uint256 y, uint256 z) = _jDouble(p.x, p.y, p.z); + return JPoint(x, y, z); + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Panic.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Panic.sol new file mode 100644 index 000000000..e168824d3 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/Panic.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol) + +pragma solidity ^0.8.20; + +/** + * @dev Helper library for emitting standardized panic codes. + * + * ```solidity + * contract Example { + * using Panic for uint256; + * + * // Use any of the declared internal constants + * function foo() { Panic.GENERIC.panic(); } + * + * // Alternatively + * function foo() { Panic.panic(Panic.GENERIC); } + * } + * ``` + * + * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil]. + * + * _Available since v5.1._ + */ +// slither-disable-next-line unused-state +library Panic { + /// @dev generic / unspecified error + uint256 internal constant GENERIC = 0x00; + /// @dev used by the assert() builtin + uint256 internal constant ASSERT = 0x01; + /// @dev arithmetic underflow or overflow + uint256 internal constant UNDER_OVERFLOW = 0x11; + /// @dev division or modulo by zero + uint256 internal constant DIVISION_BY_ZERO = 0x12; + /// @dev enum conversion error + uint256 internal constant ENUM_CONVERSION_ERROR = 0x21; + /// @dev invalid encoding in storage + uint256 internal constant STORAGE_ENCODING_ERROR = 0x22; + /// @dev empty array pop + uint256 internal constant EMPTY_ARRAY_POP = 0x31; + /// @dev array out of bounds access + uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32; + /// @dev resource error (too large allocation or too large array) + uint256 internal constant RESOURCE_ERROR = 0x41; + /// @dev calling invalid internal function + uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51; + + /// @dev Reverts with a panic code. Recommended to use with + /// the internal constants with predefined codes. + function panic(uint256 code) internal pure { + assembly ("memory-safe") { + mstore(0x00, 0x4e487b71) + mstore(0x20, code) + revert(0x1c, 0x24) + } + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/SafeCast.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/SafeCast.sol new file mode 100644 index 000000000..b345ede1e --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/SafeCast.sol @@ -0,0 +1,1162 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol) +// This file was procedurally generated from scripts/generate/templates/SafeCast.js. + +pragma solidity ^0.8.20; + +/** + * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow + * checks. + * + * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can + * easily result in undesired exploitation or bugs, since developers usually + * assume that overflows raise errors. `SafeCast` restores this intuition by + * reverting the transaction when such an operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeCast { + /** + * @dev Value doesn't fit in an uint of `bits` size. + */ + error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value); + + /** + * @dev An int value doesn't fit in an uint of `bits` size. + */ + error SafeCastOverflowedIntToUint(int256 value); + + /** + * @dev Value doesn't fit in an int of `bits` size. + */ + error SafeCastOverflowedIntDowncast(uint8 bits, int256 value); + + /** + * @dev An uint value doesn't fit in an int of `bits` size. + */ + error SafeCastOverflowedUintToInt(uint256 value); + + /** + * @dev Returns the downcasted uint248 from uint256, reverting on + * overflow (when the input is greater than largest uint248). + * + * Counterpart to Solidity's `uint248` operator. + * + * Requirements: + * + * - input must fit into 248 bits + */ + function toUint248(uint256 value) internal pure returns (uint248) { + if (value > type(uint248).max) { + revert SafeCastOverflowedUintDowncast(248, value); + } + return uint248(value); + } + + /** + * @dev Returns the downcasted uint240 from uint256, reverting on + * overflow (when the input is greater than largest uint240). + * + * Counterpart to Solidity's `uint240` operator. + * + * Requirements: + * + * - input must fit into 240 bits + */ + function toUint240(uint256 value) internal pure returns (uint240) { + if (value > type(uint240).max) { + revert SafeCastOverflowedUintDowncast(240, value); + } + return uint240(value); + } + + /** + * @dev Returns the downcasted uint232 from uint256, reverting on + * overflow (when the input is greater than largest uint232). + * + * Counterpart to Solidity's `uint232` operator. + * + * Requirements: + * + * - input must fit into 232 bits + */ + function toUint232(uint256 value) internal pure returns (uint232) { + if (value > type(uint232).max) { + revert SafeCastOverflowedUintDowncast(232, value); + } + return uint232(value); + } + + /** + * @dev Returns the downcasted uint224 from uint256, reverting on + * overflow (when the input is greater than largest uint224). + * + * Counterpart to Solidity's `uint224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toUint224(uint256 value) internal pure returns (uint224) { + if (value > type(uint224).max) { + revert SafeCastOverflowedUintDowncast(224, value); + } + return uint224(value); + } + + /** + * @dev Returns the downcasted uint216 from uint256, reverting on + * overflow (when the input is greater than largest uint216). + * + * Counterpart to Solidity's `uint216` operator. + * + * Requirements: + * + * - input must fit into 216 bits + */ + function toUint216(uint256 value) internal pure returns (uint216) { + if (value > type(uint216).max) { + revert SafeCastOverflowedUintDowncast(216, value); + } + return uint216(value); + } + + /** + * @dev Returns the downcasted uint208 from uint256, reverting on + * overflow (when the input is greater than largest uint208). + * + * Counterpart to Solidity's `uint208` operator. + * + * Requirements: + * + * - input must fit into 208 bits + */ + function toUint208(uint256 value) internal pure returns (uint208) { + if (value > type(uint208).max) { + revert SafeCastOverflowedUintDowncast(208, value); + } + return uint208(value); + } + + /** + * @dev Returns the downcasted uint200 from uint256, reverting on + * overflow (when the input is greater than largest uint200). + * + * Counterpart to Solidity's `uint200` operator. + * + * Requirements: + * + * - input must fit into 200 bits + */ + function toUint200(uint256 value) internal pure returns (uint200) { + if (value > type(uint200).max) { + revert SafeCastOverflowedUintDowncast(200, value); + } + return uint200(value); + } + + /** + * @dev Returns the downcasted uint192 from uint256, reverting on + * overflow (when the input is greater than largest uint192). + * + * Counterpart to Solidity's `uint192` operator. + * + * Requirements: + * + * - input must fit into 192 bits + */ + function toUint192(uint256 value) internal pure returns (uint192) { + if (value > type(uint192).max) { + revert SafeCastOverflowedUintDowncast(192, value); + } + return uint192(value); + } + + /** + * @dev Returns the downcasted uint184 from uint256, reverting on + * overflow (when the input is greater than largest uint184). + * + * Counterpart to Solidity's `uint184` operator. + * + * Requirements: + * + * - input must fit into 184 bits + */ + function toUint184(uint256 value) internal pure returns (uint184) { + if (value > type(uint184).max) { + revert SafeCastOverflowedUintDowncast(184, value); + } + return uint184(value); + } + + /** + * @dev Returns the downcasted uint176 from uint256, reverting on + * overflow (when the input is greater than largest uint176). + * + * Counterpart to Solidity's `uint176` operator. + * + * Requirements: + * + * - input must fit into 176 bits + */ + function toUint176(uint256 value) internal pure returns (uint176) { + if (value > type(uint176).max) { + revert SafeCastOverflowedUintDowncast(176, value); + } + return uint176(value); + } + + /** + * @dev Returns the downcasted uint168 from uint256, reverting on + * overflow (when the input is greater than largest uint168). + * + * Counterpart to Solidity's `uint168` operator. + * + * Requirements: + * + * - input must fit into 168 bits + */ + function toUint168(uint256 value) internal pure returns (uint168) { + if (value > type(uint168).max) { + revert SafeCastOverflowedUintDowncast(168, value); + } + return uint168(value); + } + + /** + * @dev Returns the downcasted uint160 from uint256, reverting on + * overflow (when the input is greater than largest uint160). + * + * Counterpart to Solidity's `uint160` operator. + * + * Requirements: + * + * - input must fit into 160 bits + */ + function toUint160(uint256 value) internal pure returns (uint160) { + if (value > type(uint160).max) { + revert SafeCastOverflowedUintDowncast(160, value); + } + return uint160(value); + } + + /** + * @dev Returns the downcasted uint152 from uint256, reverting on + * overflow (when the input is greater than largest uint152). + * + * Counterpart to Solidity's `uint152` operator. + * + * Requirements: + * + * - input must fit into 152 bits + */ + function toUint152(uint256 value) internal pure returns (uint152) { + if (value > type(uint152).max) { + revert SafeCastOverflowedUintDowncast(152, value); + } + return uint152(value); + } + + /** + * @dev Returns the downcasted uint144 from uint256, reverting on + * overflow (when the input is greater than largest uint144). + * + * Counterpart to Solidity's `uint144` operator. + * + * Requirements: + * + * - input must fit into 144 bits + */ + function toUint144(uint256 value) internal pure returns (uint144) { + if (value > type(uint144).max) { + revert SafeCastOverflowedUintDowncast(144, value); + } + return uint144(value); + } + + /** + * @dev Returns the downcasted uint136 from uint256, reverting on + * overflow (when the input is greater than largest uint136). + * + * Counterpart to Solidity's `uint136` operator. + * + * Requirements: + * + * - input must fit into 136 bits + */ + function toUint136(uint256 value) internal pure returns (uint136) { + if (value > type(uint136).max) { + revert SafeCastOverflowedUintDowncast(136, value); + } + return uint136(value); + } + + /** + * @dev Returns the downcasted uint128 from uint256, reverting on + * overflow (when the input is greater than largest uint128). + * + * Counterpart to Solidity's `uint128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toUint128(uint256 value) internal pure returns (uint128) { + if (value > type(uint128).max) { + revert SafeCastOverflowedUintDowncast(128, value); + } + return uint128(value); + } + + /** + * @dev Returns the downcasted uint120 from uint256, reverting on + * overflow (when the input is greater than largest uint120). + * + * Counterpart to Solidity's `uint120` operator. + * + * Requirements: + * + * - input must fit into 120 bits + */ + function toUint120(uint256 value) internal pure returns (uint120) { + if (value > type(uint120).max) { + revert SafeCastOverflowedUintDowncast(120, value); + } + return uint120(value); + } + + /** + * @dev Returns the downcasted uint112 from uint256, reverting on + * overflow (when the input is greater than largest uint112). + * + * Counterpart to Solidity's `uint112` operator. + * + * Requirements: + * + * - input must fit into 112 bits + */ + function toUint112(uint256 value) internal pure returns (uint112) { + if (value > type(uint112).max) { + revert SafeCastOverflowedUintDowncast(112, value); + } + return uint112(value); + } + + /** + * @dev Returns the downcasted uint104 from uint256, reverting on + * overflow (when the input is greater than largest uint104). + * + * Counterpart to Solidity's `uint104` operator. + * + * Requirements: + * + * - input must fit into 104 bits + */ + function toUint104(uint256 value) internal pure returns (uint104) { + if (value > type(uint104).max) { + revert SafeCastOverflowedUintDowncast(104, value); + } + return uint104(value); + } + + /** + * @dev Returns the downcasted uint96 from uint256, reverting on + * overflow (when the input is greater than largest uint96). + * + * Counterpart to Solidity's `uint96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toUint96(uint256 value) internal pure returns (uint96) { + if (value > type(uint96).max) { + revert SafeCastOverflowedUintDowncast(96, value); + } + return uint96(value); + } + + /** + * @dev Returns the downcasted uint88 from uint256, reverting on + * overflow (when the input is greater than largest uint88). + * + * Counterpart to Solidity's `uint88` operator. + * + * Requirements: + * + * - input must fit into 88 bits + */ + function toUint88(uint256 value) internal pure returns (uint88) { + if (value > type(uint88).max) { + revert SafeCastOverflowedUintDowncast(88, value); + } + return uint88(value); + } + + /** + * @dev Returns the downcasted uint80 from uint256, reverting on + * overflow (when the input is greater than largest uint80). + * + * Counterpart to Solidity's `uint80` operator. + * + * Requirements: + * + * - input must fit into 80 bits + */ + function toUint80(uint256 value) internal pure returns (uint80) { + if (value > type(uint80).max) { + revert SafeCastOverflowedUintDowncast(80, value); + } + return uint80(value); + } + + /** + * @dev Returns the downcasted uint72 from uint256, reverting on + * overflow (when the input is greater than largest uint72). + * + * Counterpart to Solidity's `uint72` operator. + * + * Requirements: + * + * - input must fit into 72 bits + */ + function toUint72(uint256 value) internal pure returns (uint72) { + if (value > type(uint72).max) { + revert SafeCastOverflowedUintDowncast(72, value); + } + return uint72(value); + } + + /** + * @dev Returns the downcasted uint64 from uint256, reverting on + * overflow (when the input is greater than largest uint64). + * + * Counterpart to Solidity's `uint64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toUint64(uint256 value) internal pure returns (uint64) { + if (value > type(uint64).max) { + revert SafeCastOverflowedUintDowncast(64, value); + } + return uint64(value); + } + + /** + * @dev Returns the downcasted uint56 from uint256, reverting on + * overflow (when the input is greater than largest uint56). + * + * Counterpart to Solidity's `uint56` operator. + * + * Requirements: + * + * - input must fit into 56 bits + */ + function toUint56(uint256 value) internal pure returns (uint56) { + if (value > type(uint56).max) { + revert SafeCastOverflowedUintDowncast(56, value); + } + return uint56(value); + } + + /** + * @dev Returns the downcasted uint48 from uint256, reverting on + * overflow (when the input is greater than largest uint48). + * + * Counterpart to Solidity's `uint48` operator. + * + * Requirements: + * + * - input must fit into 48 bits + */ + function toUint48(uint256 value) internal pure returns (uint48) { + if (value > type(uint48).max) { + revert SafeCastOverflowedUintDowncast(48, value); + } + return uint48(value); + } + + /** + * @dev Returns the downcasted uint40 from uint256, reverting on + * overflow (when the input is greater than largest uint40). + * + * Counterpart to Solidity's `uint40` operator. + * + * Requirements: + * + * - input must fit into 40 bits + */ + function toUint40(uint256 value) internal pure returns (uint40) { + if (value > type(uint40).max) { + revert SafeCastOverflowedUintDowncast(40, value); + } + return uint40(value); + } + + /** + * @dev Returns the downcasted uint32 from uint256, reverting on + * overflow (when the input is greater than largest uint32). + * + * Counterpart to Solidity's `uint32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toUint32(uint256 value) internal pure returns (uint32) { + if (value > type(uint32).max) { + revert SafeCastOverflowedUintDowncast(32, value); + } + return uint32(value); + } + + /** + * @dev Returns the downcasted uint24 from uint256, reverting on + * overflow (when the input is greater than largest uint24). + * + * Counterpart to Solidity's `uint24` operator. + * + * Requirements: + * + * - input must fit into 24 bits + */ + function toUint24(uint256 value) internal pure returns (uint24) { + if (value > type(uint24).max) { + revert SafeCastOverflowedUintDowncast(24, value); + } + return uint24(value); + } + + /** + * @dev Returns the downcasted uint16 from uint256, reverting on + * overflow (when the input is greater than largest uint16). + * + * Counterpart to Solidity's `uint16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toUint16(uint256 value) internal pure returns (uint16) { + if (value > type(uint16).max) { + revert SafeCastOverflowedUintDowncast(16, value); + } + return uint16(value); + } + + /** + * @dev Returns the downcasted uint8 from uint256, reverting on + * overflow (when the input is greater than largest uint8). + * + * Counterpart to Solidity's `uint8` operator. + * + * Requirements: + * + * - input must fit into 8 bits + */ + function toUint8(uint256 value) internal pure returns (uint8) { + if (value > type(uint8).max) { + revert SafeCastOverflowedUintDowncast(8, value); + } + return uint8(value); + } + + /** + * @dev Converts a signed int256 into an unsigned uint256. + * + * Requirements: + * + * - input must be greater than or equal to 0. + */ + function toUint256(int256 value) internal pure returns (uint256) { + if (value < 0) { + revert SafeCastOverflowedIntToUint(value); + } + return uint256(value); + } + + /** + * @dev Returns the downcasted int248 from int256, reverting on + * overflow (when the input is less than smallest int248 or + * greater than largest int248). + * + * Counterpart to Solidity's `int248` operator. + * + * Requirements: + * + * - input must fit into 248 bits + */ + function toInt248(int256 value) internal pure returns (int248 downcasted) { + downcasted = int248(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(248, value); + } + } + + /** + * @dev Returns the downcasted int240 from int256, reverting on + * overflow (when the input is less than smallest int240 or + * greater than largest int240). + * + * Counterpart to Solidity's `int240` operator. + * + * Requirements: + * + * - input must fit into 240 bits + */ + function toInt240(int256 value) internal pure returns (int240 downcasted) { + downcasted = int240(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(240, value); + } + } + + /** + * @dev Returns the downcasted int232 from int256, reverting on + * overflow (when the input is less than smallest int232 or + * greater than largest int232). + * + * Counterpart to Solidity's `int232` operator. + * + * Requirements: + * + * - input must fit into 232 bits + */ + function toInt232(int256 value) internal pure returns (int232 downcasted) { + downcasted = int232(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(232, value); + } + } + + /** + * @dev Returns the downcasted int224 from int256, reverting on + * overflow (when the input is less than smallest int224 or + * greater than largest int224). + * + * Counterpart to Solidity's `int224` operator. + * + * Requirements: + * + * - input must fit into 224 bits + */ + function toInt224(int256 value) internal pure returns (int224 downcasted) { + downcasted = int224(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(224, value); + } + } + + /** + * @dev Returns the downcasted int216 from int256, reverting on + * overflow (when the input is less than smallest int216 or + * greater than largest int216). + * + * Counterpart to Solidity's `int216` operator. + * + * Requirements: + * + * - input must fit into 216 bits + */ + function toInt216(int256 value) internal pure returns (int216 downcasted) { + downcasted = int216(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(216, value); + } + } + + /** + * @dev Returns the downcasted int208 from int256, reverting on + * overflow (when the input is less than smallest int208 or + * greater than largest int208). + * + * Counterpart to Solidity's `int208` operator. + * + * Requirements: + * + * - input must fit into 208 bits + */ + function toInt208(int256 value) internal pure returns (int208 downcasted) { + downcasted = int208(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(208, value); + } + } + + /** + * @dev Returns the downcasted int200 from int256, reverting on + * overflow (when the input is less than smallest int200 or + * greater than largest int200). + * + * Counterpart to Solidity's `int200` operator. + * + * Requirements: + * + * - input must fit into 200 bits + */ + function toInt200(int256 value) internal pure returns (int200 downcasted) { + downcasted = int200(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(200, value); + } + } + + /** + * @dev Returns the downcasted int192 from int256, reverting on + * overflow (when the input is less than smallest int192 or + * greater than largest int192). + * + * Counterpart to Solidity's `int192` operator. + * + * Requirements: + * + * - input must fit into 192 bits + */ + function toInt192(int256 value) internal pure returns (int192 downcasted) { + downcasted = int192(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(192, value); + } + } + + /** + * @dev Returns the downcasted int184 from int256, reverting on + * overflow (when the input is less than smallest int184 or + * greater than largest int184). + * + * Counterpart to Solidity's `int184` operator. + * + * Requirements: + * + * - input must fit into 184 bits + */ + function toInt184(int256 value) internal pure returns (int184 downcasted) { + downcasted = int184(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(184, value); + } + } + + /** + * @dev Returns the downcasted int176 from int256, reverting on + * overflow (when the input is less than smallest int176 or + * greater than largest int176). + * + * Counterpart to Solidity's `int176` operator. + * + * Requirements: + * + * - input must fit into 176 bits + */ + function toInt176(int256 value) internal pure returns (int176 downcasted) { + downcasted = int176(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(176, value); + } + } + + /** + * @dev Returns the downcasted int168 from int256, reverting on + * overflow (when the input is less than smallest int168 or + * greater than largest int168). + * + * Counterpart to Solidity's `int168` operator. + * + * Requirements: + * + * - input must fit into 168 bits + */ + function toInt168(int256 value) internal pure returns (int168 downcasted) { + downcasted = int168(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(168, value); + } + } + + /** + * @dev Returns the downcasted int160 from int256, reverting on + * overflow (when the input is less than smallest int160 or + * greater than largest int160). + * + * Counterpart to Solidity's `int160` operator. + * + * Requirements: + * + * - input must fit into 160 bits + */ + function toInt160(int256 value) internal pure returns (int160 downcasted) { + downcasted = int160(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(160, value); + } + } + + /** + * @dev Returns the downcasted int152 from int256, reverting on + * overflow (when the input is less than smallest int152 or + * greater than largest int152). + * + * Counterpart to Solidity's `int152` operator. + * + * Requirements: + * + * - input must fit into 152 bits + */ + function toInt152(int256 value) internal pure returns (int152 downcasted) { + downcasted = int152(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(152, value); + } + } + + /** + * @dev Returns the downcasted int144 from int256, reverting on + * overflow (when the input is less than smallest int144 or + * greater than largest int144). + * + * Counterpart to Solidity's `int144` operator. + * + * Requirements: + * + * - input must fit into 144 bits + */ + function toInt144(int256 value) internal pure returns (int144 downcasted) { + downcasted = int144(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(144, value); + } + } + + /** + * @dev Returns the downcasted int136 from int256, reverting on + * overflow (when the input is less than smallest int136 or + * greater than largest int136). + * + * Counterpart to Solidity's `int136` operator. + * + * Requirements: + * + * - input must fit into 136 bits + */ + function toInt136(int256 value) internal pure returns (int136 downcasted) { + downcasted = int136(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(136, value); + } + } + + /** + * @dev Returns the downcasted int128 from int256, reverting on + * overflow (when the input is less than smallest int128 or + * greater than largest int128). + * + * Counterpart to Solidity's `int128` operator. + * + * Requirements: + * + * - input must fit into 128 bits + */ + function toInt128(int256 value) internal pure returns (int128 downcasted) { + downcasted = int128(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(128, value); + } + } + + /** + * @dev Returns the downcasted int120 from int256, reverting on + * overflow (when the input is less than smallest int120 or + * greater than largest int120). + * + * Counterpart to Solidity's `int120` operator. + * + * Requirements: + * + * - input must fit into 120 bits + */ + function toInt120(int256 value) internal pure returns (int120 downcasted) { + downcasted = int120(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(120, value); + } + } + + /** + * @dev Returns the downcasted int112 from int256, reverting on + * overflow (when the input is less than smallest int112 or + * greater than largest int112). + * + * Counterpart to Solidity's `int112` operator. + * + * Requirements: + * + * - input must fit into 112 bits + */ + function toInt112(int256 value) internal pure returns (int112 downcasted) { + downcasted = int112(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(112, value); + } + } + + /** + * @dev Returns the downcasted int104 from int256, reverting on + * overflow (when the input is less than smallest int104 or + * greater than largest int104). + * + * Counterpart to Solidity's `int104` operator. + * + * Requirements: + * + * - input must fit into 104 bits + */ + function toInt104(int256 value) internal pure returns (int104 downcasted) { + downcasted = int104(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(104, value); + } + } + + /** + * @dev Returns the downcasted int96 from int256, reverting on + * overflow (when the input is less than smallest int96 or + * greater than largest int96). + * + * Counterpart to Solidity's `int96` operator. + * + * Requirements: + * + * - input must fit into 96 bits + */ + function toInt96(int256 value) internal pure returns (int96 downcasted) { + downcasted = int96(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(96, value); + } + } + + /** + * @dev Returns the downcasted int88 from int256, reverting on + * overflow (when the input is less than smallest int88 or + * greater than largest int88). + * + * Counterpart to Solidity's `int88` operator. + * + * Requirements: + * + * - input must fit into 88 bits + */ + function toInt88(int256 value) internal pure returns (int88 downcasted) { + downcasted = int88(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(88, value); + } + } + + /** + * @dev Returns the downcasted int80 from int256, reverting on + * overflow (when the input is less than smallest int80 or + * greater than largest int80). + * + * Counterpart to Solidity's `int80` operator. + * + * Requirements: + * + * - input must fit into 80 bits + */ + function toInt80(int256 value) internal pure returns (int80 downcasted) { + downcasted = int80(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(80, value); + } + } + + /** + * @dev Returns the downcasted int72 from int256, reverting on + * overflow (when the input is less than smallest int72 or + * greater than largest int72). + * + * Counterpart to Solidity's `int72` operator. + * + * Requirements: + * + * - input must fit into 72 bits + */ + function toInt72(int256 value) internal pure returns (int72 downcasted) { + downcasted = int72(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(72, value); + } + } + + /** + * @dev Returns the downcasted int64 from int256, reverting on + * overflow (when the input is less than smallest int64 or + * greater than largest int64). + * + * Counterpart to Solidity's `int64` operator. + * + * Requirements: + * + * - input must fit into 64 bits + */ + function toInt64(int256 value) internal pure returns (int64 downcasted) { + downcasted = int64(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(64, value); + } + } + + /** + * @dev Returns the downcasted int56 from int256, reverting on + * overflow (when the input is less than smallest int56 or + * greater than largest int56). + * + * Counterpart to Solidity's `int56` operator. + * + * Requirements: + * + * - input must fit into 56 bits + */ + function toInt56(int256 value) internal pure returns (int56 downcasted) { + downcasted = int56(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(56, value); + } + } + + /** + * @dev Returns the downcasted int48 from int256, reverting on + * overflow (when the input is less than smallest int48 or + * greater than largest int48). + * + * Counterpart to Solidity's `int48` operator. + * + * Requirements: + * + * - input must fit into 48 bits + */ + function toInt48(int256 value) internal pure returns (int48 downcasted) { + downcasted = int48(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(48, value); + } + } + + /** + * @dev Returns the downcasted int40 from int256, reverting on + * overflow (when the input is less than smallest int40 or + * greater than largest int40). + * + * Counterpart to Solidity's `int40` operator. + * + * Requirements: + * + * - input must fit into 40 bits + */ + function toInt40(int256 value) internal pure returns (int40 downcasted) { + downcasted = int40(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(40, value); + } + } + + /** + * @dev Returns the downcasted int32 from int256, reverting on + * overflow (when the input is less than smallest int32 or + * greater than largest int32). + * + * Counterpart to Solidity's `int32` operator. + * + * Requirements: + * + * - input must fit into 32 bits + */ + function toInt32(int256 value) internal pure returns (int32 downcasted) { + downcasted = int32(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(32, value); + } + } + + /** + * @dev Returns the downcasted int24 from int256, reverting on + * overflow (when the input is less than smallest int24 or + * greater than largest int24). + * + * Counterpart to Solidity's `int24` operator. + * + * Requirements: + * + * - input must fit into 24 bits + */ + function toInt24(int256 value) internal pure returns (int24 downcasted) { + downcasted = int24(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(24, value); + } + } + + /** + * @dev Returns the downcasted int16 from int256, reverting on + * overflow (when the input is less than smallest int16 or + * greater than largest int16). + * + * Counterpart to Solidity's `int16` operator. + * + * Requirements: + * + * - input must fit into 16 bits + */ + function toInt16(int256 value) internal pure returns (int16 downcasted) { + downcasted = int16(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(16, value); + } + } + + /** + * @dev Returns the downcasted int8 from int256, reverting on + * overflow (when the input is less than smallest int8 or + * greater than largest int8). + * + * Counterpart to Solidity's `int8` operator. + * + * Requirements: + * + * - input must fit into 8 bits + */ + function toInt8(int256 value) internal pure returns (int8 downcasted) { + downcasted = int8(value); + if (downcasted != value) { + revert SafeCastOverflowedIntDowncast(8, value); + } + } + + /** + * @dev Converts an unsigned uint256 into a signed int256. + * + * Requirements: + * + * - input must be less than or equal to maxInt256. + */ + function toInt256(uint256 value) internal pure returns (int256) { + // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive + if (value > uint256(type(int256).max)) { + revert SafeCastOverflowedUintToInt(value); + } + return int256(value); + } + + /** + * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump. + */ + function toUint(bool b) internal pure returns (uint256 u) { + assembly ("memory-safe") { + u := iszero(iszero(b)) + } + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.sol new file mode 100644 index 000000000..6bc05ee9a --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.8.20; + +import {Math} from "./Math.sol"; +import {Errors} from "./Errors.sol"; +import {P256} from "./P256.sol"; + +contract testEcdsaR1Contract { + function test_ecdsa_verify_p256() public payable returns (bool) { + bytes32 h = 0xaf2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268e9891562113d8a62add1bf; + bytes32 r = 0xEFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716; + // bytes32 s = 0xF7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8; + bytes32 s = 0x0834e36ad29a83bf2bc9385e491d6099c8fdf9d1ed67aa7ea5f51f93782857a9; // n - s + bytes32 px = 0x60FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB6; + bytes32 py = 0x7903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299; + + bool isValid = P256.verifySolidity(h, r, s, px, py); + require(isValid, "Signature verification failed"); + return isValid; + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.wasm new file mode 100644 index 000000000..a681b32ac --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/ecdsa/ecdsa.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6b50601c902ce0ecf065e461219fd5b5ef36ada76f813610519cf2091dcc6c6 +size 43811 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.sol new file mode 100644 index 000000000..29aef1ada --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract MyERC1155 is ERC1155, Ownable { + // Token name + string public name; + // Token symbol + string public symbol; + + constructor() ERC1155("https://game.example/api/item/{id}.json") Ownable(msg.sender) { + name = "My Game Items"; + symbol = "TestGameSymbol"; + } + + // Mint function that only owner can call + function mint( + address account, + uint256 id, + uint256 amount, + bytes memory data + ) public onlyOwner { + _mint(account, id, amount, data); + } + + // Batch mint function that only owner can call + function mintBatch( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) public onlyOwner { + _mintBatch(to, ids, amounts, data); + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.wasm new file mode 100644 index 000000000..5d199eafd --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/erc1155.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db58501ba952032a0b0e916de1d3b92393f710e4e36e2a005fa237919bd66ef0 +size 71406 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/sol_erc1155.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/sol_erc1155.wasm new file mode 100644 index 000000000..545211ba9 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc1155/sol_erc1155.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f59a6922496018f1004d94c935d6147e0586a80aebd84ca310297b60d3fac25e +size 192227 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.sol new file mode 100644 index 000000000..04efbca6b --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract GLDToken is ERC20 { + constructor(uint256 initialSupply) ERC20("Gold", "GLD") { + _mint(msg.sender, initialSupply); + + } + function mint(address to, uint256 amount) public { + _mint(to, amount); + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.wasm new file mode 100644 index 000000000..8872e45dc --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/erc20.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9062d69da8330f24f2f153d68c46958d5d6afff630ecee13c4f588a5c51793e5 +size 32088 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/sol_erc20.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/sol_erc20.wasm new file mode 100644 index 000000000..a64f01de4 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc20/sol_erc20.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74d3f3df0feb9322e669ef9ee78bf1d0471504a9d7fe9980c356d136432ca226 +size 47393 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.sol new file mode 100644 index 000000000..313a2e513 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract MyERC721 is ERC721, Ownable { + uint256 private _nextTokenId; + + constructor() ERC721("MyNFT", "MNFT") Ownable(msg.sender) {} + + function mint(address to) public onlyOwner returns (uint256) { + uint256 tokenId = _nextTokenId++; + _safeMint(to, tokenId); + return tokenId; + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.wasm new file mode 100644 index 000000000..9172cfb18 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/erc721.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e78ea0fea204ed8e686a9fa0dad66cb92f0b54480749be02738cda9bd723bf5e +size 51373 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/sol_erc721.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/sol_erc721.wasm new file mode 100644 index 000000000..fd596b6a3 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/erc721/sol_erc721.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b89d619402ad99b86e80502f4ef57c30a4bf512d21b45a43088bbf2cd7c34605 +size 180905 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/c_fib.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/c_fib.wasm new file mode 100644 index 000000000..fe4e4162f --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/c_fib.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73a25f7e2535cba0ad25580d093e29b35fef47fb6f7120feb00e03a0c150c0c1 +size 478 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.sol new file mode 100644 index 000000000..586e8c3cb --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.8.0; + +contract FibonacciTest { + + function fibonacci(uint n) public pure returns (uint) { + if (n == 0) return 0; + if (n == 1) return 1; + return fibonacci(n - 1) + fibonacci(n - 2); + } + + function fibonacciTailOptimized(uint n) public pure returns (uint) { + return fibonacciTailRecursive(n, 0, 1); + } + + function fibonacciTailRecursive(uint n, uint a, uint b) internal pure returns (uint) { + if (n == 0) return a; + if (n == 1) return b; + return fibonacciTailRecursive(n - 1, b, a + b); + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.wasm new file mode 100644 index 000000000..ac0374adf --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/fib.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc0033adeee85f96422fa9c9247a2717ce40efc6b61bf99e4d8482b9b71bb65b +size 11288 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/sol_fib.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/sol_fib.wasm new file mode 100644 index 000000000..517099d00 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/fibonacci/sol_fib.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c34728c6d1ac12cec7e917deed344e99da91b11e896ee75bac12095c54070860 +size 7103 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.sol new file mode 100644 index 000000000..e94cbc3ed --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract GenerativeNFT { + uint256 constant P = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant ROUNDS = 91; + + function mimcSponge(uint256 input, uint256 key) internal pure returns (uint256) { + uint256 x = input; + for (uint256 i = 0; i < ROUNDS; i++) { + uint256 t = addmod(addmod(x, uint256(keccak256(abi.encodePacked(i))), P), key, P); + uint256 t2 = mulmod(t, t, P); + uint256 t4 = mulmod(t2, t2, P); + x = mulmod(mulmod(t4, t2, P), t, P); + } + return addmod(x, key, P); + } + + function generate(uint256 tokenId) public pure returns (uint256) { + uint256 state = tokenId; + + // Generate 8 layers, each with its own MiMC sponge absorption + for (uint256 layer = 0; layer < 8; layer++) { + state = mimcSponge(state, layer + 1); + uint256 attr = mimcSponge(state, layer + 100); + state = addmod(state, attr, P); + } + + return state; + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.wasm new file mode 100644 index 000000000..ddeab114f --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/generative_nft/GenerativeNFT.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a9e6d1ccac2f0af6ca3f8cc33f2cee76a100bce5e4031e0bbfa2fc985e2f12f +size 11768 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.sol new file mode 100644 index 000000000..23673c12d --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MerkleProof { + uint256 constant FIELD_PRIME = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant MIMC_ROUNDS = 91; + + function mimcHash(uint256 left, uint256 right) internal pure returns (uint256) { + uint256 c = 0; + uint256 x = left; + for (uint256 i = 0; i < MIMC_ROUNDS; i++) { + uint256 t = addmod(addmod(x, c, FIELD_PRIME), right, FIELD_PRIME); + uint256 t2 = mulmod(t, t, FIELD_PRIME); + uint256 t4 = mulmod(t2, t2, FIELD_PRIME); + x = mulmod(mulmod(t4, t2, FIELD_PRIME), t, FIELD_PRIME); + c = addmod(c, uint256(keccak256(abi.encodePacked(i))), FIELD_PRIME); + } + return addmod(x, right, FIELD_PRIME); + } + + function verify( + uint256[] memory proof, + uint256 root, + uint256 leaf, + uint256[] memory positions + ) internal pure returns (bool) { + uint256 computedHash = leaf; + for (uint256 i = 0; i < proof.length; i++) { + if (positions[i] == 0) { + computedHash = mimcHash(computedHash, proof[i]); + } else { + computedHash = mimcHash(proof[i], computedHash); + } + } + return computedHash == root; + } + + function benchmark() public pure returns (bool) { + uint256[] memory proof = new uint256[](8); + uint256[] memory positions = new uint256[](8); + uint256 leaf = 42; + uint256 hash = leaf; + for (uint256 i = 0; i < 8; i++) { + proof[i] = i * 7 + 13; + positions[i] = i % 2; + hash = mimcHash(hash, proof[i]); + } + return verify(proof, hash, leaf, positions); + } +} diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.wasm new file mode 100644 index 000000000..42fa153b2 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/merkle/MerkleProof.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32c700605b302f3f69af1e1242a01f476b9eb481dc5a6bd43276be89011f3ae0 +size 15373 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/Poseidon.wasm b/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/Poseidon.wasm new file mode 100644 index 000000000..4eab08936 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/Poseidon.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e49516dae0cc9e5d57512b344fa2375c8e39fb2ce6de67dff6a8d31facab65a +size 72189 diff --git a/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/poseidon.sol b/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/poseidon.sol new file mode 100644 index 000000000..6034c2697 --- /dev/null +++ b/benchmarks/paper/benchmarks/contracts/bench_contract/poseidon/poseidon.sol @@ -0,0 +1,82 @@ +/// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; +// import "hardhat/console.sol"; + + + +contract Poseidon { + uint constant F = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint constant ROUNDS_F = 8; + uint constant ROUNDS_P = 57; + uint constant T = 3; + + uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b; + uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771; + uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7; + uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0; + uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23; + uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911; + uint constant M20 = 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d; + uint constant M21 = 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa; + uint constant M22 = 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0; + +// function extBenchmark(address p) public view returns (uint) { +// uint g = gasleft(); +// uint r = Poseidon2(p).poseidon([uint(2), 1]); +// console.log("iden3 impl", g - gasleft()); +// return r; +// } + +// function hashBenchmark(uint[2] memory inputs) public view returns (uint) { +// uint g = gasleft(); +// uint r = hash(inputs); +// console.log("solidity impl", g - gasleft()); +// return r; +// } + + function test_poseidon() public payable returns (bool) { + uint[2] memory input = [ + 0x08fd69dd1602112194d1fefd8c2b20242e371879feba6683a4bdeebd6e8f121c, + 0x2a17023cc2483bf305661df2580c3b29444f8b954de7f2166091592ba7728591 + ]; + uint expected = 0x312caa17b630038ed8ffb058c6aac74159c87d55c558223b953afcddcfc7df6; + uint r = hash(input); + // console.log("r = ", r); + // require(r==expected, "poseidon result not match"); + return r==expected; + } + + function hash(uint[2] memory inputs) public pure returns (uint) { + uint[195] memory C = [0x0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e, 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864, 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5, 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0, 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2, 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa, 0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, 0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, 0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, 0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, 0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, 0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, 0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, 0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, 0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, 0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, 0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, 0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, 0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, 0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, 0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, 0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, 0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, 0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, 0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, 0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, 0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, 0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, 0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, 0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, 0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, 0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, 0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, 0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, 0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, 0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, 0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, 0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, 0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, 0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, 0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, 0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, 0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, 0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, 0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, 0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, 0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, 0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, 0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, 0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, 0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, 0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, 0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, 0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, 0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, 0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, 0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, 0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, 0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, 0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, 0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, 0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, 0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, 0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, 0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, 0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, 0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, 0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, 0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, 0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, 0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, 0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, 0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, 0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, 0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, 0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, 0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, 0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, 0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, 0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, 0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, 0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, 0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, 0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, 0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, 0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, 0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, 0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, 0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, 0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, 0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, 0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, 0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, 0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, 0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, 0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, 0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, 0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, 0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, 0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, 0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, 0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, 0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, 0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, 0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, 0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, 0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, 0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, 0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, 0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, 0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, 0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, 0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, 0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, 0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, 0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, 0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, 0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, 0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, 0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, 0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, 0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, 0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, 0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, 0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, 0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, 0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, 0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, 0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, 0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, 0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, 0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, 0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, 0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, 0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, 0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, 0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, 0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, 0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, 0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, 0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, 0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, 0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, 0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, 0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, 0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, 0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, 0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, 0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, 0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, 0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, 0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, 0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, 0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, 0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, 0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, 0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, 0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, 0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, 0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, 0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, 0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, 0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, 0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, 0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, 0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, 0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, 0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, 0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, 0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, 0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, 0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, 0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, 0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, 0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, 0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, 0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, 0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, 0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, 0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, 0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, 0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, 0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, 0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, 0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, 0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, 0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, 0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, 0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, 0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, 0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, 0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, 0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, 0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, 0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161]; + + uint state0 = 0; + uint state1 = inputs[0]; + uint state2 = inputs[1]; + uint swap0 = 0; + uint swap1 = inputs[0]; + uint swap2 = inputs[1]; + for (uint8 r = 0; r < ROUNDS_F + ROUNDS_P; r++) { + state0 = addmod(swap0, C[r * T + 0], F); + state1 = addmod(swap1, C[r * T + 1], F); + state2 = addmod(swap2, C[r * T + 2], F); + + state0 = pow5mod(state0); + if (r < ROUNDS_F / 2 || r >= ROUNDS_F / 2 + ROUNDS_P) { + state1 = pow5mod(state1); + state2 = pow5mod(state2); + } + + swap0 = addmod(addmod(addmod(0, mulmod(state0, M00, F), F), mulmod(state1, M10, F), F), mulmod(state2, M20, F), F); + swap1 = addmod(addmod(addmod(0, mulmod(state0, M01, F), F), mulmod(state1, M11, F), F), mulmod(state2, M21, F), F); + swap2 = addmod(addmod(addmod(0, mulmod(state0, M02, F), F), mulmod(state1, M12, F), F), mulmod(state2, M22, F), F); + } + return swap0; + } + + function pow5mod(uint i) public pure returns (uint) { + uint a = mulmod(i, i, F); + uint c = mulmod(a, a, F); + return mulmod(i, c, F); + } + +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/fib/README.md b/benchmarks/paper/benchmarks/fib/README.md new file mode 100644 index 000000000..442c3ca82 --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/README.md @@ -0,0 +1,19 @@ +# Standalone Fibonacci / MD5 Cases + +Standalone cases used by the paper's compute-intensive and general-purpose Wasm comparisons (no contract hostapi dependency). + +Source: experiment archive (original timings are in the paper's fib/overflow table). + +## Files + +| File | Description | +|------|-------------| +| `fib.sol` | iterative / tail-call-optimized Fibonacci Solidity contract source | +| `fib.wasm` | fib.sol compiled via the Solidity→Wasm toolchain (recursive-call path, args=30/40) | +| `fib.c.wasm` | C Fibonacci build artifact | +| `fib_no_contract.c.wasm` | contract-free C Fibonacci (the `args=30/40` rows in `fib&overflow.md`) | +| `md5.c` | MD5 C source (for compiling to wasm; artifact not archived) | + +## Corresponding Paper Data + +The `fib_no_contract.c.wasm (args=30/40)` and `fib.wasm (recursive, args=30/40)` rows in the paper's fib/overflow table. diff --git a/benchmarks/paper/benchmarks/fib/fib.c.wasm b/benchmarks/paper/benchmarks/fib/fib.c.wasm new file mode 100644 index 000000000..fe4e4162f --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/fib.c.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73a25f7e2535cba0ad25580d093e29b35fef47fb6f7120feb00e03a0c150c0c1 +size 478 diff --git a/benchmarks/paper/benchmarks/fib/fib.sol b/benchmarks/paper/benchmarks/fib/fib.sol new file mode 100644 index 000000000..328aeed40 --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/fib.sol @@ -0,0 +1,37 @@ +pragma solidity ^0.8.0; + +contract FibonacciTest { + + function fibonacci(uint n) public pure returns (uint) { + if (n == 0) return 0; + if (n == 1) return 1; + + uint a = 0; + uint b = 1; + uint result; + + for (uint i = 2; i <= n; i++) { + result = a + b; + a = b; + b = result; + } + + return result; + } + + function fibonacciTailOptimized(uint n) public pure returns (uint) { + if (n == 0) return 0; + + uint a = 0; + uint b = 1; + + while (n > 1) { + uint temp = b; + b = a + b; + a = temp; + n--; + } + + return b; + } +} \ No newline at end of file diff --git a/benchmarks/paper/benchmarks/fib/fib.wasm b/benchmarks/paper/benchmarks/fib/fib.wasm new file mode 100644 index 000000000..517099d00 --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/fib.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c34728c6d1ac12cec7e917deed344e99da91b11e896ee75bac12095c54070860 +size 7103 diff --git a/benchmarks/paper/benchmarks/fib/fib_no_contract.c.wasm b/benchmarks/paper/benchmarks/fib/fib_no_contract.c.wasm new file mode 100644 index 000000000..3b09a60a8 --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/fib_no_contract.c.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f7ca9196ff8a41731e84d45d1cba8a34b7bb56f48cd1403a37a8dabf8fe227c +size 322 diff --git a/benchmarks/paper/benchmarks/fib/md5.c b/benchmarks/paper/benchmarks/fib/md5.c new file mode 100644 index 000000000..a5fb860e4 --- /dev/null +++ b/benchmarks/paper/benchmarks/fib/md5.c @@ -0,0 +1,51 @@ +#include +#include + +/* + * Custom memcmp implementation for comparing two memory blocks. + */ +int my_memcmp(const void *s1, const void *s2, size_t n) { + const unsigned char *p1 = (const unsigned char *)s1; + const unsigned char *p2 = (const unsigned char *)s2; + + for (size_t i = 0; i < n; i++) { + if (p1[i] != p2[i]) { + return p1[i] - p2[i]; + } + } + return 0; // identical +} + +/* + * Custom strlen implementation for computing string length. + */ +size_t my_strlen(const char *s) { + size_t len = 0; + while (s[len] != '\0') { + len++; + } + return len; +} + +/* + * Compare the MD5 hash of the string "hello world" with the expected value. + * Returns 1 (true) if hashes match, otherwise returns 0 (false). + */ +int check_md5() { + const char *input_string = "hello world"; // Input string + const unsigned char expected[MD5_DIGEST_LENGTH] = { + 0x5e, 0xb6, 0x3b, 0xbb, 0xe0, 0x1e, 0xee, 0xd0, + 0x93, 0xcb, 0x22, 0xbb, 0x8f, 0x5a, 0xcd, 0xc3 // Expected MD5 hash + }; + + unsigned char md5_output[MD5_DIGEST_LENGTH]; // Buffer to store computed MD5 + + // MD5 computation + MD5_CTX ctx; + MD5_Init(&ctx); + MD5_Update(&ctx, input_string, my_strlen(input_string)); + MD5_Final(md5_output, &ctx); + + // Compare computed MD5 with expected MD5 using custom memcmp. + return my_memcmp(md5_output, expected, MD5_DIGEST_LENGTH) == 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/README.md b/benchmarks/paper/benchmarks/overflow/README.md new file mode 100644 index 000000000..c0c9882bc --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/README.md @@ -0,0 +1,37 @@ +# Overflow + fib(30) Benchmarks + +A Uniswap-swap-style **integer-overflow check** test plus a **fib(30) iteration** test. Both share the same 5-way benchmark (DTVM vs Wasmtime 45 / Wasmer 7.1 cranelift / singlepass / llvm). + +## Entry Points + +| File | Contents | +|------|----------| +| [`REPRODUCE_fib_overflow_5way.md`](REPRODUCE_fib_overflow_5way.md) | 5-way reproduction guide (runtime install → wasm build → benchmark → methodology) | +| `run_dtvm.sh` | reruns the DTVM column (builds the wasm on first run) | +| `run_wasmtime45.sh` | reruns the wasmtime column | + +## Key Parameters + +| Experiment | Parameters | +|------------|-----------| +| **fib(30) iterative** | 500,000,000 outer iterations × fib(30) with 8x unrolling; pure integer math, no imports / memory | +| **Integer overflow** | `n=100000000`, `input_amount=2000000`; DTVM uses `checked_i64_*` host functions, other runtimes use `__builtin_*_overflow` compiled into the wasm | + +## Benchmark Dependencies + +- DTVM main HEAD (see `../../runtimes/dtvm_main/README.md` or `REPRODUCE_fib_overflow_5way.md` §1) +- Wasmtime 45.0.0 (`../../runtimes/wasmtime-45.0.0/`) +- Wasmer 7.1.0, three backends, incl. LLVM 21 (`../../runtimes/wasmer-7.1.0/`) +- Emscripten (wasm build; measured locally with 5.0.7, `-O2`) +- `taskset -c 0` single-core pinning + 5 reps → median + +## Files + +| File | Description | +|------|-------------| +| `perf_test_swap_pool.cpp` | overflow C++ source (DTVM / non-DTVM / wasmer variants selected by macros) | +| `perf_test_fib_iter.cpp`, `perf_test_fib_iter_unrolled.cpp` | fib(30) iterative C++ sources | +| `perf_test_fib.cpp` / `fib_recursive.cpp` | fib(30) recursive variants (reference) | +| `perf_test_swap_pool_{dtvm,non_dtvm,wasmer}_O{0,1,2,g}.wasm` | overflow build artifacts (12) | +| `perf_test_fib*.wasm`, `fib_recursive*.wasm` | fib build artifacts | +| `build.sh` | legacy build script (paper-era wasmtime 31; historical reference — use `run_*.sh` now) | diff --git a/benchmarks/paper/benchmarks/overflow/REPRODUCE_fib_overflow_5way.md b/benchmarks/paper/benchmarks/overflow/REPRODUCE_fib_overflow_5way.md new file mode 100644 index 000000000..5a884a5ce --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/REPRODUCE_fib_overflow_5way.md @@ -0,0 +1,166 @@ +# Reproduction Guide: fib(30) + Overflow 5-way Benchmark + +## Prerequisites + +- Linux x86_64 system +- Rust toolchain (for building Wasmer) +- LLVM 21 (for the Wasmer LLVM backend) +- Emscripten (for compiling wasm from C++) +- CMake 3.20+, GCC/Clang with C++17 + +## 1. Build DTVM + +```bash +cd /path/to/DTVM +cmake -B build -DCMAKE_BUILD_TYPE=Release \ + -DZEN_ENABLE_MULTIPASS_JIT=ON \ + -DZEN_ENABLE_CHECKED_ARITHMETIC=ON \ + -DZEN_ENABLE_BUILTIN_LIBC=ON +cmake --build build -j$(nproc) --target dtvm +``` + +## 2. Install Wasmtime 45.0.0 + +```bash +curl https://wasmtime.dev/install.sh -sSf | bash -s -- --version v45.0.0 +# Binary: ~/.wasmtime/bin/wasmtime +~/.wasmtime/bin/wasmtime --version +# Expected: wasmtime 45.0.0 +``` + +## 3. Build Wasmer 7.1.0 + +```bash +# Extract LLVM 21 (for the LLVM backend) +cd /opt +tar xf LLVM-21.1.8-Linux-X64.tar.xz +export LLVM_SYS_211_PREFIX=/opt/LLVM-21.1.8-Linux-X64 + +# Build Wasmer with all 3 backends +git clone --branch v7.1.0 --depth 1 https://github.com/wasmerio/wasmer.git wasmer-7.1.0 +cd wasmer-7.1.0 +cargo build --release --features cranelift,singlepass,llvm +# Binary: target/release/wasmer +``` + +## 4. Compile Wasm Files + +### fib(30) iterative (shared by all runtimes) + +```bash +cd benchmarks/overflow + +# Compile with emscripten (reactor mode, no main) +emcc -O2 -s STANDALONE_WASM=1 -s EXPORTED_FUNCTIONS='["_test_fib_iter"]' \ + --no-entry -o perf_test_fib_iter_invoke.wasm perf_test_fib_iter.cpp +``` + +### Integer overflow — DTVM variant + +```bash +emcc -O2 -s STANDALONE_WASM=1 -DENABLE_DTVM_TEST \ + -s EXPORTED_FUNCTIONS='["_test_dtvm"]' \ + --no-entry -o perf_test_swap_pool_dtvm_O2.wasm perf_test_swap_pool.cpp +``` + +### Integer overflow — Wasmtime variant (reactor, --invoke) + +```bash +emcc -O2 -s STANDALONE_WASM=1 \ + -s EXPORTED_FUNCTIONS='["_test_traditional"]' \ + --no-entry -o perf_test_swap_pool_non_dtvm_O2.wasm perf_test_swap_pool.cpp +``` + +### Integer overflow — Wasmer variant (with main entry) + +```bash +emcc -O2 -s STANDALONE_WASM=1 \ + -o perf_test_swap_pool_wasmer_O2.wasm perf_test_swap_pool.cpp +``` + +## 5. Run Benchmarks + +### Variables + +```bash +DTVM=./build/dtvm +WASMTIME=~/.wasmtime/bin/wasmtime +WASMER=/path/to/wasmer-7.1.0/target/release/wasmer +BENCH=benchmarks/overflow +FIB_WASM=$BENCH/perf_test_fib_iter_invoke.wasm +``` + +### Benchmark 1: fib(30) iterative (500M iterations) + +```bash +# DTVM +taskset -c 0 bash -c "time $DTVM $FIB_WASM -m multipass \ + -f test_fib_iter --args 500000000 30" + +# Wasmtime 45 +taskset -c 0 bash -c "time $WASMTIME run -C cache=n \ + --invoke test_fib_iter $FIB_WASM 500000000 30" + +# Wasmer Cranelift +taskset -c 0 bash -c "time $WASMER run --cranelift \ + --invoke test_fib_iter $FIB_WASM -- 500000000 30" + +# Wasmer Singlepass +taskset -c 0 bash -c "time $WASMER run --singlepass \ + --invoke test_fib_iter $FIB_WASM -- 500000000 30" + +# Wasmer LLVM +taskset -c 0 bash -c "time $WASMER run --llvm \ + --invoke test_fib_iter $FIB_WASM -- 500000000 30" +``` + +**Expected output:** `832040` (= fib(30)) + +### Benchmark 2: Integer overflow (100M iterations) + +```bash +# DTVM (uses checked_i64 hostapi) +taskset -c 0 bash -c "time $DTVM --format wasm -m multipass \ + -f test_dtvm $BENCH/perf_test_swap_pool_dtvm_O2.wasm --args 100000000 2000000" + +# Wasmtime 45 (uses __builtin_*_overflow) +taskset -c 0 bash -c "time $WASMTIME run -C cache=n \ + --invoke test_traditional $BENCH/perf_test_swap_pool_non_dtvm_O2.wasm \ + 100000000 2000000" + +# Wasmer Cranelift +taskset -c 0 bash -c "time $WASMER run --cranelift \ + $BENCH/perf_test_swap_pool_wasmer_O2.wasm -- 100000000 2000000" + +# Wasmer Singlepass +taskset -c 0 bash -c "time $WASMER run --singlepass \ + $BENCH/perf_test_swap_pool_wasmer_O2.wasm -- 100000000 2000000" + +# Wasmer LLVM +taskset -c 0 bash -c "time $WASMER run --llvm \ + $BENCH/perf_test_swap_pool_wasmer_O2.wasm -- 100000000 2000000" +``` + +**Expected output:** `423724150000000` (consistent across all runtimes) + +## 6. Methodology + +- **CPU pinning:** `taskset -c 0` pins to a single core to reduce variance +- **Repetitions:** 5 reps per configuration, report **median** +- **Timing:** bash `time` command (wall-clock `real` time) +- **Warm-up:** None needed — compilation time is negligible for these small modules +- **Cache:** Wasmtime cache disabled (`-C cache=n`) for fair comparison + +## 7. Notes + +- The overflow benchmark uses **different wasm files** per runtime: DTVM uses + native `checked_i64_*` host functions, while other runtimes use + `__builtin_*_overflow` compiled to wasm branches. This reflects a real + architectural advantage of DTVM, not a testing artifact. + +- Wasmer 7.1.0 has a bug with `--invoke` on reactor-style wasm modules + (exit code 45 for parameter passing), so the overflow benchmark for + Wasmer uses wasm files with a `main()` entry point instead. + +- Each benchmark run takes 2-13 seconds depending on runtime, so a full + 5-rep 5-runtime 2-benchmark suite completes in ~10 minutes. diff --git a/benchmarks/paper/benchmarks/overflow/build.sh b/benchmarks/paper/benchmarks/overflow/build.sh new file mode 100644 index 000000000..1d0b7a565 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/build.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -e + +# Same workload two ways: with the DTVM checked-arithmetic hostapi (dtvm build) vs plain wasm (wasmtime). + + +# build for dtvm +echo 'swap overflow perf test of dtvm' +em++ -std=c++17 -o perf_test_swap_pool_dtvm.wasm -O2 perf_test_swap_pool.cpp -DENABLE_DTVM_TEST -I . -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_dtvm.wasm -O1 perf_test_swap_pool.cpp -DENABLE_DTVM_TEST -I . -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_dtvm.wasm -O0 perf_test_swap_pool.cpp -DENABLE_DTVM_TEST -I . -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_dtvm.wasm -g perf_test_swap_pool.cpp -DENABLE_DTVM_TEST -I . -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +cmake --build build -j7 +wasm2wat -o perf_test_swap_pool_dtvm.wat perf_test_swap_pool_dtvm.wasm +time ./build/dtvm -m multipass -f test_dtvm perf_test_swap_pool_dtvm.wasm --args 100000000 2000000 + +# build for non dtvm +echo 'swap overflow perf test of wasmtime' +em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O2 perf_test_swap_pool.cpp -I . -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O1 perf_test_swap_pool.cpp -I . -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O0 perf_test_swap_pool.cpp -I . -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -g perf_test_swap_pool.cpp -I . -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' --no-entry -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +wasm2wat -o perf_test_swap_pool_non_dtvm.wat perf_test_swap_pool_non_dtvm.wasm +time /opt/wasmtime-v31.0.0-x86_64-linux/wasmtime --invoke test_traditional perf_test_swap_pool_non_dtvm.wasm 100000000 2000000 + +# build for wasmer +echo 'swap overflow perf test of wasmer' +em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O2 perf_test_swap_pool.cpp -I . -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O1 perf_test_swap_pool.cpp -I . -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -O0 perf_test_swap_pool.cpp -I . -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +# em++ -std=c++17 -o perf_test_swap_pool_non_dtvm.wasm -g perf_test_swap_pool.cpp -I . -Wl,--allow-undefined -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 -s STANDALONE_WASM=0 -s PURE_WASI=1 +wasm2wat -o perf_test_swap_pool_non_dtvm.wat perf_test_swap_pool_non_dtvm.wasm +# wasmer --llvm , wasmer --cranelift, wasmer-singlepass +time wasmer run --llvm perf_test_swap_pool_non_dtvm.wasm -- 100000000 2000000 +time wasmer run --cranelift perf_test_swap_pool_non_dtvm.wasm -- 100000000 2000000 +time wasmer run --singlepass perf_test_swap_pool_non_dtvm.wasm -- 100000000 2000000 diff --git a/benchmarks/paper/benchmarks/overflow/fib_recursive.cpp b/benchmarks/paper/benchmarks/overflow/fib_recursive.cpp new file mode 100644 index 000000000..6f3c4fac4 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/fib_recursive.cpp @@ -0,0 +1,27 @@ +// Recursive Fibonacci benchmark — standalone wasm version +// Usage: fibonacci_recursive(n) returns fib(n) +// Intentionally uses naive recursive algorithm to create meaningful workload + +#include + +__attribute__((noinline)) +int64_t fib(int64_t n) { + if (n <= 1) return n; + return fib(n - 1) + fib(n - 2); +} + +// Entry point for DTVM/wasmtime --invoke +extern "C" int64_t fibonacci_recursive(int n) { + return fib((int64_t)n); +} + +// Entry point for wasmer run (via main) +int main(int argc, char* argv[]) { + if (argc < 2) return 1; + int n = 0; + for (const char* p = argv[1]; *p >= '0' && *p <= '9'; ++p) + n = n * 10 + (*p - '0'); + volatile int64_t result = fib((int64_t)n); + (void)result; + return 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/fib_recursive_invoke.wasm b/benchmarks/paper/benchmarks/overflow/fib_recursive_invoke.wasm new file mode 100755 index 000000000..dcda439b4 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/fib_recursive_invoke.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20c60a41b3ab808174e7df7b503ad4bcd2b73cf076cebf424fe94468059201d +size 200 diff --git a/benchmarks/paper/benchmarks/overflow/fib_recursive_main.wasm b/benchmarks/paper/benchmarks/overflow/fib_recursive_main.wasm new file mode 100755 index 000000000..766a14e10 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/fib_recursive_main.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81866afb2045510399b9d1b7864c1cfcd5139156ca794894017c5934f3d0d67f +size 577 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib.cpp b/benchmarks/paper/benchmarks/overflow/perf_test_fib.cpp new file mode 100644 index 000000000..5c1dbe1a8 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib.cpp @@ -0,0 +1,65 @@ +/** + * Fibonacci Benchmark + * ------------------- + * Recursive fibonacci — compute-intensive benchmark to measure + * JIT compilation quality across different Wasm runtimes. + * + * Unlike perf_test_swap_pool.cpp, this benchmark does NOT use any + * DTVM-specific host APIs. The same source and wasm binary can be + * used across DTVM, Wasmtime, and Wasmer for a fair comparison. + * + * Usage: + * test_fib(iterations, fib_n) + * - iterations: number of times to call fib(fib_n) in a loop + * - fib_n: fibonacci input (e.g. 30) + * Returns the last fib result (for correctness check). + * + * Build (invoke-style, no main, for DTVM/wasmtime --invoke): + * em++ perf_test_fib.cpp -O2 -o perf_test_fib_invoke.wasm \ + * --no-entry \ + * -s EXPORTED_FUNCTIONS='["_test_fib"]' \ + * -s EXPORTED_RUNTIME_METHODS='[]' + * + * Build (main-style, for wasmer run / wasmtime run): + * em++ perf_test_fib.cpp -O2 -o perf_test_fib_main.wasm \ + * -s EXPORTED_FUNCTIONS='["_test_fib"]' \ + * -s EXPORTED_RUNTIME_METHODS='[]' + * + * Run: + * dtvm perf_test_fib_invoke.wasm -m multipass -f test_fib --args 10000 30 + * wasmtime run -C cache=n --invoke test_fib perf_test_fib_invoke.wasm 10000 30 + * wasmer run --invoke test_fib perf_test_fib_invoke.wasm -- 10000 30 + * wasmer run --singlepass --invoke test_fib perf_test_fib_invoke.wasm -- 10000 30 + */ +#include +#include + +// Naive recursive fibonacci — O(2^n) by design to stress the JIT +__attribute__((noinline)) +static int64_t fib(int64_t n) { + if (n <= 1) return n; + return fib(n - 1) + fib(n - 2); +} + +// Prevent the compiler from hoisting fib() out of the loop. +// Each iteration feeds (result & 1) back into fib_n, creating a true +// data dependency. Since (result & 1) is 0 or 1, the actual input is +// fib_n or fib_n+1, negligible difference for benchmarking purposes. +extern "C" int64_t test_fib(int32_t iterations, int32_t fib_n) { + int64_t result = 0; + for (int32_t i = 0; i < iterations; i++) { + result = fib(static_cast(fib_n) + (result & 1)); + } + return result; +} + +// Entry for wasmer run / wasmtime run (via _start -> main) +int main(int argc, char* argv[]) { + int iterations = 10000; + int fib_n = 30; + if (argc >= 2) iterations = atoi(argv[1]); + if (argc >= 3) fib_n = atoi(argv[2]); + volatile int64_t result = test_fib(iterations, fib_n); + (void)result; + return 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_invoke.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_fib_invoke.wasm new file mode 100755 index 000000000..7429e1eea --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_invoke.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:029bff8a0be71c7553b5da01ae048d2a82c7bbbdc96862cc48969c71d572bcbd +size 330 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter.cpp b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter.cpp new file mode 100644 index 000000000..ed37ac078 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter.cpp @@ -0,0 +1,54 @@ +/** + * Fibonacci Benchmark (Iterative version) + * ---------------------------------------- + * Iterative fibonacci — matches fib.sol's actual implementation. + * Same wasm binary for all runtimes (no host API imports). + * + * Build: + * em++ perf_test_fib_iter.cpp -O2 -o perf_test_fib_iter_invoke.wasm \ + * --no-entry \ + * -s EXPORTED_FUNCTIONS='["_test_fib_iter"]' \ + * -s EXPORTED_RUNTIME_METHODS='[]' + * + * Run: + * dtvm perf_test_fib_iter_invoke.wasm -m multipass -f test_fib_iter --args 100000000 30 + * wasmtime run -C cache=n --invoke test_fib_iter perf_test_fib_iter_invoke.wasm 100000000 30 + * wasmer run --invoke test_fib_iter perf_test_fib_iter_invoke.wasm -- 100000000 30 + * wasmer run --singlepass --invoke test_fib_iter perf_test_fib_iter_invoke.wasm -- 100000000 30 + */ +#include +#include + +// Iterative fibonacci — O(n), same as fib.sol +__attribute__((noinline)) +static int64_t fib_iter(int64_t n) { + if (n == 0) return 0; + if (n == 1) return 1; + int64_t a = 0, b = 1; + for (int64_t i = 2; i <= n; i++) { + int64_t tmp = a + b; + a = b; + b = tmp; + } + return b; +} + +// Entry point: run fib_iter(fib_n) for `iterations` times. +// Data dependency (result & 1) prevents loop-invariant hoisting. +extern "C" int64_t test_fib_iter(int32_t iterations, int32_t fib_n) { + int64_t result = 0; + for (int32_t i = 0; i < iterations; i++) { + result = fib_iter(static_cast(fib_n) + (result & 1)); + } + return result; +} + +int main(int argc, char* argv[]) { + int iterations = 100000000; + int fib_n = 30; + if (argc >= 2) iterations = atoi(argv[1]); + if (argc >= 3) fib_n = atoi(argv[2]); + volatile int64_t result = test_fib_iter(iterations, fib_n); + (void)result; + return 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_invoke.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_invoke.wasm new file mode 100755 index 000000000..8e27e06ed --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_invoke.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c34d82e9f3e5a3f76cf9c57ba0e7dc99263201f0c615ceccc705b9969306266 +size 445 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.cpp b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.cpp new file mode 100644 index 000000000..009e1f54f --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.cpp @@ -0,0 +1,72 @@ +/** + * Fibonacci Benchmark (Iterative, MANUALLY 8x UNROLLED) + * ----------------------------------------------------- + * Same as perf_test_fib_iter.cpp but with the inner loop manually + * unrolled 8x to simulate what Cranelift v45 does automatically. + * Purpose: verify that loop unrolling is the key optimization + * that would close the gap between DTVM and Cranelift. + * + * Build: + * em++ perf_test_fib_iter_unrolled.cpp -O2 -o perf_test_fib_iter_unrolled.wasm \ + * --no-entry \ + * -s EXPORTED_FUNCTIONS='["_test_fib_iter_unrolled"]' \ + * -s EXPORTED_RUNTIME_METHODS='[]' + */ +#include + +__attribute__((noinline)) +static int64_t fib_iter_unrolled(int64_t n) { + if (n == 0) return 0; + if (n == 1) return 1; + int64_t a = 0, b = 1; + int64_t i = 2; + + // Unrolled 8x: each iteration advances 8 fibonacci steps + int64_t limit = n - 7; // avoid overflow: loop while i <= n-7 + for (; i <= limit; i += 8) { + int64_t t0 = a + b; // step 1 + int64_t t1 = b + t0; // step 2 + int64_t t2 = t0 + t1; // step 3 + int64_t t3 = t1 + t2; // step 4 + int64_t t4 = t2 + t3; // step 5 + int64_t t5 = t3 + t4; // step 6 + int64_t t6 = t4 + t5; // step 7 + int64_t t7 = t5 + t6; // step 8 + a = t6; + b = t7; + } + + // Remainder loop + for (; i <= n; i++) { + int64_t tmp = a + b; + a = b; + b = tmp; + } + return b; +} + +extern "C" int64_t test_fib_iter_unrolled(int32_t iterations, int32_t fib_n) { + int64_t result = 0; + for (int32_t i = 0; i < iterations; i++) { + result = fib_iter_unrolled(static_cast(fib_n) + (result & 1)); + } + return result; +} + +int main(int argc, char* argv[]) { + int iterations = 500000000; + int fib_n = 30; + if (argc >= 2) { + iterations = 0; + for (const char* p = argv[1]; *p >= '0' && *p <= '9'; ++p) + iterations = iterations * 10 + (*p - '0'); + } + if (argc >= 3) { + fib_n = 0; + for (const char* p = argv[2]; *p >= '0' && *p <= '9'; ++p) + fib_n = fib_n * 10 + (*p - '0'); + } + volatile int64_t result = test_fib_iter_unrolled(iterations, fib_n); + (void)result; + return 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.wasm new file mode 100755 index 000000000..4498424de --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_iter_unrolled.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:856acd579a75f50e3950966253b0ac8439a9aa6b6a170d13aa5954e92dbee752 +size 670 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_fib_main.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_fib_main.wasm new file mode 100755 index 000000000..fb0b51c13 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_fib_main.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a426bcd35e0602b1dc063a2cff7116777da6bdaa5ffc70216ba31c8c5524dcf6 +size 753 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool.cpp b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool.cpp new file mode 100644 index 000000000..d3e7a227c --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool.cpp @@ -0,0 +1,187 @@ +/** + * DeFi AMM Overflow Protection Benchmark + * ------------------------------------- + * This benchmark compares the performance of two integer overflow protection approaches + * in a realistic DeFi Automated Market Maker (AMM) scenario: + * + * 1. Traditional C/C++ approach using __builtin_*_overflow intrinsics + * 2. Wasm JIT VM approach using native checked_i*_* operations + * + * The test simulates token swap calculations based on the constant product formula (x*y=k), + * which is the core of many DEX platforms like Uniswap. Each calculation involves multiple + * arithmetic operations that require overflow protection to ensure financial safety. + * + * Integer overflow vulnerabilities have been the source of numerous DeFi exploits, + * making this a particularly relevant benchmark for blockchain applications. + */ +#include +#include + +#ifdef ENABLE_DTVM_TEST +// DTVM checked-arithmetic hostapi +extern "C" int64_t checked_i64_add(int64_t a, int64_t b); +extern "C" int64_t checked_i64_sub(int64_t a, int64_t b); +extern "C" int64_t checked_i64_mul(int64_t a, int64_t b); +#else +#include +#include + +static void panic(const char* message) { + fprintf(stderr, "PANIC: %s", message); + exit(1); +} + +#endif // ENABLE_DTVM_TEST + +#ifndef ENABLE_DTVM_TEST +// Traditional overflow checking +int64_t safe_add_traditional(int64_t a, int64_t b) { + int64_t result; + if (__builtin_add_overflow(a, b, &result)) { + panic("Integer overflow in addition"); + } + return result; +} + +int64_t safe_sub_traditional(int64_t a, int64_t b) { + int64_t result; + if (__builtin_sub_overflow(a, b, &result)) { + panic("Integer underflow in subtraction"); + } + return result; +} + +int64_t safe_mul_traditional(int64_t a, int64_t b) { + int64_t result; + if (__builtin_mul_overflow(a, b, &result)) { + panic("Integer overflow in multiplication"); + } + return result; +} + +int64_t safe_div_traditional(int64_t a, int64_t b) { + if (b == 0) { + panic("Division by zero"); + } + if (a == INT64_MIN && b == -1) { + panic("Integer overflow in division"); + } + return a / b; +} + +// AMM output with traditional overflow checks +int64_t get_output_amount_traditional(int64_t input_amount, int64_t input_reserve, + int64_t output_reserve, int64_t fee_numerator, + int64_t fee_denominator) { + // Input amount after the fee + int64_t input_with_fee = safe_mul_traditional(input_amount, + safe_sub_traditional(fee_denominator, fee_numerator)); + input_with_fee = safe_div_traditional(input_with_fee, fee_denominator); + + // Constant-product formula: output = (input_with_fee * output_reserve) / (input_reserve + input_with_fee) + int64_t numerator = safe_mul_traditional(input_with_fee, output_reserve); + int64_t denominator = safe_add_traditional(input_reserve, input_with_fee); + int64_t output_amount = safe_div_traditional(numerator, denominator); + + return output_amount; +} + +#endif // !ENABLE_DTVM_TEST + +// AMM output with WasmVM overflow checks +#ifdef ENABLE_DTVM_TEST +int64_t get_output_amount_wasmvm(int64_t input_amount, int64_t input_reserve, + int64_t output_reserve, int64_t fee_numerator, + int64_t fee_denominator) { + // Input amount after the fee + int64_t input_with_fee = checked_i64_mul(input_amount, + checked_i64_sub(fee_denominator, fee_numerator)); + input_with_fee = input_with_fee/fee_denominator; + + // Constant-product formula: output = (input_with_fee * output_reserve) / (input_reserve + input_with_fee) + int64_t numerator = checked_i64_mul(input_with_fee, output_reserve); + int64_t denominator = checked_i64_add(input_reserve, input_with_fee); + int64_t output_amount = numerator/denominator; + + return output_amount; +} +#endif // ENABLE_DTVM_TEST + +// Test function - traditional overflow checks +#ifndef ENABLE_DTVM_TEST +extern "C" int64_t test_traditional(int n, int64_t input_amount) { + // volatile prevents optimization + volatile int64_t reserve_x = 1000000000000; + volatile int64_t reserve_y = 4000000000000; + volatile int64_t fee_numerator = 3; + volatile int64_t fee_denominator = 1000; + + // pseudo-random seed prevents loop unrolling + volatile int seed = n; + int64_t total_output = 0; + + for (volatile int i = 0; i < n; i++) { + // pseudo-random direction + int direction = (i + seed) % 2; + + if (direction == 0) { + int64_t output = get_output_amount_traditional( + input_amount, reserve_x, reserve_y, fee_numerator, fee_denominator); + total_output = safe_add_traditional(total_output, output); + } else { + int64_t output = get_output_amount_traditional( + input_amount, reserve_y, reserve_x, fee_numerator, fee_denominator); + total_output = safe_add_traditional(total_output, output); + } + } + + return total_output; +} +#endif // !ENABLE_DTVM_TEST + +// Test function - DTVM overflow checks +#ifdef ENABLE_DTVM_TEST +extern "C" int64_t test_dtvm(int n, int64_t input_amount) { + // volatile prevents optimization + volatile int64_t reserve_x = 1000000000000; + volatile int64_t reserve_y = 4000000000000; + volatile int64_t fee_numerator = 3; + volatile int64_t fee_denominator = 1000; + + // pseudo-random seed prevents loop unrolling + volatile int seed = n; + int64_t total_output = 0; + + for (volatile int i = 0; i < n; i++) { + // pseudo-random direction + int direction = (i + seed) % 2; + + if (direction == 0) { + int64_t output = get_output_amount_wasmvm( + input_amount, reserve_x, reserve_y, fee_numerator, fee_denominator); + total_output = checked_i64_add(total_output, output); + } else { + int64_t output = get_output_amount_wasmvm( + input_amount, reserve_y, reserve_x, fee_numerator, fee_denominator); + total_output = checked_i64_add(total_output, output); + } + } + + return total_output; +} +#endif // ENABLE_DTVM_TEST + +int main(int argc, char *argv[]) { + int n = std::stoi(argv[1]); + int64_t input_amount = std::stoll(argv[2]); + +#ifndef ENABLE_DTVM_TEST + int64_t result = test_traditional(n, input_amount); +#else + int64_t result = test_dtvm(n, input_amount); +#endif + + // printf("Result: %lld\n", result); + + return 0; +} diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O0.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O0.wasm new file mode 100755 index 000000000..4a7364285 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O0.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b14a3a4b15ba5aef7ddd3691460188db959f59defb56bf74c4f30bca5b4ea66 +size 1346 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O1.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O1.wasm new file mode 100755 index 000000000..ba7201a61 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O1.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:183e062445873069ff7aa4fe14b850e5b94558e5bfea4fc7dad25cbd3fede33a +size 747 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O2.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O2.wasm new file mode 100755 index 000000000..b1167535c --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_O2.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:425b529e0bea8c5a4b47092e4a57a5b01689543894d45bf62520a3dfdf1dfde5 +size 414 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_g.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_g.wasm new file mode 100755 index 000000000..66f66d9b7 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_dtvm_g.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:110123b52f81aeb823954f2ddaa643bc7b671147077002dbc28c24f8cdd9ba07 +size 1016 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O0.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O0.wasm new file mode 100755 index 000000000..f1fc2fd87 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O0.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:005ef1827f06f9a9fc6971b3bdc1ce86af9ba5efe5d375599a4b1c975fc9fbc3 +size 14796 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O1.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O1.wasm new file mode 100755 index 000000000..fd5fce564 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O1.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c92385fd878469d90651d157b8d75706214b31eb502ca300cd0602d7c0a8c5d +size 9175 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O2.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O2.wasm new file mode 100755 index 000000000..482079bfa --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_O2.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8b96519fa59f46bcb311e7bce7cc393685a33ab630004493de92264be2b344b +size 6619 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_g.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_g.wasm new file mode 100755 index 000000000..c44be335b --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_non_dtvm_g.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b4aed2a5fd43b54bf9c4a6fdcd62de0c6b599e9cbb25a787ba396bba7011c97 +size 13627 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O0.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O0.wasm new file mode 100755 index 000000000..dd533688c --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O0.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44046f133c8857a933da15cb3815bbc5fb0411a8127b6ac864ea30395dcbc741 +size 49099 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O1.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O1.wasm new file mode 100755 index 000000000..875e7ba96 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O1.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:978e9515995fc590c6e8effb7c7894178d80dfb2ac81d4b0eddc217ed6e155cd +size 48590 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O2.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O2.wasm new file mode 100755 index 000000000..add45e69e --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_O2.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc6b712415f99e35c36648fba7bbc8200c34666086ef380d189a8fcd7553df5e +size 18547 diff --git a/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_g.wasm b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_g.wasm new file mode 100755 index 000000000..3b31dfa51 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/perf_test_swap_pool_wasmer_g.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae8f7e62f73badccb6a5da1fd0ebaf27561490c190fb003e14dfd094e4458e07 +size 29855 diff --git a/benchmarks/paper/benchmarks/overflow/run_dtvm.sh b/benchmarks/paper/benchmarks/overflow/run_dtvm.sh new file mode 100755 index 000000000..879128369 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/run_dtvm.sh @@ -0,0 +1,84 @@ +#!/bin/bash +# Overflow benchmark runner — DTVM (multipass + checked arithmetic) +# +# Usage: +# 1. Build DTVM with multipass + checked arithmetic enabled (see REPRODUCE_fib_overflow_5way.md §1). +# Override path via: DTVM=/path/to/dtvm bash run_dtvm.sh +# 2. Make sure em++ (Emscripten, tested 5.0.7) is on PATH so wasm can be built. +# 3. Run: bash run_dtvm.sh +# +# This script automatically compiles perf_test_swap_pool.cpp into 4 wasm +# variants (-O2/-O1/-O0/-g) the first time it runs, or whenever the wasm +# file is missing. Set FORCE_REBUILD=1 to always rebuild. +# +# Per opt level: 5 repetitions, taskset CPU 0, bash builtin time. + +set -u +DIR="$(cd "$(dirname "$0")" && pwd)" +DTVM="${DTVM:-$(cd "$DIR/../../../.." && pwd)/build/dtvm}" +source "$DIR/../../scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +OUT="${OUT:-/tmp/overflow_dtvm_raw.log}" +N="${N:-100000000}" +INPUT="${INPUT:-2000000}" +REPS="${REPS:-5}" +CPU="${CPU:-0}" +MODE="${MODE:-multipass}" +FORCE_REBUILD="${FORCE_REBUILD:-0}" + +if [ ! -x "$DTVM" ]; then + echo "dtvm not executable at $DTVM" >&2 + exit 1 +fi + +# Build wasm if missing (or always when FORCE_REBUILD=1). +# Compile command for one variant (Emscripten 5.0.7), note -DENABLE_DTVM_TEST +# which makes the cpp use env::checked_i64_* hostapis instead of __builtin_*_overflow: +# em++ -std=c++17 -O2 -o perf_test_swap_pool_dtvm_O2.wasm \ +# perf_test_swap_pool.cpp -DENABLE_DTVM_TEST -I . \ +# -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' \ +# --no-entry -Wl,--allow-undefined \ +# -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 \ +# -s STANDALONE_WASM=0 -s PURE_WASI=1 +for OPT in O2 O1 O0 g; do + WASM="$DIR/perf_test_swap_pool_dtvm_${OPT}.wasm" + if [ "$FORCE_REBUILD" = "1" ] || [ ! -f "$WASM" ]; then + if ! command -v em++ >/dev/null; then + echo "em++ not on PATH; source emsdk_env.sh first" >&2 + exit 1 + fi + echo "[build] em++ -$OPT -DENABLE_DTVM_TEST -> $(basename "$WASM")" >&2 + em++ -std=c++17 -o "$WASM" -$OPT \ + "$DIR/perf_test_swap_pool.cpp" -DENABLE_DTVM_TEST -I "$DIR" \ + -s 'EXPORTED_FUNCTIONS=["_test_dtvm"]' \ + --no-entry -Wl,--allow-undefined \ + -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 \ + -s STANDALONE_WASM=0 -s PURE_WASI=1 + fi +done + +: > "$OUT" +{ + echo "dtvm: $DTVM ($(stat -c %y "$DTVM" 2>/dev/null | cut -d. -f1))" + echo "dtvm_commit: $(cd "$(dirname "$DTVM")/.." && git rev-parse HEAD 2>/dev/null)" + echo "dtvm_mode: $MODE" + echo "host: $(uname -a)" + echo "cpu_model: $(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | sed 's/^ //')" + echo "cpu_family_model_stepping: family=$(grep -m1 'cpu family' /proc/cpuinfo | awk '{print $4}') model=$(grep -m1 '^model' /proc/cpuinfo | awk '{print $3}') stepping=$(grep -m1 'stepping' /proc/cpuinfo | awk '{print $3}')" + echo "cpu_mhz_observed: $(grep -m1 'cpu MHz' /proc/cpuinfo | awk '{print $4}')" + echo "no_turbo: $(cat /sys/devices/system/cpu/intel_pstate/no_turbo 2>/dev/null || echo unknown)" + echo "governor: $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || echo unknown)" + echo "n=$N input_amount=$INPUT reps=$REPS taskset_cpu=$CPU" + echo "----" +} | tee -a "$OUT" + +for OPT in O2 O1 O0 g; do + WASM="$DIR/perf_test_swap_pool_dtvm_${OPT}.wasm" + echo "### opt=$OPT file=$(basename "$WASM")" | tee -a "$OUT" + for i in $(seq 1 $REPS); do + LINE=$( { taskset -c "$CPU" bash -c "time $DTVM --format wasm -m $MODE -f test_dtvm $WASM --args $N $INPUT >/dev/null"; } 2>&1 | grep -E '^(real|user|sys)' | tr '\n' ' ' ) + echo " rep$i $LINE" | tee -a "$OUT" + done +done +echo "----" | tee -a "$OUT" +echo "raw log: $OUT" diff --git a/benchmarks/paper/benchmarks/overflow/run_wasmtime45.sh b/benchmarks/paper/benchmarks/overflow/run_wasmtime45.sh new file mode 100755 index 000000000..003615ee7 --- /dev/null +++ b/benchmarks/paper/benchmarks/overflow/run_wasmtime45.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# Overflow benchmark — wasmtime 45.0.0 reproducer +# +# Usage: +# 1. Set WT to your wasmtime path (default: ~/.wasmtime/bin/wasmtime). +# 2. Make sure em++ (Emscripten, tested 5.0.7) is on PATH. +# Easiest: `source /path/to/emsdk/emsdk_env.sh` +# 3. Run: bash run_wasmtime45.sh +# +# This script automatically compiles perf_test_swap_pool.cpp into 4 wasm +# variants (-O2/-O1/-O0/-g) the first time it runs, or whenever the wasm +# file is missing. Set FORCE_REBUILD=1 to always rebuild. +# +# Output: stdout + /tmp/overflow_wasmtime45_raw.log +# Records: wasmtime version, host, /proc/cpuinfo cpu MHz, intel_pstate no_turbo, +# governor, then 5 reps × 4 emcc opt levels (O2/O1/O0/g), each pinned to CPU 0. + +set -u +WT="${WT:-$HOME/.wasmtime/bin/wasmtime}" +DIR="$(cd "$(dirname "$0")" && pwd)" +OUT="${OUT:-/tmp/overflow_wasmtime45_raw.log}" +N="${N:-100000000}" +INPUT="${INPUT:-2000000}" +REPS="${REPS:-5}" +CPU="${CPU:-0}" +FORCE_REBUILD="${FORCE_REBUILD:-0}" + +if [ ! -x "$WT" ]; then + echo "wasmtime not executable at $WT" >&2 + exit 1 +fi + +# Build wasm if missing (or always when FORCE_REBUILD=1). +# Compile command for one variant (Emscripten 5.0.7): +# em++ -std=c++17 -O2 -o perf_test_swap_pool_non_dtvm_O2.wasm \ +# perf_test_swap_pool.cpp -I . \ +# -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' \ +# --no-entry -Wl,--allow-undefined \ +# -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 \ +# -s STANDALONE_WASM=0 -s PURE_WASI=1 +for OPT in O2 O1 O0 g; do + WASM="$DIR/perf_test_swap_pool_non_dtvm_${OPT}.wasm" + if [ "$FORCE_REBUILD" = "1" ] || [ ! -f "$WASM" ]; then + if ! command -v em++ >/dev/null; then + echo "em++ not on PATH; source emsdk_env.sh first" >&2 + exit 1 + fi + echo "[build] em++ -$OPT -> $(basename "$WASM")" >&2 + em++ -std=c++17 -o "$WASM" -$OPT \ + "$DIR/perf_test_swap_pool.cpp" -I "$DIR" \ + -s 'EXPORTED_FUNCTIONS=["_test_traditional"]' \ + --no-entry -Wl,--allow-undefined \ + -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s WASM=1 \ + -s STANDALONE_WASM=0 -s PURE_WASI=1 + fi +done + +: > "$OUT" +{ + echo "wasmtime: $($WT --version)" + echo "host: $(uname -a)" + echo "os: $(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2- | tr -d '\"')" + echo "cpu_model: $(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | sed 's/^ //')" + echo "cpu_family_model_stepping: family=$(grep -m1 'cpu family' /proc/cpuinfo | awk '{print $4}') model=$(grep -m1 '^model' /proc/cpuinfo | awk '{print $3}') stepping=$(grep -m1 'stepping' /proc/cpuinfo | awk '{print $3}')" + echo "cpu_mhz_observed: $(grep -m1 'cpu MHz' /proc/cpuinfo | awk '{print $4}')" + echo "no_turbo: $(cat /sys/devices/system/cpu/intel_pstate/no_turbo 2>/dev/null || echo unknown)" + echo "governor: $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || echo unknown)" + echo "n=$N input_amount=$INPUT reps=$REPS taskset_cpu=$CPU" + echo "----" +} | tee -a "$OUT" + +for OPT in O2 O1 O0 g; do + WASM="$DIR/perf_test_swap_pool_non_dtvm_${OPT}.wasm" + echo "### opt=$OPT file=$(basename "$WASM")" | tee -a "$OUT" + for i in $(seq 1 $REPS); do + LINE=$( { taskset -c "$CPU" bash -c "time $WT --invoke test_traditional $WASM $N $INPUT >/dev/null"; } 2>&1 | grep -E '^(real|user|sys)' | tr '\n' ' ' ) + echo " rep$i $LINE" | tee -a "$OUT" + done +done + +echo "----" | tee -a "$OUT" +echo "raw log: $OUT" diff --git a/benchmarks/paper/benchmarks/polybenchc/2mm.wasm b/benchmarks/paper/benchmarks/polybenchc/2mm.wasm new file mode 100755 index 000000000..f0870b299 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/2mm.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d31eeebe685646cf2b8c4460beaf2243064dd8a311cb83a92523f9260260d99 +size 32469 diff --git a/benchmarks/paper/benchmarks/polybenchc/3mm.wasm b/benchmarks/paper/benchmarks/polybenchc/3mm.wasm new file mode 100755 index 000000000..583568027 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/3mm.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50bc67dec69851859d7096994ed879b3270fdd846a2c638bb4f063b708a8b97b +size 32667 diff --git a/benchmarks/paper/benchmarks/polybenchc/BUILD.md b/benchmarks/paper/benchmarks/polybenchc/BUILD.md new file mode 100644 index 000000000..d48f613c6 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/BUILD.md @@ -0,0 +1,175 @@ +# PolyBench/C 4.2.1 — WASM Build Notes + +## Source + +- Repository: [MatthiasJReisinger/PolyBenchC-4.2.1](https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1) +- Version: **PolyBench/C 4.2.1** + +`build.sh prepare` clones it into `build/PolyBenchC-4.2.1/` automatically. + +## Relationship to the Archived `.wasm` Files + +This directory already archives the **30** `.wasm` binaries actually used at the time (see `MANIFEST.md`, `SHA256SUMS`). + +Binary analysis of the archived wasm: + +| Trait | Archived wasm | `build.sh wasm` | +|-------|---------------|-----------------| +| Entry | `_start` / `main` (WASI) | `_start` / `main` (WASI) | +| Output format | `==BEGIN DUMP_ARRAYS==` | `-DPOLYBENCH_DUMP_ARRAYS` | +| Toolchain | clang 11.0.0 / 14.0.3 + WASI | **WASI SDK clang** | +| Case count | **30** | full `utilities/benchmark_list` | + +After rebuilding, compare against `SHA256SUMS` to check whether the output matches the paper wasm (clang / wasi-sdk minor-version differences may change the hashes). + +--- + +## 1. Build Environment + +| Component | Purpose | +|-----------|---------| +| **WASI SDK clang** | main WASM toolchain (`/opt/wasi-sdk/bin/clang`) | +| GCC | native comparison build | +| Emscripten | optional alternative toolchain | +| git | fetch PolyBenchC-4.2.1 | + +--- + +## 2. Macros and Options + +### Dataset Size + +WASM memory is limited, so **`SMALL_DATASET`** is used. + +Alternatives: `-DMINI_DATASET`, `-DSMALL_DATASET`, `-DMEDIUM_DATASET`, `-DLARGE_DATASET`, `-DEXTRALARGE_DATASET` + +### Data Type + +```bash +-DDATA_TYPE_IS_INT +``` + +### Output Format (matches the archived wasm) + +```bash +-DPOLYBENCH_DUMP_ARRAYS +``` + +### WASI Compatibility + +```bash +-D_WASI_EMULATED_PROCESS_CLOCKS +``` + +### Linker Exports + +```bash +-Wl,--export=__heap_base -Wl,--export=__data_end -Wl,--export=malloc -Wl,--export=free +``` + +### SIMD Disabled (native GCC comparison) + +```bash +NO_SIMD="-mno-mmx -mno-sse2 ... -mno-avx512vbmi" +# Note: do NOT use -mno-sse — it breaks the build +``` + +--- + +## 3. Compile Commands + +### WASM (clang, main path) + +```bash +WASI_CLANG=/opt/wasi-sdk/bin/clang + +$WASI_CLANG -O3 -I utilities -I linear-algebra/solvers/mvt \ + -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS \ + -D_WASI_EMULATED_PROCESS_CLOCKS \ + utilities/polybench.c linear-algebra/solvers/mvt/mvt.c \ + -Wl,--export=__heap_base -Wl,--export=__data_end \ + -Wl,--export=malloc -Wl,--export=free \ + -o mvt.wasm +``` + +### Native (GCC comparison) + +```bash +GCC_PARGS="-O3 -I utilities -DPOLYBENCH_TIME -DSMALL_DATASET -DDATA_TYPE_IS_INT $NO_SIMD -lm" +gcc $GCC_PARGS -o mvt_native linear-algebra/solvers/mvt/mvt.c utilities/polybench.c +``` + +### Optional: Emscripten + +```bash +emcc -O3 -s WASM=1 -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS \ + -I utilities -I linear-algebra/solvers/mvt \ + -o mvt.wasm \ + linear-algebra/solvers/mvt/mvt.c utilities/polybench.c +``` + +--- + +## 4. Using `build.sh` + +```bash +chmod +x build.sh + +# clone the sources +./build.sh prepare + +# WASI clang build of the full benchmark_list +export WASI_CLANG=/opt/wasi-sdk/bin/clang +./build.sh wasm + +# Native + WASM +./build.sh all + +# single case +./build.sh one linear-algebra/solvers/mvt/mvt.c + +# emcc example +./build.sh emcc +``` + +Output directory: `out/` (override with `OUT_DIR`). + +--- + +## 5. Archived Case List (30) + +``` +2mm, 3mm, adi, atax, bicg, cholesky, correlation, covariance, +deriche, doitgen, durbin, fdtd-2d, floyd-warshall, gemm, gemver, +gesummv, gramschmidt, heat-3d, jacobi-2d, jacobi_1d, lu, ludcmp, +mvt, nussinov, seidel-2d, symm, syr2k, syrk, trisolv, trmm +``` + +--- + +## 6. Notes + +1. **Entry point**: WASI clang uses `_start`/`main`; no `apply` export is needed. +2. **Memory**: `SMALL_DATASET` controls the dataset size. +3. **Floating point**: `-DDATA_TYPE_IS_INT` is recommended. +4. **wasi-sdk version**: the archived wasm carries clang 11.0.0 / 14.0.3 traces; pin the same wasi-sdk version when reproducing. + +--- + +## 7. Verification + +```bash +shasum -a 256 out/*.wasm +diff <(awk '{print $1}' SHA256SUMS | sort) <(shasum -a 256 out/*.wasm | awk '{print $1}' | sort) + +wasm-objdump -x out/mvt.wasm | rg export + +wasmtime run out/mvt.wasm +iwasm out/mvt.wasm +``` + +--- + +## Appendix: `polybench-wasm-patch.h` + +[`polybench-wasm-patch.h`](polybench-wasm-patch.h) is kept for reference (the older `ftrace` / `apply`-entry patching scheme). **The current `build.sh` clang/WASI path does not use this patch.** diff --git a/benchmarks/paper/benchmarks/polybenchc/MANIFEST.md b/benchmarks/paper/benchmarks/polybenchc/MANIFEST.md new file mode 100644 index 000000000..7f54e3692 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/MANIFEST.md @@ -0,0 +1,51 @@ +# PolyBench/C Manifest + +Source: `webassembly-testsuites/case/benchmark/polybenchc/` (testsuite repository, commit `b779fda`, 2023-04-12) + +## Contents + +| Type | Count | +|------|-------| +| `.wasm` | 30 | +| `.wasm.expected` | 11 | +| `*_config.py` | 9 | +| `config.py` | 1 | +| `iwasm.conf` | 1 | +| `runtest_polybench.sh` | 1 (legacy script; paths are outdated) | +| `BUILD.md`, `build.sh` | WASI **clang** rebuild flow | +| `polybench-wasm-patch.h` | legacy patching scheme, for reference only (unused by the clang path) | + +## Source Version + +- **PolyBench/C 4.2.1** +- GitHub: https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1 + +## Compile Macros (WASI clang) + +``` +-O3 -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS -D_WASI_EMULATED_PROCESS_CLOCKS +-Wl,--export=__heap_base -Wl,--export=__data_end -Wl,--export=malloc -Wl,--export=free +-DPOLYBENCH_TIME # native GCC comparison build +``` + +## Case List (30) + +``` +2mm.wasm 3mm.wasm adi.wasm atax.wasm +bicg.wasm cholesky.wasm correlation.wasm covariance.wasm +deriche.wasm doitgen.wasm durbin.wasm fdtd-2d.wasm +floyd-warshall.wasm gemm.wasm gemver.wasm gesummv.wasm +gramschmidt.wasm heat-3d.wasm jacobi-2d.wasm jacobi_1d.wasm +lu.wasm ludcmp.wasm mvt.wasm nussinov.wasm +seidel-2d.wasm symm.wasm syr2k.wasm syrk.wasm +trisolv.wasm trmm.wasm +``` + +## Integrity + +See `SHA256SUMS` in this directory. + +## Notes + +- **Archived wasm**: the 30 binaries actually used at the time (WASI/clang; see `SHA256SUMS`). +- **Rebuild**: `build.sh` uses the WASI SDK **clang**; compare hashes after rebuilding. diff --git a/benchmarks/paper/benchmarks/polybenchc/README.md b/benchmarks/paper/benchmarks/polybenchc/README.md new file mode 100644 index 000000000..bfcbd554b --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/README.md @@ -0,0 +1,41 @@ +# PolyBench/C (30 cases) + +The **PolyBench/C 4.2.1** suite. This directory contains the wasm binaries actually used in the paper plus the **WASI clang** rebuild flow. + +## Source + +- [MatthiasJReisinger/PolyBenchC-4.2.1](https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1) +- Build notes: [`BUILD.md`](BUILD.md) +- Automation: [`build.sh`](build.sh) + +## Case List (30) + +``` +2mm, 3mm, adi, atax, bicg, cholesky, correlation, covariance, +deriche, doitgen, durbin, fdtd-2d, floyd-warshall, gemm, gemver, +gesummv, gramschmidt, heat-3d, jacobi-2d, jacobi_1d, lu, ludcmp, +mvt, nussinov, seidel-2d, symm, syr2k, syrk, trisolv, trmm +``` + +## Archived (the wasm actually used) + +- `*.wasm` (30) + `SHA256SUMS` +- `*.wasm.expected` (11), test configs, `runtest_polybench.sh` + +## Rebuild (WASI clang) + +```bash +export WASI_CLANG=/opt/wasi-sdk/bin/clang +./build.sh prepare +./build.sh wasm +``` + +Compile macros: `-O3 -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS -D_WASI_EMULATED_PROCESS_CLOCKS` + +## Running the Tests + +```bash +./runtest_webassembly.py -r iwasm -s polybenchc +./runtest_webassembly.py -r wasmtime -s polybenchc +./runtest_webassembly.py -r dtvm -s polybenchc +``` diff --git a/benchmarks/paper/benchmarks/polybenchc/SHA256SUMS b/benchmarks/paper/benchmarks/polybenchc/SHA256SUMS new file mode 100644 index 000000000..ebdf69412 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/SHA256SUMS @@ -0,0 +1,30 @@ +051d61f55dd4c7e41f4b7881aa3589b3097e2f60124138bdbac96dd665461285 lu.wasm +1b1d008a549c2fa53816faed968c599eea750cf733e9e9f9413b64e0511920fb cholesky.wasm +1efca89e231483c74e73ff7311219cc0a93e269a1a24d0b562bf32c36f1d2606 syr2k.wasm +26acbd07ffa58a8eb414a6ba72e579025d9ab8517ea000e6434d6e56cfa19e13 fdtd-2d.wasm +4058e25b7c3433dbbecd713fe863c021e78bbaadcf7978837d504b065f5f5196 doitgen.wasm +4607b0de3362cba3e366197f16e33b546ef867c2403d77936905c632025c733b floyd-warshall.wasm +5002d0ea979566bc3431e03ad8cf3274851e70a831e8d210e569862abafc88eb durbin.wasm +5017122c17ebff6f927d7fd6785fadb154ebfda6a8fb1c1f4721b734cbd1febe bicg.wasm +50bc67dec69851859d7096994ed879b3270fdd846a2c638bb4f063b708a8b97b 3mm.wasm +564cd1c6d63e1f73c0cdf18d602edf69a64c3cc374d16f66d8f292e516b5bef4 jacobi_1d.wasm +64b9dc332a87d1d0435288d6464f13ab1c7b09426e89c46562be8e8b09f12ddf gemver.wasm +661196c5294ff3ddf426b626d10f04c5cca88e245dc37d84b3d6452fb0b154a4 trisolv.wasm +6d31eeebe685646cf2b8c4460beaf2243064dd8a311cb83a92523f9260260d99 2mm.wasm +6f1ddea5df711a918574659fd97375e5a8fa21cc565737beabbab084552679a4 adi.wasm +6fc59d4c8746661515da0acb1f509cfdfe25f2a09ed10df0d615f7d248ab078d gramschmidt.wasm +6fdf6ce763caf0d6c20bb9125382ed8aa1d0ec2efbd2118710f83d422f2c5d21 seidel-2d.wasm +796cdecca44721f058f182e5e4994649f45a5b2f394f449d6bb63b6415aadd66 atax.wasm +83d248c3ccc35a595ac5777851e9537a182d3c2d3ae75aeb1d074d531c937719 mvt.wasm +8a7b44e64ea17c0b069c8bb0dbed6d6ff4eaa3f2127fe15531d400d586c22c09 covariance.wasm +9c779b2b4b493d34810ed49045c89c411be003d0dc9a72bdc645f854bc19434e trmm.wasm +b1acce4bda648fa02bbf8514f891fa8ab7be4f78da3d69b0345869d204c23f25 nussinov.wasm +b4d559e2832ea244a240761354c554aa4cee14e2ab7969fb592bb3a6acad6d83 deriche.wasm +b5e91788d5e6452b961d52d0792b328bbebc256dacb75cfc0b68b7ae9a2345b0 syrk.wasm +bda11acdb2d49090db998059966291d12c7d1dc675a400ead2ae354dfe5d35d4 symm.wasm +c12e6c2d971769bf4478119156b74789929c5d1c366b47a50eb985f7b9f09d53 gemm.wasm +c5cbf9de3f59fa1a5880ac2c6548aed812a672c3779e9f8a5d212428d900b962 correlation.wasm +e5cd4e0fc62127b927ae2ae1d3d97ee6b60f5a08b8c4d55f69f1a1be6be88eb1 gesummv.wasm +e5df1ac83af2476f8b75198596c93cd9c06071f91aa4009ccd1d3f44272ab499 jacobi-2d.wasm +f3ba7fa0a00456ab28bc5a2393cb1fdad3031e12b1d9d26dc70b095def2e2565 heat-3d.wasm +f4e3fc8f16bae052db1283a926da0fa270b89f39727256fe9bc01af04696611f ludcmp.wasm diff --git a/benchmarks/paper/benchmarks/polybenchc/__init__.py b/benchmarks/paper/benchmarks/polybenchc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/paper/benchmarks/polybenchc/adi.wasm b/benchmarks/paper/benchmarks/polybenchc/adi.wasm new file mode 100755 index 000000000..6f60c28c0 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/adi.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f1ddea5df711a918574659fd97375e5a8fa21cc565737beabbab084552679a4 +size 33184 diff --git a/benchmarks/paper/benchmarks/polybenchc/atax.wasm b/benchmarks/paper/benchmarks/polybenchc/atax.wasm new file mode 100755 index 000000000..76e927bd1 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/atax.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:796cdecca44721f058f182e5e4994649f45a5b2f394f449d6bb63b6415aadd66 +size 32013 diff --git a/benchmarks/paper/benchmarks/polybenchc/atax.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/atax.wasm.expected new file mode 100644 index 000000000..718fe9b76 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/atax.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac3b860c44406820ff163e473839df10788e08ed67da778df6f7c5311addb7bb +size 19077 diff --git a/benchmarks/paper/benchmarks/polybenchc/atax_config.py b/benchmarks/paper/benchmarks/polybenchc/atax_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/atax_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/bicg.wasm b/benchmarks/paper/benchmarks/polybenchc/bicg.wasm new file mode 100755 index 000000000..1b138dacc --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/bicg.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5017122c17ebff6f927d7fd6785fadb154ebfda6a8fb1c1f4721b734cbd1febe +size 32160 diff --git a/benchmarks/paper/benchmarks/polybenchc/bicg.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/bicg.wasm.expected new file mode 100644 index 000000000..b946a817f --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/bicg.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4240f815266c81d8d601c97dbf590dc3a764ddd328ce0c3e883079e0d7a89d1 +size 28298 diff --git a/benchmarks/paper/benchmarks/polybenchc/bicg_config.py b/benchmarks/paper/benchmarks/polybenchc/bicg_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/bicg_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/build.sh b/benchmarks/paper/benchmarks/polybenchc/build.sh new file mode 100755 index 000000000..2e26d81f7 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/build.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# Build PolyBench/C 4.2.1 to WASM using WASI SDK clang. +# +# Source: https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1 +# See BUILD.md for full procedure and compiler flags. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +BUILD_DIR="${BUILD_DIR:-$ROOT/build}" +SRC_DIR="${SRC_DIR:-$BUILD_DIR/PolyBenchC-4.2.1}" +OUT_DIR="${OUT_DIR:-$ROOT/out}" +POLYBENCH_GIT="${POLYBENCH_GIT:-https://github.com/MatthiasJReisinger/PolyBenchC-4.2.1.git}" +WASI_CLANG="${WASI_CLANG:-${CLANG:-/opt/wasi-sdk/bin/clang}}" + +NO_SIMD="-mno-mmx -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4a -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2 -mno-avx512f \ + -mno-avx512pf -mno-avx512er -mno-avx512cd -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512ifma -mno-avx512vbmi" + +GCC_PARGS="-O3 -I utilities -DPOLYBENCH_TIME -DSMALL_DATASET -DDATA_TYPE_IS_INT $NO_SIMD -lm" + +# WASI clang flags (aligned with archived wasm: DUMP_ARRAYS + WASI) +CLANG_COMMON="-O3 -I utilities -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS -D_WASI_EMULATED_PROCESS_CLOCKS" +CLANG_LDFLAGS="-Wl,--export=__heap_base -Wl,--export=__data_end -Wl,--export=malloc -Wl,--export=free" + +usage() { + cat <<'EOF' +Usage: build.sh [prepare|native|wasm|all|emcc|one] + + prepare Clone PolyBenchC-4.2.1 + native Build native binaries with GCC (reference) + wasm Build all cases to WASM with WASI clang + all prepare + native + wasm + emcc Example single-case build with emcc (optional) + one Build one case with WASI clang: build.sh one + +Environment: + POLYBENCH_GIT Source repo URL + WASI_CLANG Path to wasi-sdk clang (default: /opt/wasi-sdk/bin/clang) + CLANG Alias for WASI_CLANG + BUILD_DIR Working directory for clone/build + OUT_DIR Output directory for artifacts +EOF +} + +prepare_source() { + mkdir -p "$BUILD_DIR" "$OUT_DIR" + if [[ ! -d "$SRC_DIR/.git" ]]; then + git clone --depth 1 "$POLYBENCH_GIT" "$SRC_DIR" + fi + echo "Prepared source at $SRC_DIR" +} + +build_native() { + cd "$SRC_DIR" + while IFS= read -r benchmark; do + [[ -f "$benchmark" ]] || continue + base="${benchmark%.c}" + base="${base//\//_}" + echo "Native: $benchmark" + gcc $GCC_PARGS -o "$OUT_DIR/${base}_native" "$benchmark" utilities/polybench.c + done < utilities/benchmark_list +} + +build_wasm() { + command -v "$WASI_CLANG" >/dev/null 2>&1 || { + echo "Error: clang not found: $WASI_CLANG (set WASI_CLANG=...)" >&2 + exit 1 + } + cd "$SRC_DIR" + while IFS= read -r benchmark; do + [[ -f "$benchmark" ]] || continue + base="$(basename "${benchmark%.c}")" + case_dir="$(dirname "$benchmark")" + echo "WASM: $benchmark -> $base.wasm" + "$WASI_CLANG" $CLANG_COMMON -I "$case_dir" \ + utilities/polybench.c "$benchmark" \ + $CLANG_LDFLAGS \ + -o "$OUT_DIR/$base.wasm" \ + || echo "WARN: failed to build $benchmark" >&2 + done < utilities/benchmark_list +} + +build_one() { + local case_file="${1:?usage: build.sh one }" + command -v "$WASI_CLANG" >/dev/null 2>&1 || { + echo "Error: clang not found: $WASI_CLANG" >&2 + exit 1 + } + prepare_source + cd "$SRC_DIR" + [[ -f "$case_file" ]] || { echo "Not found: $case_file" >&2; exit 1; } + local base="$(basename "${case_file%.c}")" + local case_dir="$(dirname "$case_file")" + "$WASI_CLANG" $CLANG_COMMON -I "$case_dir" \ + utilities/polybench.c "$case_file" \ + $CLANG_LDFLAGS \ + -o "$OUT_DIR/$base.wasm" +} + +build_emcc_example() { + local case="${1:-linear-algebra/solvers/mvt/mvt.c}" + command -v emcc >/dev/null 2>&1 || { echo "emcc not found" >&2; exit 1; } + prepare_source + cd "$SRC_DIR" + local case_dir="$(dirname "$case")" + emcc -O3 -s WASM=1 -DSMALL_DATASET -DDATA_TYPE_IS_INT -DPOLYBENCH_DUMP_ARRAYS \ + -I utilities -I "$case_dir" \ + -o "$OUT_DIR/mvt_emcc.wasm" \ + "$case" utilities/polybench.c +} + +cmd="${1:-all}" +case "$cmd" in + prepare) prepare_source ;; + native) prepare_source; build_native ;; + wasm) prepare_source; build_wasm ;; + all) prepare_source; build_native; build_wasm ;; + one) build_one "${2:-}" ;; + emcc) build_emcc_example "${2:-}" ;; + -h|--help|help) usage ;; + *) echo "Unknown command: $cmd" >&2; usage; exit 1 ;; +esac + +echo "Done. Outputs in $OUT_DIR" diff --git a/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm b/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm new file mode 100755 index 000000000..fb910319b --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b1d008a549c2fa53816faed968c599eea750cf733e9e9f9413b64e0511920fb +size 32526 diff --git a/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm.expected new file mode 100644 index 000000000..17903a317 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/cholesky.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7c43ac9d96c525fcfbf45d2a02302d0d0354aec846a74a4fd7247469a0b6598 +size 10106072 diff --git a/benchmarks/paper/benchmarks/polybenchc/cholesky_config.py b/benchmarks/paper/benchmarks/polybenchc/cholesky_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/cholesky_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/config.py b/benchmarks/paper/benchmarks/polybenchc/config.py new file mode 100644 index 000000000..fb95c3e77 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/config.py @@ -0,0 +1,11 @@ +from configuration.suite_config import suite_config + +class SuiteConfig(suite_config): + testname = "POLYBENCHC-TESTSUITE" + # WASI modules: dtvm/iwasm use _start (no -f). Wasmtime uses --invoke main. + func = "" + dtvm_fOption = "" + wasmtime_fOption = "--invoke main" + wasmer_fOption = "" + interp_ignore = "ludcmp.wasm lu.wasm floyd-warshall.wasm cholesky.wasm nussinov.wasm seidel-2d.wasm symm.wasm syr2k.wasm syrk.wasm trmm.wasm" + multipass_ignore = "ludcmp.wasm lu.wasm floyd-warshall.wasm cholesky.wasm" diff --git a/benchmarks/paper/benchmarks/polybenchc/correlation.wasm b/benchmarks/paper/benchmarks/polybenchc/correlation.wasm new file mode 100755 index 000000000..7bbe583e4 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/correlation.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5cbf9de3f59fa1a5880ac2c6548aed812a672c3779e9f8a5d212428d900b962 +size 32453 diff --git a/benchmarks/paper/benchmarks/polybenchc/covariance.wasm b/benchmarks/paper/benchmarks/polybenchc/covariance.wasm new file mode 100755 index 000000000..fe108fd31 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/covariance.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a7b44e64ea17c0b069c8bb0dbed6d6ff4eaa3f2127fe15531d400d586c22c09 +size 32225 diff --git a/benchmarks/paper/benchmarks/polybenchc/deriche.wasm b/benchmarks/paper/benchmarks/polybenchc/deriche.wasm new file mode 100755 index 000000000..19f0ff95d --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/deriche.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4d559e2832ea244a240761354c554aa4cee14e2ab7969fb592bb3a6acad6d83 +size 32679 diff --git a/benchmarks/paper/benchmarks/polybenchc/doitgen.wasm b/benchmarks/paper/benchmarks/polybenchc/doitgen.wasm new file mode 100755 index 000000000..d15a5972f --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/doitgen.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4058e25b7c3433dbbecd713fe863c021e78bbaadcf7978837d504b065f5f5196 +size 32193 diff --git a/benchmarks/paper/benchmarks/polybenchc/durbin.wasm b/benchmarks/paper/benchmarks/polybenchc/durbin.wasm new file mode 100755 index 000000000..6170164ca --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/durbin.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5002d0ea979566bc3431e03ad8cf3274851e70a831e8d210e569862abafc88eb +size 31914 diff --git a/benchmarks/paper/benchmarks/polybenchc/durbin.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/durbin.wasm.expected new file mode 100644 index 000000000..62aa8ba0a --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/durbin.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eb7a3812943e7400005703c74d65c998e4603dac597e9e655027210300aa5f9 +size 11179 diff --git a/benchmarks/paper/benchmarks/polybenchc/durbin_config.py b/benchmarks/paper/benchmarks/polybenchc/durbin_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/durbin_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/fdtd-2d.wasm b/benchmarks/paper/benchmarks/polybenchc/fdtd-2d.wasm new file mode 100755 index 000000000..9159de4d3 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/fdtd-2d.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26acbd07ffa58a8eb414a6ba72e579025d9ab8517ea000e6434d6e56cfa19e13 +size 32849 diff --git a/benchmarks/paper/benchmarks/polybenchc/floyd-warshall.wasm b/benchmarks/paper/benchmarks/polybenchc/floyd-warshall.wasm new file mode 100755 index 000000000..442f3eacf --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/floyd-warshall.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4607b0de3362cba3e366197f16e33b546ef867c2403d77936905c632025c733b +size 31956 diff --git a/benchmarks/paper/benchmarks/polybenchc/gemm.wasm b/benchmarks/paper/benchmarks/polybenchc/gemm.wasm new file mode 100755 index 000000000..fc2252e8f --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gemm.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c12e6c2d971769bf4478119156b74789929c5d1c366b47a50eb985f7b9f09d53 +size 32184 diff --git a/benchmarks/paper/benchmarks/polybenchc/gemver.wasm b/benchmarks/paper/benchmarks/polybenchc/gemver.wasm new file mode 100755 index 000000000..8dc9add81 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gemver.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64b9dc332a87d1d0435288d6464f13ab1c7b09426e89c46562be8e8b09f12ddf +size 32399 diff --git a/benchmarks/paper/benchmarks/polybenchc/gemver.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/gemver.wasm.expected new file mode 100644 index 000000000..d555d7333 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gemver.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac143e1daac604fa589ed0cc2902ba5e6bacb6eb7dacebcb53fd2f6c80daa500 +size 29291 diff --git a/benchmarks/paper/benchmarks/polybenchc/gemver_config.py b/benchmarks/paper/benchmarks/polybenchc/gemver_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gemver_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm b/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm new file mode 100755 index 000000000..f121612a0 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5cd4e0fc62127b927ae2ae1d3d97ee6b60f5a08b8c4d55f69f1a1be6be88eb1 +size 32030 diff --git a/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm.expected new file mode 100644 index 000000000..8d449830d --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gesummv.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64a4a7d23fb21690047916f8b996e93bea6407114856b35841f02c083da877d6 +size 9237 diff --git a/benchmarks/paper/benchmarks/polybenchc/gesummv_config.py b/benchmarks/paper/benchmarks/polybenchc/gesummv_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gesummv_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/gramschmidt.wasm b/benchmarks/paper/benchmarks/polybenchc/gramschmidt.wasm new file mode 100755 index 000000000..2a2d915cb --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/gramschmidt.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fc59d4c8746661515da0acb1f509cfdfe25f2a09ed10df0d615f7d248ab078d +size 32524 diff --git a/benchmarks/paper/benchmarks/polybenchc/heat-3d.wasm b/benchmarks/paper/benchmarks/polybenchc/heat-3d.wasm new file mode 100755 index 000000000..b6eb7e736 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/heat-3d.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3ba7fa0a00456ab28bc5a2393cb1fdad3031e12b1d9d26dc70b095def2e2565 +size 32428 diff --git a/benchmarks/paper/benchmarks/polybenchc/iwasm.conf b/benchmarks/paper/benchmarks/polybenchc/iwasm.conf new file mode 100644 index 000000000..361c3e0d5 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/iwasm.conf @@ -0,0 +1 @@ +VM="iwasm" diff --git a/benchmarks/paper/benchmarks/polybenchc/jacobi-2d.wasm b/benchmarks/paper/benchmarks/polybenchc/jacobi-2d.wasm new file mode 100755 index 000000000..2ac899c15 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/jacobi-2d.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5df1ac83af2476f8b75198596c93cd9c06071f91aa4009ccd1d3f44272ab499 +size 32150 diff --git a/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm new file mode 100755 index 000000000..efe6b9918 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:564cd1c6d63e1f73c0cdf18d602edf69a64c3cc374d16f66d8f292e516b5bef4 +size 31861 diff --git a/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm.expected new file mode 100644 index 000000000..cb71ff168 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:873352224707d71a806b0fa4be0ed47260f1e366e80a07bca3cada559afc7e11 +size 10172 diff --git a/benchmarks/paper/benchmarks/polybenchc/jacobi_1d_config.py b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/jacobi_1d_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/lu.wasm b/benchmarks/paper/benchmarks/polybenchc/lu.wasm new file mode 100755 index 000000000..7e2ebc271 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/lu.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051d61f55dd4c7e41f4b7881aa3589b3097e2f60124138bdbac96dd665461285 +size 32550 diff --git a/benchmarks/paper/benchmarks/polybenchc/lu.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/lu.wasm.expected new file mode 100644 index 000000000..539818307 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/lu.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97031538068ce052aff7394119d9f7a5dc2bccb99f0b95c1f7995f1e91918bca +size 20200072 diff --git a/benchmarks/paper/benchmarks/polybenchc/lu_config.py b/benchmarks/paper/benchmarks/polybenchc/lu_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/lu_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm b/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm new file mode 100755 index 000000000..52ee7115f --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4e3fc8f16bae052db1283a926da0fa270b89f39727256fe9bc01af04696611f +size 32916 diff --git a/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm.expected new file mode 100644 index 000000000..c171ab71b --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/ludcmp.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7f7a239cf6b77a466ccc92e82d8e8956dac44acefac9e7faacdefd90374ab88 +size 12126 diff --git a/benchmarks/paper/benchmarks/polybenchc/ludcmp_config.py b/benchmarks/paper/benchmarks/polybenchc/ludcmp_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/ludcmp_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/mvt.wasm b/benchmarks/paper/benchmarks/polybenchc/mvt.wasm new file mode 100755 index 000000000..cf3b2aa31 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/mvt.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83d248c3ccc35a595ac5777851e9537a182d3c2d3ae75aeb1d074d531c937719 +size 32253 diff --git a/benchmarks/paper/benchmarks/polybenchc/mvt.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/mvt.wasm.expected new file mode 100644 index 000000000..c2b335adf --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/mvt.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1533c7da6ae6ceed5543eec3849b4fd795e90ba99df816e92337bbc05cbced75 +size 28300 diff --git a/benchmarks/paper/benchmarks/polybenchc/mvt_config.py b/benchmarks/paper/benchmarks/polybenchc/mvt_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/mvt_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/nussinov.wasm b/benchmarks/paper/benchmarks/polybenchc/nussinov.wasm new file mode 100755 index 000000000..5c899e4ad --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/nussinov.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1acce4bda648fa02bbf8514f891fa8ab7be4f78da3d69b0345869d204c23f25 +size 32043 diff --git a/benchmarks/paper/benchmarks/polybenchc/polybench-wasm-patch.h b/benchmarks/paper/benchmarks/polybenchc/polybench-wasm-patch.h new file mode 100644 index 000000000..001b30250 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/polybench-wasm-patch.h @@ -0,0 +1,45 @@ +#pragma once + +#ifdef WASM_TARGET + +// 1. ftrace performance tracing +extern "C" int ftrace_begin(const char* label, int len); +extern "C" void ftrace_end(); + +#define polybench_start_instruments \ + do { \ + const char* filename = strrchr(__FILE__, '/'); \ + if (filename) \ + filename++; \ + else \ + filename = __FILE__; \ + ftrace_begin(filename, strlen(filename) - 2); \ + } while (0) + +#define polybench_stop_instruments ftrace_end(); + +// 2. replace exit with abort for WASM +#ifdef __wasm__ +[[clang::import_name("abort")]] +#endif +extern "C" [[noreturn]] void +_abort(const char* msg, uint32_t msg_len); + +static inline void polybench_wasm_exit(int status) +{ + (void)status; + _abort("call exit", 9u); +} + +#undef exit +#define exit(status) polybench_wasm_exit(status) + +// 3. export apply as WASM entry (main stays for native builds) +int main(int argc, char** argv); + +extern "C" [[clang::export_name("apply")]] void apply(void) +{ + main(0, NULL); +} + +#endif /* WASM_TARGET */ diff --git a/benchmarks/paper/benchmarks/polybenchc/runtest_polybench.sh b/benchmarks/paper/benchmarks/polybenchc/runtest_polybench.sh new file mode 100755 index 000000000..d1f50f76b --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/runtest_polybench.sh @@ -0,0 +1,56 @@ +#!/bin/bash +set -e + +VM="$1" +work_path="case/PolyBenchC" +pass_num=0;skip_num=0 + +if [ $# -eq 0 ] || [ $1 = iwasm ] +then + set -e + source case/PolyBenchC/iwasm.conf + echo +elif [ $1 != wasmtime ] +then + echo "Parameter error,Please use the correct parameter iwasm or wasmtime,Without any parameters, iwasm is used by default" + echo -e '\n'Usage: ./case/PolyBenchC/runtest_polybench.sh [parameter]'\n' + exit 1 +fi + + +function test() +{ + NUM=`ls case/PolyBenchC | grep wasm| wc -l` + echo PolyBenchC-testsuite Start testing + while read line + do + case_name=`echo $line | awk '{print $1}'` + echo '### Testing' $case_name '###' + $VM case/PolyBenchC/$case_name + + if [ $? -eq 0 ] + then + let pass_num+=1 + echo -e "\033[32m testing $case_name Pass \033[0m" + echo -e '\n' + else + let pass_num-=1 + echo -e "\033[31m testing $case Failed \033[0m" + echo -e "\033[31m Test case exception \033[0m" + echo -e "\033[31m The total number of use cases is $NUM, the test passed $pass_num use cases, the current test case is abnormal, and the abnormal use case name is $case_name \033[0m" +_num=`expr $NUM - $pass_num - 1` + echo "### PolyBenchC-testsuite End testing" + echo IN ALL $NUM cases: $pass_num PASS , 1 FAIL , $skip_num SKIP ; + echo -e '\n\n' + exit 1 + fi + done <<< `ls case/PolyBenchC | grep wasm$` + +} + +test + +echo "### PolyBenchC-testsuite End testing" +echo IN ALL $NUM cases: $NUM PASS , 0 FAIL , 0 SKIP ; +echo -e "\033[32m PolyBenchC-testsuite TEST SUCCESSFUL \033[0m" +echo -e '\n\n' diff --git a/benchmarks/paper/benchmarks/polybenchc/seidel-2d.wasm b/benchmarks/paper/benchmarks/polybenchc/seidel-2d.wasm new file mode 100755 index 000000000..e08d07c84 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/seidel-2d.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fdf6ce763caf0d6c20bb9125382ed8aa1d0ec2efbd2118710f83d422f2c5d21 +size 32012 diff --git a/benchmarks/paper/benchmarks/polybenchc/symm.wasm b/benchmarks/paper/benchmarks/polybenchc/symm.wasm new file mode 100755 index 000000000..74d4d5df2 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/symm.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bda11acdb2d49090db998059966291d12c7d1dc675a400ead2ae354dfe5d35d4 +size 32376 diff --git a/benchmarks/paper/benchmarks/polybenchc/syr2k.wasm b/benchmarks/paper/benchmarks/polybenchc/syr2k.wasm new file mode 100755 index 000000000..c653acee7 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/syr2k.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1efca89e231483c74e73ff7311219cc0a93e269a1a24d0b562bf32c36f1d2606 +size 32203 diff --git a/benchmarks/paper/benchmarks/polybenchc/syrk.wasm b/benchmarks/paper/benchmarks/polybenchc/syrk.wasm new file mode 100755 index 000000000..cd4f76882 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/syrk.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5e91788d5e6452b961d52d0792b328bbebc256dacb75cfc0b68b7ae9a2345b0 +size 32079 diff --git a/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm b/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm new file mode 100755 index 000000000..53132026b --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:661196c5294ff3ddf426b626d10f04c5cca88e245dc37d84b3d6452fb0b154a4 +size 31947 diff --git a/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm.expected b/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm.expected new file mode 100644 index 000000000..25a66e5bf --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/trisolv.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0606f636f018dcd452c2df48aa6e6ce54bd3680a2822529f6a8a4b269f6ba65 +size 10172 diff --git a/benchmarks/paper/benchmarks/polybenchc/trisolv_config.py b/benchmarks/paper/benchmarks/polybenchc/trisolv_config.py new file mode 100644 index 000000000..ba5bef878 --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/trisolv_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = " 2>&1" diff --git a/benchmarks/paper/benchmarks/polybenchc/trmm.wasm b/benchmarks/paper/benchmarks/polybenchc/trmm.wasm new file mode 100755 index 000000000..082c444be --- /dev/null +++ b/benchmarks/paper/benchmarks/polybenchc/trmm.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c779b2b4b493d34810ed49045c89c411be003d0dc9a72bdc645f854bc19434e +size 32149 diff --git a/benchmarks/paper/benchmarks/wapm/MANIFEST.md b/benchmarks/paper/benchmarks/wapm/MANIFEST.md new file mode 100644 index 000000000..c3dab0344 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/MANIFEST.md @@ -0,0 +1,42 @@ +# WAPM Manifest + +Source: `webassembly-testsuites/case/wapm/` (experiment archive; upstream artifacts are compiled WAPM registry packages). + +## Contents + +| Type | Count | +|------|-------| +| `.wasm` | 21 (paper's 20 cases + `fortune`, see below) | +| `*_config.py` / `*.wasm.conf` | per-case run parameters | +| `runtest_wapm.sh` | test runner script | +| `iwasm.conf` / `wasmtime.conf` | runtime configs | +| `fonts/` | dependency of chkfont.wasm / figlet.wasm | +| `parallel-small.png` | input image for viu.wasm | + +## Paper Cases (20) + +Every case that has Time-to-First-Invocation data in the paper's lazy-latency table: + +``` +amirali, base64cli, chkfont, code-stock, cowsay, dice, echo, erdtree, +figlet, irb, md5, pi, pkg1, qr2text, sam, suggest, tpl, uuid, viu, zuk +``` + +Also includes `fortune.wasm`: the reproduction scripts (`run_lazy_*.sh`, `run_*_ttfi_compare.sh`, etc.) use it **in place of zuk** for the TTFI rerun (script comment: `zuk -> fortune (from non-latency pool; verified runnable)`), and the output is mapped back onto the paper's `zuk` row during comparison. + +## Non-migrated Upstream Cases (9) + +The upstream archive had 30 wasm files; the following 9 were not used in the paper and are not included here: + +``` +greg, jq, jyt, main, pee, python, spidermonkey, sqlite, wasm3 +(plus python.wasm's runtime dependency lib/python3.6/ and wasm3's sub-module benchmark/des.wasm) +``` + +## Integrity + +See `SHA256SUMS` in this directory (covers all 21 wasm files, `fonts/`, and `parallel-small.png`). + +## Notes + +This directory contains the wasm binaries and test configs actually used in the paper experiments. It does **not** include WAPM registry package names/versions or download scripts (absent from the archive). diff --git a/benchmarks/paper/benchmarks/wapm/README.md b/benchmarks/paper/benchmarks/wapm/README.md new file mode 100644 index 000000000..fe8e61c17 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/README.md @@ -0,0 +1,17 @@ +# WAPM Benchmarks + +21 WAPM wasm files (the paper's 20 cases + `fortune`, which the reproduction scripts use as a substitute for `zuk`), used for the lazy time-to-first-invocation (TTFI) experiment. + +## Migrated Contents + +- 21 `.wasm` files (paper's 20 cases + `fortune` substitute) + test configs + `runtest_wapm.sh` +- `fonts/`, `parallel-small.png` runtime dependencies +- `MANIFEST.md`, `SHA256SUMS` + +## Related Raw Data + +The paper's lazy TTFI table (not shipped) compares dtvm lazy vs wasmtime/wasmer for the 20 cases. + +## Missing + +- `test_lazy.sh` (referenced by the experiment notebook; absent from the archive) diff --git a/benchmarks/paper/benchmarks/wapm/SHA256SUMS b/benchmarks/paper/benchmarks/wapm/SHA256SUMS new file mode 100644 index 000000000..b35e24a16 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/SHA256SUMS @@ -0,0 +1,37 @@ +649e7bbe96303bf0a86c38397191c74d1cd3d589f2c3c187c4a7175e8365a007 amirali.wasm +22dd5d48e40959c8fa25f5968aaf3d5af9430e848d9a582b7a0b6ba2aaf9a438 base64cli.wasm +a8fcad775e5ab5739c3d6f723cc8121b56fea9c1078d2b1bb1c2e0216d599062 chkfont.wasm +d7d05eab7c7753e8b3cfa8f71cce93ae05c09e3b79d16c40509d4dd813aeac27 code-stock.wasm +0cf9a18923570a0e76eb5793522dc122f01cfda26db468fe9c3f9b1a1424550a cowsay.wasm +bc7cb89c1cb09cd1098755e9459d8f44ebd5f7fa723f5a42a79130512653c641 dice.wasm +2854e8f4d8f62028d0799f2740ec960c390515443923f85d0846dc7902a02d25 echo.wasm +1fa2f44be2a81231e01bcd8db2e63195cfd3341d73fb34f4b163ce5d5be162d0 erdtree.wasm +cfb54deb829a5c910544ea7fe25c576c921e9a62f7181cae0f0ccd16432ace65 figlet.wasm +b8298c6a2615a36e4426ad4982de0a29da7a2b2da2675a49c13749e0d1aeaaf7 fortune.wasm +257133432664662ce6bb17f1e6b75bd512e068a53523026eddd8518d2134676b irb.wasm +21552b0d4c3d74cf464bc350d03f095ebb5f8f8c499329aca8d66af598ca15aa md5.wasm +7ebe0f1b08eb7e4d358b23091202aabcaa612995145afbfd1ef2d2de47c96265 pi.wasm +6db80cabfc853820b9568a6ed8b4fe5f5d31e6ce6b92d607355529db2be13dd0 pkg1.wasm +ee42716385c8c8b1d9ba916fcf52ff2a258a4152f4e54af2262425d1832671fe qr2text.wasm +9ce1fa91b3902c67af78a8c8ec991ff9c00b55e418b5f691f27389c16a181f72 sam.wasm +73b1387fba8d20f42ddced687edfada988fdc2b140e7077e33aed7b80d1303a2 suggest.wasm +3abe85b37603894ee92a636f8ab54a7e0a4f3fd03cafad937602f8edca4e680f tpl.wasm +d926c50304238d423d63f52f5f460b1a7170fe870e10f031b9cbd74b29bc06e5 uuid.wasm +7e48bfd68f658ac4916c291b536e6756c173f6ba63311c67c11ffa4b111f0bff viu.wasm +ee528faf952c9f644fb4785f5145e766c04b8a2990476dacf043c13ce3595620 zuk.wasm +9aed49b67d75fddb410a640861d04ecb15db27930b3c8ccf024f2b6ec53b0b9b fonts/hz.flc +90e2514936fc38b17e19f5363b1e0555bf02c56886a71287de8eb084cb48935a fonts/koi8r.flc +eb1e27c93b5824e913ee2b1f8f1dc2d611227b47af471b50430c4b6060995fb2 fonts/lean.flf +b5d0194157641407cb0d513f9fab2abf0c4b2c436f8c238a34d718b3911fa54b fonts/mini.flf +4ed37ffa2cad45e806bc4218f191a0e7a26b9111b1e4ed619be3504e521f4acd fonts/mnemonic.flf +e233f1bb05f82f7fae27a84e39eb46e514604828682e5ec97eecf451b89a0a85 fonts/moscow.flc +2cdabe1d9f8951d1e4678e9dc32a6f004f7e0098351cbe388fb149a2825bd586 fonts/script.flf +4e541014c689d8f4b2e380054bcedb2236a0c975af37b4989147e773301e342f fonts/shadow.flf +776d70bf97e03e5753690bad342eb02f989b12571b018fa87dd3a67c8d16dc42 fonts/slant.flf +c275f3cf053af2eec87804fe60ad5cc865dbb25ea65d5cbbe09a27f332c714f0 fonts/small.flf +72c57c300800e778185cd107f3f8447f78763057bf4b4063abea5494ee1d8ee0 fonts/smscript.flf +ed037c8cec54ba091db1de4cc5fca79f3ed093ac419f373fb1631d0ed60d0cbf fonts/smshadow.flf +e12d429773ee1be01617ba0b11c368c5be90fb84770616827a6f9e385119dfc0 fonts/smslant.flf +42df7980ad15f73699b0272633882811e3b6b79699e67cd79f40893d2fe310c1 fonts/standard.flf +707266dec1d7cd48863a560c8c77c269a278bf9e97bdab77b920e8cc02770ac0 fonts/term.flf +4bb7be862485841dbc9070ec2060c91641edaea9c7b44f647ceeea0fb0f9f46d parallel-small.png diff --git a/benchmarks/paper/benchmarks/wapm/WAPM_REPRODUCE.md b/benchmarks/paper/benchmarks/wapm/WAPM_REPRODUCE.md new file mode 100644 index 000000000..4aebb61a7 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/WAPM_REPRODUCE.md @@ -0,0 +1,353 @@ +# WAPM Reproduction Guide + +WAPM-style CLI wasm modules used for **correctness testing** (`runtest_wapm.sh` / `runtest_webassembly.py`) and the **Time-to-First-Invocation** performance experiment (originally `test_lazy.sh`). + +| Item | Value | +|------|-------| +| wasm + configs | `benchmarks/wapm/` (mirrors `case/wapm/` in the testsuite) | +| Correctness runner | `runtest_wapm.sh`, `runtest_webassembly.py -s wapm` | +| Performance runner | **`test_lazy.sh` (absent from the archive)** | +| Paper latency table | the paper's lazy-TTFI table (**20 cases**; not shipped) | +| Lab notebook | experiment archive, § lazy / WAPM | + +--- + +## 1. Two Test Kinds — Do Not Mix + +| Purpose | Script | Verdict | Timing | +|---------|--------|---------|--------| +| **Functional correctness** | `case/wapm/runtest_wapm.sh` | output diff / exit code | no lazy latency | +| **Functional correctness (Python)** | `runtest_webassembly.py -r -s wapm` | expected / regex / special pass rules | wall time progress only | +| **Lazy TTFI** | `test_lazy.sh` (missing) | no output check (or subset only) | `Execution time` / `Average time` | + +The paper's **latency table** came from **`test_lazy.sh` runs plus manual tabulation**, not from `runtest_wapm.sh` output. + +--- + +## 2. Archive Gaps + +| Item | Status | +|------|--------| +| `webassembly-testsuites/test_lazy.sh` | ❌ **missing** (the notebook has only its run log) | +| Latency-table **generator script** | ❌ **missing** | +| WAPM registry package names/versions | ❌ missing | +| jq's `-M .` filter | ⚠️ the archived `jq.wasm.conf` does **not** set it; the `test_lazy` log shows jq printing help only | +| `RANDOMCASE` in `iwasm.conf` | ⚠️ contains a typo `zuk.wasm.conf` (should be `zuk.wasm`) | + +--- + +## 3. Environment and Directory Dependencies + +Run from the **`webassembly-testsuites` root** (or an equivalent layout); the following must exist: + +| Path | Purpose | +|------|---------| +| `case/wapm/*.wasm` | the modules under test | +| `case/wapm/*.wasm.conf` | per-case commands for the bash runner | +| `case/wapm/*_config.py` | per-case commands for the Python runner (occasionally differs from `.conf`) | +| `case/wapm/iwasm.conf` | `RANDOMCASE` list for iwasm mode | +| `case/wapm/wasmtime.conf` | skip list for wasmtime mode | +| `case/wapm/lib/` | bundled Python 3.6 stdlib for **python.wasm** | +| `case/wapm/fonts/` | fonts for **chkfont.wasm**, **figlet.wasm** | +| `case/wapm/benchmark/des.wasm` | sub-module applied by **wasm3.wasm** | +| `case/wapm/parallel-small.png` | input image for **viu.wasm** | +| `case/wapm/pee.wasm.expected` | comparison file for **pee.wasm** | +| `case/wapm/*.wasm.expected` | golden outputs for correctness checks | + +### 3.1 DTVM (the paper's lazy column) + +Build per `runtimes/dtvm/BUILD.md`, commit pin **`882c83155`**. Inferred lazy-benchmark options: + +```bash +dtvm -m multipass \ + --enable-multipass-lazy \ + --disable-multipass-greedyra \ + --disable-multipass-multithread \ + case/wapm/.wasm [args...] +``` + +Meaning: **Time to First Invocation** = module loaded and first executable code produced (post-loading & compilation), matching the metric used in the lab notebook and the Wasmer WAPM-revival blog post. + +### 3.2 Baselines (latency-table columns) + +| Column | Inferred command prefix | +|--------|-------------------------| +| wasmtime | `wasmtime case/wapm/.wasm ...` (no `run` subcommand in the log) | +| wasmer cranelift | `wasmer run --cranelift ...` | +| wasmer llvm | `wasmer run --llvm ...` | +| wasmer singlepass | `wasmer run --singlepass ...` | + +The `test_lazy.sh 10` log shows wasmer llvm was **repeated 10 times and averaged** (first run noticeably slower — compile/cache effects); bare `test_lazy.sh` ran **once per case**. + +--- + +## 4. Correctness Runner: `runtest_wapm.sh` + +Path: `case/wapm/runtest_wapm.sh` + +```bash +cd webassembly-testsuites +./case/wapm/runtest_wapm.sh # default iwasm +./case/wapm/runtest_wapm.sh wasmtime # wasmtime (skips FAILED_CASENAME) +``` + +### 4.1 Command Assembly + +For each `*.wasm`: + +1. Read `case/wapm/.wasm.conf` (if present) +2. Default: `RUN_COMMAND="--heap-size=0 --stack-size=8000000 case/wapm/.wasm"` +3. Execute: `$HEAD_COMMAND $COMMAND | $VM $DIR $RUN_COMMAND $PARAMETER` + +With `HEAD_COMMAND=eval`, the shell resolves pipes/redirections (e.g. `eval echo 3+4 | ...`). + +### 4.2 Three Case Strategies + +#### A. Normal cases (golden output diff) + +- `.wasm.expected` is the expected output +- Actual output is stripped of NUL via **`tr -d '\000'`** before comparison +- **amirali NUL normalization**: the wasm stdout often carries `\0` padding; the golden file has none, so stripping is required to match `amirali.wasm.expected` + +#### B. `RANDOMCASE` (exit-code only, no output diff) + +Defined in `case/wapm/iwasm.conf`: + +```bash +RANDOMCASE="uuid.wasm fortune.wasm md5.wasm erdtree.wasm greg.wasm zuk.wasm.conf" +``` + +On a match: **check exit code only** — no `tr -d '\000'`, no expected diff. + +| case | Reason (inferred) | +|------|-------------------| +| **fortune** | random fortune each run; output not fixable | +| **greg** | calendar output depends on the date | +| **md5** | output is stable for a fixed input, but the archive still treats it as exit-only (same strategy as fortune) | +| **uuid** | generates a different UUID each run | +| **erdtree** | scans the file tree under `--dir=.`; output depends on directory contents | +| **zuk** | `generate 3 uuids` produces random output | + +> ⚠️ The config's **`zuk.wasm.conf` should be `zuk.wasm`**; as written, zuk actually takes the golden-diff path instead of exit-only. + +#### C. `UNEXPECTED_CASE` (main.wasm) + +- `main.wasm.conf` sets `UNEXPECTED_CASE=("main.wasm")` +- Behavior: after running, **overwrite** `.expected` with the current output (a MySQL interaction; output is not reproducible) +- `wasmtime.conf` additionally lists `main.wasm python.wasm spidermonkey.wasm wasm3.wasm` in **`FAILED_CASENAME`**, skipping them in wasmtime mode + +### 4.3 Extra Rules in the Python Runner (`runtest_webassembly.py`) + +Coexists with the bash script; rules differ slightly: + +| Mechanism | Behavior | +|-----------|----------| +| **NUL normalize** | `checkExpected()` applies `rstrip('\x00')` to both result and expected | +| **sam / suggest nonzero exit** | if `return_code == 1` **and** output still matches expected → **PASS** (`sam` ends with `Compiled without SDL support...` and often exits nonzero) | +| **ignore** | `config.py`: `ignore_case=sqlite.wasm`; `interp_ignore=main.wasm wasm3.wasm` | +| **no expected** | `expected == "OFF"` and `return_code == 0` → PASS | + +--- + +## 5. Performance Runner: `test_lazy.sh` (inferred from its log) + +Three invocations appear in the lab notebook: + +```bash +bash ./test_lazy.sh wasmtime # once per case; prints Execution time + Actual output +bash test_lazy.sh # default runtime, once, prints Average time +bash ./test_lazy.sh 10 # 10 reps averaged (wasmer llvm in the log) +``` + +Output format: + +```text +============ Testing amirali ============ +Executing command: : | /mnt/dtvm_test/wasmtime case/wapm/amirali.wasm +Execution time: 42.255 ms +... +Average time for ' ... ': 7.120 ms +``` + +**Inferred logic** (pending confirmation against the original script): + +1. Iterate the cases with commands matching **`*.wasm.conf` plus test_lazy-specific simplifications** (the lazy log does **not** use iwasm's `--heap-size=0 --stack-size=8000000`) +2. Time each case once or N times; write the average to the log +3. The paper's **20-case** table was **manually extracted** from the log into `latencytofirstinvocation.md` (no generator script exists) + +### 5.1 The 20 Cases in the Latency Table + +`amirali, base64cli, chkfont, code-stock, cowsay, dice, echo, erdtree, figlet, irb, md5, pi, pkg1, qr2text, sam, suggest, tpl, uuid, viu, zuk` + +**Excluded** (10): `fortune, greg, jq, jyt, main, pee, python, spidermonkey, sqlite, wasm3` — mostly interactive / non-reproducible / wasmtime-skipped / unstable. + +### 5.2 Latency-Table Columns + +| Column | Meaning | +|--------|---------| +| wasm file size (KB) | module file size | +| **dtvm lazy** | DTVM `dtvm` + `--enable-multipass-lazy` Time to First Invocation (ms) | +| wasmtime / wasmer * | same metric for each baseline, in ms | +| `*/dtvm` | baseline divided by dtvm lazy | + +--- + +## 6. Per-case Commands and Special Dependencies + +Commands below come from **`*.wasm.conf`** (consistent with the `test_lazy.sh` log). Run from the `webassembly-testsuites` root. + +| case | Command essence | Dependency | Correctness strategy | latency table | +|------|-----------------|------------|----------------------|:-------------:| +| amirali | `: \| wasmtime case/wapm/amirali.wasm` | — | golden + **NUL strip** | ✅ | +| base64cli | `... base64cli.wasm encode helloworld` | — | golden | ✅ | +| chkfont | `eval ... --dir=./fonts chkfont.wasm fonts/small.flf` | `fonts/` | golden | ✅ | +| code-stock | no args | — | golden | ✅ | +| cowsay | `eval ... cowsay.wasm hello` | — | golden | ✅ | +| dice | `echo help \| ... dice.wasm` | — | golden | ✅ | +| echo | `... echo.wasm 1234567890` | — | golden | ✅ | +| erdtree | `... --dir=. erdtree.wasm package` | file tree under CWD | **RANDOMCASE exit-only** | ✅ | +| figlet | `eval ... --dir=fonts figlet.wasm hello` | `fonts/` | golden | ✅ | +| fortune | no args | — | **RANDOMCASE exit-only** | ❌ | +| greg | no args | — | **RANDOMCASE exit-only** | ❌ | +| irb | `eval echo 3+4 \| ... irb.wasm` | stdin expression | golden (prints 7) | ✅ | +| jq | `echo {"zk":123456} \| ... jq.wasm` | should add **`-M .`** as filter (not configured in the archive) | golden missing/unstable | ❌ | +| jyt | `echo {...} \| ... jyt.wasm json-to-yaml` | — | interactive / long run | ❌ | +| main | `eval echo 'SHOW DATABASES;' \| ... --dir=. main.wasm` | MySQL wasm | UNEXPECTED / skip | ❌ | +| md5 | `... md5.wasm helloworld` | — | **RANDOMCASE exit-only** | ✅ | +| pee | `eval echo '' \| ... --dir=. pee.wasm -- pee.wasm.expected` | expected file | golden | ❌ | +| pi | `... pi.wasm 1` | — | golden | ✅ | +| pkg1 | no args | — | golden | ✅ | +| python | `... --dir=case/wapm/lib python.wasm -c 'print(...)'` | **`lib/`** Python 3.6 | needs correct quoting (see below) | ❌ | +| qr2text | `eval ... qr2text.wasm https://wapm.io` | — | golden | ✅ | +| sam | `... sam.wasm -debug sam.wav` | — | golden + **exit 1 allowed** | ✅ | +| spidermonkey | `eval echo 3+4 \| ... spidermonkey.wasm` | JS engine | wasmtime **skip** | ❌ | +| sqlite | `echo -e '.show\n.q' \| ... sqlite.wasm` | — | ignore | ❌ | +| suggest | `... suggest.wasm instakk update install` | — | golden + **exit 1 allowed** | ✅ | +| tpl | `echo 'Δ is 123456-123455.' \| ... tpl.wasm` | — | golden | ✅ | +| uuid | no args | — | **RANDOMCASE exit-only** | ✅ | +| viu | `eval ... --dir=. viu.wasm parallel-small.png` | **`parallel-small.png`** | golden | ✅ | +| wasm3 | `eval ... --dir=. wasm3.wasm --func apply benchmark/des.wasm` | **`benchmark/des.wasm`** | skip / ignore | ❌ | +| zuk | `... zuk.wasm generate 3 uuids` | — | **RANDOMCASE exit-only** | ✅ | + +### 6.1 Notes on Special Cases + +#### jq and `-M .` + +- The archived `jq.wasm.conf` only pipes `echo '{"zk":123456}' | jq.wasm` with **no filter**; the `test_lazy` log shows jq printing its **help**. +- For a deterministic correctness test the usual command is `echo '{"zk":123456}' | jq.wasm -M .` (**`-M`** = monochrome, **`.`** = identity filter). +- **jq is not in the latency table.** + +#### python.wasm + +Recommended command (handwritten example in the lab notebook): + +```bash +wasmtime --dir=case/wapm/lib case/wapm/python.wasm -c "$(echo 'print(f\"helloworld\")')" +# or +wasmtime --dir=case/wapm/lib case/wapm/python.wasm -c "$(echo 'print(123456789)')" +``` + +`*_config.py` uses `echo 'print(123456789)'`; wrong quoting causes bash syntax errors (visible in the log). + +#### erdtree.wasm + +- Requires **`--dir=.`** and the **`package`** subcommand (`.wasm.conf`) +- Scans and packages the current directory; output varies with directory contents → **RANDOMCASE** +- ⚠️ `erdtree_config.py` says `parameter=aarch64`, which is **inconsistent** with lazy/conf; the **`.wasm.conf`** wins + +#### irb / spidermonkey + +- Both use `eval echo 3+4 | ...` to feed an expression on stdin +- **irb**: expects `3+4 => 7` (in the latency table) +- **spidermonkey**: the log shows a long hang then ^C; **skipped** in wasmtime correctness + +#### wasm3.wasm + +- `eval ... --dir=. wasm3.wasm --func apply case/wapm/benchmark/des.wasm` +- Depends on **`benchmark/des.wasm`**; `config.py` ignores `wasm3.wasm` for the dtvm interpreter + +--- + +## 7. Recommended Reproduction Steps + +### 7.1 Setup + +```bash +cd webassembly-testsuites # or the equivalent layout under benchmarks/paper/benchmarks/wapm +# verify the wasm +shasum -a 256 -c benchmarks/wapm/SHA256SUMS # when using the archived copy +``` + +### 7.2 Correctness Smoke (iwasm / dtvm) + +```bash +./case/wapm/runtest_wapm.sh iwasm +# or +./runtest_webassembly.py -r /path/to/dtvm --dtvm-options="-m multipass" -s wapm +``` + +### 7.3 Lazy Latency (needs `test_lazy.sh` reconstructed or manual timing) + +**Single-case example (wasmtime, matches the log):** + +```bash +/usr/bin/time -f '%e' wasmtime case/wapm/echo.wasm 1234567890 +``` + +**DTVM lazy:** + +```bash +dtvm -m multipass --enable-multipass-lazy \ + --disable-multipass-greedyra --disable-multipass-multithread \ + case/wapm/echo.wasm 1234567890 +``` + +Repeat for the **20 table cases**, record ms, and compare with the paper's latency table. + +**Wasmer llvm 10-run average (matching the log's protocol):** + +```bash +for i in $(seq 1 10); do + /usr/bin/time -f '%e' wasmer run --llvm case/wapm/amirali.wasm +done +``` + +### 7.4 Assembling the Latency Table + +The archive has **no** Excel/script generation step. The historical flow was: + +1. `test_lazy.sh` → full log +2. Manually extract ms for 20 cases × 5 runtimes +3. Fill a latency table in the paper's format (including ratio columns) + +--- + +## 8. Relationship to PolyBench Lazy + +| Item | WAPM | PolyBench | +|------|------|-----------| +| Runner | `test_lazy.sh` | **none** (script missing) | +| DTVM lazy switch | `--enable-multipass-lazy` | same (the xlsx `+ lazy` column) | +| Timing meaning | Time to **First** Invocation | processing time (hot benchmark, different metric) | + +--- + +## 9. Related Files + +| File | Description | +|------|-------------| +| [`MANIFEST.md`](MANIFEST.md) | wasm inventory | +| [`README.md`](README.md) | directory overview | +| paper latency table | not shipped; see the paper | +| [`../../scripts/README.md`](../../scripts/README.md) | script index | +| experiment archive | original `test_lazy.sh` logs | + +--- + +## 10. Open Questions for the Original Experimenters + +1. **`test_lazy.sh` source** (timing implementation: bash / Rust wrapper / dtvm built-in?) +2. Whether the **latency table** used a **single run** everywhere or **10-run averages** for wasmer-type runtimes +3. Whether **jq** should use **`-M .`** and whether it was ever part of the latency measurement +4. Whether the **`zuk.wasm.conf` typo** in `iwasm.conf` was the original behavior +5. Whether DTVM lazy WAPM runs disabled the wasmtime/wasmer **module cache** (the log suggests wasmer llvm had a cache) diff --git a/benchmarks/paper/benchmarks/wapm/__init__.py b/benchmarks/paper/benchmarks/wapm/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/paper/benchmarks/wapm/amirali.wasm b/benchmarks/paper/benchmarks/wapm/amirali.wasm new file mode 100644 index 000000000..c82652332 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/amirali.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:649e7bbe96303bf0a86c38397191c74d1cd3d589f2c3c187c4a7175e8365a007 +size 367 diff --git a/benchmarks/paper/benchmarks/wapm/amirali.wasm.conf b/benchmarks/paper/benchmarks/wapm/amirali.wasm.conf new file mode 100644 index 000000000..6678312b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/amirali.wasm.conf @@ -0,0 +1 @@ +HEAD_COMMAND=("") diff --git a/benchmarks/paper/benchmarks/wapm/amirali.wasm.expected b/benchmarks/paper/benchmarks/wapm/amirali.wasm.expected new file mode 100644 index 000000000..663bf7bca --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/amirali.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21a0da8eec3c9e8179d4b3f7388b4d9962f9297e65706b656c623d08b214577f +size 216 diff --git a/benchmarks/paper/benchmarks/wapm/base64cli.wasm b/benchmarks/paper/benchmarks/wapm/base64cli.wasm new file mode 100755 index 000000000..9672ef2df --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/base64cli.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22dd5d48e40959c8fa25f5968aaf3d5af9430e848d9a582b7a0b6ba2aaf9a438 +size 2488902 diff --git a/benchmarks/paper/benchmarks/wapm/base64cli.wasm.conf b/benchmarks/paper/benchmarks/wapm/base64cli.wasm.conf new file mode 100644 index 000000000..33cbf0ad3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/base64cli.wasm.conf @@ -0,0 +1 @@ +PARAMETER=("encode helloworld") diff --git a/benchmarks/paper/benchmarks/wapm/base64cli.wasm.expected b/benchmarks/paper/benchmarks/wapm/base64cli.wasm.expected new file mode 100644 index 000000000..8c80daf38 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/base64cli.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d50043997f0fadb18250ccc7d60a4a4e622614490297f585915431ec0e17f3f3 +size 17 diff --git a/benchmarks/paper/benchmarks/wapm/base64cli_config.py b/benchmarks/paper/benchmarks/wapm/base64cli_config.py new file mode 100644 index 000000000..dec52b77f --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/base64cli_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "encode helloworld" diff --git a/benchmarks/paper/benchmarks/wapm/chkfont.wasm b/benchmarks/paper/benchmarks/wapm/chkfont.wasm new file mode 100755 index 000000000..3b570c002 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/chkfont.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8fcad775e5ab5739c3d6f723cc8121b56fea9c1078d2b1bb1c2e0216d599062 +size 75658 diff --git a/benchmarks/paper/benchmarks/wapm/chkfont.wasm.conf b/benchmarks/paper/benchmarks/wapm/chkfont.wasm.conf new file mode 100644 index 000000000..86b980711 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/chkfont.wasm.conf @@ -0,0 +1,3 @@ +DIR=('--dir=./fonts') +HEAD_COMMAND=("eval") +PARAMETER=("fonts/small.flf") diff --git a/benchmarks/paper/benchmarks/wapm/chkfont.wasm.expected b/benchmarks/paper/benchmarks/wapm/chkfont.wasm.expected new file mode 100644 index 000000000..b6b94d4d6 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/chkfont.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:705a9b94198292c4640e495cf6792ac88cd8224330a6ff661f5c8cf1f9b39a0e +size 120 diff --git a/benchmarks/paper/benchmarks/wapm/chkfont_config.py b/benchmarks/paper/benchmarks/wapm/chkfont_config.py new file mode 100644 index 000000000..54e6f18aa --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/chkfont_config.py @@ -0,0 +1,5 @@ +from config import SuiteConfig + +class config(SuiteConfig): + dir = "--dir=./fonts" + parameter = "fonts/small.flf" diff --git a/benchmarks/paper/benchmarks/wapm/code-stock.wasm b/benchmarks/paper/benchmarks/wapm/code-stock.wasm new file mode 100755 index 000000000..2071f5b1e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/code-stock.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7d05eab7c7753e8b3cfa8f71cce93ae05c09e3b79d16c40509d4dd813aeac27 +size 2036078 diff --git a/benchmarks/paper/benchmarks/wapm/code-stock.wasm.conf b/benchmarks/paper/benchmarks/wapm/code-stock.wasm.conf new file mode 100644 index 000000000..6678312b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/code-stock.wasm.conf @@ -0,0 +1 @@ +HEAD_COMMAND=("") diff --git a/benchmarks/paper/benchmarks/wapm/code-stock.wasm.expected b/benchmarks/paper/benchmarks/wapm/code-stock.wasm.expected new file mode 100644 index 000000000..a2f5bf4fc --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/code-stock.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9014c4624844aa5bac314773d6b689ad467fa4e1d1a50a1b8a99d5a95f72ff5 +size 14 diff --git a/benchmarks/paper/benchmarks/wapm/config.py b/benchmarks/paper/benchmarks/wapm/config.py new file mode 100644 index 000000000..bd752d05c --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/config.py @@ -0,0 +1,7 @@ +from configuration.suite_config import suite_config + +class SuiteConfig(suite_config): + testname = "WAPM-TESTSUITE" + interp_ignore = "main.wasm wasm3.wasm" + ignore_case = "sqlite.wasm" + command = "{input_command} | {runtime} {memory_options}" diff --git a/benchmarks/paper/benchmarks/wapm/cowsay.wasm b/benchmarks/paper/benchmarks/wapm/cowsay.wasm new file mode 100755 index 000000000..768eea15b --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/cowsay.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cf9a18923570a0e76eb5793522dc122f01cfda26db468fe9c3f9b1a1424550a +size 1058629 diff --git a/benchmarks/paper/benchmarks/wapm/cowsay.wasm.conf b/benchmarks/paper/benchmarks/wapm/cowsay.wasm.conf new file mode 100644 index 000000000..3ba73fb85 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/cowsay.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("eval") +PARAMETER=("hello") diff --git a/benchmarks/paper/benchmarks/wapm/cowsay.wasm.expected b/benchmarks/paper/benchmarks/wapm/cowsay.wasm.expected new file mode 100644 index 000000000..b275ba174 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/cowsay.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02942c4796c9413b37e5cff4dfe0edaca61ecf34ea54c0f27f099baf1174b2fa +size 150 diff --git a/benchmarks/paper/benchmarks/wapm/cowsay_config.py b/benchmarks/paper/benchmarks/wapm/cowsay_config.py new file mode 100644 index 000000000..ab25b5524 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/cowsay_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + input_command = "echo 'hello'" diff --git a/benchmarks/paper/benchmarks/wapm/dice.wasm b/benchmarks/paper/benchmarks/wapm/dice.wasm new file mode 100755 index 000000000..2bdeebf4e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/dice.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc7cb89c1cb09cd1098755e9459d8f44ebd5f7fa723f5a42a79130512653c641 +size 33327 diff --git a/benchmarks/paper/benchmarks/wapm/dice.wasm.conf b/benchmarks/paper/benchmarks/wapm/dice.wasm.conf new file mode 100644 index 000000000..fa6c16644 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/dice.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +COMMAND=('echo "help"') diff --git a/benchmarks/paper/benchmarks/wapm/dice.wasm.expected b/benchmarks/paper/benchmarks/wapm/dice.wasm.expected new file mode 100644 index 000000000..eb003cdf7 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/dice.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:910ba25f919fe21e0495e6015341446156c0f7090854ee66d6fafff22854acd1 +size 52 diff --git a/benchmarks/paper/benchmarks/wapm/dice_config.py b/benchmarks/paper/benchmarks/wapm/dice_config.py new file mode 100644 index 000000000..f4f7be098 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/dice_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + input_command = "echo help" diff --git a/benchmarks/paper/benchmarks/wapm/echo.wasm b/benchmarks/paper/benchmarks/wapm/echo.wasm new file mode 100755 index 000000000..c98a3fd10 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/echo.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2854e8f4d8f62028d0799f2740ec960c390515443923f85d0846dc7902a02d25 +size 30502 diff --git a/benchmarks/paper/benchmarks/wapm/echo.wasm.conf b/benchmarks/paper/benchmarks/wapm/echo.wasm.conf new file mode 100644 index 000000000..81f34c6b3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/echo.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER=("1234567890") diff --git a/benchmarks/paper/benchmarks/wapm/echo.wasm.expected b/benchmarks/paper/benchmarks/wapm/echo.wasm.expected new file mode 100644 index 000000000..89eaf14dd --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/echo.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4795a1c2517089e4df569afd77c04e949139cf299c87f012b894fccf91df4594 +size 11 diff --git a/benchmarks/paper/benchmarks/wapm/echo_config.py b/benchmarks/paper/benchmarks/wapm/echo_config.py new file mode 100644 index 000000000..aa66e0ec1 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/echo_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "1234567890" diff --git a/benchmarks/paper/benchmarks/wapm/erdtree.wasm b/benchmarks/paper/benchmarks/wapm/erdtree.wasm new file mode 100755 index 000000000..edbf92d21 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/erdtree.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fa2f44be2a81231e01bcd8db2e63195cfd3341d73fb34f4b163ce5d5be162d0 +size 2057102 diff --git a/benchmarks/paper/benchmarks/wapm/erdtree.wasm.conf b/benchmarks/paper/benchmarks/wapm/erdtree.wasm.conf new file mode 100644 index 000000000..3891fdf0e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/erdtree.wasm.conf @@ -0,0 +1,2 @@ +DIR=('--dir=.') +PARAMETER=("package") diff --git a/benchmarks/paper/benchmarks/wapm/erdtree.wasm.expected b/benchmarks/paper/benchmarks/wapm/erdtree.wasm.expected new file mode 100644 index 000000000..829ed6d1d --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/erdtree.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:706f1bae795982226768de96730c772530ccc6c4b9e6481573c55048ce353ba2 +size 100 diff --git a/benchmarks/paper/benchmarks/wapm/erdtree_config.py b/benchmarks/paper/benchmarks/wapm/erdtree_config.py new file mode 100644 index 000000000..d4afe574b --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/erdtree_config.py @@ -0,0 +1,5 @@ +from config import SuiteConfig + +class config(SuiteConfig): + dir = "--dir=." + parameter = "aarch64" diff --git a/benchmarks/paper/benchmarks/wapm/figlet.wasm b/benchmarks/paper/benchmarks/wapm/figlet.wasm new file mode 100755 index 000000000..5726d1d1e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/figlet.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfb54deb829a5c910544ea7fe25c576c921e9a62f7181cae0f0ccd16432ace65 +size 107944 diff --git a/benchmarks/paper/benchmarks/wapm/figlet.wasm.conf b/benchmarks/paper/benchmarks/wapm/figlet.wasm.conf new file mode 100644 index 000000000..75a578954 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/figlet.wasm.conf @@ -0,0 +1,3 @@ +DIR=('--dir=fonts') +HEAD_COMMAND=("eval") +PARAMETER=("hello") diff --git a/benchmarks/paper/benchmarks/wapm/figlet.wasm.expected b/benchmarks/paper/benchmarks/wapm/figlet.wasm.expected new file mode 100644 index 000000000..797ebbd1c --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/figlet.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2afea1111321537e2637be5dd16e5a593987315225a140bf613cdc96d0f29707 +size 138 diff --git a/benchmarks/paper/benchmarks/wapm/figlet_config.py b/benchmarks/paper/benchmarks/wapm/figlet_config.py new file mode 100644 index 000000000..fcfe8f6f3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/figlet_config.py @@ -0,0 +1,5 @@ +from config import SuiteConfig + +class config(SuiteConfig): + dir = "--dir=./fonts" + parameter = "hello" diff --git a/benchmarks/paper/benchmarks/wapm/fonts/hz.flc b/benchmarks/paper/benchmarks/wapm/fonts/hz.flc new file mode 100644 index 000000000..2d89e4bcf --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/hz.flc @@ -0,0 +1,4 @@ +flc2a +# Set HZ input mode (a 7-bit encoding of GB Chinese text) +# Meaningful only to FIGlet 2.2 beta 4 or better +h diff --git a/benchmarks/paper/benchmarks/wapm/fonts/koi8r.flc b/benchmarks/paper/benchmarks/wapm/fonts/koi8r.flc new file mode 100644 index 000000000..e324d8b04 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/koi8r.flc @@ -0,0 +1,128 @@ +t \0x80 \0x2500 +t \0x81 \0x2502 +t \0x82 \0x250c +t \0x83 \0x2510 +t \0x84 \0x2514 +t \0x85 \0x2518 +t \0x86 \0x251c +t \0x87 \0x2524 +t \0x88 \0x252c +t \0x89 \0x2534 +t \0x8a \0x253c +t \0x8b \0x2580 +t \0x8c \0x2584 +t \0x8d \0x2588 +t \0x8e \0x258c +t \0x8f \0x2590 +t \0x90 \0x2591 +t \0x91 \0x2592 +t \0x92 \0x2593 +t \0x93 \0x2320 +t \0x94 \0x25a0 +t \0x95 \0x2219 +t \0x96 \0x221a +t \0x97 \0x2248 +t \0x98 \0x2264 +t \0x99 \0x2265 +t \0x9a \0x00a0 +t \0x9b \0x2321 +t \0x9c \0x00b0 +t \0x9d \0x00b2 +t \0x9e \0x00b7 +t \0x9f \0x00f7 +t \0xa0 \0x2550 +t \0xa1 \0x2551 +t \0xa2 \0x2552 +t \0xa3 \0x0451 +t \0xa4 \0x2553 +t \0xa5 \0x2554 +t \0xa6 \0x2555 +t \0xa7 \0x2556 +t \0xa8 \0x2557 +t \0xa9 \0x2558 +t \0xaa \0x2559 +t \0xab \0x255a +t \0xac \0x255b +t \0xad \0x255c +t \0xae \0x255d +t \0xaf \0x255e +t \0xb0 \0x255f +t \0xb1 \0x2560 +t \0xb2 \0x2561 +t \0xb3 \0x0401 +t \0xb4 \0x2562 +t \0xb5 \0x2563 +t \0xb6 \0x2564 +t \0xb7 \0x2565 +t \0xb8 \0x2566 +t \0xb9 \0x2567 +t \0xba \0x2568 +t \0xbb \0x2569 +t \0xbc \0x256a +t \0xbd \0x256b +t \0xbe \0x256c +t \0xbf \0x00a9 +t \0xc0 \0x044e +t \0xc1 \0x0430 +t \0xc2 \0x0431 +t \0xc3 \0x0446 +t \0xc4 \0x0434 +t \0xc5 \0x0435 +t \0xc6 \0x0444 +t \0xc7 \0x0433 +t \0xc8 \0x0445 +t \0xc9 \0x0438 +t \0xca \0x0439 +t \0xcb \0x043a +t \0xcc \0x043b +t \0xcd \0x043c +t \0xce \0x043d +t \0xcf \0x043e +t \0xd0 \0x043f +t \0xd1 \0x044f +t \0xd2 \0x0440 +t \0xd3 \0x0441 +t \0xd4 \0x0442 +t \0xd5 \0x0443 +t \0xd6 \0x0436 +t \0xd7 \0x0432 +t \0xd8 \0x044c +t \0xd9 \0x044b +t \0xda \0x0437 +t \0xdb \0x0448 +t \0xdc \0x044d +t \0xdd \0x0449 +t \0xde \0x0447 +t \0xdf \0x044a +t \0xe0 \0x042e +t \0xe1 \0x0410 +t \0xe2 \0x0411 +t \0xe3 \0x0426 +t \0xe4 \0x0414 +t \0xe5 \0x0415 +t \0xe6 \0x0424 +t \0xe7 \0x0413 +t \0xe8 \0x0425 +t \0xe9 \0x0418 +t \0xea \0x0419 +t \0xeb \0x041a +t \0xec \0x041b +t \0xed \0x041c +t \0xee \0x041d +t \0xef \0x041e +t \0xf0 \0x041f +t \0xf1 \0x042f +t \0xf2 \0x0420 +t \0xf3 \0x0421 +t \0xf4 \0x0422 +t \0xf5 \0x0423 +t \0xf6 \0x0416 +t \0xf7 \0x0412 +t \0xf8 \0x042c +t \0xf9 \0x042b +t \0xfa \0x0417 +t \0xfb \0x0428 +t \0xfc \0x042d +t \0xfd \0x0429 +t \0xfe \0x0427 +t \0xff \0x042a diff --git a/benchmarks/paper/benchmarks/wapm/fonts/lean.flf b/benchmarks/paper/benchmarks/wapm/fonts/lean.flf new file mode 100644 index 000000000..7e53563c0 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/lean.flf @@ -0,0 +1,1691 @@ +flf2a$ 8 6 27 0 10 0 576 96 +Lean by Glenn Chappell 4/93 -- based on various .sig's +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + _/ _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + $$ @ + _/ _/ $@ + _/_/_/_/_/ $ @ + _/ _/ $ @ +_/_/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + _/ $ @ + $$ @@ + $$@ + _/_/ _/ $ @ + _/_/ _/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ _/ $@ + _/_/ _/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ _/ _/ $ @ + _/_/_/ $ @ + _/_/_/_/_/ $ @ + _/_/_/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + @ + @ + @ + $$@ + _/ $ @ +_/ $ @ + $$ @@ + @ + @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + @ + @ + @@ + @ + @ + @ + @ + $$@ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $@ +_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/_/_/ $ @ + $$ @ +_/_/_/_/_/ $ @ + $$ @ + @ + @@ + $$ @ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ $ @ + _/_/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/_/_/ $@ + _/ _/ $ @ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ +_/ _/_/_/_/ $ @ + _/ $ @ + _/_/_/_/_/_/ $ @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $@ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/_/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + $$ @ +_/ $ @ + _/ $ @ + _/ $ @ + _/ $@ + _/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + @ + @ + @ + @ + $$ @ + $$@ +_/_/_/_/_/ $ @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/ $ @ + _/ $ @ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @@ + @ + $$@ + _/ _/_/ $ @ + _/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + @ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + _/ _/ $@ +_/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +160 NO-BREAK SPACE + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ +161 INVERTED EXCLAMATION MARK + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +162 CENT SIGN + $$ @ + _/ $@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + $$ @@ +163 POUND SIGN + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/_/_/ _/ $ @ +_/_/ _/_/ $ @ + @@ +164 CURRENCY SIGN + $$@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @@ +165 YEN SIGN + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @@ +166 BROKEN BAR + _/ $@ + _/ $ @ + _/ $ @ + $$ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @@ +167 SECTION SIGN + _/_/ $@ + _/ $ @ + _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ +168 DIAERESIS + _/ _/ $@ + $$ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @ + @ + @@ +169 COPYRIGHT SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/_/_/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +170 FEMININE ORDINAL INDICATOR + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +172 NOT SIGN + @ + @ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + $$@ +_/_/_/_/ $ @ + $$ @ + $$ @ + @ + @@ +174 REGISTERED SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/_/_/ _/ $ @ +_/ _/ _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +175 MACRON + _/_/_/_/_/ $@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +176 DEGREE SIGN + _/ $@ + _/ _/ $ @ + _/ $ @ + $$ @ + $$ @ +$$ @ + @ + @@ +177 PLUS-MINUS SIGN + $$ @ + _/ $ @ + _/ $@ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ +178 SUPERSCRIPT TWO + $$ @ + _/_/ $@ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @ + @@ +179 SUPERSCRIPT THREE + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @ + @ + @@ +180 ACUTE ACCENT + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +181 MICRO SIGN + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ $ @ +_/ $ @@ +182 PILCROW SIGN + $$@ + _/_/_/_/ $ @ +_/_/_/ _/ $ @ + _/_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +183 MIDDLE DOT + @ + @ + $$@ + _/ $ @ + $$ @ +$$ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + $$@ + _/ $ @ +_/_/ $ @@ +185 SUPERSCRIPT ONE + $$@ + _/ $ @ +_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + $$ @ + _/ _/ $ @ + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + $$ @ + _/ _/ $@ +_/_/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +189 VULGAR FRACTION ONE HALF + $$ @ + _/ _/ $ @ +_/_/ _/ _/_/ $@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/_/_/ $ @ + $$ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + $$ @ + _/_/_/ _/ $@ + _/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +191 INVERTED QUESTION MARK + $$@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +198 LATIN CAPITAL LETTER AE + $$@ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ +_/ _/_/_/_/ $ @ + $$ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +208 LATIN CAPITAL LETTER ETH + $$ @ + _/_/_/ $@ + _/ _/ $ @ +_/_/_/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +215 MULTIPLICATION SIGN + @ + $$@ + _/ _/ $ @ + _/ $ @ +_/ _/ $ @ + $$ @ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $$@ + _/_/_/_/ $ @ + _/ _/_/ $ @ + _/ _/ _/ $ @ + _/_/ _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/ $ @ + _/ $@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ +_/ $ @ + $$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _/ $@ + _/ _/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +230 LATIN SMALL LETTER AE + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/_/_/_/_/ $ @ +_/ _/_/ $ @ + _/_/_/ _/_/_/ $ @ + $$ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +240 LATIN SMALL LETTER ETH + _/ _/ $@ + _/ $ @ + _/ _/ $@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + _/_/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +247 DIVISION SIGN + $$ @ + _/ $ @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + _/ $ @ + $$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $$@ + _/_/_/ $ @ + _/ _/_/ $ @ + _/_/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + _/ $ @ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +254 LATIN SMALL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/mini.flf b/benchmarks/paper/benchmarks/wapm/fonts/mini.flf new file mode 100644 index 000000000..3b72606ca --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/mini.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 10 0 10 0 1920 96 +Mini by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@@ + @ + |$@ + o$@ + @@ + @ + ||$@ + @ + @@ + @ + -|-|-$@ + -|-|-$@ + @@ + _$@ + (|$ @ + _|)$@ + @@ + @ + O/$@ + /O$@ + @@ + @ + ()$ @ + (_X$@ + @@ + @ + /$@ + @ + @@ + @ + /$@ + |$ @ + \$@@ + @ + \$ @ + |$@ + /$ @@ + @ + \|/$@ + /|\$@ + @@ + @ + _|_$@ + |$ @ + @@ + @ + @ + o$@ + /$@@ + @ + __$@ + @ + @@ + @ + @ + o$@ + @@ + @ + /$@ + /$ @ + @@ + _$ @ + / \$@ + \_/$@ + @@ + @ + /|$@ + |$@ + @@ + _$ @ + )$@ + /_$@ + @@ + _$ @ + _)$@ + _)$@ + @@ + @ + |_|_$@ + |$ @ + @@ + _$ @ + |_$ @ + _)$@ + @@ + _$ @ + |_$ @ + |_)$@ + @@ + __$@ + /$@ + /$ @ + @@ + _$ @ + (_)$@ + (_)$@ + @@ + _$ @ + (_|$@ + |$@ + @@ + @ + o$@ + o$@ + @@ + @ + o$@ + o$@ + /$@@ + @ + /$@ + \$@ + @@ + @ + --$@ + --$@ + @@ + @ + \$@ + /$@ + @@ + _$ @ + )$@ + o$ @ + @@ + __$ @ + / \$@ + | (|/$@ + \__$ @@ + @ + /\$ @ + /--\$@ + @@ + _$ @ + |_)$@ + |_)$@ + @@ + _$@ + /$ @ + \_$@ + @@ + _$ @ + | \$@ + |_/$@ + @@ + _$@ + |_$@ + |_$@ + @@ + _$@ + |_$@ + |$ @ + @@ + __$@ + /__$@ + \_|$@ + @@ + @ + |_|$@ + | |$@ + @@ + ___$@ + |$ @ + _|_$@ + @@ + @ + |$@ + \_|$@ + @@ + @ + |/$@ + |\$@ + @@ + @ + |$ @ + |_$@ + @@ + @ + |\/|$@ + | |$@ + @@ + @ + |\ |$@ + | \|$@ + @@ + _$ @ + / \$@ + \_/$@ + @@ + _$ @ + |_)$@ + |$ @ + @@ + _$ @ + / \$@ + \_X$@ + @@ + _$ @ + |_)$@ + | \$@ + @@ + __$@ + (_$ @ + __)$@ + @@ + ___$@ + |$ @ + |$ @ + @@ + @ + | |$@ + |_|$@ + @@ + @ + \ /$@ + \/$ @ + @@ + @ + \ /$@ + \/\/$ @ + @@ + @ + \/$@ + /\$@ + @@ + @ + \_/$@ + |$ @ + @@ + __$@ + /$@ + /_$@ + @@ + _$@ + |$ @ + |_$@ + @@ + @ + \$ @ + \$@ + @@ + _$ @ + |$@ + _|$@ + @@ + /\$@ + @ + @ + @@ + @ + @ + @ + __$@@ + @ + \$@ + @ + @@ + @ + _.$@ + (_|$@ + @@ + @ + |_$ @ + |_)$@ + @@ + @ + _$@ + (_$@ + @@ + @ + _|$@ + (_|$@ + @@ + @ + _$ @ + (/_$@ + @@ + _$@ + _|_$@ + |$ @ + @@ + @ + _$ @ + (_|$@ + _|$@@ + @ + |_$ @ + | |$@ + @@ + @ + o$@ + |$@ + @@ + @ + o$@ + |$@ + _|$@@ + @ + |$ @ + |<$@ + @@ + @ + |$@ + |$@ + @@ + @ + ._ _$ @ + | | |$@ + @@ + @ + ._$ @ + | |$@ + @@ + @ + _$ @ + (_)$@ + @@ + @ + ._$ @ + |_)$@ + |$ @@ + @ + _.$@ + (_|$@ + |$@@ + @ + ._$@ + |$ @ + @@ + @ + _$@ + _>$@ + @@ + @ + _|_$@ + |_$@ + @@ + @ + @ + |_|$@ + @@ + @ + @ + \/$@ + @@ + @ + @ + \/\/$@ + @@ + @ + @ + ><$@ + @@ + @ + @ + \/$@ + /$ @@ + @ + _$ @ + /_$@ + @@ + ,-$@ + _|$ @ + |$ @ + `-$@@ + |$@ + |$@ + |$@ + |$@@ + -.$ @ + |_$@ + |$ @ + -'$ @@ + /\/$@ + @ + @ + @@ + o o$@ + /\$ @ + /--\$@ + @@ + o_o$@ + / \$@ + \_/$@ + @@ + o o$@ + | |$@ + |_|$@ + @@ + o o$@ + _.$@ + (_|$@ + @@ + o o$@ + _$ @ + (_)$@ + @@ + o o$@ + @ + |_|$@ + @@ + _$ @ + | )$@ + | )$@ + |$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o$@ + |$@ + @@ +162 CENT SIGN + @ + |_$@ + (__$@ + |$ @@ +163 POUND SIGN + _$ @ + _/_`$ @ + |___$@ + @@ +164 CURRENCY SIGN + @ + `o'$@ + ' `$@ + @@ +165 YEN SIGN + @ + _\_/_$@ + --|--$@ + @@ +166 BROKEN BAR + |$@ + |$@ + |$@ + |$@@ +167 SECTION SIGN + _$@ + ($ @ + ()$@ + _)$@@ +168 DIAERESIS + o o$@ + @ + @ + @@ +169 COPYRIGHT SIGN + _$ @ + |C|$@ + `-'$@ + @@ +170 FEMININE ORDINAL INDICATOR + _.$@ + (_|$@ + ---$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //$@ + \\$@ + @@ +172 NOT SIGN + @ + __$ @ + |$@ + @@ +173 SOFT HYPHEN + @ + _$@ + @ + @@ +174 REGISTERED SIGN + _$ @ + |R|$@ + `-'$@ + @@ +175 MACRON + __$@ + @ + @ + @@ +176 DEGREE SIGN + O$@ + @ + @ + @@ +177 PLUS-MINUS SIGN + @ + _|_$@ + _|_$@ + @@ +178 SUPERSCRIPT TWO + 2$@ + @ + @ + @@ +179 SUPERSCRIPT THREE + 3$@ + @ + @ + @@ +180 ACUTE ACCENT + /$@ + @ + @ + @@ +181 MICRO SIGN + @ + @ + |_|$@ + |$ @@ +182 PILCROW SIGN + __$ @ + (| |$@ + | |$@ + @@ +183 MIDDLE DOT + @ + o$@ + @ + @@ +184 CEDILLA + @ + @ + @ + S$@@ +185 SUPERSCRIPT ONE + 1$@ + @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _$ @ + (_)$@ + ---$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\$@ + //$@ + @@ +188 VULGAR FRACTION ONE QUARTER + @ + 1/$@ + /4$@ + @@ +189 VULGAR FRACTION ONE HALF + @ + 1/$@ + /2$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + @ + 3/$@ + /4$@ + @@ +191 INVERTED QUESTION MARK + @ + o$@ + (_$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \$ @ + /\$ @ + /--\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + /$ @ + /\$ @ + /--\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\$ @ + /\$ @ + /--\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/$@ + /\$ @ + /--\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o$@ + /\$ @ + /--\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + O$ @ + / \$ @ + /---\$@ + @@ +198 LATIN CAPITAL LETTER AE + _$@ + /|_$@ + /-|_$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _$@ + /$ @ + \_$@ + S$@@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_$@ + |_$@ + |_$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + |_$ @ + |_$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\$@ + |_$ @ + |_$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o_o$@ + |_$ @ + |_$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \__$@ + |$ @ + _|_$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __/$@ + |$ @ + _|_$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\$@ + ___$@ + _|_$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o_o$@ + |$ @ + _|_$@ + @@ +208 LATIN CAPITAL LETTER ETH + _$ @ + _|_\$@ + |_/$@ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/$@ + |\ |$@ + | \|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \$ @ + / \$@ + \_/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + /$ @ + / \$@ + \_/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\$@ + / \$@ + \_/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/$@ + / \$@ + \_/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o_o$@ + / \$@ + \_/$@ + @@ +215 MULTIPLICATION SIGN + @ + @ + X$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __$ @ + / /\$@ + \/_/$@ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \$ @ + | |$@ + |_|$@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + /$ @ + | |$@ + |_|$@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\$@ + | |$@ + |_|$@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o$@ + | |$@ + |_|$@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + /$ @ + \_/$@ + |$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |_$ @ + |_)$@ + |$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _$ @ + | )$@ + | )$@ + |$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \$ @ + _.$@ + (_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + /$ @ + _.$@ + (_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\$@ + _.$@ + (_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/$@ + _.$@ + (_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o$@ + _.$@ + (_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + O$ @ + _.$@ + (_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + ___$ @ + (_|/_$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _$@ + (_$@ + S$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \$ @ + _$ @ + (/_$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + /$ @ + _$ @ + (/_$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\$@ + _$ @ + (/_$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o$@ + _$ @ + (/_$@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \$@ + @ + |$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + /$@ + @ + |$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\$@ + @ + |$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o$@ + @ + |$ @ + @@ +240 LATIN SMALL LETTER ETH + X$ @ + \$ @ + (_|$@ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/$@ + ._$ @ + | |$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \$ @ + _$ @ + (_)$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + /$ @ + _$ @ + (_)$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\$@ + _$ @ + (_)$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/$@ + _$ @ + (_)$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o$@ + _$ @ + (_)$@ + @@ +247 DIVISION SIGN + o$ @ + ---$@ + o$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _$ @ + (/)$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \$ @ + @ + |_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + /$ @ + @ + |_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\$@ + @ + |_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o$@ + @ + |_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + /$@ + @ + \/$@ + /$ @@ +254 LATIN SMALL LETTER THORN + @ + |_$ @ + |_)$@ + |$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + oo$@ + @ + \/$@ + /$ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/mnemonic.flf b/benchmarks/paper/benchmarks/wapm/fonts/mnemonic.flf new file mode 100644 index 000000000..03e4baa78 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/mnemonic.flf @@ -0,0 +1,3702 @@ +flf2a$ 1 1 12 -1 5 0 0 1797 +mnemonic - a FIGfont by John Cowan +This font uses the mnemonics of RFC1345 +(http://ds.internic.net/rfc/rfc1345.txt) to implement a really large character +set rather crudely, but reversibly. Two-letter mnemonics +are prefixed by &; larger mnemonics are prefixed by &_ and followed by _. +&SP@@ +!@@ +"@@ +&Nb@@ +&DO@@ +%@@ +&@@ +'@@ +(@@ +)@@ +*@@ ++@@ +,@@ +-@@ +.@@ +/@@ +0@@ +1@@ +2@@ +3@@ +4@@ +5@@ +6@@ +7@@ +8@@ +9@@ +:@@ +;@@ +<@@ +=@@ +>@@ +?@@ +&At@@ +A@@ +B@@ +C@@ +D@@ +E@@ +F@@ +G@@ +H@@ +I@@ +J@@ +K@@ +L@@ +M@@ +N@@ +O@@ +P@@ +Q@@ +R@@ +S@@ +T@@ +U@@ +V@@ +W@@ +X@@ +Y@@ +Z@@ +&<(@@ +&//@@ +&)>@@ +&'>@@ +_@@ +&'!@@ +a@@ +b@@ +c@@ +d@@ +e@@ +f@@ +g@@ +h@@ +i@@ +j@@ +k@@ +l@@ +m@@ +n@@ +o@@ +p@@ +q@@ +r@@ +s@@ +t@@ +u@@ +v@@ +w@@ +x@@ +y@@ +z@@ +&(!@@ +&!!@@ +&!)@@ +&'?@@ +&A:@@ +&O:@@ +&U:@@ +&a:@@ +&o:@@ +&u:@@ +&ss@@ +0x0001 START OF HEADING (SOH) +&SH@@ +0x0002 START OF TEXT (STX) +&SX@@ +0x0003 END OF TEXT (ETX) +&EX@@ +0x0004 END OF TRANSMISSION (EOT) +&ET@@ +0x0005 ENQUIRY (ENQ) +&EQ@@ +0x0006 ACKNOWLEDGE (ACK) +&AK@@ +0x0007 BELL (BEL) +&BL@@ +0x0008 BACKSPACE (BS) +&BS@@ +0x0009 CHARACTER TABULATION (HT) +&HT@@ +0x000a LINE FEED (LF) +&LF@@ +0x000b LINE TABULATION (VT) +&VT@@ +0x000c FORM FEED (FF) +&FF@@ +0x000d CARRIAGE RETURN (CR) +&CR@@ +0x000e SHIFT OUT (SO) +&SO@@ +0x000f SHIFT IN (SI) +&SI@@ +0x0010 DATALINK ESCAPE (DLE) +&DL@@ +0x0011 DEVICE CONTROL ONE (DC1) +&D1@@ +0x0012 DEVICE CONTROL TWO (DC2) +&D2@@ +0x0013 DEVICE CONTROL THREE (DC3) +&D3@@ +0x0014 DEVICE CONTROL FOUR (DC4) +&D4@@ +0x0015 NEGATIVE ACKNOWLEDGE (NAK) +&NK@@ +0x0016 SYNCRONOUS IDLE (SYN) +&SY@@ +0x0017 END OF TRANSMISSION BLOCK (ETB) +&EB@@ +0x0018 CANCEL (CAN) +&CN@@ +0x0019 END OF MEDIUM (EM) +&EM@@ +0x001a SUBSTITUTE (SUB) +&SB@@ +0x001b ESCAPE (ESC) +&EC@@ +0x001c FILE SEPARATOR (IS4) +&FS@@ +0x001d GROUP SEPARATOR (IS3) +&GS@@ +0x001e RECORD SEPARATOR (IS2) +&RS@@ +0x001f UNIT SEPARATOR (IS1) +&US@@ +0x007f DELETE (DEL) +&DT@@ +0x0080 PADDING CHARACTER (PAD) +&PA@@ +0x0081 HIGH OCTET PRESET (HOP) +&HO@@ +0x0082 BREAK PERMITTED HERE (BPH) +&BH@@ +0x0083 NO BREAK HERE (NBH) +&NH@@ +0x0084 INDEX (IND) +&IN@@ +0x0085 NEXT LINE (NEL) +&NL@@ +0x0086 START OF SELECTED AREA (SSA) +&SA@@ +0x0087 END OF SELECTED AREA (ESA) +&ES@@ +0x0088 CHARACTER TABULATION SET (HTS) +&HS@@ +0x0089 CHARACTER TABULATION WITH JUSTIFICATION (HTJ) +&HJ@@ +0x008a LINE TABULATION SET (VTS) +&VS@@ +0x008b PARTIAL LINE FORWARD (PLD) +&PD@@ +0x008c PARTIAL LINE BACKWARD (PLU) +&PU@@ +0x008d REVERSE LINE FEED (RI) +&RI@@ +0x008e SINGLE-SHIFT TWO (SS2) +&S2@@ +0x008f SINGLE-SHIFT THREE (SS3) +&S3@@ +0x0090 DEVICE CONTROL STRING (DCS) +&DC@@ +0x0091 PRIVATE USE ONE (PU1) +&P1@@ +0x0092 PRIVATE USE TWO (PU2) +&P2@@ +0x0093 SET TRANSMIT STATE (STS) +&TS@@ +0x0094 CANCEL CHARACTER (CCH) +&CC@@ +0x0095 MESSAGE WAITING (MW) +&MW@@ +0x0096 START OF GUARDED AREA (SPA) +&SG@@ +0x0097 END OF GUARDED AREA (EPA) +&EG@@ +0x0098 START OF STRING (SOS) +&SS@@ +0x0099 SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) +&GC@@ +0x009a SINGLE CHARACTER INTRODUCER (SCI) +&SC@@ +0x009b CONTROL SEQUENCE INTRODUCER (CSI) +&CI@@ +0x009c STRING TERMINATOR (ST) +&ST@@ +0x009d OPERATING SYSTEM COMMAND (OSC) +&OC@@ +0x009e PRIVACY MESSAGE (PM) +&PM@@ +0x009f APPLICATION PROGRAM COMMAND (APC) +&AC@@ +0x00a0 NO-BREAK SPACE +&NS@@ +0x00a1 INVERTED EXCLAMATION MARK +&!I@@ +0x00a2 CENT SIGN +&Ct@@ +0x00a3 POUND SIGN +&Pd@@ +0x00a4 CURRENCY SIGN +&Cu@@ +0x00a5 YEN SIGN +&Ye@@ +0x00a6 BROKEN BAR +&BB@@ +0x00a7 SECTION SIGN +&SE@@ +0x00a8 DIAERESIS +&':@@ +0x00a9 COPYRIGHT SIGN +&Co@@ +0x00aa FEMININE ORDINAL INDICATOR +&-a@@ +0x00ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +&<<@@ +0x00ac NOT SIGN +&NO@@ +0x00ad SOFT HYPHEN +&--@@ +0x00ae REGISTERED SIGN +&Rg@@ +0x00af MACRON +&'m@@ +0x00b0 DEGREE SIGN +&DG@@ +0x00b1 PLUS-MINUS SIGN +&+-@@ +0x00b2 SUPERSCRIPT TWO +&2S@@ +0x00b3 SUPERSCRIPT THREE +&3S@@ +0x00b4 ACUTE ACCENT +&''@@ +0x00b5 MICRO SIGN +&My@@ +0x00b6 PILCROW SIGN +&PI@@ +0x00b7 MIDDLE DOT +&.M@@ +0x00b8 CEDILLA +&',@@ +0x00b9 SUPERSCRIPT ONE +&1S@@ +0x00ba MASCULINE ORDINAL INDICATOR +&-o@@ +0x00bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +&>>@@ +0x00bc VULGAR FRACTION ONE QUARTER +&14@@ +0x00bd VULGAR FRACTION ONE HALF +&12@@ +0x00be VULGAR FRACTION THREE QUARTERS +&34@@ +0x00bf INVERTED QUESTION MARK +&?I@@ +0x00c0 LATIN CAPITAL LETTER A WITH GRAVE +&A!@@ +0x00c1 LATIN CAPITAL LETTER A WITH ACUTE +&A'@@ +0x00c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +&A>@@ +0x00c3 LATIN CAPITAL LETTER A WITH TILDE +&A?@@ +0x00c4 LATIN CAPITAL LETTER A WITH DIAERESIS +&A:@@ +0x00c5 LATIN CAPITAL LETTER A WITH RING ABOVE +&AA@@ +0x00c6 LATIN CAPITAL LETTER AE +&AE@@ +0x00c7 LATIN CAPITAL LETTER C WITH CEDILLA +&C,@@ +0x00c8 LATIN CAPITAL LETTER E WITH GRAVE +&E!@@ +0x00c9 LATIN CAPITAL LETTER E WITH ACUTE +&E'@@ +0x00ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX +&E>@@ +0x00cb LATIN CAPITAL LETTER E WITH DIAERESIS +&E:@@ +0x00cc LATIN CAPITAL LETTER I WITH GRAVE +&I!@@ +0x00cd LATIN CAPITAL LETTER I WITH ACUTE +&I'@@ +0x00ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX +&I>@@ +0x00cf LATIN CAPITAL LETTER I WITH DIAERESIS +&I:@@ +0x00d0 LATIN CAPITAL LETTER ETH (Icelandic) +&D-@@ +0x00d1 LATIN CAPITAL LETTER N WITH TILDE +&N?@@ +0x00d2 LATIN CAPITAL LETTER O WITH GRAVE +&O!@@ +0x00d3 LATIN CAPITAL LETTER O WITH ACUTE +&O'@@ +0x00d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +&O>@@ +0x00d5 LATIN CAPITAL LETTER O WITH TILDE +&O?@@ +0x00d6 LATIN CAPITAL LETTER O WITH DIAERESIS +&O:@@ +0x00d7 MULTIPLICATION SIGN +&*X@@ +0x00d8 LATIN CAPITAL LETTER O WITH STROKE +&O/@@ +0x00d9 LATIN CAPITAL LETTER U WITH GRAVE +&U!@@ +0x00da LATIN CAPITAL LETTER U WITH ACUTE +&U'@@ +0x00db LATIN CAPITAL LETTER U WITH CIRCUMFLEX +&U>@@ +0x00dc LATIN CAPITAL LETTER U WITH DIAERESIS +&U:@@ +0x00dd LATIN CAPITAL LETTER Y WITH ACUTE +&Y'@@ +0x00de LATIN CAPITAL LETTER THORN (Icelandic) +&TH@@ +0x00df LATIN SMALL LETTER SHARP S (German) +&ss@@ +0x00e0 LATIN SMALL LETTER A WITH GRAVE +&a!@@ +0x00e1 LATIN SMALL LETTER A WITH ACUTE +&a'@@ +0x00e2 LATIN SMALL LETTER A WITH CIRCUMFLEX +&a>@@ +0x00e3 LATIN SMALL LETTER A WITH TILDE +&a?@@ +0x00e4 LATIN SMALL LETTER A WITH DIAERESIS +&a:@@ +0x00e5 LATIN SMALL LETTER A WITH RING ABOVE +&aa@@ +0x00e6 LATIN SMALL LETTER AE +&ae@@ +0x00e7 LATIN SMALL LETTER C WITH CEDILLA +&c,@@ +0x00e8 LATIN SMALL LETTER E WITH GRAVE +&e!@@ +0x00e9 LATIN SMALL LETTER E WITH ACUTE +&e'@@ +0x00ea LATIN SMALL LETTER E WITH CIRCUMFLEX +&e>@@ +0x00eb LATIN SMALL LETTER E WITH DIAERESIS +&e:@@ +0x00ec LATIN SMALL LETTER I WITH GRAVE +&i!@@ +0x00ed LATIN SMALL LETTER I WITH ACUTE +&i'@@ +0x00ee LATIN SMALL LETTER I WITH CIRCUMFLEX +&i>@@ +0x00ef LATIN SMALL LETTER I WITH DIAERESIS +&i:@@ +0x00f0 LATIN SMALL LETTER ETH (Icelandic) +&d-@@ +0x00f1 LATIN SMALL LETTER N WITH TILDE +&n?@@ +0x00f2 LATIN SMALL LETTER O WITH GRAVE +&o!@@ +0x00f3 LATIN SMALL LETTER O WITH ACUTE +&o'@@ +0x00f4 LATIN SMALL LETTER O WITH CIRCUMFLEX +&o>@@ +0x00f5 LATIN SMALL LETTER O WITH TILDE +&o?@@ +0x00f6 LATIN SMALL LETTER O WITH DIAERESIS +&o:@@ +0x00f7 DIVISION SIGN +&-:@@ +0x00f8 LATIN SMALL LETTER O WITH STROKE +&o/@@ +0x00f9 LATIN SMALL LETTER U WITH GRAVE +&u!@@ +0x00fa LATIN SMALL LETTER U WITH ACUTE +&u'@@ +0x00fb LATIN SMALL LETTER U WITH CIRCUMFLEX +&u>@@ +0x00fc LATIN SMALL LETTER U WITH DIAERESIS +&u:@@ +0x00fd LATIN SMALL LETTER Y WITH ACUTE +&y'@@ +0x00fe LATIN SMALL LETTER THORN (Icelandic) +&th@@ +0x00ff LATIN SMALL LETTER Y WITH DIAERESIS +&y:@@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON +&A-@@ +0x0101 LATIN SMALL LETTER A WITH MACRON +&a-@@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE +&A(@@ +0x0103 LATIN SMALL LETTER A WITH BREVE +&a(@@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK +&A;@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK +&a;@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE +&C'@@ +0x0107 LATIN SMALL LETTER C WITH ACUTE +&c'@@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +&C>@@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +&c>@@ +0x010a LATIN CAPITAL LETTER C WITH DOT ABOVE +&C.@@ +0x010b LATIN SMALL LETTER C WITH DOT ABOVE +&c.@@ +0x010c LATIN CAPITAL LETTER C WITH CARON +&C<@@ +0x010d LATIN SMALL LETTER C WITH CARON +&c<@@ +0x010e LATIN CAPITAL LETTER D WITH CARON +&D<@@ +0x010f LATIN SMALL LETTER D WITH CARON +&d<@@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE +&D/@@ +0x0111 LATIN SMALL LETTER D WITH STROKE +&d/@@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON +&E-@@ +0x0113 LATIN SMALL LETTER E WITH MACRON +&e-@@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE +&E(@@ +0x0115 LATIN SMALL LETTER E WITH BREVE +&e(@@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +&E.@@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE +&e.@@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK +&E;@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK +&e;@@ +0x011a LATIN CAPITAL LETTER E WITH CARON +&E<@@ +0x011b LATIN SMALL LETTER E WITH CARON +&e<@@ +0x011c LATIN CAPITAL LETTER G WITH CIRCUMFLEX +&G>@@ +0x011d LATIN SMALL LETTER G WITH CIRCUMFLEX +&g>@@ +0x011e LATIN CAPITAL LETTER G WITH BREVE +&G(@@ +0x011f LATIN SMALL LETTER G WITH BREVE +&g(@@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +&G.@@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE +&g.@@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA +&G,@@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA +&g,@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +&H>@@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +&h>@@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE +&H/@@ +0x0127 LATIN SMALL LETTER H WITH STROKE +&h/@@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE +&I?@@ +0x0129 LATIN SMALL LETTER I WITH TILDE +&i?@@ +0x012a LATIN CAPITAL LETTER I WITH MACRON +&I-@@ +0x012b LATIN SMALL LETTER I WITH MACRON +&i-@@ +0x012c LATIN CAPITAL LETTER I WITH BREVE +&I(@@ +0x012d LATIN SMALL LETTER I WITH BREVE +&i(@@ +0x012e LATIN CAPITAL LETTER I WITH OGONEK +&I;@@ +0x012f LATIN SMALL LETTER I WITH OGONEK +&i;@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +&I.@@ +0x0131 LATIN SMALL LETTER I DOTLESS +&i.@@ +0x0132 LATIN CAPITAL LIGATURE IJ +&IJ@@ +0x0133 LATIN SMALL LIGATURE IJ +&ij@@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +&J>@@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +&j>@@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA +&K,@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA +&k,@@ +0x0138 LATIN SMALL LETTER KRA (Greenlandic) +&kk@@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE +&L'@@ +0x013a LATIN SMALL LETTER L WITH ACUTE +&l'@@ +0x013b LATIN CAPITAL LETTER L WITH CEDILLA +&L,@@ +0x013c LATIN SMALL LETTER L WITH CEDILLA +&l,@@ +0x013d LATIN CAPITAL LETTER L WITH CARON +&L<@@ +0x013e LATIN SMALL LETTER L WITH CARON +&l<@@ +0x013f LATIN CAPITAL LETTER L WITH MIDDLE DOT +&L.@@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT +&l.@@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE +&L/@@ +0x0142 LATIN SMALL LETTER L WITH STROKE +&l/@@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE +&N'@@ +0x0144 LATIN SMALL LETTER N WITH ACUTE +&n'@@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA +&N,@@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA +&n,@@ +0x0147 LATIN CAPITAL LETTER N WITH CARON +&N<@@ +0x0148 LATIN SMALL LETTER N WITH CARON +&n<@@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +&'n@@ +0x014a LATIN CAPITAL LETTER ENG (Lappish) +&NG@@ +0x014b LATIN SMALL LETTER ENG (Lappish) +&ng@@ +0x014c LATIN CAPITAL LETTER O WITH MACRON +&O-@@ +0x014d LATIN SMALL LETTER O WITH MACRON +&o-@@ +0x014e LATIN CAPITAL LETTER O WITH BREVE +&O(@@ +0x014f LATIN SMALL LETTER O WITH BREVE +&o(@@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +&O"@@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +&o"@@ +0x0152 LATIN CAPITAL LIGATURE OE +&OE@@ +0x0153 LATIN SMALL LIGATURE OE +&oe@@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE +&R'@@ +0x0155 LATIN SMALL LETTER R WITH ACUTE +&r'@@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA +&R,@@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA +&r,@@ +0x0158 LATIN CAPITAL LETTER R WITH CARON +&R<@@ +0x0159 LATIN SMALL LETTER R WITH CARON +&r<@@ +0x015a LATIN CAPITAL LETTER S WITH ACUTE +&S'@@ +0x015b LATIN SMALL LETTER S WITH ACUTE +&s'@@ +0x015c LATIN CAPITAL LETTER S WITH CIRCUMFLEX +&S>@@ +0x015d LATIN SMALL LETTER S WITH CIRCUMFLEX +&s>@@ +0x015e LATIN CAPITAL LETTER S WITH CEDILLA +&S,@@ +0x015f LATIN SMALL LETTER S WITH CEDILLA +&s,@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON +&S<@@ +0x0161 LATIN SMALL LETTER S WITH CARON +&s<@@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA +&T,@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA +&t,@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON +&T<@@ +0x0165 LATIN SMALL LETTER T WITH CARON +&t<@@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE +&T/@@ +0x0167 LATIN SMALL LETTER T WITH STROKE +&t/@@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE +&U?@@ +0x0169 LATIN SMALL LETTER U WITH TILDE +&u?@@ +0x016a LATIN CAPITAL LETTER U WITH MACRON +&U-@@ +0x016b LATIN SMALL LETTER U WITH MACRON +&u-@@ +0x016c LATIN CAPITAL LETTER U WITH BREVE +&U(@@ +0x016d LATIN SMALL LETTER U WITH BREVE +&u(@@ +0x016e LATIN CAPITAL LETTER U WITH RING ABOVE +&U0@@ +0x016f LATIN SMALL LETTER U WITH RING ABOVE +&u0@@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +&U"@@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +&u"@@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK +&U;@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK +&u;@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +&W>@@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX +&w>@@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +&Y>@@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX +&y>@@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +&Y:@@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE +&Z'@@ +0x017a LATIN SMALL LETTER Z WITH ACUTE +&z'@@ +0x017b LATIN CAPITAL LETTER Z WITH DOT ABOVE +&Z.@@ +0x017c LATIN SMALL LETTER Z WITH DOT ABOVE +&z.@@ +0x017d LATIN CAPITAL LETTER Z WITH CARON +&Z<@@ +0x017e LATIN SMALL LETTER Z WITH CARON +&z<@@ +0x01a0 LATIN CAPITAL LETTER O WITH HORN +&O9@@ +0x01a1 LATIN SMALL LETTER O WITH HORN +&o9@@ +0x01a2 LATIN CAPITAL LETTER OI +&OI@@ +0x01a3 LATIN SMALL LETTER OI +&oi@@ +0x01a6 LATIN LETTER YR +&yr@@ +0x01af LATIN CAPITAL LETTER U WITH HORN +&U9@@ +0x01b0 LATIN SMALL LETTER U WITH HORN +&u9@@ +0x01b5 LATIN CAPITAL LETTER Z WITH STROKE +&Z/@@ +0x01b6 LATIN SMALL LETTER Z WITH STROKE +&z/@@ +0x01b7 LATIN CAPITAL LETTER EZH +&ED@@ +0x01cd LATIN CAPITAL LETTER A WITH CARON +&A<@@ +0x01ce LATIN SMALL LETTER A WITH CARON +&a<@@ +0x01cf LATIN CAPITAL LETTER I WITH CARON +&I<@@ +0x01d0 LATIN SMALL LETTER I WITH CARON +&i<@@ +0x01d1 LATIN CAPITAL LETTER O WITH CARON +&O<@@ +0x01d2 LATIN SMALL LETTER O WITH CARON +&o<@@ +0x01d3 LATIN CAPITAL LETTER U WITH CARON +&U<@@ +0x01d4 LATIN SMALL LETTER U WITH CARON +&u<@@ +0x01d5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +&_U:-_@@ +0x01d6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +&_u:-_@@ +0x01d7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +&_U:'_@@ +0x01d8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +&_u:'_@@ +0x01d9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +&_U:<_@@ +0x01da LATIN SMALL LETTER U WITH DIAERESIS AND CARON +&_u:<_@@ +0x01db LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +&_U:!_@@ +0x01dc LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +&_u:!_@@ +0x01de LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +&A1@@ +0x01df LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +&a1@@ +0x01e0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +&A7@@ +0x01e1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +&a7@@ +0x01e2 LATIN CAPITAL LETTER AE WITH MACRON +&A3@@ +0x01e3 LATIN SMALL LETTER AE WITH MACRON +&a3@@ +0x01e4 LATIN CAPITAL LETTER G WITH STROKE +&G/@@ +0x01e5 LATIN SMALL LETTER G WITH STROKE +&g/@@ +0x01e6 LATIN CAPITAL LETTER G WITH CARON +&G<@@ +0x01e7 LATIN SMALL LETTER G WITH CARON +&g<@@ +0x01e8 LATIN CAPITAL LETTER K WITH CARON +&K<@@ +0x01e9 LATIN SMALL LETTER K WITH CARON +&k<@@ +0x01ea LATIN CAPITAL LETTER O WITH OGONEK +&O;@@ +0x01eb LATIN SMALL LETTER O WITH OGONEK +&o;@@ +0x01ec LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +&O1@@ +0x01ed LATIN SMALL LETTER O WITH OGONEK AND MACRON +&o1@@ +0x01ee LATIN CAPITAL LETTER EZH WITH CARON +&EZ@@ +0x01ef LATIN SMALL LETTER EZH WITH CARON +&ez@@ +0x01f0 LATIN SMALL LETTER J WITH CARON +&j<@@ +0x01f4 LATIN CAPITAL LETTER G WITH ACUTE +&G'@@ +0x01f5 LATIN SMALL LETTER G WITH ACUTE +&g'@@ +0x01fa LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +&_AA'_@@ +0x01fb LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +&_aa'_@@ +0x01fc LATIN CAPITAL LETTER AE WITH ACUTE +&_AE'_@@ +0x01fd LATIN SMALL LETTER AE WITH ACUTE +&_ae'_@@ +0x01fe LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +&_O/'_@@ +0x01ff LATIN SMALL LETTER O WITH STROKE AND ACUTE +&_o/'_@@ +0x02bf MODIFIER LETTER LEFT HALF RING +&;S@@ +0x02c7 CARON +&'<@@ +0x02d8 BREVE +&'(@@ +0x02d9 DOT ABOVE +&'.@@ +0x02da RING ABOVE +&'0@@ +0x02db OGONEK +&';@@ +0x02dd DOUBLE ACUTE ACCENT +&'"@@ +0x0386 GREEK CAPITAL LETTER ALPHA WITH ACUTE +&A%@@ +0x0388 GREEK CAPITAL LETTER EPSILON WITH ACUTE +&E%@@ +0x0389 GREEK CAPITAL LETTER ETA WITH ACUTE +&Y%@@ +0x038a GREEK CAPITAL LETTER IOTA WITH ACUTE +&I%@@ +0x038c GREEK CAPITAL LETTER OMICRON WITH ACUTE +&O%@@ +0x038e GREEK CAPITAL LETTER UPSILON WITH ACUTE +&U%@@ +0x038f GREEK CAPITAL LETTER OMEGA WITH ACUTE +&W%@@ +0x0390 GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS +&i3@@ +0x0391 GREEK CAPITAL LETTER ALPHA +&A*@@ +0x0392 GREEK CAPITAL LETTER BETA +&B*@@ +0x0393 GREEK CAPITAL LETTER GAMMA +&G*@@ +0x0394 GREEK CAPITAL LETTER DELTA +&D*@@ +0x0395 GREEK CAPITAL LETTER EPSILON +&E*@@ +0x0396 GREEK CAPITAL LETTER ZETA +&Z*@@ +0x0397 GREEK CAPITAL LETTER ETA +&Y*@@ +0x0398 GREEK CAPITAL LETTER THETA +&H*@@ +0x0399 GREEK CAPITAL LETTER IOTA +&I*@@ +0x039a GREEK CAPITAL LETTER KAPPA +&K*@@ +0x039b GREEK CAPITAL LETTER LAMDA +&L*@@ +0x039c GREEK CAPITAL LETTER MU +&M*@@ +0x039d GREEK CAPITAL LETTER NU +&N*@@ +0x039e GREEK CAPITAL LETTER XI +&C*@@ +0x039f GREEK CAPITAL LETTER OMICRON +&O*@@ +0x03a0 GREEK CAPITAL LETTER PI +&P*@@ +0x03a1 GREEK CAPITAL LETTER RHO +&R*@@ +0x03a3 GREEK CAPITAL LETTER SIGMA +&S*@@ +0x03a4 GREEK CAPITAL LETTER TAU +&T*@@ +0x03a5 GREEK CAPITAL LETTER UPSILON +&U*@@ +0x03a6 GREEK CAPITAL LETTER PHI +&F*@@ +0x03a7 GREEK CAPITAL LETTER CHI +&X*@@ +0x03a8 GREEK CAPITAL LETTER PSI +&Q*@@ +0x03a9 GREEK CAPITAL LETTER OMEGA +&W*@@ +0x03aa GREEK CAPITAL LETTER IOTA WITH DIAERESIS +&J*@@ +0x03ab GREEK CAPITAL LETTER UPSILON WITH DIAERESIS +&V*@@ +0x03ac GREEK SMALL LETTER ALPHA WITH ACUTE +&a%@@ +0x03ad GREEK SMALL LETTER EPSILON WITH ACUTE +&e%@@ +0x03ae GREEK SMALL LETTER ETA WITH ACUTE +&y%@@ +0x03af GREEK SMALL LETTER IOTA WITH ACUTE +&i%@@ +0x03b0 GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS +&u3@@ +0x03b1 GREEK SMALL LETTER ALPHA +&a*@@ +0x03b2 GREEK SMALL LETTER BETA +&b*@@ +0x03b3 GREEK SMALL LETTER GAMMA +&g*@@ +0x03b4 GREEK SMALL LETTER DELTA +&d*@@ +0x03b5 GREEK SMALL LETTER EPSILON +&e*@@ +0x03b6 GREEK SMALL LETTER ZETA +&z*@@ +0x03b7 GREEK SMALL LETTER ETA +&y*@@ +0x03b8 GREEK SMALL LETTER THETA +&h*@@ +0x03b9 GREEK SMALL LETTER IOTA +&i*@@ +0x03ba GREEK SMALL LETTER KAPPA +&k*@@ +0x03bb GREEK SMALL LETTER LAMDA +&l*@@ +0x03bc GREEK SMALL LETTER MU +&m*@@ +0x03bd GREEK SMALL LETTER NU +&n*@@ +0x03be GREEK SMALL LETTER XI +&c*@@ +0x03bf GREEK SMALL LETTER OMICRON +&o*@@ +0x03c0 GREEK SMALL LETTER PI +&p*@@ +0x03c1 GREEK SMALL LETTER RHO +&r*@@ +0x03c2 GREEK SMALL LETTER FINAL SIGMA +&*s@@ +0x03c3 GREEK SMALL LETTER SIGMA +&s*@@ +0x03c4 GREEK SMALL LETTER TAU +&t*@@ +0x03c5 GREEK SMALL LETTER UPSILON +&u*@@ +0x03c6 GREEK SMALL LETTER PHI +&f*@@ +0x03c7 GREEK SMALL LETTER CHI +&x*@@ +0x03c8 GREEK SMALL LETTER PSI +&q*@@ +0x03c9 GREEK SMALL LETTER OMEGA +&w*@@ +0x03ca GREEK SMALL LETTER IOTA WITH DIAERESIS +&j*@@ +0x03cb GREEK SMALL LETTER UPSILON WITH DIAERESIS +&v*@@ +0x03cc GREEK SMALL LETTER OMICRON WITH ACUTE +&o%@@ +0x03cd GREEK SMALL LETTER UPSILON WITH ACUTE +&u%@@ +0x03ce GREEK SMALL LETTER OMEGA WITH ACUTE +&w%@@ +0x03d8 GREEK NUMERAL SIGN +&'G@@ +0x03d9 GREEK LOWER NUMERAL SIGN +&,G@@ +0x03da GREEK CAPITAL LETTER STIGMA +&T3@@ +0x03db GREEK SMALL LETTER STIGMA +&t3@@ +0x03dc GREEK CAPITAL LETTER DIGAMMA +&M3@@ +0x03dd GREEK SMALL LETTER DIGAMMA +&m3@@ +0x03de GREEK CAPITAL LETTER KOPPA +&K3@@ +0x03df GREEK SMALL LETTER KOPPA +&k3@@ +0x03e0 GREEK CAPITAL LETTER SAMPI +&P3@@ +0x03e1 GREEK SMALL LETTER SAMPI +&p3@@ +0x03f4 ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika) +&'%@@ +0x03f5 GREEK IOTA BELOW +&j3@@ +0x0401 CYRILLIC CAPITAL LETTER IO +&IO@@ +0x0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian) +&D%@@ +0x0403 CYRILLIC CAPITAL LETTER GJE (Macedonian) +&G%@@ +0x0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE +&IE@@ +0x0405 CYRILLIC CAPITAL LETTER DZE (Macedonian) +&DS@@ +0x0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +&II@@ +0x0407 CYRILLIC CAPITAL LETTER YI (Ukrainian) +&YI@@ +0x0408 CYRILLIC CAPITAL LETTER JE +&J%@@ +0x0409 CYRILLIC CAPITAL LETTER LJE +&LJ@@ +0x040a CYRILLIC CAPITAL LETTER NJE +&NJ@@ +0x040b CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) +&Ts@@ +0x040c CYRILLIC CAPITAL LETTER KJE (Macedonian) +&KJ@@ +0x040e CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) +&V%@@ +0x040f CYRILLIC CAPITAL LETTER DZHE +&DZ@@ +0x0410 CYRILLIC CAPITAL LETTER A +&A=@@ +0x0411 CYRILLIC CAPITAL LETTER BE +&B=@@ +0x0412 CYRILLIC CAPITAL LETTER VE +&V=@@ +0x0413 CYRILLIC CAPITAL LETTER GHE +&G=@@ +0x0414 CYRILLIC CAPITAL LETTER DE +&D=@@ +0x0415 CYRILLIC CAPITAL LETTER IE +&E=@@ +0x0416 CYRILLIC CAPITAL LETTER ZHE +&Z%@@ +0x0417 CYRILLIC CAPITAL LETTER ZE +&Z=@@ +0x0418 CYRILLIC CAPITAL LETTER I +&I=@@ +0x0419 CYRILLIC CAPITAL LETTER SHORT I +&J=@@ +0x041a CYRILLIC CAPITAL LETTER KA +&K=@@ +0x041b CYRILLIC CAPITAL LETTER EL +&L=@@ +0x041c CYRILLIC CAPITAL LETTER EM +&M=@@ +0x041d CYRILLIC CAPITAL LETTER EN +&N=@@ +0x041e CYRILLIC CAPITAL LETTER O +&O=@@ +0x041f CYRILLIC CAPITAL LETTER PE +&P=@@ +0x0420 CYRILLIC CAPITAL LETTER ER +&R=@@ +0x0421 CYRILLIC CAPITAL LETTER ES +&S=@@ +0x0422 CYRILLIC CAPITAL LETTER TE +&T=@@ +0x0423 CYRILLIC CAPITAL LETTER U +&U=@@ +0x0424 CYRILLIC CAPITAL LETTER EF +&F=@@ +0x0425 CYRILLIC CAPITAL LETTER HA +&H=@@ +0x0426 CYRILLIC CAPITAL LETTER TSE +&C=@@ +0x0427 CYRILLIC CAPITAL LETTER CHE +&C%@@ +0x0428 CYRILLIC CAPITAL LETTER SHA +&S%@@ +0x0429 CYRILLIC CAPITAL LETTER SHCHA +&Sc@@ +0x042a CYRILLIC CAPITAL LETTER HARD SIGN +&="@@ +0x042b CYRILLIC CAPITAL LETTER YERU +&Y=@@ +0x042c CYRILLIC CAPITAL LETTER SOFT SIGN +&%"@@ +0x042d CYRILLIC CAPITAL LETTER E +&JE@@ +0x042e CYRILLIC CAPITAL LETTER YU +&JU@@ +0x042f CYRILLIC CAPITAL LETTER YA +&JA@@ +0x0430 CYRILLIC SMALL LETTER A +&a=@@ +0x0431 CYRILLIC SMALL LETTER BE +&b=@@ +0x0432 CYRILLIC SMALL LETTER VE +&v=@@ +0x0433 CYRILLIC SMALL LETTER GHE +&g=@@ +0x0434 CYRILLIC SMALL LETTER DE +&d=@@ +0x0435 CYRILLIC SMALL LETTER IE +&e=@@ +0x0436 CYRILLIC SMALL LETTER ZHE +&z%@@ +0x0437 CYRILLIC SMALL LETTER ZE +&z=@@ +0x0438 CYRILLIC SMALL LETTER I +&i=@@ +0x0439 CYRILLIC SMALL LETTER SHORT I +&j=@@ +0x043a CYRILLIC SMALL LETTER KA +&k=@@ +0x043b CYRILLIC SMALL LETTER EL +&l=@@ +0x043c CYRILLIC SMALL LETTER EM +&m=@@ +0x043d CYRILLIC SMALL LETTER EN +&n=@@ +0x043e CYRILLIC SMALL LETTER O +&o=@@ +0x043f CYRILLIC SMALL LETTER PE +&p=@@ +0x0440 CYRILLIC SMALL LETTER ER +&r=@@ +0x0441 CYRILLIC SMALL LETTER ES +&s=@@ +0x0442 CYRILLIC SMALL LETTER TE +&t=@@ +0x0443 CYRILLIC SMALL LETTER U +&u=@@ +0x0444 CYRILLIC SMALL LETTER EF +&f=@@ +0x0445 CYRILLIC SMALL LETTER HA +&h=@@ +0x0446 CYRILLIC SMALL LETTER TSE +&c=@@ +0x0447 CYRILLIC SMALL LETTER CHE +&c%@@ +0x0448 CYRILLIC SMALL LETTER SHA +&s%@@ +0x0449 CYRILLIC SMALL LETTER SHCHA +&sc@@ +0x044a CYRILLIC SMALL LETTER HARD SIGN +&='@@ +0x044b CYRILLIC SMALL LETTER YERU +&y=@@ +0x044c CYRILLIC SMALL LETTER SOFT SIGN +&%'@@ +0x044d CYRILLIC SMALL LETTER E +&je@@ +0x044e CYRILLIC SMALL LETTER YU +&ju@@ +0x044f CYRILLIC SMALL LETTER YA +&ja@@ +0x0451 CYRILLIC SMALL LETTER IO +&io@@ +0x0452 CYRILLIC SMALL LETTER DJE (Serbocroatian) +&d%@@ +0x0453 CYRILLIC SMALL LETTER GJE (Macedonian) +&g%@@ +0x0454 CYRILLIC SMALL LETTER UKRAINIAN IE +&ie@@ +0x0455 CYRILLIC SMALL LETTER DZE (Macedonian) +&ds@@ +0x0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +&ii@@ +0x0457 CYRILLIC SMALL LETTER YI (Ukrainian) +&yi@@ +0x0458 CYRILLIC SMALL LETTER JE +&j%@@ +0x0459 CYRILLIC SMALL LETTER LJE +&lj@@ +0x045a CYRILLIC SMALL LETTER NJE +&nj@@ +0x045b CYRILLIC SMALL LETTER TSHE (Serbocroatian) +&ts@@ +0x045c CYRILLIC SMALL LETTER KJE (Macedonian) +&kj@@ +0x045e CYRILLIC SMALL LETTER SHORT U (Byelorussian) +&v%@@ +0x045f CYRILLIC SMALL LETTER DZHE +&dz@@ +0x0462 CYRILLIC CAPITAL LETTER YAT +&Y3@@ +0x0463 CYRILLIC SMALL LETTER YAT +&y3@@ +0x046a CYRILLIC CAPITAL LETTER BIG YUS +&O3@@ +0x046b CYRILLIC SMALL LETTER BIG YUS +&o3@@ +0x0472 CYRILLIC CAPITAL LETTER FITA +&F3@@ +0x0473 CYRILLIC SMALL LETTER FITA +&f3@@ +0x0474 CYRILLIC CAPITAL LETTER IZHITSA +&V3@@ +0x0475 CYRILLIC SMALL LETTER IZHITSA +&v3@@ +0x0480 CYRILLIC CAPITAL LETTER KOPPA +&C3@@ +0x0481 CYRILLIC SMALL LETTER KOPPA +&c3@@ +0x0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +&G3@@ +0x0491 CYRILLIC SMALL LETTER GHE WITH UPTURN +&g3@@ +0x05d0 HEBREW LETTER ALEF +&A+@@ +0x05d1 HEBREW LETTER BET +&B+@@ +0x05d2 HEBREW LETTER GIMEL +&G+@@ +0x05d3 HEBREW LETTER DALET +&D+@@ +0x05d4 HEBREW LETTER HE +&H+@@ +0x05d5 HEBREW LETTER VAV +&W+@@ +0x05d6 HEBREW LETTER ZAYIN +&Z+@@ +0x05d7 HEBREW LETTER HET +&X+@@ +0x05d8 HEBREW LETTER TET +&Tj@@ +0x05d9 HEBREW LETTER YOD +&J+@@ +0x05da HEBREW LETTER FINAL KAF +&K%@@ +0x05db HEBREW LETTER KAF +&K+@@ +0x05dc HEBREW LETTER LAMED +&L+@@ +0x05dd HEBREW LETTER FINAL MEM +&M%@@ +0x05de HEBREW LETTER MEM +&M+@@ +0x05df HEBREW LETTER FINAL NUN +&N%@@ +0x05e0 HEBREW LETTER NUN +&N+@@ +0x05e1 HEBREW LETTER SAMEKH +&S+@@ +0x05e2 HEBREW LETTER AYIN +&E+@@ +0x05e3 HEBREW LETTER FINAL PE +&P%@@ +0x05e4 HEBREW LETTER PE +&P+@@ +0x05e5 HEBREW LETTER FINAL TSADI +&Zj@@ +0x05e6 HEBREW LETTER TSADI +&ZJ@@ +0x05e7 HEBREW LETTER QOF +&Q+@@ +0x05e8 HEBREW LETTER RESH +&R+@@ +0x05e9 HEBREW LETTER SHIN +&Sh@@ +0x05ea HEBREW LETTER TAV +&T+@@ +0x060c ARABIC COMMA +&,+@@ +0x061b ARABIC SEMICOLON +&;+@@ +0x061f ARABIC QUESTION MARK +&?+@@ +0x0621 ARABIC LETTER HAMZA +&H'@@ +0x0622 ARABIC LETTER ALEF WITH MADDA ABOVE +&aM@@ +0x0623 ARABIC LETTER ALEF WITH HAMZA ABOVE +&aH@@ +0x0624 ARABIC LETTER WAW WITH HAMZA ABOVE +&wH@@ +0x0625 ARABIC LETTER ALEF WITH HAMZA BELOW +&ah@@ +0x0626 ARABIC LETTER YEH WITH HAMZA ABOVE +&yH@@ +0x0627 ARABIC LETTER ALEF +&a+@@ +0x0628 ARABIC LETTER BEH +&b+@@ +0x0629 ARABIC LETTER TEH MARBUTA +&tm@@ +0x062a ARABIC LETTER TEH +&t+@@ +0x062b ARABIC LETTER THEH +&tk@@ +0x062c ARABIC LETTER JEEM +&g+@@ +0x062d ARABIC LETTER HAH +&hk@@ +0x062e ARABIC LETTER KHAH +&x+@@ +0x062f ARABIC LETTER DAL +&d+@@ +0x0630 ARABIC LETTER THAL +&dk@@ +0x0631 ARABIC LETTER REH +&r+@@ +0x0632 ARABIC LETTER ZAIN +&z+@@ +0x0633 ARABIC LETTER SEEN +&s+@@ +0x0634 ARABIC LETTER SHEEN +&sn@@ +0x0635 ARABIC LETTER SAD +&c+@@ +0x0636 ARABIC LETTER DAD +&dd@@ +0x0637 ARABIC LETTER TAH +&tj@@ +0x0638 ARABIC LETTER ZAH +&zH@@ +0x0639 ARABIC LETTER AIN +&e+@@ +0x063a ARABIC LETTER GHAIN +&i+@@ +0x0640 ARABIC TATWEEL +&++@@ +0x0641 ARABIC LETTER FEH +&f+@@ +0x0642 ARABIC LETTER QAF +&q+@@ +0x0643 ARABIC LETTER KAF +&k+@@ +0x0644 ARABIC LETTER LAM +&l+@@ +0x0645 ARABIC LETTER MEEM +&m+@@ +0x0646 ARABIC LETTER NOON +&n+@@ +0x0647 ARABIC LETTER HEH +&h+@@ +0x0648 ARABIC LETTER WAW +&w+@@ +0x0649 ARABIC LETTER ALEF MAKSURA +&j+@@ +0x064a ARABIC LETTER YEH +&y+@@ +0x064b ARABIC FATHATAN +&:+@@ +0x064c ARABIC DAMMATAN +&"+@@ +0x064d ARABIC KASRATAN +&=+@@ +0x064e ARABIC FATHA +&/+@@ +0x064f ARABIC DAMMA +&'+@@ +0x0650 ARABIC KASRA +&1+@@ +0x0651 ARABIC SHADDA +&3+@@ +0x0652 ARABIC SUKUN +&0+@@ +0x0670 SUPERSCRIPT ARABIC LETTER ALEF +&aS@@ +0x067e ARABIC LETTER PEH +&p+@@ +0x06a4 ARABIC LETTER VEH +&v+@@ +0x06af ARABIC LETTER GAF +&gf@@ +0x06f0 EASTERN ARABIC-INDIC DIGIT ZERO +&0a@@ +0x06f1 EASTERN ARABIC-INDIC DIGIT ONE +&1a@@ +0x06f2 EASTERN ARABIC-INDIC DIGIT TWO +&2a@@ +0x06f3 EASTERN ARABIC-INDIC DIGIT THREE +&3a@@ +0x06f4 EASTERN ARABIC-INDIC DIGIT FOUR +&4a@@ +0x06f5 EASTERN ARABIC-INDIC DIGIT FIVE +&5a@@ +0x06f6 EASTERN ARABIC-INDIC DIGIT SIX +&6a@@ +0x06f7 EASTERN ARABIC-INDIC DIGIT SEVEN +&7a@@ +0x06f8 EASTERN ARABIC-INDIC DIGIT EIGHT +&8a@@ +0x06f9 EASTERN ARABIC-INDIC DIGIT NINE +&9a@@ +0x1e00 LATIN CAPITAL LETTER A WITH RING BELOW +&_A-0_@@ +0x1e01 LATIN SMALL LETTER A WITH RING BELOW +&_a-0_@@ +0x1e02 LATIN CAPITAL LETTER B WITH DOT ABOVE +&B.@@ +0x1e03 LATIN SMALL LETTER B WITH DOT ABOVE +&b.@@ +0x1e04 LATIN CAPITAL LETTER B WITH DOT BELOW +&_B-._@@ +0x1e05 LATIN SMALL LETTER B WITH DOT BELOW +&_b-._@@ +0x1e06 LATIN CAPITAL LETTER B WITH LINE BELOW +&B_@@ +0x1e07 LATIN SMALL LETTER B WITH LINE BELOW +&b_@@ +0x1e08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +&_C,'_@@ +0x1e09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +&_c,'_@@ +0x1e0a LATIN CAPITAL LETTER D WITH DOT ABOVE +&D.@@ +0x1e0b LATIN SMALL LETTER D WITH DOT ABOVE +&d.@@ +0x1e0c LATIN CAPITAL LETTER D WITH DOT BELOW +&_D-._@@ +0x1e0d LATIN SMALL LETTER D WITH DOT BELOW +&_d-._@@ +0x1e0e LATIN CAPITAL LETTER D WITH LINE BELOW +&D_@@ +0x1e0f LATIN SMALL LETTER D WITH LINE BELOW +&d_@@ +0x1e10 LATIN CAPITAL LETTER D WITH CEDILLA +&D,@@ +0x1e11 LATIN SMALL LETTER D WITH CEDILLA +&d,@@ +0x1e12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +&_D->_@@ +0x1e13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +&_d->_@@ +0x1e14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +&_E-!_@@ +0x1e15 LATIN SMALL LETTER E WITH MACRON AND GRAVE +&_e-!_@@ +0x1e16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +&_E-'_@@ +0x1e17 LATIN SMALL LETTER E WITH MACRON AND ACUTE +&_e-'_@@ +0x1e18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +&_E->_@@ +0x1e19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +&_e->_@@ +0x1e1a LATIN CAPITAL LETTER E WITH TILDE BELOW +&_E-?_@@ +0x1e1b LATIN SMALL LETTER E WITH TILDE BELOW +&_e-?_@@ +0x1e1c LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +&_E,(_@@ +0x1e1d LATIN SMALL LETTER E WITH CEDILLA AND BREVE +&_e,(_@@ +0x1e1e LATIN CAPITAL LETTER F WITH DOT ABOVE +&F.@@ +0x1e1f LATIN SMALL LETTER F WITH DOT ABOVE +&f.@@ +0x1e20 LATIN CAPITAL LETTER G WITH MACRON +&G-@@ +0x1e21 LATIN SMALL LETTER G WITH MACRON +&g-@@ +0x1e22 LATIN CAPITAL LETTER H WITH DOT ABOVE +&H.@@ +0x1e23 LATIN SMALL LETTER H WITH DOT ABOVE +&h.@@ +0x1e24 LATIN CAPITAL LETTER H WITH DOT BELOW +&_H-._@@ +0x1e25 LATIN SMALL LETTER H WITH DOT BELOW +&_h-._@@ +0x1e26 LATIN CAPITAL LETTER H WITH DIAERESIS +&H:@@ +0x1e27 LATIN SMALL LETTER H WITH DIAERESIS +&h:@@ +0x1e28 LATIN CAPITAL LETTER H WITH CEDILLA +&H,@@ +0x1e29 LATIN SMALL LETTER H WITH CEDILLA +&h,@@ +0x1e2a LATIN CAPITAL LETTER H WITH BREVE BELOW +&_H-(_@@ +0x1e2b LATIN SMALL LETTER H WITH BREVE BELOW +&_h-(_@@ +0x1e2c LATIN CAPITAL LETTER I WITH TILDE BELOW +&_I-?_@@ +0x1e2d LATIN SMALL LETTER I WITH TILDE BELOW +&_i-?_@@ +0x1e2e LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +&_I:'_@@ +0x1e2f LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +&_i:'_@@ +0x1e30 LATIN CAPITAL LETTER K WITH ACUTE +&K'@@ +0x1e31 LATIN SMALL LETTER K WITH ACUTE +&k'@@ +0x1e32 LATIN CAPITAL LETTER K WITH DOT BELOW +&_K-._@@ +0x1e33 LATIN SMALL LETTER K WITH DOT BELOW +&_k-._@@ +0x1e34 LATIN CAPITAL LETTER K WITH LINE BELOW +&K_@@ +0x1e35 LATIN SMALL LETTER K WITH LINE BELOW +&k_@@ +0x1e36 LATIN CAPITAL LETTER L WITH DOT BELOW +&_L-._@@ +0x1e37 LATIN SMALL LETTER L WITH DOT BELOW +&_l-._@@ +0x1e38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +&_L--._@@ +0x1e39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +&_l--._@@ +0x1e3a LATIN CAPITAL LETTER L WITH LINE BELOW +&L_@@ +0x1e3b LATIN SMALL LETTER L WITH LINE BELOW +&l_@@ +0x1e3c LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +&_L->_@@ +0x1e3d LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +&_l->_@@ +0x1e3e LATIN CAPITAL LETTER M WITH ACUTE +&M'@@ +0x1e3f LATIN SMALL LETTER M WITH ACUTE +&m'@@ +0x1e40 LATIN CAPITAL LETTER M WITH DOT ABOVE +&M.@@ +0x1e41 LATIN SMALL LETTER M WITH DOT ABOVE +&m.@@ +0x1e42 LATIN CAPITAL LETTER M WITH DOT BELOW +&_M-._@@ +0x1e43 LATIN SMALL LETTER M WITH DOT BELOW +&_m-._@@ +0x1e44 LATIN CAPITAL LETTER N WITH DOT ABOVE +&N.@@ +0x1e45 LATIN SMALL LETTER N WITH DOT ABOVE +&n.@@ +0x1e46 LATIN CAPITAL LETTER N WITH DOT BELOW +&_N-._@@ +0x1e47 LATIN SMALL LETTER N WITH DOT BELOW +&_n-._@@ +0x1e48 LATIN CAPITAL LETTER N WITH LINE BELOW +&N_@@ +0x1e49 LATIN SMALL LETTER N WITH LINE BELOW +&n_@@ +0x1e4a LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +&_N->_@@ +0x1e4b LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +&_N->_@@ +0x1e4c LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +&_O?'_@@ +0x1e4d LATIN SMALL LETTER O WITH TILDE AND ACUTE +&_o?'_@@ +0x1e4e LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +&_O?:_@@ +0x1e4f LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +&_o?:_@@ +0x1e50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +&_O-!_@@ +0x1e51 LATIN SMALL LETTER O WITH MACRON AND GRAVE +&_o-!_@@ +0x1e52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +&_O-'_@@ +0x1e53 LATIN SMALL LETTER O WITH MACRON AND ACUTE +&_o-'_@@ +0x1e54 LATIN CAPITAL LETTER P WITH ACUTE +&P'@@ +0x1e55 LATIN SMALL LETTER P WITH ACUTE +&p'@@ +0x1e56 LATIN CAPITAL LETTER P WITH DOT ABOVE +&P.@@ +0x1e57 LATIN SMALL LETTER P WITH DOT ABOVE +&p.@@ +0x1e58 LATIN CAPITAL LETTER R WITH DOT ABOVE +&R.@@ +0x1e59 LATIN SMALL LETTER R WITH DOT ABOVE +&r.@@ +0x1e5a LATIN CAPITAL LETTER R WITH DOT BELOW +&_R-._@@ +0x1e5b LATIN SMALL LETTER R WITH DOT BELOW +&_r-._@@ +0x1e5c LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +&_R--._@@ +0x1e5d LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +&_r--._@@ +0x1e5e LATIN CAPITAL LETTER R WITH LINE BELOW +&R_@@ +0x1e5f LATIN SMALL LETTER R WITH LINE BELOW +&r_@@ +0x1e60 LATIN CAPITAL LETTER S WITH DOT ABOVE +&S.@@ +0x1e61 LATIN SMALL LETTER S WITH DOT ABOVE +&s.@@ +0x1e62 LATIN CAPITAL LETTER S WITH DOT BELOW +&_S-._@@ +0x1e63 LATIN SMALL LETTER S WITH DOT BELOW +&_s-._@@ +0x1e64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +&_S'._@@ +0x1e65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +&_s'._@@ +0x1e66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +&_S<._@@ +0x1e67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +&_s<._@@ +0x1e68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +&_S.-._@@ +0x1e69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +&_S.-._@@ +0x1e6a LATIN CAPITAL LETTER T WITH DOT ABOVE +&T.@@ +0x1e6b LATIN SMALL LETTER T WITH DOT ABOVE +&t.@@ +0x1e6c LATIN CAPITAL LETTER T WITH DOT BELOW +&_T-._@@ +0x1e6d LATIN SMALL LETTER T WITH DOT BELOW +&_t-._@@ +0x1e6e LATIN CAPITAL LETTER T WITH LINE BELOW +&T_@@ +0x1e6f LATIN SMALL LETTER T WITH LINE BELOW +&t_@@ +0x1e70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +&_T->_@@ +0x1e71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +&_t->_@@ +0x1e72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +&_U--:_@@ +0x1e73 LATIN SMALL LETTER U WITH DIAERESIS BELOW +&_u--:_@@ +0x1e74 LATIN CAPITAL LETTER U WITH TILDE BELOW +&_U-?_@@ +0x1e75 LATIN SMALL LETTER U WITH TILDE BELOW +&_u-?_@@ +0x1e76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +&_U->_@@ +0x1e77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +&_u->_@@ +0x1e78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +&_U?'_@@ +0x1e79 LATIN SMALL LETTER U WITH TILDE AND ACUTE +&_u?'_@@ +0x1e7a LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +&_U-:_@@ +0x1e7b LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +&_u-:_@@ +0x1e7c LATIN CAPITAL LETTER V WITH TILDE +&V?@@ +0x1e7d LATIN SMALL LETTER V WITH TILDE +&v?@@ +0x1e7e LATIN CAPITAL LETTER V WITH DOT BELOW +&_V-._@@ +0x1e7f LATIN SMALL LETTER V WITH DOT BELOW +&_v-._@@ +0x1e80 LATIN CAPITAL LETTER W WITH GRAVE +&W!@@ +0x1e81 LATIN SMALL LETTER W WITH GRAVE +&w!@@ +0x1e82 LATIN CAPITAL LETTER W WITH ACUTE +&W'@@ +0x1e83 LATIN SMALL LETTER W WITH ACUTE +&w'@@ +0x1e84 LATIN CAPITAL LETTER W WITH DIAERESIS +&W:@@ +0x1e85 LATIN SMALL LETTER W WITH DIAERESIS +&w:@@ +0x1e86 LATIN CAPITAL LETTER W WITH DOT ABOVE +&W.@@ +0x1e87 LATIN SMALL LETTER W WITH DOT ABOVE +&w.@@ +0x1e88 LATIN CAPITAL LETTER W WITH DOT BELOW +&_W-._@@ +0x1e89 LATIN SMALL LETTER W WITH DOT BELOW +&_w-._@@ +0x1e8a LATIN CAPITAL LETTER X WITH DOT ABOVE +&X.@@ +0x1e8b LATIN SMALL LETTER X WITH DOT ABOVE +&x.@@ +0x1e8c LATIN CAPITAL LETTER X WITH DIAERESIS +&X:@@ +0x1e8d LATIN SMALL LETTER X WITH DIAERESIS +&x:@@ +0x1e8e LATIN CAPITAL LETTER Y WITH DOT ABOVE +&Y.@@ +0x1e8f LATIN SMALL LETTER Y WITH DOT ABOVE +&y.@@ +0x1e90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +&Z>@@ +0x1e91 LATIN SMALL LETTER Z WITH CIRCUMFLEX +&z>@@ +0x1e92 LATIN CAPITAL LETTER Z WITH DOT BELOW +&_Z-._@@ +0x1e93 LATIN SMALL LETTER Z WITH DOT BELOW +&_z-._@@ +0x1e94 LATIN CAPITAL LETTER Z WITH LINE BELOW +&Z_@@ +0x1e95 LATIN SMALL LETTER Z WITH LINE BELOW +&z_@@ +0x1e96 LATIN SMALL LETTER H WITH LINE BELOW +&h_@@ +0x1e97 LATIN SMALL LETTER T WITH DIAERESIS +&t:@@ +0x1e98 LATIN SMALL LETTER W WITH RING ABOVE +&w0@@ +0x1e99 LATIN SMALL LETTER Y WITH RING ABOVE +&y0@@ +0x1ea0 LATIN CAPITAL LETTER A WITH DOT BELOW +&_A-._@@ +0x1ea1 LATIN SMALL LETTER A WITH DOT BELOW +&_a-._@@ +0x1ea2 LATIN CAPITAL LETTER A WITH HOOK ABOVE +&A2@@ +0x1ea3 LATIN SMALL LETTER A WITH HOOK ABOVE +&a2@@ +0x1ea4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +&_A>'_@@ +0x1ea5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +&_a>'_@@ +0x1ea6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +&_A>!_@@ +0x1ea7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +&_a>!_@@ +0x1ea8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +&_A>2_@@ +0x1ea9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +&_a>2_@@ +0x1eaa LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +&_A>?_@@ +0x1eab LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +&_a>?_@@ +0x1eac LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +&_A>-._@@ +0x1ead LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +&_a>-._@@ +0x1eae LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +&_A('_@@ +0x1eaf LATIN SMALL LETTER A WITH BREVE AND ACUTE +&_a('_@@ +0x1eb0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +&_A(!_@@ +0x1eb1 LATIN SMALL LETTER A WITH BREVE AND GRAVE +&_a(!_@@ +0x1eb2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +&_A(2_@@ +0x1eb3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +&_a(2_@@ +0x1eb4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE +&_A(?_@@ +0x1eb5 LATIN SMALL LETTER A WITH BREVE AND TILDE +&_a(?_@@ +0x1eb6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +&_A(-._@@ +0x1eb7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +&_a(-._@@ +0x1eb8 LATIN CAPITAL LETTER E WITH DOT BELOW +&_E-._@@ +0x1eb9 LATIN SMALL LETTER E WITH DOT BELOW +&_e-._@@ +0x1eba LATIN CAPITAL LETTER E WITH HOOK ABOVE +&E2@@ +0x1ebb LATIN SMALL LETTER E WITH HOOK ABOVE +&e2@@ +0x1ebc LATIN CAPITAL LETTER E WITH TILDE +&E?@@ +0x1ebd LATIN SMALL LETTER E WITH TILDE +&e?@@ +0x1ebe LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +&_E>'_@@ +0x1ebf LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +&_e>'_@@ +0x1ec0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +&_E>!_@@ +0x1ec1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +&_e>!_@@ +0x1ec2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +&_E>2_@@ +0x1ec3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +&_e>2_@@ +0x1ec4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +&_E>?_@@ +0x1ec5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +&_e>?_@@ +0x1ec6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +&_E>-._@@ +0x1ec7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +&_e>-._@@ +0x1ec8 LATIN CAPITAL LETTER I WITH HOOK ABOVE +&I2@@ +0x1ec9 LATIN SMALL LETTER I WITH HOOK ABOVE +&i2@@ +0x1eca LATIN CAPITAL LETTER I WITH DOT BELOW +&_I-._@@ +0x1ecb LATIN SMALL LETTER I WITH DOT BELOW +&_i-._@@ +0x1ecc LATIN CAPITAL LETTER O WITH DOT BELOW +&_O-._@@ +0x1ecd LATIN SMALL LETTER O WITH DOT BELOW +&_o-._@@ +0x1ece LATIN CAPITAL LETTER O WITH HOOK ABOVE +&O2@@ +0x1ecf LATIN SMALL LETTER O WITH HOOK ABOVE +&o2@@ +0x1ed0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +&_O>'_@@ +0x1ed1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +&_o>'_@@ +0x1ed2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +&_O>!_@@ +0x1ed3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +&_o>!_@@ +0x1ed4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +&_O>2_@@ +0x1ed5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +&_o>2_@@ +0x1ed6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +&_O>?_@@ +0x1ed7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +&_o>?_@@ +0x1ed8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +&_O>-._@@ +0x1ed9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +&_o>-._@@ +0x1eda LATIN CAPITAL LETTER O WITH HORN AND ACUTE +&_O9'_@@ +0x1edb LATIN SMALL LETTER O WITH HORN AND ACUTE +&_o9'_@@ +0x1edc LATIN CAPITAL LETTER O WITH HORN AND GRAVE +&_O9!_@@ +0x1edd LATIN SMALL LETTER O WITH HORN AND GRAVE +&_o9!_@@ +0x1ede LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +&_O92_@@ +0x1edf LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +&_o92_@@ +0x1ee0 LATIN CAPITAL LETTER O WITH HORN AND TILDE +&_O9?_@@ +0x1ee1 LATIN SMALL LETTER O WITH HORN AND TILDE +&_o9?_@@ +0x1ee2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +&_O9-._@@ +0x1ee3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW +&_o9-._@@ +0x1ee4 LATIN CAPITAL LETTER U WITH DOT BELOW +&_U-._@@ +0x1ee5 LATIN SMALL LETTER U WITH DOT BELOW +&_u-._@@ +0x1ee6 LATIN CAPITAL LETTER U WITH HOOK ABOVE +&U2@@ +0x1ee7 LATIN SMALL LETTER U WITH HOOK ABOVE +&u2@@ +0x1ee8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE +&_U9'_@@ +0x1ee9 LATIN SMALL LETTER U WITH HORN AND ACUTE +&_u9'_@@ +0x1eea LATIN CAPITAL LETTER U WITH HORN AND GRAVE +&_U9!_@@ +0x1eeb LATIN SMALL LETTER U WITH HORN AND GRAVE +&_u9!_@@ +0x1eec LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +&_U92_@@ +0x1eed LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +&_u92_@@ +0x1eee LATIN CAPITAL LETTER U WITH HORN AND TILDE +&_U9?_@@ +0x1eef LATIN SMALL LETTER U WITH HORN AND TILDE +&_u9?_@@ +0x1ef0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +&_U9-._@@ +0x1ef1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW +&_u9-._@@ +0x1ef2 LATIN CAPITAL LETTER Y WITH GRAVE +&Y!@@ +0x1ef3 LATIN SMALL LETTER Y WITH GRAVE +&y!@@ +0x1ef4 LATIN CAPITAL LETTER Y WITH DOT BELOW +&_Y-._@@ +0x1ef5 LATIN SMALL LETTER Y WITH DOT BELOW +&_y-._@@ +0x1ef6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +&Y2@@ +0x1ef7 LATIN SMALL LETTER Y WITH HOOK ABOVE +&y2@@ +0x1ef8 LATIN CAPITAL LETTER Y WITH TILDE +&Y?@@ +0x1ef9 LATIN SMALL LETTER Y WITH TILDE +&y?@@ +0x1f00 GREEK DASIA AND ACUTE ACCENT +&;'@@ +0x1f01 GREEK PSILI AND ACUTE ACCENT +&,'@@ +0x1f02 GREEK DASIA AND VARIA +&;!@@ +0x1f03 GREEK PSILI AND VARIA +&,!@@ +0x1f04 GREEK DASIA AND PERISPOMENI +&?;@@ +0x1f05 GREEK PSILI AND PERISPOMENI +&?,@@ +0x1f06 GREEK DIAERESIS AND VARIA +&!:@@ +0x1f07 GREEK DIAERESIS AND PERISPOMENI +&?:@@ +0x2002 EN SPACE +&1N@@ +0x2003 EM SPACE +&1M@@ +0x2004 THREE-PER-EM SPACE +&3M@@ +0x2005 FOUR-PER-EM SPACE +&4M@@ +0x2006 SIX-PER-EM SPACE +&6M@@ +0x2009 THIN SPACE +&1T@@ +0x200a HAIR SPACE +&1H@@ +0x2010 HYPHEN +&-1@@ +0x2013 EN DASH +&-N@@ +0x2014 EM DASH +&-M@@ +0x2015 HORIZONTAL BAR +&-3@@ +0x2016 DOUBLE VERTICAL LINE +&!2@@ +0x2017 DOUBLE LOW LINE +&=2@@ +0x2018 LEFT SINGLE QUOTATION MARK +&'6@@ +0x2019 RIGHT SINGLE QUOTATION MARK +&'9@@ +0x201a SINGLE LOW-9 QUOTATION MARK +&.9@@ +0x201b SINGLE HIGH-REVERSED-9 QUOTATION MARK +&9'@@ +0x201c LEFT DOUBLE QUOTATION MARK +&"6@@ +0x201d RIGHT DOUBLE QUOTATION MARK +&"9@@ +0x201e DOUBLE LOW-9 QUOTATION MARK +&:9@@ +0x201f DOUBLE HIGH-REVERSED-9 QUOTATION MARK +&9"@@ +0x2020 DAGGER +&/-@@ +0x2021 DOUBLE DAGGER +&/=@@ +0x2025 TWO DOT LEADER +&..@@ +0x2030 PER MILLE SIGN +&%0@@ +0x2032 PRIME +&1'@@ +0x2033 DOUBLE PRIME +&2'@@ +0x2034 TRIPLE PRIME +&3'@@ +0x2035 REVERSED PRIME +&1"@@ +0x2036 REVERSED DOUBLE PRIME +&2"@@ +0x2037 REVERSED TRIPLE PRIME +&3"@@ +0x2038 CARET +&Ca@@ +0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +&<1@@ +0x203a SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +&>1@@ +0x203b REFERENCE MARK +&:X@@ +0x203c DOUBLE EXCLAMATION MARK +&_!*2_@@ +0x203e OVERLINE +&'-@@ +0x2044 FRACTION SLASH +&/f@@ +0x2070 SUPERSCRIPT DIGIT ZERO +&0S@@ +0x2074 SUPERSCRIPT DIGIT FOUR +&4S@@ +0x2075 SUPERSCRIPT DIGIT FIVE +&5S@@ +0x2076 SUPERSCRIPT DIGIT SIX +&6S@@ +0x2077 SUPERSCRIPT DIGIT SEVEN +&7S@@ +0x2078 SUPERSCRIPT DIGIT EIGHT +&8S@@ +0x2079 SUPERSCRIPT DIGIT NINE +&9S@@ +0x207a SUPERSCRIPT PLUS SIGN +&+S@@ +0x207b SUPERSCRIPT MINUS +&-S@@ +0x207c SUPERSCRIPT EQUALS SIGN +&=S@@ +0x207d SUPERSCRIPT LEFT PARENTHESIS +&(S@@ +0x207e SUPERSCRIPT RIGHT PARENTHESIS +&)S@@ +0x207f SUPERSCRIPT LATIN SMALL LETTER N +&nS@@ +0x2080 SUBSCRIPT DIGIT ZERO +&0s@@ +0x2081 SUBSCRIPT DIGIT ONE +&1s@@ +0x2082 SUBSCRIPT DIGIT TWO +&2s@@ +0x2083 SUBSCRIPT DIGIT THREE +&3s@@ +0x2084 SUBSCRIPT DIGIT FOUR +&4s@@ +0x2085 SUBSCRIPT DIGIT FIVE +&5s@@ +0x2086 SUBSCRIPT DIGIT SIX +&6s@@ +0x2087 SUBSCRIPT DIGIT SEVEN +&7s@@ +0x2088 SUBSCRIPT DIGIT EIGHT +&8s@@ +0x2089 SUBSCRIPT DIGIT NINE +&9s@@ +0x208a SUBSCRIPT PLUS SIGN +&+s@@ +0x208b SUBSCRIPT MINUS +&-s@@ +0x208c SUBSCRIPT EQUALS SIGN +&=s@@ +0x208d SUBSCRIPT LEFT PARENTHESIS +&(s@@ +0x208e SUBSCRIPT RIGHT PARENTHESIS +&)s@@ +0x20a4 LIRA SIGN +&Li@@ +0x20a7 PESETA SIGN +&Pt@@ +0x20a9 WON SIGN +&W=@@ +0x2103 DEGREE CENTIGRADE +&oC@@ +0x2105 CARE OF +&co@@ +0x2109 DEGREE FAHRENHEIT +&oF@@ +0x2116 NUMERO SIGN +&N0@@ +0x2117 SOUND RECORDING COPYRIGHT +&PO@@ +0x211e PRESCRIPTION TAKE +&Rx@@ +0x2120 SERVICE MARK +&SM@@ +0x2122 TRADE MARK SIGN +&TM@@ +0x2126 OHM SIGN +&Om@@ +0x212b ANGSTROEM SIGN +&AO@@ +0x2153 VULGAR FRACTION ONE THIRD +&13@@ +0x2154 VULGAR FRACTION TWO THIRDS +&23@@ +0x2155 VULGAR FRACTION ONE FIFTH +&15@@ +0x2156 VULGAR FRACTION TWO FIFTHS +&25@@ +0x2157 VULGAR FRACTION THREE FIFTHS +&35@@ +0x2158 VULGAR FRACTION FOUR FIFTHS +&45@@ +0x2159 VULGAR FRACTION ONE SIXTH +&16@@ +0x215a VULGAR FRACTION FIVE SIXTHS +&56@@ +0x215b VULGAR FRACTION ONE EIGHTH +&18@@ +0x215c VULGAR FRACTION THREE EIGHTHS +&38@@ +0x215d VULGAR FRACTION FIVE EIGHTHS +&58@@ +0x215e VULGAR FRACTION SEVEN EIGHTHS +&78@@ +0x2160 ROMAN NUMERAL ONE +&1R@@ +0x2161 ROMAN NUMERAL TWO +&2R@@ +0x2162 ROMAN NUMERAL THREE +&3R@@ +0x2163 ROMAN NUMERAL FOUR +&4R@@ +0x2164 ROMAN NUMERAL FIVE +&5R@@ +0x2165 ROMAN NUMERAL SIX +&6R@@ +0x2166 ROMAN NUMERAL SEVEN +&7R@@ +0x2167 ROMAN NUMERAL EIGHT +&8R@@ +0x2168 ROMAN NUMERAL NINE +&9R@@ +0x2169 ROMAN NUMERAL TEN +&aR@@ +0x216a ROMAN NUMERAL ELEVEN +&bR@@ +0x216b ROMAN NUMERAL TWELVE +&cR@@ +0x216c ROMAN NUMERAL FIFTY +&_50R_@@ +0x216d ROMAN NUMERAL ONE HUNDRED +&_100R_@@ +0x216e ROMAN NUMERAL FIVE HUNDRED +&_500R_@@ +0x216f ROMAN NUMERAL ONE THOUSAND +&_1000R_@@ +0x2170 SMALL ROMAN NUMERAL ONE +&1r@@ +0x2171 SMALL ROMAN NUMERAL TWO +&2r@@ +0x2172 SMALL ROMAN NUMERAL THREE +&3r@@ +0x2173 SMALL ROMAN NUMERAL FOUR +&4r@@ +0x2174 SMALL ROMAN NUMERAL FIVE +&5r@@ +0x2175 SMALL ROMAN NUMERAL SIX +&6r@@ +0x2176 SMALL ROMAN NUMERAL SEVEN +&7r@@ +0x2177 SMALL ROMAN NUMERAL EIGHT +&8r@@ +0x2178 SMALL ROMAN NUMERAL NINE +&9r@@ +0x2179 SMALL ROMAN NUMERAL TEN +&ar@@ +0x217a SMALL ROMAN NUMERAL ELEVEN +&br@@ +0x217b SMALL ROMAN NUMERAL TWELVE +&cr@@ +0x217c SMALL ROMAN NUMERAL FIFTY +&_50r_@@ +0x217d SMALL ROMAN NUMERAL ONE HUNDRED +&_100r_@@ +0x217e SMALL ROMAN NUMERAL FIVE HUNDRED +&_500r_@@ +0x217f SMALL ROMAN NUMERAL ONE THOUSAND +&_1000r_@@ +0x2180 ROMAN NUMERAL ONE THOUSAND C D +&_1000RCD_@@ +0x2181 ROMAN NUMERAL FIVE THOUSAND +&_5000R_@@ +0x2182 ROMAN NUMERAL TEN THOUSAND +&_10000R_@@ +0x2190 LEFTWARDS ARROW +&<-@@ +0x2191 UPWARDS ARROW +&-!@@ +0x2192 RIGHTWARDS ARROW +&->@@ +0x2193 DOWNWARDS ARROW +&-v@@ +0x2194 LEFT RIGHT ARROW +&<>@@ +0x2195 UP DOWN ARROW +&UD@@ +0x2196 NORTH WEST ARROW +&__@@ +0x2198 SOUTH EAST ARROW +&_!!>_@@ +0x2199 SOUTH WEST ARROW +&_@@ +0x21d4 LEFT RIGHT DOUBLE ARROW +&==@@ +0x2200 FOR ALL +&FA@@ +0x2202 PARTIAL DIFFERENTIAL +&dP@@ +0x2203 THERE EXISTS +&TE@@ +0x2205 EMPTY SET +&/0@@ +0x2206 INCREMENT +&DE@@ +0x2207 NABLA +&NB@@ +0x2208 ELEMENT OF +&(-@@ +0x220b CONTAINS AS MEMBER +&-)@@ +0x220f N-ARY PRODUCT +&*P@@ +0x2211 N-ARY SUMMATION +&+Z@@ +0x2212 MINUS SIGN +&-2@@ +0x2213 MINUS-OR-PLUS SIGN +&-+@@ +0x2217 ASTERISK OPERATOR +&*-@@ +0x2218 RING OPERATOR +&Ob@@ +0x2219 BULLET OPERATOR +&Sb@@ +0x221a SQUARE ROOT +&RT@@ +0x221d PROPORTIONAL TO +&0(@@ +0x221e INFINITY +&00@@ +0x221f RIGHT ANGLE +&-L@@ +0x2220 ANGLE +&-V@@ +0x2225 PARALLEL TO +&PP@@ +0x2227 LOGICAL AND +&AN@@ +0x2228 LOGICAL OR +&OR@@ +0x2229 INTERSECTION +&(U@@ +0x222a UNION +&)U@@ +0x222b INTEGRAL +&In@@ +0x222c DOUBLE INTEGRAL +&DI@@ +0x222e CONTOUR INTEGRAL +&Io@@ +0x2234 THEREFORE +&.:@@ +0x2235 BECAUSE +&:.@@ +0x2236 RATIO +&:R@@ +0x2237 PROPORTION +&::@@ +0x223c TILDE OPERATOR +&?1@@ +0x223e INVERTED LAZY S +&CG@@ +0x2243 ASYMPTOTICALLY EQUAL TO +&?-@@ +0x2245 APPROXIMATELY EQUAL TO +&?=@@ +0x2248 ALMOST EQUAL TO +&?2@@ +0x224c ALL EQUAL TO +&=?@@ +0x2253 IMAGE OF OR APPROXIMATELY EQUAL TO +&HI@@ +0x2260 NOT EQUAL TO +&!=@@ +0x2261 IDENTICAL TO +&=3@@ +0x2264 LESS-THAN OR EQUAL TO +&=<@@ +0x2265 GREATER-THAN OR EQUAL TO +&>=@@ +0x226a MUCH LESS-THAN +&<*@@ +0x226b MUCH GREATER-THAN +&*>@@ +0x226e NOT LESS-THAN +&!<@@ +0x226f NOT GREATER-THAN +&!>@@ +0x2282 SUBSET OF +&(C@@ +0x2283 SUPERSET OF +&)C@@ +0x2286 SUBSET OF OR EQUAL TO +&(_@@ +0x2287 SUPERSET OF OR EQUAL TO +&)_@@ +0x2299 CIRCLED DOT OPERATOR +&0.@@ +0x229a CIRCLED RING OPERATOR +&02@@ +0x22a5 UP TACK +&-T@@ +0x22c5 DOT OPERATOR +&.P@@ +0x22ee VERTICAL ELLIPSIS +&:3@@ +0x22ef MIDLINE HORIZONTAL ELLIPSIS +&.3@@ +0x2302 HOUSE +&Eh@@ +0x2308 LEFT CEILING +&<7@@ +0x2309 RIGHT CEILING +&>7@@ +0x230a LEFT FLOOR +&7<@@ +0x230b RIGHT FLOOR +&7>@@ +0x2310 REVERSED NOT SIGN +&NI@@ +0x2312 ARC +&(A@@ +0x2315 TELEPHONE RECORDER +&TR@@ +0x2320 TOP HALF INTEGRAL +&Iu@@ +0x2321 BOTTOM HALF INTEGRAL +&Il@@ +0x2329 LEFT-POINTING ANGLE BRACKET +&@@ +0x2423 OPEN BOX +&Vs@@ +0x2440 OCR HOOK +&1h@@ +0x2441 OCR CHAIR +&3h@@ +0x2442 OCR FORK +&2h@@ +0x2443 OCR INVERTED FORK +&4h@@ +0x2446 OCR BRANCH BANK IDENTIFICATION +&1j@@ +0x2447 OCR AMOUNT OF CHECK +&2j@@ +0x2448 OCR DASH +&3j@@ +0x2449 OCR CUSTOMER ACCOUNT NUMBER +&4j@@ +0x2460 CIRCLED DIGIT ONE +&_1-o_@@ +0x2461 CIRCLED DIGIT TWO +&_2-o_@@ +0x2462 CIRCLED DIGIT THREE +&_3-o_@@ +0x2463 CIRCLED DIGIT FOUR +&_4-o_@@ +0x2464 CIRCLED DIGIT FIVE +&_5-o_@@ +0x2465 CIRCLED DIGIT SIX +&_6-o_@@ +0x2466 CIRCLED DIGIT SEVEN +&_7-o_@@ +0x2467 CIRCLED DIGIT EIGHT +&_8-o_@@ +0x2468 CIRCLED DIGIT NINE +&_9-o_@@ +0x2469 CIRCLED NUMBER TEN +&_10-o_@@ +0x246a CIRCLED NUMBER ELEVEN +&_11-o_@@ +0x246b CIRCLED NUMBER TWELVE +&_12-o_@@ +0x246c CIRCLED NUMBER THIRTEEN +&_13-o_@@ +0x246d CIRCLED NUMBER FOURTEEN +&_14-o_@@ +0x246e CIRCLED NUMBER FIFTEEN +&_15-o_@@ +0x246f CIRCLED NUMBER SIXTEEN +&_16-o_@@ +0x2470 CIRCLED NUMBER SEVENTEEN +&_17-o_@@ +0x2471 CIRCLED NUMBER EIGHTEEN +&_18-o_@@ +0x2472 CIRCLED NUMBER NINETEEN +&_19-o_@@ +0x2473 CIRCLED NUMBER TWENTY +&_20-o_@@ +0x2474 PARENTHESIZED DIGIT ONE +&_(1)_@@ +0x2475 PARENTHESIZED DIGIT TWO +&_(2)_@@ +0x2476 PARENTHESIZED DIGIT THREE +&_(3)_@@ +0x2477 PARENTHESIZED DIGIT FOUR +&_(4)_@@ +0x2478 PARENTHESIZED DIGIT FIVE +&_(5)_@@ +0x2479 PARENTHESIZED DIGIT SIX +&_(6)_@@ +0x247a PARENTHESIZED DIGIT SEVEN +&_(7)_@@ +0x247b PARENTHESIZED DIGIT EIGHT +&_(8)_@@ +0x247c PARENTHESIZED DIGIT NINE +&_(9)_@@ +0x247d PARENTHESIZED NUMBER TEN +&_(10)_@@ +0x247e PARENTHESIZED NUMBER ELEVEN +&_(11)_@@ +0x247f PARENTHESIZED NUMBER TWELVE +&_(12)_@@ +0x2480 PARENTHESIZED NUMBER THIRTEEN +&_(13)_@@ +0x2481 PARENTHESIZED NUMBER FOURTEEN +&_(14)_@@ +0x2482 PARENTHESIZED NUMBER FIFTEEN +&_(15)_@@ +0x2483 PARENTHESIZED NUMBER SIXTEEN +&_(16)_@@ +0x2484 PARENTHESIZED NUMBER SEVENTEEN +&_(17)_@@ +0x2485 PARENTHESIZED NUMBER EIGHTEEN +&_(18)_@@ +0x2486 PARENTHESIZED NUMBER NINETEEN +&_(19)_@@ +0x2487 PARENTHESIZED NUMBER TWENTY +&_(20)_@@ +0x2488 DIGIT ONE FULL STOP +&1.@@ +0x2489 DIGIT TWO FULL STOP +&2.@@ +0x248a DIGIT THREE FULL STOP +&3.@@ +0x248b DIGIT FOUR FULL STOP +&4.@@ +0x248c DIGIT FIVE FULL STOP +&5.@@ +0x248d DIGIT SIX FULL STOP +&6.@@ +0x248e DIGIT SEVEN FULL STOP +&7.@@ +0x248f DIGIT EIGHT FULL STOP +&8.@@ +0x2490 DIGIT NINE FULL STOP +&9.@@ +0x2491 NUMBER TEN FULL STOP +&_10._@@ +0x2492 NUMBER ELEVEN FULL STOP +&_11._@@ +0x2493 NUMBER TWELVE FULL STOP +&_12._@@ +0x2494 NUMBER THIRTEEN FULL STOP +&_13._@@ +0x2495 NUMBER FOURTEEN FULL STOP +&_14._@@ +0x2496 NUMBER FIFTEEN FULL STOP +&_15._@@ +0x2497 NUMBER SIXTEEN FULL STOP +&_16._@@ +0x2498 NUMBER SEVENTEEN FULL STOP +&_17._@@ +0x2499 NUMBER EIGHTEEN FULL STOP +&_18._@@ +0x249a NUMBER NINETEEN FULL STOP +&_19._@@ +0x249b NUMBER TWENTY FULL STOP +&_20._@@ +0x249c PARENTHESIZED LATIN SMALL LETTER A +&_(a)_@@ +0x249d PARENTHESIZED LATIN SMALL LETTER B +&_(b)_@@ +0x249e PARENTHESIZED LATIN SMALL LETTER C +&_(c)_@@ +0x249f PARENTHESIZED LATIN SMALL LETTER D +&_(d)_@@ +0x24a0 PARENTHESIZED LATIN SMALL LETTER E +&_(e)_@@ +0x24a1 PARENTHESIZED LATIN SMALL LETTER F +&_(f)_@@ +0x24a2 PARENTHESIZED LATIN SMALL LETTER G +&_(g)_@@ +0x24a3 PARENTHESIZED LATIN SMALL LETTER H +&_(h)_@@ +0x24a4 PARENTHESIZED LATIN SMALL LETTER I +&_(i)_@@ +0x24a5 PARENTHESIZED LATIN SMALL LETTER J +&_(j)_@@ +0x24a6 PARENTHESIZED LATIN SMALL LETTER K +&_(k)_@@ +0x24a7 PARENTHESIZED LATIN SMALL LETTER L +&_(l)_@@ +0x24a8 PARENTHESIZED LATIN SMALL LETTER M +&_(m)_@@ +0x24a9 PARENTHESIZED LATIN SMALL LETTER N +&_(n)_@@ +0x24aa PARENTHESIZED LATIN SMALL LETTER O +&_(o)_@@ +0x24ab PARENTHESIZED LATIN SMALL LETTER P +&_(p)_@@ +0x24ac PARENTHESIZED LATIN SMALL LETTER Q +&_(q)_@@ +0x24ad PARENTHESIZED LATIN SMALL LETTER R +&_(r)_@@ +0x24ae PARENTHESIZED LATIN SMALL LETTER S +&_(s)_@@ +0x24af PARENTHESIZED LATIN SMALL LETTER T +&_(t)_@@ +0x24b0 PARENTHESIZED LATIN SMALL LETTER U +&_(u)_@@ +0x24b1 PARENTHESIZED LATIN SMALL LETTER V +&_(v)_@@ +0x24b2 PARENTHESIZED LATIN SMALL LETTER W +&_(w)_@@ +0x24b3 PARENTHESIZED LATIN SMALL LETTER X +&_(x)_@@ +0x24b4 PARENTHESIZED LATIN SMALL LETTER Y +&_(y)_@@ +0x24b5 PARENTHESIZED LATIN SMALL LETTER Z +&_(z)_@@ +0x24b6 CIRCLED LATIN CAPITAL LETTER A +&_A-o_@@ +0x24b7 CIRCLED LATIN CAPITAL LETTER B +&_B-o_@@ +0x24b8 CIRCLED LATIN CAPITAL LETTER C +&_C-o_@@ +0x24b9 CIRCLED LATIN CAPITAL LETTER D +&_D-o_@@ +0x24ba CIRCLED LATIN CAPITAL LETTER E +&_E-o_@@ +0x24bb CIRCLED LATIN CAPITAL LETTER F +&_F-o_@@ +0x24bc CIRCLED LATIN CAPITAL LETTER G +&_G-o_@@ +0x24bd CIRCLED LATIN CAPITAL LETTER H +&_H-o_@@ +0x24be CIRCLED LATIN CAPITAL LETTER I +&_I-o_@@ +0x24bf CIRCLED LATIN CAPITAL LETTER J +&_J-o_@@ +0x24c0 CIRCLED LATIN CAPITAL LETTER K +&_K-o_@@ +0x24c1 CIRCLED LATIN CAPITAL LETTER L +&_L-o_@@ +0x24c2 CIRCLED LATIN CAPITAL LETTER M +&_M-o_@@ +0x24c3 CIRCLED LATIN CAPITAL LETTER N +&_N-o_@@ +0x24c4 CIRCLED LATIN CAPITAL LETTER O +&_O-o_@@ +0x24c5 CIRCLED LATIN CAPITAL LETTER P +&_P-o_@@ +0x24c6 CIRCLED LATIN CAPITAL LETTER Q +&_Q-o_@@ +0x24c7 CIRCLED LATIN CAPITAL LETTER R +&_R-o_@@ +0x24c8 CIRCLED LATIN CAPITAL LETTER S +&_S-o_@@ +0x24c9 CIRCLED LATIN CAPITAL LETTER T +&_T-o_@@ +0x24ca CIRCLED LATIN CAPITAL LETTER U +&_U-o_@@ +0x24cb CIRCLED LATIN CAPITAL LETTER V +&_V-o_@@ +0x24cc CIRCLED LATIN CAPITAL LETTER W +&_W-o_@@ +0x24cd CIRCLED LATIN CAPITAL LETTER X +&_X-o_@@ +0x24ce CIRCLED LATIN CAPITAL LETTER Y +&_Y-o_@@ +0x24cf CIRCLED LATIN CAPITAL LETTER Z +&_Z-o_@@ +0x24d0 CIRCLED LATIN SMALL LETTER A +&_a-o_@@ +0x24d1 CIRCLED LATIN SMALL LETTER B +&_b-o_@@ +0x24d2 CIRCLED LATIN SMALL LETTER C +&_c-o_@@ +0x24d3 CIRCLED LATIN SMALL LETTER D +&_d-o_@@ +0x24d4 CIRCLED LATIN SMALL LETTER E +&_e-o_@@ +0x24d5 CIRCLED LATIN SMALL LETTER F +&_f-o_@@ +0x24d6 CIRCLED LATIN SMALL LETTER G +&_g-o_@@ +0x24d7 CIRCLED LATIN SMALL LETTER H +&_h-o_@@ +0x24d8 CIRCLED LATIN SMALL LETTER I +&_i-o_@@ +0x24d9 CIRCLED LATIN SMALL LETTER J +&_j-o_@@ +0x24da CIRCLED LATIN SMALL LETTER K +&_k-o_@@ +0x24db CIRCLED LATIN SMALL LETTER L +&_l-o_@@ +0x24dc CIRCLED LATIN SMALL LETTER M +&_m-o_@@ +0x24dd CIRCLED LATIN SMALL LETTER N +&_n-o_@@ +0x24de CIRCLED LATIN SMALL LETTER O +&_o-o_@@ +0x24df CIRCLED LATIN SMALL LETTER P +&_p-o_@@ +0x24e0 CIRCLED LATIN SMALL LETTER Q +&_q-o_@@ +0x24e1 CIRCLED LATIN SMALL LETTER R +&_r-o_@@ +0x24e2 CIRCLED LATIN SMALL LETTER S +&_s-o_@@ +0x24e3 CIRCLED LATIN SMALL LETTER T +&_t-o_@@ +0x24e4 CIRCLED LATIN SMALL LETTER U +&_u-o_@@ +0x24e5 CIRCLED LATIN SMALL LETTER V +&_v-o_@@ +0x24e6 CIRCLED LATIN SMALL LETTER W +&_w-o_@@ +0x24e7 CIRCLED LATIN SMALL LETTER X +&_x-o_@@ +0x24e8 CIRCLED LATIN SMALL LETTER Y +&_y-o_@@ +0x24e9 CIRCLED LATIN SMALL LETTER Z +&_z-o_@@ +0x24ea CIRCLED DIGIT ZERO +&_0-o_@@ +0x2500 BOX DRAWINGS LIGHT HORIZONTAL +&hh@@ +0x2501 BOX DRAWINGS HEAVY HORIZONTAL +&HH@@ +0x2502 BOX DRAWINGS LIGHT VERTICAL +&vv@@ +0x2503 BOX DRAWINGS HEAVY VERTICAL +&VV@@ +0x2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +&3-@@ +0x2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +&3_@@ +0x2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +&3!@@ +0x2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +&3/@@ +0x2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +&4-@@ +0x2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +&4_@@ +0x250a BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +&4!@@ +0x250b BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +&4/@@ +0x250c BOX DRAWINGS LIGHT DOWN AND RIGHT +&dr@@ +0x250d BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +&dR@@ +0x250e BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +&Dr@@ +0x250f BOX DRAWINGS HEAVY DOWN AND RIGHT +&DR@@ +0x2510 BOX DRAWINGS LIGHT DOWN AND LEFT +&dl@@ +0x2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +&dL@@ +0x2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +&Dl@@ +0x2513 BOX DRAWINGS HEAVY DOWN AND LEFT +&LD@@ +0x2514 BOX DRAWINGS LIGHT UP AND RIGHT +&ur@@ +0x2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +&uR@@ +0x2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +&Ur@@ +0x2517 BOX DRAWINGS HEAVY UP AND RIGHT +&UR@@ +0x2518 BOX DRAWINGS LIGHT UP AND LEFT +&ul@@ +0x2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +&uL@@ +0x251a BOX DRAWINGS UP HEAVY AND LEFT LIGHT +&Ul@@ +0x251b BOX DRAWINGS HEAVY UP AND LEFT +&UL@@ +0x251c BOX DRAWINGS LIGHT VERTICAL AND RIGHT +&vr@@ +0x251d BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +&vR@@ +0x251e BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +&_Udr_@@ +0x251f BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +&_uDr_@@ +0x2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +&Vr@@ +0x2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +&_UdR_@@ +0x2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +&_uDR_@@ +0x2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +&VR@@ +0x2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT +&vl@@ +0x2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +&vL@@ +0x2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +&_Udl_@@ +0x2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +&_uDl_@@ +0x2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +&Vl@@ +0x2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +&_UdL_@@ +0x252a BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +&_uDL_@@ +0x252b BOX DRAWINGS HEAVY VERTICAL AND LEFT +&VL@@ +0x252c BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +&dh@@ +0x252d BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +&_dLr_@@ +0x252e BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +&_dlR_@@ +0x252f BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +&dH@@ +0x2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +&Dh@@ +0x2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +&_DLr_@@ +0x2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +&_DlR_@@ +0x2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +&DH@@ +0x2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL +&uh@@ +0x2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +&_uLr_@@ +0x2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +&_ulR_@@ +0x2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +&uH@@ +0x2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +&Uh@@ +0x2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +&_ULr_@@ +0x253a BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +&_UlR_@@ +0x253b BOX DRAWINGS HEAVY UP AND HORIZONTAL +&UH@@ +0x253c BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +&vh@@ +0x253d BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +&_vLr_@@ +0x253e BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +&_vlR_@@ +0x253f BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +&vH@@ +0x2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +&_Udh_@@ +0x2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +&_uDh_@@ +0x2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +&Vh@@ +0x2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +&_UdLr_@@ +0x2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +&_UdlR_@@ +0x2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +&_uDLr_@@ +0x2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +&_uDlR_@@ +0x2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +&_UdH_@@ +0x2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +&_uDH_@@ +0x2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +&_VLr_@@ +0x254a BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +&_VlR_@@ +0x254b BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +&VH@@ +0x2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +&FD@@ +0x2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +&BD@@ +0x2580 UPPER HALF BLOCK +&TB@@ +0x2584 LOWER HALF BLOCK +&LB@@ +0x2588 FULL BLOCK +&FB@@ +0x258c LEFT HALF BLOCK +&lB@@ +0x2590 RIGHT HALF BLOCK +&RB@@ +0x2591 LIGHT SHADE +&.S@@ +0x2592 MEDIUM SHADE +&:S@@ +0x2593 DARK SHADE +&?S@@ +0x25a0 BLACK SQUARE +&fS@@ +0x25a1 WHITE SQUARE +&OS@@ +0x25a2 WHITE SQUARE WITH ROUNDED CORNERS +&RO@@ +0x25a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +&Rr@@ +0x25a4 SQUARE WITH HORIZONTAL FILL +&RF@@ +0x25a5 SQUARE WITH VERTICAL FILL +&RY@@ +0x25a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +&RH@@ +0x25a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +&RZ@@ +0x25a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +&RK@@ +0x25a9 SQUARE WITH DIAGONAL CROSSHATCH FILL +&RX@@ +0x25aa BLACK SMALL SQUARE +&sB@@ +0x25ac BLACK RECTANGLE +&SR@@ +0x25ad WHITE RECTANGLE +&Or@@ +0x25b2 BLACK UP-POINTING TRIANGLE +&UT@@ +0x25b3 WHITE UP-POINTING TRIANGLE +&uT@@ +0x25b6 BLACK RIGHT-POINTING TRIANGLE +&PR@@ +0x25b7 WHITE RIGHT-POINTING TRIANGLE +&Tr@@ +0x25bc BLACK DOWN-POINTING TRIANGLE +&Dt@@ +0x25bd WHITE DOWN-POINTING TRIANGLE +&dT@@ +0x25c0 BLACK LEFT-POINTING TRIANGLE +&PL@@ +0x25c1 WHITE LEFT-POINTING TRIANGLE +&Tl@@ +0x25c6 BLACK DIAMOND +&Db@@ +0x25c7 WHITE DIAMOND +&Dw@@ +0x25ca LOZENGE +&LZ@@ +0x25cb WHITE CIRCLE +&0m@@ +0x25ce BULLSEYE +&0o@@ +0x25cf BLACK CIRCLE +&0M@@ +0x25d0 CIRCLE WITH LEFT HALF BLACK +&0L@@ +0x25d1 CIRCLE WITH RIGHT HALF BLACK +&0R@@ +0x25d8 INVERSE BULLET +&Sn@@ +0x25d9 INVERSE WHITE CIRCLE +&Ic@@ +0x25e2 BLACK LOWER RIGHT TRIANGLE +&Fd@@ +0x25e3 BLACK LOWER LEFT TRIANGLE +&Bd@@ +0x2605 BLACK STAR +&*2@@ +0x2606 WHITE STAR +&*1@@ +0x260e BLACK TELEPHONE +&_TEL_@@ +0x260f WHITE TELEPHONE +&_tel_@@ +0x261c WHITE LEFT POINTING INDEX +&H@@ +0x263a WHITE SMILING FACE +&0u@@ +0x263b BLACK SMILING FACE +&0U@@ +0x263c WHITE SUN WITH RAYS +&SU@@ +0x2640 FEMALE SIGN +&Fm@@ +0x2642 MALE SIGN +&Ml@@ +0x2660 BLACK SPADE SUIT +&cS@@ +0x2661 WHITE HEART SUIT +&cH@@ +0x2662 WHITE DIAMOND SUIT +&cD@@ +0x2663 BLACK CLUB SUIT +&cC@@ +0x2664 WHITE SPADE SUIT +&_cS-_@@ +0x2665 BLACK HEART SUIT +&_cH-_@@ +0x2666 BLACK DIAMOND SUIT +&_cD-_@@ +0x2667 WHITE CLUB SUIT +&_cC-_@@ +0x2669 QUARTER NOTE +&Md@@ +0x266a EIGHTH NOTE +&M8@@ +0x266b BARRED EIGHTH NOTES +&M2@@ +0x266c BARRED SIXTEENTH NOTES +&_M16_@@ +0x266d MUSIC FLAT SIGN +&Mb@@ +0x266e MUSIC NATURAL SIGN +&Mx@@ +0x266f MUSIC SHARP SIGN +&MX@@ +0x2713 CHECK MARK +&OK@@ +0x2717 BALLOT X +&XX@@ +0x2720 MALTESE CROSS +&-X@@ +0x3000 IDEOGRAPHIC SPACE +&IS@@ +0x3001 IDEOGRAPHIC COMMA +&,_@@ +0x3002 IDEOGRAPHIC PERIOD +&._@@ +0x3003 DITTO MARK +&+"@@ +0x3004 IDEOGRAPHIC DITTO MARK +&+_@@ +0x3005 IDEOGRAPHIC ITERATION MARK +&*_@@ +0x3006 IDEOGRAPHIC CLOSING MARK +&;_@@ +0x3007 IDEOGRAPHIC NUMBER ZERO +&0_@@ +0x300a LEFT DOUBLE ANGLE BRACKET +&<+@@ +0x300b RIGHT DOUBLE ANGLE BRACKET +&>+@@ +0x300c LEFT CORNER BRACKET +&<'@@ +0x300d RIGHT CORNER BRACKET +&>'@@ +0x300e LEFT WHITE CORNER BRACKET +&<"@@ +0x300f RIGHT WHITE CORNER BRACKET +&>"@@ +0x3010 LEFT BLACK LENTICULAR BRACKET +&("@@ +0x3011 RIGHT BLACK LENTICULAR BRACKET +&)"@@ +0x3012 POSTAL MARK +&=T@@ +0x3013 GETA MARK +&=_@@ +0x3014 LEFT TORTOISE SHELL BRACKET +&('@@ +0x3015 RIGHT TORTOISE SHELL BRACKET +&)'@@ +0x3016 LEFT WHITE LENTICULAR BRACKET +&(I@@ +0x3017 RIGHT WHITE LENTICULAR BRACKET +&)I@@ +0x301c WAVE DASH +&-?@@ +0x3020 POSTAL MARK FACE +&_=T:)_@@ +0x3041 HIRAGANA LETTER SMALL A +&A5@@ +0x3042 HIRAGANA LETTER A +&a5@@ +0x3043 HIRAGANA LETTER SMALL I +&I5@@ +0x3044 HIRAGANA LETTER I +&i5@@ +0x3045 HIRAGANA LETTER SMALL U +&U5@@ +0x3046 HIRAGANA LETTER U +&u5@@ +0x3047 HIRAGANA LETTER SMALL E +&E5@@ +0x3048 HIRAGANA LETTER E +&e5@@ +0x3049 HIRAGANA LETTER SMALL O +&O5@@ +0x304a HIRAGANA LETTER O +&o5@@ +0x304b HIRAGANA LETTER KA +&ka@@ +0x304c HIRAGANA LETTER GA +&ga@@ +0x304d HIRAGANA LETTER KI +&ki@@ +0x304e HIRAGANA LETTER GI +&gi@@ +0x304f HIRAGANA LETTER KU +&ku@@ +0x3050 HIRAGANA LETTER GU +&gu@@ +0x3051 HIRAGANA LETTER KE +&ke@@ +0x3052 HIRAGANA LETTER GE +&ge@@ +0x3053 HIRAGANA LETTER KO +&ko@@ +0x3054 HIRAGANA LETTER GO +&go@@ +0x3055 HIRAGANA LETTER SA +&sa@@ +0x3056 HIRAGANA LETTER ZA +&za@@ +0x3057 HIRAGANA LETTER SI +&si@@ +0x3058 HIRAGANA LETTER ZI +&zi@@ +0x3059 HIRAGANA LETTER SU +&su@@ +0x305a HIRAGANA LETTER ZU +&zu@@ +0x305b HIRAGANA LETTER SE +&se@@ +0x305c HIRAGANA LETTER ZE +&ze@@ +0x305d HIRAGANA LETTER SO +&so@@ +0x305e HIRAGANA LETTER ZO +&zo@@ +0x305f HIRAGANA LETTER TA +&ta@@ +0x3060 HIRAGANA LETTER DA +&da@@ +0x3061 HIRAGANA LETTER TI +&ti@@ +0x3062 HIRAGANA LETTER DI +&di@@ +0x3063 HIRAGANA LETTER SMALL TU +&tU@@ +0x3064 HIRAGANA LETTER TU +&tu@@ +0x3065 HIRAGANA LETTER DU +&du@@ +0x3066 HIRAGANA LETTER TE +&te@@ +0x3067 HIRAGANA LETTER DE +&de@@ +0x3068 HIRAGANA LETTER TO +&to@@ +0x3069 HIRAGANA LETTER DO +&do@@ +0x306a HIRAGANA LETTER NA +&na@@ +0x306b HIRAGANA LETTER NI +&ni@@ +0x306c HIRAGANA LETTER NU +&nu@@ +0x306d HIRAGANA LETTER NE +&ne@@ +0x306e HIRAGANA LETTER NO +&no@@ +0x306f HIRAGANA LETTER HA +&ha@@ +0x3070 HIRAGANA LETTER BA +&ba@@ +0x3071 HIRAGANA LETTER PA +&pa@@ +0x3072 HIRAGANA LETTER HI +&hi@@ +0x3073 HIRAGANA LETTER BI +&bi@@ +0x3074 HIRAGANA LETTER PI +&pi@@ +0x3075 HIRAGANA LETTER HU +&hu@@ +0x3076 HIRAGANA LETTER BU +&bu@@ +0x3077 HIRAGANA LETTER PU +&pu@@ +0x3078 HIRAGANA LETTER HE +&he@@ +0x3079 HIRAGANA LETTER BE +&be@@ +0x307a HIRAGANA LETTER PE +&pe@@ +0x307b HIRAGANA LETTER HO +&ho@@ +0x307c HIRAGANA LETTER BO +&bo@@ +0x307d HIRAGANA LETTER PO +&po@@ +0x307e HIRAGANA LETTER MA +&ma@@ +0x307f HIRAGANA LETTER MI +&mi@@ +0x3080 HIRAGANA LETTER MU +&mu@@ +0x3081 HIRAGANA LETTER ME +&me@@ +0x3082 HIRAGANA LETTER MO +&mo@@ +0x3083 HIRAGANA LETTER SMALL YA +&yA@@ +0x3084 HIRAGANA LETTER YA +&ya@@ +0x3085 HIRAGANA LETTER SMALL YU +&yU@@ +0x3086 HIRAGANA LETTER YU +&yu@@ +0x3087 HIRAGANA LETTER SMALL YO +&yO@@ +0x3088 HIRAGANA LETTER YO +&yo@@ +0x3089 HIRAGANA LETTER RA +&ra@@ +0x308a HIRAGANA LETTER RI +&ri@@ +0x308b HIRAGANA LETTER RU +&ru@@ +0x308c HIRAGANA LETTER RE +&re@@ +0x308d HIRAGANA LETTER RO +&ro@@ +0x308e HIRAGANA LETTER SMALL WA +&wA@@ +0x308f HIRAGANA LETTER WA +&wa@@ +0x3090 HIRAGANA LETTER WI +&wi@@ +0x3091 HIRAGANA LETTER WE +&we@@ +0x3092 HIRAGANA LETTER WO +&wo@@ +0x3093 HIRAGANA LETTER N +&n5@@ +0x3094 HIRAGANA LETTER VU +&vu@@ +0x309b KATAKANA-HIRAGANA VOICED SOUND MARK +&"5@@ +0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +&05@@ +0x309d HIRAGANA ITERATION MARK +&*5@@ +0x309e HIRAGANA VOICED ITERATION MARK +&+5@@ +0x30a1 KATAKANA LETTER SMALL A +&a6@@ +0x30a2 KATAKANA LETTER A +&A6@@ +0x30a3 KATAKANA LETTER SMALL I +&i6@@ +0x30a4 KATAKANA LETTER I +&I6@@ +0x30a5 KATAKANA LETTER SMALL U +&u6@@ +0x30a6 KATAKANA LETTER U +&U6@@ +0x30a7 KATAKANA LETTER SMALL E +&e6@@ +0x30a8 KATAKANA LETTER E +&E6@@ +0x30a9 KATAKANA LETTER SMALL O +&o6@@ +0x30aa KATAKANA LETTER O +&O6@@ +0x30ab KATAKANA LETTER KA +&Ka@@ +0x30ac KATAKANA LETTER GA +&Ga@@ +0x30ad KATAKANA LETTER KI +&Ki@@ +0x30ae KATAKANA LETTER GI +&Gi@@ +0x30af KATAKANA LETTER KU +&Ku@@ +0x30b0 KATAKANA LETTER GU +&Gu@@ +0x30b1 KATAKANA LETTER KE +&Ke@@ +0x30b2 KATAKANA LETTER GE +&Ge@@ +0x30b3 KATAKANA LETTER KO +&Ko@@ +0x30b4 KATAKANA LETTER GO +&Go@@ +0x30b5 KATAKANA LETTER SA +&Sa@@ +0x30b6 KATAKANA LETTER ZA +&Za@@ +0x30b7 KATAKANA LETTER SI +&Si@@ +0x30b8 KATAKANA LETTER ZI +&Zi@@ +0x30b9 KATAKANA LETTER SU +&Su@@ +0x30ba KATAKANA LETTER ZU +&Zu@@ +0x30bb KATAKANA LETTER SE +&Se@@ +0x30bc KATAKANA LETTER ZE +&Ze@@ +0x30bd KATAKANA LETTER SO +&So@@ +0x30be KATAKANA LETTER ZO +&Zo@@ +0x30bf KATAKANA LETTER TA +&Ta@@ +0x30c0 KATAKANA LETTER DA +&Da@@ +0x30c1 KATAKANA LETTER TI +&Ti@@ +0x30c2 KATAKANA LETTER DI +&Di@@ +0x30c3 KATAKANA LETTER SMALL TU +&TU@@ +0x30c4 KATAKANA LETTER TU +&Tu@@ +0x30c5 KATAKANA LETTER DU +&Du@@ +0x30c6 KATAKANA LETTER TE +&Te@@ +0x30c7 KATAKANA LETTER DE +&De@@ +0x30c8 KATAKANA LETTER TO +&To@@ +0x30c9 KATAKANA LETTER DO +&Do@@ +0x30ca KATAKANA LETTER NA +&Na@@ +0x30cb KATAKANA LETTER NI +&Ni@@ +0x30cc KATAKANA LETTER NU +&Nu@@ +0x30cd KATAKANA LETTER NE +&Ne@@ +0x30ce KATAKANA LETTER NO +&No@@ +0x30cf KATAKANA LETTER HA +&Ha@@ +0x30d0 KATAKANA LETTER BA +&Ba@@ +0x30d1 KATAKANA LETTER PA +&Pa@@ +0x30d2 KATAKANA LETTER HI +&Hi@@ +0x30d3 KATAKANA LETTER BI +&Bi@@ +0x30d4 KATAKANA LETTER PI +&Pi@@ +0x30d5 KATAKANA LETTER HU +&Hu@@ +0x30d6 KATAKANA LETTER BU +&Bu@@ +0x30d7 KATAKANA LETTER PU +&Pu@@ +0x30d8 KATAKANA LETTER HE +&He@@ +0x30d9 KATAKANA LETTER BE +&Be@@ +0x30da KATAKANA LETTER PE +&Pe@@ +0x30db KATAKANA LETTER HO +&Ho@@ +0x30dc KATAKANA LETTER BO +&Bo@@ +0x30dd KATAKANA LETTER PO +&Po@@ +0x30de KATAKANA LETTER MA +&Ma@@ +0x30df KATAKANA LETTER MI +&Mi@@ +0x30e0 KATAKANA LETTER MU +&Mu@@ +0x30e1 KATAKANA LETTER ME +&Me@@ +0x30e2 KATAKANA LETTER MO +&Mo@@ +0x30e3 KATAKANA LETTER SMALL YA +&YA@@ +0x30e4 KATAKANA LETTER YA +&Ya@@ +0x30e5 KATAKANA LETTER SMALL YU +&YU@@ +0x30e6 KATAKANA LETTER YU +&Yu@@ +0x30e7 KATAKANA LETTER SMALL YO +&YO@@ +0x30e8 KATAKANA LETTER YO +&Yo@@ +0x30e9 KATAKANA LETTER RA +&Ra@@ +0x30ea KATAKANA LETTER RI +&Ri@@ +0x30eb KATAKANA LETTER RU +&Ru@@ +0x30ec KATAKANA LETTER RE +&Re@@ +0x30ed KATAKANA LETTER RO +&Ro@@ +0x30ee KATAKANA LETTER SMALL WA +&WA@@ +0x30ef KATAKANA LETTER WA +&Wa@@ +0x30f0 KATAKANA LETTER WI +&Wi@@ +0x30f1 KATAKANA LETTER WE +&We@@ +0x30f2 KATAKANA LETTER WO +&Wo@@ +0x30f3 KATAKANA LETTER N +&N6@@ +0x30f4 KATAKANA LETTER VU +&Vu@@ +0x30f5 KATAKANA LETTER SMALL KA +&KA@@ +0x30f6 KATAKANA LETTER SMALL KE +&KE@@ +0x30f7 KATAKANA LETTER VA +&Va@@ +0x30f8 KATAKANA LETTER VI +&Vi@@ +0x30f9 KATAKANA LETTER VE +&Ve@@ +0x30fa KATAKANA LETTER VO +&Vo@@ +0x30fb KATAKANA MIDDLE DOT +&.6@@ +0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK +&-6@@ +0x30fd KATAKANA ITERATION MARK +&*6@@ +0x30fe KATAKANA VOICED ITERATION MARK +&+6@@ +0x3105 BOPOMOFO LETTER B +&b4@@ +0x3106 BOPOMOFO LETTER P +&p4@@ +0x3107 BOPOMOFO LETTER M +&m4@@ +0x3108 BOPOMOFO LETTER F +&f4@@ +0x3109 BOPOMOFO LETTER D +&d4@@ +0x310a BOPOMOFO LETTER T +&t4@@ +0x310b BOPOMOFO LETTER N +&n4@@ +0x310c BOPOMOFO LETTER L +&l4@@ +0x310d BOPOMOFO LETTER G +&g4@@ +0x310e BOPOMOFO LETTER K +&k4@@ +0x310f BOPOMOFO LETTER H +&h4@@ +0x3110 BOPOMOFO LETTER J +&j4@@ +0x3111 BOPOMOFO LETTER Q +&q4@@ +0x3112 BOPOMOFO LETTER X +&x4@@ +0x3113 BOPOMOFO LETTER ZH +&zh@@ +0x3114 BOPOMOFO LETTER CH +&ch@@ +0x3115 BOPOMOFO LETTER SH +&sh@@ +0x3116 BOPOMOFO LETTER R +&r4@@ +0x3117 BOPOMOFO LETTER Z +&z4@@ +0x3118 BOPOMOFO LETTER C +&c4@@ +0x3119 BOPOMOFO LETTER S +&s4@@ +0x311a BOPOMOFO LETTER A +&a4@@ +0x311b BOPOMOFO LETTER O +&o4@@ +0x311c BOPOMOFO LETTER E +&e4@@ +0x311d BOPOMOFO LETTER EH +&_eh4_@@ +0x311e BOPOMOFO LETTER AI +&ai@@ +0x311f BOPOMOFO LETTER EI +&ei@@ +0x3120 BOPOMOFO LETTER AU +&au@@ +0x3121 BOPOMOFO LETTER OU +&ou@@ +0x3122 BOPOMOFO LETTER AN +&an@@ +0x3123 BOPOMOFO LETTER EN +&en@@ +0x3124 BOPOMOFO LETTER ANG +&aN@@ +0x3125 BOPOMOFO LETTER ENG +&eN@@ +0x3126 BOPOMOFO LETTER ER +&er@@ +0x3127 BOPOMOFO LETTER I +&i4@@ +0x3128 BOPOMOFO LETTER U +&u4@@ +0x3129 BOPOMOFO LETTER IU +&iu@@ +0x312a BOPOMOFO LETTER V +&v4@@ +0x312b BOPOMOFO LETTER NG +&nG@@ +0x312c BOPOMOFO LETTER GN +&gn@@ +0x321c PARENTHESIZED HANGUL JU +&_(JU)_@@ +0x3220 PARENTHESIZED IDEOGRAPH ONE +&1c@@ +0x3221 PARENTHESIZED IDEOGRAPH TWO +&2c@@ +0x3222 PARENTHESIZED IDEOGRAPH THREE +&3c@@ +0x3223 PARENTHESIZED IDEOGRAPH FOUR +&4c@@ +0x3224 PARENTHESIZED IDEOGRAPH FIVE +&5c@@ +0x3225 PARENTHESIZED IDEOGRAPH SIX +&6c@@ +0x3226 PARENTHESIZED IDEOGRAPH SEVEN +&7c@@ +0x3227 PARENTHESIZED IDEOGRAPH EIGHT +&8c@@ +0x3228 PARENTHESIZED IDEOGRAPH NINE +&9c@@ +0x3229 PARENTHESIZED IDEOGRAPH TEN +&_10c_@@ +0x327f KOREAN STANDARD SYMBOL +&_KSC_@@ +0xe001 JOIN THIS LINE WITH NEXT LINE (Mnemonic) +&/c@@ +0xe002 Unit space A (ISO-IR-8-1 064) +&UA@@ +0xe003 Unit space B (ISO-IR-8-1 096) +&UB@@ +0xe004 NON-SPACING UMLAUT (ISO-IR-38 201) (character part) +&"3@@ +0xe005 NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192) (character part) +&"1@@ +0xe006 NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character part) +&"!@@ +0xe007 NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character part) +&"'@@ +0xe008 NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195) (character part) +&">@@ +0xe009 NON-SPACING TILDE (ISO-IR-103 196) (character part) +&"?@@ +0xe00a NON-SPACING MACRON (ISO-IR-103 197) (character part) +&"-@@ +0xe00b NON-SPACING BREVE (ISO-IR-103 198) (character part) +&"(@@ +0xe00c NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part) +&".@@ +0xe00d NON-SPACING DIAERESIS (ISO-IR-103 200) (character part) +&":@@ +0xe00e NON-SPACING RING ABOVE (ISO-IR-103 202) (character part) +&"0@@ +0xe00f NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character part) +&""@@ +0xe010 NON-SPACING CARON (ISO-IR-103 206) (character part) +&"<@@ +0xe011 NON-SPACING CEDILLA (ISO-IR-103 203) (character part) +&",@@ +0xe012 NON-SPACING OGONEK (ISO-IR-103 206) (character part) +&";@@ +0xe013 NON-SPACING LOW LINE (ISO-IR-103 204) (character part) +&"_@@ +0xe014 NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character part) +&"=@@ +0xe015 NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character part) +&"/@@ +0xe016 GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character part) +&"i@@ +0xe017 GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38) (character part) +&"d@@ +0xe018 GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37) (character part) +&"p@@ +0xe019 GREEK DASIA PNEUMATA (ISO-IR-18 92) +&;;@@ +0xe01a GREEK PSILI PNEUMATA (ISO-IR-18 124) +&,,@@ +0xe01b GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99) +&b3@@ +0xe01c CIRCLE (ISO-IR-83 0294) +&Ci@@ +0xe01d FUNCTION SIGN (ISO-IR-143 221) +&f(@@ +0xe01e LATIN SMALL LETTER EZH (ISO-IR-158 142) +&ed@@ +0xe01f ANTE MERIDIAM SIGN (ISO-IR-149 0267) +&am@@ +0xe020 POST MERIDIAM SIGN (ISO-IR-149 0268) +&pm@@ +0xe021 TEL COMPATIBILITY SIGN (ISO-IR-149 0269) +&_Tel_@@ +0xe022 ARABIC LETTER ALEF FINAL FORM COMPATIBILITY (IBM868 144) +&_a+:_@@ +0xe023 DUTCH GUILDER SIGN (IBM437 159) +&Fl@@ +0xe024 GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122) +&GF@@ +0xe025 RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046) +&>V@@ +0xe026 GREEK VARIA (ISO-10646-1DIS 032/032/042/164) +&!*@@ +0xe027 GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165) +&?*@@ +0xe028 LATIN CAPITAL LETTER J WITH CARON (lowercase: 000/000/001/240) +&J<@@ +0xfb00 LATIN SMALL LIGATURE FF +&ff@@ +0xfb01 LATIN SMALL LIGATURE FI +&fi@@ +0xfb02 LATIN SMALL LIGATURE FL +&fl@@ +0xfb03 LATIN SMALL LIGATURE FFI +&_ffi_@@ +0xfb04 LATIN SMALL LIGATURE FFL +&_ffl_@@ +0xfb05 LATIN SMALL LIGATURE FT +&ft@@ +0xfb06 LATIN SMALL LIGATURE ST +&st@@ +0xfe7d ARABIC SHADDA MEDIAL FORM +&_3+;_@@ +0xfe82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +&_aM._@@ +0xfe84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +&_aH._@@ +0xfe8d ARABIC LETTER ALEF ISOLATED FORM +&_a+-_@@ +0xfe8e ARABIC LETTER ALEF FINAL FORM +&_a+._@@ +0xfe8f ARABIC LETTER BEH ISOLATED FORM +&_b+-_@@ +0xfe90 ARABIC LETTER BEH INITIAL FORM +&_b+,_@@ +0xfe91 ARABIC LETTER BEH MEDIAL FORM +&_b+;_@@ +0xfe92 ARABIC LETTER BEH FINAL FORM +&_b+._@@ +0xfe93 ARABIC LETTER TEH MARBUTA ISOLATED FORM +&_tm-_@@ +0xfe94 ARABIC LETTER TEH MARBUTA FINAL FORM +&_tm._@@ +0xfe95 ARABIC LETTER TEH ISOLATED FORM +&_t+-_@@ +0xfe96 ARABIC LETTER TEH INITIAL FORM +&_t+,_@@ +0xfe97 ARABIC LETTER TEH MEDIAL FORM +&_t+;_@@ +0xfe98 ARABIC LETTER TEH FINAL FORM +&_t+._@@ +0xfe99 ARABIC LETTER THEH ISOLATED FORM +&_tk-_@@ +0xfe9a ARABIC LETTER THEH INITIAL FORM +&_tk,_@@ +0xfe9b ARABIC LETTER THEH MEDIAL FORM +&_tk;_@@ +0xfe9c ARABIC LETTER THEH FINAL FORM +&_tk._@@ +0xfe9d ARABIC LETTER JEEM ISOLATED FORM +&_g+-_@@ +0xfe9e ARABIC LETTER JEEM INITIAL FORM +&_g+,_@@ +0xfe9f ARABIC LETTER JEEM MEDIAL FORM +&_g+;_@@ +0xfea0 ARABIC LETTER JEEM FINAL FORM +&_g+._@@ +0xfea1 ARABIC LETTER HAH ISOLATED FORM +&_hk-_@@ +0xfea2 ARABIC LETTER HAH INITIAL FORM +&_hk,_@@ +0xfea3 ARABIC LETTER HAH MEDIAL FORM +&_hk;_@@ +0xfea4 ARABIC LETTER HAH FINAL FORM +&_hk._@@ +0xfea5 ARABIC LETTER KHAH ISOLATED FORM +&_x+-_@@ +0xfea6 ARABIC LETTER KHAH INITIAL FORM +&_x+,_@@ +0xfea7 ARABIC LETTER KHAH MEDIAL FORM +&_x+;_@@ +0xfea8 ARABIC LETTER KHAH FINAL FORM +&_x+._@@ +0xfea9 ARABIC LETTER DAL ISOLATED FORM +&_d+-_@@ +0xfeaa ARABIC LETTER DAL FINAL FORM +&_d+._@@ +0xfeab ARABIC LETTER THAL ISOLATED FORM +&_dk-_@@ +0xfeac ARABIC LETTER THAL FINAL FORM +&_dk._@@ +0xfead ARABIC LETTER REH ISOLATED FORM +&_r+-_@@ +0xfeae ARABIC LETTER REH FINAL FORM +&_r+._@@ +0xfeaf ARABIC LETTER ZAIN ISOLATED FORM +&_z+-_@@ +0xfeb0 ARABIC LETTER ZAIN FINAL FORM +&_z+._@@ +0xfeb1 ARABIC LETTER SEEN ISOLATED FORM +&_s+-_@@ +0xfeb2 ARABIC LETTER SEEN INITIAL FORM +&_s+,_@@ +0xfeb3 ARABIC LETTER SEEN MEDIAL FORM +&_s+;_@@ +0xfeb4 ARABIC LETTER SEEN FINAL FORM +&_s+._@@ +0xfeb5 ARABIC LETTER SHEEN ISOLATED FORM +&_sn-_@@ +0xfeb6 ARABIC LETTER SHEEN INITIAL FORM +&_sn,_@@ +0xfeb7 ARABIC LETTER SHEEN MEDIAL FORM +&_sn;_@@ +0xfeb8 ARABIC LETTER SHEEN FINAL FORM +&_sn._@@ +0xfeb9 ARABIC LETTER SAD ISOLATED FORM +&_c+-_@@ +0xfeba ARABIC LETTER SAD INITIAL FORM +&_c+,_@@ +0xfebb ARABIC LETTER SAD MEDIAL FORM +&_c+;_@@ +0xfebc ARABIC LETTER SAD FINAL FORM +&_c+._@@ +0xfebd ARABIC LETTER DAD ISOLATED FORM +&_dd-_@@ +0xfebe ARABIC LETTER DAD INITIAL FORM +&_dd,_@@ +0xfebf ARABIC LETTER DAD MEDIAL FORM +&_dd;_@@ +0xfec0 ARABIC LETTER DAD FINAL FORM +&_dd._@@ +0xfec1 ARABIC LETTER TAH ISOLATED FORM +&_tj-_@@ +0xfec2 ARABIC LETTER TAH INITIAL FORM +&_tj,_@@ +0xfec3 ARABIC LETTER TAH MEDIAL FORM +&_tj;_@@ +0xfec4 ARABIC LETTER TAH FINAL FORM +&_tj._@@ +0xfec5 ARABIC LETTER ZAH ISOLATED FORM +&_zH-_@@ +0xfec6 ARABIC LETTER ZAH INITIAL FORM +&_zH,_@@ +0xfec7 ARABIC LETTER ZAH MEDIAL FORM +&_zH;_@@ +0xfec8 ARABIC LETTER ZAH FINAL FORM +&_zH._@@ +0xfec9 ARABIC LETTER AIN ISOLATED FORM +&_e+-_@@ +0xfeca ARABIC LETTER AIN INITIAL FORM +&_e+,_@@ +0xfecb ARABIC LETTER AIN MEDIAL FORM +&_e+;_@@ +0xfecc ARABIC LETTER AIN FINAL FORM +&_e+._@@ +0xfecd ARABIC LETTER GHAIN ISOLATED FORM +&_i+-_@@ +0xfece ARABIC LETTER GHAIN INITIAL FORM +&_i+,_@@ +0xfecf ARABIC LETTER GHAIN MEDIAL FORM +&_i+;_@@ +0xfed0 ARABIC LETTER GHAIN FINAL FORM +&_i+._@@ +0xfed1 ARABIC LETTER FEH ISOLATED FORM +&_f+-_@@ +0xfed2 ARABIC LETTER FEH INITIAL FORM +&_f+,_@@ +0xfed3 ARABIC LETTER FEH MEDIAL FORM +&_f+;_@@ +0xfed4 ARABIC LETTER FEH FINAL FORM +&_f+._@@ +0xfed5 ARABIC LETTER QAF ISOLATED FORM +&_q+-_@@ +0xfed6 ARABIC LETTER QAF INITIAL FORM +&_q+,_@@ +0xfed7 ARABIC LETTER QAF MEDIAL FORM +&_q+;_@@ +0xfed8 ARABIC LETTER QAF FINAL FORM +&_q+._@@ +0xfed9 ARABIC LETTER KAF ISOLATED FORM +&_k+-_@@ +0xfeda ARABIC LETTER KAF INITIAL FORM +&_k+,_@@ +0xfedb ARABIC LETTER KAF MEDIAL FORM +&_k+;_@@ +0xfedc ARABIC LETTER KAF FINAL FORM +&_k+._@@ +0xfedd ARABIC LETTER LAM ISOLATED FORM +&_l+-_@@ +0xfede ARABIC LETTER LAM INITIAL FORM +&_l+,_@@ +0xfedf ARABIC LETTER LAM MEDIAL FORM +&_l+;_@@ +0xfee0 ARABIC LETTER LAM FINAL FORM +&_l+._@@ +0xfee1 ARABIC LETTER MEEM ISOLATED FORM +&_m+-_@@ +0xfee2 ARABIC LETTER MEEM INITIAL FORM +&_m+,_@@ +0xfee3 ARABIC LETTER MEEM MEDIAL FORM +&_m+;_@@ +0xfee4 ARABIC LETTER MEEM FINAL FORM +&_m+._@@ +0xfee5 ARABIC LETTER NOON ISOLATED FORM +&_n+-_@@ +0xfee6 ARABIC LETTER NOON INITIAL FORM +&_n+,_@@ +0xfee7 ARABIC LETTER NOON MEDIAL FORM +&_n+;_@@ +0xfee8 ARABIC LETTER NOON FINAL FORM +&_n+._@@ +0xfee9 ARABIC LETTER HEH ISOLATED FORM +&_h+-_@@ +0xfeea ARABIC LETTER HEH INITIAL FORM +&_h+,_@@ +0xfeeb ARABIC LETTER HEH MEDIAL FORM +&_h+;_@@ +0xfeec ARABIC LETTER HEH FINAL FORM +&_h+._@@ +0xfeed ARABIC LETTER WAW ISOLATED FORM +&_w+-_@@ +0xfeee ARABIC LETTER WAW FINAL FORM +&_w+._@@ +0xfeef ARABIC LETTER ALEF MAKSURA ISOLATED FORM +&_j+-_@@ +0xfef0 ARABIC LETTER ALEF MAKSURA FINAL FORM +&_j+._@@ +0xfef1 ARABIC LETTER YEH ISOLATED FORM +&_y+-_@@ +0xfef2 ARABIC LETTER YEH INITIAL FORM +&_y+,_@@ +0xfef3 ARABIC LETTER YEH MEDIAL FORM +&_y+;_@@ +0xfef4 ARABIC LETTER YEH FINAL FORM +&_y+._@@ +0xfef5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +&_lM-_@@ +0xfef6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +&_lM._@@ +0xfef7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +&_lH-_@@ +0xfef8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +&_lH._@@ +0xfef9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +&_lh-_@@ +0xfefa ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +&_lh._@@ +0xfefb ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +&_la-_@@ +0xfefc ARABIC LIGATURE LAM WITH ALEF FINAL FORM +&_la._@@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/moscow.flc b/benchmarks/paper/benchmarks/wapm/fonts/moscow.flc new file mode 100644 index 000000000..86454f175 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/moscow.flc @@ -0,0 +1,68 @@ +flc2a +# This controlfile maps the U.S. keyboard to Cyrillic +# in the style of the "moscow" font, but is meant for use +# with a FIGlet Unicode font with Cyrillic codes, such as "banner" +# +# "moscow" is an upper-case-only font, so for full compatibility +# use the "upper" controlfile as well and avoid "@" and "<". +t / \0x044c +t \0x5c \0x044a +t | \0x044b +t ~ \0x044d +t < \0x042d +t ` \0x0443 +t @ \0x042e +t > \0x0439 +t A \0x0410 +t a \0x0430 +t B \0x0411 +t b \0x0431 +t C \0x0427 +t c \0x0447 +t D \0x0414 +t d \0x0434 +t E \0x0415 +t e \0x0435 +t F \0x0424 +t f \0x0444 +t G \0x0413 +t g \0x0433 +t H \0x0425 +t h \0x0445 +t I \0x0418 +t i \0x0438 +t J \0x0416 +t j \0x0436 +t K \0x041a +t k \0x043a +t L \0x041b +t l \0x043b +t M \0x041c +t m \0x043c +t N \0x041d +t n \0x043d +t O \0x041e +t o \0x043e +t P \0x041f +t p \0x043f +t Q \0x0426 +t q \0x0446 +t R \0x0420 +t r \0x0440 +t S \0x0421 +t s \0x0441 +t T \0x0422 +t t \0x0442 +t U \0x0423 +t u \0x0443 +t V \0x0412 +t v \0x0432 +t W \0x0428 +t w \0x0448 +t X \0x0429 +t x \0x0449 +t Y \0x042f +t y \0x044f +t Z \0x0417 +t z \0x0437 +t = \-6 diff --git a/benchmarks/paper/benchmarks/wapm/fonts/script.flf b/benchmarks/paper/benchmarks/wapm/fonts/script.flf new file mode 100644 index 000000000..8f2f048fa --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/script.flf @@ -0,0 +1,1493 @@ +flf2a$ 7 5 16 0 10 0 3904 96 +Script by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@ +$$@ +$$@ +$$@@ + @ + |@ + |@ + |@ + o@ + @ + @@ + oo@ + ||@ + $$@ + $$@ + $$@ + @ + @@ + @ + | | @ + --+--+--@ + --+--+--@ + | | @ + @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @ + @ + @@ + @ + () /@ + / @ + / @ + / ()@ + @ + @@ + @ + () @ + /\ @ + / \/@ + \__/\@ + @ + @@ + o@ + /@ + $@ + $@ + $@ + @ + @@ + @ + /@ + | @ + | @ + | @ + \@ + @@ + @ + \ @ + |@ + |@ + |@ + / @ + @@ + @ + @ + \|/ @ + --*--@ + /|\ @ + @ + @@ + @ + @ + | @ + --+--@ + | @ + @ + @@ + @ + @ + @ + @ + o@ + /@ + @@ + @ + @ + @ + -----@ + $ @ + @ + @@ + @ + @ + @ + @ + o@ + @ + @@ + @ + /@ + / @ + / @ + / @ + @ + @@ + __ @ + / \ @ + | |@ + | |@ + \__/ @ + @ + @@ + ,@ + /|@ + |@ + |@ + |@ + @ + @@ + __ @ + / )@ + $/ @ + / @ + /___@ + @ + @@ + ___ @ + / \@ + $__/@ + $ \@ + \___/@ + @ + @@ + @ + | | @ + |__|_@ + | @ + | @ + @ + @@ + ____@ + | @ + |___ @ + $ \@ + \___/@ + @ + @@ + __ @ + /$ @ + | __ @ + |/ \@ + \__/@ + @ + @@ + _____@ + $ /@ + $ / @ + $/ @ + / @ + @ + @@ + __ @ + / \@ + \__/@ + / \@ + \__/@ + @ + @@ + __ @ + / |@ + \_/|@ + |@ + |@ + @ + @@ + @ + o@ + $@ + $@ + o@ + @ + @@ + @ + o@ + $@ + $@ + o@ + /@ + @@ + @ + /@ + / @ + \ @ + \@ + @ + @@ + @ + @ + -----@ + -----@ + @ + @ + @@ + @ + \ @ + \@ + /@ + / @ + @ + @@ + __ @ + / \@ + $_/@ + | @ + o @ + @ + @@ + @ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @ + @@ + ___, @ + / | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \@ + | __/@ + | \@ + |(__/@ + @ + @@ + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + @ + @@ + $____ @ + (| \ @ + | |@ + $_| |@ + (/\___/ @ + @ + @@ + ___$@ + / (_)@ + \__$ @ + / $ @ + \___/@ + @ + @@ + $______@ + (_) |$ @ + _|_$@ + / | |@ + (_/ @ + @ + @@ + @ + () |@ + /\/|@ + / |@ + /(__/ @ + @ + @@ + , @ + /| | @ + |___| @ + | |\@ + | |/@ + @ + @@ + _ @ + | |@ + | |@ + _ |/ @ + \_/\/@ + @ + @@ + @ + /\ @ + | | @ + | | @ + \_|/@ + /| @ + \| @@ + , @ + /| / @ + |__/ @ + | \$ @ + | \_/@ + @ + @@ + $_$ @ + \_|_) @ + |$ @ + $_|$ @ + (/\___/@ + @ + @@ + ,__ __ @ + /| | | @ + | | | @ + | | | @ + | | |_/@ + @ + @@ + , _ @ + /|/ \ @ + | | @ + | | @ + | |_/@ + @ + @@ + __ @ + /\_\/@ + | |@ + | |@ + \__/ @ + @ + @@ + , __ @ + /|/ \@ + |___/@ + | $@ + | $@ + @ + @@ + __ @ + / \ @ + | __ | @ + |/ \| @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \ @ + |___/ @ + | \$ @ + | \_/@ + @ + @@ + @ + () @ + /\ @ + / \@ + /(__/@ + @ + @@ + $______@ + (_) | @ + $ | @ + $_ | @ + (_/ @ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + $_ @ + (_| |_/@ + | | @ + | | @ + \_/ @ + @ + @@ + $_ @ + (_| | |_/@ + | | | @ + | | | @ + \_/ \_/ @ + @ + @@ + $_ @ + (_\ / @ + $\/ @ + $/\ @ + _/ \_/@ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \_/|/@ + /| @ + \| @@ + $__ @ + (_ \ @ + $/ @ + / @ + /__/@ + /| @ + \| @@ + _@ + | @ + | @ + | @ + | @ + |_@ + @@ + @ + \ @ + \ @ + \ @ + \@ + @ + @@ + _ @ + |@ + |@ + |@ + |@ + _|@ + @@ + /\@ + $@ + $@ + $@ + $@ + @ + @@ + @ + @ + @ + @ + $ @ + $ @ + _____@@ + o@ + \@ + $@ + $@ + $@ + @ + @@ + @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ \_@ + \_/ @ + @ + @@ + @ + @ + __ @ + /$ @ + \___/@ + @ + @@ + @ + | @ + __| @ + / | @ + \_/|_/@ + @ + @@ + @ + @ + _ @ + |/ @ + |__/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + |\ @ + |/ @@ + @ + @ + __, @ + / | @ + \_/|/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/ \ @ + | |_/@ + @ + @@ + @ + o @ + @ + | @ + |_/@ + @ + @@ + @ + o @ + @ + | @ + |/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/_) @ + | \_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + @ + @@ + @ + @ + _ _ _ @ + / |/ |/ | @ + $ | | |_/@ + @ + @@ + @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ + @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + @ + @ + _ @ + |/ \_@ + |__/ @ + /| @ + \| @@ + @ + @ + __, @ + / | @ + \_/|_/@ + |\ @ + |/ @@ + @ + @ + ,_ @ + / | @ + $ |_/@ + @ + @@ + @ + @ + , @ + / \_@ + $\/ @ + @ + @@ + @ + @ + _|_ @ + | @ + |_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + @ + @ + @ + | |_@ + $\/ @ + @ + @@ + @ + @ + @ + | | |_@ + $\/ \/ @ + @ + @@ + @ + @ + @ + /\/ @ + $/\_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ + @ + @ + __ @ + / / _@ + $/_/ @ + /| @ + \| @@ + @ + /@ + | @ + < @ + | @ + \@ + @@ + |@ + |@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + | @ + >@ + | @ + / @ + @@ + /\/@ + $ @ + $ @ + $ @ + $ @ + @ + @@ + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + |@ + @ + @@ +162 CENT SIGN + @ + @ + _|_ @ + / | @ + \_|_/@ + | @ + @@ +163 POUND SIGN + _ @ + / \ @ + __|__ @ + _| $ @ + (/ \__/@ + @ + @@ +164 CURRENCY SIGN + @ + \ _ /@ + / \ @ + \_/ @ + / \@ + @ + @@ +165 YEN SIGN + @ + \ /@ + _\_/_@ + __|__@ + | @ + @ + @@ +166 BROKEN BAR + |@ + |@ + |@ + @ + |@ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + /\@ + \/@ + _)@ + @ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + $ $@ + @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / () \ @ + | | |@ + \ \__/ / @ + \____/ @ + @@ +170 FEMININE ORDINAL INDICATOR + __, @ + / | @ + \_/|_@ + ---- @ + $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + // @ + \\ @ + \\@ + @ + @@ +172 NOT SIGN + @ + ___ @ + |@ + $ @ + $ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + @ + ----@ + $ @ + @ + @@ +174 REGISTERED SIGN + ____ @ + /, _ \ @ + //|/ \ \ @ + | |__/ |@ + \ | \_// @ + \____/ @ + @@ +175 MACRON + _____@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +176 DEGREE SIGN + _ @ + / \@ + \_/@ + @ + $ @ + @ + @@ +177 PLUS-MINUS SIGN + @ + @ + | @ + --+--@ + __|__@ + @ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + @ + $@ + @ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + @ + $ @ + @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + $@ + @ + @@ +181 MICRO SIGN + @ + @ + @ + | | @ + |\_/|_/@ + | @ + | @@ +182 PILCROW SIGN + ____ @ + / | |@ + \_| |@ + | |@ + | |@ + @ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + $ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + $ @ + _)@ + @@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + @ + $@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + __ @ + / \_@ + \__/ @ + ---- @ + $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + \\@ + //@ + // @ + @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/ @ + /|_|_@ + / | @ + @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| / @ + |/_ @ + / )@ + / /_@ + @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/ @ + /|_|_@ + / | @ + @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + _| @ + /$ @ + \__/@ + @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_), @ + / | @ + | | @ + \__/\_/@ + @ + @@ +198 LATIN CAPITAL LETTER AE + ___,___$@ + / | (_)@ + | |__ @ + | | @ + \__/\___/@ + @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + _) @ + @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +208 LATIN CAPITAL LETTER ETH + $____ @ + (| \ @ + __|__ |@ + $_| |@ + (/\___/ @ + @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/ @ + , _ @ + /|/ \ @ + | | @ + | |_/@ + @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +215 MULTIPLICATION SIGN + @ + @ + $\/$@ + $/\$@ + $ $@ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __ /@ + /\_//@ + | / |@ + | / |@ + /__/ @ + / @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \_/|/@ + /| @ + \| @@ +222 LATIN CAPITAL LETTER THORN + , @ + | __ @ + /|/ \@ + |___/@ + | $@ + @ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + @ + () @ + __, @ + / | @ + \_/|_/@ + @ + @@ +230 LATIN SMALL LETTER AE + @ + @ + __,_ @ + / |/ @ + \_/|__/@ + @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + @ + __ @ + / @ + \___/@ + _) @ + @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + @ + | @ + |_/@ + @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + @ + | @ + |_/@ + @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\ @ + @ + @ + | @ + |_/@ + @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + @ + | @ + |__/@ + @ + @@ +240 LATIN SMALL LETTER ETH + @ + \/@ + _'|@ + / |@ + \_/ @ + @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +247 DIVISION SIGN + @ + @ + O @ + -----@ + O @ + @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + @ + __/ @ + / /\_@ + \/_/ @ + / @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ +254 LATIN SMALL LETTER THORN + _ @ + | | @ + | | @ + |/ \_@ + |__/ @ + /| @ + \| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/shadow.flf b/benchmarks/paper/benchmarks/wapm/fonts/shadow.flf new file mode 100644 index 000000000..2ec918211 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/shadow.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 16 0 10 0 4992 96 +Shadow by Glenn Chappell 6/93 -- based on Standard & SmShadow +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@ + $$@@ + $|$@ + $|$@ + _|$@ + _)$@ + @@ + $| )$@ + V V$ @ + $$ @ + $$ @ + @@ + $| |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @ + @@ + $|$ @ + $ __)$@ + \__ \$@ + ( /$@ + _|$ @@ + _) /$@ + $/$ @ + $/$ @ + _/ _)$@ + @@ + $ _ )$ @ + $_ \ \$@ + $( ` <$@ + \___/\/$@ + @@ + $)$@ + /$ @ + $$ @ + $$ @ + @@ + $/$@ + $|$ @ + $|$ @ + $|$ @ + \_\$@@ + \ \$ @ + $|$@ + $|$@ + $|$@ + _/$ @@ + $\$ @ + \ /$@ + $_ _\$@ + \/$ @ + @@ + @ + $|$ @ + _ _|$@ + _|$ @ + @@ + @ + @ + @ + $)$@ + /$ @@ + @ + @ + _____|$@ + $$ @ + @@ + @ + @ + @ + _)$@ + @@ + $/$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + _ |$@ + $|$@ + $|$@ + _|$@ + @@ + ___ \$ @ + ) |$@ + $__/$ @ + _____|$@ + @@ + ___ /$ @ + _ \$ @ + ) |$@ + ____/$ @ + @@ + $| |$ @ + $| |$ @ + ___ __|$@ + _|$ @ + @@ + $___|$ @ + $__ \$ @ + ) |$@ + ____/$ @ + @@ + $/$ @ + $ _ \$ @ + $( |$@ + \___/$ @ + @@ + ___ |$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $ _ )$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + $_ \$ @ + $( |$@ + \__ |$@ + __/$ @ + @@ + @ + _)$@ + $$ @ + _)$@ + @@ + @ + _)$@ + $$ @ + $)$@ + /$ @@ + $/$@ + $/$ @ + \ \$ @ + \_\$@ + @@ + @ + _____|$@ + _____|$@ + @ + @@ + \ \$ @ + \ \$@ + $/$@ + _/$ @ + @@ + __ \$@ + $/$@ + _|$ @ + _)$ @ + @@ + $__ \$ @ + $/ _` |$@ + $| ( |$@ + \ \__,_|$@ + \____/$ @@ + $\$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + $__ )$ @ + $__ \$ @ + $| |$@ + ____/$ @ + @@ + $___|$@ + $|$ @ + $|$ @ + \____|$@ + @@ + $__ \$ @ + $| |$@ + $| |$@ + ____/$ @ + @@ + $____|$@ + $__|$ @ + $|$ @ + _____|$@ + @@ + $____|$@ + $|$ @ + $__|$ @ + _|$ @ + @@ + $___|$@ + $|$ @ + $| |$@ + \____|$@ + @@ + $| |$@ + $| |$@ + $___ |$@ + _| _|$@ + @@ + _ _|$@ + $|$ @ + $|$ @ + ___|$@ + @@ + $|$@ + $|$@ + $\ |$@ + \___/$ @ + @@ + $| /$@ + $' /$ @ + $. \$ @ + _|\_\$@ + @@ + $|$ @ + $|$ @ + $|$ @ + _____|$@ + @@ + $ \ |$@ + $|\/ |$@ + $| |$@ + _| _|$@ + @@ + $ \ |$@ + $ \ |$@ + $|\ |$@ + _| \_|$@ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + $ _ \$ @ + $| |$@ + $___/$ @ + _|$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \__\_\$@ + @@ + $ _ \$ @ + $| |$@ + $__ <$ @ + _| \_\$@ + @@ + $___|$ @ + \___ \$ @ + $|$@ + _____/$ @ + @@ + __ __|$@ + $|$ @ + $|$ @ + _|$ @ + @@ + $| |$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + \ /$ @ + $ \$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + $|$ @ + _|$ @ + @@ + __ /$@ + $/$ @ + $/$ @ + ____|$@ + @@ + $_|$@ + $|$ @ + $|$ @ + $|$ @ + __|$@@ + \ \$ @ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + $|$@ + $|$@ + $|$@ + __|$@@ + /\\$@ + $$ @ + $$ @ + $$ @ + @@ + @ + @ + @ + $$ @ + _____|$@@ + $)$@ + \|$@ + $$ @ + $$ @ + @@ + @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + $|$ @ + $__ \$ @ + $| |$@ + _.__/$ @ + @@ + @ + $__|$@ + $($ @ + \___|$@ + @@ + $|$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + @ + $_ \$@ + $ __/$@ + \___|$@ + @@ + $_|$@ + $|$ @ + $__|$@ + _|$ @ + @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + |___/$ @@ + $|$ @ + $__ \$ @ + $| | |$@ + _| |_|$@ + @@ + _)$@ + $|$@ + $|$@ + _|$@ + @@ + _)$@ + $|$@ + $|$@ + $|$@ + ___/$ @@ + $|$ @ + $| /$@ + $ <$ @ + _|\_\$@ + @@ + $|$@ + $|$@ + $|$@ + _|$@ + @@ + @ + $__ `__ \$ @ + $| | |$@ + _| _| _|$@ + @@ + @ + $__ \$ @ + $| |$@ + _| _|$@ + @@ + @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + _|$@@ + @ + $ __|$@ + $|$ @ + _|$ @ + @@ + @ + $__|$@ + \__ \$@ + ____/$@ + @@ + $|$ @ + $__|$@ + $|$ @ + \__|$@ + @@ + @ + $| |$@ + $| |$@ + \__,_|$@ + @@ + @ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + @ + \ \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + @ + \ \ /$@ + ` <$ @ + _/\_\$@ + @@ + @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ + @ + _ /$@ + $/$ @ + ___|$@ + @@ + $/$@ + $|$ @ + < <$ @ + $|$ @ + \_\$@@ + $|$@ + $|$@ + $|$@ + $|$@ + _|$@@ + \ \$ @ + $|$ @ + ` >$@ + $|$ @ + _/$ @@ + / _/$@ + $$ @ + $$ @ + $$ @ + @@ + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +160 NO-BREAK SPACE + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ +161 INVERTED EXCLAMATION MARK + _)$@ + $|$@ + $|$@ + _|$@ + @@ +162 CENT SIGN + $|$ @ + $__)$@ + $($ @ + \ )$@ + _|$ @@ +163 POUND SIGN + $,_\$ @ + _ |_$ @ + $|$ @ + _,____|$@ + @@ +164 CURRENCY SIGN + \ _ /$@ + $( |$@ + $___ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @ + @@ +166 BROKEN BAR + $|$@ + _|$@ + @ + $|$@ + _|$@@ +167 SECTION SIGN + $_)$@ + $\ \$ @ + \ \\ \$@ + \ \_/$@ + (__/$ @@ +168 DIAERESIS + _) _)$@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + $ \$ @ + $ __| \$ @ + $ ( |$@ + \ \___| /$ @ + \_____/$ @@ +170 FEMININE ORDINAL INDICATOR + $_` |$@ + \__,_|$@ + _____|$@ + $$ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $/ /$@ + $/ /$ @ + \ \ \$ @ + \_\_\$@ + @@ +172 NOT SIGN + @ + _____ |$@ + _|$@ + $$ @ + @@ +173 SOFT HYPHEN + @ + @ + _____|$@ + $$ @ + @@ +174 REGISTERED SIGN + $ \$ @ + $ _ \ \$ @ + $ / |$@ + \ _|_\ /$ @ + \_____/$ @@ +175 MACRON + _____|$@ + $$ @ + $$ @ + $$ @ + @@ +176 DEGREE SIGN + $ \$ @ + $( |$@ + \__/$ @ + $$ @ + @@ +177 PLUS-MINUS SIGN + $|$ @ + _ _|$@ + _|$ @ + _____|$@ + @@ +178 SUPERSCRIPT TWO + _ )$@ + $/$ @ + ___|$@ + $$ @ + @@ +179 SUPERSCRIPT THREE + __ /$@ + _ \$@ + ___/$@ + $$ @ + @@ +180 ACUTE ACCENT + _/$@ + $$ @ + $$ @ + $$ @ + @@ +181 MICRO SIGN + @ + $| |$@ + $| |$@ + $._,_|$@ + _|$ @@ +182 PILCROW SIGN + $ |$@ + $( | |$@ + \__ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + $$ @ + $$ @ + @@ +184 CEDILLA + @ + @ + @ + $$ @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + $|$@ + _|$@ + $$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + $_ \$@ + \___/$@ + ____|$@ + $$ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + \ \ \$@ + $/ /$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + $| / | |$ @ + _| / __ _|$@ + _/ _|$ @ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + $| /_ )$@ + _| / /$ @ + _/ ___|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + __ / /$ @ + _ \ / | |$ @ + ___/ / __ _|$@ + _/ _|$ @ + @@ +191 INVERTED QUESTION MARK + _)$ @ + $|$ @ + $/$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + $ ____|$@ + $/ __|$ @ + $__ |$ @ + _/ _____|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $___|$@ + $|$ @ + $|$ @ + \____|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$ @ + $____|$@ + $ _|_$ @ + _____|$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + $____|$@ + $ _|$ @ + _____|$@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + | |$ @ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + $|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + __ \$ @ + | |$@ + __ __| |$@ + ____/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + $ \ |$@ + $. |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +215 MULTIPLICATION SIGN + @ + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $_ /$ @ + $| / |$@ + $ / |$@ + _/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + \ /$ @ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $|$ @ + $ __ \$@ + $ ___/$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/_$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + $_ '|$@ + $( |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + $_` _ \$@ + $( __/$@ + \__,____|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $__|$@ + $($ @ + \___|$@ + _)$ @@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + $_ \$ @ + $ __/$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + $|$@ + $|$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + $|$@ + $|$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + $|$ @ + $|$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + $|$ @ + $|$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + ` <$ @ + \/\ |$@ + $__` |$@ + \____/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + $'_ \$ @ + $| |$@ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +247 DIVISION SIGN + @ + _)$ @ + _____|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $_ /\$ @ + $( / |$@ + \_/__/$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ +254 LATIN SMALL LETTER THORN + $|$ @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/slant.flf b/benchmarks/paper/benchmarks/wapm/fonts/slant.flf new file mode 100644 index 000000000..43fe3986e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 96 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/small.flf b/benchmarks/paper/benchmarks/wapm/fonts/small.flf new file mode 100644 index 000000000..c6b5bfcde --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/small.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 15 10 0 22415 96 +Small by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + @@ + _ _ @ + _| | |_ @ + |_ . _|@ + |_ _|@ + |_|_| @@ + @ + ||_@ + (_-<@ + / _/@ + || @@ + _ __ @ + (_)/ / @ + / /_ @ + /_/(_)@ + @@ + __ @ + / _|___ @ + > _|_ _|@ + \_____| @ + @@ + _ @ + ( )@ + |/ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + /_/ @@ + @ + _/\_@ + > <@ + \/ @ + @@ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + _ @ + ( )@ + |/ @@ + @ + ___ @ + |___|@ + $ @ + @@ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + /_/ @ + @@ + __ @ + / \ @ + | () |@ + \__/ @ + @@ + _ @ + / |@ + | |@ + |_|@ + @@ + ___ @ + |_ )@ + / / @ + /___|@ + @@ + ____@ + |__ /@ + |_ \@ + |___/@ + @@ + _ _ @ + | | | @ + |_ _|@ + |_| @ + @@ + ___ @ + | __|@ + |__ \@ + |___/@ + @@ + __ @ + / / @ + / _ \@ + \___/@ + @@ + ____ @ + |__ |@ + / / @ + /_/ @ + @@ + ___ @ + ( _ )@ + / _ \@ + \___/@ + @@ + ___ @ + / _ \@ + \_, /@ + /_/ @ + @@ + _ @ + (_)@ + _ @ + (_)@ + @@ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + < < @ + \_\@ + @@ + @ + ___ @ + |___|@ + |___|@ + @@ + __ @ + \ \ @ + > >@ + /_/ @ + @@ + ___ @ + |__ \@ + /_/@ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + \ \__,_|@ + \____/ @@ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + ___ @ + | _ )@ + | _ \@ + |___/@ + @@ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + ___ @ + | \ @ + | |) |@ + |___/ @ + @@ + ___ @ + | __|@ + | _| @ + |___|@ + @@ + ___ @ + | __|@ + | _| @ + |_| @ + @@ + ___ @ + / __|@ + | (_ |@ + \___|@ + @@ + _ _ @ + | || |@ + | __ |@ + |_||_|@ + @@ + ___ @ + |_ _|@ + | | @ + |___|@ + @@ + _ @ + _ | |@ + | || |@ + \__/ @ + @@ + _ __@ + | |/ /@ + | ' < @ + |_|\_\@ + @@ + _ @ + | | @ + | |__ @ + |____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + |_| |_|@ + @@ + _ _ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + | _ \@ + | _/@ + |_| @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__\_\@ + @@ + ___ @ + | _ \@ + | /@ + |_|_\@ + @@ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _____ @ + |_ _|@ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \/\/ / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + |_| @ + @@ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __ @ + | _|@ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + @@ + @ + @ + @ + ___ @ + |___|@@ + _ @ + ( )@ + \|@ + $ @ + @@ + @ + __ _ @ + / _` |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \@ + |_.__/@ + @@ + @ + __ @ + / _|@ + \__|@ + @@ + _ @ + __| |@ + / _` |@ + \__,_|@ + @@ + @ + ___ @ + / -_)@ + \___|@ + @@ + __ @ + / _|@ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + \__, |@ + |___/ @@ + _ @ + | |_ @ + | ' \ @ + |_||_|@ + @@ + _ @ + (_)@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + _/ |@ + |__/ @@ + _ @ + | |__@ + | / /@ + |_\_\@ + @@ + _ @ + | |@ + | |@ + |_|@ + @@ + @ + _ __ @ + | ' \ @ + |_|_|_|@ + @@ + @ + _ _ @ + | ' \ @ + |_||_|@ + @@ + @ + ___ @ + / _ \@ + \___/@ + @@ + @ + _ __ @ + | '_ \@ + | .__/@ + |_| @@ + @ + __ _ @ + / _` |@ + \__, |@ + |_|@@ + @ + _ _ @ + | '_|@ + |_| @ + @@ + @ + ___@ + (_-<@ + /__/@ + @@ + _ @ + | |_ @ + | _|@ + \__|@ + @@ + @ + _ _ @ + | || |@ + \_,_|@ + @@ + @ + __ __@ + \ V /@ + \_/ @ + @@ + @ + __ __ __@ + \ V V /@ + \_/\_/ @ + @@ + @ + __ __@ + \ \ /@ + /_\_\@ + @@ + @ + _ _ @ + | || |@ + \_, |@ + |__/ @@ + @ + ___@ + |_ /@ + /__|@ + @@ + __@ + / /@ + _| | @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | |_@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + @@ + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + |_|@ + @@ +162 CENT SIGN + @ + || @ + / _)@ + \ _)@ + || @@ +163 POUND SIGN + __ @ + _/ _\ @ + |_ _|_ @ + (_,___|@ + @@ +164 CURRENCY SIGN + /\_/\@ + \ . /@ + / _ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + / _)@ + /\ \ @ + \ \/ @ + (__/ @@ +168 DIAERESIS + _ _ @ + (_)(_)@ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / _| \@ + \ \__| /@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + < < < @ + \_\_\@ + @@ +172 NOT SIGN + ____ @ + |__ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + __ @ + |__|@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / | -) \@ + \ ||\\ /@ + \____/ @@ +175 MACRON + ___ @ + |___|@ + $ @ + $ @ + @@ +176 DEGREE SIGN + _ @ + /.\@ + \_/@ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ + /__|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ + |__)@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | || |@ + | .,_|@ + |_| @@ +182 PILCROW SIGN + ____ @ + / |@ + \_ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + > > >@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / |/ /__ @ + |_/ /_' |@ + /_/ |_|@ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / |/ /_ @ + |_/ /_ )@ + /_//__|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ // /__ @ + |__) /_' |@ + /_/ |_|@ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /--\ @ + /_/\_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /--\ @ + /_/\_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + /--\ @ + /_/\_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/|@ + |/\/ @ + /--\ @ + /_/\_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + __ @ + (()) @ + /--\ @ + /_/\_\@ + @@ +198 LATIN CAPITAL LETTER AE + ____ @ + /, __|@ + / _ _| @ + /_/|___|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + | -<@ + |__<@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + /_/@ + | -<@ + |__<@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + |/\|@ + | -<@ + |__<@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + | -< @ + |__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | __ \ @ + |_ _|) |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\_ @ + / __ \@ + \____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + _/_/ @ + / __ \@ + \____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + |/\| @ + / __ \@ + \____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / __ \@ + \____/@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ +215 MULTIPLICATION SIGN + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + _/_/_@ + \ V /@ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |_ @ + | -_)@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + _/_/ @ + / _` |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + / _` |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/|@ + |/\/ @ + / _` |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _` |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ___ @ + / _` -_)@ + \__,___|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + __ @ + / _|@ + \__|@ + )_)@@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / -_)@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / -_)@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / -_)@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / -_) @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + \\/\ @ + \/\\ @ + / _` |@ + \___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | ' \ @ + |_||_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \@ + \___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \@ + \___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + \___/@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / _ \@ + \___/@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + |___|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ + / //\@ + \//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\_ @ + | || |@ + \_,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + |/\| @ + | || |@ + \_,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_, |@ + |__/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \@ + | .__/@ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_, |@ + |__/ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/smscript.flf b/benchmarks/paper/benchmarks/wapm/fonts/smscript.flf new file mode 100644 index 000000000..32a8a39da --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/smscript.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 0 10 0 3904 96 +SmScript by Glenn Chappell 4/93 -- based on Script +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + @ + |@ + |@ + o@ + @@ + oo@ + ||@ + $@ + $@ + @@ + @ + _|_|_@ + _|_|_@ + | | @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @@ + @ + () / @ + / @ + / ()@ + @@ + @ + () @ + /\/@ + \/\@ + @@ + o@ + /@ + $@ + $@ + @@ + @ + /@ + | @ + | @ + \@@ + @ + \ @ + |@ + |@ + / @@ + @ + \|/ @ + --*--@ + /|\ @ + @@ + @ + | @ + --+--@ + | @ + @@ + @ + @ + @ + o@ + /@@ + @ + @ + ----@ + $ @ + @@ + @ + @ + @ + o@ + @@ + @ + /@ + / @ + / @ + @@ + _ @ + / \ @ + | |@ + \_/ @ + @@ + ,@ + /|@ + |@ + |@ + @@ + _ @ + / )@ + / @ + /__@ + @@ + ____@ + __/@ + $ \@ + \__/@ + @@ + @ + | | @ + |__|_@ + | @ + @@ + ___@ + |__ @ + $ \@ + \__/@ + @@ + _ @ + /_ @ + |/ \@ + \_/@ + @@ + ____@ + $/@ + / @ + / @ + @@ + __ @ + (__)@ + / \@ + \__/@ + @@ + __ @ + / |@ + \_/|@ + |@ + @@ + @ + o@ + $@ + o@ + @@ + @ + o@ + $@ + o@ + /@@ + @ + /@ + < @ + \@ + @@ + @ + ____@ + ____@ + $ @ + @@ + @ + \ @ + >@ + / @ + @@ + __ @ + )@ + | @ + o @ + @@ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @@ + __, @ + / | @ + | | @ + \_/\_/@ + @@ + , _ @ + /|/_)@ + | \@ + |(_/@ + @@ + __$ @ + / () @ + | $ @ + \___/@ + @@ + $___ @ + (| \ @ + | |@ + (\__/ @ + @@ + __$ @ + / () @ + >-$ @ + \___/@ + @@ + $_____@ + () |_$@ + /| |@ + (/ @ + @@ + @ + () |@ + /\/|@ + /(_/ @ + @@ + , @ + /| | @ + |--| @ + | |)@ + @@ + @ + |\ @ + _ |/ @ + \_/\/@ + @@ + @ + /| @ + | | @ + \|/@ + (| @@ + , , @ + /|_/ @ + |\ @ + | \_/@ + @@ + $ @ + \_|) @ + | @ + (\__/@ + @@ + ,_ _ @ + /| | | @ + | | | @ + | | |_/@ + @@ + , @ + /|/\ @ + | | @ + | |_/@ + @@ + __ @ + /\_\/@ + | |@ + \__/ @ + @@ + , _ @ + /|/ \@ + |__/@ + | $@ + @@ + __ @ + /__\ @ + |/ \| @ + \__/\_/@ + @@ + , _ @ + /|/ \ @ + |__/ @ + | \_/@ + @@ + @ + () @ + /\ @ + /(_)@ + @@ + $_____@ + () | @ + $| @ + (/ @ + @@ + @ + (| | @ + | | @ + \_/\_/@ + @@ + @ + (| |_/@ + | | @ + \/ @ + @@ + @ + (| | |_/@ + | | | @ + \/ \/ @ + @@ + @ + (\ / @ + >< @ + _/ \_/@ + @@ + @ + (| | @ + | | @ + \/|/@ + (| @@ + _ @ + / ) @ + / @ + /__/@ + (| @@ + _@ + | @ + | @ + | @ + |_@@ + @ + \ @ + \ @ + \@ + @@ + _ @ + |@ + |@ + |@ + _|@@ + /\@ + $@ + $@ + $@ + @@ + @ + @ + @ + $ @ + ____@@ + o@ + \@ + $@ + $@ + @@ + @ + _, @ + / | @ + \/|_/@ + @@ + @ + |) @ + |/\_@ + \/ @ + @@ + @ + _ @ + / @ + \__/@ + @@ + @ + _| @ + / | @ + \/|_/@ + @@ + @ + _ @ + |/ @ + |_/@ + @@ + @ + |\ @ + |/ @ + |_/@ + |) @@ + @ + _, @ + / | @ + \/|/@ + (| @@ + @ + |) @ + |/\ @ + | |/@ + @@ + @ + o @ + | @ + |/@ + @@ + @ + o @ + | @ + |/@ + (| @@ + @ + |) @ + |/) @ + | \/@ + @@ + @ + |\ @ + |/ @ + |_/@ + @@ + @ + @ + /|/|/| @ + $| | |_/@ + @@ + @ + @ + /|/| @ + $| |_/@ + @@ + @ + _ @ + / \_@ + \_/ @ + @@ + @ + @ + |/\_@ + |_/ @ + (| @@ + @ + _, @ + / | @ + \/|_/@ + |) @@ + @ + ,_ @ + / | @ + $ |/@ + @@ + @ + , @ + / \_@ + $\/ @ + @@ + @ + _|_ @ + | @ + |_/@ + @@ + @ + @ + | | @ + $\/|_/@ + @@ + @ + @ + | |_@ + $\/ @ + @@ + @ + @ + | | |_@ + $\/ \/ @ + @@ + @ + @ + /\/ @ + $/\/@ + @@ + @ + @ + | | @ + $\/|/@ + (| @@ + @ + __ @ + / / _@ + $/_/ @ + (| @@ + @ + /@ + _| @ + | @ + \@@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + |_@ + | @ + / @@ + /\/@ + $ @ + $ @ + $ @ + @@ + o o @ + __, @ + / | @ + \_/\_/@ + @@ + o o @ + __ @ + /\_\/@ + \__/ @ + @@ + /\/ @ + @ + (| | @ + \_/\_/@ + @@ + o o @ + _, @ + / | @ + \/|_/@ + @@ + o o @ + _ @ + / \_@ + \_/ @ + @@ + o o @ + @ + | | @ + $\/|_/@ + @@ + _ @ + | \@ + | <@ + |_/@ + | @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + @@ +162 CENT SIGN + @ + _|_ @ + / | @ + \_|_/@ + | @@ +163 POUND SIGN + _ @ + _|_` @ + | @ + (\__/@ + @@ +164 CURRENCY SIGN + \ _ /@ + / \ @ + \_/ @ + / \@ + @@ +165 YEN SIGN + \ /@ + _\_/_@ + __|__@ + | @ + @@ +166 BROKEN BAR + |@ + |@ + @ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + ()@ + _)@ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + | / () |@ + | \__/ |@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + _, @ + (_|_@ + --- @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + << @ + \\@ + @@ +172 NOT SIGN + @ + __ @ + |@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ---@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / ,_ \ @ + | /|_) |@ + | |\/ |@ + \____/ @@ +175 MACRON + ____@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + ()@ + $@ + $@ + $@ + @@ +177 PLUS-MINUS SIGN + @ + | @ + --+--@ + __|__@ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + $@ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + $ @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + @@ +181 MICRO SIGN + @ + @ + | | @ + |\/|_/@ + | @@ +182 PILCROW SIGN + ___ @ + / | |@ + \_| |@ + | |@ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + $ @ + _)@@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + $@ + @@ +186 MASCULINE ORDINAL INDICATOR + __@ + (_)@ + ---@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + >>@ + // @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/|_|_@ + / | @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| /_ @ + |/ )@ + / /_@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/|_|_@ + / | @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + | @ + (__@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + __, @ + / | @ + \_/\_/@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + __, @ + / | @ + \_/\_/@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + __, @ + / | @ + \_/\_/@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + __, @ + / | @ + \_/\_/@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + __, @ + / | @ + \_/\_/@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_) @ + / | @ + \_/\_/@ + @@ +198 LATIN CAPITAL LETTER AE + __,__$ @ + / | () @ + | |-$ @ + \_/\___/@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + __$ @ + / () @ + | $ @ + \___/@ + _) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + __$ @ + <_() @ + <___/@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + __$ @ + <_() @ + <___/@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + __$ @ + <_() @ + <___/@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + __$ @ + <_() @ + <___/@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + |\ @ + _ |/ @ + \_/\/@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + |\ @ + _ |/ @ + \_/\/@ + @@ +208 LATIN CAPITAL LETTER ETH + ___ @ + (| \ @ + -|- |@ + (\__/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + ,/\/ @ + /|/\ @ + | | @ + | |_/@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + \__/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + \__/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + \__/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + \__/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + \__/ @ + @@ +215 MULTIPLICATION SIGN + @ + $\/$@ + $/\$@ + $ $@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __/ @ + /\/\/@ + | / |@ + /__/ @ + / @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + @ + (| | @ + \_/\_/@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + @ + (| | @ + \_/\_/@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + @ + (| | @ + \_/\_/@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + /\/ @ + @ + (| | @ + \_/\_/@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + @ + (| | @ + \/|/@ + (| @@ +222 LATIN CAPITAL LETTER THORN + , @ + /|__ @ + |__)@ + | $@ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + | \@ + | <@ + |_/@ + | @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + _, @ + / | @ + \/|_/@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + _, @ + / | @ + \/|_/@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + _, @ + / | @ + \/|_/@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + _, @ + / | @ + \/|_/@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + _, @ + / | @ + \/|_/@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + () @ + _, @ + / | @ + \/|_/@ + @@ +230 LATIN SMALL LETTER AE + @ + _,_ @ + / |/ @ + \/|_/@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _ @ + / @ + \__/@ + _) @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + _ @ + |/ @ + |_/@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + _ @ + |/ @ + |_/@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + _ @ + |/ @ + |_/@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + _ @ + |/ @ + |__/@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + | @ + |/@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + | @ + |/@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\@ + @ + | @ + |/@ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + | @ + |__/@ + @@ +240 LATIN SMALL LETTER ETH + \, @ + '\ @ + / |@ + \/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + /|/| @ + $| |_/@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + _ @ + / \_@ + \_/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + _ @ + / \_@ + \_/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + _ @ + / \_@ + \_/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + _ @ + / \_@ + \_/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + _ @ + / \_@ + \_/ @ + @@ +247 DIVISION SIGN + @ + O @ + ---@ + O @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + __/ @ + / /\_@ + \/_/ @ + / @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + | | @ + $\/|_/@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + | | @ + $\/|_/@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + | | @ + $\/|_/@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + | | @ + $\/|_/@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + | | @ + $\/|/@ + (| @@ +254 LATIN SMALL LETTER THORN + @ + |) @ + |/\_@ + |_/ @ + (| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + | | @ + $\/|/@ + (| @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/smshadow.flf b/benchmarks/paper/benchmarks/wapm/fonts/smshadow.flf new file mode 100644 index 000000000..7e1329f4c --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/smshadow.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 14 0 10 0 1920 96 +SmShadow by Glenn Chappell 4/93 -- based on Small +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@@ + |$@ + _|$@ + _)$@ + @@ + | )$@ + V V$ @ + @ + @@ + | |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @@ + |$ @ + (_-<$@ + _ _/$@ + _|$ @@ + _) /$ @ + /$ @ + _/ _)$@ + @@ + _|$ @ + _| _|$@ + \____|$ @ + @@ + )$@ + /$ @ + @ + @@ + /$@ + |$ @ + |$ @ + \_\$@@ + \ \$ @ + |$@ + |$@ + _/$ @@ + \ \ /$ @ + _ _|$@ + _/ _\$ @ + @@ + |$ @ + __ __|$@ + _|$ @ + @@ + @ + @ + )$@ + /$ @@ + @ + ____|$@ + @ + @@ + @ + @ + _)$@ + @@ + /$@ + /$ @ + _/$ @ + @@ + \$ @ + ( |$@ + \__/$ @ + @@ + _ |$@ + |$@ + _|$@ + @@ + _ )$@ + /$ @ + ___|$@ + @@ + __ /$@ + _ \$@ + ___/$@ + @@ + | |$ @ + __ _|$@ + _|$ @ + @@ + __|$@ + __ \$@ + ___/$@ + @@ + /$ @ + _ \$@ + \___/$@ + @@ + __ /$@ + /$ @ + _/$ @ + @@ + _ )$@ + _ \$@ + \___/$@ + @@ + _ \$@ + \_ /$@ + _/$ @ + @@ + _)$@ + @ + _)$@ + @@ + _)$@ + @ + )$@ + /$ @@ + /$@ + < <$ @ + \_\$@ + @@ + @ + ____|$@ + ____|$@ + @@ + \ \$ @ + > >$@ + _/$ @ + @@ + __ \$@ + _/$@ + _)$ @ + @@ + __ \$ @ + / _` |$@ + \__,_|$@ + \____/$ @@ + \$ @ + _ \$ @ + _/ _\$@ + @@ + _ )$@ + _ \$@ + ___/$@ + @@ + __|$@ + ($ @ + \___|$@ + @@ + _ \$ @ + | |$@ + ___/$ @ + @@ + __|$@ + _|$ @ + ___|$@ + @@ + __|$@ + _|$ @ + _|$ @ + @@ + __|$@ + (_ |$@ + \___|$@ + @@ + | |$@ + __ |$@ + _| _|$@ + @@ + _ _|$@ + |$ @ + ___|$@ + @@ + |$@ + \ |$@ + \__/$ @ + @@ + | /$@ + . <$ @ + _|\_\$@ + @@ + |$ @ + |$ @ + ____|$@ + @@ + \ |$@ + |\/ |$@ + _| _|$@ + @@ + \ |$@ + . |$@ + _|\_|$@ + @@ + _ \$ @ + ( |$@ + \___/$ @ + @@ + _ \$@ + __/$@ + _|$ @ + @@ + _ \$ @ + ( |$@ + \__\_\$@ + @@ + _ \$@ + /$@ + _|_\$@ + @@ + __|$@ + \__ \$@ + ____/$@ + @@ + __ __|$@ + |$ @ + _|$ @ + @@ + | |$@ + | |$@ + \__/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + > <$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + _|$ @ + @@ + __ /$@ + /$ @ + ____|$@ + @@ + _|$@ + |$ @ + |$ @ + __|$@@ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + |$@ + |$@ + __|$@@ + \$ @ + /\|$@ + @ + @@ + @ + @ + @ + ____|$@@ + )$@ + \|$@ + @ + @@ + @ + _` |$@ + \__,_|$@ + @@ + |$ @ + _ \$@ + _.__/$@ + @@ + @ + _|$@ + \__|$@ + @@ + |$@ + _` |$@ + \__,_|$@ + @@ + @ + -_)$@ + \___|$@ + @@ + _|$@ + _|$@ + _|$ @ + @@ + @ + _` |$@ + \__, |$@ + ____/$ @@ + |$ @ + \$ @ + _| _|$@ + @@ + _)$@ + |$@ + _|$@ + @@ + _)$@ + |$@ + |$@ + __/$ @@ + |$ @ + | /$@ + _\_\$@ + @@ + |$@ + |$@ + _|$@ + @@ + @ + ` \$ @ + _|_|_|$@ + @@ + @ + \$ @ + _| _|$@ + @@ + @ + _ \$@ + \___/$@ + @@ + @ + _ \$@ + .__/$@ + _|$ @@ + @ + _` |$@ + \__, |$@ + _|$@@ + @ + _|$@ + _|$ @ + @@ + @ + (_-<$@ + ___/$@ + @@ + |$ @ + _|$@ + \__|$@ + @@ + @ + | |$@ + \_,_|$@ + @@ + @ + \ \ /$@ + \_/$ @ + @@ + @ + \ \ \ /$@ + \_/\_/$ @ + @@ + @ + \ \ /$@ + _\_\$@ + @@ + @ + | |$@ + \_, |$@ + ___/$ @@ + @ + _ /$@ + ___|$@ + @@ + /$@ + _ |$ @ + |$ @ + \_\$@@ + |$@ + |$@ + |$@ + _|$@@ + \ \$ @ + |_$@ + |$ @ + _/$ @@ + \ |$@ + /\/$ @ + @ + @@ + _) \_)$@ + _ \$ @ + / _\$@ + @@ + _) _)$@ + __ \$@ + \____/$@ + @@ + _) _)$@ + | |$@ + \__/$ @ + @@ + _) _)$@ + _` |$@ + \__,_|$@ + @@ + _) _)$@ + _ \$@ + \___/$@ + @@ + _) _)$@ + | |$@ + \_,_|$@ + @@ + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + _)$@ + |$@ + _|$@ + @@ +162 CENT SIGN + |$ @ + _)$@ + \ _)$@ + |$ @@ +163 POUND SIGN + _\$ @ + _ _|$ @ + _,___|$@ + @@ +164 CURRENCY SIGN + \ . /$@ + _ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @@ +166 BROKEN BAR + |$@ + _|$@ + |$@ + _|$@@ +167 SECTION SIGN + _)$@ + \ \$ @ + \ \/$ @ + __/$ @@ +168 DIAERESIS + _) _)$@ + @ + @ + @@ +169 COPYRIGHT SIGN + \$ @ + _| \$@ + \ \__| /$@ + \____/$ @@ +170 FEMININE ORDINAL INDICATOR + _` |$@ + \__,_|$@ + _____|$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + / /$@ + < < <$ @ + \_\_\$@ + @@ +172 NOT SIGN + ____ |$@ + _|$@ + @ + @@ +173 SOFT HYPHEN + @ + ___|$@ + @ + @@ +174 REGISTERED SIGN + \$ @ + -) \$@ + \ |\\ /$@ + \____/$ @@ +175 MACRON + ___|$@ + @ + @ + @@ +176 DEGREE SIGN + .\$@ + \_/$@ + @ + @@ +177 PLUS-MINUS SIGN + |$ @ + _ _|$@ + _|$ @ + _____|$@@ +178 SUPERSCRIPT TWO + _ )$@ + __|$@ + @ + @@ +179 SUPERSCRIPT THREE + _ /$@ + __)$@ + @ + @@ +180 ACUTE ACCENT + _/$@ + @ + @ + @@ +181 MICRO SIGN + @ + | |$@ + .,_|$@ + _|$ @@ +182 PILCROW SIGN + |$@ + \_ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + @ + @@ +184 CEDILLA + @ + @ + @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + _|$@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _ \$@ + \___/$@ + ____|$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + > > >$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + _| /_' |$@ + _/ _|$@ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + _| /_ )$@ + _/ __|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + _ / /$ @ + __) /_' |$@ + _/ _|$@ + @@ +191 INVERTED QUESTION MARK + _)$ @ + /$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + --\$ @ + _/\_\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + --\$ @ + _/\_\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + --\$ @ + _/\_\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + --\$ @ + _/\_\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \_)$@ + _ \$ @ + / _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + _ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + , __|$@ + _ _|$ @ + _/ ___|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + |$@ + ($ @ + \___|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$@ + -<$@ + __<$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + -<$@ + __<$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$@ + -<$@ + __<$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + -<$ @ + __<$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + _ \$ @ + _ _| |$@ + ___/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + \ |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + __ \$@ + \____/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + __ \$@ + \____/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + __ \$@ + \____/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + __ \$@ + \____/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + __ \$@ + \____/$@ + @@ +215 MULTIPLICATION SIGN + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _ /\$ @ + ( / |$@ + \_/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \__/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + | |$@ + \__/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \__/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \__/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |$ @ + -_)$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + _` |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/$ @ + _` |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + _` |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + _` |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + _` |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + _` |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + _` -_)$@ + \__,___|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _|$@ + \__|$@ + _)$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + -_)$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + -_)$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + -_)$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + -_)$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + |$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + |$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + |$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + |$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + , \'$@ + _` |$@ + \___/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + ' \$ @ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + _ \$@ + \___/$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + _ \$@ + \___/$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + _ \$@ + \___/$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$@ + _ \$@ + \___/$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + _ \$@ + \___/$@ + @@ +247 DIVISION SIGN + _)$ @ + ___|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + /\$@ + \_/_/$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \_,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + | |$@ + \_,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \_,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \_,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + | |$@ + \_, |$@ + ___/$ @@ +254 LATIN SMALL LETTER THORN + |$ @ + '_ \$@ + .__/$@ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + | |$@ + \_, |$@ + ___/$ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/smslant.flf b/benchmarks/paper/benchmarks/wapm/fonts/smslant.flf new file mode 100644 index 000000000..24284b846 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/smslant.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 14 15 10 0 22415 96 +SmSlant by Glenn Chappell 6/93 - based on Small & Slant +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $ @ + $ @ + $ @ +$ @@ + __@ + / /@ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ +$ @ + @@ + ____ @ + __/ / /_@ + /_ . __/@ +/_ __/ @ + /_/_/ @@ + @ + _//@ + (_-<@ +/ __/@ +// @@ + _ __@ +(_)_/_/@ + _/_/_ @ +/_/ (_)@ + @@ + ____ @ + / __/___@ + > _/_ _/@ +|_____/ @ + @@ + _ @ +( )@ +|/ @ +$ @ + @@ + __@ + _/_/@ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + _/_/ @ +/_/ @@ + @ + _/|@ +> _<@ +|/ @ + @@ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + _ @ +( )@ +|/ @@ + @ + ____@ +/___/@ + $ @ + @@ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ +/_/ @ + @@ + ___ @ + / _ \@ +/ // /@ +\___/ @ + @@ + ___@ + < /@ + / / @ +/_/ @ + @@ + ___ @ + |_ |@ + / __/ @ +/____/ @ + @@ + ____@ + |_ /@ + _/_ < @ +/____/ @ + @@ + ____@ + / / /@ +/_ _/@ + /_/ @ + @@ + ____@ + / __/@ + /__ \ @ +/____/ @ + @@ + ____@ + / __/@ +/ _ \ @ +\___/ @ + @@ + ____@ +/_ /@ + / / @ +/_/ @ + @@ + ___ @ + ( _ )@ +/ _ |@ +\___/ @ + @@ + ___ @ + / _ \@ + \_, /@ +/___/ @ + @@ + _ @ + (_)@ + _ @ +(_) @ + @@ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +< < @ + \_\@ + @@ + @ + ____@ + /___/@ +/___/ @ + @@ +__ @ +\ \ @ + > >@ +/_/ @ + @@ + ___ @ +/__ \@ + /__/@ +(_) @ + @@ + _____ @ + / ___ \@ +/ / _ `/@ +\ \_,_/ @ + \___/ @@ + ___ @ + / _ |@ + / __ |@ +/_/ |_|@ + @@ + ___ @ + / _ )@ + / _ |@ +/____/ @ + @@ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + ___ @ + / _ \@ + / // /@ +/____/ @ + @@ + ____@ + / __/@ + / _/ @ +/___/ @ + @@ + ____@ + / __/@ + / _/ @ +/_/ @ + @@ + _____@ + / ___/@ +/ (_ / @ +\___/ @ + @@ + __ __@ + / // /@ + / _ / @ +/_//_/ @ + @@ + ____@ + / _/@ + _/ / @ +/___/ @ + @@ + __@ + __ / /@ +/ // / @ +\___/ @ + @@ + __ __@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __ @ + / / @ + / /__@ +/____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ +/_/ /_/ @ + @@ + _ __@ + / |/ /@ + / / @ +/_/|_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + ___ @ + / _ \@ + / ___/@ +/_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\___\_\@ + @@ + ___ @ + / _ \@ + / , _/@ +/_/|_| @ + @@ + ____@ + / __/@ + _\ \ @ +/___/ @ + @@ + ______@ +/_ __/@ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + _ __@ + | | / /@ + | |/ / @ + |___/ @ + @@ + _ __@ + | | /| / /@ + | |/ |/ / @ + |__/|__/ @ + @@ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + __ __@ + \ \/ /@ + \ / @ + /_/ @ + @@ + ____@ + /_ /@ + / /_@ + /___/@ + @@ + ___@ + / _/@ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + _/ / @ +/__/ @@ + //|@ +|/||@ + $ @ +$ @ + @@ + @ + @ + @ + ____@ +/___/@@ + _ @ +( )@ + V @ +$ @ + @@ + @ + ___ _@ +/ _ `/@ +\_,_/ @ + @@ + __ @ + / / @ + / _ \@ +/_.__/@ + @@ + @ + ____@ +/ __/@ +\__/ @ + @@ + __@ + ___/ /@ +/ _ / @ +\_,_/ @ + @@ + @ + ___ @ +/ -_)@ +\__/ @ + @@ + ___@ + / _/@ + / _/ @ +/_/ @ + @@ + @ + ___ _@ + / _ `/@ + \_, / @ +/___/ @@ + __ @ + / / @ + / _ \@ +/_//_/@ + @@ + _ @ + (_)@ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + __/ / @ +|___/ @@ + __ @ + / /__@ + / '_/@ +/_/\_\ @ + @@ + __@ + / /@ + / / @ +/_/ @ + @@ + @ + __ _ @ + / ' \@ +/_/_/_/@ + @@ + @ + ___ @ + / _ \@ +/_//_/@ + @@ + @ + ___ @ +/ _ \@ +\___/@ + @@ + @ + ___ @ + / _ \@ + / .__/@ +/_/ @@ + @ + ___ _@ +/ _ `/@ +\_, / @ + /_/ @@ + @ + ____@ + / __/@ +/_/ @ + @@ + @ + ___@ + (_-<@ +/___/@ + @@ + __ @ + / /_@ +/ __/@ +\__/ @ + @@ + @ + __ __@ +/ // /@ +\_,_/ @ + @@ + @ + _ __@ +| |/ /@ +|___/ @ + @@ + @ + _ __@ +| |/|/ /@ +|__,__/ @ + @@ + @ + __ __@ + \ \ /@ +/_\_\ @ + @@ + @ + __ __@ + / // /@ + \_, / @ +/___/ @@ + @ + ___@ +/_ /@ +/__/@ + @@ + __@ + _/_/@ +_/ / @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ +/_/ @@ + __ @ + \ \ @ + / /_@ + _/_/ @ +/_/ @@ + /\//@ +//\/ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $@ + $ @ + $ @ + $ @ +$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ +/_/ @ + @@ +162 CENT SIGN + @ + __//@ +/ __/@ +\ _/ @ +// @@ +163 POUND SIGN + __ @ + __/__|@ + /_ _/_ @ +(_,___/ @ + @@ +164 CURRENCY SIGN + /|_/|@ + | . / @ + /_ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ +(_) (_)@ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / ___\ @ + / / _/ |@ +| |__/ / @ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +< < < @ + \_\_\@ + @@ +172 NOT SIGN + @ + ____@ +/_ /@ + /_/ @ + @@ +173 SOFT HYPHEN + @ + ___@ +/__/@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / / -) |@ +| //\\ / @ + \____/ @@ +175 MACRON + ____@ +/___/@ + $ @ +$ @ + @@ +176 DEGREE SIGN + __ @ + /. |@ +|__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ +/__| @ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ +/__) @ + $ @ + @@ +180 ACUTE ACCENT + __@ +/_/@ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / // /@ + / .,_/ @ +/_/ @@ +182 PILCROW SIGN + _____@ + / /@ +|_ / / @ +/_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ +$ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + __@ + < /@ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + > > >@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + __ __ @ + < /_/_/___@ +/_//_//_' /@ + /_/ /_/ @ + @@ +189 VULGAR FRACTION ONE HALF + __ __ @ + < /_/_/_ @ +/_//_/|_ )@ + /_/ /__| @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ /_/_/___@ +/__)/_//_' /@ + /_/ /_/ @ + @@ +191 INVERTED QUESTION MARK + _ @ + _(_)@ +/ _/_@ +\___/@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / - |@ +/_/|_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / - |@ +/_/|_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / - | @ +/_/|_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / - | @ +/_/|_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + _______@ + / _ __/@ + / _ _/ @ +/_//___/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + / -<@ +/__< @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / -< @ +/__< @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ + / -< @ +/__< @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / -< @ +/__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\ @ + /_ __/@ +/____/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + __/_/@ + /_ __/@ +/____/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + /_ __/@ +/____/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + /_ __/ @ +/____/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + _/ __ \@ +/_ _// /@ +/_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + __//\/ @ + / |/ / @ +/_/|__/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + _\_\ @ +/ __ \@ +\____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ +/ __ \@ +\____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ __ \@ +\____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ __ \ @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\ @ +/ /_/ /@ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __@ + __ /_/@ +/ /_/ /@ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //|@ + __|/||@ +/ /_/ /@ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __@ +__/_/@ +\ V /@ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / / @ + / -_)@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + _\_\_@ +/ _ `/@ +\_,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __@ + __/_/@ +/ _ `/@ +\_,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ `/@ +\_,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/ @ +/ _ `/ @ +\_,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + _(())@ +/ _ `/@ +\_,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ___ ___ @ +/ _ ` -_)@ +\_,____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ____@ +/ __/@ +\__/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ +/ -_)@ +\__/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ +/ -_)@ +\__/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ +/ -_)@ +\__/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ +(_)(_)@ +/ -_) @ +\__/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ +(_)_(_)@ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + _||_@ + __ || @ +/ _` | @ +\___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / _ \ @ +/_//_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + _\_\@ +/ _ \@ +\___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + _/_/@ +/ _ \@ +\___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ \ @ +\___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ _ \ @ +\___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ +247 DIVISION SIGN + _ @ + _(_)@ +/___/@ +(_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ +/ //\@ +\//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\@ +/ // /@ +\_,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __@ + __/_/@ +/ // /@ +\_,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //|@ + _|/||@ +/ // /@ +\_,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __@ + __/_/@ + / // /@ + \_, / @ +/___/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / / @ + / _ \@ + / .__/@ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + / // / @ + \_, / @ +/___/ @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/standard.flf b/benchmarks/paper/benchmarks/wapm/fonts/standard.flf new file mode 100644 index 000000000..bb15241b0 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/standard.flf @@ -0,0 +1,2238 @@ +flf2a$ 6 5 16 15 15 0 24463 229 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Modified for figlet 2.2 by John Cowan + to add Latin-{2,3,4,5} support (Unicode U+0100-017F). +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +--- + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +Modified 2012-05 by Patrick Gillespie (patorjk@gmail.com) to add the 0xCA0 character. + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + @@ + _ _ @ + _| || |_ @ + |_ .. _|@ + |_ _|@ + |_||_| @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @@ + _ __@ + (_)/ /@ + / / @ + / /_ @ + /_/(_)@ + @@ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + /_/ @@ + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + @ + _ @ + ( )@ + |/ @@ + @ + @ + _____ @ + |_____|@ + $ @ + @@ + @ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ @ + / |@ + | |@ + | |@ + |_|@ + @@ + ____ @ + |___ \ @ + __) |@ + / __/ @ + |_____|@ + @@ + _____ @ + |___ / @ + |_ \ @ + ___) |@ + |____/ @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + |_| @ + @@ + ____ @ + | ___| @ + |___ \ @ + ___) |@ + |____/ @ + @@ + __ @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @@ + _____ @ + |___ |@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + ( _ ) @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + /_/ @ + @@ + @ + _ @ + (_)@ + _ @ + (_)@ + @@ + @ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + / / @ + \ \ @ + \_\@ + @@ + @ + _____ @ + |_____|@ + |_____|@ + $ @ + @@ + __ @ + \ \ @ + \ \@ + / /@ + /_/ @ + @@ + ___ @ + |__ \@ + / /@ + |_| @ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @@ + _ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @@ + ____ @ + | __ ) @ + | _ \ @ + | |_) |@ + |____/ @ + @@ + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + @@ + ____ @ + | _ \ @ + | | | |@ + | |_| |@ + |____/ @ + @@ + _____ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @@ + _____ @ + | ___|@ + | |_ @ + | _| @ + |_| @ + @@ + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ + _ @ + | |@ + _ | |@ + | |_| |@ + \___/ @ + @@ + _ __@ + | |/ /@ + | ' / @ + | . \ @ + |_|\_\@ + @@ + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @@ + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | __/ @ + |_| @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \__\_\@ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + \ / @ + / \ @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @@ + _____@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ + __ @ + | _|@ + | | @ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + @@ + @ + @ + @ + @ + _____ @ + |_____|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @@ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ + _ @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @@ + _ @ + | |@ + | |@ + | |@ + |_|@ + @@ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @@ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_|@@ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @@ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ + @ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __@ + / /@ + | | @ + < < @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + > >@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ +162 CENT SIGN + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + | |___ @ + (_,____|@ + @@ +164 CURRENCY SIGN + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @ + @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + _ @ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + _____ @ + / ___ \ @ + / / __| \ @ + | | (__ |@ + \ \___| / @ + \_____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + \ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + _____ @ + |___ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ____ @ + |____|@ + $ @ + @@ +174 REGISTERED SIGN + _____ @ + / ___ \ @ + / | _ \ \ @ + | | / |@ + \ |_|_\ / @ + \_____/ @@ +175 MACRON + _____ @ + |_____|@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + |_| @@ +182 PILCROW SIGN + _____ @ + / |@ + | (| | |@ + \__ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + $ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \@ + / / /@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / _ @ + | |/ / | | @ + |_/ /|_ _|@ + /_/ |_| @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / /__ @ + | |/ /_ )@ + |_/ / / / @ + /_/ /___|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / _ @ + |_ \/ / | | @ + |___/ /|_ _|@ + /_/ |_| @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +198 LATIN CAPITAL LETTER AE + ______ @ + / ____|@ + / _ _| @ + / __ |___ @ + /_/ |_____|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\| @ + | ____|@ + | _|_ @ + |_____|@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + | ____|@ + | _|_ @ + |_____|@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | _ \ @ + _| |_| |@ + |__ __| |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _// @ + | |// |@ + | //| |@ + //__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \@ + | ___/@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _ '|@ + | (_| |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / _ \@ + | __/@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / _ \@ + | __/@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + | __/@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | __/ @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + _\/\ |@ + / __` |@ + \____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ +247 DIVISION SIGN + @ + _ @ + _(_)_ @ + |_____|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + ____ @ + /___/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + ___ @ + /_ _/@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ _ @ + \\_// @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + \_/ @ + ___ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + @ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + (_(@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + (_(@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + __ @ + _/_/ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + __ @ + /__/@ + / __|@ + | (__ @ + \___|@ + @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + /\ @ + _//\\@ + / ___|@ + | |___ @ + \____|@ + @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + /\ @ + /_\ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + [] @ + ____ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + [] @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + \\// @ + _\/_ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010D LATIN SMALL LETTER C WITH CARON + \\//@ + _\/ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + \\// @ + __\/ @ + | _ \ @ + | |_| |@ + |____/ @ + @@ +0x010F LATIN SMALL LETTER D WITH CARON + \/ _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + ____ @ + |_ __ \ @ + /| |/ | |@ + /|_|/_| |@ + |_____/ @ + @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + ---|@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + ____ @ + /___/ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + ____@ + /_ _/@ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE + _ _ @ + \\_// @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0115 LATIN SMALL LETTER E WITH BREVE + \\ //@ + -- @ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + [] @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + [] @ + __ @ + / _ \@ + | __/@ + \___|@ + @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + (__(@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + @ + ___ @ + / _ \@ + | __/@ + \___|@ + (_(@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + \\// @ + __\/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x011B LATIN SMALL LETTER E WITH CARON + \\//@ + \/ @ + / _ \@ + | __/@ + \___|@ + @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _/\_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + /\ @ + _/_ \@ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _\/_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011F LATIN SMALL LETTER G WITH BREVE + \___/ @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _[]_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + [] @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + )__) @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_))))@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _/ \_ @ + | / \ |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ /\ @ + | |//\ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ _ @ + | |=| |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + |=|__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + /\//@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + @ + /\/@ + | |@ + | |@ + |_|@ + @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + /___/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012B LATIN SMALL LETTER I WITH MACRON + ____@ + /___/@ + | | @ + | | @ + |_| @ + @@ +0x012C LATIN CAPITAL LETTER I WITH BREVE + \__/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012D LATIN SMALL LETTER I WITH BREVE + @ + \_/@ + | |@ + | |@ + |_|@ + @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + (__(@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + (_) @ + | | @ + | | @ + |_|_@ + (_(@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _[] @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0131 LATIN SMALL LETTER DOTLESS I + @ + _ @ + | |@ + | |@ + |_|@ + @@ +0x0132 LATIN CAPITAL LIGATURE IJ + ___ _ @ + |_ _|| |@ + | | | |@ + | |_| |@ + |__|__/ @ + @@ +0x0133 LATIN SMALL LIGATURE IJ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + |_|_/ |@ + |__/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + /\ @ + /_\|@ + _ | | @ + | |_| | @ + \___/ @ + @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + /\@ + /_\@ + | |@ + | |@ + _/ |@ + |__/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ _ @ + | |/ / @ + | ' / @ + | . \ @ + |_|\_\ @ + )__)@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + )_)@@ +0x0138 LATIN SMALL LETTER KRA + @ + _ __ @ + | |/ \@ + | < @ + |_|\_\@ + @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ //@ + | | // @ + | | @ + | |___ @ + |_____|@ + @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + //@ + | |@ + | |@ + | |@ + |_|@ + @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + )__)@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | | @ + |_| @ + )_)@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | |___ @ + |_____|@ + @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | | @ + |_| @ + @@ +0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | [] @ + | |___ @ + |_____|@ + @@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | []@ + | | @ + |_| @ + @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + __ @ + | // @ + |//| @ + // |__ @ + |_____|@ + @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + | |@ + |//@ + //|@ + |_|@ + @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _/ /_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + _ /_/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + )_) @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + )_) @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _\/ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0148 LATIN SMALL LETTER N WITH CARON + \\// @ + _\/_ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + @ + _ __ @ + ( )| '_\ @ + |/| | | |@ + |_| |_|@ + @@ +0x014A LATIN CAPITAL LETTER ENG + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \ |@ + )_)@@ +0x014B LATIN SMALL LETTER ENG + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |__ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014D LATIN SMALL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014E LATIN CAPITAL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x014F LATIN SMALL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0152 LATIN CAPITAL LIGATURE OE + ___ ___ @ + / _ \| __|@ + | | | | | @ + | |_| | |__@ + \___/|____@ + @@ +0x0153 LATIN SMALL LIGATURE OE + @ + ___ ___ @ + / _ \ / _ \@ + | (_) | __/@ + \___/ \___|@ + @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _/_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + __@ + _ /_/@ + | '__|@ + | | @ + |_| @ + @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + )_) @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + @ + _ __ @ + | '__|@ + | | @ + |_| @ + )_) @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _\_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0159 LATIN SMALL LETTER R WITH CARON + \\// @ + _\/_ @ + | '__|@ + | | @ + |_| @ + @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _/_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + __@ + _/_/@ + / __|@ + \__ \@ + |___/@ + @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _/\_ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + @ + /_\_@ + / __|@ + \__ \@ + |___/@ + @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + )__)@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + @ + ___ @ + / __|@ + \__ \@ + |___/@ + )_)@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _\_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x0161 LATIN SMALL LETTER S WITH CARON + \\//@ + _\/ @ + / __|@ + \__ \@ + |___/@ + @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + )__)@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + )_)@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ +0x0165 LATIN SMALL LETTER T WITH CARON + \/ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _____ @ + |_ _|@ + | | @ + -|-|- @ + |_| @ + @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + | |_ @ + | __|@ + |-|_ @ + \__|@ + @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + ____ @ + /__ _/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016B LATIN SMALL LETTER U WITH MACRON + ____ @ + / _ /@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \____|@ + @@ +0x016D LATIN SMALL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + O @ + __ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + O @ + __ __ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + -- --@ + /_//_/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + ____@ + _/_/_/@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + (__(@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + (_(@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX + __ /\ __@ + \ \ //\\/ /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX + /\ @ + __ //\\__@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + /\ @ + __//\\ @ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX + /\ @ + //\\ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS + [] []@ + __ _@ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + __/_/@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + _/_/@ + |_ /@ + / / @ + /___|@ + @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + __[]_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + [] @ + ____@ + |_ /@ + / / @ + /___|@ + @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _\_/_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017E LATIN SMALL LETTER Z WITH CARON + \\//@ + _\/_@ + |_ /@ + / / @ + /___|@ + @@ +0x017F LATIN SMALL LETTER LONG S + __ @ + / _|@ + |-| | @ + |-| | @ + |_| @ + @@ +0x02C7 CARON + \\//@ + \/ @ + $@ + $@ + $@ + $@@ +0x02D8 BREVE + \\_//@ + \_/ @ + $@ + $@ + $@ + $@@ +0x02D9 DOT ABOVE + []@ + $@ + $@ + $@ + $@ + $@@ +0x02DB OGONEK + $@ + $@ + $@ + $@ + $@ + )_) @@ +0x02DD DOUBLE ACUTE ACCENT + _ _ @ + /_/_/@ + $@ + $@ + $@ + $@@ +0xCA0 KANNADA LETTER TTHA + _____)@ + /_ ___/@ + / _ \ @ + | (_) | @ + $\___/$ @ + @@ diff --git a/benchmarks/paper/benchmarks/wapm/fonts/term.flf b/benchmarks/paper/benchmarks/wapm/fonts/term.flf new file mode 100644 index 000000000..e27d01eee --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fonts/term.flf @@ -0,0 +1,600 @@ +flf2a 1 1 2 -1 13 0 0 242 +Terminal by Glenn Chappell 4/93 +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Double-checked by Paul Burton 12/96. Added the new +parameter supported by FIGlet and FIGWin. Unlike all other FIGfonts, this one +is intended to produce output exactly the same as the input unless a control +file is used. Therefore it produces the SAME output for smush, kern or fit. + +@ +!@ +"@ +#@ +$@ +%@ +&@ +'@ +(@ +)@ +*@ ++@ +,@ +-@ +.@ +/@ +0@ +1@ +2@ +3@ +4@ +5@ +6@ +7@ +8@ +9@ +:@ +;@ +<@ +=@ +>@ +?@ +@# +A@ +B@ +C@ +D@ +E@ +F@ +G@ +H@ +I@ +J@ +K@ +L@ +M@ +N@ +O@ +P@ +Q@ +R@ +S@ +T@ +U@ +V@ +W@ +X@ +Y@ +Z@ +[@ +\@ +]@ +^@ +_@ +`@ +a@ +b@ +c@ +d@ +e@ +f@ +g@ +h@ +i@ +j@ +k@ +l@ +m@ +n@ +o@ +p@ +q@ +r@ +s@ +t@ +u@ +v@ +w@ +x@ +y@ +z@ +{@ +|@ +}@ +~@ +Ä@ +Ö@ +Ü@ +ä@ +ö@ +ü@ +ß@ +128 +€@ +129 +�@ +130 +‚@ +131 +ƒ@ +132 +„@ +133 +…@ +134 +†@ +135 +‡@ +136 +ˆ@ +137 +‰@ +138 +Š@ +139 +‹@ +140 +Œ@ +141 +�@ +142 +Ž@ +143 +�@ +144 +�@ +145 +‘@ +146 +’@ +147 +“@ +148 +”@ +149 +•@ +150 +–@ +151 +—@ +152 +˜@ +153 +™@ +154 +š@ +155 +›@ +156 +œ@ +157 +�@ +158 +ž@ +159 +Ÿ@ +160 NO-BREAK SPACE + @ +161 INVERTED EXCLAMATION MARK +¡@ +162 CENT SIGN +¢@ +163 POUND SIGN +£@ +164 CURRENCY SIGN +¤@ +165 YEN SIGN +¥@ +166 BROKEN BAR +¦@ +167 SECTION SIGN +§@ +168 DIAERESIS +¨@ +169 COPYRIGHT SIGN +©@ +170 FEMININE ORDINAL INDICATOR +ª@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +«@ +172 NOT SIGN +¬@ +173 SOFT HYPHEN +­@ +174 REGISTERED SIGN +®@ +175 MACRON +¯@ +176 DEGREE SIGN +°@ +177 PLUS-MINUS SIGN +±@ +178 SUPERSCRIPT TWO +²@ +179 SUPERSCRIPT THREE +³@ +180 ACUTE ACCENT +´@ +181 MICRO SIGN +µ@ +182 PILCROW SIGN +¶@ +183 MIDDLE DOT +·@ +184 CEDILLA +¸@ +185 SUPERSCRIPT ONE +¹@ +186 MASCULINE ORDINAL INDICATOR +º@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +»@ +188 VULGAR FRACTION ONE QUARTER +¼@ +189 VULGAR FRACTION ONE HALF +½@ +190 VULGAR FRACTION THREE QUARTERS +¾@ +191 INVERTED QUESTION MARK +¿@ +192 LATIN CAPITAL LETTER A WITH GRAVE +À@ +193 LATIN CAPITAL LETTER A WITH ACUTE +Á@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +Â@ +195 LATIN CAPITAL LETTER A WITH TILDE +Ã@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS +Ä@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE +Å@ +198 LATIN CAPITAL LETTER AE +Æ@ +199 LATIN CAPITAL LETTER C WITH CEDILLA +Ç@ +200 LATIN CAPITAL LETTER E WITH GRAVE +È@ +201 LATIN CAPITAL LETTER E WITH ACUTE +É@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX +Ê@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS +Ë@ +204 LATIN CAPITAL LETTER I WITH GRAVE +Ì@ +205 LATIN CAPITAL LETTER I WITH ACUTE +Í@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX +Î@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS +Ï@ +208 LATIN CAPITAL LETTER ETH +Ð@ +209 LATIN CAPITAL LETTER N WITH TILDE +Ñ@ +210 LATIN CAPITAL LETTER O WITH GRAVE +Ò@ +211 LATIN CAPITAL LETTER O WITH ACUTE +Ó@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +Ô@ +213 LATIN CAPITAL LETTER O WITH TILDE +Õ@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS +Ö@ +215 MULTIPLICATION SIGN +×@ +216 LATIN CAPITAL LETTER O WITH STROKE +Ø@ +217 LATIN CAPITAL LETTER U WITH GRAVE +Ù@ +218 LATIN CAPITAL LETTER U WITH ACUTE +Ú@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX +Û@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS +Ü@ +221 LATIN CAPITAL LETTER Y WITH ACUTE +Ý@ +222 LATIN CAPITAL LETTER THORN +Þ@ +223 LATIN SMALL LETTER SHARP S +ß@ +224 LATIN SMALL LETTER A WITH GRAVE +à@ +225 LATIN SMALL LETTER A WITH ACUTE +á@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX +â@ +227 LATIN SMALL LETTER A WITH TILDE +ã@ +228 LATIN SMALL LETTER A WITH DIAERESIS +ä@ +229 LATIN SMALL LETTER A WITH RING ABOVE +å@ +230 LATIN SMALL LETTER AE +æ@ +231 LATIN SMALL LETTER C WITH CEDILLA +ç@ +232 LATIN SMALL LETTER E WITH GRAVE +è@ +233 LATIN SMALL LETTER E WITH ACUTE +é@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX +ê@ +235 LATIN SMALL LETTER E WITH DIAERESIS +ë@ +236 LATIN SMALL LETTER I WITH GRAVE +ì@ +237 LATIN SMALL LETTER I WITH ACUTE +í@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX +î@ +239 LATIN SMALL LETTER I WITH DIAERESIS +ï@ +240 LATIN SMALL LETTER ETH +ð@ +241 LATIN SMALL LETTER N WITH TILDE +ñ@ +242 LATIN SMALL LETTER O WITH GRAVE +ò@ +243 LATIN SMALL LETTER O WITH ACUTE +ó@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX +ô@ +245 LATIN SMALL LETTER O WITH TILDE +õ@ +246 LATIN SMALL LETTER O WITH DIAERESIS +ö@ +247 DIVISION SIGN +÷@ +248 LATIN SMALL LETTER O WITH STROKE +ø@ +249 LATIN SMALL LETTER U WITH GRAVE +ù@ +250 LATIN SMALL LETTER U WITH ACUTE +ú@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX +û@ +252 LATIN SMALL LETTER U WITH DIAERESIS +ü@ +253 LATIN SMALL LETTER Y WITH ACUTE +ý@ +254 LATIN SMALL LETTER THORN +þ@ +255 LATIN SMALL LETTER Y WITH DIAERESIS +ÿ@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON +À@ +0x0101 LATIN SMALL LETTER A WITH MACRON +à@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE +Ã@ +0x0103 LATIN SMALL LETTER A WITH BREVE +ã@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK +¡@ +0x0105 LATIN SMALL LETTER A WITH OGONEK +±@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE +Æ@ +0x0107 LATIN SMALL LETTER C WITH ACUTE +æ@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +Æ@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +æ@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE +Å@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE +å@ +0x010C LATIN CAPITAL LETTER C WITH CARON +È@ +0x010D LATIN SMALL LETTER C WITH CARON +è@ +0x010E LATIN CAPITAL LETTER D WITH CARON +Ï@ +0x010F LATIN SMALL LETTER D WITH CARON +ï@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE +Ð@ +0x0111 LATIN SMALL LETTER D WITH STROKE +ð@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON +ª@ +0x0113 LATIN SMALL LETTER E WITH MACRON +º@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +Ì@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE +ì@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK +Ê@ +0x0119 LATIN SMALL LETTER E WITH OGONEK +ê@ +0x011A LATIN CAPITAL LETTER E WITH CARON +Ì@ +0x011B LATIN SMALL LETTER E WITH CARON +ì@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX +Ø@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX +ø@ +0x011E LATIN CAPITAL LETTER G WITH BREVE +«@ +0x011F LATIN SMALL LETTER G WITH BREVE +»@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +Õ@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE +õ@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA +«@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA +»@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +¦@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +¶@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE +¡@ +0x0127 LATIN SMALL LETTER H WITH STROKE +±@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE +¥@ +0x0129 LATIN SMALL LETTER I WITH TILDE +µ@ +0x012A LATIN CAPITAL LETTER I WITH MACRON +Ï@ +0x012B LATIN SMALL LETTER I WITH MACRON +ï@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK +Ç@ +0x012F LATIN SMALL LETTER I WITH OGONEK +ç@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +©@ +0x0131 LATIN SMALL LETTER DOTLESS I +¹@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +¬@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +¼@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA +Ó@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA +ó@ +0x0138 LATIN SMALL LETTER KRA +¢@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE +Å@ +0x013A LATIN SMALL LETTER L WITH ACUTE +å@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA +¦@ +0x013C LATIN SMALL LETTER L WITH CEDILLA +¶@ +0x013D LATIN CAPITAL LETTER L WITH CARON +¥@ +0x013E LATIN SMALL LETTER L WITH CARON +µ@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE +£@ +0x0142 LATIN SMALL LETTER L WITH STROKE +³@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE +Ñ@ +0x0144 LATIN SMALL LETTER N WITH ACUTE +ñ@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA +Ñ@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA +ñ@ +0x0147 LATIN CAPITAL LETTER N WITH CARON +Ò@ +0x0148 LATIN SMALL LETTER N WITH CARON +ò@ +0x014A LATIN CAPITAL LETTER ENG +½@ +0x014B LATIN SMALL LETTER ENG +¿@ +0x014C LATIN CAPITAL LETTER O WITH MACRON +Ò@ +0x014D LATIN SMALL LETTER O WITH MACRON +ò@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +Õ@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +õ@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE +À@ +0x0155 LATIN SMALL LETTER R WITH ACUTE +à@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA +£@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA +³@ +0x0158 LATIN CAPITAL LETTER R WITH CARON +Ø@ +0x0159 LATIN SMALL LETTER R WITH CARON +ø@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE +¦@ +0x015B LATIN SMALL LETTER S WITH ACUTE +¶@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX +Þ@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX +þ@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA +ª@ +0x015F LATIN SMALL LETTER S WITH CEDILLA +º@ +0x0160 LATIN CAPITAL LETTER S WITH CARON +©@ +0x0161 LATIN SMALL LETTER S WITH CARON +¹@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA +Þ@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA +þ@ +0x0164 LATIN CAPITAL LETTER T WITH CARON +«@ +0x0165 LATIN SMALL LETTER T WITH CARON +»@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE +¬@ +0x0167 LATIN SMALL LETTER T WITH STROKE +¼@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE +Ý@ +0x0169 LATIN SMALL LETTER U WITH TILDE +ý@ +0x016A LATIN CAPITAL LETTER U WITH MACRON +Þ@ +0x016B LATIN SMALL LETTER U WITH MACRON +þ@ +0x016C LATIN CAPITAL LETTER U WITH BREVE +Ý@ +0x016D LATIN SMALL LETTER U WITH BREVE +ý@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE +Ù@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE +ù@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +Û@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +û@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK +Ù@ +0x0173 LATIN SMALL LETTER U WITH OGONEK +ù@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE +¬@ +0x017A LATIN SMALL LETTER Z WITH ACUTE +¼@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE +¯@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE +¿@ +0x017D LATIN CAPITAL LETTER Z WITH CARON +®@ +0x017E LATIN SMALL LETTER Z WITH CARON +¾@ +0x02C7 CARON +·@ +0x02D8 BREVE +¢@ +0x02D9 DOT ABOVE +ÿ@ +0x02DB OGONEK +²@ +0x02DD DOUBLE ACUTE ACCENT +½@ diff --git a/benchmarks/paper/benchmarks/wapm/fortune.wasm b/benchmarks/paper/benchmarks/wapm/fortune.wasm new file mode 100755 index 000000000..7f14bf08f --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fortune.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8298c6a2615a36e4426ad4982de0a29da7a2b2da2675a49c13749e0d1aeaaf7 +size 2413765 diff --git a/benchmarks/paper/benchmarks/wapm/fortune.wasm.conf b/benchmarks/paper/benchmarks/wapm/fortune.wasm.conf new file mode 100644 index 000000000..6678312b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/fortune.wasm.conf @@ -0,0 +1 @@ +HEAD_COMMAND=("") diff --git a/benchmarks/paper/benchmarks/wapm/irb.wasm b/benchmarks/paper/benchmarks/wapm/irb.wasm new file mode 100644 index 000000000..268ba1ea1 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/irb.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:257133432664662ce6bb17f1e6b75bd512e068a53523026eddd8518d2134676b +size 17177819 diff --git a/benchmarks/paper/benchmarks/wapm/irb.wasm.conf b/benchmarks/paper/benchmarks/wapm/irb.wasm.conf new file mode 100644 index 000000000..88792599b --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/irb.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("eval") +COMMAND=('echo 3+4') diff --git a/benchmarks/paper/benchmarks/wapm/irb.wasm.expected b/benchmarks/paper/benchmarks/wapm/irb.wasm.expected new file mode 100644 index 000000000..8719b99a2 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/irb.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:774e88801102999b530c8fd2632ce04620f6bcad635824a65ad65fe038459ce6 +size 68 diff --git a/benchmarks/paper/benchmarks/wapm/irb_config.py b/benchmarks/paper/benchmarks/wapm/irb_config.py new file mode 100644 index 000000000..137ca4d16 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/irb_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + input_command = "echo 3+4" diff --git a/benchmarks/paper/benchmarks/wapm/iwasm.conf b/benchmarks/paper/benchmarks/wapm/iwasm.conf new file mode 100644 index 000000000..a5aae990f --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/iwasm.conf @@ -0,0 +1,2 @@ +VM="iwasm" +RANDOMCASE="uuid.wasm fortune.wasm md5.wasm erdtree.wasm greg.wasm zuk.wasm.conf" diff --git a/benchmarks/paper/benchmarks/wapm/md5.wasm b/benchmarks/paper/benchmarks/wapm/md5.wasm new file mode 100755 index 000000000..6f40c9684 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/md5.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21552b0d4c3d74cf464bc350d03f095ebb5f8f8c499329aca8d66af598ca15aa +size 37689 diff --git a/benchmarks/paper/benchmarks/wapm/md5.wasm.conf b/benchmarks/paper/benchmarks/wapm/md5.wasm.conf new file mode 100644 index 000000000..8c9aed11b --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/md5.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER=("helloworld") diff --git a/benchmarks/paper/benchmarks/wapm/md5_config.py b/benchmarks/paper/benchmarks/wapm/md5_config.py new file mode 100644 index 000000000..c683c510a --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/md5_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "helloworld" diff --git a/benchmarks/paper/benchmarks/wapm/parallel-small.png b/benchmarks/paper/benchmarks/wapm/parallel-small.png new file mode 100644 index 000000000..722c07275 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/parallel-small.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bb7be862485841dbc9070ec2060c91641edaea9c7b44f647ceeea0fb0f9f46d +size 43404 diff --git a/benchmarks/paper/benchmarks/wapm/pi.wasm b/benchmarks/paper/benchmarks/wapm/pi.wasm new file mode 100755 index 000000000..d544095c3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pi.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ebe0f1b08eb7e4d358b23091202aabcaa612995145afbfd1ef2d2de47c96265 +size 32845 diff --git a/benchmarks/paper/benchmarks/wapm/pi.wasm.conf b/benchmarks/paper/benchmarks/wapm/pi.wasm.conf new file mode 100644 index 000000000..46f6b77e3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pi.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER=("1") diff --git a/benchmarks/paper/benchmarks/wapm/pi.wasm.expected b/benchmarks/paper/benchmarks/wapm/pi.wasm.expected new file mode 100644 index 000000000..1efb38d31 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pi.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb1f2ac27066005633a7d08526dd06625793ff00ce9e18f8d426370ed5f0093c +size 46 diff --git a/benchmarks/paper/benchmarks/wapm/pi_config.py b/benchmarks/paper/benchmarks/wapm/pi_config.py new file mode 100644 index 000000000..7b8b11391 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pi_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "1" diff --git a/benchmarks/paper/benchmarks/wapm/pkg1.wasm b/benchmarks/paper/benchmarks/wapm/pkg1.wasm new file mode 100755 index 000000000..4ff124e96 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pkg1.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6db80cabfc853820b9568a6ed8b4fe5f5d31e6ce6b92d607355529db2be13dd0 +size 2052114 diff --git a/benchmarks/paper/benchmarks/wapm/pkg1.wasm.conf b/benchmarks/paper/benchmarks/wapm/pkg1.wasm.conf new file mode 100644 index 000000000..6678312b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pkg1.wasm.conf @@ -0,0 +1 @@ +HEAD_COMMAND=("") diff --git a/benchmarks/paper/benchmarks/wapm/pkg1.wasm.expected b/benchmarks/paper/benchmarks/wapm/pkg1.wasm.expected new file mode 100644 index 000000000..1b6c8f116 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/pkg1.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60ec319db9a3adf14d1af82d5c1debf3c9188466bb89dec2a2c3a70218fe4941 +size 16 diff --git a/benchmarks/paper/benchmarks/wapm/qr2text.wasm b/benchmarks/paper/benchmarks/wapm/qr2text.wasm new file mode 100755 index 000000000..6356fb873 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/qr2text.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee42716385c8c8b1d9ba916fcf52ff2a258a4152f4e54af2262425d1832671fe +size 497673 diff --git a/benchmarks/paper/benchmarks/wapm/qr2text.wasm.conf b/benchmarks/paper/benchmarks/wapm/qr2text.wasm.conf new file mode 100644 index 000000000..c4d6e9dfb --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/qr2text.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("eval") +PARAMETER=("https://wapm.io") diff --git a/benchmarks/paper/benchmarks/wapm/qr2text.wasm.expected b/benchmarks/paper/benchmarks/wapm/qr2text.wasm.expected new file mode 100644 index 000000000..85406da9e --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/qr2text.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b0825ab786f5e332c89420bb1c2d2ea1e707097cbe8a5590a63280053087ba7 +size 1052 diff --git a/benchmarks/paper/benchmarks/wapm/qr2text_config.py b/benchmarks/paper/benchmarks/wapm/qr2text_config.py new file mode 100644 index 000000000..6cf795a81 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/qr2text_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "https://wapm.io" diff --git a/benchmarks/paper/benchmarks/wapm/runtest_wapm.sh b/benchmarks/paper/benchmarks/wapm/runtest_wapm.sh new file mode 100755 index 000000000..3db32115c --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/runtest_wapm.sh @@ -0,0 +1,104 @@ +#!/bin/bash +set -e + +VM="$1" +work_path="case/wapm" + +function Initialization_parameters() +{ + DIR='' + COMMAND=':' + PARAMETER='' + HEAD_COMMAND='' + UNEXPECTED_CASE='' +} + +function Initialization_parameters_vm_parameters() +{ + if [ $# -eq 0 ] || [ $VM = iwasm ] + then + set -e + skip_num=0 + FAILED_CASENAME='' + source case/wapm/iwasm.conf + elif [ $VM = wasmtime ] + then + source case/wapm/wasmtime.conf + skip_num=$(echo $FAILED_CASENAME | awk -F'wasm' '{print NF-1}') + RUN_COMMAND="$work_path/$case_name" + else + echo "Parameter error,Please use the correct parameter iwasm or wasmtime,Without any parameters, iwasm is used by default" + echo -e '\n'Usage: ./case/wapm/runtest_wapm.sh [parameter]'\n' + exit 1 + fi +} + +function return_code() +{ + if [ $? -eq 0 ] + then + let pass_num+=1 + echo -e "\n\033[32m testing $case_name Pass \033[0m" + echo -e '\n' + else + let pass_num-=1 + echo -e "\033[31m testing $case_name Failed \033[0m" + echo -e "\033[31m The total number of use cases is $NUM, the test passed $pass_num use cases, the current test case is abnormal, and the abnormal use case name is $case_name \033[0m" + echo -e '\n\n' + exit 1 + fi +} + +pass_num=0;fail_num=0 +NUM=`ls $work_path | grep wasm$ | wc -l` +echo wapm-testsuite Start testing +echo -e '\n' +while read line +do + Initialization_parameters + case_name=`echo $line | awk '{print $1}'` + RUN_COMMAND="--heap-size=0 --stack-size=8000000 $work_path/$case_name" + Initialization_parameters_vm_parameters + echo '### Testing' $case_name '###' + if [[ $FAILED_CASENAME =~ $case_name ]] + then + let pass_num-=1 + elif [[ $RANDOMCASE =~ $case_name ]] + then + source $work_path/$case_name.conf + $VM $DIR $work_path/$case_name $PARAMETER + return_code + else + expected_name=`ls $work_path/$case_name`.expected + conf_name=`echo $line | awk '{print $1}'`.conf + src_str=`cat $expected_name` + source $work_path/$conf_name + + if [ "$case_name" = "$UNEXPECTED_CASE" ] + then + $HEAD_COMMAND "$COMMAND | $VM $DIR $RUN_COMMAND $PARAMETER|$PARAMETER2" |tee $expected_name + else + $HEAD_COMMAND $COMMAND | $VM $DIR $RUN_COMMAND $PARAMETER | tr -d '\000' | tee $work_path/$case_name.expected + fi + dest_str=`cat $expected_name` + + if [[ "$dest_str" = "$src_str" ]] + then + let pass_num+=1 + echo -e "\n\033[32m testing $case_name Pass \033[0m" + echo -e '\n' + else + let pass_num-=1 + echo -e "\033[31m Test case exception \033[0m" + echo -e "\033[31m The total number of use cases is $NUM, the test passed $EXPECTED_NAME use cases, the current test case is abnormal, and the abnormal use case name is $case_name \033[0m" + echo -e '\n\n' + exit 1 + fi + fi +done <<< `ls $work_path | grep wasm$` +skip_num=`echo ${CASE_NAME[@]} | grep -o '\.wasm' | wc -l` +NUM=`expr $NUM - $skip_num` +echo "### wapm-testsuite End testing" +echo IN ALL $NUM cases: $NUM PASS , 0 FAIL , 0 SKIP ; +echo -e "\033[32m wapm-testsuite TEST SUCCESSFUL \033[0m" +echo -e '\n\n' diff --git a/benchmarks/paper/benchmarks/wapm/sam.wasm b/benchmarks/paper/benchmarks/wapm/sam.wasm new file mode 100755 index 000000000..c8c9035ce --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/sam.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ce1fa91b3902c67af78a8c8ec991ff9c00b55e418b5f691f27389c16a181f72 +size 79596 diff --git a/benchmarks/paper/benchmarks/wapm/sam.wasm.conf b/benchmarks/paper/benchmarks/wapm/sam.wasm.conf new file mode 100644 index 000000000..d0def47b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/sam.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER=("-debug sam.wav") diff --git a/benchmarks/paper/benchmarks/wapm/sam.wasm.expected b/benchmarks/paper/benchmarks/wapm/sam.wasm.expected new file mode 100644 index 000000000..c0f5b54b2 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/sam.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a0df2c4b53a2694fe2cef37f3a6c1c590d4e0220ea3e333e60efaea45593cd4 +size 26678 diff --git a/benchmarks/paper/benchmarks/wapm/sam_config.py b/benchmarks/paper/benchmarks/wapm/sam_config.py new file mode 100644 index 000000000..4c680d9b3 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/sam_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "-debug sam.wav" diff --git a/benchmarks/paper/benchmarks/wapm/suggest.wasm b/benchmarks/paper/benchmarks/wapm/suggest.wasm new file mode 100755 index 000000000..92c0f749a --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/suggest.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73b1387fba8d20f42ddced687edfada988fdc2b140e7077e33aed7b80d1303a2 +size 2410533 diff --git a/benchmarks/paper/benchmarks/wapm/suggest.wasm.conf b/benchmarks/paper/benchmarks/wapm/suggest.wasm.conf new file mode 100644 index 000000000..11af01ee2 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/suggest.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER="instakk update install" diff --git a/benchmarks/paper/benchmarks/wapm/suggest.wasm.expected b/benchmarks/paper/benchmarks/wapm/suggest.wasm.expected new file mode 100644 index 000000000..1dcaa648f --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/suggest.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed5ad5668f898550f3ddd3f04cf7cc0bc7ad2cb364587819c4bb1692dd5f7c16 +size 45 diff --git a/benchmarks/paper/benchmarks/wapm/suggest_config.py b/benchmarks/paper/benchmarks/wapm/suggest_config.py new file mode 100644 index 000000000..5d156ff02 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/suggest_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "instakk update install" diff --git a/benchmarks/paper/benchmarks/wapm/tpl.wasm b/benchmarks/paper/benchmarks/wapm/tpl.wasm new file mode 100755 index 000000000..b8af0a115 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/tpl.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3abe85b37603894ee92a636f8ab54a7e0a4f3fd03cafad937602f8edca4e680f +size 1093510 diff --git a/benchmarks/paper/benchmarks/wapm/tpl.wasm.conf b/benchmarks/paper/benchmarks/wapm/tpl.wasm.conf new file mode 100644 index 000000000..c9ad5cabb --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/tpl.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +COMMAND=("echo `echo "Δ is 123456-123455."`") diff --git a/benchmarks/paper/benchmarks/wapm/tpl.wasm.expected b/benchmarks/paper/benchmarks/wapm/tpl.wasm.expected new file mode 100644 index 000000000..ef72d28d4 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/tpl.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3870e3a83d34745e2bdfa7f916668c97c3c071237e9e70e96ac5337d60283f00 +size 17 diff --git a/benchmarks/paper/benchmarks/wapm/tpl_config.py b/benchmarks/paper/benchmarks/wapm/tpl_config.py new file mode 100644 index 000000000..f2a3fd46f --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/tpl_config.py @@ -0,0 +1,5 @@ +#coding=utf-8 +from config import SuiteConfig + +class config(SuiteConfig): + input_command = "echo Δ is 123456-123455." diff --git a/benchmarks/paper/benchmarks/wapm/uuid.wasm b/benchmarks/paper/benchmarks/wapm/uuid.wasm new file mode 100755 index 000000000..cec2e3200 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/uuid.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d926c50304238d423d63f52f5f460b1a7170fe870e10f031b9cbd74b29bc06e5 +size 2470876 diff --git a/benchmarks/paper/benchmarks/wapm/uuid.wasm.conf b/benchmarks/paper/benchmarks/wapm/uuid.wasm.conf new file mode 100644 index 000000000..6678312b9 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/uuid.wasm.conf @@ -0,0 +1 @@ +HEAD_COMMAND=("") diff --git a/benchmarks/paper/benchmarks/wapm/viu.wasm b/benchmarks/paper/benchmarks/wapm/viu.wasm new file mode 100755 index 000000000..14535ce90 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/viu.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e48bfd68f658ac4916c291b536e6756c173f6ba63311c67c11ffa4b111f0bff +size 3062714 diff --git a/benchmarks/paper/benchmarks/wapm/viu.wasm.conf b/benchmarks/paper/benchmarks/wapm/viu.wasm.conf new file mode 100644 index 000000000..598feccad --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/viu.wasm.conf @@ -0,0 +1,3 @@ +DIR=('--dir=.') +HEAD_COMMAND=("eval") +PARAMETER=("case/wapm/parallel-small.png") diff --git a/benchmarks/paper/benchmarks/wapm/viu.wasm.expected b/benchmarks/paper/benchmarks/wapm/viu.wasm.expected new file mode 100644 index 000000000..7b658e3f4 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/viu.wasm.expected @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbb4025300ea725fd3dd8c3ed49d694d48bbeb7d2545128de98a403481466796 +size 74434 diff --git a/benchmarks/paper/benchmarks/wapm/viu_config.py b/benchmarks/paper/benchmarks/wapm/viu_config.py new file mode 100644 index 000000000..75ea8f455 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/viu_config.py @@ -0,0 +1,5 @@ +from config import SuiteConfig + +class config(SuiteConfig): + dir = "--dir=." + parameter = "case/wapm/parallel-small.png" diff --git a/benchmarks/paper/benchmarks/wapm/wasmtime.conf b/benchmarks/paper/benchmarks/wapm/wasmtime.conf new file mode 100644 index 000000000..2084fcdc7 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/wasmtime.conf @@ -0,0 +1 @@ +FAILED_CASENAME=("main.wasm python.wasm spidermonkey.wasm wasm3.wasm") diff --git a/benchmarks/paper/benchmarks/wapm/zuk.wasm b/benchmarks/paper/benchmarks/wapm/zuk.wasm new file mode 100644 index 000000000..6ef7eb839 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/zuk.wasm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee528faf952c9f644fb4785f5145e766c04b8a2990476dacf043c13ce3595620 +size 6142634 diff --git a/benchmarks/paper/benchmarks/wapm/zuk.wasm.conf b/benchmarks/paper/benchmarks/wapm/zuk.wasm.conf new file mode 100644 index 000000000..ef960b132 --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/zuk.wasm.conf @@ -0,0 +1,2 @@ +HEAD_COMMAND=("") +PARAMETER="generate 3 uuids" diff --git a/benchmarks/paper/benchmarks/wapm/zuk_config.py b/benchmarks/paper/benchmarks/wapm/zuk_config.py new file mode 100644 index 000000000..6fd56f26c --- /dev/null +++ b/benchmarks/paper/benchmarks/wapm/zuk_config.py @@ -0,0 +1,4 @@ +from config import SuiteConfig + +class config(SuiteConfig): + parameter = "generate 3 uuids" diff --git a/benchmarks/paper/docs/POLYBENCH_REPRODUCE.md b/benchmarks/paper/docs/POLYBENCH_REPRODUCE.md new file mode 100644 index 000000000..a7934c6b2 --- /dev/null +++ b/benchmarks/paper/docs/POLYBENCH_REPRODUCE.md @@ -0,0 +1,403 @@ +# PolyBench Reproduction Guide (DTVM / Wasmtime / Wasmer) + +This document explains how to reproduce the **correctness** and **performance** tests for **PolyBench/C (30 cases)** on **Linux x86_64**, using the three paper-aligned runtime versions. + +| Runtime | Version | Common paper xlsx columns | +|---------|---------|---------------------------| +| **DTVM (`dtvm`)** | git **`882c83155`** | `dtvm multipass`, `dtvm multipass + lazy` | +| **Wasmtime** | **31.0.0** (Cranelift) | `wasmtime` | +| **Wasmer** | **5.0.4** (LLVM backend) | `wasmer llvm` | + +The benchmark artifacts are already archived: `benchmarks/polybenchc/*.wasm` (benchmarks can run without recompiling wasm locally). + +Related documents: + +- **TTFI** (`Total compilation time`, DTVM lazy vs wasmtime 45 / wasmer 7.1): [`POLYBENCH_TTFI_REPRODUCE.md`](POLYBENCH_TTFI_REPRODUCE.md) +- Version-pin master table: [`VERSIONS.md`](../VERSIONS.md) +- paper-table column meanings and pitfalls: [`XLSX_FORMAT.md`](XLSX_FORMAT.md) +- DTVM build details: [`runtimes/dtvm/BUILD.md`](../runtimes/dtvm/BUILD.md) +- Wasmtime build details: [`runtimes/wasmtime-31.0.0/BUILD.md`](../runtimes/wasmtime-31.0.0/BUILD.md) + +--- + +## 1. Requirements + +| Item | Requirement | +|------|-------------| +| OS | Linux **x86_64** | +| Shell | bash | +| Common tools | `cmake`, `ninja`, `curl`, `python3` | +| DTVM build | GCC C++17, **LLVM 15** (e.g. `/opt/llvm15/lib/cmake/llvm`) | +| Wasmtime source build (optional) | **Rust ≥ 1.85.0** | +| Disk | cloning the DTVM source + build takes a few GB | + +Paper experiment machine (from experiment notes, for reference only): c7 8C16G, Xeon 8369B, **Turbo off**, fixed ~2.7 GHz. Identical hardware is not required for local reproduction, but CPU frequency scaling / pinning affects absolute ms. + +--- + +## 2. Getting the Data Repo + +This directory is `benchmarks/paper/` (inside the DTVM repository). + +```bash +cd /benchmarks/paper +``` + +Below, this directory is `$ROOT`: + +```bash +export ROOT="$(pwd)" +``` + +--- + +## 3. Installing the Three Runtimes + +After installation, place the binaries at the conventional repo paths (`bench_polybench_timing.sh`'s default `DTVM` / `WASMTIME` / `WASMER` read these paths). + +### 3.1 DTVM (`dtvm`) @ `882c83155` + +**Repository**: the DTVM source repository (the paper-era commit also lives in this repo's history). + +**Recommended**: use a git worktree so the main branch is untouched: + +```bash +cd /path/to/DTVM +git fetch origin +git worktree add ../DTVM_paper_882c83155 882c83155 +cd ../DTVM_paper_882c83155 +``` + +**Build** (Release, matching the paper archive): + +```bash +cmake -S . -B build_paper -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_DIR=/opt/llvm15/lib/cmake/llvm \ + -DZEN_ENABLE_SINGLEPASS_JIT=ON \ + -DZEN_ENABLE_MULTIPASS_JIT=ON \ + -DZEN_ENABLE_CHECKED_ARITHMETIC=ON + +cmake --build build_paper -j"$(nproc)" +``` + +If `FetchContent` fails to fetch dependencies, reuse `_deps` from another DTVM build on the same machine, or see [`runtimes/dtvm/BUILD.md`](../runtimes/dtvm/BUILD.md). + +Every script that launches dtvm warns on stderr if the resolved binary looks like a non-Release build — a Debug dtvm is far slower than the paper's Release configuration. + +**Install into the data repo**: + +```bash +DATA="$ROOT/runtimes/dtvm" +cp build_paper/dtvm "$DATA/dtvm" +chmod +x "$DATA/dtvm" +cp build_paper/CMakeCache.txt "$DATA/CMakeCache.txt" +"$DATA/dtvm" --help > "$DATA/version.txt" 2>&1 || true +echo "commit=882c83155" >> "$DATA/version.txt" +``` + +**Verify**: + +```bash +"$DATA/dtvm" -m multipass --disable-multipass-greedyra --disable-multipass-multithread \ + "$ROOT/benchmarks/polybenchc/atax.wasm" +# should exit 0 and print ==BEGIN DUMP_ARRAYS== etc. +``` + +`dtvm` has **no** `--version`; rely on `commit=882c83155` and `CMakeCache.txt`. + +--- + +### 3.2 Wasmtime **31.0.0** + +**Option A — official prebuilt package (recommended)** + +```bash +cd "$ROOT/runtimes/wasmtime-31.0.0" +mkdir -p out +curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz +tar xf wasmtime-v31.0.0-x86_64-linux.tar.xz +cp wasmtime-v31.0.0-x86_64-linux/wasmtime out/wasmtime +chmod +x out/wasmtime +out/wasmtime --version | tee version.txt +``` + +Expected output: + +```text +wasmtime 31.0.0 (7a9be587f 2025-03-20) +``` + +**Option B — build from source** + +```bash +cd "$ROOT/runtimes/wasmtime-31.0.0" +./build.sh all +# copy the artifact to out/wasmtime; see BUILD.md +``` + +**Verify** (any wasm in this repo): + +```bash +"$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime" run \ + "$ROOT/benchmarks/polybenchc/atax.wasm" --invoke main +``` + +--- + +### 3.3 Wasmer **5.0.4** + +**Option A — official install script (recommended)** + +```bash +cd "$ROOT/runtimes/wasmer-5.0.4" +export WASMER_DIR="$PWD/out" +curl https://get.wasmer.io -sSfL | sh -s "v5.0.4" +# the installer writes to ~/.wasmer; link the binary into this repo's out/ +mkdir -p out/bin +cp -a "$HOME/.wasmer/bin/wasmer" out/bin/ 2>/dev/null || cp -a "$WASMER_DIR/bin/wasmer" out/bin/ +ln -sf bin/wasmer out/wasmer +out/wasmer --version | tee version.txt +``` + +**Option B — download the release tarball directly** + +```bash +cd "$ROOT/runtimes/wasmer-5.0.4" +mkdir -p out/bin +curl -LO https://github.com/wasmerio/wasmer/releases/download/v5.0.4/wasmer-linux-amd64.tar.gz +tar xf wasmer-linux-amd64.tar.gz -C out/bin +ln -sf bin/wasmer out/wasmer +out/wasmer --version | tee version.txt +``` + +Expected output: + +```text +wasmer 5.0.4 +``` + +**Verify** (the paper's PolyBench column uses the LLVM backend): + +```bash +"$ROOT/runtimes/wasmer-5.0.4/out/wasmer" run \ + --llvm -q "$ROOT/benchmarks/polybenchc/atax.wasm" +``` + +--- + +## 4. One-shot Check of the Three Versions + +```bash +export ROOT=/benchmarks/paper + +test -x "$ROOT/runtimes/dtvm/dtvm" && echo "dtvm: OK ($(grep commit= "$ROOT/runtimes/dtvm/version.txt"))" +"$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime" --version +"$ROOT/runtimes/wasmer-5.0.4/out/wasmer" --version +ls "$ROOT/benchmarks/polybenchc"/*.wasm | wc -l # should be 30 +``` + +--- + +## 5. Correctness Testing (runtest) + +Use the archived `scripts/webassembly-testsuites` (which contains `runtest_webassembly.py`). **11 cases** have `.expected` output comparisons; the rest only need to exit cleanly. + +**First time**, set up the case-directory links: + +```bash +cd "$ROOT" +./scripts/setup_polybench_case.sh +``` + +**Run the three runtimes**: + +```bash +# DTVM @ 882c83155 (paper multipass: greedy RA off + multipass multithread off) +export DTVM="$ROOT/runtimes/dtvm/dtvm" +export DTVM_OPTIONS="-m multipass --disable-multipass-greedyra --disable-multipass-multithread" +./scripts/run_polybench.sh dtvm + +export WASMTIME="$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime" +./scripts/run_polybench.sh wasmtime + +export WASMER="$ROOT/runtimes/wasmer-5.0.4/out/wasmer" +# run_polybench.sh expects a path for wasmer; or run manually: +cd "$ROOT/scripts/webassembly-testsuites" +./runtest_webassembly.py -r "$ROOT/runtimes/wasmer-5.0.4/out/wasmer run --llvm" -s polybenchc +``` + +Expected: cases with expected files show **PASS**; cases without expected files just must not crash. + +--- + +## 6. Performance Testing (local timing CSV) + +Script: [`scripts/bench_polybench_timing.sh`](../scripts/bench_polybench_timing.sh) + +### 6.1 Timing Semantics (read first) + +| Item | This script's behavior | +|------|------------------------| +| Measure | **wall time (ms)** of each **separately launched process** | +| Contents | typically = process startup + **JIT compile** + execution | +| Default | **1× warmup** + **3×** timed → CSV includes `repeat_median_ms` | +| vs paper table | **not equal to** the paper table's separate Compile / Total subcolumns; see [`XLSX_FORMAT.md`](XLSX_FORMAT.md) | +| Cache asymmetry | wasmtime/wasmer keep their on-disk module cache by default (warmup fills it, so timed repeats skip compilation), while DTVM recompiles on every launch; use the `wasmtime nocache` profile or wasmer `--cache-dir=/dev/null` for cold-cache runs | + +Adjust via environment variables: + +```bash +export WARMUP=1 REPEATS=3 +``` + +### 6.2 Recommended Benchmark Commands (aligned with the paper's three columns) + +Run under `$ROOT`. **Do not** run multiple dtvm configs in parallel (avoid CPU contention). + +```bash +cd "$ROOT" +chmod +x scripts/bench_polybench_timing.sh + +export DTVM="$ROOT/runtimes/dtvm/dtvm" +export WASMTIME="$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime" +export WASMER="$ROOT/runtimes/wasmer-5.0.4/out/wasmer" + +# 1) DTVM multipass (xlsx "dtvm multipass" — inferred CLI: greedy off + MT off) +./scripts/bench_polybench_timing.sh dtvm multipass + +# 2) DTVM lazy (xlsx "dtvm multipass + lazy" — inferred CLI) +./scripts/bench_polybench_timing.sh dtvm lazy + +# 3) Wasmtime 31.0.0 +./scripts/bench_polybench_timing.sh wasmtime default + +# 4) Wasmer 5.0.4 LLVM (xlsx "wasmer llvm" Total column) +./scripts/bench_polybench_timing.sh wasmer llvm +``` + +**Optional** (local comparison only; not separate columns in the paper xlsx): + +```bash +# greedy RA + multipass multithread fully on +./scripts/bench_polybench_timing.sh dtvm multipass_greedy_mt +./scripts/bench_polybench_timing.sh dtvm lazy_greedy_mt + +# Wasmtime with module cache disabled +./scripts/bench_polybench_timing.sh wasmtime nocache +``` + +### 6.3 Actual Command Lines per Runtime + +Inside the script, the invocations are equivalent to: + +| Invocation | Command | +|------------|---------| +| `dtvm multipass` | `dtvm -m multipass --disable-multipass-greedyra --disable-multipass-multithread case.wasm` | +| `dtvm lazy` | `dtvm -m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread case.wasm` | +| `dtvm multipass_greedy_mt` | `dtvm -m multipass case.wasm` | +| `dtvm lazy_greedy_mt` | `dtvm -m multipass --enable-multipass-lazy case.wasm` | +| `wasmtime default` | `wasmtime run case.wasm --invoke main` | +| `wasmer llvm` | `wasmer run case.wasm --llvm -q` | + +### 6.4 Output Location + +CSVs are written to: + +```text +raw_data/benchs/polybench_timing___.csv +``` + +Columns: `case,runtime,profile,repeat_min_ms,repeat_mean_ms,repeat_median_ms,exit` + +After a run, the script attempts a **rough comparison** against the paper table if `raw_data/benchs/dtvm_polybench.xlsx` is present (not shipped). **Read** [`XLSX_FORMAT.md`](XLSX_FORMAT.md) **before comparing**: do not mistake a compile column (e.g. `0.935` seconds) for total. + +### 6.5 Recommended Way to Compare Against the Paper Table + +1. Compare only **Total-time** semantic columns (see the wasmer llvm, lazy total, etc. row-group notes in [`XLSX_FORMAT.md`](XLSX_FORMAT.md)). +2. Prefer the **`DTVM/Wasm/Wasmer`** ratio format (e.g. `1/1.02/7.0`), not `1:x:y` with colons. + +--- + +## 7. Full Reproduction Checklist + +```bash +# A. Environment and repo +export ROOT=/benchmarks/paper +cd "$ROOT" + +# B. Install runtimes (§3) +# - dtvm/dtvm @ 882c83155 +# - wasmtime-31.0.0/out/wasmtime +# - wasmer-5.0.4/out/wasmer + +# C. Version check (§4) + +# D. Correctness (§5) +./scripts/setup_polybench_case.sh +./scripts/run_polybench.sh dtvm +./scripts/run_polybench.sh wasmtime + +# E. Performance (§6, sequential; ~30 cases × 4 reps × 4 configs, hours) +./scripts/bench_polybench_timing.sh dtvm multipass +./scripts/bench_polybench_timing.sh dtvm lazy +./scripts/bench_polybench_timing.sh wasmtime default +./scripts/bench_polybench_timing.sh wasmer llvm +``` + +--- + +## 8. FAQ + +### `dtvm: not found` / cannot execute + +- Confirm `runtimes/dtvm/dtvm` exists and is `chmod +x`. +- Check whether the `DTVM` environment variable points at the right path. + +### Wasmtime / Wasmer version mismatch + +```bash +$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime --version # must contain 31.0.0 +$ROOT/runtimes/wasmer-5.0.4/out/wasmer --version # must be 5.0.4 +``` + +### DTVM build cannot find LLVM + +```bash +cmake -DLLVM_DIR=/opt/llvm15/lib/cmake/llvm ... +``` + +The path varies by machine; locate it with `find /opt -name LLVMConfig.cmake 2>/dev/null`. + +### Numbers differ a lot from the xlsx + +- First confirm you are comparing the **same column, same row group** (compile vs total). +- This script measures **whole-process wall time**, not the possibly compile-only split used in the paper. +- `882c83155` has **no** public CLI matching the xlsx column `dtvm multipass + exit optimization`. + +### Disabling caches (optional, matching experiment notes) + +```bash +export WASMTIME_CACHE=0 +# Wasmer: wasmer run --cache-dir=/dev/null ... +``` + +`bench_polybench_timing.sh` does **not** force cache disabling for wasmtime/wasmer by default; whether the paper's runs cleared caches is not recorded — rerun both variants if you need an exact match. + +--- + +## 9. Reference: Version and Path Cheat Sheet + +| Runtime | Version | Default binary path | +|---------|---------|---------------------| +| DTVM `dtvm` | `882c83155` | `$ROOT/runtimes/dtvm/dtvm` | +| Wasmtime | **31.0.0** | `$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime` | +| Wasmer | **5.0.4** | `$ROOT/runtimes/wasmer-5.0.4/out/wasmer` | + +| Script | Purpose | +|--------|---------| +| `scripts/setup_polybench_case.sh` | link polybench cases | +| `scripts/run_polybench.sh` | correctness runtest | +| `scripts/bench_polybench_timing.sh` | performance CSV | + +The paper's original ms table is in the paper (the xlsx is not shipped). diff --git a/benchmarks/paper/docs/POLYBENCH_TTFI_REPRODUCE.md b/benchmarks/paper/docs/POLYBENCH_TTFI_REPRODUCE.md new file mode 100644 index 000000000..abd701520 --- /dev/null +++ b/benchmarks/paper/docs/POLYBENCH_TTFI_REPRODUCE.md @@ -0,0 +1,361 @@ +# PolyBench TTFI Reproduction Guide (DTVM lazy / Wasmtime 45 / Wasmer 7.1) + +This document explains how to reproduce the **TTFI (Time To First Invocation)** comparison for **PolyBench/C (30 cases)** on **Linux x86_64**: + +- **DTVM** `multipass lazy` (same CLI as the WAPM experiment) +- **Wasmtime 45.0.0** +- **Wasmer 7.1.0** (singlepass / cranelift / llvm) + +**Metric**: the `Total compilation time` line on stdout (same as the WAPM experiment; **not** whole-process wall time). + +**Local results**: generated under `raw_data/benchs/` when running §5 (not shipped). + +Related documents: + +- PolyBench **wall-clock** reproduction: [`POLYBENCH_REPRODUCE.md`](POLYBENCH_REPRODUCE.md) +- WAPM TTFI reproduction (same metric, 20 cases): [`WAPM_TTFI_REPRODUCTION.md`](WAPM_TTFI_REPRODUCTION.md) + +--- + +## 1. What Is Measured + +### 1.1 Unified Metric + +A single line on each runtime's stdout: + +```text +Total compilation time: ms (<µs> μs) +``` + +The script parses the **microseconds** inside the parentheses and divides by 1000 to get **compile_ms** (same as WAPM's `avg_compile_time.py`). + +### 1.2 Difference from the Wall-Clock Benchmark + +| Item | TTFI (this doc) | `bench_polybench_timing.sh` | +|------|-----------------|-----------------------------| +| Measure | `Total compilation time` line | whole-process **wall time** | +| DTVM profile | **`lazy`** (WAPM protocol) | usually `multipass` / `lazy` / `multipass_greedy_mt` | +| Meaning | load + compile before first execution | startup + compile + **full execution** | +| Typical DTVM ms | **~0.45** (lazy) | seconds (includes large matrix math) | + +**Do not mix**: `-m multipass` (greedy RA + MT fully on) gives a TTFI of ~90 ms because it is **eager whole-module JIT** and cannot be compared directly with the lazy column. + +### 1.3 Per-runtime Semantics + +| Runtime | What `Total compilation time` means | +|---------|-------------------------------------| +| **dtvm (DTVM lazy)** | Load + lazy precompile + instantiation + **first** on-demand function JIT | +| **wasmtime** | `compile_module()` eager whole-module compile | +| **wasmer** | `Module::new` (requires `--cache-dir=/dev/null`) | + +--- + +## 2. Versions and Paths + +Below, `$ROOT` is the data-repo root: + +```bash +export ROOT=/benchmarks/paper +cd "$ROOT" +``` + +| Runtime | Version | Default binary | +|---------|---------|----------------| +| DTVM `dtvm` | **`c3c3fd856`** (example main HEAD) | `$ROOT/runtimes/dtvm_main/dtvm` | +| Wasmtime | **45.0.0** (with TTFI instrumentation) | `$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime` | +| Wasmer | **7.1.0** (with TTFI instrumentation) | `$ROOT/runtimes/wasmer-7.1.0/out/wasmer` or `out/bin/wasmer` | + +Benchmark: `$ROOT/benchmarks/polybenchc/*.wasm` (**30** cases, already archived; no need to recompile wasm). + +--- + +## 3. Building the Runtimes + +### 3.1 DTVM (`dtvm`, must include TTFI instrumentation) + +Build **Release** from `DTVM` (or the DTVM source fork) and install into the data repo: + +```bash +cd /path/to/DTVM +cmake -B build_main -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_DIR=/opt/llvm15/lib/cmake/llvm \ + -DZEN_ENABLE_SINGLEPASS_JIT=ON \ + -DZEN_ENABLE_MULTIPASS_JIT=ON + +cmake --build build_main -j"$(nproc)" + +mkdir -p "$ROOT/runtimes/dtvm_main" +cp build_main/dtvm "$ROOT/runtimes/dtvm_main/dtvm" +chmod +x "$ROOT/runtimes/dtvm_main/dtvm" +git rev-parse HEAD | xargs -I{} sh -c 'git log -1 --format="%H %ci %s" {}' \ + > "$ROOT/runtimes/dtvm_main/version.txt" +``` + +**Confirm the TTFI string is compiled into the binary** (required): + +```bash +strings "$ROOT/runtimes/dtvm_main/dtvm" | grep -F 'Total compilation time' +``` + +**Smoke test (lazy profile)**: + +```bash +export DTVM="$ROOT/runtimes/dtvm_main/dtvm" +cd "$ROOT/benchmarks/polybenchc" + +$DTVM atax.wasm -m multipass \ + --enable-multipass-lazy \ + --disable-multipass-greedyra \ + --disable-multipass-multithread \ + --enable-statistics +``` + +Expected: exit 0, stdout contains `Total compilation time:` and `Execution 1:`. + +> **Note**: `.wasm` must come **before all flags**. + +The TTFI implementation lives in `DTVM`'s `statistics.cpp`; the WAPM change notes are in `docs/changes/2026-05-28-wapm-ttfi-compile-time-report/`. + +### 3.2 Wasmtime 45.0.0 + +Use a source tree **already instrumented for TTFI** (`ttfi-report` feature etc.). Example local source: `/path/to/wasmtime-45.0.0`. + +```bash +cd "$ROOT/runtimes/wasmtime-45.0.0" +# If the source is not at the default path: +# export WASMER_SRC=/path/to/wasmtime-45.0.0 +./build.sh + +export WASMTIME="$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime" +export WASMTIME_CACHE=0 +``` + +**Smoke test**: + +```bash +rm -rf ~/.cache/wasmtime +$WASMTIME run "$ROOT/benchmarks/polybenchc/atax.wasm" --invoke main +# You should see Total compilation time / Execution 1 +``` + +Instrumentation details are the same as [`WAPM_TTFI_REPRODUCTION.md`](WAPM_TTFI_REPRODUCTION.md) §3.2. + +### 3.3 Wasmer 7.1.0 + +```bash +cd "$ROOT/runtimes/wasmer-7.1.0" +# If the source is not at the default path: +# export WASMER_SRC=/path/to/wasmer-7.1.0 +# the llvm backend needs LLVM 21: +export LLVM_SYS_211_PREFIX=/path/to/LLVM-21.1.8-Linux-X64 +./build.sh + +export WASMER="$ROOT/runtimes/wasmer-7.1.0/out/bin/wasmer" +# If the build output is at out/wasmer: +# export WASMER="$ROOT/runtimes/wasmer-7.1.0/out/wasmer" +``` + +**Smoke test (three backends)**: + +```bash +cd "$ROOT/benchmarks/polybenchc" +$WASMER run --singlepass --cache-dir=/dev/null atax.wasm -q +$WASMER run --cranelift --cache-dir=/dev/null atax.wasm -q +$WASMER run --llvm --cache-dir=/dev/null atax.wasm -q +``` + +--- + +## 4. One-shot Check + +```bash +export ROOT=/benchmarks/paper +export DTVM="$ROOT/runtimes/dtvm_main/dtvm" +export WASMTIME="$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime" +export WASMER="$ROOT/runtimes/wasmer-7.1.0/out/wasmer" + +test -x "$DTVM" && strings "$DTVM" | grep -q 'Total compilation time' && echo "dtvm TTFI: OK" +"$WASMTIME" --version # expect wasmtime 45.0.0 +"$WASMER" --version # expect wasmer 7.1.0 +ls "$ROOT/benchmarks/polybenchc"/*.wasm | wc -l # 30 +``` + +--- + +## 5. Benchmarking + +### 5.1 Scripts + +| Script | Purpose | +|--------|---------| +| [`scripts/run_polybench_ttfi_compare.sh`](../scripts/run_polybench_ttfi_compare.sh) | single runtime: run 30 cases → `results.csv` + `COMPARE.md` | +| [`scripts/run_polybench_ttfi_round.sh`](../scripts/run_polybench_ttfi_round.sh) | full flow: DTVM lazy + wasmtime + wasmer's three backends → merged table | +| [`scripts/build_polybench_ttfi_table.py`](../scripts/build_polybench_ttfi_table.py) | merge multiple `results.csv` into a comparison md/csv | + +**Actual per-runtime command lines** (inside the scripts): + +| Invocation | Command | +|------------|---------| +| `dtvm lazy` | `dtvm case.wasm -m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread --enable-statistics` | +| `dtvm multipass_greedy_mt` | `dtvm case.wasm -m multipass --enable-statistics` (**reference column**, not the WAPM lazy protocol) | +| `wasmtime default` | `wasmtime run case.wasm --invoke main` | +| `wasmer singlepass` | `wasmer run --singlepass --cache-dir=/dev/null case.wasm -q` | +| `wasmer cranelift` | `wasmer run --cranelift --cache-dir=/dev/null case.wasm -q` | +| `wasmer llvm` | `wasmer run --llvm --cache-dir=/dev/null case.wasm -q` | + +### 5.2 Cache and Cold Start (required) + +| Runtime | Setting | +|---------|---------| +| **wasmtime** | `export WASMTIME_CACHE=0`; `rm -rf ~/.cache/wasmtime` before each run (script's `CLEAR_WASMTIME_CACHE=1` is on by default) | +| **wasmer** | `--cache-dir=/dev/null` every run | +| **dtvm** | no cross-run module cache; fresh process each time | + +### 5.3 One-shot Full Flow (recommended) + +Default is **1 repeat per case** (TTFI variance is small; pass `3` for more stability): + +```bash +cd "$ROOT" + +export DTVM="$ROOT/runtimes/dtvm_main/dtvm" +export WASMTIME="$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime" +export WASMER="$ROOT/runtimes/wasmer-7.1.0/out/wasmer" +export WASMTIME_CACHE=0 + +./scripts/run_polybench_ttfi_round.sh 1 +``` + +Output: + +```text +raw_data/benchs/polybench_ttfi_/ + dtvm_lazy/results.csv + dtvm_multipass_greedy_mt/results.csv # reference column (optional) + wasmtime45/results.csv + wasmer_singlepass/results.csv + wasmer_cranelift/results.csv + wasmer_llvm/results.csv + table/polybench_ttfi_compare.{md,csv} + +raw_data/benchs/polybench_ttfi_compare_latest.{md,csv} # copy +``` + +**Duration**: about **30–90 minutes** (large cases like `cholesky`/`ludcmp` execute slowly; only the compile line is measured, but the wasm still has to run to first execution). + +**Background run** (survives SSH disconnect): + +```bash +nohup ./scripts/run_polybench_ttfi_round.sh 1 \ + > /tmp/polybench_ttfi_round.log 2>&1 & +echo "PID=$! log=/tmp/polybench_ttfi_round.log" +``` + +### 5.4 Partial Rerun (DTVM lazy column only) + +If wasmtime/wasmer results already exist and only the DTVM lazy column needs a rerun: + +```bash +cd "$ROOT" +export DTVM="$ROOT/runtimes/dtvm_main/dtvm" + +BENCH="$ROOT/raw_data/benchs/polybench_ttfi_20260531_091216" # existing data dir (from your own earlier round) +OUT="$BENCH/dtvm_lazy" + +./scripts/run_polybench_ttfi_compare.sh dtvm lazy 1 "$OUT" + +# merge the table (lazy as the main column, greedy_mt as reference) +export BENCH_ROOT="$BENCH" OUT_DIR="$BENCH/table" +export DTVM_CSV="$OUT/results.csv" +export DTVM_GREEDY_CSV="$BENCH/dtvm_multipass_greedy_mt/results.csv" +export WT_CSV="$BENCH/wasmtime45/results.csv" +export WASMER_SP_CSV="$BENCH/wasmer_singlepass/results.csv" +export WASMER_CF_CSV="$BENCH/wasmer_cranelift/results.csv" +export WASMER_LLVM_CSV="$BENCH/wasmer_llvm/results.csv" +export DTVM_VERSION="$ROOT/runtimes/dtvm_main/version.txt" + +python3 scripts/build_polybench_ttfi_table.py + +cp "$BENCH/table/polybench_ttfi_compare.md" \ + "$ROOT/raw_data/benchs/polybench_ttfi_compare_latest.md" +cp "$BENCH/table/polybench_ttfi_compare.csv" \ + "$ROOT/raw_data/benchs/polybench_ttfi_compare_latest.csv" +``` + +### 5.5 Single-runtime Examples + +```bash +REPEATS=1 +BENCH="$ROOT/raw_data/benchs/polybench_ttfi_manual" + +DTVM=$DTVM ./scripts/run_polybench_ttfi_compare.sh dtvm lazy "$REPEATS" "$BENCH/dtvm_lazy" +WASMTIME=$WASMTIME ./scripts/run_polybench_ttfi_compare.sh wasmtime default "$REPEATS" "$BENCH/wasmtime45" +WASMER=$WASMER ./scripts/run_polybench_ttfi_compare.sh wasmer singlepass "$REPEATS" "$BENCH/wasmer_sp" +WASMER=$WASMER ./scripts/run_polybench_ttfi_compare.sh wasmer cranelift "$REPEATS" "$BENCH/wasmer_cf" +WASMER=$WASMER ./scripts/run_polybench_ttfi_compare.sh wasmer llvm "$REPEATS" "$BENCH/wasmer_llvm" +``` + +Each subdirectory contains: + +- `logs/_1.log` — raw stdout +- `results.csv` — `case,compile_ms,execution_ms` +- `COMPARE.md` — single-runtime summary + +--- + +## 6. Full Reproduction Checklist + +```bash +# A. Repo +export ROOT=/benchmarks/paper +cd "$ROOT" + +# B. Build runtimes (§3) +# - dtvm_main/dtvm (with the Total compilation time string) +# - wasmtime-45.0.0/out/wasmtime (TTFI instrumentation) +# - wasmer-7.1.0/out/wasmer (TTFI instrumentation + optional llvm) + +# C. Version check (§4) + +# D. TTFI benchmark (§5.3, sequential — do not run multiple dtvm in parallel) +export WASMTIME_CACHE=0 +./scripts/run_polybench_ttfi_round.sh 1 + +# E. View results +less raw_data/benchs/polybench_ttfi_compare_latest.md +``` + +--- + +## 7. FAQ + +### `dtvm: binary missing TTFI strings` + +- The `dtvm` in use is too old or was built without the WAPM TTFI change; rebuild from **main HEAD** (or a tree containing the `2026-05-28-wapm-ttfi` change). + +### DTVM lazy is ~0.4 ms while greedy_mt is ~90 ms — which is right? + +- **The TTFI comparison lazy column uses the `lazy` profile** (§1.2). +- `multipass_greedy_mt` compiles the whole module eagerly, so its compile time approaches the compile segment of wall-time — it **cannot** represent the WAPM lazy TTFI. + +### wasmtime compile suddenly drops to ~1 ms + +- `~/.cache/wasmtime` was not cleared or `WASMTIME_CACHE=0` was not set; confirm the script's `CLEAR_WASMTIME_CACHE=1`. + +### Numbers differ by orders of magnitude from `bench_polybench_timing.sh` + +- Expected: wall-clock includes the **full PolyBench computation** (seconds); TTFI only measures **pre-first-execution compilation** (milliseconds). + +### PolyBench cases have no conf files + +- Unlike WAPM, PolyBench wasm uniformly uses `--invoke main` (wasmtime) or direct execution (dtvm/wasmer); no `.wasm.conf` is needed. + +--- + +## 8. Path Reference + +| Item | Path | +|------|------| +| This document | `$ROOT/docs/POLYBENCH_TTFI_REPRODUCE.md` | +| Latest comparison table | `$ROOT/raw_data/benchs/polybench_ttfi_compare_latest.md` (generated) | +| Case wasm | `$ROOT/benchmarks/polybenchc/*.wasm` | diff --git a/benchmarks/paper/docs/WAPM_TTFI_REPRODUCTION.md b/benchmarks/paper/docs/WAPM_TTFI_REPRODUCTION.md new file mode 100644 index 000000000..6ab6fc56f --- /dev/null +++ b/benchmarks/paper/docs/WAPM_TTFI_REPRODUCTION.md @@ -0,0 +1,340 @@ +# WAPM `Total compilation time` Reproduction Guide + +This document explains how to reproduce the paper's **Post-Loading & Compilation** experiment locally: comparing `Total compilation time` across **dtvm (DTVM lazy)**, **wasmtime 45.0.0**, and **wasmer 7.1.0** (cranelift / singlepass / llvm) on the WAPM **20 cases**. + +**Paper table**: the paper's WAPM lazy-TTFI table (not shipped) +**Local summary**: generated under `raw_data/benchs/` when running §4 +**Case and conf details**: `benchmarks/wapm/WAPM_REPRODUCE.md` + +--- + +## 1. What Is Measured + +### 1.1 Unified Metric + +A single line on each runtime's stdout: + +```text +Total compilation time: ms (<µs> μs) +``` + +- Parse the **microseconds** inside the parentheses; average over runs, then divide by 1000 to get ms (same as `scripts/avg_compile_time.py`). +- The paper table's lazy / wasmtime / wasmer columns were produced from per-runtime compile logs (the logs themselves are not shipped). + +### 1.2 Per-runtime Semantics + +| Runtime | What `Total compilation` means | +|---------|--------------------------------| +| **dtvm (DTVM multipass lazy)** | **Load** + JIT lazy precompilation + instantiation + **first** on-demand Fg JIT | +| **wasmtime** | `compile_module()` eager whole-module compile | +| **wasmer** | `Module::new` (module cache must be disabled) | + +### 1.3 Metrics That Must Not Be Mixed + +| Metric | Note | +|--------|------| +| The `Total:` line in statistics | includes the whole Load/Fg/Bg/Release; **not** the compile column | +| Shell wall-clock / `test_lazy.sh`'s `Average time` | much larger than the compile line; cannot be compared directly with the paper's compile column | + +The dtvm formula is implemented in `DTVM/src/utils/statistics.cpp` (change: `DTVM/docs/changes/2026-05-28-wapm-ttfi-compile-time-report/`). + +--- + +## 2. Environment and Layout + +### 2.1 Dependencies + +| Component | Requirement | +|-----------|-------------| +| OS | Linux x86_64 | +| DTVM | CMake 3.x, C++ compiler | +| wasmtime / wasmer | Rust stable + `source ~/.cargo/env` | +| wasmer **llvm** | **LLVM 21** (wasmer 7.1 uses `llvm-sys-211`) | +| Python | 3.x stdlib (table-merge script) | + +### 2.2 Recommended Directory Layout + +```text +~/ +├── DTVM/ # dtvm source and build/dtvm +├── wasmtime-45.0.0/ # wasmtime source with TTFI instrumentation +├── wasmer-7.1.0/ # wasmer source with TTFI instrumentation +├── LLVM-21.1.8-Linux-X64/ # wasmer llvm backend (see §3.4) +└── benchmarks/paper/ + ├── benchmarks/wapm/ # *.wasm + *.wasm.conf + ├── runtimes/ + │ ├── wasmtime-45.0.0/build.sh + │ └── wasmer-7.1.0/build.sh + ├── scripts/ # benchmark + table-merge scripts + └── docs/WAPM_TTFI_REPRODUCTION.md # this document +``` + +### 2.3 Case List (20) + +```text +amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet +irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +``` + +`fortune` stands in for the paper table's `zuk` (the rerun used `fortune`, a case verified runnable in this harness, in place of `zuk`). + +--- + +## 3. Building the Runtimes + +### 3.1 dtvm (DTVM) + +```bash +cd /path/to/DTVM +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j6 --target dtvm + +export DTVM=/path/to/DTVM/build/dtvm +``` + +All scripts that launch dtvm warn on stderr if the resolved binary looks like a non-Release build (Debug `CMAKE_BUILD_TYPE` in the neighboring `CMakeCache.txt`, or embedded debug info otherwise) — a Debug dtvm is far slower than the paper's Release build. + +**Confirm the instrumentation is in the binary**: + +```bash +strings "$DTVM" | grep -F 'Total compilation time' +``` + +**Run flags (the paper's lazy multipass)**: + +```bash +cd benchmarks/paper/benchmarks/wapm + +$DTVM echo.wasm -m multipass \ + --enable-multipass-lazy \ + --disable-multipass-greedyra \ + --disable-multipass-multithread \ + --enable-statistics \ + --args 1234567890 +``` + +**Note**: `INPUT_FILE` (`.wasm`) must come **before all flags**, or the CLI reports `INPUT_FILE is required`. + +### 3.2 wasmtime 45.0.0 + +The source must already contain the TTFI instrumentation (`src/ttfi_report.rs`, the `ttfi-report` feature in `Cargo.toml`, etc.). If not yet cloned: + +```bash +git clone --depth 1 --branch v45.0.0 \ + https://github.com/bytecodealliance/wasmtime.git \ + /path/to/wasmtime-45.0.0 +# then apply the same ttfi-report modifications used in the paper +``` + +Build and install: + +```bash +cd benchmarks/paper/runtimes/wasmtime-45.0.0 +WASMER_SRC=/path/to/wasmtime-45.0.0 ./build.sh # variable kept for historical reasons; points to the wasmtime source + +export WASMTIME=$PWD/out/wasmtime +export WASMTIME_CACHE=0 +``` + +**Smoke test**: + +```bash +rm -rf ~/.cache/wasmtime +cd benchmarks/paper/benchmarks/wapm +$WASMTIME run echo.wasm 1234567890 +# You should see Creating mmap / Total compilation time / Execution 1 +``` + +### 3.3 wasmer 7.1.0 (cranelift + singlepass + llvm) + +```bash +git clone --depth 1 --branch v7.1.0 \ + https://github.com/wasmerio/wasmer.git \ + /path/to/wasmer-7.1.0 +# then apply the TTFI instrumentation (lib/wasix/src/ttfi_report.rs etc.) +``` + +### 3.4 LLVM 21 (wasmer llvm backend) + +wasmer **7.1.0** requires **LLVM 21** (not LLVM 18). Local example: + +```bash +# If you only have the tarball: +cd ~ +tar -xf LLVM-21.1.8-Linux-X64.tar.xz + +export LLVM_SYS_211_PREFIX=$HOME/LLVM-21.1.8-Linux-X64 +$LLVM_SYS_211_PREFIX/bin/llvm-config --version # should print 21.1.8 +``` + +Build wasmer (auto-detects LLVM 21 and enables the `llvm` feature): + +```bash +cd benchmarks/paper/runtimes/wasmer-7.1.0 +LLVM_SYS_211_PREFIX=$LLVM_SYS_211_PREFIX ./build.sh + +export WASMER=$PWD/out/bin/wasmer +``` + +**Smoke test (three backends)**: + +```bash +cd benchmarks/paper/benchmarks/wapm +$WASMER run --cranelift --cache-dir=/dev/null echo.wasm -- 1234567890 +$WASMER run --singlepass --cache-dir=/dev/null echo.wasm -- 1234567890 +$WASMER run --llvm --cache-dir=/dev/null echo.wasm -- 1234567890 +``` + +Guest arguments starting with `-` require a `--` separator, e.g. `sam.wasm -- -debug sam.wav`. + +--- + +## 4. Benchmarking + +### 4.1 One-shot Full Flow (recommended) + +```bash +cd /benchmarks/paper + +export DTVM=/path/to/DTVM/build/dtvm +export WASMTIME=$PWD/runtimes/wasmtime-45.0.0/out/wasmtime +export WASMER=$PWD/runtimes/wasmer-7.1.0/out/bin/wasmer +export WASMTIME_CACHE=0 + +./scripts/run_wapm_v45_v71_round.sh 3 +``` + +- Argument `3`: repeat each case 3 times and average. +- Output dir: `raw_data/benchs/wapm_v45_v71_/` +- Summary table: `raw_data/benchs/wapm_v45_v71_latency_table.md` / `.csv` +- If wasmer was built with llvm, the script runs `--llvm` automatically and fills the llvm column. + +### 4.2 Step-by-step + +```bash +BENCH=raw_data/benchs/wapm_v45_v71_manual +mkdir -p "$BENCH" + +# dtvm + wasmtime +DTVM=$DTVM WASMTIME=$WASMTIME \ + ./scripts/run_dtvm_wt_compile_round.sh 3 "$BENCH/dtvm_wt" + +# wasmer backends +WASMER=$WASMER ./scripts/run_wasmer_ttfi_compare.sh 3 "$BENCH/wasmer_cranelift" cranelift +WASMER=$WASMER ./scripts/run_wasmer_ttfi_compare.sh 3 "$BENCH/wasmer_singlepass" singlepass +WASMER=$WASMER ./scripts/run_wasmer_ttfi_compare.sh 3 "$BENCH/wasmer_llvm" llvm + +# merge into the paper-format table +OUT_DIR="$BENCH/table" \ + DTVM_LOG_DIR="$BENCH/dtvm_wt/logs/dtvm" \ + WT_CSV="$BENCH/dtvm_wt/wt/results.csv" \ + WASMER_CR_CSV="$BENCH/wasmer_cranelift/results.csv" \ + WASMER_SP_CSV="$BENCH/wasmer_singlepass/results.csv" \ + WASMER_LLVM_CSV="$BENCH/wasmer_llvm/results.csv" \ + ROOT=$PWD \ + python3 scripts/build_wapm_local_table.py +``` + +### 4.3 Cache and Cold Start (required) + +| Runtime | Setting | +|---------|---------| +| **wasmtime** | `export WASMTIME_CACHE=0`; **`rm -rf ~/.cache/wasmtime` before each run** (script's `CLEAR_WASMTIME_CACHE=1` is on by default) | +| **wasmer** | `--cache-dir=/dev/null` every run | +| **dtvm** | no cross-run module cache; fresh process each time | + +Without clearing the wasmtime cache, cases like echo drop from ~20–30 ms to ~1 ms, making the results incomparable with the paper. + +### 4.4 Per-case Arguments + +Some cases depend on `benchmarks/wapm/.wasm.conf` (`--dir`, `--args`, piped input, etc.). The benchmark scripts read the conf; for manual runs see `benchmarks/wapm/WAPM_REPRODUCE.md`. + +--- + +## 5. Validation and Comparison with the Paper + +### 5.1 Parsing the Paper's Original Logs + +```bash +cd scripts +# edit log_file_path at the bottom of avg_compile_time.py to point at the dtvm/wasmtime/wasmer logs +python3 avg_compile_time.py +``` + +### 5.2 Quick Checklist + +- [ ] `strings build/dtvm | grep 'Total compilation time'` produces output +- [ ] A single dtvm echo run prints a `Total compilation time: … ms (… µs)` line +- [ ] `rm -rf ~/.cache/wasmtime` ran before the wasmtime echo run +- [ ] wasmer uses `--cache-dir=/dev/null` +- [ ] wasmer llvm has `LLVM_SYS_211_PREFIX` set and `wasmer run --llvm` works +- [ ] The summary table has dtvm / wt / wasmer-cr / wasmer-sp columns for all 20 cases; the llvm column is non-empty after an llvm build + +--- + +## 6. Script Index + +| Script | Purpose | +|--------|---------| +| `scripts/run_wapm_v45_v71_round.sh` | one-shot: dtvm + wt45 + wasmer7 (cr/sp/llvm) + merged table | +| `scripts/run_dtvm_wt_compile_round.sh` | dtvm + wasmtime, 20 cases | +| `scripts/run_wasmtime_ttfi_compare.sh` | wasmtime only | +| `scripts/run_wasmer_ttfi_compare.sh` | wasmer only (args: `repeats out_dir engine`) | +| `scripts/build_wapm_local_table.py` | generate the paper-format md/csv from logs/CSVs | + +Environment variables (table merge): + +| Variable | Meaning | +|----------|---------| +| `DTVM_LOG_DIR` | dtvm log directory | +| `WT_CSV` | wasmtime `results.csv` | +| `WASMER_CR_CSV` / `WASMER_SP_CSV` / `WASMER_LLVM_CSV` | wasmer per-backend CSVs | +| `OUT_DIR` | output `wapm_local_latency_table.md` | + +--- + +## 7. Instrumentation Locations + +| Component | Location | +|-----------|----------| +| dtvm TTFI | `DTVM/src/utils/statistics.cpp` etc. | +| wasmtime 45 TTFI | `wasmtime-45.0.0/src/ttfi_report.rs`, `src/common.rs`, `src/commands/run.rs` | +| wasmtime 31 TTFI (legacy) | `runtimes/wasmtime-31.0.0/patches/ttfi-report.patch` | +| wasmer 7.1 TTFI | `wasmer-7.1.0/lib/wasix/src/ttfi_report.rs` etc. | +| wasmer 5.0.4 TTFI (legacy) | same modifications on `wasmer-5.0.4`; llvm needs **LLVM 18** | + +--- + +## 8. FAQ + +| Symptom | Fix | +|---------|-----| +| dtvm prints no `Total compilation time` | rebuild `dtvm` (`statistics.cpp` mtime must precede the binary) | +| wasmtime echo ~1 ms | `~/.cache/wasmtime` was not cleared | +| wasmer llvm fails to build | confirm `LLVM_SYS_211_PREFIX` points at **21.x**, not 18 | +| `llvm-config` from LLVM 18 reports `libtinfo.so.5` | the Ubuntu 18 prebuilt package is incompatible with newer ncurses; use the LLVM 21 package for wasmer 7 | +| `INPUT_FILE is required` | put `.wasm` **before** the flags | +| irb extremely slow | expected (large module); the llvm backend is especially slow | +| fortune has no paper row | skip the fortune comparison when using the paper's `zuk` column | + +--- + +## 9. Older Runtime Versions (optional) + +To compare against the paper's **same-version** wasmtime 31 / wasmer 5.0.4: + +```bash +./runtimes/wasmtime-31.0.0/build.sh +./runtimes/wasmer-5.0.4/build.sh # llvm needs LLVM 18 + LLVM_SYS_180_PREFIX +./scripts/run_wapm_local_full_round.sh 3 +``` + +Output: `raw_data/benchs/wapm_local_latency_table.md`. + +--- + +## 10. Related Documents + +| Document | Contents | +|----------|----------| +| [`benchmarks/wapm/WAPM_REPRODUCE.md`](../benchmarks/wapm/WAPM_REPRODUCE.md) | case confs, correctness testing | diff --git a/benchmarks/paper/docs/XLSX_FORMAT.md b/benchmarks/paper/docs/XLSX_FORMAT.md new file mode 100644 index 000000000..b5a7ba9d3 --- /dev/null +++ b/benchmarks/paper/docs/XLSX_FORMAT.md @@ -0,0 +1,82 @@ +# dtvm_polybench.xlsx — Table Format Notes (issue log) + +## Conclusion + +Do **not** directly compare the `bench_polybench_timing.sh` wall time (one whole-process invocation) against the xlsx columns as a "reproduction" ratio, unless the following are confirmed with the experimenters first: + +1. Whether each cell is **compile time** or **total time** (or some other definition); +2. **Which row group** of the sheet is being used (the same case names repeat in multiple groups); +3. Whether the unit is **ms** or **seconds** (some compile cells are fractions, e.g. `0.935`). + +## Table Structure (as observed) + +### Group 1 (roughly rows 2–31) + +- Row label: `case/benchmark/polybenchc/.wasm` +- Columns B–K: headers still show row 1's `dtvm multipass`, `dtvm multipass + lazy`, `wasmtime`, etc. +- **Each config has only one numeric column**, not labeled compile / total + - Example: `2mm`'s `dtvm multipass` = **3314.16** (magnitude looks like ms; semantics unlabeled) + +### Group 2 (from roughly row 76) + +- Row 76 sub-headers (alternating column pairs): + - **B** = `Compile time (ms)` → belongs to column name **dtvm multipass** + - **C** = `Total time (ms)` → belongs to column name **dtvm multipass + lazy** + - **D/E, F/G…** likewise alternate **Compile / Total** +- So within the same data row, **column B is multipass's compile and column C is lazy's total** — not a "compile + total" pair for the same config. + +Example: `2mm` (row 77) + +| Column | Column name (row 1) | Sub-header (row 76) | Value | Meaning (per experimenter feedback) | +|--------|---------------------|---------------------|-------|--------------------------------------| +| B | dtvm multipass | Compile time | **0.935** | **compile time** (seconds; ×1000 ≈ 935 ms) | +| C | dtvm multipass + lazy | Total time | **3283.55** | lazy **total time** (ms) | + +The earlier script incorrectly treated **B = 0.935×1000 = 935** as multipass "total time" when comparing against local wall time. + +### Duplicate Rows + +The same `case` appears **multiple times** in the sheet (e.g. `2mm` at least 4 rows). The old script scanned row by row and **later rows overwrote earlier ones**, easily landing on the compile row at row 76+ rather than row 2's 3314.16. + +## What the Local Timing Script Measures + +`bench_polybench_timing.sh`: + +- Each run: `dtvm … case.wasm` in a **separate process** +- Measure: `date` **wall time (ms)** = typically **JIT compile + execution** (+ process startup) +- Per case: 1× warmup + 3× timed, median reported + +This is **not the same metric** as the xlsx's compile-only or total-only cells. + +## Status of Previous Comparison Tables + +The **ratios in the following files are historical records only** — until the xlsx semantics are clarified they **must not be read as reproduction success/failure**: + +- `polybench_paired_compare_20260526.csv` / `.md` (not included) +- `polybench_all_runtimes_compare_20260526.md` / `.csv` (not included) +- `polybench_local_vs_paper_*` (not included) + +## Recommended Reading (DTVM vs Wasmtime vs Wasmer-LLVM relative relationship) + +- `polybench_runtime_compare_20260526.md` / `.csv` (not included) — **`DTVM/Wasm/LLVM`** (e.g. `1/1.02/7.03`) normalized comparison (main document) + +## Total-only Absolute Comparison (auxiliary) + +- `polybench_total_only_compare_20260526.csv` / `.md` (not included) + +Extraction summary: + +| Config | Total source | +|--------|--------------| +| dtvm multipass | group 1 rows 2–31, column B (this group has no Compile/Total sub-header) | +| dtvm multipass+lazy | group 2 rows 77–106, column C (row 76 marks **Total time**) | +| wasmtime | group 1 rows 2–31, column F | +| wasmer llvm | group 2 rows 77–106, column I (**Total time**) | + +**Do not** use group-2 column B's 0.935 (Compile). + +## If the Numbers Still Do Not Line Up + +1. Confirm with the experimenters whether group-1 columns B/F are really **total** (rather than another metric). +2. Split compile / execute locally, or restore the paper's `Average time` script. +3. Check whether dtvm contains an `exit optimization` matching xlsx columns D/E. diff --git a/benchmarks/paper/runtimes/README.md b/benchmarks/paper/runtimes/README.md new file mode 100644 index 000000000..6b8ad282c --- /dev/null +++ b/benchmarks/paper/runtimes/README.md @@ -0,0 +1,36 @@ +# Runtimes + +Build scripts and version proofs for each runtime. **Binaries are not committed** (covered by `.gitignore`); each subdirectory keeps only `BUILD.md` / `build.sh` / `version.txt`. + +## Paper Baselines (PolyBench wall-clock) + +| Directory | Version | Purpose | +|-----------|---------|---------| +| [`wamr-1.2.3/`](wamr-1.2.3/) | WAMR 1.2.3 (`iwasm`) | interpreter baseline | +| [`wasmtime-31.0.0/`](wasmtime-31.0.0/) | Wasmtime 31.0.0 (optional TTFI instrumentation) | wall-clock baseline | +| [`wasmer-5.0.4/`](wasmer-5.0.4/) | Wasmer 5.0.4 (cr + sp + optional llvm/LLVM18) | the `wasmer llvm` column | +| [`dtvm/`](dtvm/) | DTVM source fork @ `882c83155` | paper PolyBench / WAPM main column | + +## Current Mainline (TTFI + overflow + fib) + +| Directory | Version | Purpose | +|-----------|---------|---------| +| [`wasmtime-45.0.0/`](wasmtime-45.0.0/) | Wasmtime **45.0.0** (with TTFI instrumentation) | PolyBench TTFI / WAPM TTFI / overflow / fib | +| [`wasmer-7.1.0/`](wasmer-7.1.0/) | Wasmer **7.1.0** (cr + sp + **llvm**/LLVM21) | same | +| [`dtvm_main/`](dtvm_main/) | DTVM main HEAD (with `Total compilation time`) | TTFI mainline (commit recorded in `version.txt`) | + +## Build-output Paths + +`build.sh` installs into the corresponding subdirectory's `out/`: + +| Runtime | Binary path | +|---------|-------------| +| WAMR 1.2.3 | `wamr-1.2.3/out/iwasm` | +| Wasmtime 31 | `wasmtime-31.0.0/out/wasmtime` | +| Wasmtime 45 | `wasmtime-45.0.0/out/wasmtime` | +| Wasmer 5.0.4 | `wasmer-5.0.4/out/bin/wasmer` | +| Wasmer 7.1.0 | `wasmer-7.1.0/out/bin/wasmer` | +| DTVM paper | `dtvm/dtvm` (manually copied from `build_paper/dtvm`) | +| DTVM mainline | `dtvm_main/dtvm` (manually copied from a main build) | + +See each subdirectory's `BUILD.md` and [`../VERSIONS.md`](../VERSIONS.md). diff --git a/benchmarks/paper/runtimes/dtvm/BUILD.md b/benchmarks/paper/runtimes/dtvm/BUILD.md new file mode 100644 index 000000000..881ceb3b8 --- /dev/null +++ b/benchmarks/paper/runtimes/dtvm/BUILD.md @@ -0,0 +1,76 @@ +# DTVM (dtvm) — Paper Reproduction Build + +Paper experiments use commit **`882c83155`** (DTVM source fork). + +## Prerequisites + +- Linux x86_64 +- `cmake`, `ninja`, GCC C++17 +- LLVM **15** for multipass JIT, e.g. `/opt/llvm15/lib/cmake/llvm` +- Network or pre-populated `build_paper/_deps` (asmjit, CLI11, spdlog) + +## Recommended: git worktree (keeps main checkout untouched) + +```bash +cd /path/to/DTVM +git worktree add ../DTVM_paper_882c83155 882c83155 +cd ../DTVM_paper_882c83155 +``` + +## Configure & build + +```bash +cmake -S . -B build_paper -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_DIR=/opt/llvm15/lib/cmake/llvm \ + -DZEN_ENABLE_SINGLEPASS_JIT=ON \ + -DZEN_ENABLE_MULTIPASS_JIT=ON \ + -DZEN_ENABLE_CHECKED_ARITHMETIC=ON + +cmake --build build_paper -j"$(nproc)" +cp build_paper/dtvm build_paper/dtvm +``` + +If `FetchContent` cannot reach GitHub, download asmjit zip and point CMake: + +```bash +curl -fsSL -o /tmp/asmjit.zip \ + https://codeload.github.com/asmjit/asmjit/zip/3577608cab0bc509f856ebf6e41b2f9d9f71acc4 +unzip -q /tmp/asmjit.zip -d build_paper/_deps +mv build_paper/_deps/asmjit-3577608cab0bc509f856ebf6e41b2f9d9f71acc4 build_paper/_deps/asmjit-src + +cmake ... \ + -DFETCHCONTENT_SOURCE_DIR_ASMJIT="$PWD/build_paper/_deps/asmjit-src" \ + -DFETCHCONTENT_SOURCE_DIR_CLI11="$PWD/build_paper/_deps/cli11-src" \ + -DFETCHCONTENT_SOURCE_DIR_SPDLOG="$PWD/build_paper/_deps/spdlog-src" +``` + +(Extract `build_deps.tar.gz` from a sibling DTVM tree for CLI11/spdlog if needed.) + +## Install proof artifacts into this repo + +```bash +DATA=/benchmarks/paper/runtimes/dtvm +cp build_paper/dtvm "$DATA/dtvm" +cp build_paper/CMakeCache.txt "$DATA/CMakeCache.txt" +./build_paper/dtvm --help > "$DATA/version.txt" 2>&1 || true +echo "commit=882c83155" >> "$DATA/version.txt" +``` + +## PolyBench multipass CLI (inferred from xlsx + ACI) + +```bash +dtvm -m multipass --disable-multipass-greedyra --disable-multipass-multithread case.wasm +dtvm -m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread case.wasm +``` + +**Not available at 882c83155:** public CLI for xlsx column `dtvm multipass + exit optimization` — ask the original experimenters. + +## Verify + +```bash +./build_paper/dtvm -m multipass --disable-multipass-greedyra --disable-multipass-multithread \ + /benchmarks/paper/benchmarks/polybenchc/atax.wasm +``` + +Should exit 0 and print `==BEGIN DUMP_ARRAYS==` output. diff --git a/benchmarks/paper/runtimes/dtvm/README.md b/benchmarks/paper/runtimes/dtvm/README.md new file mode 100644 index 000000000..f46799806 --- /dev/null +++ b/benchmarks/paper/runtimes/dtvm/README.md @@ -0,0 +1,33 @@ +# DTVM (paper-version `dtvm`) + +The paper's `dtvm` CLI (multipass JIT, `--enable-multipass-lazy`, etc.). + +## Experiment Commits + +| Purpose | Commit | Notes | +|---------|--------|-------| +| **Paper PolyBench / WAPM wall-clock** | **`882c83155`** | see [`BUILD.md`](BUILD.md) | +| **PolyBench / WAPM TTFI mainline** | main HEAD (with `Total compilation time` instrumentation) | see `../dtvm_main/version.txt`; build steps in [`../../docs/POLYBENCH_TTFI_REPRODUCE.md`](../../docs/POLYBENCH_TTFI_REPRODUCE.md) §3.1 | +| **overflow / fib(30)** | latest fast commit (example `e532db3e2`) | see [`../../benchmarks/overflow/REPRODUCE_fib_overflow_5way.md`](../../benchmarks/overflow/REPRODUCE_fib_overflow_5way.md) | + +## Artifacts in This Directory + +Binaries are not committed; copy them manually per `BUILD.md`: + +- `dtvm` — Release build @ the paper commit (`.gitignore`) +- `CMakeCache.txt` — snapshot of the paper build configuration (`.gitignore`) +- `version.txt` — `./dtvm --help` excerpt + `commit=…` + `build_dir=…` + +## PolyBench Multipass CLI (paper) + +```bash +# main (multipass) +dtvm -m multipass --disable-multipass-greedyra --disable-multipass-multithread case.wasm +# lazy +dtvm -m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread case.wasm +``` + +## Open Items + +- Which CLI / build flags correspond to the xlsx column `dtvm multipass + exit optimization` +- Original benchmark logs and timing script (`Average time` style) diff --git a/benchmarks/paper/runtimes/dtvm/version.txt b/benchmarks/paper/runtimes/dtvm/version.txt new file mode 100644 index 000000000..c3455e196 --- /dev/null +++ b/benchmarks/paper/runtimes/dtvm/version.txt @@ -0,0 +1,22 @@ +ZetaEngine Command Line Interface + +Usage: dtvm [OPTIONS] WASM_FILE + +Positionals: + WASM_FILE TEXT REQUIRED WASM filename + +Options: + -h,--help Print this help message and exit + -m,--mode ENUM:value in {multipass->2,singlepass->1,interpreter->0} OR {2,1,0} + Running mode + -f,--function TEXT Entry function name + --args TEXT ... Entry function args + --env TEXT ... Environment variables + --dir TEXT ... Work directories + --gas-limit UINT Gas limit + --log-level ENUM:value in {off->6,fatal->5,error->4,info->2,warn->3,debug->1,trace->0} OR {6,5,4,2,3,1,0} + Log level + --num-extra-compilations UINT + The number of extra compilations +commit=882c83155 +build_dir=/path/to/DTVM_paper_882c83155/build_paper diff --git a/benchmarks/paper/runtimes/dtvm_main/README.md b/benchmarks/paper/runtimes/dtvm_main/README.md new file mode 100644 index 000000000..b16209cc3 --- /dev/null +++ b/benchmarks/paper/runtimes/dtvm_main/README.md @@ -0,0 +1,41 @@ +# DTVM (`dtvm`) — main HEAD + +The mainline version for PolyBench TTFI / WAPM TTFI (with `Total compilation time` instrumentation). + +## Commit + +See [`version.txt`](version.txt) (example `c3c3fd856`, 2026-05-29). The paper baseline `882c83155` is under [`../dtvm/`](../dtvm/). + +## Build + +```bash +cd /path/to/DTVM +cmake -B build_main -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_DIR=/opt/llvm15/lib/cmake/llvm \ + -DZEN_ENABLE_SINGLEPASS_JIT=ON \ + -DZEN_ENABLE_MULTIPASS_JIT=ON +cmake --build build_main -j"$(nproc)" + +cp build_main/dtvm /benchmarks/paper/runtimes/dtvm_main/dtvm +chmod +x /benchmarks/paper/runtimes/dtvm_main/dtvm +git log -1 --format='%H %ci %s' \ + > /benchmarks/paper/runtimes/dtvm_main/version.txt +``` + +## Confirm TTFI Is Compiled In + +```bash +strings ./dtvm | grep -F 'Total compilation time' +``` + +## Usage + +```bash +./dtvm case.wasm -m multipass \ + --enable-multipass-lazy \ + --disable-multipass-greedyra \ + --disable-multipass-multithread \ + --enable-statistics +``` + +See [`../../docs/POLYBENCH_TTFI_REPRODUCE.md`](../../docs/POLYBENCH_TTFI_REPRODUCE.md) §3.1 and [`../../docs/WAPM_TTFI_REPRODUCTION.md`](../../docs/WAPM_TTFI_REPRODUCTION.md) §3.1. diff --git a/benchmarks/paper/runtimes/dtvm_main/version.txt b/benchmarks/paper/runtimes/dtvm_main/version.txt new file mode 100644 index 000000000..cb57bf09a --- /dev/null +++ b/benchmarks/paper/runtimes/dtvm_main/version.txt @@ -0,0 +1 @@ +c3c3fd856d693d33be05ba25c5e6969a58be7e1f 2026-05-29 07:22:34 +0000 perf: commute two-address operands and fix branch peephole for 30% fib speedup diff --git a/benchmarks/paper/runtimes/wamr-1.2.3/BUILD.md b/benchmarks/paper/runtimes/wamr-1.2.3/BUILD.md new file mode 100644 index 000000000..ed2308936 --- /dev/null +++ b/benchmarks/paper/runtimes/wamr-1.2.3/BUILD.md @@ -0,0 +1,138 @@ +# WAMR 1.2.3 Build Notes + +Upstream vanilla WAMR, used as the **`iwasm` baseline** for PolyBench and related experiments. + +- Upstream: https://github.com/bytecodealliance/wasm-micro-runtime +- Target tag: **WAMR-1.2.3** +- Automation script: [`build.sh`](build.sh) + +**Note**: this directory tracks upstream WAMR; it is **not** the same codebase as the DTVM fork (`runtimes/dtvm/`). + +--- + +## Paper Baseline Practice + +| Item | Version | +|------|---------| +| WAMR | **1.2.3** | +| LLVM (AOT) | **11.1.0** (per experiment notes; CMake typically points at an `llvm-11` package path) | + +The PolyBench wasm side was presumably compiled with WASI-SDK **clang 11.0.0 / 14.0.3** (see `benchmarks/polybenchc/BUILD.md`). + +--- + +## 1. Basic Build (CMake) + +WAMR uses CMake. Standard flow: + +```bash +git clone https://github.com/bytecodealliance/wasm-micro-runtime.git +cd wasm-micro-runtime +git checkout WAMR-1.2.3 + +cd product-mini/platforms/linux +mkdir build && cd build + +cmake .. \ + -DWAMR_BUILD_INTERP=1 \ + -DWAMR_BUILD_FAST_JIT=1 \ + -DWAMR_BUILD_AOT=1 \ + -DWAMR_BUILD_LIBC_WASI=1 + +make -j$(nproc) +./iwasm --version +``` + +Or use the script in this directory: + +```bash +cd runtimes/wamr-1.2.3 +chmod +x build.sh +./build.sh all +# artifacts: out/iwasm, version.txt +``` + +--- + +## 2. Common CMake Options + +| Option | Description | +|--------|-------------| +| `-DWAMR_BUILD_INTERP=1` | interpreter (**required for iwasm**) | +| `-DWAMR_BUILD_FAST_JIT=1` | Fast JIT (singlepass compiler) | +| `-DWAMR_BUILD_AOT=1` | AOT compiler (**requires LLVM**) | +| `-DWAMR_BUILD_LIBC_BUILTIN=1` | builtin libc | +| `-DWAMR_BUILD_LIBC_WASI=1` | WASI libc (**required to run PolyBench WASI wasm**) | +| `-DWAMR_BUILD_MULTI_MODULE=1` | multi-module support | + +For the paper PolyBench baseline, enable at least **INTERP + LIBC_WASI**. + +--- + +## 3. AOT Mode (requires LLVM) + +```bash +# Ubuntu example (LLVM 11) +sudo apt-get install llvm-11 clang-11 llvm-11-dev + +cd product-mini/platforms/linux/build +cmake .. \ + -DWAMR_BUILD_AOT=1 \ + -DWAMR_BUILD_INTERP=1 \ + -DWAMR_BUILD_LIBC_WASI=1 \ + -DLLVM_DIR=/usr/lib/llvm-11/lib/cmake/llvm + +make -j$(nproc) +``` + +The experiment docs used **LLVM 11.1.0**; if only an `llvm-11` package is available, point `LLVM_DIR` at its cmake directory. + +This repo's `build.sh` defaults to: + +```bash +export LLVM_DIR=/usr/lib/llvm-11/lib/cmake/llvm +./build.sh all +``` + +If AOT is not needed, disable it: + +```bash +WAMR_BUILD_AOT=0 ./build.sh all +``` + +--- + +## 4. Artifacts and Verification + +| File | Description | +|------|-------------| +| `product-mini/platforms/linux/build/iwasm` | main executable | +| `out/iwasm` | `build.sh install` copies here | +| `version.txt` | `iwasm --version` output (**fill in after a real build**) | + +Verify: + +```bash +./out/iwasm --version +./out/iwasm benchmarks/polybenchc/atax.wasm # run from the repo root or with an explicit path +``` + +--- + +## 5. Difference from DTVM (`runtimes/dtvm/`) + +| | WAMR 1.2.3 (this dir) | DTVM (`runtimes/dtvm/`) | +|--|------------------------|--------------------------| +| Source | upstream bytecodealliance | fork | +| CLI | `iwasm` | `dtvm` | +| Role | paper baseline | paper main runtime | +| AOT LLVM | 11.1.0 | fork-specific config | + +--- + +## 6. To Be Filled (after an actual build) + +- [ ] `version.txt` (real `iwasm --version` output) +- [ ] `out/iwasm` binary or the recorded build-machine path +- [ ] full CMake log / `CMakeCache.txt` (optional, for auditing) +- [ ] checksum (`shasum -a 256 out/iwasm`) diff --git a/benchmarks/paper/runtimes/wamr-1.2.3/README.md b/benchmarks/paper/runtimes/wamr-1.2.3/README.md new file mode 100644 index 000000000..171f6fa76 --- /dev/null +++ b/benchmarks/paper/runtimes/wamr-1.2.3/README.md @@ -0,0 +1,29 @@ +# WAMR 1.2.3 + +Upstream vanilla WAMR, used as the `iwasm` baseline for PolyBench and related experiments. + +## Docs + +- [`BUILD.md`](BUILD.md) — CMake options, LLVM 11.1.0, notes +- [`build.sh`](build.sh) — automated clone / build / install + +## Quick Start + +```bash +chmod +x build.sh +./build.sh all +``` + +## Version Pin + +| Item | Version | +|------|---------| +| WAMR | 1.2.3 | +| LLVM (AOT) | 11.1.0 | + +## To Be Filled After an Actual Build + +- [ ] `version.txt` +- [ ] `out/iwasm` + +Upstream: https://github.com/bytecodealliance/wasm-micro-runtime diff --git a/benchmarks/paper/runtimes/wamr-1.2.3/build.sh b/benchmarks/paper/runtimes/wamr-1.2.3/build.sh new file mode 100755 index 000000000..ababc7773 --- /dev/null +++ b/benchmarks/paper/runtimes/wamr-1.2.3/build.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +# Build upstream WAMR 1.2.3 (iwasm) for paper baseline. +# See BUILD.md for CMake options and Ant Group practice notes. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +WAMR_SRC="${WAMR_SRC:-$ROOT/build/wasm-micro-runtime}" +WAMR_TAG="${WAMR_TAG:-WAMR-1.2.3}" +WAMR_REPO="${WAMR_REPO:-https://github.com/bytecodealliance/wasm-micro-runtime.git}" +BUILD_DIR="${BUILD_DIR:-$WAMR_SRC/product-mini/platforms/linux/build}" +LLVM_DIR="${LLVM_DIR:-/usr/lib/llvm-11/lib/cmake/llvm}" + +# Paper / Ant practice defaults +: "${WAMR_BUILD_INTERP:=1}" +: "${WAMR_BUILD_FAST_JIT:=1}" +: "${WAMR_BUILD_AOT:=1}" +: "${WAMR_BUILD_LIBC_WASI:=1}" +: "${WAMR_BUILD_LIBC_BUILTIN:=0}" +: "${WAMR_BUILD_MULTI_MODULE:=0}" + +usage() { + cat <<'EOF' +Usage: build.sh [clone|configure|build|install|all|version] + + clone Clone wasm-micro-runtime and checkout WAMR-1.2.3 + configure Run cmake in product-mini/platforms/linux/build + build make iwasm + install Copy iwasm to ./out/ and write version.txt + all clone + configure + build + install + version Print iwasm --version (after build) + +Environment: + WAMR_TAG Git tag (default: WAMR-1.2.3) + LLVM_DIR LLVM 11 cmake dir for AOT (Ant: LLVM 11.1.0) + WAMR_BUILD_INTERP 1 = interpreter (default) + WAMR_BUILD_FAST_JIT 1 = fast JIT / singlepass (default) + WAMR_BUILD_AOT 1 = AOT compiler (default, needs LLVM) + WAMR_BUILD_LIBC_WASI 1 = WASI libc (default, required for polybench) +EOF +} + +clone_source() { + if [[ ! -d "$WAMR_SRC/.git" ]]; then + git clone --depth 1 --branch "$WAMR_TAG" "$WAMR_REPO" "$WAMR_SRC" + else + git -C "$WAMR_SRC" fetch --tags origin + git -C "$WAMR_SRC" checkout "$WAMR_TAG" + fi + echo "Checked out $WAMR_TAG at $WAMR_SRC" +} + +configure() { + clone_source + mkdir -p "$BUILD_DIR" + cd "$BUILD_DIR" + + local -a cmake_args=( + -DWAMR_BUILD_INTERP="$WAMR_BUILD_INTERP" + -DWAMR_BUILD_FAST_JIT="$WAMR_BUILD_FAST_JIT" + -DWAMR_BUILD_AOT="$WAMR_BUILD_AOT" + -DWAMR_BUILD_LIBC_WASI="$WAMR_BUILD_LIBC_WASI" + -DWAMR_BUILD_LIBC_BUILTIN="$WAMR_BUILD_LIBC_BUILTIN" + -DWAMR_BUILD_MULTI_MODULE="$WAMR_BUILD_MULTI_MODULE" + ) + + if [[ "$WAMR_BUILD_AOT" == "1" ]]; then + cmake_args+=(-DLLVM_DIR="$LLVM_DIR") + fi + + cmake .. "${cmake_args[@]}" +} + +build_iwasm() { + cd "$BUILD_DIR" + make -j"$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)" +} + +install_artifacts() { + local iwasm="$BUILD_DIR/iwasm" + [[ -x "$iwasm" ]] || iwasm="$BUILD_DIR/build/iwasm" + [[ -x "$iwasm" ]] || { echo "Error: iwasm not found under $BUILD_DIR" >&2; exit 1; } + + mkdir -p "$ROOT/out" + cp "$iwasm" "$ROOT/out/iwasm" + "$ROOT/out/iwasm" --version | tee "$ROOT/version.txt" + echo "Installed: $ROOT/out/iwasm" +} + +print_version() { + "$ROOT/out/iwasm" --version 2>/dev/null || "$BUILD_DIR/iwasm" --version 2>/dev/null || "$BUILD_DIR/build/iwasm" --version +} + +cmd="${1:-all}" +case "$cmd" in + clone) clone_source ;; + configure) configure ;; + build) build_iwasm ;; + install) install_artifacts ;; + all) configure && build_iwasm && install_artifacts ;; + version) print_version ;; + -h|--help|help) usage ;; + *) echo "Unknown command: $cmd" >&2; usage; exit 1 ;; +esac diff --git a/benchmarks/paper/runtimes/wamr-1.2.3/version.txt b/benchmarks/paper/runtimes/wamr-1.2.3/version.txt new file mode 100644 index 000000000..cbaf3c856 --- /dev/null +++ b/benchmarks/paper/runtimes/wamr-1.2.3/version.txt @@ -0,0 +1 @@ +iwasm 1.2.3 diff --git a/benchmarks/paper/runtimes/wasmer-5.0.4/BUILD.md b/benchmarks/paper/runtimes/wasmer-5.0.4/BUILD.md new file mode 100644 index 000000000..6ef9e6773 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-5.0.4/BUILD.md @@ -0,0 +1,30 @@ +# Wasmer 5.0.4 (WAPM paper TTFI) + +## Source patch + +Instrumented tree (default): `/path/to/wasmer-5.0.4` + +- `lib/wasix/src/ttfi_report.rs` — `Readfile time`, `compile time`, `Total compilation time`, `Module execution`, `Execution N` +- `lib/wasix/src/runtime/mod.rs` — compile timer around `Module::new` +- `lib/cli/src/commands/run/mod.rs` — readfile timer +- `lib/wasix/src/state/builder.rs` — instantiate + guest execution timers + +Run flags (paper): `wasmer run -- --cache-dir=/dev/null .wasm …` + +## Build + +```bash +./runtimes/wasmer-5.0.4/build.sh +``` + +- Always builds **cranelift** + **singlepass**. +- **llvm** only if LLVM 18 is available (`llvm-config-18` or `LLVM_SYS_180_PREFIX`). + +## Compare + +```bash +./scripts/run_wasmer_ttfi_compare.sh 3 # cranelift (default) +./scripts/run_wasmer_ttfi_compare.sh 3 '' singlepass +``` + +Metric aligned with paper `avg_compile_time.py`: **`Total compilation time`** (microseconds in parentheses). diff --git a/benchmarks/paper/runtimes/wasmer-5.0.4/README.md b/benchmarks/paper/runtimes/wasmer-5.0.4/README.md new file mode 100644 index 000000000..512f02896 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-5.0.4/README.md @@ -0,0 +1,23 @@ +# Wasmer 5.0.4 + +The paper's Wasmer baseline; the PolyBench wall-clock `wasmer llvm` column. + +## Build + +```bash +./build.sh # cranelift + singlepass by default; adds the llvm backend automatically when LLVM 18 is present +``` + +LLVM 18 setup: + +```bash +export LLVM_SYS_180_PREFIX=/opt/clang+llvm-18.1.7-x86_64-linux-gnu-ubuntu-18.04 +``` + +Artifact: `out/bin/wasmer` (covered by `.gitignore`). + +## Docs + +- [`BUILD.md`](BUILD.md) — instrumentation locations, benchmark flags + +> The current TTFI / overflow / fib mainline has moved to Wasmer **7.1.0** (LLVM 21); see [`../wasmer-7.1.0/`](../wasmer-7.1.0/). diff --git a/benchmarks/paper/runtimes/wasmer-5.0.4/build.sh b/benchmarks/paper/runtimes/wasmer-5.0.4/build.sh new file mode 100755 index 000000000..ef54538af --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-5.0.4/build.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Build Wasmer 5.0.4 with WAPM paper TTFI reporting (patched wasmer-wasix + cli). +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +WASMER_SRC="${WASMER_SRC:-/path/to/wasmer-5.0.4}" +OUT="$ROOT/out" + +if [[ -f "$HOME/.cargo/env" ]]; then + # shellcheck disable=SC1091 + source "$HOME/.cargo/env" +fi + +echo "Building wasmer from $WASMER_SRC (release, -j6)..." +cd "$WASMER_SRC" +FEATURES="cranelift,singlepass" +if [[ -n "${LLVM_SYS_180_PREFIX:-}" ]] || command -v llvm-config-18 >/dev/null 2>&1; then + FEATURES="${FEATURES},llvm" + echo "LLVM 18 found — building with llvm backend" +else + echo "WARN: no LLVM 18 (set LLVM_SYS_180_PREFIX) — skipping wasmer llvm backend" +fi +cargo build --release -p wasmer-cli -j6 --features "$FEATURES" + +mkdir -p "$OUT/bin" +install -m 755 "$WASMER_SRC/target/release/wasmer" "$OUT/bin/wasmer" +echo "Installed: $OUT/bin/wasmer" +"$OUT/bin/wasmer" --version diff --git a/benchmarks/paper/runtimes/wasmer-5.0.4/version.txt b/benchmarks/paper/runtimes/wasmer-5.0.4/version.txt new file mode 100644 index 000000000..042aaf652 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-5.0.4/version.txt @@ -0,0 +1 @@ +wasmer 5.0.4 diff --git a/benchmarks/paper/runtimes/wasmer-7.1.0/README.md b/benchmarks/paper/runtimes/wasmer-7.1.0/README.md new file mode 100644 index 000000000..abdeeb55d --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-7.1.0/README.md @@ -0,0 +1,43 @@ +# Wasmer 7.1.0 (TTFI / overflow / fib mainline) + +Shared version for PolyBench TTFI, WAPM TTFI, overflow, and fib(30). Three backends: **cranelift + singlepass + llvm**. + +## Instrumentation Locations + +- `lib/wasix/src/ttfi_report.rs` +- `lib/wasix/src/runtime/mod.rs` (compile timer around `Module::new`) +- `lib/wasix/src/state/builder.rs` (instantiate / guest execution timers) +- `lib/cli/src/commands/run/mod.rs` (readfile timer) + +Example instrumented source: `/path/to/wasmer-7.1.0` + +## LLVM 21 (required for the llvm backend) + +wasmer 7.1 uses `llvm-sys-211` and needs **LLVM 21** (not the LLVM 18 from the paper-era 5.0.4). + +```bash +tar -xf LLVM-21.1.8-Linux-X64.tar.xz -C ~ +export LLVM_SYS_211_PREFIX=$HOME/LLVM-21.1.8-Linux-X64 +$LLVM_SYS_211_PREFIX/bin/llvm-config --version # 21.1.8 +``` + +## Build + +```bash +# default source path WASMER_SRC=/path/to/wasmer-7.1.0 +LLVM_SYS_211_PREFIX=$HOME/LLVM-21.1.8-Linux-X64 ./build.sh +# artifact: out/bin/wasmer +``` + +Without LLVM 21 the script skips the `llvm` feature automatically and builds only `cranelift + singlepass`. + +## Usage (TTFI) + +```bash +./out/bin/wasmer run --cranelift --cache-dir=/dev/null case.wasm +./out/bin/wasmer run --singlepass --cache-dir=/dev/null case.wasm +./out/bin/wasmer run --llvm --cache-dir=/dev/null case.wasm +# expected stdout: Total compilation time: ms (<µs> µs) +``` + +Benchmark entry points: [`../../docs/POLYBENCH_TTFI_REPRODUCE.md`](../../docs/POLYBENCH_TTFI_REPRODUCE.md), [`../../docs/WAPM_TTFI_REPRODUCTION.md`](../../docs/WAPM_TTFI_REPRODUCTION.md). diff --git a/benchmarks/paper/runtimes/wasmer-7.1.0/build.sh b/benchmarks/paper/runtimes/wasmer-7.1.0/build.sh new file mode 100755 index 000000000..d02089445 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmer-7.1.0/build.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Build Wasmer v7.1.0 with WAPM paper TTFI reporting. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +WASMER_SRC="${WASMER_SRC:-/path/to/wasmer-7.1.0}" +OUT="$ROOT/out" + +if [[ -f "$HOME/.cargo/env" ]]; then + # shellcheck disable=SC1091 + source "$HOME/.cargo/env" +fi + +FEATURES="cranelift,singlepass" +if [[ -n "${LLVM_SYS_211_PREFIX:-}" ]] || [[ -x "${LLVM21_PREFIX:-/opt/LLVM-21.1.8-Linux-X64}/bin/llvm-config" ]]; then + export LLVM_SYS_211_PREFIX="${LLVM_SYS_211_PREFIX:-${LLVM21_PREFIX:-/opt/LLVM-21.1.8-Linux-X64}}" + FEATURES="${FEATURES},llvm" + echo "LLVM 21 found at $LLVM_SYS_211_PREFIX — building with llvm backend" +else + echo "WARN: no LLVM 21 (set LLVM_SYS_211_PREFIX) — skipping wasmer llvm backend" +fi +echo "Building wasmer v7.1.0 from $WASMER_SRC (release, features=$FEATURES, -j6)..." +cd "$WASMER_SRC" +cargo build --release -p wasmer-cli -j6 --features "$FEATURES" + +mkdir -p "$OUT/bin" +install -m 755 "$WASMER_SRC/target/release/wasmer" "$OUT/bin/wasmer" +echo "Installed: $OUT/bin/wasmer" +"$OUT/bin/wasmer" --version diff --git a/benchmarks/paper/runtimes/wasmtime-31.0.0/BUILD.md b/benchmarks/paper/runtimes/wasmtime-31.0.0/BUILD.md new file mode 100644 index 000000000..40025c681 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-31.0.0/BUILD.md @@ -0,0 +1,131 @@ +# Wasmtime 31.0.0 Build Notes + +The paper's Wasmtime baseline (Cranelift backend). + +- Version: **31.0.0** +- Upstream: https://github.com/bytecodealliance/wasmtime +- Target tag: **release-31.0.0** +- Source-build script: [`build.sh`](build.sh) + +This repository does **not** commit prebuilt binaries; use the official release package or a local `cargo build`. + +--- + +## 1. Prebuilt Package (recommended) + +### Download + +| Item | Value | +|------|-------| +| File | `wasmtime-v31.0.0-x86_64-linux.tar.xz` | +| URL | https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz | +| Release | https://github.com/bytecodealliance/wasmtime/releases/tag/v31.0.0 | + +```bash +curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz +tar xf wasmtime-v31.0.0-x86_64-linux.tar.xz +``` + +Example extracted location: + +```bash +/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime +``` + +### Verify + +```bash +/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime --version + +/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime run \ + --invoke add /path/to/add.wasm 1 3 +``` + +`add.wasm` was a smoke-test path on the experiment machine and is **not** included in this repository. + +--- + +## 2. Source Build (optional) + +### Get the Source + +```bash +git clone https://github.com/bytecodealliance/wasmtime.git +cd wasmtime +git checkout release-31.0.0 +git submodule update --init +``` + +Or use the script in this directory: + +```bash +cd runtimes/wasmtime-31.0.0 +chmod +x build.sh +./build.sh clone +``` + +### Requirements + +| Item | Requirement | +|------|-------------| +| **Rust** | `rustc` **1.85.0** or later | +| System | `cargo`, `rustup` | + +```bash +rustc --version +rustup update stable +``` + +### Build + +```bash +cd wasmtime +cargo build --release +# artifact: target/release/wasmtime +``` + +One shot: + +```bash +./build.sh all +./build.sh version +``` + +### WAPM Paper Timing Instrumentation (`ttfi-report`) + +`./build.sh clone` automatically applies `git apply patches/ttfi-report.patch` (based on **release-31.0.0**). +The build artifact is installed to `out/wasmtime`; instrumented stdout looks like: + +```text +Creating mmap for file took: …µs +mmap success: +Total compilation time: … ms (… µs) +… +Execution 1: ….… ms +``` + +When reproducing, use `export WASMTIME_CACHE=0` and pass case arguments the same way as the paper (e.g. `echo.wasm 1234567890`). + +--- + +## 3. `wasmtime` Paths Used by This Repo + +| Scenario | `wasmtime` path | +|----------|-----------------| +| WAPM paper instrumented build | `runtimes/wasmtime-31.0.0/out/wasmtime` | +| `benchmarks/overflow/build.sh` | `/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime` | +| Experiment-machine example | `/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime` | + +Paths vary by deployment; extract the official package to `/opt/...` or `$HOME/workspace/...` and adjust script paths accordingly. + +--- + +## 4. PolyBench / webassembly-testsuites + +Configuration lives in `scripts/webassembly-testsuites/configuration/`; run with: + +```bash +./runtest_webassembly.py -r wasmtime -s polybenchc +``` + +`wasmtime` must be on `PATH`, or the configuration should point at the install path above. diff --git a/benchmarks/paper/runtimes/wasmtime-31.0.0/README.md b/benchmarks/paper/runtimes/wasmtime-31.0.0/README.md new file mode 100644 index 000000000..f980150c6 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-31.0.0/README.md @@ -0,0 +1,39 @@ +# Wasmtime 31.0.0 + +The paper's Wasmtime baseline (Cranelift backend). + +## Quick Install (official prebuilt package) + +```bash +curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz +tar xf wasmtime-v31.0.0-x86_64-linux.tar.xz +/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime --version +``` + +## Verification Example + +```bash +/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime run \ + --invoke add /path/to/add.wasm 1 3 +``` + +## Docs + +- [`BUILD.md`](BUILD.md) — prebuilt package, source build, path notes +- [`build.sh`](build.sh) — source clone / automatic `git apply patches/ttfi-report.patch` / `cargo build --release` / install to `out/` +- [`patches/ttfi-report.patch`](patches/) — the paper's `Total compilation time` instrumentation (based on `release-31.0.0`) + +> The current TTFI / overflow / fib mainline has moved to Wasmtime **45.0.0**; see [`../wasmtime-45.0.0/`](../wasmtime-45.0.0/). + +## Version Pin + +| Item | Value | +|------|-------| +| Version | **31.0.0** | +| Git tag | `release-31.0.0` | +| Prebuilt package | [v31.0.0 x86_64-linux](https://github.com/bytecodealliance/wasmtime/releases/download/v31.0.0/wasmtime-v31.0.0-x86_64-linux.tar.xz) | +| Rust (source build) | >= 1.85.0 | + +## Notes + +The `wasmtime` binary is not committed to this repository. `benchmarks/overflow/build.sh` defaults to `/opt/wasmtime-v31.0.0-x86_64-linux/wasmtime`. diff --git a/benchmarks/paper/runtimes/wasmtime-31.0.0/build.sh b/benchmarks/paper/runtimes/wasmtime-31.0.0/build.sh new file mode 100755 index 000000000..292b50112 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-31.0.0/build.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Build Wasmtime release-31.0.0 from source. +# See BUILD.md. This repo documents build steps only; no binary/checksum is shipped. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +WASMTIME_SRC="${WASMTIME_SRC:-$ROOT/build/wasmtime}" +WASMTIME_TAG="${WASMTIME_TAG:-release-31.0.0}" +WASMTIME_REPO="${WASMTIME_REPO:-https://github.com/bytecodealliance/wasmtime.git}" + +usage() { + cat <<'EOF' +Usage: build.sh [clone|build|all|version] + + clone Clone wasmtime and checkout release-31.0.0 (+ submodules) + build cargo build --release + all clone + build + version Print wasmtime --version (local build only) + +Environment: + WASMTIME_TAG Git branch/tag (default: release-31.0.0) + WASMTIME_SRC Source directory (default: ./build/wasmtime) +EOF +} + +apply_ttfi_patch() { + local patch="$ROOT/patches/ttfi-report.patch" + if [[ ! -f "$patch" ]]; then + return 0 + fi + if git -C "$WASMTIME_SRC" apply --check "$patch" 2>/dev/null; then + git -C "$WASMTIME_SRC" apply "$patch" + echo "Applied paper TTFI patch: $patch" + else + echo "Note: TTFI patch already applied or tree differs: $patch" + fi +} + +clone_source() { + if [[ ! -d "$WASMTIME_SRC/.git" ]]; then + git clone --depth 1 --branch "$WASMTIME_TAG" "$WASMTIME_REPO" "$WASMTIME_SRC" + else + git -C "$WASMTIME_SRC" fetch origin "$WASMTIME_TAG" 2>/dev/null || git -C "$WASMTIME_SRC" fetch --tags origin + git -C "$WASMTIME_SRC" checkout "$WASMTIME_TAG" + fi + git -C "$WASMTIME_SRC" submodule update --init --recursive + apply_ttfi_patch + echo "Checked out $WASMTIME_TAG at $WASMTIME_SRC" +} + +build_release() { + if [[ -f "$HOME/.cargo/env" ]]; then + # shellcheck disable=SC1091 + source "$HOME/.cargo/env" + fi + command -v rustc >/dev/null 2>&1 || { + echo "Error: rustc not found. Install Rust: https://rustup.rs/" >&2 + exit 1 + } + cd "$WASMTIME_SRC" + cargo build --release + mkdir -p "$ROOT/out" + install -m 755 "$WASMTIME_SRC/target/release/wasmtime" "$ROOT/out/wasmtime" + echo "Built: $WASMTIME_SRC/target/release/wasmtime" + echo "Installed: $ROOT/out/wasmtime" +} + +print_version() { + "$WASMTIME_SRC/target/release/wasmtime" --version +} + +cmd="${1:-all}" +case "$cmd" in + clone) clone_source ;; + build) build_release ;; + all) clone_source && build_release ;; + version) print_version ;; + -h|--help|help) usage ;; + *) echo "Unknown command: $cmd" >&2; usage; exit 1 ;; +esac diff --git a/benchmarks/paper/runtimes/wasmtime-31.0.0/patches/ttfi-report.patch b/benchmarks/paper/runtimes/wasmtime-31.0.0/patches/ttfi-report.patch new file mode 100644 index 000000000..d88f40160 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-31.0.0/patches/ttfi-report.patch @@ -0,0 +1,163 @@ +diff --git a/Cargo.toml b/Cargo.toml +index 1894881..262dca5 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -434,6 +434,9 @@ default = [ + # feature. + "clap/default", + "clap/wrap_help", ++ ++ # WAPM paper TTFI stdout (Total compilation time / Execution N) ++ "ttfi-report", + ] + + # ======================================== +@@ -506,6 +509,7 @@ run = [ + "wasmtime-cli-flags/async", + ] + completion = ["dep:clap_complete"] ++ttfi-report = [] + + [[test]] + name = "disas" +diff --git a/src/commands/run.rs b/src/commands/run.rs +index 7baa4a3..3d347ee 100644 +--- a/src/commands/run.rs ++++ b/src/commands/run.rs +@@ -13,6 +13,8 @@ use std::ffi::OsString; + use std::path::{Path, PathBuf}; + use std::sync::{Arc, Mutex}; + use std::thread; ++#[cfg(feature = "ttfi-report")] ++use std::time::Instant; + use wasi_common::sync::{ambient_authority, Dir, TcpListener, WasiCtxBuilder}; + use wasmtime::{Engine, Func, Module, Store, StoreLimits, Val, ValType}; + use wasmtime_wasi::{IoView, WasiView}; +@@ -429,6 +431,8 @@ impl RunCommand { + let result = match linker { + CliLinker::Core(linker) => { + let module = module.unwrap_core(); ++ #[cfg(feature = "ttfi-report")] ++ let exec_start = Instant::now(); + let instance = linker + .instantiate_async(&mut *store, &module) + .await +@@ -459,10 +463,13 @@ impl RunCommand { + .or_else(|| instance.get_func(&mut *store, "_start")) + }; + +- match func { ++ let run_result = match func { + Some(func) => self.invoke_func(store, func).await, + None => Ok(()), +- } ++ }; ++ #[cfg(feature = "ttfi-report")] ++ crate::ttfi_report::report_execution(exec_start.elapsed()); ++ run_result + } + #[cfg(feature = "component-model")] + CliLinker::Component(linker) => { +diff --git a/src/common.rs b/src/common.rs +index f9275e2..13d39c6 100644 +--- a/src/common.rs ++++ b/src/common.rs +@@ -3,6 +3,7 @@ + use anyhow::{anyhow, bail, Context, Result}; + use clap::Parser; + use std::net::TcpListener; ++use std::time::Instant; + use std::{fs::File, path::Path, time::Duration}; + use wasmtime::{Engine, Module, Precompiled, StoreLimits, StoreLimitsBuilder}; + use wasmtime_cli_flags::{opt::WasmtimeOptionValue, CommonOptions}; +@@ -181,15 +182,21 @@ impl RunCommon { + // which isn't ready to happen at this time). It's hoped though that + // opening a file twice isn't too bad in the grand scheme of things with + // respect to the CLI. ++ #[cfg(feature = "ttfi-report")] ++ let mmap_start = Instant::now(); + match wasmtime::_internal::MmapVec::from_file(file) { +- Ok(map) => self.load_module_contents( ++ Ok(map) => { ++ #[cfg(feature = "ttfi-report")] ++ crate::ttfi_report::report_mmap(mmap_start.elapsed()); ++ self.load_module_contents( + engine, + path, + &map, + || unsafe { Module::deserialize_file(engine, path) }, + #[cfg(feature = "component-model")] + || unsafe { Component::deserialize_file(engine, path) }, +- ), ++ ) ++ } + Err(_) => { + let bytes = std::fs::read(path) + .with_context(|| format!("failed to read file: {}", path.display()))?; +@@ -245,7 +252,14 @@ impl RunCommon { + } + } + Some(wasmtime::CodeHint::Module) | None => { +- RunTarget::Core(code.compile_module()?) ++ #[cfg(feature = "ttfi-report")] ++ let compile_start = Instant::now(); ++ let module = code.compile_module()?; ++ #[cfg(feature = "ttfi-report")] ++ crate::ttfi_report::report_compile_time(compile_start.elapsed()); ++ #[cfg(not(feature = "ttfi-report"))] ++ let module = code.compile_module()?; ++ RunTarget::Core(module) + } + } + } +diff --git a/src/lib.rs b/src/lib.rs +index 296c75d..f1ee4db 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -8,3 +8,6 @@ pub mod commands; + + #[cfg(feature = "run")] + pub(crate) mod common; ++ ++#[cfg(feature = "ttfi-report")] ++pub(crate) mod ttfi_report; +diff --git a/src/ttfi_report.rs b/src/ttfi_report.rs +new file mode 100644 +index 0000000..3dc5ce1 +--- /dev/null ++++ b/src/ttfi_report.rs +@@ -0,0 +1,34 @@ ++//! WAPM paper-style Time-to-First-Invocation reporting on stdout. ++//! ++//! Enabled with the `ttfi-report` crate feature (on by default in dtvm paper builds). ++ ++use std::sync::atomic::{AtomicUsize, Ordering}; ++use std::time::Duration; ++ ++static EXEC_COUNT: AtomicUsize = AtomicUsize::new(0); ++ ++/// Reset per-process execution counter (optional; new process starts at 0). ++pub fn reset_execution_count() { ++ EXEC_COUNT.store(0, Ordering::Relaxed); ++} ++ ++pub fn report_mmap(elapsed: Duration) { ++ let us = elapsed.as_micros(); ++ println!( ++ "Creating mmap for file took: {:.3}µs", ++ us as f64 / 1000.0 ++ ); ++ println!("mmap success:"); ++} ++ ++pub fn report_compile_time(elapsed: Duration) { ++ let us = elapsed.as_micros(); ++ let ms = us / 1000; ++ println!("Total compilation time: {} ms ({} µs)", ms, us); ++} ++ ++pub fn report_execution(elapsed: Duration) { ++ let n = EXEC_COUNT.fetch_add(1, Ordering::Relaxed) + 1; ++ let ms = elapsed.as_secs_f64() * 1000.0; ++ println!("Execution {}: {:.3} ms", n, ms); ++} diff --git a/benchmarks/paper/runtimes/wasmtime-31.0.0/version.txt b/benchmarks/paper/runtimes/wasmtime-31.0.0/version.txt new file mode 100644 index 000000000..a51087476 --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-31.0.0/version.txt @@ -0,0 +1 @@ +wasmtime 31.0.0 (7a9be587f 2025-03-20) diff --git a/benchmarks/paper/runtimes/wasmtime-45.0.0/README.md b/benchmarks/paper/runtimes/wasmtime-45.0.0/README.md new file mode 100644 index 000000000..a836422cd --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-45.0.0/README.md @@ -0,0 +1,32 @@ +# Wasmtime 45.0.0 (TTFI / overflow / fib mainline) + +Shared version for PolyBench TTFI, WAPM TTFI, overflow, and fib(30). Requires a source tree **already containing the `ttfi-report` instrumentation**. + +## Instrumentation Locations + +- `src/ttfi_report.rs` +- `Cargo.toml` (`ttfi-report` feature) +- `src/common.rs`, `src/commands/run.rs` + +Example instrumented source: `/path/to/wasmtime-45.0.0` + +> The equivalent patch for the paper-era 31.0.0 is `../wasmtime-31.0.0/patches/ttfi-report.patch` (same semantics; usable as a cherry-pick reference). + +## Build + +```bash +# The default source-path variable is WASMER_SRC (historical name; points at the wasmtime source) +WASMER_SRC=/path/to/wasmtime-45.0.0 ./build.sh +# artifact: out/wasmtime +``` + +## Usage (TTFI) + +```bash +export WASMTIME_CACHE=0 +rm -rf ~/.cache/wasmtime # clear the cache before each cold start +./out/wasmtime run case.wasm --invoke main +# expected stdout: Total compilation time: ms (<µs> µs) +``` + +Benchmark entry points: [`../../docs/POLYBENCH_TTFI_REPRODUCE.md`](../../docs/POLYBENCH_TTFI_REPRODUCE.md), [`../../docs/WAPM_TTFI_REPRODUCTION.md`](../../docs/WAPM_TTFI_REPRODUCTION.md). diff --git a/benchmarks/paper/runtimes/wasmtime-45.0.0/build.sh b/benchmarks/paper/runtimes/wasmtime-45.0.0/build.sh new file mode 100755 index 000000000..daa41f98a --- /dev/null +++ b/benchmarks/paper/runtimes/wasmtime-45.0.0/build.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Build Wasmtime v45.0.0 with WAPM TTFI reporting. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +WASMER_SRC="${WASMER_SRC:-/path/to/wasmtime-45.0.0}" +OUT="$ROOT/out" + +if [[ -f "$HOME/.cargo/env" ]]; then + # shellcheck disable=SC1091 + source "$HOME/.cargo/env" +fi + +echo "Building wasmtime v45.0.0 from $WASMER_SRC (release, -j6)..." +cd "$WASMER_SRC" +cargo build --release -j6 + +mkdir -p "$OUT" +install -m 755 "$WASMER_SRC/target/release/wasmtime" "$OUT/wasmtime" +echo "Installed: $OUT/wasmtime" +"$OUT/wasmtime" --version diff --git a/benchmarks/paper/scripts/README.md b/benchmarks/paper/scripts/README.md new file mode 100644 index 000000000..6fd3e73ef --- /dev/null +++ b/benchmarks/paper/scripts/README.md @@ -0,0 +1,80 @@ +# Scripts + +Benchmark and table-generation scripts, grouped by experiment. + +## PolyBench Wall-clock + +| Script | Purpose | +|--------|---------| +| `setup_polybench_case.sh` | creates `benchmark/polybenchc` and `wapm` links under `webassembly-testsuites/case/` (run once before first use) | +| `run_polybench.sh` | correctness runtest (`dtvm` / `wasmtime` / `iwasm`) | +| `bench_polybench_timing.sh` | single-runtime wall-clock CSV (1 warmup + 3 timed) | +| `webassembly-testsuites/` | `runtest_webassembly.py` + per-runtime configs (snapshot from the same source as the paper) | + +Entry document: [`../docs/POLYBENCH_REPRODUCE.md`](../docs/POLYBENCH_REPRODUCE.md) + +```bash +./setup_polybench_case.sh +./run_polybench.sh dtvm +./bench_polybench_timing.sh dtvm multipass +./bench_polybench_timing.sh wasmtime default +./bench_polybench_timing.sh wasmer llvm +``` + +## PolyBench TTFI (DTVM lazy vs Wasmtime 45 / Wasmer 7.1 three backends) + +| Script | Purpose | +|--------|---------| +| `run_polybench_ttfi_round.sh ` | one-shot flow: DTVM lazy + wasmtime45 + wasmer 7.1 (cr/sp/llvm) + merged table | +| `run_polybench_ttfi_compare.sh ` | single runtime | +| `build_polybench_ttfi_table.py` | merge `results.csv` into md/csv | + +Entry document: [`../docs/POLYBENCH_TTFI_REPRODUCE.md`](../docs/POLYBENCH_TTFI_REPRODUCE.md) + +```bash +export DTVM=$PWD/runtimes/dtvm_main/dtvm +export WASMTIME=$PWD/runtimes/wasmtime-45.0.0/out/wasmtime +export WASMER=$PWD/runtimes/wasmer-7.1.0/out/bin/wasmer +export WASMTIME_CACHE=0 +./run_polybench_ttfi_round.sh 1 +``` + +## WAPM TTFI (DTVM lazy vs Wasmtime 45 / Wasmer 7.1 three backends) + +| Script | Purpose | +|--------|---------| +| `run_wapm_v45_v71_round.sh ` | one-shot flow: dtvm + wt45 + wasmer 7.1 (cr/sp/llvm) + merged table | +| `run_dtvm_wt_compile_round.sh ` | dtvm + wasmtime, 20 cases | +| `run_wasmer_ttfi_compare.sh ` | single wasmer backend | +| `run_wasmtime_ttfi_compare.sh` | wasmtime only | +| `build_wapm_local_table.py` | build the paper-format md/csv from logs/CSVs | +| `run_wapm_local_full_round.sh ` | paper versions (wt31 + wasmer 5.0.4, optional historical comparison) | + +Entry document: [`../docs/WAPM_TTFI_REPRODUCTION.md`](../docs/WAPM_TTFI_REPRODUCTION.md) + +```bash +export DTVM=/path/to/DTVM/build/dtvm +export WASMTIME=$PWD/runtimes/wasmtime-45.0.0/out/wasmtime +export WASMER=$PWD/runtimes/wasmer-7.1.0/out/bin/wasmer +export WASMTIME_CACHE=0 +./run_wapm_v45_v71_round.sh 3 +``` + +## DTVM WAPM Lazy Per-stage Statistics / TTFI Estimate + +Following the paper's `avg_compile_time.py`, the inferred formula is `ttfi_est = load + precompile + instantiation + (fg_jit / fg_count)`. + +| Script | Purpose | +|--------|---------| +| `run_lazy_ttfi_est.sh ` | WAPM lazy + statistics, TTFI estimate | +| `run_lazy_stats.sh` | WAPM lazy + statistics, all stages / Total | +| `run_lazy_20.sh` | WAPM lazy wall-clock (20 cases, fortune stands in for zuk) | +| `run_lazy_paper.sh` | paper-style reproduction | +| `infer_lazy_timing.py` | multi-metric inference vs the paper | +| `compare_lazy_runtime_ratios.sh` | ratio comparison | + +## Missing + +- [ ] the original `test_lazy.sh` wall-clock script (absent from the archive; `run_lazy_ttfi_est.sh` currently serves as the statistics-metric reproduction) +- [ ] contract benchmark runner script (the runner lives in the testbed) +- [ ] version-collection script (writes `runtimes/*/version.txt`) diff --git a/benchmarks/paper/scripts/avg_compile_time.py b/benchmarks/paper/scripts/avg_compile_time.py new file mode 100644 index 000000000..e3871e19b --- /dev/null +++ b/benchmarks/paper/scripts/avg_compile_time.py @@ -0,0 +1,51 @@ +import re +import sys + + +def process_log_file(log_file_path): + pattern = r"Total compilation time: \d+ ms \((\d+) [μµ]s\)" + + times_in_microseconds = [] + total_compilation_time_lines = [] + + try: + with open(log_file_path, 'r', encoding='utf-8') as file: + for line in file: + if "Total compilation time" not in line: + continue + total_compilation_time_lines.append(line.strip()) + match = re.search(pattern, line) + if match: + times_in_microseconds.append(int(match.group(1))) + else: + print(f"pattern mismatch: {line.strip()}") + except FileNotFoundError: + print(f"Error: File '{log_file_path}' not found.") + return + + if not total_compilation_time_lines: + print(f"No 'Total compilation time' sentences found in '{log_file_path}'.") + return + + print("\nAll 'Total compilation time' sentences:") + for sentence in total_compilation_time_lines: + print(sentence) + + # Group every 10 samples and report the per-group average in ms. + print("\nlen: ", len(total_compilation_time_lines)) + averages_in_milliseconds = [] + for i in range(0, len(times_in_microseconds), 10): + group = times_in_microseconds[i:i + 10] + if group: + averages_in_milliseconds.append(sum(group) / len(group) / 1000.0) + + if averages_in_milliseconds: + print("\nGroup averages (10 samples per group, ms):") + for idx, avg_ms in enumerate(averages_in_milliseconds, start=1): + print(f"Group {idx}: {avg_ms:.3f} ms") + else: + print("\nNo microsecond values extracted; cannot compute averages.") + + +if __name__ == "__main__": + process_log_file(sys.argv[1] if len(sys.argv) > 1 else "dtvm_compile_time.txt") diff --git a/benchmarks/paper/scripts/bench_polybench_timing.sh b/benchmarks/paper/scripts/bench_polybench_timing.sh new file mode 100755 index 000000000..43a4b89dd --- /dev/null +++ b/benchmarks/paper/scripts/bench_polybench_timing.sh @@ -0,0 +1,242 @@ +#!/usr/bin/env bash +# Benchmark PolyBench/C wasm cases and emit CSV for comparison with dtvm_polybench.xlsx. +# +# Timing semantics (local reproduction): +# - Wall time of one process invocation (includes JIT compile on first run). +# - Default: 1 warmup + N timed runs; reports min/mean/median ms. +# - Does not match archived paper logs unless the original harness is recovered. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +CASE_DIR="${CASE_DIR:-$ROOT/benchmarks/polybenchc}" +OUT_DIR="${OUT_DIR:-$ROOT/raw_data/benchs}" +REPEATS="${REPEATS:-3}" +WARMUP="${WARMUP:-1}" +RUNTIME="${1:-dtvm}" +PROFILE="${2:-multipass}" + +mkdir -p "$OUT_DIR" +STAMP="$(date +%Y%m%d_%H%M%S)" +CSV="$OUT_DIR/polybench_timing_${RUNTIME}_${PROFILE}_${STAMP}.csv" + +DTVM="${DTVM:-$ROOT/runtimes/dtvm/dtvm}" +WASMTIME="${WASMTIME:-$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime}" +IWASM="${IWASM:-$ROOT/runtimes/wamr-1.2.3/out/iwasm}" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-5.0.4/out/wasmer}" + +source "$ROOT/scripts/common.sh" +if [[ "$RUNTIME" == "dtvm" ]]; then + warn_if_debug_dtvm "$DTVM" +fi +XLSX="${XLSX:-$ROOT/raw_data/benchs/dtvm_polybench.xlsx}" + +wasmer_compiler_flag() { + case "$PROFILE" in + cranelift) echo --cranelift ;; + llvm) echo --llvm ;; + singlepass) echo --singlepass ;; + *) + echo "Unknown wasmer profile: $PROFILE (cranelift|llvm|singlepass)" >&2 + return 2 + ;; + esac +} + +dtvm_profile_opts() { + case "$PROFILE" in + lazy) + echo "-m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread" + ;; + lazy_greedy_mt) + # Lazy + greedy RA + multipass multithread (all enabled). + echo "-m multipass --enable-multipass-lazy" + ;; + multipass_greedy_mt) + # Greedy register allocation + multipass multithread enabled (defaults). + echo "-m multipass" + ;; + multipass|*) + echo "-m multipass --disable-multipass-greedyra --disable-multipass-multithread" + ;; + esac +} + +run_case() { + local wasm="$1" + local -a cmd=() + case "$RUNTIME" in + dtvm) + local -a zopts=() + read -r -a zopts <<< "$(dtvm_profile_opts)" + cmd=("$DTVM" "${zopts[@]}" "$wasm") + ;; + wasmtime) + if [[ "$PROFILE" == "nocache" ]]; then + export WASMTIME_CACHE=0 + fi + cmd=("$WASMTIME" run "$wasm" --invoke main) + ;; + wasmtime_nocache) + WASMTIME_CACHE=0 cmd=("$WASMTIME" run "$wasm" --invoke main) + ;; + iwasm) + cmd=("$IWASM" --heap-size=0 --stack-size=8000000 "$wasm") + ;; + wasmer) + local -a wopts=() + read -r -a wopts <<< "$(wasmer_compiler_flag)" + cmd=("$WASMER" run "$wasm" "${wopts[@]}" -q) + ;; + *) + echo "Unknown runtime: $RUNTIME (dtvm|wasmtime|wasmtime_nocache|iwasm|wasmer)" >&2 + return 2 + ;; + esac + + local i rc + for ((i = 0; i < WARMUP; i++)); do + "${cmd[@]}" >/dev/null 2>&1 || return 1 + done + + measure_ms() { + local start end + start="$(date +%s%N)" + set +e + "${cmd[@]}" >/dev/null 2>&1 + rc=$? + set -e + end="$(date +%s%N)" + if [[ $rc -ne 0 ]]; then + return 1 + fi + awk -v s="$start" -v e="$end" 'BEGIN { printf "%.3f", (e - s) / 1e6 }' + } + + local -a samples=() + for ((i = 0; i < REPEATS; i++)); do + wall="$(measure_ms)" || { + echo "failed" + return 1 + } + samples+=("$wall") + done + + local min mean med + min="$(printf '%s\n' "${samples[@]}" | sort -n | head -1)" + mean="$(printf '%s\n' "${samples[@]}" | awk '{s+=$1} END {printf "%.3f", s/NR}')" + med="$(printf '%s\n' "${samples[@]}" | sort -n | awk '{ + a[NR]=$1 + } END { + if (NR%2) printf "%.3f", a[(NR+1)/2]; else printf "%.3f", (a[NR/2]+a[NR/2+1])/2 + }')" + echo "$min,$mean,$med" +} + +echo "case,runtime,profile,repeat_min_ms,repeat_mean_ms,repeat_median_ms,exit" > "$CSV" + +shopt -s nullglob +for wasm in "$CASE_DIR"/*.wasm; do + case_name="$(basename "$wasm" .wasm)" + printf '%s' "$case_name" >&2 + result="$(run_case "$wasm" 2>/dev/null || echo "failed,failed,failed,1")" + IFS=',' read -r min_ms mean_ms med_ms exit_code <<< "$result" + if [[ "$result" == *failed* ]]; then + echo "$case_name,$RUNTIME,$PROFILE,,,,1" >> "$CSV" + echo " FAIL" >&2 + else + echo "$case_name,$RUNTIME,$PROFILE,$min_ms,$mean_ms,$med_ms,0" >> "$CSV" + echo " ${med_ms}ms" >&2 + fi +done + +echo "Wrote $CSV" + +if command -v python3 >/dev/null && [[ -f "$XLSX" ]]; then + python3 - "$CSV" "$XLSX" "$RUNTIME" "$PROFILE" <<'PY' +import sys, zipfile +from xml.etree import ElementTree as ET + +csv_path, xlsx_path, runtime, profile = sys.argv[1:5] +col_map = { + ("dtvm", "multipass"): "dtvm multipass", + ("dtvm", "multipass_greedy_mt"): "dtvm multipass", + ("dtvm", "lazy"): "dtvm multipass + lazy ", + ("dtvm", "lazy_greedy_mt"): "dtvm multipass + lazy ", + ("wasmtime", "default"): "wasmtime", + ("wasmtime", "nocache"): "wasmtime nocache", + ("wasmer", "cranelift"): "wasmer cranelift", + ("wasmer", "llvm"): "wasmer llvm", + ("wasmer", "singlepass"): "wasmer singlepass", +} +col = col_map.get((runtime, profile)) +if not col: + sys.exit(0) + +ns = {"m": "http://schemas.openxmlformats.org/spreadsheetml/2006/main"} +with zipfile.ZipFile(xlsx_path) as z: + ss = ET.fromstring(z.read("xl/sharedStrings.xml")) + strings = [ + "".join( + (x.text or "") + for x in si.iter("{http://schemas.openxmlformats.org/spreadsheetml/2006/main}t") + ) + for si in ss.findall("m:si", ns) + ] + sh = ET.fromstring(z.read("xl/worksheets/sheet1.xml")) + rows = sh.findall(".//m:row", ns) + header = [] + for c in rows[0].findall("m:c", ns): + v = c.find("m:v", ns) + if v is None: + continue + header.append(strings[int(v.text)] if c.get("t") == "s" else v.text) + try: + col_idx = header.index(col) + except ValueError: + print(f"Column not found: {col!r}") + sys.exit(0) + ref = {} + for row in rows[1:]: + cells = row.findall("m:c", ns) + if not cells: + continue + name = None + val = None + for c in cells: + r = c.get("r", "") + col_letter = "".join(ch for ch in r if ch.isalpha()) + v = c.find("m:v", ns) + if v is None: + continue + if col_letter == "A": + name = ( + strings[int(v.text)] + if c.get("t") == "s" + else v.text + ) + if name.endswith(".wasm"): + name = name.split("/")[-1].replace(".wasm", "") + idx = ord(col_letter) - ord("A") + if idx == col_idx: + val = float(v.text) + if name: + ref[name] = val + +import csv +ours = {} +with open(csv_path) as f: + for row in csv.DictReader(f): + if row.get("repeat_median_ms"): + ours[row["case"]] = float(row["repeat_median_ms"]) + +print(f"\nComparison vs xlsx column: {col}") +print(f"{'case':<16} {'ours_med':>10} {'xlsx':>10} {'ratio':>8}") +for case in sorted(ref): + if case not in ours: + continue + x = ref[case] + o = ours[case] + ratio = o / x if x else 0 + print(f"{case:<16} {o:10.2f} {x:10.2f} {ratio:8.2f}") +PY +fi diff --git a/benchmarks/paper/scripts/build_polybench_ttfi_table.py b/benchmarks/paper/scripts/build_polybench_ttfi_table.py new file mode 100644 index 000000000..6fbba0d49 --- /dev/null +++ b/benchmarks/paper/scripts/build_polybench_ttfi_table.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +"""Merge PolyBench TTFI results.csv files into one comparison table.""" +from __future__ import annotations + +import csv +import os +import sys +from pathlib import Path +from statistics import median + +ROOT = Path(__file__).resolve().parents[1] + + +def load_compile(path: Path) -> dict[str, float]: + out: dict[str, float] = {} + with path.open() as f: + for row in csv.DictReader(f): + if row.get("compile_ms"): + out[row["case"]] = float(row["compile_ms"]) + return out + + +def main() -> None: + bench_root = Path(os.environ["BENCH_ROOT"]) + out_dir = Path(os.environ.get("OUT_DIR", bench_root / "table")) + out_dir.mkdir(parents=True, exist_ok=True) + + paths = { + "dtvm": Path(os.environ["DTVM_CSV"]), + "wasmtime45": Path(os.environ["WT_CSV"]), + "wasmer_sp": Path(os.environ["WASMER_SP_CSV"]), + "wasmer_cf": Path(os.environ["WASMER_CF_CSV"]), + "wasmer_llvm": Path(os.environ["WASMER_LLVM_CSV"]), + } + greedy_path = os.environ.get("DTVM_GREEDY_CSV") + greedy: dict[str, float] | None = None + if greedy_path: + greedy = load_compile(Path(greedy_path)) + + data = {k: load_compile(p) for k, p in paths.items()} + case_sets = [set(d.keys()) for d in data.values()] + if greedy: + case_sets.append(set(greedy.keys())) + cases = sorted(set.intersection(*case_sets)) + if not cases: + print("No overlapping cases", file=sys.stderr) + sys.exit(1) + + csv_path = out_dir / "polybench_ttfi_compare.csv" + rows = [] + for case in cases: + row = {"case": case} + for k, d in data.items(): + row[f"{k}_compile_ms"] = d[case] + if greedy and case in greedy: + row["dtvm_greedy_mt_compile_ms"] = greedy[case] + row["dtvm_over_wt"] = data["dtvm"][case] / data["wasmtime45"][case] + row["dtvm_over_wasmer_llvm"] = data["dtvm"][case] / data["wasmer_llvm"][case] + rows.append(row) + + fields = ["case"] + [f"{k}_compile_ms" for k in paths] + [ + "dtvm_over_wt", + "dtvm_over_wasmer_llvm", + ] + if greedy: + fields.insert(2, "dtvm_greedy_mt_compile_ms") + + with csv_path.open("w", newline="") as f: + w = csv.DictWriter(f, fieldnames=fields) + w.writeheader() + w.writerows(rows) + + def med_ratio(num: str, den: str, src: dict[str, dict[str, float]] | None = None) -> float: + d = src or data + rs = [d[num][c] / d[den][c] for c in cases] + return median(rs) + + dtvm_ver = ( + Path(os.environ["DTVM_VERSION"]).read_text().strip() + if os.environ.get("DTVM_VERSION") + else "dtvm_main" + ) + md_path = out_dir / "polybench_ttfi_compare.md" + md = [ + "# PolyBench TTFI (Total compilation time)\n", + "\nMetric: WAPM `Total compilation time` line (load + post-loading compile before first execution).\n", + "\n## Runtimes\n", + "- DTVM: **multipass lazy** (same as WAPM: `--enable-multipass-lazy`, greedy/MT off, `--enable-statistics`)\n", + f" - commit: `{dtvm_ver}`\n", + "- Wasmtime: **45.0.0** (`WASMTIME_CACHE=0`, cold cache per repeat)\n", + "- Wasmer: **7.1.0** singlepass / cranelift / llvm (`--cache-dir=/dev/null`)\n", + f"\n**Data dir:** `{bench_root}`\n", + ] + if greedy: + md.append( + "\n> Note: the `dtvm_greedy_mt` column is an earlier eager `-m multipass` result (not directly comparable to the WAPM lazy metric).\n" + ) + md += [ + "\n## Median compile (ms) ratios (DTVM lazy)\n", + f"| DTVM lazy / Wasmtime 45 | **{med_ratio('dtvm', 'wasmtime45'):.3f}** |\n", + f"| DTVM lazy / Wasmer singlepass | **{med_ratio('dtvm', 'wasmer_sp'):.3f}** |\n", + f"| DTVM lazy / Wasmer cranelift | **{med_ratio('dtvm', 'wasmer_cf'):.3f}** |\n", + f"| DTVM lazy / Wasmer llvm | **{med_ratio('dtvm', 'wasmer_llvm'):.3f}** |\n", + f"| Wasmtime / Wasmer llvm | **{med_ratio('wasmtime45', 'wasmer_llvm'):.3f}** |\n", + "\nNormalized **DTVM lazy / Wasm45 / Wasmer-LLVM**: " + f"**1 / {med_ratio('wasmtime45', 'dtvm'):.2f} / {med_ratio('wasmer_llvm', 'dtvm'):.2f}**\n", + ] + if greedy: + gdata = {"dtvm": greedy, **{k: v for k, v in data.items() if k != "dtvm"}} + md.append( + f"\n(reference) DTVM greedy_mt / Wasmtime 45 median: **{med_ratio('dtvm', 'wasmtime45', gdata):.3f}**\n" + ) + md += [ + "\n## Per-case compile ms\n", + "\n| case | DTVM lazy | " + + ("DTVM greedy_mt | " if greedy else "") + + "Wasm45 | Wasmer SP | Wasmer CF | Wasmer LLVM | lazy/WT | lazy/LLVM |\n", + "|---|---:|" + + ("---:|" if greedy else "") + + "---:|---:|---:|---:|---:|---:|\n", + ] + for case in cases: + greedy_col = f"{greedy[case]:.1f} | " if greedy and case in greedy else "" + md.append( + f"| {case} | {data['dtvm'][case]:.1f} | {greedy_col}" + f"{data['wasmtime45'][case]:.1f} | " + f"{data['wasmer_sp'][case]:.1f} | {data['wasmer_cf'][case]:.1f} | " + f"{data['wasmer_llvm'][case]:.1f} | " + f"{data['dtvm'][case]/data['wasmtime45'][case]:.2f} | " + f"{data['dtvm'][case]/data['wasmer_llvm'][case]:.2f} |\n" + ) + md.append(f"\nFull CSV: [`{csv_path.name}`]({csv_path.name})\n") + md_path.write_text("".join(md)) + print(f"Wrote {csv_path}") + print(f"Wrote {md_path}") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/paper/scripts/build_wapm_local_table.py b/benchmarks/paper/scripts/build_wapm_local_table.py new file mode 100755 index 000000000..127566de2 --- /dev/null +++ b/benchmarks/paper/scripts/build_wapm_local_table.py @@ -0,0 +1,360 @@ +#!/usr/bin/env python3 +"""Merge local WAPM TTFI runs into a paper-style table (compile_ms + ratios).""" + +from __future__ import annotations + +import csv +import os +import re +from collections import defaultdict +from pathlib import Path +from statistics import mean + +ROOT = Path(os.environ.get("ROOT", Path(__file__).resolve().parents[1])) +WAPM = ROOT / "benchmarks" / "wapm" +OUT_DIR = Path( + os.environ.get( + "OUT_DIR", + ROOT / "raw_data" / "benchs" / "wapm_local_table", + ) +) +PAPER_MD = ROOT / "raw_data" / "benchs" / "latencytofirstinvocation.md" + +DTVM_LOG_DIR = Path( + os.environ.get( + "DTVM_LOG_DIR", + ROOT / "raw_data" / "benchs" / "wapm_dtvm_wt_compile_20260528_v2" / "logs" / "dtvm", + ) +) +WT_CSV = Path( + os.environ.get( + "WT_CSV", + ROOT / "raw_data" / "benchs" / "wapm_dtvm_wt_compile_20260528_v2" / "wt" / "results.csv", + ) +) +WASMER_CR_CSV = Path( + os.environ.get( + "WASMER_CR_CSV", + ROOT / "raw_data" / "benchs" / "wasmer_cranelift_ttfi_20260528" / "results.csv", + ) +) +WASMER_SP_CSV = Path( + os.environ.get( + "WASMER_SP_CSV", + ROOT / "raw_data" / "benchs" / "wasmer_singlepass_ttfi_20260528" / "results.csv", + ) +) +WASMER_LLVM_CSV = Path( + os.environ.get( + "WASMER_LLVM_CSV", + ROOT / "raw_data" / "benchs" / "wasmer_llvm_ttfi_20260528" / "results.csv", + ) +) +TTFI_EST_CSV = Path( + os.environ.get( + "TTFI_EST_CSV", + ROOT / "raw_data" / "benchs" / "wapm_lazy_ttfi_est_20260528" / "results.csv", + ) +) + +CASES = [ + "amirali", + "base64cli", + "chkfont", + "code-stock", + "cowsay", + "dice", + "echo", + "erdtree", + "figlet", + "irb", + "md5", + "pi", + "pkg1", + "qr2text", + "sam", + "suggest", + "tpl", + "uuid", + "viu", + "fortune", +] + +COMPILE_RE = re.compile(r"Total compilation time: \d+ ms \((\d+) [μµ]s\)") + + +def avg_compile_from_logs(log_dir: Path) -> dict[str, float]: + by: dict[str, list[float]] = defaultdict(list) + if not log_dir.is_dir(): + return {} + for log in sorted(log_dir.glob("*.log")): + case = log.stem.rsplit("_", 1)[0] + m = COMPILE_RE.search(log.read_text(encoding="utf-8", errors="replace")) + if m: + by[case].append(int(m.group(1)) / 1000.0) + return {c: mean(v) for c, v in by.items() if v} + + +def load_csv_compile(path: Path) -> dict[str, float]: + if not path.is_file(): + return {} + out: dict[str, float] = {} + with path.open() as f: + for row in csv.DictReader(f): + if row.get("compile_ms"): + out[row["case"]] = float(row["compile_ms"]) + return out + + +def avg_ttfi_est(path: Path) -> dict[str, float]: + if not path.is_file(): + return {} + by: dict[str, list[float]] = defaultdict(list) + with path.open() as f: + for row in csv.DictReader(f): + by[row["case"]].append(float(row["ttfi_est_ms"])) + return {c: mean(v) for c, v in by.items() if v} + + +def wasm_size_kb(case: str) -> float: + p = WAPM / f"{case}.wasm" + return p.stat().st_size / 1024.0 if p.is_file() else 0.0 + + +def parse_paper_table() -> dict[str, dict[str, float]]: + """Parse latencytofirstinvocation.md paper columns.""" + paper: dict[str, dict[str, float]] = {} + if not PAPER_MD.is_file(): + return paper + for line in PAPER_MD.read_text(encoding="utf-8", errors="replace").splitlines(): + m = re.search(r"case/wapm/([\w-]+)\.wasm", line) + if not m or "avg" in line.lower(): + continue + case = m.group(1) + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) >= 7: + try: + paper[case] = { + "dtvm": float(cells[2]), + "wasmtime": float(cells[3]), + "wasmer_cranelift": float(cells[4]), + "wasmer_llvm": float(cells[5]), + "wasmer_singlepass": float(cells[6]), + } + except ValueError: + pass + return paper + + +def ratio(a: float | None, b: float | None) -> str: + if a is None or b is None or b == 0: + return "" + return f"{a / b:.3f}" + + +def main() -> None: + dtvm = avg_compile_from_logs(DTVM_LOG_DIR) + ttfi_est = avg_ttfi_est(TTFI_EST_CSV) + dtvm_proxy: list[str] = [] + for case in CASES: + if case not in dtvm and case in ttfi_est: + dtvm[case] = ttfi_est[case] + dtvm_proxy.append(case) + + wt = load_csv_compile(WT_CSV) + cr = load_csv_compile(WASMER_CR_CSV) + sp = load_csv_compile(WASMER_SP_CSV) + ll = load_csv_compile(WASMER_LLVM_CSV) + paper = parse_paper_table() + + OUT_DIR.mkdir(parents=True, exist_ok=True) + rows: list[dict] = [] + + for case in CASES: + z = dtvm.get(case) + w = wt.get(case) + c = cr.get(case) + s = sp.get(case) + llv = ll.get(case) + rows.append( + { + "case": case, + "wasm_kb": wasm_size_kb(case), + "dtvm": z, + "wasmtime": w, + "wasmer_cranelift": c, + "wasmer_llvm": llv, + "wasmer_singlepass": s, + "wt_over_dtvm": float(ratio(w, z)) if ratio(w, z) else None, + "cr_over_dtvm": float(ratio(c, z)) if ratio(c, z) else None, + "ll_over_dtvm": float(ratio(llv, z)) if ratio(llv, z) else None, + "sp_over_dtvm": float(ratio(s, z)) if ratio(s, z) else None, + "paper_dtvm": paper.get(case, {}).get("dtvm"), + "paper_wasmtime": paper.get(case, {}).get("wasmtime"), + "paper_wasmer_cranelift": paper.get(case, {}).get("wasmer_cranelift"), + "paper_wasmer_llvm": paper.get(case, {}).get("wasmer_llvm"), + "paper_wasmer_singlepass": paper.get(case, {}).get("wasmer_singlepass"), + } + ) + + csv_path = OUT_DIR / "wapm_local_latency_table.csv" + with csv_path.open("w", newline="") as f: + w = csv.writer(f) + w.writerow( + [ + "case", + "wasm_kb", + "dtvm_compile_ms", + "wasmtime_compile_ms", + "wasmer_cranelift_ms", + "wasmer_llvm_ms", + "wasmer_singlepass_ms", + "wt_over_dtvm", + "cr_over_dtvm", + "ll_over_dtvm", + "sp_over_dtvm", + "paper_dtvm", + "paper_wasmtime", + "paper_wasmer_cr", + "paper_wasmer_llvm", + "paper_wasmer_sp", + ] + ) + for r in rows: + w.writerow( + [ + r["case"], + f"{r['wasm_kb']:.3f}", + f"{r['dtvm']:.3f}" if r["dtvm"] is not None else "", + f"{r['wasmtime']:.3f}" if r["wasmtime"] is not None else "", + f"{r['wasmer_cranelift']:.3f}" if r["wasmer_cranelift"] is not None else "", + f"{r['wasmer_llvm']:.3f}" if r["wasmer_llvm"] is not None else "", + f"{r['wasmer_singlepass']:.3f}" if r["wasmer_singlepass"] is not None else "", + f"{r['wt_over_dtvm']:.3f}" if r["wt_over_dtvm"] is not None else "", + f"{r['cr_over_dtvm']:.3f}" if r["cr_over_dtvm"] is not None else "", + f"{r['ll_over_dtvm']:.3f}" if r["ll_over_dtvm"] is not None else "", + f"{r['sp_over_dtvm']:.3f}" if r["sp_over_dtvm"] is not None else "", + r["paper_dtvm"] or "", + r["paper_wasmtime"] or "", + r["paper_wasmer_cranelift"] or "", + r["paper_wasmer_llvm"] or "", + r["paper_wasmer_singlepass"] or "", + ] + ) + + def fmt(v: float | None, proxy: bool = False) -> str: + if v is None: + return "—" + s = f"{v:.3f}" + if proxy: + s += "†" + return s + + md_lines = [ + "# WAPM local latency table (compile / TTFI)\n", + "\n", + "Same layout as paper `latencytofirstinvocation.md`. " + "All runtime columns are **`Total compilation time`** (ms, from stdout), " + "3-run local average unless noted.\n", + "\n", + "**Data sources**\n", + f"- dtvm: `{DTVM_LOG_DIR}`\n", + f"- wasmtime: `{WT_CSV}`\n", + f"- wasmer cranelift: `{WASMER_CR_CSV}`\n", + f"- wasmer singlepass: `{WASMER_SP_CSV}`\n", + ( + f"- wasmer llvm: `{WASMER_LLVM_CSV}`\n" + if WASMER_LLVM_CSV.is_file() + else "- wasmer llvm: not built (requires LLVM 21)\n" + ), + "\n", + ] + if dtvm_proxy: + md_lines.append( + f"† dtvm for **{', '.join(dtvm_proxy)}**: no `Total compilation time` in dtvm logs; " + f"filled with **`ttfi_est`** from `{TTFI_EST_CSV.name}` " + "(different formula — re-run with instrumented `dtvm` for strict compare).\n\n" + ) + + md_lines.append( + "| case | wasm KB | dtvm lazy (dtvm) | wasmtime | wasmer cranelift | wasmer llvm | wasmer singlepass | wt/dtvm | cr/dtvm | ll/dtvm | sp/dtvm |\n" + ) + md_lines.append("| :--- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |\n") + + ratios_wt, ratios_cr, ratios_ll, ratios_sp = [], [], [], [] + for r in rows: + proxy = r["case"] in dtvm_proxy + md_lines.append( + f"| case/wapm/{r['case']}.wasm | {r['wasm_kb']:.3f} | " + f"{fmt(r['dtvm'], proxy)} | {fmt(r['wasmtime'])} | {fmt(r['wasmer_cranelift'])} | " + f"{fmt(r['wasmer_llvm'])} | {fmt(r['wasmer_singlepass'])} | " + f"{fmt(r['wt_over_dtvm']) if r['wt_over_dtvm'] else '—'} | " + f"{fmt(r['cr_over_dtvm']) if r['cr_over_dtvm'] else '—'} | " + f"{fmt(r['ll_over_dtvm']) if r['ll_over_dtvm'] else '—'} | " + f"{fmt(r['sp_over_dtvm']) if r['sp_over_dtvm'] else '—'} |\n" + ) + if r["wt_over_dtvm"] is not None: + ratios_wt.append(r["wt_over_dtvm"]) + if r["cr_over_dtvm"] is not None: + ratios_cr.append(r["cr_over_dtvm"]) + if r["ll_over_dtvm"] is not None: + ratios_ll.append(r["ll_over_dtvm"]) + if r["sp_over_dtvm"] is not None: + ratios_sp.append(r["sp_over_dtvm"]) + + md_lines.append( + f"| **avg** | | | | | | | **{mean(ratios_wt):.3f}** | **{mean(ratios_cr):.3f}** | " + f"**{mean(ratios_ll):.3f}** | **{mean(ratios_sp):.3f}** |\n" + if ratios_ll + else f"| **avg** | | | | | | | **{mean(ratios_wt):.3f}** | **{mean(ratios_cr):.3f}** | — | **{mean(ratios_sp):.3f}** |\n" + ) + + md_lines.append("\n## Local vs paper (compile ms ratio)\n\n") + md_lines.append( + "| case | dtvm L/P | wt L/P | wasmer-cr L/P | wasmer-llvm L/P | wasmer-sp L/P |\n" + ) + md_lines.append("| :--- | ---: | ---: | ---: | ---: | ---: |\n") + zr, wr, cr_r, ll_r, sr = [], [], [], [], [] + + def lp_ratio(local: float | None, paper: float | None) -> str: + if local is None or paper is None or paper == 0: + return "—" + return f"{local / paper:.2f}" + + for r in rows: + zc = lp_ratio(r["dtvm"], r["paper_dtvm"]) + wc = lp_ratio(r["wasmtime"], r["paper_wasmtime"]) + cc = lp_ratio(r["wasmer_cranelift"], r["paper_wasmer_cranelift"]) + lc = lp_ratio(r["wasmer_llvm"], r["paper_wasmer_llvm"]) + sc = lp_ratio(r["wasmer_singlepass"], r["paper_wasmer_singlepass"]) + if r["dtvm"] and r["paper_dtvm"]: + zr.append(r["dtvm"] / r["paper_dtvm"]) + if r["wasmtime"] and r["paper_wasmtime"]: + wr.append(r["wasmtime"] / r["paper_wasmtime"]) + if r["wasmer_cranelift"] and r["paper_wasmer_cranelift"]: + cr_r.append(r["wasmer_cranelift"] / r["paper_wasmer_cranelift"]) + if r["wasmer_llvm"] and r["paper_wasmer_llvm"]: + ll_r.append(r["wasmer_llvm"] / r["paper_wasmer_llvm"]) + if r["wasmer_singlepass"] and r["paper_wasmer_singlepass"]: + sr.append(r["wasmer_singlepass"] / r["paper_wasmer_singlepass"]) + md_lines.append(f"| {r['case']} | {zc} | {wc} | {cc} | {lc} | {sc} |\n") + + if zr: + ll_mean = f", wasmer-llvm {mean(ll_r):.2f}×" if ll_r else "" + md_lines.append( + f"\n**Mean local/paper:** dtvm {mean(zr):.2f}×, wasmtime {mean(wr):.2f}×, " + f"wasmer-cr {mean(cr_r):.2f}×{ll_mean}, wasmer-sp {mean(sr):.2f}× " + f"({len(zr)} cases with paper dtvm; fortune replaces paper zuk).\n" + ) + + md_path = OUT_DIR / "wapm_local_latency_table.md" + md_path.write_text("".join(md_lines)) + print(f"Wrote {csv_path}") + print(f"Wrote {md_path}") + if dtvm_proxy: + print(f"DTVM proxy (ttfi_est): {', '.join(dtvm_proxy)}") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/paper/scripts/common.sh b/benchmarks/paper/scripts/common.sh new file mode 100644 index 000000000..ad4db060a --- /dev/null +++ b/benchmarks/paper/scripts/common.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Shared helpers for the reproduction scripts. Source, do not execute. + +# Warn (non-fatal) if the dtvm binary looks like a non-Release build. +# The paper used CMAKE_BUILD_TYPE=Release; a Debug build is far slower and +# makes every comparison misleading. +warn_if_debug_dtvm() { + local dtvm="$1" cache bt + [[ -x "$dtvm" ]] || return 0 + cache="$(dirname "$dtvm")/CMakeCache.txt" + if [[ -f "$cache" ]]; then + bt="$(grep -E '^CMAKE_BUILD_TYPE(:[A-Z]+)?=' "$cache" | head -1 | cut -d= -f2-)" + if [[ -z "$bt" || "$bt" == "Debug" ]]; then + echo "warning: $dtvm was built with CMAKE_BUILD_TYPE='${bt:-}' (see $cache);" >&2 + echo " the paper used a Release build, so timings will be misleading." >&2 + fi + elif command -v readelf >/dev/null 2>&1 && readelf -S "$dtvm" 2>/dev/null | grep -q '\.debug_info'; then + echo "warning: $dtvm contains debug info; if it was built with CMAKE_BUILD_TYPE=Debug," >&2 + echo " timings will be far slower than the paper's Release build." >&2 + fi +} diff --git a/benchmarks/paper/scripts/compare_lazy_runtime_ratios.sh b/benchmarks/paper/scripts/compare_lazy_runtime_ratios.sh new file mode 100755 index 000000000..7873f468d --- /dev/null +++ b/benchmarks/paper/scripts/compare_lazy_runtime_ratios.sh @@ -0,0 +1,250 @@ +#!/usr/bin/env bash +# Compare baseline/dtvm ratios vs paper (wall-clock + optional dtvm ttfi_est denominator). +# Usage: +# ./compare_lazy_runtime_ratios.sh [repeats] +# WALL_CSV=path/to/results.csv ./compare_lazy_runtime_ratios.sh 0 # skip wall run +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PAPER="$ROOT/raw_data/benchs/latencytofirstinvocation.md" +TTFI_CSV="${TTFI_CSV:-$ROOT/raw_data/benchs/wapm_lazy_ttfi_est_20260528/summary.csv}" +OUT="${OUT:-$ROOT/raw_data/benchs/wapm_lazy_ratio_compare_$(date +%Y%m%d)}" +mkdir -p "$OUT" + +if [[ "$REPEATS" -gt 0 && -z "${WALL_CSV:-}" ]]; then + echo "==> Wall-clock run (all runtimes), repeats=$REPEATS" + WALL_DIR="$OUT/wall_run" + "$ROOT/scripts/run_lazy_paper.sh" "$REPEATS" "$WALL_DIR" + WALL_CSV="$WALL_DIR/results.csv" +elif [[ -z "${WALL_CSV:-}" ]]; then + WALL_CSV="$ROOT/raw_data/benchs/wapm_lazy_20260527/results.csv" + echo "==> Using existing wall CSV: $WALL_CSV" +fi + +export WALL_CSV TTFI_CSV PAPER OUT +python3 <<'PY' +import csv +import os +import re +import sys +from collections import defaultdict +from pathlib import Path +from statistics import mean + +wall_csv = Path(os.environ["WALL_CSV"]) +if not wall_csv.is_file(): + sys.exit(f"error: wall CSV not found: {wall_csv} (run run_lazy_paper.sh first or pass WALL_CSV=)") +ttfi_csv = Path(os.environ["TTFI_CSV"]) +paper_md = Path(os.environ["PAPER"]) +out = Path(os.environ["OUT"]) + +# paper[case][runtime] = ms; ratios[case][rt] = baseline/dtvm +paper_ms: dict[str, dict[str, float]] = {} +paper_ratio: dict[str, dict[str, float]] = {} + +paper_lines = paper_md.read_text().splitlines() if paper_md.is_file() else [] +if not paper_lines: + print(f"note: paper reference table not found at {paper_md}; paper columns will be blank") +for line in paper_lines: + if "avg" in line.lower(): + continue + m = re.search(r"case/wapm/([\w-]+)\.wasm", line) + if not m: + continue + case = m.group(1) + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) < 8: + continue + try: + dtvm = float(cells[2].split()[0]) + wt = float(cells[3].split()[0]) + cr = float(cells[4].split()[0]) + ll = float(cells[5].split()[0]) + sp = float(cells[6].split()[0]) + except ValueError: + continue + paper_ms[case] = { + "dtvm": dtvm, + "wasmtime": wt, + "wasmer_cranelift": cr, + "wasmer_llvm": ll, + "wasmer_singlepass": sp, + } + if dtvm > 0: + paper_ratio[case] = { + "wasmtime": wt / dtvm, + "wasmer_cranelift": cr / dtvm, + "wasmer_llvm": ll / dtvm, + "wasmer_singlepass": sp / dtvm, + } + +# wall averages +by = defaultdict(list) +with wall_csv.open() as f: + for row in csv.DictReader(f): + by[(row["case"], row["runtime"])].append(float(row["wall_ms"])) + +def avg(key): + v = by.get(key, []) + return mean(v) if v else float("nan") + +cases = sorted({k[0] for k in by}) +rts = ["dtvm", "wasmtime", "wasmer_cranelift", "wasmer_llvm", "wasmer_singlepass"] +baselines = [r for r in rts if r != "dtvm"] + +ttfi: dict[str, float] = {} +if ttfi_csv.is_file(): + with ttfi_csv.open() as f: + for row in csv.DictReader(f): + if row.get("ttfi_est_avg_ms"): + ttfi[row["case"]] = float(row["ttfi_est_avg_ms"]) + +lines = [ + "# WAPM lazy: runtime ratios vs the paper", + "", + f"- Wall-clock: `{wall_csv}`", + f"- DTVM TTFI est: `{ttfi_csv}` (formula: load+pre+inst+fg/n)", + f"- Paper: `{paper_md}`", + "", + "**ratio** = baseline / dtvm (>1 means the baseline is slower).", + "", + "## 1. Absolute time (ms) and ratios", + "", + "| case | | paper dtvm | wall dtvm | ttfi_est dtvm | paper wt | wall wt | wall wt/dtvm | paper wt/dtvm |", + "|------|--|----------:|---------:|-------------:|---------:|--------:|------------:|-------------:|", +] + +ratio_err_wall = defaultdict(list) # baseline -> list of |wall_ratio/paper_ratio - 1| +ratio_err_ttfi = defaultdict(list) + +for case in cases: + if case == "fortune": + pcase = "zuk" # paper row for fortune substitute + else: + pcase = case + p = paper_ms.get(pcase, {}) + z_wall = avg((case, "dtvm")) + z_ttfi = ttfi.get(case, float("nan")) + z_paper = p.get("dtvm", float("nan")) + + # wasmtime row as primary example in combined table - also write full section below + wt_w = avg((case, "wasmtime")) + pr = p.get("wasmtime", float("nan")) + wr = wt_w / z_wall if z_wall and z_wall == z_wall else float("nan") + pr_ratio = paper_ratio.get(pcase, {}).get("wasmtime", float("nan")) + note = " (fortune)" if case == "fortune" else "" + lines.append( + f"| {case}{note} | wasmtime | {z_paper:.3f} | {z_wall:.1f} | " + f"{z_ttfi:.3f} | {pr:.1f} | {wt_w:.1f} | {wr:.2f} | {pr_ratio:.2f} |" + ) + if pr_ratio == pr_ratio and wr == wr and pr_ratio > 0: + ratio_err_wall["wasmtime"].append(abs(wr / pr_ratio - 1.0)) + +lines += [ + "", + "### All-baseline ratio comparison (wall/dtvm vs paper/dtvm)", + "", + "| case | paper w/t | wall w/t | Δ% | paper cr/dtvm | wall cr/dtvm | Δ% | paper llvm/dtvm | wall llvm/dtvm | Δ% | paper sp/dtvm | wall sp/dtvm | Δ% |", + "|------|----------:|---------:|---:|-------------:|------------:|---:|---------------:|--------------:|---:|-------------:|------------:|---:|", +] + +def pct_delta(ours, paper): + if paper != paper or ours != ours or paper == 0: + return "-" + return f"{(ours / paper - 1) * 100:+.0f}%" + +for case in cases: + pcase = "zuk" if case == "fortune" else case + pr = paper_ratio.get(pcase, {}) + z = avg((case, "dtvm")) or 1.0 + cols = [] + for bl, pk in [ + ("wasmtime", "wasmtime"), + ("wasmer_cranelift", "cr"), + ("wasmer_llvm", "llvm"), + ("wasmer_singlepass", "sp"), + ]: + p_rat = pr.get(bl, float("nan")) + w_rat = avg((case, bl)) / z if z else float("nan") + cols.extend([f"{p_rat:.2f}" if p_rat == p_rat else "-", f"{w_rat:.2f}" if w_rat == w_rat else "-", pct_delta(w_rat, p_rat)]) + if p_rat == p_rat and w_rat == w_rat and p_rat > 0: + ratio_err_wall[bl].append(abs(w_rat / p_rat - 1.0)) + note = "†" if case == "fortune" else "" + lines.append(f"| {case}{note} | " + " | ".join(cols) + " |") + +# ttfi_est denominator ratios +if ttfi: + lines += [ + "", + "## 2. Ratios (dtvm denominator uses ttfi_est)", + "", + "Only dtvm is replaced by the formula estimate; baselines stay wall-clock.", + "", + "| case | paper wt/dtvm | wall wt/ttfi_est | paper llvm/dtvm | wall llvm/ttfi_est |", + "|------|-------------:|-----------------:|---------------:|-------------------:|", + ] + for case in cases: + pcase = "zuk" if case == "fortune" else case + pr = paper_ratio.get(pcase, {}) + zt = ttfi.get(case, 0) or float("nan") + if zt != zt or zt <= 0: + continue + w_wt = avg((case, "wasmtime")) / zt + w_ll = avg((case, "wasmer_llvm")) / zt + lines.append( + f"| {case} | {pr.get('wasmtime', 0):.2f} | {w_wt:.2f} | " + f"{pr.get('wasmer_llvm', 0):.2f} | {w_ll:.2f} |" + ) + for bl, pkey in [("wasmtime", "wasmtime"), ("wasmer_llvm", "wasmer_llvm")]: + p_r = pr.get(pkey, float("nan")) + w_r = avg((case, bl)) / zt + if p_r == p_r and w_r == w_r and p_r > 0: + ratio_err_ttfi[bl].append(abs(w_r / p_r - 1.0)) + +lines += [ + "", + "## 3. Summary: do the ratio shapes match", + "", +] + +lines.append("| baseline | mean |paper/ours−1| (wall dtvm) | mean |paper/ours−1| (ttfi dtvm) |") +lines.append("|----------|---------------------------|---------------------------|") +for bl in baselines: + ew = mean(ratio_err_wall[bl]) if ratio_err_wall[bl] else float("nan") + et = mean(ratio_err_ttfi[bl]) if ratio_err_ttfi[bl] else float("nan") + lines.append(f"| {bl} | {ew:.2f} | {et:.2f} |") + +# direction agreement: paper ratio > 1 and wall ratio > 1 +lines += ["", "### Direction agreement (paper>1 and wall>1, or both<1)", ""] +for bl in baselines: + agree = total = 0 + for case in cases: + if case == "fortune": + continue + pcase = case + pr = paper_ratio.get(pcase, {}).get(bl, float("nan")) + z = avg((case, "dtvm")) + wr = avg((case, bl)) / z if z else float("nan") + if pr != pr or wr != wr: + continue + total += 1 + if (pr > 1) == (wr > 1): + agree += 1 + lines.append(f"- **{bl}**: {agree}/{total} cases same slow-vs-fast direction") + +lines += [ + "", + "## 4. Interpretation", + "", + "- **Paper**: dtvm (lazy) is generally fastest; baseline/dtvm is mostly **>>1** (mean wasmtime/dtvm ~= **18.9**).", + "- **Local wall**: dtvm is often slower than wasmtime/wasmer; ratios are mostly **<1** -> **relative ranking reversed vs the paper**, i.e. not the same absolute time.", + "- **Ratio values**: a few cases are close (e.g. tpl, erdtree), but overall **|wall/paper-1| is large** -> the proportional relationship **cannot** be considered consistent.", + "- **ttfi_est as dtvm denominator**: on small cases wasmtime/ttfi_est sometimes lands closer to the paper's magnitude, but **irb etc. still deviate**.", + "", +] + +(out / "RATIO_COMPARE.md").write_text("\n".join(lines)) +print((out / "RATIO_COMPARE.md").read_text()) +PY diff --git a/benchmarks/paper/scripts/infer_lazy_timing.py b/benchmarks/paper/scripts/infer_lazy_timing.py new file mode 100755 index 000000000..48d87c5c3 --- /dev/null +++ b/benchmarks/paper/scripts/infer_lazy_timing.py @@ -0,0 +1,391 @@ +#!/usr/bin/env python3 +"""Infer paper TTFI by comparing narrow timing hypotheses to latency table.""" + +from __future__ import annotations + +import os +import re +import select +import shlex +import subprocess +import sys +import time +from dataclasses import dataclass +from pathlib import Path +from statistics import mean + +ROOT = Path(__file__).resolve().parents[1] +DTVM = Path(__import__("os").environ.get("DTVM", ROOT / "runtimes/dtvm/dtvm")) +WAPM = ROOT / "benchmarks/wapm" +PAPER_MD = ROOT / "raw_data/benchs/latencytofirstinvocation.md" +REPEATS = int(sys.argv[1]) if len(sys.argv) > 1 else 3 + +CASES = [ + "amirali", "base64cli", "chkfont", "code-stock", "cowsay", "dice", "echo", + "erdtree", "figlet", "irb", "md5", "pi", "pkg1", "qr2text", "sam", "suggest", + "tpl", "uuid", "viu", "fortune", +] + +DTVM_BASE = [ + str(DTVM), + "-m", "multipass", + "--enable-multipass-lazy", + "--disable-multipass-greedyra", + "--disable-multipass-multithread", + "--enable-statistics", + "--log-level", "info", +] + + +def load_paper() -> dict[str, float]: + paper: dict[str, float] = {} + if not PAPER_MD.is_file(): + return paper + for line in PAPER_MD.read_text().splitlines(): + m = re.search(r"case/wapm/(\w+)\.wasm", line) + if not m or "avg" in line.lower(): + continue + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + # cells[0]=case path, [1]=wasm KB, [2]=dtvm lazy ms + if len(cells) >= 3: + try: + paper[m.group(1)] = float(cells[2].split()[0]) + except ValueError: + pass + return paper + + +def is_engine_log(line: str) -> bool: + s = line.strip() + return s.startswith("[") and ("[info]" in s or "[warn]" in s or "[error]" in s) + + +def parse_stats(text: str) -> dict[str, float]: + out: dict[str, float] = {} + patterns = { + "total_ms": r"Total:\s*([\d.]+)ms", + "load_ms": r"Load:.*?total ([\d.]+)ms", + "precompile_ms": r"JIT Lazy Precompilation:.*?total ([\d.]+)ms", + "fg_jit_ms": r"JIT Lazy Compilation\(Fg\):.*?total ([\d.]+)ms", + "instantiation_ms": r"Instantiation:.*?total ([\d.]+)ms", + "execution_ms": r"Execution:.*?total ([\d.]+)ms", + } + fg_m = re.search( + r"JIT Lazy Compilation\(Fg\):\s*(\d+) times", text + ) + if fg_m: + out["fg_count"] = int(fg_m.group(1)) + for k, pat in patterns.items(): + m = re.search(pat, text) + if m: + out[k] = float(m.group(1)) + if "load_ms" in out and "precompile_ms" in out and "instantiation_ms" in out: + out["load_setup_ms"] = ( + out["load_ms"] + out["precompile_ms"] + out["instantiation_ms"] + ) + if "fg_jit_ms" in out and out.get("fg_count", 0) > 0: + out["first_fg_ms"] = out["fg_jit_ms"] / out["fg_count"] + if "load_setup_ms" in out and "first_fg_ms" in out: + out["after_first_fg_ms"] = out["load_setup_ms"] + out["first_fg_ms"] + if "after_first_fg_ms" in out and "execution_ms" in out: + out["first_fg_plus_exec_ms"] = out["after_first_fg_ms"] + out["execution_ms"] + return out + + +def _load_conf_fields(case: str) -> tuple[str, str, str]: + """Return (command, parameter, dir) strings from wasm.conf via bash source.""" + bash = f""" +set +e +cd {shlex.quote(str(WAPM))} +unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true +HEAD_COMMAND=(); COMMAND=(); PARAMETER=(); DIR=() +[ -f {shlex.quote(case + '.wasm.conf')} ] && source {shlex.quote(case + '.wasm.conf')} +case {shlex.quote(case)} in + erdtree) PARAMETER=() ;; + viu) + DIR=(--dir=.) + [ -f parallel-small.png ] && PARAMETER=(parallel-small.png) ;; + chkfont) [ -d fonts ] && DIR=(--dir=./fonts) ;; + figlet) [ -d fonts ] && DIR=(--dir=fonts) ;; +esac +printf '%s\\n' "${{COMMAND[*]-}}" +printf '%s\\n' "${{PARAMETER[*]-}}" +printf '%s\\n' "${{DIR[*]-}}" +""" + lines = subprocess.check_output(["bash", "-c", bash], text=True).splitlines() + while len(lines) < 3: + lines.append("") + return lines[0], lines[1], lines[2] + + +def build_shell_cmd(case: str) -> str: + """Mirror run_lazy_stats.sh command assembly.""" + command, parameter, dir_s = _load_conf_fields(case) + parts = list(DTVM_BASE) + [f"{case}.wasm"] + if dir_s.strip(): + for d in dir_s.split(): + d = d.replace("case/wapm/", "") + parts.append(d if d.startswith("--dir") else f"--dir={d}") + if parameter.strip(): + parts.append("--args") + parts.extend(parameter.split()) + dtvm_cmd = subprocess.list2cmdline(parts) + if command.strip(): + return f"{command} | {dtvm_cmd}" + return dtvm_cmd + + +def run_case_once(case: str) -> dict[str, float]: + cmd = build_shell_cmd(case) + t0 = time.perf_counter() + proc = subprocess.Popen( + cmd, + shell=True, + cwd=WAPM, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + assert proc.stdout is not None + fd = proc.stdout.fileno() + first_stdout_ms: float | None = None + chunks: list[str] = [] + buf = b"" + while True: + if proc.poll() is not None: + while True: + chunk = os.read(fd, 65536) + if not chunk: + break + buf += chunk + break + ready, _, _ = select.select([fd], [], [], 0.05) + if not ready: + continue + chunk = os.read(fd, 65536) + if not chunk: + break + buf += chunk + while b"\n" in buf: + raw, buf = buf.split(b"\n", 1) + line = raw.decode("utf-8", errors="replace") + "\n" + chunks.append(line) + if first_stdout_ms is None and line.strip() and not is_engine_log(line): + first_stdout_ms = (time.perf_counter() - t0) * 1000.0 + if buf: + line = buf.decode("utf-8", errors="replace") + if not line.endswith("\n"): + line += "\n" + chunks.append(line) + if first_stdout_ms is None and line.strip() and not is_engine_log(line): + first_stdout_ms = (time.perf_counter() - t0) * 1000.0 + + proc.wait() + full_wall_ms = (time.perf_counter() - t0) * 1000.0 + full_text = "".join(chunks) + stats = parse_stats(full_text) + + row = { + "first_stdout_ms": first_stdout_ms if first_stdout_ms is not None else full_wall_ms, + "full_wall_ms": full_wall_ms, + } + row.update(stats) + return row + + +def ratio(a: float, b: float) -> str: + if b <= 0: + return "-" + return f"{a/b:.2f}x" + + +@dataclass +class CaseResult: + case: str + paper_ms: float | None + first_stdout: float + full_wall: float + stats_total: float + after_first_fg: float + execution_ms: float + first_fg_plus_exec: float + load_setup: float + + +def main() -> None: + paper = load_paper() + results: list[CaseResult] = [] + + for case in CASES: + print(f">> {case}", flush=True) + reps = [run_case_once(case) for _ in range(REPEATS)] + + def avg(key: str) -> float: + vals = [r[key] for r in reps if key in r] + return mean(vals) if vals else float("nan") + + results.append( + CaseResult( + case=case, + paper_ms=paper.get(case), + first_stdout=avg("first_stdout_ms"), + full_wall=avg("full_wall_ms"), + stats_total=avg("total_ms"), + after_first_fg=avg("after_first_fg_ms"), + execution_ms=avg("execution_ms"), + first_fg_plus_exec=avg("first_fg_plus_exec_ms"), + load_setup=avg("load_setup_ms"), + ) + ) + + out_dir = ROOT / "raw_data/benchs" / "wapm_lazy_ttfi_infer" + out_dir.mkdir(parents=True, exist_ok=True) + + lines = [ + "# Lazy timing-model inference (vs the paper's dtvm lazy column)", + "", + f"- dtvm: `{DTVM}`", + f"- repeats: {REPEATS}", + "", + "**Assumptions**", + "- `first_stdout`: wall time to the first non-engine stdout line (program output)", + "- `after_first_fg`: Load+Precompile+Instantiation + one average Fg (i.e. right after the first Fg, rest not compiled yet)", + "- `first_fg+exec`: the above + Statistics Execution (whole guest execution, not just the first line)", + "- `execution`: the Statistics Execution line", + "- `stats_total`: Statistics Total", + "- `full_wall`: whole-command wall time (including the trailing statistics dump)", + "", + "ratio column = **paper / this column** (closer to 1.0 = closer to the paper's metric)", + "", + "| case | paper | 1st stdout | after 1st Fg | 1st Fg+exec | execution | stats Total | full_wall | best match |", + "|------|------:|-----------:|-------------:|------------:|----------:|------------:|----------:|------------|", + ] + + match_votes = { + "first_stdout": 0, + "after_first_fg": 0, + "first_fg_plus_exec": 0, + "execution": 0, + "stats_total": 0, + "full_wall": 0, + } + + for r in results: + if r.paper_ms is None: + best = "-" + else: + cands = { + "first_stdout": r.first_stdout, + "after_first_fg": r.after_first_fg, + "1st Fg+exec": r.first_fg_plus_exec, + "execution": r.execution_ms, + "stats Total": r.stats_total, + "full_wall": r.full_wall, + } + best = min( + cands.items(), + key=lambda kv: abs(kv[1] - r.paper_ms) if kv[1] == kv[1] else 1e18, + )[0] + key_map = { + "first_stdout": "first_stdout", + "after_first_fg": "after_first_fg", + "1st Fg+exec": "first_fg_plus_exec", + "execution": "execution", + "stats Total": "stats_total", + "full_wall": "full_wall", + } + match_votes[key_map.get(best, best)] = match_votes.get(key_map.get(best, best), 0) + 1 + + p = f"{r.paper_ms:.3f}" if r.paper_ms is not None else "-" + lines.append( + f"| {r.case} | {p} | {r.first_stdout:.2f} | {r.after_first_fg:.2f} | " + f"{r.first_fg_plus_exec:.2f} | {r.execution_ms:.2f} | {r.stats_total:.2f} | " + f"{r.full_wall:.2f} | {best} |" + ) + + lines += [ + "", + "## Mean ratio vs paper (paper/estimate, ideal ~= 1.0)", + "", + ] + for label, attr in [ + ("first_stdout", "first_stdout"), + ("after_first_fg", "after_first_fg"), + ("first_fg+exec", "first_fg_plus_exec"), + ("execution", "execution_ms"), + ("stats_total", "stats_total"), + ("full_wall", "full_wall"), + ]: + ratios = [] + for r in results: + if r.paper_ms and getattr(r, attr) == getattr(r, attr): + val = getattr(r, attr) + if val > 0: + ratios.append(r.paper_ms / val) + avg_r = mean(ratios) if ratios else float("nan") + lines.append(f"- **{label}**: mean paper/est = **{avg_r:.3f}** (n={len(ratios)})") + + # Per-metric mean |paper/est - 1| for cases with paper (lower = better) + lines += ["", "## Conclusion", ""] + metrics = [ + ("first_stdout", "first_stdout"), + ("after_first_fg", "after_first_fg"), + ("first_fg+exec", "first_fg_plus_exec"), + ("execution", "execution_ms"), + ("stats_total", "stats_total"), + ("full_wall", "full_wall"), + ] + scores: list[tuple[str, float]] = [] + for label, attr in metrics: + errs = [] + for r in results: + if r.paper_ms and getattr(r, attr) == getattr(r, attr): + val = getattr(r, attr) + if val > 0: + errs.append(abs(r.paper_ms / val - 1.0)) + if errs: + scores.append((label, mean(errs))) + scores.sort(key=lambda x: x[1]) + best = scores[0][0] if scores else "?" + lines.append( + f"1. The estimate closest to the paper's dtvm lazy column is **`{best}`**" + f"(mean relative error {scores[0][1]:.2f}, 0 = exact match)." + ) + lines += [ + "", + "2. **`after_first_fg`** = Load+Precompile+Instantiation + **one average Fg**;" + "it does not count all lazy compilations on the path. echo/irb etc. land within the paper's order of magnitude or 2-3x.", + "", + "3. **`first_stdout`** for **irb/tpl/viu** waits until **after heavy compilation** before the first line appears," + "so it approaches **full run** and cannot serve as TTFI.", + "", + "4. **Pure `execution` (Statistics Execution)** is <1 ms for most cases," + "so it is **not** the paper's lazy column (which includes compilation).", + "", + "5. **`stats_total` / `full_wall`** still include **all Fg compilations**, more than an order of magnitude above the paper.", + "", + "6. Inferred paper metric: **TTFI ~= module load/instantiation + first Fg JIT on the entry path**" + "(~= `after_first_fg`), **excluding** functions compiled on demand later.", + "", + ] + (out_dir / "INFER.md").write_text("\n".join(lines) + "\n") + + # raw rows csv + with (out_dir / "measurements.csv").open("w") as f: + f.write( + "case,paper_ms,first_stdout_ms,after_first_fg_ms,first_fg_plus_exec_ms," + "execution_ms,stats_total_ms,full_wall_ms\n" + ) + for r in results: + p = "" if r.paper_ms is None else f"{r.paper_ms:.4f}" + f.write( + f"{r.case},{p},{r.first_stdout:.4f},{r.after_first_fg:.4f}," + f"{r.first_fg_plus_exec:.4f},{r.execution_ms:.4f}," + f"{r.stats_total:.4f},{r.full_wall:.4f}\n" + ) + print(f"\nWrote {out_dir / 'INFER.md'}") + print("\n".join(lines[-20:])) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/paper/scripts/run_dtvm_wt_compile_round.sh b/benchmarks/paper/scripts/run_dtvm_wt_compile_round.sh new file mode 100755 index 000000000..a80081bfd --- /dev/null +++ b/benchmarks/paper/scripts/run_dtvm_wt_compile_round.sh @@ -0,0 +1,224 @@ +#!/usr/bin/env bash +# One round: dtvm (instrumented dtvm) + wasmtime (cold cache) compile lines vs paper. +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +OUT="${2:-$ROOT/raw_data/benchs/wapm_dtvm_wt_compile_$(date +%Y%m%d_%H%M%S)}" +[[ "$OUT" != /* ]] && OUT="$ROOT/$OUT" + +DTVM="${DTVM:-$(cd "$ROOT/../.." && pwd)/build/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WT="${WASMTIME:-$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime}" +WAPM="$ROOT/benchmarks/wapm" +PAPER_MD="$ROOT/raw_data/benchs/latencytofirstinvocation.md" + +export WASMTIME_CACHE=0 +export CLEAR_WASMTIME_CACHE=1 + +mkdir -p "$OUT/logs/dtvm" "$OUT/logs/wasmtime" + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +echo "dtvm+wasmtime compile round -> $OUT" +echo " dtvm: $DTVM (--enable-statistics)" +echo " wasmtime: $WT (rm -rf ~/.cache/wasmtime each run)" +echo " repeats: $REPEATS" +echo "" + +# wasmtime via existing script (writes under OUT/wt) +WT_OUT="$OUT/wt" +CLEAR_WASMTIME_CACHE=1 WASMTIME_CACHE=0 \ + "$(dirname "$0")/run_wasmtime_ttfi_compare.sh" "$REPEATS" "$WT_OUT" + +# dtvm: same case driver as wasmtime script +cd "$WAPM" +load_conf() { + local case="$1" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + if [[ -f "$WAPM/${case}.wasm.conf" ]]; then + # shellcheck source=/dev/null + source "$WAPM/${case}.wasm.conf" + fi + if [[ "$case" == erdtree ]]; then PARAMETER=(); fi + if [[ "$case" == chkfont ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=./fonts) + elif [[ "$case" == figlet ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=fonts) + elif [[ "$case" == viu ]]; then + DIR=(--dir=.) + [[ -f "$WAPM/parallel-small.png" ]] && PARAMETER=(parallel-small.png) + fi +} + +fix_path() { local s="$1"; s="${s//case\/wapm\//}"; printf '%s' "$s"; } + +run_dtvm_case() { + local case="$1" log="$2" + local -a params=() cmd=() + if [[ -n "${PARAMETER:-}" ]]; then + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + local item + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + params+=("${w[@]}") + done + else + read -r -a params <<< "$PARAMETER" + fi + fi + # wasm path must precede flags (--dir etc.), or CLI11 drops INPUT_FILE. + cmd=("$DTVM" "${case}.wasm" -m multipass --enable-multipass-lazy + --disable-multipass-greedyra --disable-multipass-multithread --enable-statistics) + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="$(fix_path "$d")" + if [[ "$d" == --dir=* ]]; then cmd+=("$d"); else cmd+=(--dir "$d"); fi + done + fi + if ((${#params[@]})); then cmd+=(--args "${params[@]}"); fi + + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + if [[ "$case" == dice ]]; then + echo help | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ "$case" == tpl ]]; then + echo 'Δ is 123456-123455.' | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ ${#HEAD_COMMAND[@]} -gt 0 && "${HEAD_COMMAND[0]}" == eval ]]; then + eval "${COMMAND[*]}" | "${cmd[@]}" >"$log" 2>&1 || true + else + "${COMMAND[@]}" | "${cmd[@]}" >"$log" 2>&1 || true + fi + else + "${cmd[@]}" >"$log" 2>&1 || true + fi +} + +for case in "${CASES[@]}"; do + load_conf "$case" + echo ">> dtvm $case" + for ((r = 1; r <= REPEATS; r++)); do + run_dtvm_case "$case" "$OUT/logs/dtvm/${case}_${r}.log" + done +done + +OUT="$OUT" WT_OUT="$WT_OUT" PAPER_MD="$PAPER_MD" REPEATS="$REPEATS" python3 <<'PY' +import csv, re +from collections import defaultdict +from pathlib import Path +from statistics import mean + +out = Path(__import__("os").environ["OUT"]) +wt_out = Path(__import__("os").environ["WT_OUT"]) +paper_md = Path(__import__("os").environ["PAPER_MD"]) +repeats = int(__import__("os").environ["REPEATS"]) + +compile_re = re.compile(r"Total compilation time: \d+ ms \((\d+) [μµ]s\)") + +paper = {} +if paper_md.is_file(): + for line in paper_md.read_text(encoding="utf-8", errors="replace").splitlines(): + m = re.search(r"case/wapm/([\w-]+)\.wasm", line) + if not m or "avg" in line.lower(): + continue + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) >= 4: + paper[m.group(1)] = {"dtvm": float(cells[2]), "wasmtime": float(cells[3])} + +def avg_compile(log_dir: Path): + by = defaultdict(list) + for log in sorted(log_dir.glob("*.log")): + case = log.name.rsplit("_", 1)[0] + text = log.read_text(encoding="utf-8", errors="replace") + m = compile_re.search(text) + if m: + by[case].append(int(m.group(1)) / 1000.0) + return {c: mean(v) for c, v in by.items() if v} + +dtvm = avg_compile(out / "logs/dtvm") +wt = {} +with (wt_out / "results.csv").open() as f: + for r in csv.DictReader(f): + wt[r["case"]] = float(r["compile_ms"]) + +cases = sorted(set(dtvm) & set(wt)) +rows = [] +for c in cases: + z, w = dtvm[c], wt[c] + p = paper.get(c) or {} + pz, pw = p.get("dtvm"), p.get("wasmtime") + rows.append((c, z, w, pz, pw, w / z if z else 0, + z / pz if pz else None, w / pw if pw else None)) + +def fmt(x, nd=3): + return f"{x:.{nd}f}" if x is not None else "" + +def cell(x): + return f"{x:.2f}" if x is not None else "n/a" + +csv_path = out / "compile_compare.csv" +with csv_path.open("w") as f: + f.write("case,dtvm_compile_ms,wt_compile_ms,paper_dtvm,paper_wt,wt_over_dtvm,dtvm_over_paper,wt_over_paper\n") + for r in rows: + f.write(",".join([r[0], fmt(r[1]), fmt(r[2]), fmt(r[3]), fmt(r[4]), + fmt(r[5], 2), fmt(r[6], 2), fmt(r[7], 2)]) + "\n") + +md = [ + "# DTVM vs Wasmtime compile round (cold wasmtime cache)\n\n", + f"- Repeats: {repeats}\n", + "- **dtvm**: `build/dtvm` + `--enable-statistics`, `Total compilation time`\n", + "- **wasmtime**: patched `out/wasmtime`, `rm -rf ~/.cache/wasmtime` each run, `WASMTIME_CACHE=0`\n", +] +if paper: + md.append("- **paper**: `latencytofirstinvocation.md` lazy / wasmtime columns\n\n") +else: + md.append("- **paper**: latency table not shipped; paper columns left blank\n\n") +md += [ + "| case | dtvm compile | wt compile | paper dtvm | paper wt | wt/dtvm | dtvm/paper | wt/paper |\n", + "|---|---:|---:|---:|---:|---:|---:|---:|\n", +] +for c, z, w, pz, pw, ratio, zr_, wr_ in rows: + md.append( + f"| {c} | {z:.3f} | {w:.3f} | {fmt(pz)} | {fmt(pw, 1)} | {ratio:.2f} | {cell(zr_)} | {cell(wr_)} |\n" + ) + +zr = [r[6] for r in rows if r[6] is not None] +wr = [r[7] for r in rows if r[7] is not None] +rat = [r[5] for r in rows] +if rat: + md.append(f"\n**Mean wt/dtvm:** {mean(rat):.2f}\n") +if zr: + md.append(f"\n**Mean dtvm/paper:** {mean(zr):.2f} ") + md.append(f"**Mean wt/paper:** {mean(wr):.2f}\n") + md.append( + f"\n**wt/paper in 0.5–2.0×:** {sum(0.5 <= x <= 2 for x in wr)}/{len(wr)} cases\n" + ) + md.append( + f"**dtvm/paper in 0.5–2.0×:** {sum(0.5 <= x <= 2 for x in zr)}/{len(zr)} cases\n" + ) + +(out / "COMPILE_ROUND.md").write_text("".join(md)) +print(f"Wrote {csv_path}") +print(f"Wrote {out / 'COMPILE_ROUND.md'}") +if rat: + summary = f"mean wt/dtvm={mean(rat):.2f}" + if zr: + summary += f" mean wt/paper={mean(wr):.2f} mean dtvm/paper={mean(zr):.2f}" + print(summary) +PY + +# wall clock dtvm+wt with cache clear +RUNTIMES_OVERRIDE="dtvm wasmtime" CLEAR_WASMTIME_CACHE=1 \ + "$(dirname "$0")/run_lazy_paper.sh" "$REPEATS" "$OUT/wall" + +echo "" +echo "Done: $OUT/COMPILE_ROUND.md (wall: $OUT/wall/SUMMARY.md)" diff --git a/benchmarks/paper/scripts/run_lazy_20.sh b/benchmarks/paper/scripts/run_lazy_20.sh new file mode 100755 index 000000000..26c44fba9 --- /dev/null +++ b/benchmarks/paper/scripts/run_lazy_20.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# WAPM lazy benchmark: 20 cases (zuk replaced by fortune), 3-run average. +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DTVM="${DTVM:-$ROOT/runtimes/dtvm/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WAPM="$ROOT/benchmarks/wapm" + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +cd "$WAPM" + +run_lazy_case() { + local case="$1" + local conf="$WAPM/${case}.wasm.conf" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + if [[ -f "$conf" ]]; then + # shellcheck source=/dev/null + source "$conf" + fi + if [[ "$case" == erdtree ]]; then + PARAMETER=() + fi + + local -a dtvm_tail=("${case}.wasm") + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="${d//case\/wapm\//}" + dtvm_tail+=("$d") + done + fi + if [[ -n "${PARAMETER:-}" ]]; then + dtvm_tail+=(--args) + local item + local -a pargs=() + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + pargs+=("${w[@]}") + done + else + read -r -a pargs <<< "$PARAMETER" + fi + dtvm_tail+=("${pargs[@]}") + fi + + local -a cmd=( + "$DTVM" -m multipass --enable-multipass-lazy + --disable-multipass-greedyra --disable-multipass-multithread + "${dtvm_tail[@]}" + ) + + local total=0 i s e out + for ((i = 1; i <= REPEATS; i++)); do + s=$(date +%s%3N) + out="/tmp/lazy_${case}_${i}.out" + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + if [[ ${#HEAD_COMMAND[@]} -gt 0 && "${HEAD_COMMAND[0]}" == "eval" ]]; then + eval "${COMMAND[*]}" | "${cmd[@]}" >"$out" 2>&1 || true + else + "${COMMAND[@]}" | "${cmd[@]}" >"$out" 2>&1 || true + fi + else + "${cmd[@]}" >"$out" 2>&1 || true + fi + e=$(date +%s%3N) + total=$((total + e - s)) + done + awk -v t="$total" -v n="$REPEATS" 'BEGIN{printf "%.1f", t/n}' +} + +echo "WAPM lazy 20 cases (dtvm=${DTVM}, ${REPEATS}-run avg)" +echo "Substitution: zuk -> fortune (from non-latency pool; verified runnable)" +echo "" + +fail=0 +for case in "${CASES[@]}"; do + if avg=$(run_lazy_case "$case"); then + echo "============ $case ============" + echo "Average time (${REPEATS} runs): ${avg} ms" + else + echo "FAILED: $case" + fail=$((fail + 1)) + fi +done + +echo "" +echo "Done: $((20 - fail))/20 ok, $fail failed" diff --git a/benchmarks/paper/scripts/run_lazy_paper.sh b/benchmarks/paper/scripts/run_lazy_paper.sh new file mode 100755 index 000000000..144cd59dd --- /dev/null +++ b/benchmarks/paper/scripts/run_lazy_paper.sh @@ -0,0 +1,253 @@ +#!/usr/bin/env bash +# Paper-style WAPM lazy Time-to-First-Invocation (20 cases, zuk -> fortune). +# Usage: ./run_lazy_paper.sh [repeats] [output_dir] +set -euo pipefail + +REPEATS="${1:-5}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +OUT="${2:-$ROOT/raw_data/benchs/wapm_lazy_runs_$(date +%Y%m%d_%H%M%S)}" +[[ "$OUT" != /* ]] && OUT="$ROOT/$OUT" +WAPM="$ROOT/benchmarks/wapm" + +DTVM="${DTVM:-$ROOT/runtimes/dtvm/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WASMTIME="${WASMTIME:-$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime}" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-5.0.4/out/bin/wasmer}" +WASMTIME_CACHE_DIR="${WASMTIME_CACHE_DIR:-$HOME/.cache/wasmtime}" +CLEAR_WASMTIME_CACHE="${CLEAR_WASMTIME_CACHE:-1}" + +clear_wasmtime_cache() { + if [[ "$CLEAR_WASMTIME_CACHE" == "1" ]]; then + rm -rf "$WASMTIME_CACHE_DIR" + fi +} + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +RUNTIMES=(dtvm wasmtime wasmer_cranelift wasmer_llvm wasmer_singlepass) +if [[ -n "${RUNTIMES_OVERRIDE:-}" ]]; then + # shellcheck disable=SC2206 + RUNTIMES=(${RUNTIMES_OVERRIDE}) +fi + +mkdir -p "$OUT" +CSV="$OUT/results.csv" +echo "case,runtime,run,wall_ms,exit_code" >"$CSV" + +cd "$WAPM" + +load_conf() { + local case="$1" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + if [[ -f "$WAPM/${case}.wasm.conf" ]]; then + # shellcheck source=/dev/null + source "$WAPM/${case}.wasm.conf" + fi + if [[ "$case" == erdtree ]]; then + PARAMETER=() + fi + if [[ "$case" == chkfont ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=./fonts) + elif [[ "$case" == figlet ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=fonts) + elif [[ "$case" == viu ]]; then + DIR=(--dir=.) + [[ -f "$WAPM/parallel-small.png" ]] && PARAMETER=(parallel-small.png) + fi +} + +fix_path() { + local s="$1" + s="${s//case\/wapm\//}" + printf '%s' "$s" +} + +append_dir_args() { + local -n cmd_ref=$1 + if [[ -z "${DIR:-}" ]]; then + return + fi + local d + for d in "${DIR[@]}"; do + d="$(fix_path "$d")" + if [[ "$d" == --dir=* ]]; then + cmd_ref+=("$d") + else + cmd_ref+=(--dir "$d") + fi + done +} + +expand_params() { + local -n _out=$1 + _out=() + if [[ -z "${PARAMETER:-}" ]]; then + return + fi + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + local item + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + _out+=("${w[@]}") + done + else + read -r -a _out <<< "$PARAMETER" + fi +} + +build_runtime_cmd() { + local runtime="$1" + local case="$2" + local -n _cmd=$3 + local wasm="${case}.wasm" + local -a params=() + expand_params params + + _cmd=() + case "$runtime" in + dtvm) + _cmd=("$DTVM" -m multipass --enable-multipass-lazy + --disable-multipass-greedyra --disable-multipass-multithread "$wasm") + append_dir_args _cmd + if ((${#params[@]})); then _cmd+=(--args "${params[@]}"); fi + ;; + wasmtime) + # Paper / polybench: disable wasmtime module cache (see bench_polybench_timing.sh). + export WASMTIME_CACHE="${WASMTIME_CACHE:-0}" + _cmd=("$WASMTIME") + append_dir_args _cmd + _cmd+=("$wasm" "${params[@]}") + ;; + wasmer_cranelift|wasmer_llvm|wasmer_singlepass) + local engine="${runtime#wasmer_}" + _cmd=("$WASMER" run "--${engine}" --cache-dir=/dev/null) + append_dir_args _cmd + if ((${#params[@]})); then + _cmd+=("$wasm" "--" "${params[@]}") + else + _cmd+=("$wasm") + fi + ;; + *) + echo "unknown runtime: $runtime" >&2 + return 1 + ;; + esac +} + +run_with_pipe() { + local -n _cmd=$1 + local out="$2" + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + if [[ "$case_name" == dice ]]; then + echo help | "${_cmd[@]}" >"$out" 2>&1 || true + elif [[ "$case_name" == tpl ]]; then + echo 'Δ is 123456-123455.' | "${_cmd[@]}" >"$out" 2>&1 || true + elif [[ ${#HEAD_COMMAND[@]} -gt 0 && "${HEAD_COMMAND[0]}" == eval ]]; then + eval "${COMMAND[*]}" | "${_cmd[@]}" >"$out" 2>&1 || true + else + "${COMMAND[@]}" | "${_cmd[@]}" >"$out" 2>&1 || true + fi + else + "${_cmd[@]}" >"$out" 2>&1 || true + fi +} + +echo "WAPM lazy paper reproduction" +echo " repeats=$REPEATS output=$OUT" +echo " cases: ${CASES[*]}" +echo " note: zuk replaced by fortune" +echo " wasmtime cache: CLEAR=$CLEAR_WASMTIME_CACHE dir=$WASMTIME_CACHE_DIR" +echo "" + +for case_name in "${CASES[@]}"; do + load_conf "$case_name" + for runtime in "${RUNTIMES[@]}"; do + cmd=() + build_runtime_cmd "$runtime" "$case_name" cmd + echo ">> $case_name / $runtime" + for ((r = 1; r <= REPEATS; r++)); do + if [[ "$runtime" == wasmtime ]]; then + clear_wasmtime_cache + fi + s=$(date +%s%3N) + out="/tmp/wapm_${case_name}_${runtime}_${r}.out" + run_with_pipe cmd "$out" + ec=$? + e=$(date +%s%3N) + ms=$((e - s)) + echo "$case_name,$runtime,$r,$ms,$ec" >>"$CSV" + done + done +done + +ROOT="$ROOT" python3 - "$OUT" "$CSV" "$REPEATS" "$ROOT" <<'PY' +import csv +import sys +from collections import defaultdict +from pathlib import Path + +out_dir = Path(sys.argv[1]) +csv_path = Path(sys.argv[2]) +repeats = int(sys.argv[3]) +root = Path(sys.argv[4]) + + +rows = list(csv.DictReader(csv_path.open())) +by = defaultdict(list) +for row in rows: + by[(row["case"], row["runtime"])].append(int(row["wall_ms"])) + +def avg(vals): + return sum(vals) / len(vals) if vals else float("nan") + +cases = sorted({r["case"] for r in rows}) +runtimes = ["dtvm", "wasmtime", "wasmer_cranelift", "wasmer_llvm", "wasmer_singlepass"] + +md = [] +md.append("# WAPM Lazy Benchmark (paper workflow)\n") +md.append(f"- Repeats per case/runtime: **{repeats}**") +md.append("- Cases: 20 (original latency set with **zuk → fortune**)") +md.append("- DTVM: `dtvm -m multipass --enable-multipass-lazy --disable-multipass-greedyra --disable-multipass-multithread`") +md.append("- Wasmtime: `WASMTIME_CACHE=0` (module cache off, paper/polybench alignment)") +md.append("- Wall-clock ms (shell); paper used missing `test_lazy.sh` (likely different instrumentation)\n") +md.append("## Summary (avg ms)\n") +hdr = "| case | wasm KB | dtvm | wasmtime | wasmer-cranelift | wasmer-llvm | wasmer-singlepass | wt/dtvm | cr/dtvm | llvm/dtvm | sp/dtvm |" +md.append(hdr) +md.append("|" + "---|" * (len(hdr.split("|")) - 1)) + +import os +wapm = root / "benchmarks" / "wapm" + +for case in cases: + wasm = wapm / f"{case}.wasm" + kb = wasm.stat().st_size / 1024 if wasm.exists() else 0 + vals = {} + for rt in runtimes: + vals[rt] = avg(by.get((case, rt), [])) + z = vals["dtvm"] or 1.0 + def ratio(x): + return f"{x/z:.2f}" if z and x == x else "n/a" + md.append( + f"| {case} | {kb:.1f} | {vals['dtvm']:.1f} | {vals['wasmtime']:.1f} | " + f"{vals['wasmer_cranelift']:.1f} | {vals['wasmer_llvm']:.1f} | {vals['wasmer_singlepass']:.1f} | " + f"{ratio(vals['wasmtime'])} | {ratio(vals['wasmer_cranelift'])} | {ratio(vals['wasmer_llvm'])} | {ratio(vals['wasmer_singlepass'])} |" + ) + + +summary = out_dir / "SUMMARY.md" +summary.write_text("\n".join(md) + "\n") +print(f"Wrote {summary}") +PY + +echo "" +echo "Results: $CSV" +echo "Summary: $OUT/SUMMARY.md" diff --git a/benchmarks/paper/scripts/run_lazy_stats.sh b/benchmarks/paper/scripts/run_lazy_stats.sh new file mode 100755 index 000000000..8d4825922 --- /dev/null +++ b/benchmarks/paper/scripts/run_lazy_stats.sh @@ -0,0 +1,239 @@ +#!/usr/bin/env bash +# WAPM lazy + DTVM --enable-statistics (ZetaEngine Statistics Total / phases). +# Paper 20 cases with zuk replaced by fortune (same as run_lazy_20.sh). +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DTVM="${DTVM:-$ROOT/runtimes/dtvm/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WAPM="${WAPM:-$ROOT/benchmarks/wapm}" +OUT_DIR="${OUT_DIR:-$ROOT/raw_data/benchs/wapm_lazy_stats_$(date +%Y%m%d_%H%M%S)}" +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +mkdir -p "$OUT_DIR/logs" + +if [[ ! -x "$DTVM" ]]; then + echo "error: dtvm not executable: $DTVM" >&2 + exit 1 +fi + +# Parse "Phase: N times, avg Xms, total Yms" from statistics report (last match). +parse_phase_total() { + local log="$1" phase="$2" + grep -a "$phase" "$log" 2>/dev/null | tail -1 | sed -n 's/.*total \([0-9.]*\)ms.*/\1/p' +} + +parse_total() { + grep -a 'Total:' "$1" 2>/dev/null | tail -1 | sed -n 's/.*Total:[[:space:]]*\([0-9.]*\)ms.*/\1/p' +} + +parse_fg_count() { + grep -a 'JIT Lazy Compilation(Fg):' "$1" 2>/dev/null | tail -1 | sed -n 's/^\[.*\] \(.*\):[[:space:]]*\([0-9]*\) times.*/\2/p' +} + +cd "$WAPM" + +build_dtvm_cmd() { + local case="$1" + local conf="$WAPM/${case}.wasm.conf" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + + if [[ -f "$conf" ]]; then + # shellcheck source=/dev/null + source "$conf" + fi + if [[ "$case" == erdtree ]]; then + PARAMETER=() + fi + if [[ "$case" == chkfont || "$case" == figlet ]]; then + if [[ -d "$WAPM/fonts" ]]; then + DIR=(./fonts) + fi + fi + if [[ "$case" == viu ]]; then + DIR=('--dir=.') + if [[ -f "$WAPM/parallel-small.png" ]]; then + PARAMETER=(parallel-small.png) + fi + fi + + DTVM_TAIL=("$DTVM" -m multipass --enable-multipass-lazy + --disable-multipass-greedyra --disable-multipass-multithread + --enable-statistics --log-level info + "${case}.wasm") + + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="${d//case\/wapm\//}" + if [[ "$d" == --dir=* ]]; then + DTVM_TAIL+=("$d") + else + DTVM_TAIL+=(--dir "$d") + fi + done + fi + if [[ -n "${PARAMETER:-}" ]]; then + DTVM_TAIL+=(--args) + local item + local -a pargs=() + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + pargs+=("${w[@]}") + done + else + read -r -a pargs <<< "$PARAMETER" + fi + DTVM_TAIL+=("${pargs[@]}") + fi +} + +run_dtvm_logged() { + local log="$1" + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + # wasm.conf often uses shell pipelines (echo ... | wasm); always eval. + eval "${COMMAND[*]}" \| "${DTVM_TAIL[@]}" >"$log" 2>&1 || true + else + "${DTVM_TAIL[@]}" >"$log" 2>&1 || true + fi +} + +run_one_rep() { + local case="$1" rep="$2" + local log="$OUT_DIR/logs/${case}_rep${rep}.log" + build_dtvm_cmd "$case" + + run_dtvm_logged "$log" + + local total load pre fg inst exe fg_n + total=$(parse_total "$log") + load=$(parse_phase_total "$log" 'Load:') + pre=$(parse_phase_total "$log" 'JIT Lazy Precompilation:') + fg=$(parse_phase_total "$log" 'JIT Lazy Compilation(Fg):') + inst=$(parse_phase_total "$log" 'Instantiation:') + exe=$(parse_phase_total "$log" 'Execution:') + fg_n=$(parse_fg_count "$log") + echo "${total:-},${load:-},${pre:-},${fg:-},${inst:-},${exe:-},${fg_n:-}" +} + +avg_col() { + awk -F, -v col="$1" ' + { s+=$col; n++ } + END { if (n>0) printf "%.3f", s/n; else print "" } + ' +} + +echo "WAPM lazy + statistics" +echo " dtvm=$DTVM" +echo " repeats=$REPEATS" +echo " out=$OUT_DIR" +echo "" + +{ + echo "case,rep,total_ms,load_ms,precompile_ms,fg_jit_ms,instantiation_ms,execution_ms,fg_compile_count" +} >"$OUT_DIR/results.csv" + +for case in "${CASES[@]}"; do + if [[ "$case" == zuk && "$SKIP_ZUK" == 1 ]]; then + echo ">> skip $case (SKIP_ZUK=1)" + continue + fi + echo ">> $case" + for ((rep = 1; rep <= REPEATS; rep++)); do + row=$(run_one_rep "$case" "$rep") + echo "$case,$rep,$row" >>"$OUT_DIR/results.csv" + done +done + +# Build summary with paper comparison +PAPER="$ROOT/raw_data/benchs/latencytofirstinvocation.md" +python3 - "$OUT_DIR" "$PAPER" <<'PY' +import csv +import re +import sys +from pathlib import Path + +out_dir = Path(sys.argv[1]) +paper_md = Path(sys.argv[2]) + +paper = {} +if paper_md.is_file(): + for line in paper_md.read_text().splitlines(): + m = re.search(r"case/wapm/(\w+)\.wasm", line) + if not m: + continue + cols = [c.strip() for c in line.split("|")] + if len(cols) < 4: + continue + if "avg" in line.lower(): + continue + nums = [] + for x in re.findall(r"\d+\.?\d*", line): + try: + nums.append(float(x)) + except ValueError: + pass + if len(nums) >= 2: + paper[m.group(1)] = nums[1] # wasm size, then dtvm lazy + +by_case = {} +with (out_dir / "results.csv").open() as f: + r = csv.DictReader(f) + for row in r: + c = row["case"] + by_case.setdefault(c, []).append(float(row["total_ms"] or 0)) + +lines = [ + "# WAPM lazy + `--enable-statistics`", + "", + f"- dtvm: `{out_dir}` run", + "- Metric: **Statistics Total** (ms), not wall-clock", + "", + "| case | avg Total (ms) | paper dtvm lazy (ms) | ratio paper/stat | fg compiles (avg) |", + "|------|----------------|------------------------|------------------|-------------------|", +] +ratios = [] +for case in sorted(by_case.keys()): + totals = by_case[case] + avg = sum(totals) / len(totals) + p = paper.get(case) + ratio = f"{p/avg:.2f}" if p and avg > 0 else "-" + if p and avg > 0: + ratios.append(p / avg) + # fg count from last rep average - read from csv + fg_counts = [] + with (out_dir / "results.csv").open() as f: + r = csv.DictReader(f) + for row in r: + if row["case"] == case and row.get("fg_compile_count"): + try: + fg_counts.append(int(row["fg_compile_count"])) + except ValueError: + pass + fg_avg = int(sum(fg_counts) / len(fg_counts)) if fg_counts else "-" + pstr = f"{p:.3f}" if p is not None else "-" + lines.append(f"| {case} | {avg:.3f} | {pstr} | {ratio} | {fg_avg} |") + +if ratios: + lines.extend([ + "", + f"- Mean paper/stat ratio (cases with paper data): **{sum(ratios)/len(ratios):.2f}**", + ]) +lines.append("") +(out_dir / "SUMMARY.md").write_text("\n".join(lines)) +print((out_dir / "SUMMARY.md").read_text()) +PY + +echo "" +echo "Done. Results: $OUT_DIR/results.csv" +echo "Summary: $OUT_DIR/SUMMARY.md" diff --git a/benchmarks/paper/scripts/run_lazy_ttfi_est.sh b/benchmarks/paper/scripts/run_lazy_ttfi_est.sh new file mode 100755 index 000000000..49e261092 --- /dev/null +++ b/benchmarks/paper/scripts/run_lazy_ttfi_est.sh @@ -0,0 +1,269 @@ +#!/usr/bin/env bash +# WAPM lazy TTFI estimate (paper_lazy formula): +# ttfi_est = load + precompile + instantiation + (fg_jit / fg_count) +# Requires dtvm with --enable-statistics. 20 cases: fortune replaces zuk. +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DTVM="${DTVM:-$ROOT/runtimes/dtvm/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WAPM="${WAPM:-$ROOT/benchmarks/wapm}" +PAPER="${PAPER:-$ROOT/raw_data/benchs/latencytofirstinvocation.md}" +OUT_DIR="${OUT_DIR:-$ROOT/raw_data/benchs/wapm_lazy_ttfi_est_$(date +%Y%m%d)}" + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +mkdir -p "$OUT_DIR/logs" + +if [[ ! -x "$DTVM" ]]; then + echo "error: dtvm not executable: $DTVM" >&2 + exit 1 +fi + +parse_phase_total() { + local log="$1" phase="$2" + grep -a "$phase" "$log" 2>/dev/null | tail -1 | sed -n 's/.*total \([0-9.]*\)ms.*/\1/p' +} + +parse_fg_count() { + grep -a 'JIT Lazy Compilation(Fg):' "$1" 2>/dev/null | tail -1 \ + | sed -n 's/.*Compilation(Fg):[[:space:]]*\([0-9]*\) times.*/\1/p' +} + +calc_ttfi_est() { + awk -v load="${1:-0}" -v pre="${2:-0}" -v inst="${3:-0}" -v fg="${4:-0}" -v n="${5:-0}" ' + BEGIN { + if (n + 0 <= 0) { printf "0"; exit } + printf "%.4f", load + pre + inst + (fg / n) + }' +} + +cd "$WAPM" + +build_dtvm_cmd() { + local case="$1" + local conf="$WAPM/${case}.wasm.conf" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + + if [[ -f "$conf" ]]; then + # shellcheck source=/dev/null + source "$conf" + fi + if [[ "$case" == erdtree ]]; then + PARAMETER=() + fi + if [[ "$case" == chkfont ]]; then + [[ -d "$WAPM/fonts" ]] && DIR=(--dir=./fonts) + elif [[ "$case" == figlet ]]; then + [[ -d "$WAPM/fonts" ]] && DIR=(--dir=fonts) + fi + if [[ "$case" == viu ]]; then + DIR=(--dir=.) + [[ -f "$WAPM/parallel-small.png" ]] && PARAMETER=(parallel-small.png) + fi + + DTVM_TAIL=("$DTVM" -m multipass --enable-multipass-lazy + --disable-multipass-greedyra --disable-multipass-multithread + --enable-statistics --log-level info + "${case}.wasm") + + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="${d//case\/wapm\//}" + if [[ "$d" == --dir=* ]]; then + DTVM_TAIL+=("$d") + else + DTVM_TAIL+=(--dir "$d") + fi + done + fi + if [[ -n "${PARAMETER:-}" ]]; then + DTVM_TAIL+=(--args) + local item + local -a pargs=() + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + pargs+=("${w[@]}") + done + else + read -r -a pargs <<< "$PARAMETER" + fi + DTVM_TAIL+=("${pargs[@]}") + fi +} + +run_dtvm_logged() { + local log="$1" + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + eval "${COMMAND[*]}" \| "${DTVM_TAIL[@]}" >"$log" 2>&1 || true + else + "${DTVM_TAIL[@]}" >"$log" 2>&1 || true + fi +} + +run_one_rep() { + local case="$1" rep="$2" + local log="$OUT_DIR/logs/${case}_rep${rep}.log" + build_dtvm_cmd "$case" + run_dtvm_logged "$log" + + local load pre fg inst exe fg_n ttfi stats_total + load=$(parse_phase_total "$log" 'Load:') + pre=$(parse_phase_total "$log" 'JIT Lazy Precompilation:') + fg=$(parse_phase_total "$log" 'JIT Lazy Compilation(Fg):') + inst=$(parse_phase_total "$log" 'Instantiation:') + exe=$(parse_phase_total "$log" 'Execution:') + fg_n=$(parse_fg_count "$log") + stats_total=$(grep -a 'Total:' "$log" 2>/dev/null | tail -1 | sed -n 's/.*Total:[[:space:]]*\([0-9.]*\)ms.*/\1/p') + + load=${load:-0} + pre=${pre:-0} + fg=${fg:-0} + inst=${inst:-0} + exe=${exe:-0} + fg_n=${fg_n:-0} + stats_total=${stats_total:-0} + + ttfi=$(calc_ttfi_est "$load" "$pre" "$inst" "$fg" "$fg_n") + + echo "${ttfi},${load},${pre},${inst},${fg},${fg_n},${exe},${stats_total}" +} + +echo "WAPM lazy TTFI estimate" +echo " formula: load + precompile + instantiation + (fg_jit / fg_count)" +echo " dtvm=$DTVM" +echo " repeats=$REPEATS" +echo " out=$OUT_DIR" +echo "" + +{ + echo "case,rep,ttfi_est_ms,load_ms,precompile_ms,instantiation_ms,fg_jit_ms,fg_count,execution_ms,stats_total_ms" +} >"$OUT_DIR/results.csv" + +for case in "${CASES[@]}"; do + echo ">> $case" + for ((rep = 1; rep <= REPEATS; rep++)); do + row=$(run_one_rep "$case" "$rep") + echo "$case,$rep,$row" >>"$OUT_DIR/results.csv" + done +done + +python3 - "$OUT_DIR" "$PAPER" <<'PY' +import csv +import re +import sys +from pathlib import Path +from statistics import mean + +out_dir = Path(sys.argv[1]) +paper_md = Path(sys.argv[2]) + +paper: dict[str, float] = {} +if paper_md.is_file(): + for line in paper_md.read_text().splitlines(): + if "avg" in line.lower(): + continue + m = re.search(r"case/wapm/(\w+)\.wasm", line) + if not m: + continue + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) >= 3: + try: + paper[m.group(1)] = float(cells[2].split()[0]) + except ValueError: + pass + +rows_by_case: dict[str, list[dict]] = {} +with (out_dir / "results.csv").open() as f: + for row in csv.DictReader(f): + rows_by_case.setdefault(row["case"], []).append(row) + +lines = [ + "# WAPM lazy TTFI estimate vs paper", + "", + "**Formula:** `ttfi_est = load + precompile + instantiation + (fg_jit / fg_count)`", + "", + f"- Output: `{out_dir}`", + f"- dtvm: paper commit (see `runtimes/dtvm/version.txt`)", + "- `paper_lazy`: `latencytofirstinvocation.md` dtvm lazy column", + "- `ratio`: paper / ttfi_est (1.0 = match)", + "", + "| case | ttfi_est (avg) | paper_lazy | ratio | fg_count | stats_total |", + "|------|---------------:|-----------:|------:|---------:|------------:|", +] + +ratios = [] +for case in sorted(rows_by_case.keys()): + reps = rows_by_case[case] + ttfi_vals = [float(r["ttfi_est_ms"]) for r in reps if r.get("ttfi_est_ms")] + if not ttfi_vals: + continue + avg_ttfi = mean(ttfi_vals) + avg_total = mean(float(r["stats_total_ms"]) for r in reps if r.get("stats_total_ms")) + fg_n = int(mean(float(r["fg_count"]) for r in reps if r.get("fg_count"))) + p = paper.get(case) + if case == "fortune": + p = paper.get("zuk") # paper table used zuk + ratio_s = f"{p/avg_ttfi:.3f}" if p and avg_ttfi > 0 else "-" + if p and avg_ttfi > 0: + ratios.append(p / avg_ttfi) + p_s = f"{p:.3f}" if p is not None else "-" + note = " (paper=zuk)" if case == "fortune" and p else "" + lines.append( + f"| {case}{note} | {avg_ttfi:.3f} | {p_s} | {ratio_s} | {fg_n} | {avg_total:.1f} |" + ) + +if ratios: + abs_err = [abs(r - 1.0) for r in ratios] + lines += [ + "", + f"- Cases with paper data: **{len(ratios)}** (fortune compared to zuk)", + f"- Mean paper/ttfi_est: **{mean(ratios):.3f}**", + f"- Mean |paper/ttfi_est − 1|: **{mean(abs_err):.3f}**", + ] + +lines += ["", "## Per-rep raw data", "", "See `results.csv` and `logs/`.", ""] +(out_dir / "SUMMARY.md").write_text("\n".join(lines)) + +# machine-readable summary for scripts +with (out_dir / "summary.csv").open("w", newline="") as f: + w = csv.writer(f) + w.writerow(["case", "ttfi_est_avg_ms", "paper_lazy_ms", "paper_over_est", "fg_count_avg", "stats_total_avg_ms"]) + for case in sorted(rows_by_case.keys()): + reps = rows_by_case[case] + ttfi_vals = [float(r["ttfi_est_ms"]) for r in reps if r.get("ttfi_est_ms")] + if not ttfi_vals: + continue + avg_ttfi = mean(ttfi_vals) + p = paper.get(case) + if case == "fortune": + p = paper.get("zuk") + w.writerow([ + case, + f"{avg_ttfi:.4f}", + "" if p is None else f"{p:.4f}", + "" if not p or avg_ttfi <= 0 else f"{p/avg_ttfi:.4f}", + int(mean(float(r["fg_count"]) for r in reps if r.get("fg_count"))), + f"{mean(float(r['stats_total_ms']) for r in reps if r.get('stats_total_ms')):.4f}", + ]) + +print((out_dir / "SUMMARY.md").read_text()) +PY + +echo "" +echo "Done." +echo " $OUT_DIR/results.csv" +echo " $OUT_DIR/summary.csv" +echo " $OUT_DIR/SUMMARY.md" diff --git a/benchmarks/paper/scripts/run_polybench.sh b/benchmarks/paper/scripts/run_polybench.sh new file mode 100755 index 000000000..bcf3bdd53 --- /dev/null +++ b/benchmarks/paper/scripts/run_polybench.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# Polybench runner skeleton. +# Requires webassembly-testsuites checkout and runtime binaries on PATH. +set -euo pipefail + +RUNTIME="${1:-iwasm}" +SUITE="polybenchc" + +# TODO: set WEBASSEMBLY_TESTSUITES to your checkout path +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +WEBASSEMBLY_TESTSUITES="${WEBASSEMBLY_TESTSUITES:-$SCRIPT_DIR/webassembly-testsuites}" + +if [[ ! -d "$WEBASSEMBLY_TESTSUITES" ]]; then + echo "Error: WEBASSEMBLY_TESTSUITES not found: $WEBASSEMBLY_TESTSUITES" >&2 + echo "Clone the webassembly-testsuites repo, or symlink case/ here via setup_polybench_case.sh" >&2 + exit 1 +fi + +if [[ ! -e "$WEBASSEMBLY_TESTSUITES/case/benchmark/polybenchc" ]]; then + "$SCRIPT_DIR/setup_polybench_case.sh" +fi + +cd "$WEBASSEMBLY_TESTSUITES" + +case "$RUNTIME" in + dtvm) + DTVM_BIN="${DTVM:-$(cd "$SCRIPT_DIR/.." && pwd)/runtimes/dtvm/dtvm}" + if [[ ! -x "$DTVM_BIN" ]]; then + echo "Error: dtvm not found: $DTVM_BIN (build per runtimes/dtvm/BUILD.md)" >&2 + exit 1 + fi + ./runtest_webassembly.py -r "$DTVM_BIN" \ + --dtvm-options="${DTVM_OPTIONS:--m multipass --disable-multipass-greedyra --disable-multipass-multithread}" \ + -s "$SUITE" + ;; + wasmtime) + WT="${WASMTIME:-$(cd "$SCRIPT_DIR/.." && pwd)/runtimes/wasmtime-31.0.0/out/wasmtime}" + ./runtest_webassembly.py -r "$WT" -s "$SUITE" + ;; + iwasm) + IW="${IWASM:-$(cd "$SCRIPT_DIR/.." && pwd)/runtimes/wamr-1.2.3/out/iwasm}" + ./runtest_webassembly.py -r "$IW" -s "$SUITE" + ;; + *) + ./runtest_webassembly.py -r "$RUNTIME" -s "$SUITE" + ;; +esac diff --git a/benchmarks/paper/scripts/run_polybench_ttfi_compare.sh b/benchmarks/paper/scripts/run_polybench_ttfi_compare.sh new file mode 100755 index 000000000..a9b8518f1 --- /dev/null +++ b/benchmarks/paper/scripts/run_polybench_ttfi_compare.sh @@ -0,0 +1,190 @@ +#!/usr/bin/env bash +# PolyBench/C TTFI (Total compilation time) — same metric as WAPM scripts. +# +# Parses stdout: +# Total compilation time: ms (<µs> μs) +# Execution N: ms +# +# Usage: +# run_polybench_ttfi_compare.sh [profile] [repeats] [out_dir] +# runtime: dtvm | wasmtime | wasmer +# profile: dtvm multipass_greedy_mt | wasmer singlepass|cranelift|llvm | wasmtime default +set -euo pipefail + +RUNTIME="${1:?runtime: dtvm|wasmtime|wasmer}" +PROFILE="${2:-default}" +REPEATS="${3:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +CASE_DIR="${CASE_DIR:-$ROOT/benchmarks/polybenchc}" + +if [[ $# -ge 4 && -n "${4:-}" ]]; then + OUT="${4}" +else + tag="$RUNTIME" + [[ "$RUNTIME" == wasmer ]] && tag="wasmer_${PROFILE}" + [[ "$RUNTIME" == dtvm ]] && tag="dtvm_${PROFILE}" + OUT="$ROOT/raw_data/benchs/polybench_${tag}_ttfi_$(date +%Y%m%d_%H%M%S)" +fi +[[ "$OUT" != /* ]] && OUT="$ROOT/$OUT" + +DTVM="${DTVM:-$ROOT/runtimes/dtvm_main/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WASMTIME="${WASMTIME:-$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime}" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-7.1.0/out/wasmer}" +WASMTIME_CACHE_DIR="${WASMTIME_CACHE_DIR:-$HOME/.cache/wasmtime}" +CLEAR_WASMTIME_CACHE="${CLEAR_WASMTIME_CACHE:-1}" + +export WASMTIME_CACHE=0 + +mkdir -p "$OUT/logs" + +mapfile -t CASES < <(find "$CASE_DIR" -maxdepth 1 -name '*.wasm' -printf '%f\n' | sed 's/\.wasm$//' | sort) + +clear_wasmtime_cache() { + if [[ "$CLEAR_WASMTIME_CACHE" == "1" ]]; then + rm -rf "$WASMTIME_CACHE_DIR" + fi +} + +run_one() { + local case="$1" log="$2" + case "$RUNTIME" in + dtvm) + case "$PROFILE" in + multipass_greedy_mt) + "$DTVM" "${case}.wasm" -m multipass --enable-statistics \ + >"$log" 2>&1 || true + ;; + lazy) + # WAPM paper: multipass lazy, greedy RA + MT off + "$DTVM" "${case}.wasm" -m multipass --enable-multipass-lazy \ + --disable-multipass-greedyra --disable-multipass-multithread \ + --enable-statistics >"$log" 2>&1 || true + ;; + lazy_greedy_mt) + "$DTVM" "${case}.wasm" -m multipass --enable-multipass-lazy --enable-statistics \ + >"$log" 2>&1 || true + ;; + multipass) + "$DTVM" "${case}.wasm" -m multipass \ + --disable-multipass-greedyra --disable-multipass-multithread \ + --enable-statistics >"$log" 2>&1 || true + ;; + *) + echo "unknown dtvm profile: $PROFILE" >&2 + return 2 + ;; + esac + ;; + wasmtime) + clear_wasmtime_cache + "$WASMTIME" run "$CASE_DIR/${case}.wasm" --invoke main >"$log" 2>&1 || true + ;; + wasmer) + "$WASMER" run "--${PROFILE}" --cache-dir=/dev/null \ + "$CASE_DIR/${case}.wasm" -q >"$log" 2>&1 || true + ;; + *) + echo "unknown runtime: $RUNTIME" >&2 + return 2 + ;; + esac +} + +echo "PolyBench TTFI -> $OUT" +echo " runtime: $RUNTIME profile: $PROFILE" +echo " repeats: $REPEATS" +case "$RUNTIME" in + dtvm) echo " binary: $DTVM" ;; + wasmtime) + echo " binary: $WASMTIME" + echo " WASMTIME_CACHE=0 clear_cache=$CLEAR_WASMTIME_CACHE" + ;; + wasmer) echo " binary: $WASMER --cache-dir=/dev/null" ;; +esac +echo " cases: ${#CASES[@]}" +echo "" + +cd "$CASE_DIR" +for case in "${CASES[@]}"; do + echo ">> $case" + for ((r = 1; r <= REPEATS; r++)); do + run_one "$case" "$OUT/logs/${case}_${r}.log" + done +done + +RUNTIME="$RUNTIME" PROFILE="$PROFILE" REPEATS="$REPEATS" OUT="$OUT" python3 <<'PY' +import re +from pathlib import Path +from statistics import mean + +runtime = __import__("os").environ["RUNTIME"] +profile = __import__("os").environ["PROFILE"] +repeats = int(__import__("os").environ["REPEATS"]) +out = Path(__import__("os").environ["OUT"]) + +compile_re = re.compile(r"Total compilation time: \d+ ms \((\d+) [μµ]s\)") +exec_re = re.compile(r"Execution \d+: ([\d.]+) ms") + +cases = sorted({p.stem.rsplit("_", 1)[0] for p in out.glob("logs/*.log")}) +rows = [] +for case in cases: + compiles, execs = [], [] + for r in range(1, repeats + 1): + log = out / "logs" / f"{case}_{r}.log" + if not log.exists(): + continue + text = log.read_text(encoding="utf-8", errors="replace") + cm = compile_re.search(text) + if cm: + compiles.append(int(cm.group(1)) / 1000.0) + em = exec_re.search(text) + if em: + execs.append(float(em.group(1))) + if not compiles: + rows.append((case, None, None)) + continue + rows.append((case, mean(compiles), mean(execs) if execs else None)) + +csv = out / "results.csv" +with csv.open("w") as f: + f.write("case,compile_ms,execution_ms\n") + for case, c, e in rows: + cs = "" if c is None else f"{c:.3f}" + es = "" if e is None else f"{e:.3f}" + f.write(f"{case},{cs},{es}\n") + +md = [ + f"# PolyBench TTFI (`{runtime}`", +] +if runtime != "wasmtime": + md[0] += f" / `{profile}`" +md[0] += ")\n\n" +md += [ + f"- Repeats: **{repeats}** per case\n", + "- **compile**: `Total compilation time` in stdout (WAPM metric)\n", + "- **exec**: first `Execution N` line\n", + "\n| case | compile ms | exec ms |\n", + "|---|---:|---:|\n", +] +ok = 0 +for case, c, e in rows: + if c is None: + md.append(f"| {case} | n/a | n/a |\n") + else: + ok += 1 + es = f"{e:.3f}" if e is not None else "n/a" + md.append(f"| {case} | {c:.3f} | {es} |\n") +compiles = [c for _, c, _ in rows if c is not None] +if compiles: + md.append(f"\n**Cases with compile line:** {ok}/{len(rows)}\n") + md.append(f"**Median compile ms:** {sorted(compiles)[len(compiles)//2]:.3f}\n") + md.append(f"**Mean compile ms:** {mean(compiles):.3f}\n") +(out / "COMPARE.md").write_text("".join(md)) +print(f"Wrote {csv}") +print(f"Wrote {out / 'COMPARE.md'}") +PY + +echo "" +echo "Done: $OUT/COMPARE.md" diff --git a/benchmarks/paper/scripts/run_polybench_ttfi_round.sh b/benchmarks/paper/scripts/run_polybench_ttfi_round.sh new file mode 100755 index 000000000..ee0eb91f7 --- /dev/null +++ b/benchmarks/paper/scripts/run_polybench_ttfi_round.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# PolyBench TTFI round: DTVM main + wasmtime 45 + wasmer 7.1 (3 backends). +# Same metric as WAPM (Total compilation time). Default 1 repeat per case (faster). +set -euo pipefail + +REPEATS="${1:-1}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +STAMP="$(date +%Y%m%d_%H%M%S)" +BENCH_ROOT="$ROOT/raw_data/benchs/polybench_ttfi_${STAMP}" +SCRIPT_DIR="$(dirname "$0")" + +DTVM="${DTVM:-$ROOT/runtimes/dtvm_main/dtvm}" +source "$ROOT/scripts/common.sh" +warn_if_debug_dtvm "$DTVM" +WASMTIME="${WASMTIME:-$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime}" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-7.1.0/out/wasmer}" + +export DTVM WASMTIME WASMER +export WASMTIME_CACHE=0 +export CLEAR_WASMTIME_CACHE=1 + +ttfi_hits="$(strings "$DTVM" 2>/dev/null | grep -c 'Total compilation time' || true)" +if [[ "${ttfi_hits:-0}" -lt 1 ]]; then + echo "error: DTVM binary missing TTFI strings: $DTVM" >&2 + exit 1 +fi + +mkdir -p "$BENCH_ROOT" +chmod +x "$SCRIPT_DIR/run_polybench_ttfi_compare.sh" + +echo "=== PolyBench TTFI round -> $BENCH_ROOT ===" +echo " dtvm: $DTVM" +echo " wasmtime: $WASMTIME ($($WASMTIME --version 2>&1 | head -1))" +echo " wasmer: $WASMER ($($WASMER --version 2>&1 | head -1))" +echo " repeats: $REPEATS" +echo "" + +DTVM="$DTVM" "$SCRIPT_DIR/run_polybench_ttfi_compare.sh" dtvm lazy "$REPEATS" \ + "$BENCH_ROOT/dtvm_lazy" +DTVM="$DTVM" "$SCRIPT_DIR/run_polybench_ttfi_compare.sh" dtvm multipass_greedy_mt "$REPEATS" \ + "$BENCH_ROOT/dtvm_multipass_greedy_mt" +WASMTIME="$WASMTIME" "$SCRIPT_DIR/run_polybench_ttfi_compare.sh" wasmtime default "$REPEATS" \ + "$BENCH_ROOT/wasmtime45" +for engine in singlepass cranelift llvm; do + if [[ "$engine" == llvm ]] && ! "$WASMER" run --help 2>&1 | grep -q -- '--llvm'; then + echo "SKIP wasmer llvm (binary not built with llvm feature)" + continue + fi + WASMER="$WASMER" "$SCRIPT_DIR/run_polybench_ttfi_compare.sh" wasmer "$engine" "$REPEATS" \ + "$BENCH_ROOT/wasmer_${engine}" +done + +export BENCH_ROOT +export OUT_DIR="$BENCH_ROOT/table" +export DTVM_CSV="$BENCH_ROOT/dtvm_lazy/results.csv" +export DTVM_GREEDY_CSV="$BENCH_ROOT/dtvm_multipass_greedy_mt/results.csv" +export WT_CSV="$BENCH_ROOT/wasmtime45/results.csv" +export WASMER_SP_CSV="$BENCH_ROOT/wasmer_singlepass/results.csv" +export WASMER_CF_CSV="$BENCH_ROOT/wasmer_cranelift/results.csv" +export WASMER_LLVM_CSV="$BENCH_ROOT/wasmer_llvm/results.csv" +export DTVM_VERSION="$ROOT/runtimes/dtvm_main/version.txt" +python3 "$SCRIPT_DIR/build_polybench_ttfi_table.py" + +cp "$BENCH_ROOT/table/polybench_ttfi_compare.md" \ + "$ROOT/raw_data/benchs/polybench_ttfi_compare_latest.md" +cp "$BENCH_ROOT/table/polybench_ttfi_compare.csv" \ + "$ROOT/raw_data/benchs/polybench_ttfi_compare_latest.csv" + +echo "" +echo "Done:" +echo " $ROOT/raw_data/benchs/polybench_ttfi_compare_latest.md" +echo " $ROOT/raw_data/benchs/polybench_ttfi_compare_latest.csv" +echo " $BENCH_ROOT/" diff --git a/benchmarks/paper/scripts/run_wapm_local_full_round.sh b/benchmarks/paper/scripts/run_wapm_local_full_round.sh new file mode 100755 index 000000000..cdacf4392 --- /dev/null +++ b/benchmarks/paper/scripts/run_wapm_local_full_round.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# One-shot: build runtimes (if needed), run all WAPM TTFI benches, emit local paper-style table. +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +STAMP="$(date +%Y%m%d_%H%M%S)" +BENCH_ROOT="$ROOT/raw_data/benchs/wapm_local_round_${STAMP}" + +DTVM="${DTVM:-$(cd "$ROOT/../.." && pwd)/build/dtvm}" +export DTVM + +echo "=== WAPM local full round -> $BENCH_ROOT ===" +mkdir -p "$BENCH_ROOT" + +# 1) dtvm + wasmtime +DTVM_WT_OUT="$BENCH_ROOT/dtvm_wt" +DTVM="$DTVM" "$(dirname "$0")/run_dtvm_wt_compile_round.sh" "$REPEATS" "$DTVM_WT_OUT" + +# 2) wasmer backends +WASMER_OUT_CR="$BENCH_ROOT/wasmer_cranelift" +WASMER_OUT_SP="$BENCH_ROOT/wasmer_singlepass" +"$(dirname "$0")/run_wasmer_ttfi_compare.sh" "$REPEATS" "$WASMER_OUT_CR" cranelift +"$(dirname "$0")/run_wasmer_ttfi_compare.sh" "$REPEATS" "$WASMER_OUT_SP" singlepass + +# 3) merge table +OUT_DIR="$BENCH_ROOT/table" \ + DTVM_LOG_DIR="$DTVM_WT_OUT/logs/dtvm" \ + WT_CSV="$DTVM_WT_OUT/wt/results.csv" \ + WASMER_CR_CSV="$WASMER_OUT_CR/results.csv" \ + WASMER_SP_CSV="$WASMER_OUT_SP/results.csv" \ + ROOT="$ROOT" \ + python3 "$(dirname "$0")/build_wapm_local_table.py" + +cp "$BENCH_ROOT/table/wapm_local_latency_table.md" "$ROOT/raw_data/benchs/wapm_local_latency_table.md" +cp "$BENCH_ROOT/table/wapm_local_latency_table.csv" "$ROOT/raw_data/benchs/wapm_local_latency_table.csv" + +echo "" +echo "Done." +echo " Round dir: $BENCH_ROOT" +echo " Table: $ROOT/raw_data/benchs/wapm_local_latency_table.md" diff --git a/benchmarks/paper/scripts/run_wapm_v45_v71_round.sh b/benchmarks/paper/scripts/run_wapm_v45_v71_round.sh new file mode 100755 index 000000000..e624b7c1d --- /dev/null +++ b/benchmarks/paper/scripts/run_wapm_v45_v71_round.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# WAPM compile-time round: dtvm (DTVM) + wasmtime 45.0.0 + wasmer 7.1.0 +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +STAMP="$(date +%Y%m%d_%H%M%S)" +BENCH_ROOT="$ROOT/raw_data/benchs/wapm_v45_v71_${STAMP}" + +DTVM="${DTVM:-$(cd "$ROOT/../.." && pwd)/build/dtvm}" +WASMTIME="${WASMTIME:-$ROOT/runtimes/wasmtime-45.0.0/out/wasmtime}" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-7.1.0/out/bin/wasmer}" + +export DTVM WASMTIME WASMER +export WASMTIME_CACHE=0 +export CLEAR_WASMTIME_CACHE=1 + +echo "=== WAPM v45/v71 round -> $BENCH_ROOT ===" +echo " dtvm: $DTVM" +echo " wasmtime: $WASMTIME ($($WASMTIME --version 2>&1 | head -1))" +echo " wasmer: $WASMER ($($WASMER --version 2>&1 | head -1))" +echo " repeats: $REPEATS" +echo "" + +mkdir -p "$BENCH_ROOT" + +# dtvm + wasmtime +DTVM_WT_OUT="$BENCH_ROOT/dtvm_wt" +DTVM="$DTVM" WASMTIME="$WASMTIME" \ + "$(dirname "$0")/run_dtvm_wt_compile_round.sh" "$REPEATS" "$DTVM_WT_OUT" + +# wasmer backends +for engine in cranelift singlepass llvm; do + if [[ "$engine" == llvm ]]; then + if ! "$WASMER" run --help 2>&1 | grep -q -- '--llvm'; then + echo "SKIP wasmer llvm (binary not built with llvm feature)" + continue + fi + fi + WASMER="$WASMER" "$(dirname "$0")/run_wasmer_ttfi_compare.sh" \ + "$REPEATS" "$BENCH_ROOT/wasmer_${engine}" "$engine" +done + +LLVM_CSV="$BENCH_ROOT/wasmer_llvm/results.csv" +export OUT_DIR="$BENCH_ROOT/table" +export DTVM_LOG_DIR="$DTVM_WT_OUT/logs/dtvm" +export WT_CSV="$DTVM_WT_OUT/wt/results.csv" +export WASMER_CR_CSV="$BENCH_ROOT/wasmer_cranelift/results.csv" +export WASMER_SP_CSV="$BENCH_ROOT/wasmer_singlepass/results.csv" +export ROOT="$ROOT" +if [[ -f "$LLVM_CSV" ]]; then + export WASMER_LLVM_CSV="$LLVM_CSV" +else + unset WASMER_LLVM_CSV 2>/dev/null || true +fi +python3 "$(dirname "$0")/build_wapm_local_table.py" + +cp "$BENCH_ROOT/table/wapm_local_latency_table.md" \ + "$ROOT/raw_data/benchs/wapm_v45_v71_latency_table.md" +cp "$BENCH_ROOT/table/wapm_local_latency_table.csv" \ + "$ROOT/raw_data/benchs/wapm_v45_v71_latency_table.csv" + +# Append version banner +{ + echo "" + echo "---" + echo "" + echo "**Runtimes:** wasmtime 45.0.0, wasmer 7.1.0 (cranelift + singlepass + llvm), dtvm (DTVM \`build/dtvm\`)" + echo "" + echo "**LLVM:** \`${LLVM_SYS_211_PREFIX:-/opt/LLVM-21.1.8-Linux-X64}\`" + echo "" + echo "**Data dir:** \`$BENCH_ROOT\`" +} >> "$ROOT/raw_data/benchs/wapm_v45_v71_latency_table.md" + +echo "" +echo "Done: $ROOT/raw_data/benchs/wapm_v45_v71_latency_table.md" diff --git a/benchmarks/paper/scripts/run_wasmer_ttfi_compare.sh b/benchmarks/paper/scripts/run_wasmer_ttfi_compare.sh new file mode 100755 index 000000000..e0c9ab6bc --- /dev/null +++ b/benchmarks/paper/scripts/run_wasmer_ttfi_compare.sh @@ -0,0 +1,238 @@ +#!/usr/bin/env bash +# Run patched wasmer on WAPM cases; compare Total compilation vs paper wasmer_* logs. +# Usage: run_wasmer_ttfi_compare.sh [repeats] [out_dir] [engine] +# engine: cranelift | singlepass | llvm (default: cranelift) +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +ENGINE="${3:-cranelift}" +OUT="${2:-$ROOT/raw_data/benchs/wasmer_${ENGINE}_ttfi_$(date +%Y%m%d_%H%M%S)}" +[[ "$OUT" != /* ]] && OUT="$ROOT/$OUT" +WAPM="$ROOT/benchmarks/wapm" +WASMER="${WASMER:-$ROOT/runtimes/wasmer-5.0.4/out/bin/wasmer}" + +case "$ENGINE" in + cranelift) PAPER_LOG="$ROOT/reference_logs/py_tools/wasmer_crane_compile_time.txt" ;; + singlepass) PAPER_LOG="$ROOT/reference_logs/py_tools/wasmer_singlepass_compile_time.txt" ;; + llvm) PAPER_LOG="$ROOT/reference_logs/py_tools/wasmer_llvm_compile_time.txt" ;; + *) echo "unknown engine: $ENGINE" >&2; exit 1 ;; +esac +PAPER_MD="$ROOT/raw_data/benchs/latencytofirstinvocation.md" +PAPER_COL="wasmer_${ENGINE}" + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +mkdir -p "$OUT/logs" + +cd "$WAPM" +load_conf() { + local case="$1" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + if [[ -f "$WAPM/${case}.wasm.conf" ]]; then + # shellcheck source=/dev/null + source "$WAPM/${case}.wasm.conf" + fi + if [[ "$case" == erdtree ]]; then PARAMETER=(); fi + if [[ "$case" == chkfont ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=./fonts) + elif [[ "$case" == figlet ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=fonts) + elif [[ "$case" == viu ]]; then + DIR=(--dir=.) + [[ -f "$WAPM/parallel-small.png" ]] && PARAMETER=(parallel-small.png) + fi +} + +fix_path() { local s="$1"; s="${s//case\/wapm\//}"; printf '%s' "$s"; } + +build_cmd() { + local case="$1" + local -n _cmd=$2 + local -a params=() + if [[ -n "${PARAMETER:-}" ]]; then + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + local item + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + params+=("${w[@]}") + done + else + read -r -a params <<< "$PARAMETER" + fi + fi + _cmd=("$WASMER" run "--${ENGINE}" --cache-dir=/dev/null) + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="$(fix_path "$d")" + if [[ "$d" == --dir=* ]]; then _cmd+=("$d"); else _cmd+=(--dir "$d"); fi + done + fi + if ((${#params[@]})); then + _cmd+=("${case}.wasm" "--" "${params[@]}") + else + _cmd+=("${case}.wasm") + fi +} + +run_case() { + local case="$1" + local log="$2" + local cmd=() + build_cmd "$case" cmd + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + if [[ "$case" == dice ]]; then + echo help | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ "$case" == tpl ]]; then + echo 'Δ is 123456-123455.' | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ ${#HEAD_COMMAND[@]} -gt 0 && "${HEAD_COMMAND[0]}" == eval ]]; then + eval "${COMMAND[*]}" | "${cmd[@]}" >"$log" 2>&1 || true + else + "${COMMAND[@]}" | "${cmd[@]}" >"$log" 2>&1 || true + fi + else + "${cmd[@]}" >"$log" 2>&1 || true + fi +} + +echo "wasmer TTFI compare -> $OUT" +echo " binary: $WASMER" +echo " engine: $ENGINE" +echo " repeats: $REPEATS" +echo " paper log: $PAPER_LOG" +echo "" + +for case in "${CASES[@]}"; do + load_conf "$case" + echo ">> $case" + for ((r = 1; r <= REPEATS; r++)); do + run_case "$case" "$OUT/logs/${case}_${r}.log" + done +done + +ROOT="$ROOT" OUT="$OUT" PAPER_LOG="$PAPER_LOG" PAPER_MD="$PAPER_MD" \ + PAPER_COL="$PAPER_COL" ENGINE="$ENGINE" REPEATS="$REPEATS" python3 <<'PY' +import re +from collections import defaultdict +from pathlib import Path +from statistics import mean + +root = Path(__import__("os").environ["ROOT"]) +out = Path(__import__("os").environ["OUT"]) +paper_log = Path(__import__("os").environ["PAPER_LOG"]) +paper_md = Path(__import__("os").environ["PAPER_MD"]) +paper_col = __import__("os").environ["PAPER_COL"] +engine = __import__("os").environ["ENGINE"] +repeats = int(__import__("os").environ["REPEATS"]) + +compile_re = re.compile(r"Total compilation time: \d+ ms \((\d+) [μµ]s\)") +exec_re = re.compile(r"Execution \d+: ([\d.]+) ms") + +# Paper latency table column index (dtvm=2, wasmtime=3, wasmer_cranelift=4, ...) +col_idx = { + "wasmer_cranelift": 4, + "wasmer_llvm": 5, + "wasmer_singlepass": 6, +}.get(paper_col, 4) +latency_paper = {} +if paper_md.is_file(): + for line in paper_md.read_text(encoding="utf-8", errors="replace").splitlines(): + m = re.search(r"case/wapm/([\w-]+)\.wasm", line) + if not m or "avg" in line.lower(): + continue + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) > col_idx: + try: + latency_paper[m.group(1)] = float(cells[col_idx]) + except ValueError: + pass + +paper_compile = defaultdict(list) +current_cmd = None +if paper_log.is_file(): + paper_log_lines = paper_log.read_text(encoding="utf-8", errors="replace").splitlines() +else: + paper_log_lines = [] +for line in paper_log_lines: + if line.startswith("Executing command:"): + current_cmd = line + continue + m = compile_re.search(line) + if m and current_cmd: + case_m = re.search(r"case/wapm/([\w-]+)\.wasm", current_cmd) + if case_m: + paper_compile[case_m.group(1)].append(int(m.group(1)) / 1000.0) +paper_compile_avg = {k: mean(v) for k, v in paper_compile.items()} + +cases = sorted({p.stem.rsplit("_", 1)[0] for p in out.glob("logs/*.log")}) +rows = [] +for case in cases: + compiles, execs = [], [] + for r in range(1, repeats + 1): + log = out / "logs" / f"{case}_{r}.log" + if not log.exists(): + continue + text = log.read_text(encoding="utf-8", errors="replace") + cm = compile_re.search(text) + if cm: + compiles.append(int(cm.group(1)) / 1000.0) + em = exec_re.search(text) + if em: + execs.append(float(em.group(1))) + if not compiles: + continue + c_avg = mean(compiles) + e_avg = mean(execs) if execs else float("nan") + p_comp = paper_compile_avg.get(case) + p_lat = latency_paper.get(case) + rows.append((case, c_avg, e_avg, p_comp, p_lat)) +rows.sort(key=lambda r: r[0]) + +csv = out / "results.csv" +ratios = [] +with csv.open("w") as f: + f.write( + "case,compile_ms,execution_ms,paper_compile_ms,paper_latency_ms,ratio_compile\n" + ) + for case, c, e, pc, pl in rows: + ratio = c / pc if pc else None + if ratio is not None: + ratios.append(ratio) + ratio_s = f"{ratio:.2f}" if ratio is not None else "" + f.write(f"{case},{c:.3f},{e:.3f},{pc or ''},{pl or ''},{ratio_s}\n") + +md = [ + f"# Wasmer TTFI compare (`{engine}`)\n", + f"- Repeats: **{repeats}** per case\n", + "- `--cache-dir=/dev/null` (paper)\n", + "- **compile**: `Total compilation time` (µs in parens)\n", + f"- **paper compile**: avg from `{paper_log.name}`\n", + f"- **paper latency**: `{paper_col}` column in latency table\n", + "\n| case | compile ms | paper compile | C ratio | exec ms | paper latency |\n", + "|---|---:|---:|---:|---:|---:|\n", +] +for case, c, e, pc, pl in rows: + if pc: + md.append( + f"| {case} | {c:.3f} | {pc:.3f} | {c/pc:.2f} | {e:.3f} | {pl or 'n/a'} |\n" + ) + else: + md.append(f"| {case} | {c:.3f} | n/a | n/a | {e:.3f} | n/a |\n") +if ratios: + md.append(f"\n**Mean compile ratio (this/paper):** {mean(ratios):.2f}\n") +(out / "COMPARE.md").write_text("".join(md)) +print(f"Wrote {csv}") +print(f"Wrote {out / 'COMPARE.md'}") +PY + +echo "" +echo "Done: $OUT/COMPARE.md" diff --git a/benchmarks/paper/scripts/run_wasmtime_ttfi_compare.sh b/benchmarks/paper/scripts/run_wasmtime_ttfi_compare.sh new file mode 100755 index 000000000..ea129679d --- /dev/null +++ b/benchmarks/paper/scripts/run_wasmtime_ttfi_compare.sh @@ -0,0 +1,241 @@ +#!/usr/bin/env bash +# Run patched wasmtime on WAPM cases; compare Total compilation / Execution vs paper logs. +set -euo pipefail + +REPEATS="${1:-3}" +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +OUT="${2:-$ROOT/raw_data/benchs/wasmtime_ttfi_compare_$(date +%Y%m%d_%H%M%S)}" +[[ "$OUT" != /* ]] && OUT="$ROOT/$OUT" +WAPM="$ROOT/benchmarks/wapm" +WT="${WASMTIME:-$ROOT/runtimes/wasmtime-31.0.0/out/wasmtime}" +PAPER_LOG="$ROOT/reference_logs/py_tools/wasmtime_compile_time.txt" +PAPER_MD="$ROOT/raw_data/benchs/latencytofirstinvocation.md" + +export WASMTIME_CACHE=0 +WASMTIME_CACHE_DIR="${WASMTIME_CACHE_DIR:-$HOME/.cache/wasmtime}" +CLEAR_WASMTIME_CACHE="${CLEAR_WASMTIME_CACHE:-1}" + +clear_wasmtime_cache() { + if [[ "$CLEAR_WASMTIME_CACHE" == "1" ]]; then + rm -rf "$WASMTIME_CACHE_DIR" + fi +} + +CASES=( + amirali base64cli chkfont code-stock cowsay dice echo erdtree figlet + irb md5 pi pkg1 qr2text sam suggest tpl uuid viu fortune +) + +mkdir -p "$OUT/logs" + +cd "$WAPM" +load_conf() { + local case="$1" + unset DIR HEAD_COMMAND COMMAND PARAMETER 2>/dev/null || true + HEAD_COMMAND=() + COMMAND=() + PARAMETER=() + DIR=() + if [[ -f "$WAPM/${case}.wasm.conf" ]]; then + # shellcheck source=/dev/null + source "$WAPM/${case}.wasm.conf" + fi + if [[ "$case" == erdtree ]]; then PARAMETER=(); fi + if [[ "$case" == chkfont ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=./fonts) + elif [[ "$case" == figlet ]] && [[ -d "$WAPM/fonts" ]]; then + DIR=(--dir=fonts) + elif [[ "$case" == viu ]]; then + DIR=(--dir=.) + [[ -f "$WAPM/parallel-small.png" ]] && PARAMETER=(parallel-small.png) + fi +} + +fix_path() { local s="$1"; s="${s//case\/wapm\//}"; printf '%s' "$s"; } + +build_cmd() { + local case="$1" + local -n _cmd=$2 + local -a params=() + if [[ -n "${PARAMETER:-}" ]]; then + if declare -p PARAMETER 2>/dev/null | grep -q 'declare \-a'; then + local item + for item in "${PARAMETER[@]}"; do + read -r -a w <<< "$item" + params+=("${w[@]}") + done + else + read -r -a params <<< "$PARAMETER" + fi + fi + _cmd=("$WT") + if [[ -n "${DIR:-}" ]]; then + local d + for d in "${DIR[@]}"; do + d="$(fix_path "$d")" + if [[ "$d" == --dir=* ]]; then _cmd+=("$d"); else _cmd+=(--dir "$d"); fi + done + fi + _cmd+=("${case}.wasm" "${params[@]}") +} + +run_case() { + local case="$1" + local log="$2" + local cmd=() + build_cmd "$case" cmd + if [[ ${#COMMAND[@]} -gt 0 && -n "${COMMAND[0]:-}" ]]; then + if [[ "$case" == dice ]]; then + echo help | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ "$case" == tpl ]]; then + echo 'Δ is 123456-123455.' | "${cmd[@]}" >"$log" 2>&1 || true + elif [[ ${#HEAD_COMMAND[@]} -gt 0 && "${HEAD_COMMAND[0]}" == eval ]]; then + eval "${COMMAND[*]}" | "${cmd[@]}" >"$log" 2>&1 || true + else + "${COMMAND[@]}" | "${cmd[@]}" >"$log" 2>&1 || true + fi + else + "${cmd[@]}" >"$log" 2>&1 || true + fi +} + +echo "wasmtime TTFI compare -> $OUT" +echo " binary: $WT" +echo " repeats: $REPEATS WASMTIME_CACHE=$WASMTIME_CACHE" +echo " clear cache: $CLEAR_WASMTIME_CACHE ($WASMTIME_CACHE_DIR)" +echo "" + +for case in "${CASES[@]}"; do + load_conf "$case" + echo ">> $case" + for ((r = 1; r <= REPEATS; r++)); do + clear_wasmtime_cache + run_case "$case" "$OUT/logs/${case}_${r}.log" + done +done + +ROOT="$ROOT" OUT="$OUT" PAPER_LOG="$PAPER_LOG" PAPER_MD="$PAPER_MD" REPEATS="$REPEATS" python3 <<'PY' +import re +import sys +from collections import defaultdict +from pathlib import Path +from statistics import mean + +root = Path(__import__("os").environ["ROOT"]) +out = Path(__import__("os").environ["OUT"]) +paper_log = Path(__import__("os").environ["PAPER_LOG"]) +paper_md = Path(__import__("os").environ["PAPER_MD"]) +repeats = int(__import__("os").environ["REPEATS"]) + +compile_re = re.compile( + r"Total compilation time: \d+ ms \((\d+) [μµ]s\)" +) +exec_re = re.compile(r"Execution \d+: ([\d.]+) ms") + +# Paper latency table (wasmtime column, ms); optional reference input +latency_wt = {} +if paper_md.is_file(): + for line in paper_md.read_text(encoding="utf-8", errors="replace").splitlines(): + m = re.search(r"case/wapm/([\w-]+)\.wasm", line) + if not m or "avg" in line.lower(): + continue + plain = re.sub(r"<[^>]+>", "", line) + cells = [c.strip() for c in plain.split("|") if c.strip()] + if len(cells) >= 4: + latency_wt[m.group(1)] = float(cells[3]) + +# Paper compile-time log averages (10 runs per case block); optional reference input +paper_compile = defaultdict(list) +current_cmd = None +paper_log_lines = ( + paper_log.read_text(encoding="utf-8", errors="replace").splitlines() + if paper_log.is_file() else [] +) +for line in paper_log_lines: + if line.startswith("Executing command:"): + current_cmd = line + continue + m = compile_re.search(line) + if m and current_cmd: + case_m = re.search(r"case/wapm/([\w-]+)\.wasm", current_cmd) + if case_m: + paper_compile[case_m.group(1)].append(int(m.group(1)) / 1000.0) + +paper_compile_avg = {k: mean(v) for k, v in paper_compile.items()} + +cases = sorted({p.stem.rsplit("_", 1)[0] for p in out.glob("logs/*.log")}) +rows = [] +for case in cases: + compiles, execs, walls = [], [], [] + for r in range(1, repeats + 1): + log = out / "logs" / f"{case}_{r}.log" + if not log.exists(): + continue + text = log.read_text(encoding="utf-8", errors="replace") + cm = compile_re.search(text) + if cm: + compiles.append(int(cm.group(1)) / 1000.0) + em = exec_re.search(text) + if em: + execs.append(float(em.group(1))) + # wall: first line with guest output timing not available; use compile+exec approx + if not compiles: + continue + c_avg = mean(compiles) + e_avg = mean(execs) if execs else float("nan") + p_comp = paper_compile_avg.get(case) + p_lat = latency_wt.get(case) + rows.append((case, c_avg, e_avg, p_comp, p_lat)) +rows.sort(key=lambda r: r[0]) + +csv = out / "results.csv" +ratios = [] +with csv.open("w") as f: + f.write( + "case,compile_ms,execution_ms,paper_compile_ms,paper_latency_wt_ms,ratio_compile\n" + ) + for case, c, e, pc, pl in rows: + ratio = c / pc if pc else None + if ratio is not None: + ratios.append(ratio) + ratio_s = f"{ratio:.2f}" if ratio is not None else "" + f.write( + f"{case},{c:.3f},{e:.3f},{pc or ''},{pl or ''},{ratio_s}\n" + ) + +md = [ + "# Wasmtime TTFI compare (patched `out/wasmtime`)\n", + f"- Repeats: **{repeats}** per case\n", + "- `WASMTIME_CACHE=0`\n", + "- **compile**: `Total compilation time` in stdout\n", + "- **exec**: `Execution 1` (instantiate+invoke)\n", + "- **paper compile**: avg from `wasmtime_compile_time.txt` (10 runs/case)\n", + "- **paper latency**: wasmtime column in `latencytofirstinvocation.md` (different metric)\n", + "\n| case | compile ms | paper compile | C ratio | exec ms | paper latency wt |\n", + "|---|---:|---:|---:|---:|---:|\n", +] +for case, c, e, pc, pl in rows: + if pc and pl: + md.append( + f"| {case} | {c:.3f} | {pc:.3f} | {c/pc:.2f} | {e:.3f} | {pl:.1f} |\n" + ) + else: + md.append(f"| {case} | {c:.3f} | n/a | n/a | {e:.3f} | n/a |\n") +if ratios: + md.append(f"\n**Mean compile ratio (this/paper):** {mean(ratios):.2f}\n") +md.append("\n## Notes\n") +md.append( + "- `paper latency wt` is the paper table wall/TTFI (~21ms echo), not `Total compilation time`.\n" +) +md.append( + "- `paper compile` is from `wasmtime_compile_time.txt` (~2ms amirali, ~20ms echo).\n" +) + +summary = out / "COMPARE.md" +summary.write_text("".join(md)) +print(f"Wrote {csv}") +print(f"Wrote {summary}") +PY + +echo "" +echo "Done: $OUT/COMPARE.md" diff --git a/benchmarks/paper/scripts/setup_polybench_case.sh b/benchmarks/paper/scripts/setup_polybench_case.sh new file mode 100755 index 000000000..20190d8e4 --- /dev/null +++ b/benchmarks/paper/scripts/setup_polybench_case.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Create case symlinks for the webassembly-testsuites runner: +# case/benchmark/polybenchc -> benchmarks/polybenchc +# case/wapm -> benchmarks/wapm +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +RUNNER="$ROOT/scripts/webassembly-testsuites" + +mkdir -p "$RUNNER/case/benchmark" +ln -sfn "$(cd "$ROOT/benchmarks/polybenchc" && pwd)" "$RUNNER/case/benchmark/polybenchc" +ln -sfn "$(cd "$ROOT/benchmarks/wapm" && pwd)" "$RUNNER/case/wapm" + +pb_count="$(find -L "$RUNNER/case/benchmark/polybenchc" -maxdepth 1 -name '*.wasm' | wc -l)" +wapm_count="$(find -L "$RUNNER/case/wapm" -maxdepth 1 -name '*.wasm' | wc -l)" +echo "Linked $RUNNER/case/benchmark/polybenchc -> benchmarks/polybenchc ($pb_count wasm files)" +echo "Linked $RUNNER/case/wapm -> benchmarks/wapm ($wapm_count wasm files)" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/README.md b/benchmarks/paper/scripts/webassembly-testsuites/README.md new file mode 100644 index 000000000..6f7077798 --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/README.md @@ -0,0 +1,24 @@ +# webassembly-testsuites Runner (snapshot) + +A snapshot of the test-runner framework from `webassembly-testsuites`, used to reproduce the runner commands for the polybenchc / wapm suites. + +## Files + +- `runtest_webassembly.py` — main test entry +- `configuration/` — iwasm / wasmtime / wasmer / dtvm runtime configs + +## Usage + +Must run inside a complete `webassembly-testsuites` directory layout (`case/benchmark/...` paths). This repo's benchmark binaries live under `benchmarks/`; symlink them in or clone the full testsuite and replace the corresponding directory. + +```bash +# at the webassembly-testsuites root +./runtest_webassembly.py -r iwasm -s polybenchc +./runtest_webassembly.py -r wasmtime -s polybenchc +./runtest_webassembly.py -r dtvm -s polybenchc +./runtest_webassembly.py -r "wasmer run" -s polybenchc +``` + +## Source + +Mirrored from the webassembly-testsuites repository. diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/__init__.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/dtvm_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/dtvm_config.py new file mode 100644 index 000000000..141b6b105 --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/dtvm_config.py @@ -0,0 +1,7 @@ +from runtime_config import runtime_config + +class runtime_config(runtime_config): + fOption = "-f" + fargsOptions = "--args" + args_list = "" + dir = "ON" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/iwasm_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/iwasm_config.py new file mode 100644 index 000000000..7522c5d87 --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/iwasm_config.py @@ -0,0 +1,6 @@ +from runtime_config import runtime_config + +class runtime_config(runtime_config): + fOption = "-f" + fargsOptions = "" + memory_options = "--heap-size=0 --stack-size=8000000" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/runtime_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/runtime_config.py new file mode 100644 index 000000000..0766f59ec --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/runtime_config.py @@ -0,0 +1,7 @@ +class runtime_config: + fOption = "" + func = "" + fargsOptions = "" + args_list = "" + memory_options = "" + command_template = "{command} {wasm_file} {dtvm_options} {fOption} {func} {fargsOptions} {args_list}" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/suite_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/suite_config.py new file mode 100644 index 000000000..18664bf21 --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/suite_config.py @@ -0,0 +1,14 @@ +class suite_config(): + command = "" + casetype = ".wasm" + expected = "ON" + dir = "" + func = "" + type = "" + input_command = ":" + parameter = "" + args_list = "" + fOption = "" + iwasm_fOption = "" + dtvm_fOption = "" + fargsOptions = "" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmer_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmer_config.py new file mode 100644 index 000000000..e89b8a103 --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmer_config.py @@ -0,0 +1,5 @@ +from runtime_config import runtime_config + +class runtime_config(runtime_config): + fOption = "-i" + command_template = "{command} run {wasm_file} {dtvm_options} {fOption} {func} {fargsOptions} {args_list}" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmtime_config.py b/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmtime_config.py new file mode 100644 index 000000000..87926153a --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/configuration/wasmtime_config.py @@ -0,0 +1,4 @@ +from runtime_config import runtime_config + +class runtime_config(runtime_config): + fOption = "--invoke" diff --git a/benchmarks/paper/scripts/webassembly-testsuites/runtest_webassembly.py b/benchmarks/paper/scripts/webassembly-testsuites/runtest_webassembly.py new file mode 100755 index 000000000..1ddba7abe --- /dev/null +++ b/benchmarks/paper/scripts/webassembly-testsuites/runtest_webassembly.py @@ -0,0 +1,423 @@ +#!/usr/bin/env python3 + +import os +import sys +import time +import difflib +import argparse +import subprocess +import re + +base_dir = os.path.split(os.path.realpath(__file__))[0] +sys.path.append(base_dir) + +startdir = os.getcwd() +os.chdir(base_dir) + +parser = argparse.ArgumentParser() + +parser.add_argument("-r", "--run", dest = "run", nargs = '+', + default = ["iwasm"], + help = "specify a runtime [path/to]([iwasm] / wasmtime / dtvm / wasmer run)") +parser.add_argument("-s", "--suite", dest = "suite_name", nargs = '+', + default = [ 'c', 'emcc', 'wasi', 'wapm', 'issues', 'wabench', 'java2wasm', 'malformed', 'libsodium', 'polybenchc', 'sightglass', 'smartcontract', 'standalone', 'perfcontract', 'assemblyscript' ], + help = "Specify a test suite [test suite name]([c] / emcc / wasi / wapm / spec / issues / wabench / java2wasm / malformed / libsodium / polybenchc / sightglass / smartcontract / standalone / perfcontract / assemblyscript )") +parser.add_argument("--dtvm-options", dest = "dtvm_options", nargs = '?', default = "", help = "options for dtvm cli") + +args = parser.parse_args() + +class commandline_parsing: + def __init__(self): + + runstr = "".join(args.run) + + if runstr.startswith('/') == True: + self.argsrun = runstr + elif '..' in runstr: + self.argsrun = startdir + "/" + runstr + elif './' in runstr: + argsrunstr = runstr.replace(".", "") + self.argsrun = startdir + argsrunstr + elif '/' not in runstr: + self.argsrun = runstr + + if '/' in self.argsrun: + self.runtime = self.argsrun.rsplit('/', 1)[1] + self.command_detection() + else: + self.runtime = self.argsrun + + def command_detection(self): + if os.path.isfile(self.argsrun) == False and not os.access(self.argsrun, os.X_OK): + print("\033[31mCommand exception: Command %s" % self.runtime + " not found!\033[0m") + sys.exit(127) + elif os.path.isfile("configuration/" + self.runtime + "_config.py") == False: + print("\033[31mConfiguration exception: No runtime configuration file found!\033[0m") + sys.exit(128) + +class Statistics: + init_flag = False + + def __init__(self): + if Statistics.init_flag: + return + + self.fail = 0 + self.succ = 0 + self.ignore = 0 + + Statistics.init_flag = True + + def addSucc(self, inc = 1): + self.succ += inc + + def addFail(self, inc = 1): + self.fail += inc + + def addIgnore(self, inc = 1): + self.ignore += inc + +class Runner: + def __init__(self): + + configuration_dir = base_dir + '/configuration' + sys.path.append(configuration_dir) + self.commandline_parsing = commandline_parsing() + runtime_cfg = self.commandline_parsing.runtime + "_config" + config_module = __import__('configuration.' + runtime_cfg, fromlist = runtime_cfg) + self.runtime_config = config_module.runtime_config() + + self.suite_config = None + self.case_config = None + self.workdir = "case/" + suite + if not os.path.exists(self.workdir) and "standalone" in suite: + self.workdir = "case/standalone/" + suite + if not os.path.exists(self.workdir): + self.workdir = "case/benchmark/" + suite + self.statistics = Statistics() + + def getSuiteCases(self, suite): + case_list = [] + + for root, dirs, files in os.walk(self.workdir): + files.sort() + for file in files: + if file.endswith(self.suite_config.casetype): + file = os.path.join(root, file) + dir_count = self.workdir.count("/", 4, len(self.workdir)) + if suite == "issues": + casedirnum = dir_count + 2 + else: + casedirnum = dir_count + 1 + if casedirnum == file.count("/", 4, len(file)) or self.suite_config.type == "java": + case_list.append(file) + return case_list + + def getfOption(self, cfg_bool): + attribute_name = self.commandline_parsing.runtime + "_fOption" + runtime_fOption = getattr(self.suite_config, attribute_name) + case_fOption_bool = hasattr(self.case_config, "fOption") + if runtime_fOption != "" and case_fOption_bool == True and cfg_bool == True: + fOption = runtime_fOption + ' %s' %self.case_config.fOption + func = self.case_config.func + elif runtime_fOption != "": + fOption = runtime_fOption + func = self.suite_config.func + elif cfg_bool == True and self.suite_config.fOption != "": + fOption = self.suite_config.fOption + func = self.case_config.func + elif cfg_bool == True and case_fOption_bool == True: + fOption = self.case_config.fOption + func = self.case_config.func + else: + fOption = self.suite_config.fOption + func = self.suite_config.func + + if cfg_bool == True and self.case_config.dir != "": + fOption = self.case_config.dir + " %s" % fOption + + return fOption, func + + + def getCaseargs(self, args): + try: + getattr(self.case_config, args) + return getattr(self.case_config, args) + except AttributeError as e: + return getattr(self.suite_config, args) + + def getParams(self): + if '>&' in self.case_config.parameter or self.case_config.parameter.startswith('|') == True or self.case_config.parameter.startswith('>'): + fargsOptions = "" + args_list = self.case_config.parameter + elif " > " in self.case_config.parameter and self.runtime_config.args_list != "": + fargsOptions = "" + parameter_list = self.case_config.parameter.split(" >", 1) + args_list = '--args ' + parameter_list[0] + ' > %s' %parameter_list[1] + elif self.case_config.parameter != "": + fargsOptions = self.runtime_config.fargsOptions + args_list = self.case_config.parameter + elif self.case_config.func == "": + fargsOptions = "" + args_list = self.suite_config.parameter + else: + fargsOptions = self.suite_config.fargsOptions + args_list = self.suite_config.parameter + + return fargsOptions, args_list + + def runAllSuites(self): + self.test_start = time.time() + case_config_dir = base_dir + '/' + self.workdir + sys.path.append(case_config_dir) + + suite_module = __import__(self.workdir.replace('/', '.') + ".config", fromlist = "config") + self.suite_config = suite_module.SuiteConfig() + + if os.path.isfile(self.workdir + "/config.py") == False: + print("\033[31mParameter exception: The suit parameter input is abnormal or the suit configuration file does not exist!\033[0m") + sys.exit(2) + + expected = self.suite_config.expected + self.case_num = len(self.getSuiteCases(suite)) + print("\n################################## %s" % self.suite_config.testname + "TEST START #####################################") + for case_name in self.getSuiteCases(suite): + configuration_file = case_name.rsplit('.', 1)[0] + "_config.py" + cfg_bool = os.path.exists(configuration_file) + args_list = self.suite_config.parameter + command = self.commandline_parsing.argsrun + + if cfg_bool == True: + case_cfg = configuration_file.rsplit('/', 1)[1].rsplit('.', 1)[0] + workdir = self.workdir + if "passed" in configuration_file: + workdir = self.workdir + "/passed" + elif "notpass" in configuration_file: + workdir = self.workdir + "/notpass" + + if workdir.count("/", 4, len(workdir)) == 2: + case_module = __import__(workdir.replace('/', '.') + "." + case_cfg, fromlist = case_cfg) + else: + case_module = __import__("case." + self.workdir.rsplit("/", 1)[1] + "." + case_cfg, fromlist = case_cfg) + self.case_config = case_module.config() + expected = self.case_config.expected + func = self.case_config.func + if self.suite_config.command != "": + command = "".join(self.suite_config.command).format(input_command = self.case_config.input_command, runtime = self.commandline_parsing.argsrun, memory_options = self.runtime_config.memory_options) + fargsOptions, args_list = self.getParams() + fOption, func = self.getfOption(cfg_bool) + else: + fOption, func = self.getfOption(cfg_bool) + fargsOptions = self.suite_config.fargsOptions + + if 'workdir' in args_list: + args_list = args_list.replace('workdir', self.workdir) + self.runOneCase(command, fOption, func, case_name, fargsOptions, args_list, expected) + + self.info(self.statistics.succ, self.statistics.fail, self.statistics.ignore) + + ret_code = self.retCode(self.statistics.fail) + if suite == "issues" or suite == "trophies": + ret_code = 0 + return ret_code + + def getCommand(self): + try: + self.suite_config.command_template + return self.suite_config.command_template + except AttributeError as e: + return self.runtime_config.command_template + + def getExpected(self, expected_bool, is_regex_expected, regex_file): + + if is_regex_expected == True: + expected = self.runExpected(regex_file) + elif expected_bool == True: + expected = self.runExpected(regex_file) + else: + expected = "OFF" + + return expected + + def runExpected(self, expected_file): + expected_str = open(expected_file, "r", encoding = "utf-8", errors = 'ignore').read() + if expected_str != "" and expected_str[-1] == '\n': + expected = expected_str[:expected_str.rfind('\n')] + else: + expected = expected_str + return expected + + def sysRun(self, command, case_name): + print("command: %s" % command) + run_subprocess = subprocess.Popen(command, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, error = run_subprocess.communicate() + self.return_code = run_subprocess.wait() + self.result_str = output.decode('utf-8', "ignore") + + def removeNumbers(self, str): + str = newstring = ''.join([i for i in str if not i.isdigit()]) + return str + + def checkExpected(self, wasm_name, result_str, expected, is_regex = False): + result = result_str.rstrip(u'\x00').rstrip() + expected = expected.rstrip(u'\x00').rstrip() + + if is_regex: + findall = re.findall(expected, result) + if findall: + return True + if result == expected: + return True + + print("\nexpected: \n%s" % expected + "\n\nresult: \n%s" % result) + + return False + + def checkIgnore(self, ignore_case): + universal_ignore = runtime_ignore = interp_ignore = "" + ignore_case_bool = hasattr(self.suite_config, 'ignore_case') + runtime_ignore_bool = hasattr(self.suite_config, self.commandline_parsing.runtime + '_ignore') + interp_ignore_bool = hasattr(self.suite_config, 'interp_ignore') + multipass_ignore_bool = hasattr(self.suite_config, 'multipass_ignore') + dtvm_options = args.dtvm_options + is_dtvm_interpreter = dtvm_options.find('-m 0') >= 0 or dtvm_options.find('-m interpreter') >= 0 + is_dtvm_singlepass = dtvm_options.find('-m 1') >= 0 or dtvm_options.find('-m singlepass') >= 0 + is_dtvm_multipass = dtvm_options.find('-m 2') >= 0 or dtvm_options.find('-m multipass') >= 0 + + if ignore_case_bool == True and ignore_case in self.suite_config.ignore_case: + return True + if runtime_ignore_bool == True and ignore_case in getattr(self.suite_config, self.commandline_parsing.runtime + '_ignore'): + return True + if self.commandline_parsing.runtime == "dtvm": + if is_dtvm_interpreter and interp_ignore_bool and ignore_case in self.suite_config.interp_ignore: + return True + if is_dtvm_multipass and multipass_ignore_bool and ignore_case in self.suite_config.multipass_ignore: + return True + return False + + def javaCheck(self, case_name): + newcase = case_name.replace('$', '\$') + if self.suite_config.type == 'java': + ignore_case = newcase.split('/', 2)[2] + else: + ignore_case = case_name.rsplit('/', 1)[1] + return newcase, ignore_case + + def formatCommandString(self, command_str): + if command_str.startswith(':'): + command_str = command_str.replace(': |', '') + return command_str + + def mergeSpaces(self, string): + words = string.split() + merged_string = ' '.join(words) + return merged_string + + def sysRunCheck(self, command_str, command, fOption, func, case_name, newcase, fargsOptions, args_list): + command = self.formatCommandString(command) + + if suite == "gas-meter": + fO_list = fOption.split(',') + for op in fO_list: + string = command_str.format(command = command, wasm_file = newcase, dtvm_options = args.dtvm_options, fOption = fOption, func = func, fargsOptions = fargsOptions, args_list = args_list) + command = self.mergeSpaces(string) + self.sysRun(command, case_name) + if "1000000000" in self.result_str and "Exception: out of gas" not in self.result_str: + self.return_code = 1 + break + elif "35000000000" in self.result_str and "Exception: out of gas" in self.result_str: + self.return_code = 1 + break + else: + string = command_str.format(command = command, wasm_file = newcase, dtvm_options = args.dtvm_options, fOption = fOption, func = func, fargsOptions = fargsOptions, args_list = args_list) + command = self.mergeSpaces(string) + self.sysRun(command, case_name) + + def runOneCase(self, command, fOption, func, case_name, fargsOptions, args_list, expected): + case_start = time.time() + command_str = self.getCommand() + if self.runtime_config.memory_options != "": + command_str = command_str.replace('{wasm_file}', '').replace('{fargsOptions}', '{wasm_file} {fargsOptions}') + newcase, ignore_case = self.javaCheck(case_name) + wasm_name = case_name.rsplit('/', 1)[1] + workdir = os.path.dirname(case_name) + '/' + expected_bool = os.path.exists(case_name + ".expected") + case_regex = case_name + ".expected_regex" + runtime_regex = workdir + self.commandline_parsing.runtime + '_' + wasm_name + ".expected_regex" + + if os.path.exists(case_regex): + is_regex_expected = True + regex_file = case_regex + elif os.path.exists(runtime_regex): + is_regex_expected = True + regex_file = runtime_regex + else: + is_regex_expected = False + regex_file = case_name + ".expected" + + expected = self.getExpected(expected_bool, is_regex_expected, regex_file) + + if self.checkIgnore(ignore_case): + print("test {:75} ........ \033[1;33m [IGNORE]\033[0m".format(case_name)) + self.statistics.addIgnore() + else: + print("testing {:72} ........ \033[1;32m \033[0m".format(case_name)) + self.sysRunCheck(command_str, command, fOption, func, case_name, newcase, fargsOptions, args_list) + if expected != "OFF" and self.checkExpected(wasm_name, self.result_str, expected, is_regex_expected): + print("test {:75} ........ \033[1;32m [PASSED]\033[0m".format(case_name)) + self.statistics.addSucc() + elif self.return_code == 1 and self.checkExpected(wasm_name, self.result_str, expected, is_regex_expected): + print("test {:75} ........ \033[1;32m [PASSED]\033[0m".format(case_name)) + self.statistics.addSucc() + elif expected == "OFF" and self.return_code == 0: + print("test {:75} ........ \033[1;32m [PASSED]\033[0m".format(case_name)) + self.statistics.addSucc() + elif self.suite_config.type == "malformed" and not self.result_str.startswith("Segmentation fault"): + print("test {:75} ........ \033[1;32m [PASSED]\033[0m".format(case_name)) + self.statistics.addSucc() + elif "issues/notpass" in case_name and self.return_code != 0: + print("test {:75} ........ \033[1;32m [PASSED]\033[0m".format(case_name)) + self.statistics.addSucc() + elif 'Exception' in self.result_str: + print("test {:75} ........ \033[1;31m [FAILED]\033[0m".format(case_name)) + self.statistics.addFail() + else: + print("test {:75} ........ \033[1;31m [FAILED]\033[0m".format(case_name)) + self.falseValidation(expected, wasm_name) + self.statistics.addFail() + + case_end = time.time() + current_number = self.statistics.succ + self.statistics.fail + self.statistics.ignore + self.testprogress(current_number, self.case_num, case_start, case_end) + + def testprogress(self, current_number, total_number, case_start, case_end): + Proportion = 100 * current_number / total_number + print("Currently executed case: {}/{} ,Testing time-consuming: {:.3f} ms, The test progress is: {:.2f}%".format(current_number, total_number, (case_end - case_start) * 1000, Proportion)) + + def info(self, succ_cnt, fail_cnt, ignore_cnt): + test_end = time.time() + + print("\n################################## %s" % self.suite_config.testname + "TEST END #####################################") + print("run {} test cases in {:.3f} ms, {} passed, {} ignore, {} failed" + .format(succ_cnt + fail_cnt + ignore_cnt, (test_end - self.test_start) * 1000, succ_cnt, ignore_cnt, fail_cnt)) + + def falseValidation(self, expected, wasm_name): + if self.return_code == 0: + print("\033[31mVerification exception: The result obtained by the test does not match the expected result, and the verification fails!\033[0m") + else: + print("\033[31mVerification exception: the status return value of the test command is not 0, verification failed!!\033[0m") + + def retCode(self, fail_cnt): + if fail_cnt != 0: + ret_code = 101 + else: + ret_code = 0 + return ret_code + +if __name__ == '__main__': + for suite in args.suite_name: + ret_code = Runner().runAllSuites() + if ret_code != 0: + sys.exit(ret_code) + + Statistics.init_flag = False