From ca7290315e79810942c432fc2f19cc23b02a7639 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 21 Nov 2024 16:44:52 -0800 Subject: [PATCH] chore: remove calibration & integration tests from v3 We've now been using v4 for quite a while and v3 should be covered by the conformance tests (i.e., tests against actual messages that have landed on mainnet). Removing this makes it easier to backport changes & refactors from v4 (and beyond). --- Cargo.lock | 1669 +- Cargo.toml | 5 - testing/calibration/.gitignore | 1 - testing/calibration/Makefile | 70 - testing/calibration/README.md | 68 - .../measurements/scripts/observations.plt | 12 - .../measurements/scripts/observations.sh | 32 - .../measurements/scripts/overall.plt | 9 - .../measurements/scripts/overall.sh | 33 - testing/calibration/shared/Cargo.toml | 15 - testing/calibration/shared/src/lib.rs | 102 - testing/conformance/measurements/.gitignore | 2 - testing/conformance/measurements/Makefile | 110 - testing/conformance/measurements/README.md | 37 - .../out/charges/OnBlockCreate.time-vs-gas.png | Bin 18905 -> 0 bytes .../OnBlockCreate.time-vs-gas.summed.png | Bin 17946 -> 0 bytes .../out/charges/OnBlockLink.time-vs-gas.png | Bin 31646 -> 0 bytes .../OnBlockLink.time-vs-gas.summed.png | Bin 15832 -> 0 bytes .../OnBlockOpenPerByte.time-vs-gas.png | Bin 18622 -> 0 bytes .../OnBlockOpenPerByte.time-vs-gas.summed.png | Bin 17665 -> 0 bytes .../out/charges/OnBlockRead.time-vs-gas.png | Bin 21275 -> 0 bytes .../OnBlockRead.time-vs-gas.summed.png | Bin 18365 -> 0 bytes .../out/charges/OnBlockStat.time-vs-gas.png | Bin 10820 -> 0 bytes .../OnBlockStat.time-vs-gas.summed.png | Bin 11174 -> 0 bytes ...OnComputeUnsealedSectorCid.time-vs-gas.png | Bin 12174 -> 0 bytes ...teUnsealedSectorCid.time-vs-gas.summed.png | Bin 11831 -> 0 bytes .../out/charges/OnCreateActor.time-vs-gas.png | Bin 12153 -> 0 bytes .../OnCreateActor.time-vs-gas.summed.png | Bin 12457 -> 0 bytes .../charges/OnGetRandomness.time-vs-gas.png | Bin 14441 -> 0 bytes .../OnGetRandomness.time-vs-gas.summed.png | Bin 12456 -> 0 bytes .../out/charges/OnHashing.time-vs-gas.png | Bin 12656 -> 0 bytes .../charges/OnHashing.time-vs-gas.summed.png | Bin 12656 -> 0 bytes .../charges/OnVerifySignature.time-vs-gas.png | Bin 12743 -> 0 bytes .../OnVerifySignature.time-vs-gas.summed.png | Bin 11553 -> 0 bytes .../out/charges/wasm_exec.time-vs-gas.png | Bin 24392 -> 0 bytes .../charges/wasm_exec.time-vs-gas.summed.png | Bin 17797 -> 0 bytes .../charges/wasm_memory_init.time-vs-gas.png | Bin 11348 -> 0 bytes .../wasm_memory_init.time-vs-gas.summed.png | Bin 11478 -> 0 bytes .../measurements/out/overall/time-vs-gas.png | Bin 16186 -> 0 bytes .../measurements/out/regression.jsonline | 12 - .../scripts/charges/time-vs-gas.plt | 28 - .../scripts/charges/time-vs-gas.sh | 38 - .../scripts/overall/time-vs-gas.plt | 16 - .../scripts/overall/time-vs-gas.sh | 24 - testing/integration/Cargo.toml | 44 - testing/integration/README.md | 29 - testing/integration/examples/integration.rs | 70 - testing/integration/src/builtin.rs | 92 - testing/integration/src/bundle.rs | 26 - testing/integration/src/dummy.rs | 60 - testing/integration/src/error.rs | 16 - testing/integration/src/lib.rs | 8 - testing/integration/src/tester.rs | 432 - testing/integration/src/testkit/fevm.rs | 101 - testing/integration/src/testkit/mod.rs | 4 - testing/integration/tests/address_test.rs | 66 - testing/integration/tests/basic_send_test.rs | 122 - testing/integration/tests/bundles/mod.rs | 54 - testing/integration/tests/calibration/mod.rs | 334 - .../integration/tests/embryo_sender_test.rs | 89 - testing/integration/tests/events_test.rs | 155 - .../integration/tests/fil_integer_overflow.rs | 153 - testing/integration/tests/fil_syscall.rs | 175 - .../integration/tests/gas_calibration_test.rs | 434 - testing/integration/tests/gasfuzz.rs | 111 - testing/integration/tests/gaslimit_test.rs | 159 - testing/integration/tests/main.rs | 1039 - testing/integration/tests/readonly_test.rs | 65 - testing/test_actors/Cargo.toml | 9 - .../actors/fil-address-actor/Cargo.toml | 13 - .../actors/fil-address-actor/src/actor.rs | 87 - .../actors/fil-address-actor/src/lib.rs | 4 - .../actors/fil-create-actor/Cargo.toml | 13 - .../actors/fil-create-actor/src/actor.rs | 88 - .../actors/fil-create-actor/src/lib.rs | 4 - .../actors/fil-events-actor/Cargo.toml | 15 - .../actors/fil-events-actor/src/actor.rs | 130 - .../actors/fil-events-actor/src/lib.rs | 4 - .../actors/fil-exit-data-actor/Cargo.toml | 13 - .../actors/fil-exit-data-actor/src/actor.rs | 30 - .../actors/fil-exit-data-actor/src/lib.rs | 4 - .../fil-gas-calibration-actor/Cargo.toml | 20 - .../fil-gas-calibration-actor/src/actor.rs | 283 - .../fil-gas-calibration-actor/src/lib.rs | 4 - .../actors/fil-gaslimit-actor/Cargo.toml | 16 - .../actors/fil-gaslimit-actor/src/actor.rs | 121 - .../actors/fil-gaslimit-actor/src/lib.rs | 4 - .../actors/fil-hello-world-actor/Cargo.toml | 12 - .../actors/fil-hello-world-actor/src/lib.rs | 14 - .../fil-integer-overflow-actor/Cargo.toml | 19 - .../src/actor/blockstore.rs | 42 - .../src/actor/mod.rs | 128 - .../fil-integer-overflow-actor/src/lib.rs | 4 - .../actors/fil-ipld-actor/Cargo.toml | 16 - .../actors/fil-ipld-actor/src/actor.rs | 254 - .../actors/fil-ipld-actor/src/lib.rs | 4 - .../fil-malformed-syscall-actor/Cargo.toml | 12 - .../fil-malformed-syscall-actor/src/lib.rs | 18 - .../actors/fil-oom-actor/Cargo.toml | 12 - .../actors/fil-oom-actor/src/lib.rs | 68 - .../actors/fil-readonly-actor/Cargo.toml | 14 - .../actors/fil-readonly-actor/src/actor.rs | 180 - .../actors/fil-readonly-actor/src/lib.rs | 4 - .../actors/fil-sself-actor/Cargo.toml | 14 - .../actors/fil-sself-actor/src/actor.rs | 72 - .../actors/fil-sself-actor/src/lib.rs | 4 - .../fil-stack-overflow-actor/Cargo.toml | 12 - .../fil-stack-overflow-actor/src/actor.rs | 75 - .../fil-stack-overflow-actor/src/lib.rs | 4 - .../actors/fil-syscall-actor/Cargo.toml | 19 - .../actors/fil-syscall-actor/src/actor.rs | 379 - .../actors/fil-syscall-actor/src/lib.rs | 4 - testing/test_actors/build.rs | 117 - testing/test_actors/src/lib.rs | 5 - .../benchmarks/RecursiveDelegateCall.sol | 23 - .../benchmarks/RecursiveDelegatecall.bin | 1 - .../RecursiveDelegatecall.signatures | 6 - tools/contracts/benchmarks/SimpleCoin.bin | 1 - tools/contracts/benchmarks/SimpleCoin.sol | 40 - tools/contracts/benchmarks/banker.bin | 1 - tools/contracts/benchmarks/banker.eas | 12 - tools/contracts/benchmarks/banker_body.eas | 52 - tools/contracts/benchmarks/easx | 12 - tools/contracts/benchmarks/empty.bin | 0 tools/contracts/benchmarks/fibomaon.bin | 1 - tools/contracts/benchmarks/fibomaon.eas | 14 - tools/contracts/benchmarks/fibomaon_body.eas | 48 - tools/contracts/benchmarks/jmpfest-gen.ss | 65 - tools/contracts/benchmarks/jmpfest_linear.bin | 1 - tools/contracts/benchmarks/jmpfest_linear.eas | 14 - .../benchmarks/jmpfest_linear_body.eas | 16506 ---------------- tools/contracts/benchmarks/jmpfest_random.bin | 1 - tools/contracts/benchmarks/jmpfest_random.eas | 14 - .../benchmarks/jmpfest_random_body.eas | 16506 ---------------- tools/contracts/benchmarks/memfest_linear.bin | 1 - tools/contracts/benchmarks/memfest_linear.eas | 14 - .../benchmarks/memfest_linear_body.eas | 90 - tools/contracts/benchmarks/memfest_random.bin | 1 - tools/contracts/benchmarks/memfest_random.eas | 14 - .../benchmarks/memfest_random_body.eas | 90 - tools/contracts/benchmarks/pushfest.bin | 1 - tools/contracts/benchmarks/pushfest.eas | 14 - tools/contracts/benchmarks/pushfest_body.eas | 58 - tools/contracts/gas-stress/README.md | 15 - tools/contracts/gas-stress/counter.bin | 1 - tools/contracts/gas-stress/counter.eas | 14 - tools/contracts/gas-stress/counter_body.eas | 8 - tools/contracts/gas-stress/easx | 12 - tools/contracts/gas-stress/recursive.bin | 1 - tools/contracts/gas-stress/recursive.eas | 15 - tools/contracts/gas-stress/recursive_body.eas | 35 - tools/contracts/gas-stress/stateful.bin | 1 - tools/contracts/gas-stress/stateful.eas | 15 - tools/contracts/gas-stress/stateful_body.eas | 62 - tools/fvm-bench/.gitignore | 15 - tools/fvm-bench/Cargo.toml | 15 - tools/fvm-bench/LICENSE | 21 - tools/fvm-bench/README.md | 41 - tools/fvm-bench/src/fevm.rs | 246 - tools/fvm-bench/src/main.rs | 83 - tools/solidity-tests/README.md | 100 - tools/solidity-tests/libraries/EVMUtils.sol | 53 - tools/solidity-tests/libraries/ErrLib.sol | 145 - tools/solidity-tests/libraries/FilUtils.sol | 182 - tools/solidity-tests/libraries/Test.sol | 350 - .../libraries/deployable/Dummy.sol | 41 - .../libraries/deployable/Lifecycle.sol | 119 - .../libraries/deployable/Nested.sol | 76 - tools/solidity-tests/package.json | 5 - tools/solidity-tests/script.sh | 86 - .../tests/TestEVMPrecompiles.sol | 50 - .../tests/TestFilPrecompiles.sol | 105 - tools/solidity-tests/tests/TestLifecycle.sol | 305 - .../tests/TestStaticContext.sol | 176 - .../tests/recursive/TestRecursiveCall.sol | 153 - .../tests/recursive/TestRecursiveCreate.sol | 67 - .../tests/recursive/TestRecursiveCreate2.sol | 70 - 177 files changed, 179 insertions(+), 44594 deletions(-) delete mode 100644 testing/calibration/.gitignore delete mode 100644 testing/calibration/Makefile delete mode 100644 testing/calibration/README.md delete mode 100644 testing/calibration/measurements/scripts/observations.plt delete mode 100755 testing/calibration/measurements/scripts/observations.sh delete mode 100644 testing/calibration/measurements/scripts/overall.plt delete mode 100755 testing/calibration/measurements/scripts/overall.sh delete mode 100644 testing/calibration/shared/Cargo.toml delete mode 100644 testing/calibration/shared/src/lib.rs delete mode 100644 testing/conformance/measurements/.gitignore delete mode 100644 testing/conformance/measurements/Makefile delete mode 100644 testing/conformance/measurements/README.md delete mode 100644 testing/conformance/measurements/out/charges/OnBlockCreate.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockCreate.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockLink.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockLink.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockRead.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockRead.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockStat.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnBlockStat.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnComputeUnsealedSectorCid.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnComputeUnsealedSectorCid.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnCreateActor.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnCreateActor.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnGetRandomness.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnGetRandomness.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnHashing.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnHashing.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/OnVerifySignature.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/OnVerifySignature.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/charges/wasm_memory_init.time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/charges/wasm_memory_init.time-vs-gas.summed.png delete mode 100644 testing/conformance/measurements/out/overall/time-vs-gas.png delete mode 100644 testing/conformance/measurements/out/regression.jsonline delete mode 100644 testing/conformance/measurements/scripts/charges/time-vs-gas.plt delete mode 100755 testing/conformance/measurements/scripts/charges/time-vs-gas.sh delete mode 100644 testing/conformance/measurements/scripts/overall/time-vs-gas.plt delete mode 100755 testing/conformance/measurements/scripts/overall/time-vs-gas.sh delete mode 100644 testing/integration/Cargo.toml delete mode 100644 testing/integration/README.md delete mode 100644 testing/integration/examples/integration.rs delete mode 100644 testing/integration/src/builtin.rs delete mode 100644 testing/integration/src/bundle.rs delete mode 100644 testing/integration/src/dummy.rs delete mode 100644 testing/integration/src/error.rs delete mode 100644 testing/integration/src/lib.rs delete mode 100644 testing/integration/src/tester.rs delete mode 100644 testing/integration/src/testkit/fevm.rs delete mode 100644 testing/integration/src/testkit/mod.rs delete mode 100644 testing/integration/tests/address_test.rs delete mode 100644 testing/integration/tests/basic_send_test.rs delete mode 100644 testing/integration/tests/bundles/mod.rs delete mode 100644 testing/integration/tests/calibration/mod.rs delete mode 100644 testing/integration/tests/embryo_sender_test.rs delete mode 100644 testing/integration/tests/events_test.rs delete mode 100644 testing/integration/tests/fil_integer_overflow.rs delete mode 100644 testing/integration/tests/fil_syscall.rs delete mode 100644 testing/integration/tests/gas_calibration_test.rs delete mode 100644 testing/integration/tests/gasfuzz.rs delete mode 100644 testing/integration/tests/gaslimit_test.rs delete mode 100644 testing/integration/tests/main.rs delete mode 100644 testing/integration/tests/readonly_test.rs delete mode 100644 testing/test_actors/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-address-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-address-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-address-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-create-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-create-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-create-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-events-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-events-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-events-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-exit-data-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-exit-data-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-exit-data-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-gas-calibration-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-gas-calibration-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-gas-calibration-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-gaslimit-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-gaslimit-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-gaslimit-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-hello-world-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-hello-world-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-integer-overflow-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-integer-overflow-actor/src/actor/blockstore.rs delete mode 100644 testing/test_actors/actors/fil-integer-overflow-actor/src/actor/mod.rs delete mode 100644 testing/test_actors/actors/fil-integer-overflow-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-ipld-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-ipld-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-ipld-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-malformed-syscall-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-malformed-syscall-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-oom-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-oom-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-readonly-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-readonly-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-readonly-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-sself-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-sself-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-sself-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-stack-overflow-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-stack-overflow-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-stack-overflow-actor/src/lib.rs delete mode 100644 testing/test_actors/actors/fil-syscall-actor/Cargo.toml delete mode 100644 testing/test_actors/actors/fil-syscall-actor/src/actor.rs delete mode 100644 testing/test_actors/actors/fil-syscall-actor/src/lib.rs delete mode 100644 testing/test_actors/build.rs delete mode 100644 testing/test_actors/src/lib.rs delete mode 100644 tools/contracts/benchmarks/RecursiveDelegateCall.sol delete mode 100644 tools/contracts/benchmarks/RecursiveDelegatecall.bin delete mode 100644 tools/contracts/benchmarks/RecursiveDelegatecall.signatures delete mode 100644 tools/contracts/benchmarks/SimpleCoin.bin delete mode 100644 tools/contracts/benchmarks/SimpleCoin.sol delete mode 100644 tools/contracts/benchmarks/banker.bin delete mode 100644 tools/contracts/benchmarks/banker.eas delete mode 100644 tools/contracts/benchmarks/banker_body.eas delete mode 100755 tools/contracts/benchmarks/easx delete mode 100644 tools/contracts/benchmarks/empty.bin delete mode 100644 tools/contracts/benchmarks/fibomaon.bin delete mode 100644 tools/contracts/benchmarks/fibomaon.eas delete mode 100644 tools/contracts/benchmarks/fibomaon_body.eas delete mode 100755 tools/contracts/benchmarks/jmpfest-gen.ss delete mode 100644 tools/contracts/benchmarks/jmpfest_linear.bin delete mode 100644 tools/contracts/benchmarks/jmpfest_linear.eas delete mode 100644 tools/contracts/benchmarks/jmpfest_linear_body.eas delete mode 100644 tools/contracts/benchmarks/jmpfest_random.bin delete mode 100644 tools/contracts/benchmarks/jmpfest_random.eas delete mode 100644 tools/contracts/benchmarks/jmpfest_random_body.eas delete mode 100644 tools/contracts/benchmarks/memfest_linear.bin delete mode 100644 tools/contracts/benchmarks/memfest_linear.eas delete mode 100644 tools/contracts/benchmarks/memfest_linear_body.eas delete mode 100644 tools/contracts/benchmarks/memfest_random.bin delete mode 100644 tools/contracts/benchmarks/memfest_random.eas delete mode 100644 tools/contracts/benchmarks/memfest_random_body.eas delete mode 100644 tools/contracts/benchmarks/pushfest.bin delete mode 100644 tools/contracts/benchmarks/pushfest.eas delete mode 100644 tools/contracts/benchmarks/pushfest_body.eas delete mode 100644 tools/contracts/gas-stress/README.md delete mode 100644 tools/contracts/gas-stress/counter.bin delete mode 100644 tools/contracts/gas-stress/counter.eas delete mode 100644 tools/contracts/gas-stress/counter_body.eas delete mode 100755 tools/contracts/gas-stress/easx delete mode 100644 tools/contracts/gas-stress/recursive.bin delete mode 100644 tools/contracts/gas-stress/recursive.eas delete mode 100644 tools/contracts/gas-stress/recursive_body.eas delete mode 100644 tools/contracts/gas-stress/stateful.bin delete mode 100644 tools/contracts/gas-stress/stateful.eas delete mode 100644 tools/contracts/gas-stress/stateful_body.eas delete mode 100644 tools/fvm-bench/.gitignore delete mode 100644 tools/fvm-bench/Cargo.toml delete mode 100644 tools/fvm-bench/LICENSE delete mode 100644 tools/fvm-bench/README.md delete mode 100644 tools/fvm-bench/src/fevm.rs delete mode 100644 tools/fvm-bench/src/main.rs delete mode 100644 tools/solidity-tests/README.md delete mode 100644 tools/solidity-tests/libraries/EVMUtils.sol delete mode 100644 tools/solidity-tests/libraries/ErrLib.sol delete mode 100644 tools/solidity-tests/libraries/FilUtils.sol delete mode 100644 tools/solidity-tests/libraries/Test.sol delete mode 100644 tools/solidity-tests/libraries/deployable/Dummy.sol delete mode 100644 tools/solidity-tests/libraries/deployable/Lifecycle.sol delete mode 100644 tools/solidity-tests/libraries/deployable/Nested.sol delete mode 100644 tools/solidity-tests/package.json delete mode 100755 tools/solidity-tests/script.sh delete mode 100644 tools/solidity-tests/tests/TestEVMPrecompiles.sol delete mode 100644 tools/solidity-tests/tests/TestFilPrecompiles.sol delete mode 100644 tools/solidity-tests/tests/TestLifecycle.sol delete mode 100644 tools/solidity-tests/tests/TestStaticContext.sol delete mode 100644 tools/solidity-tests/tests/recursive/TestRecursiveCall.sol delete mode 100644 tools/solidity-tests/tests/recursive/TestRecursiveCreate.sol delete mode 100644 tools/solidity-tests/tests/recursive/TestRecursiveCreate2.sol diff --git a/Cargo.lock b/Cargo.lock index c701c40d1..cfd9dbc21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -281,17 +281,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.4.0" @@ -325,12 +314,6 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -461,19 +444,6 @@ dependencies = [ "constant_time_eq 0.3.1", ] -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec 0.7.6", - "cc", - "cfg-if", - "constant_time_eq 0.3.1", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -577,27 +547,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "bytes" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" - [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" -[[package]] -name = "castaway" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" -dependencies = [ - "rustversion", -] - [[package]] name = "cbc" version = "0.1.2" @@ -671,20 +626,6 @@ dependencies = [ "half", ] -[[package]] -name = "cid" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" -dependencies = [ - "core2", - "multibase", - "multihash 0.16.3", - "serde", - "serde_bytes", - "unsigned-varint 0.7.2", -] - [[package]] name = "cid" version = "0.10.1" @@ -694,7 +635,7 @@ dependencies = [ "arbitrary", "core2", "multibase", - "multihash 0.18.1", + "multihash", "quickcheck", "rand", "serde", @@ -723,23 +664,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_derive 3.2.25", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "once_cell", - "strsim", - "termcolor", - "textwrap", -] - [[package]] name = "clap" version = "4.5.20" @@ -747,7 +671,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", - "clap_derive 4.5.18", ] [[package]] @@ -757,41 +680,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstyle", - "clap_lex 0.7.2", -] - -[[package]] -name = "clap_derive" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.82", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", + "clap_lex", ] [[package]] @@ -1025,7 +914,7 @@ dependencies = [ "async-std", "cast", "ciborium", - "clap 4.5.20", + "clap", "criterion-plot", "futures", "is-terminal", @@ -1499,825 +1388,184 @@ dependencies = [ ] [[package]] -name = "fil_actor_account" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "filecoin-hashers" +version = "13.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85413176cea16bfe171caafab023044820c0033b243b535b19116776ffd3f285" dependencies = [ "anyhow", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_actor_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "num-derive 0.3.3", - "num-traits", + "bellperson", + "blstrs", + "ff", + "generic-array 0.14.7", + "hex", + "lazy_static", + "merkletree", + "neptune", + "rand", "serde", + "sha2 0.10.8", ] [[package]] -name = "fil_actor_bundler" -version = "5.0.0" +name = "filecoin-proofs" +version = "18.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3138c84b845e64c6ad0c50ef299f954d979bd265c8b74509a22b9d1b8107e0" +checksum = "096b8b483f6ed5823150daf6cd22ee8e32b3dabcb4fd70dab70044e73bcab107" dependencies = [ "anyhow", - "async-std", - "cid 0.8.6", - "clap 3.2.25", - "futures", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_car 0.6.0", - "fvm_ipld_encoding 0.3.3", - "serde", - "serde_ipld_dagcbor 0.2.2", - "serde_json", -] - -[[package]] -name = "fil_actor_cron" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "fil_actors_runtime 10.0.0", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", + "bellperson", + "bincode", + "blake2b_simd", + "blstrs", + "ff", + "filecoin-hashers", + "fr32", + "generic-array 0.14.7", + "hex", + "iowrap", + "lazy_static", "log", - "num-derive 0.3.3", - "num-traits", + "memmap2", + "merkletree", + "once_cell", + "rand", + "rayon", "serde", + "serde_json", + "sha2 0.10.8", + "storage-proofs-core", + "storage-proofs-porep", + "storage-proofs-post", + "storage-proofs-update", + "typenum", ] [[package]] -name = "fil_actor_datacap" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "filecoin-proofs-api" +version = "18.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aea8140d1e2d2ac18347e6121ee24d0e903f9cfdc2eb2ee507932e352c9e7b8" dependencies = [ - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "frc46_token", - "fvm_actor_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", + "anyhow", + "bincode", + "blstrs", + "filecoin-proofs", + "fr32", "lazy_static", - "log", - "num-derive 0.3.3", - "num-traits", "serde", + "storage-proofs-core", ] [[package]] -name = "fil_actor_eam" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_evm_shared", - "fil_actors_runtime 10.0.0", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "hex-literal", - "log", - "multihash 0.16.3", - "num-derive 0.3.3", - "num-traits", - "rlp", - "serde", - "serde_tuple", + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", ] [[package]] -name = "fil_actor_ethaccount" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_actor_utils", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "hex-literal", - "num-derive 0.3.3", - "num-traits", - "serde", + "crc32fast", + "miniz_oxide", ] [[package]] -name = "fil_actor_evm" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_evm_shared", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_kamt", - "fvm_shared 3.0.0", - "hex", - "hex-literal", - "log", - "multihash 0.16.3", - "num-derive 0.3.3", - "num-traits", - "serde", - "serde_tuple", - "substrate-bn", + "spin", ] [[package]] -name = "fil_actor_init" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "log", - "num-derive 0.3.3", - "num-traits", - "serde", -] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" [[package]] -name = "fil_actor_market" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "forest_hash_utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb061ad769411763a5d6ae39d596696657472b25a66387fbb0ba8c133bb6575" dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "frc46_token", - "fvm_ipld_bitfield 0.5.4", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "integer-encoding", - "libipld-core 0.13.1", - "log", - "num-derive 0.3.3", - "num-traits", + "cs_serde_bytes", "serde", ] [[package]] -name = "fil_actor_miner" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "anyhow", - "byteorder", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_ipld_amt 0.5.1", - "fvm_ipld_bitfield 0.5.4", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "itertools 0.10.5", - "lazy_static", - "log", - "multihash 0.16.3", - "num-derive 0.3.3", - "num-traits", - "serde", + "percent-encoding", ] [[package]] -name = "fil_actor_multisig" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "fr32" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "627a3f3108ee3287759a45f6d5aafe48b3017509df9b677115f88266d61e0815" dependencies = [ "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_actor_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "indexmap 1.9.3", - "integer-encoding", - "num-derive 0.3.3", - "num-traits", - "serde", + "blstrs", + "byte-slice-cast", + "byteorder", + "ff", + "thiserror", ] [[package]] -name = "fil_actor_paych" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "num-derive 0.3.3", - "num-traits", - "serde", + "libc", + "winapi", ] [[package]] -name = "fil_actor_placeholder" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "fil_actor_power" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "indexmap 1.9.3", - "integer-encoding", - "lazy_static", - "log", - "num-derive 0.3.3", - "num-traits", - "serde", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "fil_actor_reward" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "fil_actors_runtime 10.0.0", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "lazy_static", - "log", - "num-derive 0.3.3", - "num-traits", - "serde", -] - -[[package]] -name = "fil_actor_system" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "num-derive 0.3.3", - "num-traits", - "serde", -] - -[[package]] -name = "fil_actor_verifreg" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "anyhow", - "cid 0.8.6", - "fil_actors_runtime 10.0.0", - "frc42_dispatch", - "frc46_token", - "fvm_actor_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_shared 3.0.0", - "lazy_static", - "log", - "num-derive 0.3.3", - "num-traits", - "serde", -] - -[[package]] -name = "fil_actors_evm_shared" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "fil_actors_runtime 10.0.0", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "hex", - "serde", - "uint", -] - -[[package]] -name = "fil_actors_runtime" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "anyhow", - "byteorder", - "castaway", - "cid 0.8.6", - "fvm_ipld_amt 0.5.1", - "fvm_ipld_bitfield 0.5.4", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_sdk 3.0.0", - "fvm_shared 3.0.0", - "itertools 0.10.5", - "log", - "multihash 0.16.3", - "num", - "num-derive 0.3.3", - "num-traits", - "paste", - "regex", - "serde", - "serde_repr", - "sha2 0.10.8", - "thiserror", - "unsigned-varint 0.7.2", -] - -[[package]] -name = "fil_actors_runtime" -version = "15.0.0-rc1" -source = "git+https://github.com/filecoin-project/builtin-actors?branch=master#12d9af8a00d0909598c67e1a18dc1577e0833137" -dependencies = [ - "anyhow", - "base64 0.21.7", - "byteorder", - "castaway", - "cid 0.10.1", - "fvm_ipld_amt 0.6.2", - "fvm_ipld_bitfield 0.6.0", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", - "fvm_ipld_hamt 0.9.0", - "fvm_shared 4.4.2", - "integer-encoding", - "itertools 0.10.5", - "lazy_static", - "log", - "multihash 0.18.1", - "num", - "num-derive 0.3.3", - "num-traits", - "paste", - "regex", - "serde", - "serde_repr", - "sha2 0.10.8", - "thiserror", - "unsigned-varint 0.7.2", - "vm_api", -] - -[[package]] -name = "fil_address_actor" -version = "0.1.0" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_builtin_actors_bundle" -version = "10.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?tag=v10.0.0#f78bf08a1f444544c22a5dea4d329b88705b0c04" -dependencies = [ - "cid 0.8.6", - "clap 3.2.25", - "fil_actor_account", - "fil_actor_bundler", - "fil_actor_cron", - "fil_actor_datacap", - "fil_actor_eam", - "fil_actor_ethaccount", - "fil_actor_evm", - "fil_actor_init", - "fil_actor_market", - "fil_actor_miner", - "fil_actor_multisig", - "fil_actor_paych", - "fil_actor_placeholder", - "fil_actor_power", - "fil_actor_reward", - "fil_actor_system", - "fil_actor_verifreg", - "fil_actors_runtime 10.0.0", - "num-traits", -] - -[[package]] -name = "fil_create_actor" -version = "0.1.0" -dependencies = [ - "fil_actors_runtime 15.0.0-rc1", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_events_actor" -version = "0.1.0" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "serde", - "serde_tuple", -] - -[[package]] -name = "fil_exit_data_actor" -version = "0.1.0" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_gas_calibration_actor" -version = "0.1.0" -dependencies = [ - "anyhow", - "cid 0.10.1", - "fvm_gas_calibration_shared", - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "num-derive 0.4.2", - "num-traits", - "serde", -] - -[[package]] -name = "fil_gaslimit_actor" -version = "0.1.0" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "log", - "serde", - "serde_tuple", -] - -[[package]] -name = "fil_hello_world_actor" -version = "0.1.0" -dependencies = [ - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_integer_overflow_actor" -version = "0.1.0" -dependencies = [ - "anyhow", - "cid 0.10.1", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "serde", - "serde_tuple", -] - -[[package]] -name = "fil_ipld_actor" -version = "0.1.0" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "minicov", -] - -[[package]] -name = "fil_malformed_syscall_actor" -version = "0.1.0" -dependencies = [ - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_oom_actor" -version = "0.1.0" -dependencies = [ - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_readonly_actor" -version = "0.1.0" -dependencies = [ - "cid 0.10.1", - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_sself_actor" -version = "0.1.0" -dependencies = [ - "cid 0.10.1", - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_stack_overflow_actor" -version = "0.1.0" -dependencies = [ - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", -] - -[[package]] -name = "fil_syscall_actor" -version = "0.1.0" -dependencies = [ - "fil_actors_runtime 15.0.0-rc1", - "fvm_ipld_encoding 0.4.0", - "fvm_sdk 3.11.1", - "fvm_shared 3.11.1", - "minicov", - "multihash 0.18.1", -] - -[[package]] -name = "filecoin-hashers" -version = "13.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85413176cea16bfe171caafab023044820c0033b243b535b19116776ffd3f285" -dependencies = [ - "anyhow", - "bellperson", - "blstrs", - "ff", - "generic-array 0.14.7", - "hex", - "lazy_static", - "merkletree", - "neptune", - "rand", - "serde", - "sha2 0.10.8", -] - -[[package]] -name = "filecoin-proofs" -version = "18.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "096b8b483f6ed5823150daf6cd22ee8e32b3dabcb4fd70dab70044e73bcab107" -dependencies = [ - "anyhow", - "bellperson", - "bincode", - "blake2b_simd", - "blstrs", - "ff", - "filecoin-hashers", - "fr32", - "generic-array 0.14.7", - "hex", - "iowrap", - "lazy_static", - "log", - "memmap2", - "merkletree", - "once_cell", - "rand", - "rayon", - "serde", - "serde_json", - "sha2 0.10.8", - "storage-proofs-core", - "storage-proofs-porep", - "storage-proofs-post", - "storage-proofs-update", - "typenum", -] - -[[package]] -name = "filecoin-proofs-api" -version = "18.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aea8140d1e2d2ac18347e6121ee24d0e903f9cfdc2eb2ee507932e352c9e7b8" -dependencies = [ - "anyhow", - "bincode", - "blstrs", - "filecoin-proofs", - "fr32", - "lazy_static", - "serde", - "storage-proofs-core", -] - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "flate2" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" -dependencies = [ - "spin", -] - -[[package]] -name = "foldhash" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" - -[[package]] -name = "forest_hash_utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb061ad769411763a5d6ae39d596696657472b25a66387fbb0ba8c133bb6575" -dependencies = [ - "cs_serde_bytes", - "serde", -] - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fr32" -version = "11.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "627a3f3108ee3287759a45f6d5aafe48b3017509df9b677115f88266d61e0815" -dependencies = [ - "anyhow", - "blstrs", - "byte-slice-cast", - "byteorder", - "ff", - "thiserror", -] - -[[package]] -name = "frc42_dispatch" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc80f65be319b625b0a09e86ba0793e3da8e4ab9030a801f0cdd00bbcb8e24" -dependencies = [ - "frc42_hasher", - "frc42_macros", - "fvm_ipld_encoding 0.3.3", - "fvm_sdk 3.0.0", - "fvm_shared 3.0.0", - "thiserror", -] - -[[package]] -name = "frc42_hasher" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab91345ff52851dfa6e3a253f08462e703a04c5c6458cecddbec9596519b9026" -dependencies = [ - "fvm_sdk 3.0.0", - "fvm_shared 3.0.0", - "thiserror", -] - -[[package]] -name = "frc42_macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e5a8b295ad4267907612c931b60f25ab7a74e540de41668cee96ce6af0ed3b" -dependencies = [ - "blake2b_simd", - "frc42_hasher", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "frc46_token" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef4c6ab802df24f9d29fe4f0c6b463b46a27954ea722d29a80ab3c93800c0a0" -dependencies = [ - "anyhow", - "cid 0.8.6", - "frc42_dispatch", - "fvm_actor_utils", - "fvm_ipld_amt 0.5.1", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_ipld_hamt 0.6.1", - "fvm_sdk 3.0.0", - "fvm_shared 3.0.0", - "integer-encoding", - "num-traits", - "serde", - "serde_tuple", - "thiserror", -] - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", + "futures-core", + "futures-sink", ] [[package]] @@ -2405,20 +1653,20 @@ dependencies = [ "arbitrary", "blake2b_simd", "byteorder", - "cid 0.10.1", + "cid", "derive_more", "filecoin-proofs-api", "fvm", "fvm-wasm-instrument", - "fvm_ipld_amt 0.6.2", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", - "fvm_ipld_hamt 0.9.0", - "fvm_shared 3.11.1", + "fvm_ipld_amt", + "fvm_ipld_blockstore", + "fvm_ipld_encoding", + "fvm_ipld_hamt", + "fvm_shared", "lazy_static", "log", "minstant", - "multihash 0.18.1", + "multihash", "num-traits", "num_cpus", "once_cell", @@ -2435,20 +1683,6 @@ dependencies = [ "yastl", ] -[[package]] -name = "fvm-bench" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap 4.5.20", - "env_logger 0.11.5", - "fvm", - "fvm_integration_tests", - "fvm_ipld_encoding 0.4.0", - "fvm_shared 3.11.1", - "hex", -] - [[package]] name = "fvm-wasm-instrument" version = "0.4.0" @@ -2461,25 +1695,6 @@ dependencies = [ "wasmprinter 0.2.80", ] -[[package]] -name = "fvm_actor_utils" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37f347ddbb46adeba750a8bbc499d5b7f83610d977615b4bcd83b84081b8721" -dependencies = [ - "anyhow", - "cid 0.8.6", - "frc42_dispatch", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "fvm_sdk 3.0.0", - "fvm_shared 3.0.0", - "num-traits", - "serde", - "serde_tuple", - "thiserror", -] - [[package]] name = "fvm_conformance_tests" version = "0.1.0" @@ -2487,7 +1702,7 @@ dependencies = [ "anyhow", "async-std", "base64 0.22.1", - "cid 0.10.1", + "cid", "colored", "criterion", "either", @@ -2495,16 +1710,16 @@ dependencies = [ "flate2", "futures", "fvm", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_car 0.7.1", - "fvm_ipld_encoding 0.4.0", - "fvm_shared 3.11.1", + "fvm_ipld_blockstore", + "fvm_ipld_car", + "fvm_ipld_encoding", + "fvm_shared", "itertools 0.13.0", "ittapi-rs", "lazy_static", - "libipld-core 0.16.0", + "libipld-core", "log", - "multihash 0.18.1", + "multihash", "num-traits", "num_cpus", "regex", @@ -2516,65 +1731,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "fvm_gas_calibration_shared" -version = "0.1.0" -dependencies = [ - "fvm_shared 3.11.1", - "num-derive 0.4.2", - "num-traits", - "serde", - "serde_json", -] - -[[package]] -name = "fvm_integration_tests" -version = "3.11.1" -dependencies = [ - "anyhow", - "blake2b_simd", - "bls-signatures", - "cid 0.10.1", - "fil_builtin_actors_bundle", - "futures", - "fvm", - "fvm_gas_calibration_shared", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_car 0.7.1", - "fvm_ipld_encoding 0.4.0", - "fvm_shared 3.11.1", - "fvm_test_actors", - "hex", - "lazy_static", - "libsecp256k1", - "multihash 0.18.1", - "num-traits", - "rand", - "rand_chacha", - "serde", - "serde_json", - "serde_tuple", - "thiserror", - "wasmtime", - "wat", -] - -[[package]] -name = "fvm_ipld_amt" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e84f16d6927ce342ef86bd20fcc2d5bd498ed33ae6d7a22fea7a1b453488ec88" -dependencies = [ - "anyhow", - "cid 0.8.6", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "itertools 0.10.5", - "once_cell", - "serde", - "thiserror", -] - [[package]] name = "fvm_ipld_amt" version = "0.6.2" @@ -2582,50 +1738,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fea333475130094f27ce67809aae3f69eb5247541d835950b7c5da733dbbb34" dependencies = [ "anyhow", - "cid 0.10.1", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", + "cid", + "fvm_ipld_blockstore", + "fvm_ipld_encoding", "itertools 0.11.0", "once_cell", "serde", "thiserror", ] -[[package]] -name = "fvm_ipld_bitfield" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1950291f40d2d1047eb0a4568f7ef6d5b4973452dcef012dffb1957fe483ff7" -dependencies = [ - "fvm_ipld_encoding 0.3.3", - "serde", - "thiserror", - "unsigned-varint 0.7.2", -] - -[[package]] -name = "fvm_ipld_bitfield" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da94287cafa663c2e295fe45c4c9dbf5ab7b52f648568f9ae3823deaf9873a89" -dependencies = [ - "fvm_ipld_encoding 0.4.0", - "serde", - "thiserror", - "unsigned-varint 0.7.2", -] - -[[package]] -name = "fvm_ipld_blockstore" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee8c75be2b58943e1a9755802d34d4c3934f6ea151b6be192ff98f644e515bd" -dependencies = [ - "anyhow", - "cid 0.8.6", - "multihash 0.16.3", -] - [[package]] name = "fvm_ipld_blockstore" version = "0.2.1" @@ -2633,23 +1754,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d064b957420f5ecc137a153baaa6c32e2eb19b674135317200b6f2537eabdbfd" dependencies = [ "anyhow", - "cid 0.10.1", - "multihash 0.18.1", -] - -[[package]] -name = "fvm_ipld_car" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c60423568393a284de6d7c342cd664690611f27d223eb78629fa568ddd4e7951" -dependencies = [ - "cid 0.8.6", - "futures", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "integer-encoding", - "serde", - "thiserror", + "cid", + "multihash", ] [[package]] @@ -2658,32 +1764,15 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6190f03442b67b21a3d4e115c4d4dd3468aed24e27ebb074218822c1b3df41ba" dependencies = [ - "cid 0.10.1", + "cid", "futures", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", + "fvm_ipld_blockstore", + "fvm_ipld_encoding", "serde", "thiserror", "unsigned-varint 0.7.2", ] -[[package]] -name = "fvm_ipld_encoding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0816a2a6df4853de08a723d261110d56a121aa313bc570fe9d248f0a4bc5288" -dependencies = [ - "anyhow", - "cid 0.8.6", - "fvm_ipld_blockstore 0.1.2", - "multihash 0.16.3", - "serde", - "serde_ipld_dagcbor 0.2.2", - "serde_repr", - "serde_tuple", - "thiserror", -] - [[package]] name = "fvm_ipld_encoding" version = "0.4.0" @@ -2691,130 +1780,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90608092e31d9a06236268c58f7c36668ab4b2a48afafe3a97e08f094ad7ae50" dependencies = [ "anyhow", - "cid 0.10.1", - "fvm_ipld_blockstore 0.2.1", - "multihash 0.18.1", + "cid", + "fvm_ipld_blockstore", + "multihash", "serde", - "serde_ipld_dagcbor 0.4.2", + "serde_ipld_dagcbor", "serde_repr", "serde_tuple", "thiserror", ] [[package]] -name = "fvm_ipld_hamt" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c942494dde990aeac314311bde34c787be99cab7d0836397a75556cbaa2c3e7" -dependencies = [ - "anyhow", - "byteorder", - "cid 0.8.6", - "forest_hash_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "libipld-core 0.14.0", - "multihash 0.16.3", - "once_cell", - "serde", - "sha2 0.10.8", - "thiserror", -] - -[[package]] -name = "fvm_ipld_hamt" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c900736087ff87cc51f669eee2f8e000c80717472242eb3f712aaa059ac3b3" -dependencies = [ - "anyhow", - "byteorder", - "cid 0.10.1", - "forest_hash_utils", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", - "libipld-core 0.16.0", - "multihash 0.18.1", - "once_cell", - "serde", - "sha2 0.10.8", - "thiserror", -] - -[[package]] -name = "fvm_ipld_kamt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab54acc8b19c5029ceefb3a1aa5708e1513a6ef7b17cdfeb6674c042b70d163" -dependencies = [ - "anyhow", - "byteorder", - "cid 0.8.6", - "forest_hash_utils", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", - "multihash 0.16.3", - "once_cell", - "serde", - "sha2 0.10.8", - "thiserror", -] - -[[package]] -name = "fvm_sdk" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fef17308967cceb1d22f05003d60adb0d5b9ba53e34ace4ae04701eb7e6af02" -dependencies = [ - "cid 0.8.6", - "fvm_ipld_encoding 0.3.3", - "fvm_shared 3.0.0", - "lazy_static", - "log", - "num-traits", - "thiserror", -] - -[[package]] -name = "fvm_sdk" -version = "3.11.1" -dependencies = [ - "cid 0.10.1", - "fvm_ipld_encoding 0.4.0", - "fvm_shared 3.11.1", - "lazy_static", - "log", - "num-traits", - "thiserror", -] - -[[package]] -name = "fvm_shared" -version = "3.0.0" +name = "fvm_ipld_hamt" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99c06aa865e34198d9ca0da54e53e2fca14ae9ce5402f51b7c8e78175205861" +checksum = "48c900736087ff87cc51f669eee2f8e000c80717472242eb3f712aaa059ac3b3" dependencies = [ "anyhow", - "bitflags 1.3.2", - "blake2b_simd", "byteorder", - "cid 0.8.6", - "data-encoding", - "data-encoding-macro", - "fvm_ipld_blockstore 0.1.2", - "fvm_ipld_encoding 0.3.3", + "cid", + "forest_hash_utils", + "fvm_ipld_blockstore", + "fvm_ipld_encoding", + "libipld-core", + "multihash", + "once_cell", + "serde", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "fvm_sdk" +version = "3.11.1" +dependencies = [ + "cid", + "fvm_ipld_encoding", + "fvm_shared", "lazy_static", "log", - "multihash 0.16.3", - "num-bigint", - "num-derive 0.3.3", - "num-integer", "num-traits", - "serde", - "serde_repr", - "serde_tuple", "thiserror", - "unsigned-varint 0.7.2", ] [[package]] @@ -2826,17 +1832,17 @@ dependencies = [ "bitflags 2.6.0", "blake2b_simd", "bls-signatures", - "cid 0.10.1", + "cid", "data-encoding", "data-encoding-macro", "filecoin-proofs-api", - "fvm_ipld_encoding 0.4.0", - "fvm_shared 3.11.1", + "fvm_ipld_encoding", + "fvm_shared", "lazy_static", "libsecp256k1", - "multihash 0.18.1", + "multihash", "num-bigint", - "num-derive 0.4.2", + "num-derive", "num-integer", "num-traits", "quickcheck", @@ -2850,35 +1856,6 @@ dependencies = [ "unsigned-varint 0.8.0", ] -[[package]] -name = "fvm_shared" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb465333120e5faf7ace4f12f27d11f79c13974d3d4ecf0ff028101742adfba4" -dependencies = [ - "anyhow", - "bitflags 2.6.0", - "blake2b_simd", - "cid 0.10.1", - "data-encoding", - "data-encoding-macro", - "fvm_ipld_encoding 0.4.0", - "lazy_static", - "multihash 0.18.1", - "num-bigint", - "num-derive 0.4.2", - "num-integer", - "num-traits", - "serde", - "serde_tuple", - "thiserror", - "unsigned-varint 0.8.0", -] - -[[package]] -name = "fvm_test_actors" -version = "0.1.0" - [[package]] name = "fxhash" version = "0.2.1" @@ -3020,21 +1997,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -3056,12 +2018,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-literal" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" - [[package]] name = "hmac" version = "0.8.1" @@ -3122,7 +2078,6 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] @@ -3146,16 +2101,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -dependencies = [ - "async-trait", - "futures-util", -] - [[package]] name = "iowrap" version = "0.2.1" @@ -3316,36 +2261,6 @@ version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" -[[package]] -name = "libipld-core" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdd758764f9680a818af33c31db733eb7c45224715d8816b9dcf0548c75f7c5" -dependencies = [ - "anyhow", - "cid 0.8.6", - "core2", - "multibase", - "multihash 0.16.3", - "serde", - "thiserror", -] - -[[package]] -name = "libipld-core" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44790246ec6b7314cba745992c23d479d018073e66d49ae40ae1b64e5dd8eb5" -dependencies = [ - "anyhow", - "cid 0.8.6", - "core2", - "multibase", - "multihash 0.16.3", - "serde", - "thiserror", -] - [[package]] name = "libipld-core" version = "0.16.0" @@ -3353,10 +2268,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5acd707e8d8b092e967b2af978ed84709eaded82b75effe6cb6f6cc797ef8158" dependencies = [ "anyhow", - "cid 0.10.1", + "cid", "core2", "multibase", - "multihash 0.18.1", + "multihash", "serde", "thiserror", ] @@ -3501,16 +2416,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "minicov" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71e683cd655513b99affab7d317deb690528255a0d5f717f1024093c12b169" -dependencies = [ - "cc", - "walkdir", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3547,26 +2452,6 @@ dependencies = [ "data-encoding-macro", ] -[[package]] -name = "multihash" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" -dependencies = [ - "blake2b_simd", - "blake2s_simd 1.0.2", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive", - "ripemd", - "serde", - "serde-big-array", - "sha2 0.10.8", - "sha3", - "unsigned-varint 0.7.2", -] - [[package]] name = "multihash" version = "0.18.1" @@ -3634,20 +2519,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -3657,28 +2528,6 @@ dependencies = [ "num-integer", "num-traits", "quickcheck", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", - "serde", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", ] [[package]] @@ -3701,29 +2550,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", - "serde", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3792,12 +2618,6 @@ dependencies = [ "libc", ] -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "pairing" version = "0.23.0" @@ -4200,16 +3020,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - [[package]] name = "rust-gpu-tools" version = "0.7.2" @@ -4256,12 +3066,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - [[package]] name = "rustix" version = "0.38.37" @@ -4346,18 +3150,6 @@ dependencies = [ "syn 2.0.82", ] -[[package]] -name = "serde_ipld_dagcbor" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e23de7a4a18dff77ab9531f279a882500b8cf3549fde044d4e10481b411f1e" -dependencies = [ - "cbor4ii", - "cid 0.8.6", - "scopeguard", - "serde", -] - [[package]] name = "serde_ipld_dagcbor" version = "0.4.2" @@ -4365,7 +3157,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e880e0b1f9c7a8db874642c1217f7e19b29e325f24ab9f0fcb11818adec7f01" dependencies = [ "cbor4ii", - "cid 0.10.1", + "cid", "scopeguard", "serde", ] @@ -4661,25 +3453,6 @@ dependencies = [ "storage-proofs-porep", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand", - "rustc-hex", -] - [[package]] name = "subtle" version = "2.6.1" @@ -4784,12 +3557,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textwrap" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" - [[package]] name = "thiserror" version = "1.0.64" @@ -4886,18 +3653,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - [[package]] name = "unicode-bidi" version = "0.3.17" @@ -4925,12 +3680,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -4988,24 +3737,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vm_api" -version = "1.0.0" -source = "git+https://github.com/filecoin-project/builtin-actors?branch=master#12d9af8a00d0909598c67e1a18dc1577e0833137" -dependencies = [ - "anyhow", - "cid 0.10.1", - "fvm_ipld_blockstore 0.2.1", - "fvm_ipld_encoding 0.4.0", - "fvm_ipld_hamt 0.9.0", - "fvm_shared 4.4.2", - "num-derive 0.3.3", - "num-traits", - "rand", - "rand_chacha", - "serde", -] - [[package]] name = "walkdir" version = "2.5.0" @@ -5107,16 +3838,6 @@ dependencies = [ "leb128", ] -[[package]] -name = "wasm-encoder" -version = "0.219.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29cbbd772edcb8e7d524a82ee8cef8dd046fc14033796a754c3ad246d019fa54" -dependencies = [ - "leb128", - "wasmparser 0.219.1", -] - [[package]] name = "wasmparser" version = "0.95.0" @@ -5152,16 +3873,6 @@ dependencies = [ "serde", ] -[[package]] -name = "wasmparser" -version = "0.219.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c771866898879073c53b565a6c7b49953795159836714ac56a5befb581227c5" -dependencies = [ - "bitflags 2.6.0", - "indexmap 2.6.0", -] - [[package]] name = "wasmprinter" version = "0.2.80" @@ -5368,33 +4079,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2fca2cbb5bb390f65d4434c19bf8d9873dfc60f10802918ebcd6f819a38d703" dependencies = [ "anyhow", - "heck 0.4.1", + "heck", "indexmap 2.6.0", "wit-parser", ] -[[package]] -name = "wast" -version = "219.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f79a9d9df79986a68689a6b40bcc8d5d40d807487b235bebc2ac69a242b54a1" -dependencies = [ - "bumpalo", - "leb128", - "memchr", - "unicode-width", - "wasm-encoder 0.219.1", -] - -[[package]] -name = "wat" -version = "1.219.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc3cf014fb336883a411cd662f987abf6a1d2a27f2f0008616a0070bbf6bd0d" -dependencies = [ - "wast", -] - [[package]] name = "web-sys" version = "0.3.72" diff --git a/Cargo.toml b/Cargo.toml index 966f89181..1d3df303e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,11 +5,6 @@ members = [ "sdk", "shared", "testing/conformance", - "testing/integration", - "testing/calibration/shared", - "testing/test_actors", - "testing/test_actors/actors/*", - "tools/fvm-bench", ] [workspace.package] diff --git a/testing/calibration/.gitignore b/testing/calibration/.gitignore deleted file mode 100644 index fee98ef29..000000000 --- a/testing/calibration/.gitignore +++ /dev/null @@ -1 +0,0 @@ -measurements/out diff --git a/testing/calibration/Makefile b/testing/calibration/Makefile deleted file mode 100644 index 0479fec87..000000000 --- a/testing/calibration/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -SCRIPTS_DIR := ./measurements/scripts -OUT_DIR := ./measurements/out - -OBS_DIR := $(OUT_DIR)/observations -OBS_FIND := find $(OBS_DIR) -type f \( -name "*.jsonline" \) -OBS_JSON := $(shell $(OBS_FIND)) -OBS_PNG := $(patsubst $(OUT_DIR)/observations/%.jsonline, $(OUT_DIR)/charts/charges/%.png, $(OBS_JSON)) - -GAS_MILLIS_PER_NS := 10000 - -.PHONY: all -all: - $(MAKE) run - $(MAKE) visualize - -run: - cargo test --release --test gas_calibration_test --features calibration - - -.PHONY: visualize -visualize: \ - $(OBS_PNG) \ - $(OUT_DIR)/charts/overall.png - -$(OUT_DIR)/charts/charges/%.png: \ - $(OUT_DIR)/observations/%.jsonline \ - $(SCRIPTS_DIR)/observations.sh \ - $(SCRIPTS_DIR)/observations.plt \ - | jq gnuplot - $(SCRIPTS_DIR)/observations.sh $< $@ - -$(OUT_DIR)/charts/overall.png: \ - $(OBS_JSON) \ - $(SCRIPTS_DIR)/overall.sh \ - $(SCRIPTS_DIR)/overall.plt \ - | jq gnuplot - $(SCRIPTS_DIR)/overall.sh $(OBS_DIR) $@ - - -# This is just a convenience tool to convert regression output into milligas prices. -# One should always look at the charts and the regressions to decide which one looks -# reasonable, and where can for example the base cost be ignored. -# Alternatively there could be more sophisticated statistics software used that -# calculates the P-value of the intercept and the slope separately. -# The results are in millis, to be used with `Gas::from_milligas`, not `Gas::new`. -.PHONY: proposals -proposals: - @for FILE in measurements/out/regressions/*.jsonline ; do \ - cat $$FILE | jq -c "{ \ - name: \"$$(basename $$FILE .jsonline)\", \ - label: .label, \ - base_cost: (.intercept * $(GAS_MILLIS_PER_NS) | ceil), \ - variable_cost: (.slope * $(GAS_MILLIS_PER_NS) | ceil) \ - }" ; \ - done - - -.PHONY: gnuplot -gnuplot: - @if [ -z "$(shell which gnuplot)" ]; then \ - echo "Please install gnuplot. See http://www.gnuplot.info/"; \ - exit 1; \ - fi - -.PHONY: jq -jq: - @if [ -z "$(shell which jq)" ]; then \ - echo "Please install jq. See https://stedolan.github.io/jq/"; \ - exit 1; \ - fi diff --git a/testing/calibration/README.md b/testing/calibration/README.md deleted file mode 100644 index 2f865dc5a..000000000 --- a/testing/calibration/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# Gas Calibration - -This crate calls the `integration/tests/fil-gas-calibration-actor` with various parameters to exercise certain syscalls, -while collecting gas metrics, on which they runs regressions to estimate coefficients we could use to set gas prices. - -The way this is different than the metrics we collect under `conformance` tests in that we also capture the inputs, -so that we can estimate prices based on different input size for example, if that is our hypotheses. The `conformance` tests are -more about backtesting the gas model using the available test vectors, whereas here we are driving the data collection. - -The traces and the regression results are exported to `./measurements/out`, but this can be overridden using the `OUTPUT_DIR` env var. - -For example: - -```shell -cargo test --release --test gas_calibration_test on_hashing -``` - -The calibration uses the machinery from the integration tests, but it's kept separate from them because to get good results we might want to run them for a long time, and on standardized environment. The reason different model targets are in separate binaries is so we can select which one we want to run. - -Note that the `--release` flag has a huge impact on runtimes and therefore the model paramters, in the order of 100x. - -Alternatively all the scenarios and exports can be executed the following way: - -```shell -make run -``` - -After this the regression results can be found in `./measurements/out/regressions`. The suggested prices can be printed with the `make proposals` command, but always check the charts to see which one to adopt. - -## Visualization - -The exported observations can be visualized as scatter plots: - -```shell -make visualize -``` - -The results are going to be in `./measurements/out/charts`. - -Extraction and visualization can be run together: - -```shell -make all -``` - -### Sanity checks - -The charts in `./measurements/out/charts/charges` dispaly the relationship between input size and time on a scatter plot, -which forms the basis for the linear regressions. It's worth checking whether there are any outliers that could skew the models. - -The charts also contain a line (as opposed to points) which show the actual gas charge at the various input sizes. -The values have been divided by the expected gas-per-nanosecond cost, so the slope of the line can be directly compared -against the slope of the scatter plot of time, giving us an idea of how good the current price model is. - -It's also worth taking a look at the [overall.png](./measurements/out/charts/overall.png) chart, which contains the actual gas charge -of the different syscalls at the same measured times we spent doing them. If the prices are good, we should see each syscall have very -similar slopes - the more time we spend on them, the more gas they should cost, with nothing being relatively cheaper or more expensive -than the others. - -One exemption of this rule are the syscalls which take deferred disk IO into account. Here the solution could be to estimate how much longer -it will take to write something to disk at the end, and just multiply the time by that number before exporting the results, creating a -virtual time for the sake of modelling prices. - -## Notes - -### Negative intercepts - -I noticed in the case of `hashing` that while the slopes seem to be stable, the `intercept` field is often negative. This can happen just if the overall runtime differs by a few milliseconds, because the intercepts are so small, a few microseconds. We might want to run the experiments longer, or just treat such values as zero. In any case it's worth running the collection multiple times to see how stable the values are. diff --git a/testing/calibration/measurements/scripts/observations.plt b/testing/calibration/measurements/scripts/observations.plt deleted file mode 100644 index 21215c913..000000000 --- a/testing/calibration/measurements/scripts/observations.plt +++ /dev/null @@ -1,12 +0,0 @@ -set term png size 1200,800; -set output fileout; - -set title title . ": Size vs Time & Gas"; -set xlabel "Size (bytes)"; -set ylabel "Time (nanos)"; -set key outside; - -# "Gas (millis)" is converted to a time equivalent by the expectation of 10 Gas/nanos. - -plot for [i=0:*] filein index i using 1:2 with points title sprintf("%s Time", word(series, i+1)), \ - for [i=0:*] filein index i using 1:($3/10000) with lines title sprintf("%s Gas to time", word(series, i+1)) diff --git a/testing/calibration/measurements/scripts/observations.sh b/testing/calibration/measurements/scripts/observations.sh deleted file mode 100755 index b21e63028..000000000 --- a/testing/calibration/measurements/scripts/observations.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Merged traces file. -JSON_FILE=$1 -PNG_FILE=$2 -PLT_FILE=$(dirname $0)/$(basename $0 .sh).plt -DAT_FILE=$(dirname $PNG_FILE)/$(basename $PNG_FILE .png).dat -TITLE=$(basename $JSON_FILE .jsonline) - -mkdir -p $(dirname $PNG_FILE) -rm -rf $DAT_FILE - -SERIES=$(cat $JSON_FILE | jq -r ".label" | sort | uniq) - -for SERIE in $SERIES; do - cat $JSON_FILE \ - | jq -r "select(.label == \"${SERIE}\") | [.variables[0], .elapsed_nanos, .compute_gas] | @tsv" \ - >> $DAT_FILE - # Series separator for gnuplot - echo $'\n' >> $DAT_FILE -done - -gnuplot \ - -e "filein='$DAT_FILE'" \ - -e "fileout='$PNG_FILE'" \ - -e "title='$(echo $TITLE | tr _ - )'" \ - -e "series='$(echo $SERIES | tr _ - )'" \ - $PLT_FILE - -rm $DAT_FILE diff --git a/testing/calibration/measurements/scripts/overall.plt b/testing/calibration/measurements/scripts/overall.plt deleted file mode 100644 index df2ed9fc5..000000000 --- a/testing/calibration/measurements/scripts/overall.plt +++ /dev/null @@ -1,9 +0,0 @@ -set term png size 1200,800; -set output fileout; - -set title "Time vs Gas"; -set xlabel "Time (nanos)"; -set ylabel "Gas (millis)"; -set key outside; - -plot for [i=0:*] filein index i using 1:2 with points pointtype 1 title sprintf("%s Time", word(series, i+1)) diff --git a/testing/calibration/measurements/scripts/overall.sh b/testing/calibration/measurements/scripts/overall.sh deleted file mode 100755 index da1eea0d0..000000000 --- a/testing/calibration/measurements/scripts/overall.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Merged traces file. -OBS_DIR=$1 -PNG_FILE=$2 -PLT_FILE=$(dirname $0)/$(basename $0 .sh).plt -DAT_FILE=$(dirname $PNG_FILE)/$(basename $PNG_FILE .png).dat - -mkdir -p $(dirname $PNG_FILE) -rm -rf $DAT_FILE - -JSON_FILES=$(find $OBS_DIR -type f \( -name "*.jsonline" \)) -SERIES="" - -for JSON_FILE in $JSON_FILES; do - SERIE=$(basename $JSON_FILE .jsonline) - SERIES="$SERIES $SERIE" - cat $JSON_FILE \ - | jq -r "[.elapsed_nanos, .compute_gas] | @tsv" \ - >> $DAT_FILE - # Series separator for gnuplot - echo $'\n' >> $DAT_FILE -done - -gnuplot \ - -e "filein='$DAT_FILE'" \ - -e "fileout='$PNG_FILE'" \ - -e "series='$(echo $SERIES | tr _ - )'" \ - $PLT_FILE - -rm $DAT_FILE diff --git a/testing/calibration/shared/Cargo.toml b/testing/calibration/shared/Cargo.toml deleted file mode 100644 index 2290fb029..000000000 --- a/testing/calibration/shared/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "fvm_gas_calibration_shared" -description = "Filecoin Virtual Machine gas calibration" -version = "0.1.0" -edition = "2021" -license = "MIT OR Apache-2.0" -authors = ["Protocol Labs", "Filecoin Core Devs"] -repository = "https://github.com/filecoin-project/ref-fvm" - -[dependencies] -fvm_shared = { workspace = true, features = ["testing"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -num-traits = "0.2" -num-derive = "0.4" diff --git a/testing/calibration/shared/src/lib.rs b/testing/calibration/shared/src/lib.rs deleted file mode 100644 index b6d8ec29a..000000000 --- a/testing/calibration/shared/src/lib.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_shared::address::Address; -use fvm_shared::crypto::hash::SupportedHashes; -use fvm_shared::event::Flags; -use num_derive::FromPrimitive; -use serde::{Deserialize, Serialize}; - -#[derive(FromPrimitive)] -#[repr(u64)] -pub enum Method { - /// Hash random data to measure `OnHashing`. - OnHashing = 1, - /// Put and get random data to measure `OnBlock*`. - OnBlock, - /// Try (and fail) to verify random data with a public key and signature. - OnVerifySignature, - /// Try (and fail) to recovery a public key from a signature, using random data. - OnRecoverSecpPublicKey, - /// Measure sends - OnSend, - /// Emit events, driven by the selected mode. See EventCalibrationMode for more info. - OnEvent, -} - -#[derive(Serialize, Deserialize)] -pub struct OnHashingParams { - pub hasher: u64, - pub iterations: usize, - pub size: usize, - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub struct OnBlockParams { - pub iterations: usize, - pub size: usize, - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub struct OnVerifySignatureParams { - pub iterations: usize, - pub size: usize, - pub signer: Address, - /// A _valid_ signature over *something*, corresponding to the signature scheme - /// of the address. A completely random sequence of bytes for signature would be - /// immediately rejected by BLS, although not by Secp256k1. And we cannot generate - /// valid signatures inside the contract because the libs we use don't compile to Wasm. - pub signature: Vec, - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub struct OnRecoverSecpPublicKeyParams { - pub iterations: usize, - /// Size doesn't play a role with the SDK call because it works on hashes, - /// but in theory it could, if the API asked for plain text. Let's pass - /// it in just to show on the charts that the time doesn't depend on the input size. - pub size: usize, - pub signature: Vec, - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub enum EventCalibrationMode { - /// Produce events with the specified shape. - Shape((usize, usize, usize)), - /// Attempt to reach a target size for the CBOR event. - TargetSize(usize), -} - -#[derive(Serialize, Deserialize)] -pub struct OnEventParams { - pub iterations: usize, - pub mode: EventCalibrationMode, - /// Number of entries in the event. - pub entries: usize, - /// Flags to apply to all entries. - pub flags: Flags, - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub struct OnSendParams { - pub iterations: usize, - pub value_transfer: bool, - pub invoke: bool, -} - -impl OnHashingParams { - pub fn hasher(&self) -> Option { - match self.hasher { - h if h == SupportedHashes::Sha2_256 as u64 => Some(SupportedHashes::Sha2_256), - h if h == SupportedHashes::Blake2b256 as u64 => Some(SupportedHashes::Blake2b256), - h if h == SupportedHashes::Blake2b512 as u64 => Some(SupportedHashes::Blake2b512), - h if h == SupportedHashes::Keccak256 as u64 => Some(SupportedHashes::Keccak256), - h if h == SupportedHashes::Ripemd160 as u64 => Some(SupportedHashes::Ripemd160), - _ => None, - } - } -} diff --git a/testing/conformance/measurements/.gitignore b/testing/conformance/measurements/.gitignore deleted file mode 100644 index 25396b3a1..000000000 --- a/testing/conformance/measurements/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -out/*.txt -out/*.jsonline diff --git a/testing/conformance/measurements/Makefile b/testing/conformance/measurements/Makefile deleted file mode 100644 index 2b25fe6be..000000000 --- a/testing/conformance/measurements/Makefile +++ /dev/null @@ -1,110 +0,0 @@ -SCRIPTS_DIR := ./scripts -OUT_DIR := ./out - -TRACES_DIR := ../traces -TRACES_FIND := find $(TRACES_DIR) -type f \( -name "*.jsonline" -a -not -name "traces.jsonline" \) -TRACES_JSON := $(shell $(TRACES_FIND)) - -TRACES_MERGED := $(OUT_DIR)/traces.merged.jsonline -TRACES_SUMMED := $(OUT_DIR)/traces.summed.jsonline - -CHARGES_DIR := $(OUT_DIR)/charges -CHARGES_TXT := $(OUT_DIR)/charges.txt -CHARGES := $(shell cat $(CHARGES_TXT) || echo "") -CHARGES_TVG_PNG := $(patsubst %, $(CHARGES_DIR)/%.time-vs-gas.png, $(CHARGES)) -CHARGES_TVG_SUMMED_PNG := $(patsubst %, $(CHARGES_DIR)/%.time-vs-gas.summed.png, $(CHARGES)) - -OVERALL_DIR := $(OUT_DIR)/overall -OVERALL_TVG_PNG := $(OVERALL_DIR)/time-vs-gas.png - - -.PHONY: all -all: - $(MAKE) prepare - $(MAKE) visualize - $(MAKE) regression - -.PHONY: prepare -prepare: \ - $(CHARGES_TXT) - -.PHONY: charts -visualize: \ - $(OVERALL_TVG_PNG) \ - $(CHARGES_TVG_PNG) \ - $(CHARGES_TVG_SUMMED_PNG) \ - -.PHONY: regression -regression: $(OUT_DIR)/regression.jsonline - - -# Concatenate all traces as-is -$(TRACES_MERGED): $(TRACES_JSON) - rm -rf $@ - for JSON in $$($(TRACES_FIND)); do \ - cat $$JSON >> $@; \ - done - -# Aggregate charges in each trace, so we have a single line per charge from each test vector -# then concatenate them all into one. -$(TRACES_SUMMED): $(TRACES_JSON) - rm -rf $@ - for JSON in $$($(TRACES_FIND)); do \ - cat $$JSON | \ - jq --slurp -c "group_by(.name) | map({ name: .[0].name, elapsed_nanos: map(.elapsed_nanos) | add, compute_gas: map(.compute_gas) | add, storage_gas: map(.storage_gas) | add }) | .[]" \ - >> $@; \ - done - - -# Collect all unique charge names -$(CHARGES_TXT): $(TRACES_MERGED) | jq - cat $< | jq -r "select(.elapsed_nanos != null) | .name" | sort | uniq > $@ - - -# Show time vs gas on the level of test vectors. -$(OVERALL_TVG_PNG): \ - $(TRACES_DIR)/traces.jsonline \ - $(SCRIPTS_DIR)/overall/time-vs-gas.sh \ - $(SCRIPTS_DIR)/overall/time-vs-gas.plt \ - | jq gnuplot - $(SCRIPTS_DIR)/overall/time-vs-gas.sh $< $(OVERALL_DIR) - - -# Show time vs gas on the level of individual charges. -$(CHARGES_DIR)/%.time-vs-gas.png: \ - $(TRACES_MERGED) \ - $(SCRIPTS_DIR)/charges/time-vs-gas.sh \ - $(SCRIPTS_DIR)/charges/time-vs-gas.plt \ - | jq gnuplot - $(SCRIPTS_DIR)/charges/time-vs-gas.sh $< $(CHARGES_DIR) time-vs-gas $* - - -# Show time vs gas on the level of charges aggregated within test vectors. -$(CHARGES_DIR)/%.time-vs-gas.summed.png: \ - $(TRACES_SUMMED) \ - $(SCRIPTS_DIR)/charges/time-vs-gas.sh \ - $(SCRIPTS_DIR)/charges/time-vs-gas.plt \ - | jq gnuplot - $(SCRIPTS_DIR)/charges/time-vs-gas.sh $< $(CHARGES_DIR) time-vs-gas.summed $* - - -# Least Squares regression on the aggregate level. -$(OUT_DIR)/regression.jsonline: \ - $(TRACES_SUMMED) \ - ../src/bin/least-squares.rs - cd .. && cargo run --bin least-squares -- measurements/$< measurements/$@ - - -.PHONY: gnuplot -gnuplot: - @if [ -z "$(shell which gnuplot)" ]; then \ - echo "Please install gnuplot. See http://www.gnuplot.info/"; \ - exit 1; \ - fi - -.PHONY: jq -jq: - @if [ -z "$(shell which jq)" ]; then \ - echo "Please install jq. See https://stedolan.github.io/jq/"; \ - exit 1; \ - fi diff --git a/testing/conformance/measurements/README.md b/testing/conformance/measurements/README.md deleted file mode 100644 index 37d2a87a2..000000000 --- a/testing/conformance/measurements/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Gas Calibration Measurements - -This directory contains some support scripts for visualizing the traces we can opt to collect -during test vector execution, which can help calibrating gas prices. - -## Trace Collection - -To collect traces in the first place, execute conformance tests using an extra `TRACES` env var -to specify where the files should go: - -```bash -cd testing/conformance/ -mkdir traces -rm -rf traces/* -TRACE_DIR=traces \ - PRICE_NETWORK_VERSION=16 \ - TEST_VECTOR_POSTCONDITION_MISSING_ACTION=ignore \ - VECTOR=test-vectors/corpus \ - cargo test --release conformance -- --nocapture -``` - -Note the --release flag; without this the contract execution would be much slower and make the timings less relevant. - -After this the TRACES_DIR directory will contain: - -* A `traces.jsonline` file containing one line per successful test message, with each line pointing at detailed traces just for that particular message, and containing the overall gas charge and execution time. -* A mirror of the structure of the `VECTOR` directory, with each message in the successful test vector having a separate file containing the `GasCharge` records collected during the execution. - - -## Visualization - -You can use the `Makefile` to produce charts in the `./out` directory. It assumes the traces are in `../traces`. - -```shell -cd testing/conformance/measurements -make all -``` diff --git a/testing/conformance/measurements/out/charges/OnBlockCreate.time-vs-gas.png b/testing/conformance/measurements/out/charges/OnBlockCreate.time-vs-gas.png deleted file mode 100644 index 46123a6f06927b76c819f96259d3e45ed350e357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18905 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�v{k$pC6F=}kAJ9I;XD!dyV5Nt2PX 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 diff --git a/testing/conformance/measurements/out/charges/OnBlockLink.time-vs-gas.png b/testing/conformance/measurements/out/charges/OnBlockLink.time-vs-gas.png deleted file mode 100644 index 1c1b1ea7e18ffc49c952be5e6eb3776f0c93915a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31646 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 diff --git a/testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.png b/testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.png deleted file mode 100644 index 4fb58335dfd736fbec4be073bbb72bfe3edc9d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18622 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 L$P`Jv`S`y8m1nN; diff --git a/testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnBlockOpenPerByte.time-vs-gas.summed.png deleted file mode 100644 index fa2562477877282fe95a1af5f0d7676073340bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17665 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 z 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 diff --git a/testing/conformance/measurements/out/charges/OnBlockRead.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnBlockRead.time-vs-gas.summed.png deleted file mode 100644 index cfbc7a6ec06e6e7aff53fd9fb2ca48702e24cc98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18365 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 Kw?OSl=zjssg4lTg diff --git a/testing/conformance/measurements/out/charges/OnBlockStat.time-vs-gas.png b/testing/conformance/measurements/out/charges/OnBlockStat.time-vs-gas.png deleted file mode 100644 index befb9d02e6426adc0361836795fb84f8e5a64dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10820 zcmdUVdpy+J_xCip=2jANO)8b4B)L;LQsh!H24Uo&aTmk5jw!~;wUb+jNkYvGMsDRY zCPF0?85#{Sxid!Y*ZF-$=bY#J{GRV0zdxSu>-9Wd!+bt#@3r>YYpuQZ+VAbYm4%7W z9;rPb5J>3C<=?J@KwKmcX!jw$-2jEl!0R*!v`fqC>J4Kyn+;H&JbA+TqJTirYzl}C zVlpY`LGRvyE+B^4ltZBC^OR`zX?S!32y{Lg#Exd8*ig%wy@`t~IH5W5h>yvs}j_0XTtA6T8Y@j4YP28tFFi#`v0qNCxIXgE8XqyKsK z6W{}9Kk;W%C~ROpY)VH>9*fO-Qr+=}{icILieR6A!ahVMlN%cwot>SBhKA(j}*YTL;slXa^RO0*d4K<=_6W?yr~PX*x~@8hYw_ zeb2^e>&r@=U9qJlG*vy%h8M}};VK=XSv_be=SHP_;vqm zBs<%G%Xb(6v98g4*VP3J9#xkO;1h}|cuS0ip03-Cuuqm(BB`)k;oRu4Itc6iHaQDg3mndW?(X()?Mh z6iq5&Lc}O1Ao0VEZ=)>cx6Kw&iYEVfvyl-#ad-Av?+=3<$T*uazCf7zZ9 z#fqt07YW(j5w59bT5Ndc%QdMu{eELbi*#M&1Qr|BHM_kD-_!20H~1uC578j96%}?; z1z8SAh+3}gRvkvdlP>g7t)IoDoo@3+5T-`tQw!f>&8t^H`U-yP(qEn9eDz!&;Hs02RYs%bdV=#tQz0}{!kTX$~WMim*#t;Bbf z7c=V{B~`Nn289*zD?k7a4L{Tg&>qVm;foS1kx} z<6LCkN>7VC#-?VAwR_xO+H<09Qd9!Bi)zyoM?M(BW!d3;3Xo-x>uim)Y(BW#OHae& z@pO>7$h4#`V?2hDk}SU;TP=INYziye5WMMr37*uEt8_`w(#Bdlvx3<4IQ zrAAscmQwq4=ewKQ|GHB0qD>sD+W_~gX@}%Xn@cR4SvY9wV1)2G?voUfHZ}{}c@!#a zXz0oUM08WFXj0(m_?>T{AKdX8O=_qAUjzR)J^p`uZCxJzTw^mJFCSvlJu|4pI&e-T zg*@fz7(1C$%75=w2#ylcuct=~TkQ^#7@8SUV#!tur)UY6uDe!%1^Pcxhxg&NqJ*rc z&28z}3E{DDh7^1|{l+Tum z)TXTGP-w3#zngg*mMEC-pH1$OYJKK8BMQ#x_ZzwGDAZhXOlv~e+pW<$u)BQuljGy! z3RfJ(*8iuvl^}*&%m}`#WiRZ!8khKg;uR(?r?#j-eq|Y5z&*S#r`nV@_Wq+NjB;|J zx!^^u&Ra<%x=lyII@hbyx_Y&$kLBY^!>`~#neK5WTi@#%0D9$dz3y_tC&S1uj__Rs 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 Me$D7AkQ+Y!KN_>Q^#A|> diff --git a/testing/conformance/measurements/out/charges/OnComputeUnsealedSectorCid.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnComputeUnsealedSectorCid.time-vs-gas.summed.png deleted file mode 100644 index 88c8a78a3b3977f50b87951098776b6d28b94436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11831 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 diff --git a/testing/conformance/measurements/out/charges/OnCreateActor.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnCreateActor.time-vs-gas.summed.png deleted file mode 100644 index d9be897daf03de6e378ed94bd35c2b40e2af1da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12457 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 GhWtP4^E=G| diff --git a/testing/conformance/measurements/out/charges/OnGetRandomness.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnGetRandomness.time-vs-gas.summed.png deleted file mode 100644 index a6dacb16b007e5324ea65455eeea0e726a80efe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12456 zcmd^l2UL?=w_vaX0xBQ~0xBX^5HJ*_C@8&2&7~M40z&A$!xaM}1XQGV6c7jyKza{N zKstmPib#jh3_WDN;Pt=v&i~%L_s^R5)~uPVK)%!V*?phAzZ0ybp-4l;LInbWXq1&6 zXoEl}&>+z9D`$=aJtt(~w?H5Yu$G$cLlTJu^rWPukbmkxAb(OFhy=pp>+XTRd;#6J zoFdg-0r}sn^C#VU;vWJ6-SY>L{7HVK{&YS*VClWdZeSe?3yY|zsJgnkxw*NYpI>Zj zY*A5BU0vPRuU}_oW`Hf$L`2@;-{cO>uIa5!l1O;m3sOmaJ|0gR1OdB&o&o>;u7z9^ z3^6!rhg`a351;}9bp&-TfygM5K%G4#h6s|M)|$UR=^<#(-*F+zb8R-Xx)fd(NKGJ& zrTAYVrGxM<@b5u=xD?zQt$TWKA%6ytKLdmRJ>cu_|D?|U3CW*~|2Kt=xW<)+8=5sW5*8ET-_^RH z?73DQhVCGXxlrnQqj)?=sQI4as>%M)Y^-mU+JfCLMha0raFpjKT^ zHE2PyZX&){aOV}J58(x(Fm0Q+aXP!yZlY7@ud2_ZSsDmVrg`-hHI{QpLeFBrAq6Cf zud>A8iWI!LI;fLBb}D@0bH|f-hLJQSbH~X~!ZMNfRjV$+nqssg6b&1!J^X~h9-n4M zguEXs`DP3Ea9i{~!#Kn?&zOB&-*kkjGl_JLH1V_&CH!`SGZd?v-$d|&5_FljS4Lj& zn9?(G-*n}Dh+Uaer{WL2`=(rfwy0RsCGl-Lw`^qS(x9lCgrI0-apwAF|3`EN^`+@& zX2|i63kOAO(`ivy(B!jT6k4Tg=+JI_E_y+3@VO1|55z#VCsU9t@nG_nk$4ts&6myh znH#-rp0o5(b2d6yS?{D62JEw|gTJ*5%$-X3DoZ0v<57DG#O;LpU8DoTgS&MDG3g}l z9EfSlzfiI9?&+%%A8&1l39@V|#8KBe9UW+varjC%jy-k}#fZHHf4fcD(Qy#57V(A} z4zd?33c$<52#VQzSJm4xDqr$OD;Ek^%U~9xW0__v-gd8foGlTxRr;ojBY6l<{Z2jz2zO89y!u7{dsO9 z=cVl--;^Varv0pq!OS2&u!}$cf(DaF^TOwPqM5PA_R#eMW=ENm{zV%-TXr4g7xg8# z`f4k=I1U`Ls%}dp1w|?fkH-z+(}tIBm6$7H2DxfmII8*OB#FXXUZkPgwUXLe(_;chndjBq z$;-)oOmUiCJ_dH5<@IyHc()gCGvZuyWtv2p=gsl^~kalhL#l6HHi#;INOER7DvJ zTzf*(V;8?bc;SJY*miD>4 zIlGRmzfU@0y1>PE+tf1S8di|Jma@55RhPWYLzD@*`$A}X^rvnByFYg4VpbJ;l=>&q zDz~B@UjtqHv3OtTJm|b9Atm~Z|CwsfZq*a_UOtwd=Q?&pE}#9!1&VX226UdmpjX{F zr>h@;9?TB}{MRqjSebx#$t2k{oFM7f4i|phH6(go0j0xWB$F3-+ zuzM%?@V`0Zf8%#gwB=Ury=$PjMQlKEkzJx?n}r>c&=4SgT!4zYE-stU&3t!PaA=4z zN?ZnPE@96|^u7TMypAKh2`!4StFCoMm~ARD1qI8*oT# zKe9e@bm;dOJgA@v_O3P!oD$2zPTF8VVP7O&EMRDp3# z`;b(g@S<$3Blj?l9W56qB+5MrZ%*r_qXoxl^C<-xu&3#PJ}ZLODLoUINi!2Q6JSL2 zG*(>4?ZpP*^@MgiN1I{aTDz%~eV;_D~2Z#d<1A6t`m?U#2f=?`%Ua>dR(Z3qbl9Yn1VCe^IvRCsSY$Xxe~4i~y{ zY|T_`P(F0fLF?6e{d=$BU4JCz82YJ`^liEtR*vFk+OEd^4?3OBntQGyvNE2cbz~(T z)}!;_VK`VkFJR%b=EG}}MxERGxxN`MY3FVARpN1oZw&)kJEaNd)cAy!5Hp!Nm&7DT zeJt!w!^WW%7{0DDm~o^ny%q$dznm2`B!+Z}o}HpVO|4|jiOmG38GsmmvB3ZW z(_KjH^(cBp6W-is#y?{O_djBUkK}oOsM9m)@9mQBt81m&s0zG}YeYb=s@XWXtPZs9 zzuGLF?N>W7soC?>QCrIff**;V1IX&wGKJ7H0`3u{zwpz04{@EaXIZ{*OoHZb4*y$S z>Fni~fTX{D0UiQ?hd)9B=zJ`m6 zN5>o?4LE3x(QEOl*seY_`iA~5ioZQ)f5w%!Ks(9rdQsn02ym7{!=RX||SYc|P)w&8v=A@5(Q z0LeNioono29$nWhJ3A-$9;0GrKeL}cmN-C`5g_u76rPIrU9J2TW5Z>BjXhk<)Q_Pz~T9 zcc$1Rm-1KH$j0;3OIm`Sb(IxvJ8|H4i;Nl@VbVs1AGSnLfGUvrn!~O=vfeyrKxWQ= z%fag3i4p%zr@tCwy76bWdt{%4kdq#|Mbx-@9;AGXFgd+!^!o$QZOZ-t^&-2I7bv=& zpG)7y4rP$;jB_M9W_b0MM(nQl#8X@(d$YHM$xu3Vs7my&^r6dRTF10`TEC|&S`Of< z!!zmkJ&_?1b{S+v2gfhJ`x#U&Kc+*j$j~8XHX(d5BB6YU$hOHgI{q3Q=SRSdB&*n; z`VF;_L&$3fZ$NWzWqB`eQ?j}hfyk2ku#_rHgz>ZPA2<9rBS$@O7?UM!y@N7beoSx7 zhZ+ImDq9OSpfW4fcDri`W=384ay$4`(2e8vPxY))%WbYEw*!j(N00~u{I-x}A^XAS z{I*B@e@!CRx0>qt09d?1NkMv@j5IUddLk?0GbvtpZi~@VaIc)!uJHs3L(%j8vNLs_ zXNVf+d@UpL%j5oi-wn>_j2b(*ZvjUnMtX`JqyO)ZNRbzaOQd)o;;JJtMwS?_;X}0D z&?BwX`VA^?c#{s*XZHrBM~M0RwSJ^SWcUHUU;`;~SO_PNvu=2iR}}g1urkjLQfDTj zBfE0z{`6x3~LFYRk)LSa}2oEW!MO-$8x8(UdPIO?$F+p96na$)yM_o3TF{@>Hl6$N^W)a_vL&4cfOo{|56f`h1+a?Y=; z#ZAh=e8hT|{*p%PA!hNh{vXY}=sF882jpLj2iWHNha<%QTEJlxctpyAGCIK7#TiL{) zQ#mnhAW<@^tDVEt=k5efF9ZCJP|zqg!GI*YNf}_24&+@`j`z}6T zCVq!cq5XcDb6Ky>mfumDQ)wj~U{?4NWEbXF5++BL|wa zMVj-ZB=v|V3PggCMaKtCGU!CeMvnMMtJzEhuQw?PR;jWjPRzbxxv z&O%-{fgpNM!LO4}1;K;dpo`YIPZB4a`3ml+u;#pBp2a;E<)x8NccY|ErNNqfG_r-4 zx4uS{=;v)AZb3C8Ov z9QQ`zlJ%QVYPbcvFK-VZBd&Kef0t1~Lh3@l81|eh+*F+>!B&>)(V_`ebb5{&|8-VV zWgGPRHJqW*5{s%8oQr!Gn*hkH`PknS;qMK9I(y>GQfO(%H1B4vLMdEVFo$MxRq5&p z)=|3F%pm$OarPmein%^e-D6kPQtPMoiv6<5B*itoO_<<;JH6D?P88v>E%9 ztXHX=NlA*t@LA}W`^NMq2Z8$|N^b-{S^j>@+mAhJPD%hY(Hx5hX#{Ko`4C+m_U{t; z4_o28&qHl`F#&>O>SHq28{d~goVJKcoj(p{db0NgC*4*ns*CnUr*034- zr$5AsMY*j6J(vFy(L$IR-WE-FWfLpm=xxeWq>qvqpH1kaRPD#-eC}48S!kg?mGY(Z zLyUgm)?vM>bHr&A0|@cNc0fK%q;l)43|2bX{1v?&b|GVPoGEIw@Hxmcut57c|Chby zxR^Y;iz}vBH!mpcQ((WCp(Boda9G>gtxE+q;}M6?IzUv$+Cyf!KC2?9_R56^pP1x) z_o*0`3;ZoaIiae?SC}i?=JYF~AdI!Y7!Hg!s|#G$0o=*RAh z4@DyGE1P=rapt*;VqOcU-w6L4IJ`k?Xtkl$Q4HOwdUK#_nx@(LvGwJ&$mli8WXd}*a*x2K@1Ml($aX%)-eJ(+j`&WM(0n#N&>2+26T0uZYbQg88mXO! zhnNJ)I^E?*-NN59bSsa|^~vV1GM3rRdS+ak1Or}7WTB*y$(c70V3RM*naouD%~Dfk zG1?H<7~B@jmKx4pBz64WZ*h$JyT?m>Hg^uFjOST8wi}`j^)O3#ovc9L5?gI?@3(Wj znltHnBB4=EGh9vQZ1#6PqAOS&8kkaLwLa@Y8boyb9`JR9sWHM4 z;ID>b%NJ-vF2S7>h<79^FJjfzsHoqF-<_8^z|l%~(^zVY;keYw)!rc&21MRQPgTXA}4k7w9_{8J-KJvxkPmW?Gz1ItN9~ zdcE5;g@ho$zzdhxBECCPG$qCmae5brHpxr7%vf}c2dv4Gxzhb?2$ zu^N4iId&zFAB7)xfQA9nTo8>kAE7tD`G@dfBUNQ#MtTu_Ogr*ycQ9(nF;E55*)=A>=n&J za7jd5b~chT)<;GgXcl6}80K ze`}d!i9&*9+gvltsIEz$hZe9j4E6Sjslm}%F}|66@SRjw#J<{&&P#8bZ)@^|-=PO! zeXR$JT+#=ZEXI*hrPawtr{z>+00j9r=<=hQKW4-40JKP`}8DV;4ndzW{9Q&{Jw0= znU2=JWV{>yPzS)d!KlW^F}MGcfy~$}1(=Iz&I1_ZpNjDHv>WB=mb^!8y^Ppo z=eBQp!{X4aL=496lP-s>Z#S_PvFEN2QPmW>Ik!&5D{%0V1>sVVM?B}Z_W2YQ^{2%z zEXr47ZoK4>ad?k8mVM`^XnePGB^fSiG1~dcTtJ-EeF$R<1_lAsc>tr(djwGgM3&8i z;(P?Tr^kSO%OjA&N42CxUVw19PDO2nf4>R>(b16a0(^Rnx$`fAAe6M~4d*{BS{p*W zO_Cz&!)$7^RHX~!EiF}YO^EpEYV4&u(4rgbK zyI1!`H4zB@#lKT_zpzT0S*yPyWhRL8Yi<$2(7$O2+3^~i+wHQ>y(-cwC-RDcs7|D2;x zF*OikA*OXCF=_C(%HR%Fp$ppNW}Y_W-{=vYnNjw+wPa8+i$1)|Z_#(f$E?S#KS?iCboWpqHueE~La=%w(ALhj@rs zfDZ-1CmS6lIG_QW60g$c=&8tX7cse&>YcDEby%Lp;*CPHt1H2#xR>wH!Kc&r^%Wp@ zvCez|ExeVT4I`e6C`cF#R~4rOgoL_y*TkUWUGud(@nOv z@(+P}HT9IBU*y*O+1#o%z^@lO{e-)LIRkG1<0ee{vH*vdxqLTp-~{~vPI9>=e?j+1 zcmqm0d8=!N&__q|NCaQNH1ms9RcCAh4o-7QZMzhpBXhaJAKIl4{R2qWc>@S-MHhLX zN{cfL6PINO(NU$-hV1YP^(z%78}>=|-$a#OJS<0oyc?;(7bN<80?Dd4!S#-sHRspP z)zN6Q@niEaU<9#=9w(D8_fuzQ(&M$NoH?j|D$r6&W${d7kN4hl95|7RtfbW9+CYaS zSwop@^}2#TI34j{13oW!v*A}O5BtPNsov?^{AKczBo^g@1W6W22jI>HfC&`&c{&H3 zo+o$PjVbk~+UnWrC8Jc`wzE@?m=82pHy-7U=G6XlHGHMn(5f4}N1B)IkhAx!N_49P zd!(E?NTUI6Q=g5}ZK01xYrz00HFguQcu2;t_5}XI;|Q`RvU!h`By{e+j=;f;rX zFV5MjF3fOBL5ta?RBTRWTIan5ZdaMNTSDye7B2r|CIj}*RsZVqD0NPPh?RuHXT^U| zWX$Q1hL7v~{TDr$SiDf$FBG&Oe|_#Emd?{LV83zoi$^yX!5efS66^>98=DBsY6B>Q?^6+$3t zGgOcd+)~jp#6L!nEbC%78L=rCmhd9yRL8dpo?Ab9XJ+$dI~sC&@{Li4xgjOB1`thb z^$+R~-wzAp2vd6x#W%tFkiPY(!>_t53&>28(Paah$DOn4#l!{f&1H@`VZMDzu+?=l zb$0WC$9?N$CC6kBd{GVuoEpQ$myaNTy&+D*s&+lX03UlL6cYy!DsbildiH244@wfS z+!wc~;Qs}~he|LuS2H{E2IyLCh$69w>@0!3^)EgE(Ce0mXHfKLIG|4!9R$8Xu0zQY3Q( zEA&a5lU#5-Iz*yYjFK^!G(NDlf`Op#6ZPZ3)@f+p`_(L#%b8ebva_LD67SD>J1F|7dC>CFt?k+n)+*7C6Q*D?Eor8}9e} zc*A*-^i0?d1rtwCSWfQO>K|U83?W^GC!gNUkA#vj*GJ2K;^7A_}q6UDVpx-VPoG1YGL#ByJ+ zqf&BYHnYnFl7G-DwHrSqyL~B122Hl~$qZHOjWUlHjS-eEjn16@1od{N22~WKyE|{hhNM(7*vBLenvk&fbXcm25z2g!fXKNbwBl^ zootfdU<{{_nn=olL9*E~V7DlFQH&*)vSkpTzf6e&UTRGU#F6ntQ6RW<$v1f%YBb5G zBL=KL<^mu2_70CgVkR#cK|^_1tF-#jSX`uu9LQY({JZmpI}sYuYy;hp&q#5bASm%dUo?bcr9P$0j}xhN4I*|9gd`*q(Vm5f zW3~NqqkQVAq-38mSr#qgV}qLOwe)G@`{xSr(q}x*p|%x*h2tlisTJG+h?KTvs*V+Q z9hZuDZ6*Gy9RKsP#Ooy?Ba12k96`W z&{m;Qg<0PNdM|2PP|1A7Cmh%3npUPcSE5;2d@G@>^3akSeIw&gWZZX8DfZ4ph7=3^ zrpamMrxc$i4Iw4U$Y7arV@>3GD_yCaYl&K)h8BLE)pQXbC?fL>xRYTS7viuR`*}Nt z31sbf69uu&#ZFk|jp5Mz*$#2uJh-M-?*`5+HJq4Ud8UqAEp&^L;xgV4QtrGF!#Aig zzdABHps~&JbXS5laYJKb?TduV-S3OG^3gTE+e#q6ZbKMy``j`|B7=U-@kHSW%;M|Z z+}zujcU1!SdnhEv7SHgT5pNfr*Du_a*#CBB>0S7jIXh+;#iu9bXu+cMy%OqB%`Djw zu>O$!*__Y1Ns*=y5FdmW)x5_L7(rjbxf0=NmHgVFFk+}yg*kLiPYy&tG3ZMcwGkRV z9!jB7ld8bNCrr76ruH|{Qgbkh9kEX5)AlS?(dX(s?2AwRDU&+>L%MU?iu#$oHY4O- N<%b#%^5mYp_#bt$au@&r diff --git a/testing/conformance/measurements/out/charges/OnHashing.time-vs-gas.png b/testing/conformance/measurements/out/charges/OnHashing.time-vs-gas.png deleted file mode 100644 index 153974687a5db3170356325418e61312bb0b65cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12656 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 kIWG#O~QXaN9V z(7JZ@1^|#F0pRFK>Z9Nja%Gnb06->XaNS6qNF;(!a&mG=|1|+XII#&J0*i}HSAh0* zK*ec-*mM#IztR*=ykHX^2LM;X0b)2YjQAx_SQwmoW&ATZkBf^-Qc_Y^SJ%P8AuKE` zEiJ9Qyu7KYsk5^akH>=|mM>j;y!g0eXnNUrd7MaG#6=L_p-LAQiGu(r4Y&jT8+I!0 zlz5!!&vx926P}~3Hja&rK_HMYVi>a{ z9cWR2#`Bt)HvllUlKzq5-R`cpXJn{oFqQNrlv|km@Iw~{w8LhGx4}o z83eNQ@kM9kz|n1V{H1QQlBy3u=b@M}NcD2J9B&(h(9^Sb@AdNCec(V`Vex1}9VUan zfem5p@JX@Ai8g+&H+-5>+?r2Tv|M0Vd>=EhDFiLN zy0ZREKks?zQ5@BLl{a+Q2G=2JgnC}RcUdCTeB}bemJPV*;B<4ZW-!!wS-cg^n3Oeo z7RH7c8$Bx;A$38^+QgYSHv)@pKb7Wfi zC#BfvvZG~cZt;Dkpaaay=PBsDktzK~+8+F0d09pc0fXwd#)U?U%Fs3L-y*Y1`+|H( z;F@;(u|HA!l=<+5)mbm0w40W4Mx&4CY;toH!s;;s(X<-OHT*3;`o6p(qbiXE4(hbAi`OBu(7FPRl zj2x&V1~r#yH7pzpIB+2ObV?JdhHr}{Lhbi+Qr1jRqqO97S0*}ywkxXc_#AX&ExMn^ zD(Ja;%ZCJ>G4AZ#GY*B&flE{?)7mN_hwsdBY!$TKm9tOPgkj&mU8CMRtr|g*<8zNK zQ!+z`HDA;$*Qc&YIA8Sn#<2p}uJv@pp zYpymV!z1nQ{C!kh7io zH-q-t7auQ&zWa)oJhClheEYFB-VcRsb^5$Uv#lwJTXL-Pk_O;Q9YWti@@y^dFq#An zdw!lH5i^MBsmyL2CJk7R_X$P)$;CH!F6?;q4HX0=V^-T2n|q7O$+lsGd@Sj6rrx)a zs>gZsVt zq1b%z;4w%QOCE}u&gs4=9#MN$<#P6$9G$xlZYuA~?MI`2aA+U_Ht|QQ2F~86oUtvm z7={&{Qbg7$_4UMWAtDee^baOpnm@R7!zJQ=^{L{SEpmQ};saMed3eJR=^Uu$$%=q& z7p!kS!3j+4yOyIJ$(Id_T2Cf-DAAjA4CTzQE+^{MjP(TI!6{?OhV6UWEj8^th%XYk zeN$_TUwr&TzyPEvqjVlI2*%0NeI)UcINT?Z6xq5Ge@K9ljXS)@ z|BrA+)aVX4Gpl+)ktxuiHv7>FjDDd~1>ZqA@P7kyP-Q{^j#XQkr6dpKd7w&A?7fzu z(RB(6(3WbVUSE)1s^^Ztj^(~*1mRrvVpD~Ba7<*6%}r~QAjAvNLtv&fU~rISi}uNN z82*7!AT?N`1N0q>zpQc7Sp8f#R<&J5jW<2Bspgm{prHAZ+2f)7!ADb?Sl!g?Y#tC6 zQ6M@J#kF2?1Ic2^<3?)Q#YBmZJ{UDoI5Q%aMp8{-?v0P4a7E?)UOe|>lI-y%mNp_` z`P@WKvXw;dCFdRU`N_bw(|)jn^v3-++@Kl(`^|=7+zvh2b``#UZ<6|LX)rnK(@yBq zCT0+Xsa6#3aFiVFRQBU+rND>!!8#5>L)c*+(bCS%CDFuJ^%p_5;<7pgL2C?Z+O7rP z_eM4|k6BjSvv!t0n!>l@G}F<2dgO2brzT3S{QYHHS`4)KI3nq-4MuZP-EyU8PJ(`~ zC;TMIpzs!KzyTuX-IBnx%?I8>HqpQHHdO~?wiP6%a;1Nbv^#qtC-sbJF4S*l-NpB^0=6ar2txcMfx>_d&mW;`L zwzwtP05Y&~qC>5@uJke@uG8${{pt)UW#uJ3-BhX8+>bMGD{Ycb{guUQ3gNpcdu$Tz z=6qi*WzBs_@w88t!@%yfonkp-Fih`=?+;|gfe=TF zgh|afgD9ySZk~~L{$2OXN^Jc|LH>!*P#dQg3FOm;pWE`{ip+7(NlwpGN27j|gzPo8 z>y=F2VLzGkQ1yazp;Ra1A*+6Swg?2t`}Bp}4Q82tX|rGJaB)d&Z-+Hod9`%934-{B zavppBZHzF}xOH%lT+RdCE!f+ds**S;*?h#bOr=-DiWoFeMJgXh1&uFC#*3VWZZIR3 zRFQm0dDw^qgoqZ0_Hm;_526YZ3B_{DOd^3utjxKct)}6rtW11U9|X5Z%;O|Nel!S- za*cnML-Y{vj+;m;3z}dkf4q_?8MTQL`Ft(&AHN`!>Oc`B@OOs0lV=kBK20} z5Nl@Z1E0MIy!>VmfzYZ*btI6)7&>`(&~DbDO;T^`0&$d6kKin{pm=7 z{Q@+yL5V2^bQz7AB}9FmXfgz+?4`43=`dPaVp~wfuIbx#M40j4n|s6Iu6&N?`g>7OnvW>$#R~@o zGBlCcX;((f`pv)k&HN%CCy6y#LbGr_A259|XQEltFUcNb1rG^2V0iw(sE$e#A`tw4 z1no6<$sq_g^QsbmFw!hJy1)vY0M&Zdqs2Z3Q$!`DbD;0+*_1$d*I`PBp2PQ?p^4w~ zhsnmu&VdthwV@9w?uAWE50ej-I`p2Y*5!3wO_D{{O*YCD^yygp&b~Z1^C{7nD|47| zdGowgVx{8STF>=PSKuIAEf}i2KeLm(IC{M?iZzmbRiMB+RKB%w>0?MS{t2#hIx~$V z?+ooZOHKULz@jemPcK;(z$wfW&}mA5_^>f*qH2TSF_miI@4qrt+2a&5w~A|7K%Y{e zS|spDq}S9MUezU81urDaF41@cGaSVKq>ePj>XGU}X8m!IerL`&5P&+KXxML#^eF=a z`R7TFo0|KWiF`__;a2fulI%#-!=aWVpFg4vsnKa7Yio`*)-gY4Q7C}>7!!Y~=fy)B z$J0huMw;v;T9w`>!TKO#VC8M^3|uBij$|7l+EJOk4>J$IuK)XF2~1p!{rMY39i)Lv z?GGcwLzgr$u0RbdJB3B4XTs~Rz`CF?Z4JR#{m*20qu;S}UF$MlzbbKP<;h0dRxR&O zJ~^?)zw7RXr{aCut-0)R$bGgF{IO!h7>v&bS#<;?Z}lZwnOvmBOyr*HTb5*Jq}fzofyN{2cnENSqkaKmVwY1tH+rc^LeQ zAYcyR7s7@xf0LgcX+M4Le0|6r|7!t|;UB9f$Y4pr7q8`c`J>F=+&caTcdg_|d51mQ zA!{439b$<+wKx0i8CGU5D%L-_Ow!~st$?MhvsVQHT7Y{0{46J4`9pC8g!^BhgUu9jCT!0>C zzb`b{nuG4j#0bZTEb4$~DgNyWZ~KB1o0?Ie*Uqg9$vR4N3bLWJ&(b;U{|2VMX>bS| zr|ke3jvQ+hN%SdveFX5rDliY&`|7~%K)$RZ{DGA5GGKBxHmUGhTYD!;LDUOsrD+2louHiN zlrFG<(X4cFmj_gdw!}r7EO4#5xLoGG=-hLf=)^#-OpAlGT{ek6^H2jTS#$6#1Yi8F zrYgDbtVeIsPL&mUFvC11unwjOgh(*B8D)cuKl}Hes{aoN#LP;Ou~_2#4#FbI4V<{6 zuEObGk_sNX7q6=!clJ^iB`Vx0AY6o!($=eN6u}~d7Yu$We~wCi0mHie zJVTYxV^$+8SRJPKg&X1cC0AtspG6R1Mt02Ux-Wv&Y5C_>L54_)DkTstT%t`1 zRb1<^d!#)U_^dMO#D!tO+ay4;{R{HZT$3txLydCOfY|S~qI}93FZkpKGc*$zmyTSa z0yoce(&h<CXA?F^TGK!WYqVzYQkvc3 zJ9SCii96Sm@3T}D@`ZS{tTz8|95 ziKOQY($s{(3rtdB=N)c-V46>PmnRKBDQ>UxAFYSi5dS4o4w=OGV+K zDKRg|-3l`j`(j*au}1R-p!pR?aDsw#)f%pR9U@cNmc?JQ^-OzdhJV63uxg8Y`tFNj z(rdBgSGf`(e0b&)0R+v2Y6ZLPoe_4KM6B@<{@Z?!L zp>_1JvRtx2fVz8cz_r&4%#iVs>+l{WSLN3VTaK^@6O=xGw0jjqtLM>{1e11jfWi^K zGQbE)slya%fC^$=yDT)n03+Vb?e}gIe6@EbW_-=>Xb7LnW{?SSra zY^a;m@CC%Te3(RVS+F3zvKYLtV$Xpm$oQW2j~-x#Xn>ls!97%Zg_paTP4Ic=qBR6# z6fqV)Fz&V`dp)j&q;#v#kkD&)#L5J6@zdIRKbEc6nN7l5ssbB|G$u7~JFeGi_4`7- zvk@jJxjdPIiGq2g=%6jxY=Q`m3`QTC%G@+F-p}=SQ2w*lI2(6TU*y<<(Cj)>!N`99 z29h{=Ece{z%nVKy)>p9`(-RMY)jfc7(vQ=fu+J};1O)0AA#zalAIowKkh`%HN$-cyq%1(TL{m8gWpj4`z z>u;Dy|BI4yvTlkuxO0z1Y^ja(b46YZofs6%d+K`7_FQ^j6gt&U$&QejI?`4E^_bb{ zt~KdrnW>E0_V>N;?p7BMVm$!X8b4p@yvGJuyC{9TQyV40GJqf)5LFw zgSTi0epUl-nfg{YaoY)T!FoDTn6r9e0!m`iVsFGH28v+YCX_B_I*ci4nAC;`^FvfF zmY7Q%;ibv`hNq+y=~L)}z_(c&FObw{inM2<5D|%#;$`V}q46%p4756JqB`bvXU3>G zmiHfm6%N#@d?(diJNM2_Ex}DBED2tLaCWz~0*~`QY{{y{Ql(ybDp8vV8!GO9>wkiU z@y;qk8?#!ll=JU0XA)P72tGB=X5iqmqPgn>7ZQTP7{Q}aSktddr}%5s0*gmwU*$~)Ee_RBAQw4Fy? zjsTxjXD9+EyH>ds|0(U2aRik_;AB=W#!S5oXrJkKtXx?9P7ZicxYIL^pO$sJ z%s;^}ewsXQo7w|_H#>oS<2RxBxFvR=F3-LAM&XDu)ORqDGPnL)BeCS*nG}{Ww|=VU z(ex_sM}Lu>@{B1qt=wY>x(iqZ;Y1EF39R*ohWUGE3OHSk@Fmj-)?83iT^l#`K3JTV zRqMM;K7S;B^ATTencV2_BdAcq7qB|i7>eTyyyV4AcO?X%oHiBy%!nho^-(sK;k~0O zNY4>*=oJxix{t?1eN>U2JSbJc|DKJ(k9ME6nfeD+)bn@cdpW@ONd4F%G*2nTE^=IE zwQ?}FjhaLLy&|8}Qb$ym%*J86kTp?dCX5BKbQSqoD=Q#st|Ix83QjZ5CPY3WTCb?p z&Y<5(gjZUy;``kdtgWIM__6DoOA`^@_Fdg> zXyd!XQiSi$A6mEvCu`fwo*_t+(`DTX<29)<`I2|j)GA@jvu}ToS=7hNS8>GW)m;C3 zKhBCiKO#@W#vHi%L@NB=zYNE=%(++qU>YEO3-B*5_WyW+%BhQY^J3cOueyPDGI|ta zh+%Lx6+JXYAx~n3zrAX|?@JOe=B;+07Y1X~K`S{OOSHk3vPyyA^qu63T@_Sp0?#C?ra1^P_0|X`G6tw9CdGYxOicA$``hRF>P98%L z_q8}n*U-$ON*fi618?;!UPemGe@AJI2%;o^2BWvff02h04Jl zB~r6DU|ZmI&PL%gv!C+h*qA(8s)O-Mki7ay`9|Or{6)IH&Cbm(0Vp|L0J;p# zl_H^EZ*~m{#^)5ZmG)ZGf>PI$Kl`2p3=zKVhZq*W`CXgOfny!t@6Qu1k<-aeT~o~O znNaX=+aH&2q$e$15hIn=(#J5kV^7lMNdP@oeu=W%wm#8@%#r6|j28cA_t3D(=y`%T zX*yJ~&U=xd*~tu6dFrB>mR%l_hQ-Fns0jYP#0%@LUWaR3zr?Ez+GZWhHcb5z|JfHh z2z#Y~0&N(~Xc^h%o6G>->86*w5zY+Nh49i_nQ59+1QSS;0q-P+m2^R*>C|&7BI{ZtdMV2BIUg zi45IqH7pNpwhq`PGe0!BAES$BhuQvAbgo{EE;2rNndVmqTcW_ig?-qI+RBW*a3yzc zlHwMOZFVEpLAGh+^CZO$PxHATlW4vx|C+K+7RtImd}&Y#VZ%RS9|IOL#>F%zZCUo$ zw6=zE^*>_v<*C8FXLMCVu@hw@R~ejP(DkTvuOA%8EBJC^!vifIX%7YySk_nsXxzGE zOk2ZaW|2SR$t@DU?D(H#&Mx;qtMhh#zzL!MKAn6o(`Sst%9zm93%!uAy6XpSnJYpU zvR(XDinr;MmJW$YuY9lKFBJB`MNNJS5&Ef%*X*lW%v^JCz|P&`LpWC25{$y?J=Z&a zZgJcSYT@ z9Etac-xpc2E~RV5;A_yk8;`Mp&&N$Rbir5uC(YNM#k)GcxQVYSY7EG-2Fst0w?d0| ziwAcsL1JhmSPWR#b$h6S5DHG;!~Kh) zRqm?2o`)kn`|3#sTJchRvwbTqcb=e3A|pQF8X@{7$r>2*$LZhrc#zzM`6r<@HUggSB^sS0Ijs&pK$e#pLkX_? znup27gWM$&9QP%W3WYuSk0Vd-S!lUT>h>7s)7+@lHdD{u+zVw?kjD@w=fU(TalW~F z)lO(IR{QAO_*k5QW_kQbvw?%Nn!WK)wD^F|Dev#TMC z#PrD{1{hJ!%MS&h11W+>P|h(nQUM>B5zc7V-)z7l{QrpgFEAR$7-53dv!-HCiyPEJ zT3tEB#TP8u^CzLl$fq<8CVg2DoWD@9yvj7if6lexJuHiSp5hnogUjG$tzO(&DEWNe zFJ6g9_%eWBs7Ug&3bTF*srU;QFjAz?QX=vqeIv2pHOZfVTjtW6T>3Gn@)y|O81k{W zhgMk5{OIy!{-wi2DaE|&f#LajyHy}tUdf9*)#G4-AV(=qAB0`IT#G#I-7;r4%LPbH_) z`NV)hm1rPYd{-t6uqdo=1##YhXAW0vk&r|bN4m8kfg6_7O{sMkFrtP z*BQ{*OZa9pXG>^_ayfJfmWYjY31jXBnTSYye|IvjB+8~zZTf{elG;pGOhA^Rd=P%o_4CR zy+t&jKjnV;9abTiX2kh)Nt{Y+0>-mgj@OGl1w9Iu0`Hs<1CK@#8j>9~0*rzl#bTs! zSa}hj;;!6J!_K)Xa~Z8A@8ZEZX2EDAx2&X{!OzG zqhD#%e_|n)hzTgp6BgxvrxS*`37Sh*vnD#Zu_MkZ=S9{lQ#4tt z2PTW`*vZ{11Hn1EFyvDenxJEOfv*mVQ#CUhlPU+?^|)VHh$W=NVx8}KnB7HA_r7(o z&?N}iUV3!e>GCrZaj)XEu8wH8N(;i)BI@dG4Yc(&th32p#%Hx=`wGNY6V@t#a;aFCh>tYOg=j)R8!y zOP=5`Bh)_ZjJ`Yh&ir6(cwzz+!CEx{yWARb;+};YZ^?wo+SKUqIGx%v*PXpSyPktj;sYn~J*SZjEz4Bgd> z#W~M|La<%jWsT|O@#j2>)pxEwsV?Ej>%HSH^-n7uU`O?5Lg7fq_lX(DH(Oi*A3kqH zR+7QaE@k$EE@45OVolwXtP^@Z20sdD&Y5CY`<_WZqGSZDo>*MwV{uk!?U9n{cf7}x z!G!PLKLH2pbp3)k!wdR-0oT4eOmJ8#6#v%9?Kb_y(bHOSf#@}4r29t z_;ixpe*EE-JX!_- zQ61trqqoE&Zy%V-d__q=BKZyCQonnj4=*NDu-MpBZ?4N}drn>y?F$9KFPr@V{>ZVj kl0zsdh(UKq2n;ZE!_Z2%N)4UTAnp9$ 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 b^Q1`ZyhaR5i<-GK6iG>5{ZXl``OE(UAj(e{ diff --git a/testing/conformance/measurements/out/charges/OnVerifySignature.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/OnVerifySignature.time-vs-gas.summed.png deleted file mode 100644 index b7b194a1bdcf7f129a29cd2311be02617bb96089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11553 zcmdsd2UwF!x9%6JfPexDQpGLOyELhyqVx`-NYRZ5A@tBof&vzbQl$x~fRIo`Na)0k zfOHfHHGqX)rT3gKxcC46_dn-6=iGDebMLt~Pe_>gX04f7Yt5Q>-pOMlgPV->ob&(y zFlyhrZUO*QWdJ~V{sbjhL!}0j0sx4dk)GKN5{U%XHubQt;l1R(M2om-~>GCpZ5CD4veg{9pFFd^< z@znCT{Pf&8PjDyz&=uXi0FZ}B0=hqw*b+(MMyp69=?1We^qxxzTAhxm$HA(i7&bS@ za**dqdBAeSauU!-%ppEA(lCcfBG~{W8yivsd?S$#c%%afNglrjDF=Kzka9dpcsvQ5 z4+-Ced$~$l&B1nkAbseG)`xeKOn?wkQ)RvGkuFX1TE(p!omBe=`cjQc0tdX%6~BPawbrWUaCZnY zM4n(DI-dc3UHqhk+StxlR~OSZnm4X{#Zq_XwodC>+NpKYpkMp&tAUa6<)tbk^(^%% zUHWOmr2J)Z7{cRX1=fVM@Lj)$NCsx~5@Kc!Ha}cAbj57TuB~S9@GOw;&zG+gc&FG; zEn4ew5sQuWIm;kP`6!vHBzA&nOGW?N-tO@)MfXG7pKwEqvpBN)s*A^dR?}Lz&yTMy z;C1xxpNVA%v|qsD>eg+Dfg?DWV6g!_s-95qjsv9B8=3arlnD`&zQ9DFUggI!E_tJGgPp8bC~0@~8+S-CtI(IV2yAj;ys@D!XHlo02sO?{GKyy~boWLCY|e z*4wmJ9O&#>q7a?YR4Wj*_r5To(xF;()=@y-dr=JaqtEINZyB!UB9swVnI)!1eLOr+ z)mn>Eq&I3G?qegjy%AJnN!jt^Y0Oc>;L=%O+Fw1@B#8C065uVg<5Yw~FIYQFxw+oe z3B;?lM$7l0lATqBHrb$iSa{%fxC0#5HS^G^>z)Hzez{H|a2-2H1a;uJd>gl8O#bL! zS6e9`RV&j8pC8v^ES%xB(2?0LiZ-W2SJsJ7!cy9zoNNA~E(r3colFo)%cW&dW3Nycb6@$|z zCluCETFSCa0V85>HK%hM-wS3mLOayaDHV*^@nJz_dJXmYW9jc1F@7S+(WpQAgdLTs zMY9<@ij@L+Q|LxtroR)(=QW&%4JTPFTo$i~?P@p_kDe74Uuf`uk2$bzud!@W5d(08 zIHr`Vm-5popEav?W*4mq=Q_r4A%*hC{MUc47ohpq3y##1N_#4h_ZpRk3hQeZdx*y6 z&<MvY!4~Ehe}=ydu*Hv7F^Cl}qARu1_VS5O@D!eqyY8cS zZ`bXdHbgOe#e*z0I7DM1R(eW^`NQpd;{Ah`5-U@;6=b(dfmNjpypD_c_*)aZQMP5+ z0>kCQAcI>Dkg68dGVhy3^(|vie|wvK3wJuqn!!(_#;^ukfaJ7|7g?#pcu-@P(kGwd zDUfIk%KVD?f(;4><1?h2xJ(5oQ&NhG)%Gf3M_`xjnQ9tc-iE^|jh8fhl65P;$D9;P zog3@Y2`waKS?A0B_)x?#Q6W`=MZNXQscz33@d~nBFp+UtS&#W#lat9Z9n#KPPN-yN zy{T?G3N=&iwVg6qQmjYEZi@9TQJ^=yr0NTp8%u$c%iI>zgk{HjADTkEdIXNIB&Bpc-;EY4d&yze`?|hY0EudEf26i zJ67;tE1o({Z9 zzCOx5m1GxQT3o(2Wt~WPfe=PfPa?;2C*gIp7Dg=#`eDRDPNz(Z264eMfV)?jEvA~t zTC`E38S-w+k&)aMlAE(7h#JX1O0strPpT~OE$OWBpCefO0t?37M!LuqK0 z+>C4`6v%G}%C z*;O)G8g}o?R%igK&b6d$NNg4nKYtb)}TbdY5}@!KI*Ymp)fF6pfwyO2{Nv^ZajEVE>iHiSo&v zto!M1B+vt9T4h1a57aii?5<7GGGJ;f^HE`ocrv0qQx~_toyBy`0Wze-O)ot@!SOXb zkf<+6brzY`l$#U2<9-TURo#U~LLM-AJ}v~f9v3s|A`ij>U-wITur5ZERb66xCE;;> zfbSf>hHM(}dH;v@EU`i5TXiyX=%?+=`|f0YiKx8wg=uBl$B#e1vByYwRT1qc4uKcM zYE#W@69H3U+7w(M^S#;#vRe1v+g7+tJR;er=wr@!*DV2Z-*u@{B%f~=aXnTLRt}GiLL24U73;g>&x4WXrO0Ly z{z*QXtLH15dzr}gS*@x4<9M?P{AA(qO$a%` zO@6wUCNpang^qy_Qe{&vtW-jFJUGtLm&8~Pc$$b$*=4abpo`Bze?!t`GCc@a6u_X& z{?Hzk=UW)a*{|h{C(ukbI{py;S|6SK3jHersg7_nDPU6bi;B_|y9>>oHhmdCW#aC# z!Y3GKXUv7%jbV(OB5-Gwo~r4`J=wh6uR50QqYVf0Wj6?!>K8y0o~)Ofi6=+IpL>bt zaUB{-EZIXM zYY-fWR}6jKBUA;KQ6*m@%e*VLvA43 zuhFi4$S*5L(e6O19{xKi^8~fMoy*F%?+y(QM}QL-&V!rNbPAtcVghVi^6bYL ztl^9L_(s^Ln1(6*TA+lhcF7qOwZlw*MN~hey>xG0t(bo%>G7Px6*qQrh=CU9-!->a z;9(B`>aH=wfkwEI5veZ4e}6DrWG`Bcz=4#MrVoYXs$BOPr>XEW3Oqrohz&WN%jxjWfK z*%`F#=@}YgGD19n$+Mlx$)`ZL<-nw==2~d2_&R%tvY=ZZXN;3IC33qvQnQ=Yf9FE3 zDM2xjRpf>x!)q33rHA>x6>hDl3IEX;XxvRTQrz26D`?jU8jpMjVkI93L@^_tUHJ^X z+V4MSoo$r@F$Lj8d1GkPKm030cl7&!hkL0~QtevFNB%pRtGosySjdj$gXI;quvhW` z2{L16o{jTwr4&smq{nXLS^K-D5qhJ(1rN|ns!uMW=gnU>gl$mTQQOlHebgdVB1NZC zx>?_EvEEefC$}(T?nn*?7cLw(J$s;?njlK(Gurlq8AOi&2ee=|F}i1})RmD9vHhke zR0SQ+@(K7hYfla^gXoC$`t0b7#L`7^LnR*C-TZ@XKSF@yHRuS$n z^aRa3dpp_-cPDk=N7z(nb%)w7aRV@$jKo5M3qY)O8J^7aaO~ z&GSjNwP_m^;AZ<6Y1E73hN`JMp)U^VXuyGsr%%%>73hVvr;Mvg*pYW?4qkdcQplGw zm8=%1c{WS-6kfzC&%cKTwA*3~6Lm2b^=I5}3qrtr6UV_#Zx9K0IOl^#Ijs+FT6JWy zP$=H<6uMpvUpCy856q=WA#clm-8st0-&&$HbwqDR2$gue6Z+?@$;cQv_FM!tmE_`R zMuFZcc2!?U;j6$koG{bDecSnWp(F!yM$Bl?yVU{VueBrT zC=iw51^+mI4CEKr{L09o=*kV{Lej;ar2Zcu{OO&Y4$(ItDo}2^mis4Uw`~_+I{g0e zGaB5RQ{$;D=A5d@sgnCMIaQj&f$0nXh_3$$Z2xyJvS@w~O>C%nyLd$0JceCJBPr?h zji&>`)nk5<$PwTcm;#UY**Tm*wZ(C;JTm&E zilyO>Oqc}oD`6$_K;Jn|`m5(k2QIy)F%ZMgg6U69lqhFtz{-IzdTdoPLgEuE=C54z?B?X%knIo5{WK10cV`@_vj;-x=ic<@jeQCH z5cX~M3<$t`J{hfcSQYePZH4=BRbl}kE{_-i^ltr`RW3$H{1^djHU6WbFJ_7Kg*1*C z3eWga3MYP_4?6=pDOpPDA%S=)^S2NSY3Z_UreW`}~4Eur#Y)q)2?t=O&5< zN>n8&1y4csTiMnG3lt>eo`Yv4#{X>B2QWAZw?9>&59meWDWn*|ymh%jqReih>cBNo z9Zba(_UurFASiwiL;-paz$URCC&d7J9rB$1e$Y&EjWs8zh$WhgO8<2()hq%rRPjOB z*K6=UTC*N_9H@+&8wQTYd~vl<>&+23-Am9?x)Bp;$by(NHKR-jN6p3}L+RZuk5 zwe`7iF^JBI*{trcM0MrcEzeb4|MmpFWK+#Yv7p6_MpqYQVQh%5FX`kQ&}_OXmNv)b*MS05=j7u2jNSypykG&eMv9=~|Q&?Mi}Y41p{Gl})D zne9u$;AiCe);xW8`FjC3Y3+f;q-q82&llR0RAfcfvK45}qtVMwTJu1$T&{c<)#9>Kfro44HC zw|4E8&rhy3TaWcc5U=`KP6Rig*L(RJZrgA6H5SM)FPFT~j)NbTh7QGGKB-_M7iSbI z8od(H8-;?&NxxN#k80ClMoq@z2ij+$>a+yO8&BU}$*Sq}^z=zo#u{)4kn(NLr6G{H`ce6D#gE_ zIqIWAJW&%6bA4PCOV==O`t);zMo=X)O0JooshDjT5f!bIuZYEQ8<_SB2lv(s-CR=} zm>+nX$Dw=bQRxH@gqr^8^vR)=L=DNtZq1Eri5<^R7Cj8<*qsVOcb3Dv z*3k8|1hMF$iu2EI7Yt7iTx`Xra?q4%*f3InJIOXNtu2TPC=W6igjI?#XtPdoFdZr#H z9qQF`Se0w3UK-9OP-nu5AAEPSe5zNA%bAi1h>OHKU+M89kK(C2m;>MRlu%4JTjt zXaYncrD(Llvgy>&&koU0*kV8I(bU2SqFpc)-d2N{_a5-?S8`k_qFg;QPEFXGu6CLO zso;f;q!B6$Ml736No+{9pFACKShwU@?KXUGu*q9K{(a-3BXR9f$WavUStP`cmH;2T zW{tD@)+YY?Htb=gG$z4h_jQaTgkw_Q!3CD-k;poKYyZ;AFGU;*f{#1QHA_!g(m`U@ zFO{`-7M1xXrUXL8U&fe!4t7##TJ2B~Ba@?+ck`8zE}oM7$iP+bocBNV3h23>hw;l0 z@CwweGriYXIH16eV+gHi*Rr=f)Hh;S*R_%Ms9-zr?xy&QRP~+=+7jo(20jV;}8+*SJiwjnk z=r^1(+)aqsWz8!L?yx3u(G?f>Uw0KlklHUTV22aTrb6W430DF{vXWA6SBR`XsaTjy zS!DFGDu$WvVTD=nV#`ftbAqGROCe0LEan2(3Yik$Kip0_c?wHn3SwLeh0~1Qn9tdY z3z#us2nI3Tb7K}KVZLJeM4K=kXdzwkD=+>P7*QT}8(rr$B9lD1Rt+0(ww|hgh#joC zGPq)DItpGjywWmF3G>tSKyRcku6?gRs7pOnLj*4fFgn?K+ILL+1(MEwi4WIKVu8Yx zb(@$`<}A+ez`Lwa>1daZZX#B^%v)V@MQ&xBm~!2^2-DbRymJa#5|VAX_>@Wtf@8p} zHMylqDm{07ImMfNJ6H&}=hJY2+4oJk-y!6$UB>ASQ??4B$BgyYPsQpxOvU<8OjB%+ zE>ntbCxwi5soqZwt!l-O9H9JeP`p5z!hNmhx_Ug9#i!hUc9=bwnyIC>Fo;0t%}u*K zW?JWl1`-~a7^3n#MpG2VX$XF!(WaWX7>`PyhOUaJOapN6Pd7ROz_U)LlfrBm>70T3 z#AaPj?IM;L^ToUxXMAnGIyyO_vwq%D+_Ajk&-;ue7HHTx-^QtThZUc%Ign9?5myKH zC-(51!PC)CU6{gHK>G zo1EUd4lk^8kcZ$b>*c#Ii*XIO56f(9)n^bZm`7aCtKasTTNo>4!Sbf)1hT9{O&e@E z+UMoU2r2gV0%O#K8aP&uyAlx=I)7i>lCDoe9yL$`!Pa93w$Tr%&PwqodXx(L*SLj8 zHOX*h-+Xj@yCL~cw;MsFCibFJ9iizdRK4o2)dYe3At;ZWZ)F%#Wo z4N9LyZE}WZ^U1@$_8(eN5nuS3p|v~^Y50j!2wP@BE!-+)GJLh!(5Oop3Qe=7Ue7*xJEvr z*Ua$(;0(ncW_?de{B_5zX##|ZcsB!gU7A4m`WU$3}A`=s*js5*E-(qKHH@frM< z(i;RP0QxFwj#J1O1|oVXRZ4+8GCP$Shx(QTva#fu-KhetLo?4V)KX)K8t@(M;io#g zs=r684dv|LKlFu>K(cH{>yV<^>5BjRmWptC6m`h!Zqy$fXOUjy$xlu@{~H!iWEJ{c zHKDL~ZJ*~f6t8fFRp@HreH!ee~bJ5Am=@F0$$Z%4S-p&6SKppZ(BN_II{8(oX_V%4X;c2%jWdxQ_&RchE@Q;5JmniK*aPb=Jxw!bMY_~s!gPIiVd}?1 z)KAvOvx7gLL{aB(@lMh@a5_^oN8W#Wb;(l+_nrHOrF#*%d&g39>&Q?sP=#ZUdnq(pWd-V13YoO#OvnmE> z$UU&NE4~FTWcTh^N0-vNK>EBJWi1)4tqV$hCX-$W|FnqdkCKQe0^k$ z>PS8STFJL(86)?VH29F4ZhBlmN} zZ}f*@e5$l-`1d&1?v)wIWfWq2m>$?zk3R3^VL+#AvfGNkG7-j{fqzv>9TFRUf{nB% z+n};`TO9*ZO1?hJr`sZ9OD$Vvyv#<(J4i^p={EJ*E#h}4+h+kVCUQk-_%|W&o0)ua zJ(?3>6CA$==7ibl{+!xMr*HRPs$F^Y%Z!IjPtC$J757rNl))75vB6wg6t3X4(eszT zDx&r-Mk%n~B#r-?je%(mA}fPoA=`qR~7h zaiGlw3OWbu>fc(wyilk1w|Bs+hz@S1q$=rGhYjQ*N%!&KFOvmk&k2nb70lFw1WwHy zhY-l?@MZ6iqcZ<)PSUt}0LODMz4-Pi8*MaY(*8=iQ$MBK$-w|-DhuYGE^=J;DHv_^ zJw<>DiN1_Ut0CxIS0;tE#(~|+?JlspryV;Da^}T;2Z#ia?mvhJ;7wovnWp$}m85HEER6P6mO!J8&vHP=wZMUE z@KAQV-~w}UPQzWYJ5c}Vj@YlLfw3dpUUjTKp>F3Rx>DU^>q1#v3WeUcSK)c;xY6Ke zzVOXxUc%>+Zb_^4J4>WE_?GLEI!PO%EwN|0w_YnyhTJ_3ol#mz-a5Ly527S`6v7TO z^I}>5S7D$Yv>rz!etujHMIEE*fbhu1Q)uy*)!+;rAg@nBiKBvLNaGWjWpL1VAu5aQ zEjlp=HVSm`|Ci$7C3wzITdg!Q#$q?wp8GLtx;=(+!jwI|Y8y1_UFhN!{HUmCb+E`ilm{rCI&l6;phB z#TG%LKc1XU2QrOm7N9D`;>fL1){;umOpcw?Bp-=iTxA=GYBr)b`LUfM&;{IY)ghA?@B7O ze#%VYcaRt6P3_{t&(zjDc>DA;EX|O?k9NGRnlF?r9+qfE>TB%z!n{+0nTzvZ;(OQy z?VS9s+Of_xGV!KubFV*9r`>D#2$ETcuMu}Tg5uurhHY^}8Z&9@@j>pesGgZg=%4Bh` za6E3CpVS#T8_*a=Q>Y>@;k;*X?!B!iv_@hV*TILsfnq;3A5V%$OhmlZrOx0bFZ+`BSa)76^xGvFpjW$|4Ze@|tR>+`M!s~5DXAlw_&^?P~^UkR++ZwR3(omTKI zZ*m`pODpR6zF1A#NPFU}1aevLiegvm=S3O%!wzN&L3DFTc`^5loNn{i-2Aq)w-x3y*G2i2FekCmfV#ZFS=^i*5+F~ zLAbD8G;4k#Oi7Tcmk9p&Z1#tmc^pq;T?MYipgs!PP;$E<2RGL#{Ub>~P0 z=nH0tF4Rt?M zD+t8!0X$ILZDtqZy~l#M7{B7vgqAWLovC=4C~60!0xGZAt3lu3?QcsN0XpbAW0@Bv zEa~cHY{7$0cLrWW7X8N;ed}q*$^aRQ8!O4glTDKAWhd7`1R9&R4CH^Pe+W!}=;Qnc cr;rv&l)PJfk3a0*;3ZdU-!QmdqUjLvFHJuuV*mgE diff --git a/testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.png b/testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.png deleted file mode 100644 index 2a5394f788113b70ea495e13aeaaa7de938d3f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24392 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 OkNyQ?okH#3gZ~4_mz==> diff --git a/testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/wasm_exec.time-vs-gas.summed.png deleted file mode 100644 index 34d5fd3f30539f7cf65b8e155721c6ff46e7161d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17797 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 A{r~^~ diff --git a/testing/conformance/measurements/out/charges/wasm_memory_init.time-vs-gas.summed.png b/testing/conformance/measurements/out/charges/wasm_memory_init.time-vs-gas.summed.png deleted file mode 100644 index c2b7c898bd534e21efbfcc5f899b5592dd6f07dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11478 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 diff --git a/testing/conformance/measurements/out/regression.jsonline b/testing/conformance/measurements/out/regression.jsonline deleted file mode 100644 index 53d5c4949..000000000 --- a/testing/conformance/measurements/out/regression.jsonline +++ /dev/null @@ -1,12 +0,0 @@ -{"name":"OnBlockCreate","intersect":-26278232.41288907,"slope":8411.636921157187,"r_squared":0.542530865219476} -{"name":"OnBlockLink","intersect":2990069003.0795126,"slope":1263.5951039649958,"r_squared":0.024395421811449602} -{"name":"OnBlockOpenPerByte","intersect":-61944791.949856065,"slope":4028.0925794987947,"r_squared":0.5670116832046983} -{"name":"OnBlockRead","intersect":2878186.9489921895,"slope":182.87005745946124,"r_squared":0.08940009958976847} -{"name":"OnBlockStat","intersect":0.0,"slope":0.0,"r_squared":null} -{"name":"OnComputeUnsealedSectorCid","intersect":-1187909107.1380246,"slope":223920.65544110537,"r_squared":0.9782927669758872} -{"name":"OnCreateActor","intersect":-8656200718.136515,"slope":65285.68572039967,"r_squared":0.7803627073237722} -{"name":"OnGetRandomness","intersect":57533015.04872439,"slope":15859.850483202792,"r_squared":0.8164299345142512} -{"name":"OnHashing","intersect":31355000.0,"slope":0.0,"r_squared":null} -{"name":"OnVerifySignature","intersect":-5898572110.92534,"slope":5644.481912413442,"r_squared":0.9959725993255565} -{"name":"wasm_exec","intersect":-7484172642.769513,"slope":3729.2423365751797,"r_squared":0.8853044726277718} -{"name":"wasm_memory_init","intersect":0.0,"slope":0.0,"r_squared":null} diff --git a/testing/conformance/measurements/scripts/charges/time-vs-gas.plt b/testing/conformance/measurements/scripts/charges/time-vs-gas.plt deleted file mode 100644 index 7e79183f0..000000000 --- a/testing/conformance/measurements/scripts/charges/time-vs-gas.plt +++ /dev/null @@ -1,28 +0,0 @@ -set term png size 1200,800; # Width, Height -set output fileout; -set key noautotitle; - -# Show two plots in 2 rows, 1 column; -set multiplot layout 2, 1 ; - -# Scatter plot -set title charge . ": Time vs Gas"; -set xlabel "Time (nanos)"; -set ylabel "Gas (millis)"; -plot filein with points pt 1; - -# Time Histogram - -# N buckets of equal length from 0 to the maximum time -n=100 #number of intervals -width=max_elapsed/n -hist(x,width)=width*floor(x/width)+width/2.0 - -set boxwidth width*0.9 -set style fill solid 0.5 -set title charge . ": Time Distribution"; -set xlabel "Time (nanos)"; -set ylabel "Frequency"; -plot filein using (hist($1,width)):(1.0) smooth freq with boxes lc rgb"green" notitle; - -unset multiplot diff --git a/testing/conformance/measurements/scripts/charges/time-vs-gas.sh b/testing/conformance/measurements/scripts/charges/time-vs-gas.sh deleted file mode 100755 index 02c5d10c7..000000000 --- a/testing/conformance/measurements/scripts/charges/time-vs-gas.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Merged traces file. -TRACES=$1 -OUT_DIR=$2 -TITLE=$3 -CHARGE=$4 - -mkdir -p $OUT_DIR - -PLT_FILE=$(dirname $0)/$(basename $0 .sh).plt - -DAT_FILE=$OUT_DIR/${CHARGE}.dat -JSON_FILE=$OUT_DIR/${CHARGE}.jsonline -PNG_FILE=$OUT_DIR/${CHARGE}.${TITLE}.png - -# Ignoring .storage_gas for now. -cat $TRACES \ - | jq -c "select(.name == \"${CHARGE}\" and .elapsed_nanos != null)" \ - > $JSON_FILE - -ELAPSED_CUTOFF=$(cat $JSON_FILE | jq --slurp "map(.elapsed_nanos) | sort | .[length * 0.95 | floor]") - -cat $JSON_FILE \ - | jq -r "select(.elapsed_nanos <= $ELAPSED_CUTOFF) | [.elapsed_nanos, .compute_gas] | @tsv" \ - > $DAT_FILE - -gnuplot \ - -e "filein='$DAT_FILE'" \ - -e "fileout='$PNG_FILE'" \ - -e "charge='$(echo $CHARGE | tr _ - )'" \ - -e "max_elapsed=$ELAPSED_CUTOFF" \ - $PLT_FILE - -rm $DAT_FILE -rm $JSON_FILE diff --git a/testing/conformance/measurements/scripts/overall/time-vs-gas.plt b/testing/conformance/measurements/scripts/overall/time-vs-gas.plt deleted file mode 100644 index 554dcd1da..000000000 --- a/testing/conformance/measurements/scripts/overall/time-vs-gas.plt +++ /dev/null @@ -1,16 +0,0 @@ -set term png size 1200,800; -set output fileout; -set xlabel "Time (nanos)"; -set ylabel "Gas (millis)"; -set key noautotitle; - -# Show two plots in 2 rows, 1 column; -set multiplot layout 2, 1 ; - -set title "Overall Time vs Gas (over 1e9 gas)"; -plot filein using ($1 < 1e8 ? $1 : 1/0):($2 > 1e9 ? $2 : 1/0) with points pt 1; - -set title "Overall Time vs Gas (under 1e9 gas)"; -plot filein using ($1 < 1e8 ? $1 : 1/0):($2 <= 1e9 ? $2 : 1/0) with points pt 1 ; - -unset multiplot diff --git a/testing/conformance/measurements/scripts/overall/time-vs-gas.sh b/testing/conformance/measurements/scripts/overall/time-vs-gas.sh deleted file mode 100755 index 4de84e46c..000000000 --- a/testing/conformance/measurements/scripts/overall/time-vs-gas.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Overall traces file. -TRACES=$1 -OUT_DIR=$2 - -mkdir -p $OUT_DIR - -DAT_FILE=$OUT_DIR/$(basename $TRACES .jsonline).dat -PNG_FILE=$OUT_DIR/$(basename $0 .sh).png -PLT_FILE=$(dirname $0)/$(basename $0 .sh).plt - -cat $TRACES \ - | jq -r "[.elapsed_nanos, .gas_burned] | @tsv" \ - > $DAT_FILE - -gnuplot \ - -e "filein='$DAT_FILE'" \ - -e "fileout='$PNG_FILE'" \ - $PLT_FILE - -rm $DAT_FILE diff --git a/testing/integration/Cargo.toml b/testing/integration/Cargo.toml deleted file mode 100644 index b216c279e..000000000 --- a/testing/integration/Cargo.toml +++ /dev/null @@ -1,44 +0,0 @@ -[package] -name = "fvm_integration_tests" -description = "Filecoin Virtual Machine integration tests framework" -authors = ["Protocol Labs", "Filecoin Core Devs", "Polyphene"] -version.workspace = true -edition.workspace = true -license.workspace = true -repository.workspace = true - -[dependencies] -fvm = { workspace = true, features = ["testing"] } -fvm_shared = { workspace = true, features = ["testing"] } -fvm_ipld_car = { version = "0.7.1" } -fvm_ipld_blockstore = { version = "0.2.0" } -fvm_ipld_encoding = { version = "0.4.0" } - -anyhow = "1.0.71" -cid = { workspace = true } -futures = "0.3.28" -multihash = { workspace = true } -num-traits = "0.2" -lazy_static = "1.4.0" -libsecp256k1 = "0.7.1" -rand = "0.8.5" -rand_chacha = "0.3" -serde = { version = "1.0", features = ["derive"] } -serde_tuple = "0.5" -thiserror = "1.0.40" -wasmtime = { workspace = true } - -[dev-dependencies] -actors-v10 = { package = "fil_builtin_actors_bundle", git = "https://github.com/filecoin-project/builtin-actors", tag = "v10.0.0" } -fvm_test_actors = { path = "../test_actors" } -fvm_gas_calibration_shared = { path = "../calibration/shared" } -blake2b_simd = "1.0.1" -serde_json = "1.0" -wat = "1.0.66" -bls-signatures = { version = "0.15", default-features = false } -hex = "0.4.3" - -[features] -default = [] -m2-native = [] -calibration = [] diff --git a/testing/integration/README.md b/testing/integration/README.md deleted file mode 100644 index f80f335d6..000000000 --- a/testing/integration/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Integration test module - -This directory contains tooling to run integration test over the FVM. - -## Framework components - -The bulk of the logic is handled by the `Tester` struct. - -The following flow has been defined as a default usage: -1. Instantiate a new `Tester` specifying accessible accounts, the network and state tree versions. -2. (Repeat) Set new actor states and deploy given actor in the stand alone `Blockstore` and `StateTree`. -3. Interact with previously deployed actors by calling the `execute()` function. -> Note: Once the `execute()` is called new actors have to be instantiated with messages as the `Machine` and `Executor` -> are already instantiated -4. Make assertion on the `ApplyRet` of the message - -## Current limitations - -1. Wasm bytecode is now expected to be received through a binary type (`&[u8]`). This be upgraded to work Rust module compiled -at test time. -2. Some testing and examples should be added to demonstrate how the framework works. - -TODO: (hack to get coverage reports from actors + integration tests) -```bash -cargo build -p "*actor" -export SKIP_WASM_BUILD=true -export FVM_STORE_ARTIFACT_DIR=../../target/llvm-cov-target/ -cargo llvm-cov -p fvm_integration_tests --lcov -``` diff --git a/testing/integration/examples/integration.rs b/testing/integration/examples/integration.rs deleted file mode 100644 index c28d438c6..000000000 --- a/testing/integration/examples/integration.rs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm::executor::{ApplyKind, Executor}; -use fvm_integration_tests::bundle; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::{Account, Tester}; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_ipld_encoding::tuple::*; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use num_traits::Zero; - -const WAT: &str = r#" -;; Mock invoke function -(module - (func (export "invoke") (param $x i32) (result i32) - (i32.const 1) - ) -) -"#; - -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug)] -struct State { - empty: bool, -} - -pub fn main() { - // Instantiate tester - let bs = MemoryBlockstore::default(); - let bundle_root = bundle::import_bundle(&bs, actors_v10::BUNDLE_CAR).unwrap(); - let mut tester = - Tester::new(NetworkVersion::V18, StateTreeVersion::V5, bundle_root, bs).unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - // Get wasm bin - let wasm_bin = wat::parse_str(WAT).unwrap(); - - // Set actor state - let actor_state = State { empty: true }; - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(&wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - ..Message::default() - }; - - tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); -} diff --git a/testing/integration/src/builtin.rs b/testing/integration/src/builtin.rs deleted file mode 100644 index db2264f89..000000000 --- a/testing/integration/src/builtin.rs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use anyhow::{Context, Result}; -use cid::Cid; -use fvm::machine::Manifest; -use fvm::state_tree::{ActorState, StateTree}; -use fvm::{init_actor, system_actor}; -use fvm_ipld_blockstore::Blockstore; -use fvm_ipld_encoding::CborStore; -use fvm_shared::ActorID; -use multihash::Code; - -use crate::error::Error::{FailedToLoadManifest, FailedToSetState}; - -// Retrieve system, init and accounts actors code CID -pub fn fetch_builtin_code_cid( - blockstore: &impl Blockstore, - builtin_actors: &Cid, - ver: u32, -) -> Result<(Cid, Cid, Cid, Cid, Cid)> { - let manifest = Manifest::load(blockstore, builtin_actors, ver).context(FailedToLoadManifest)?; - Ok(( - *manifest.get_system_code(), - *manifest.get_init_code(), - *manifest.get_account_code(), - *manifest.get_placeholder_code(), - *manifest.get_eam_code(), - )) -} - -pub fn set_sys_actor( - state_tree: &mut StateTree, - sys_state: system_actor::State, - sys_code_cid: Cid, -) -> Result<()> { - let sys_state_cid = state_tree - .store() - .put_cbor(&sys_state, Code::Blake2b256) - .context(FailedToSetState("system actor".to_owned()))?; - - let sys_actor_state = ActorState { - code: sys_code_cid, - state: sys_state_cid, - sequence: 0, - balance: Default::default(), - delegated_address: None, - }; - state_tree.set_actor(system_actor::SYSTEM_ACTOR_ID, sys_actor_state); - Ok(()) -} - -pub fn set_init_actor( - state_tree: &mut StateTree, - init_code_cid: Cid, - init_state: init_actor::State, -) -> Result<()> { - let init_state_cid = state_tree - .store() - .put_cbor(&init_state, Code::Blake2b256) - .context(FailedToSetState("init actor".to_owned()))?; - - let init_actor_state = ActorState { - code: init_code_cid, - state: init_state_cid, - sequence: 0, - balance: Default::default(), - delegated_address: None, - }; - - state_tree.set_actor(init_actor::INIT_ACTOR_ID, init_actor_state); - Ok(()) -} - -pub fn set_eam_actor(state_tree: &mut StateTree, eam_code_cid: Cid) -> Result<()> { - const EAM_ACTOR_ID: ActorID = 10; - - let eam_state_cid = state_tree - .store() - .put_cbor(&[(); 0], Code::Blake2b256) - .context(FailedToSetState("eam actor".to_owned()))?; - - let eam_actor_state = ActorState { - code: eam_code_cid, - state: eam_state_cid, - sequence: 0, - balance: Default::default(), - delegated_address: None, - }; - - state_tree.set_actor(EAM_ACTOR_ID, eam_actor_state); - Ok(()) -} diff --git a/testing/integration/src/bundle.rs b/testing/integration/src/bundle.rs deleted file mode 100644 index 4a52b1d6d..000000000 --- a/testing/integration/src/bundle.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use anyhow::anyhow; -use cid::Cid; -use futures::executor::block_on; -use fvm_ipld_blockstore::Blockstore; -use fvm_ipld_car::load_car_unchecked; - -// Import built-in actors -pub fn import_bundle(blockstore: &impl Blockstore, bundle: &[u8]) -> anyhow::Result { - match &*block_on(async { load_car_unchecked(blockstore, bundle).await })? { - [root] => Ok(*root), - _ => Err(anyhow!("multiple root CIDs in bundle")), - } -} - -pub fn import_bundle_from_path(blockstore: &impl Blockstore, path: &str) -> anyhow::Result { - let bundle_data = match std::fs::read(path) { - Ok(data) => data, - Err(what) => { - return Err(anyhow!("error reading bundle: {}", what)); - } - }; - - import_bundle(blockstore, &bundle_data) -} diff --git a/testing/integration/src/dummy.rs b/testing/integration/src/dummy.rs deleted file mode 100644 index 1e7f1ebd9..000000000 --- a/testing/integration/src/dummy.rs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use cid::Cid; -use fvm::externs::{Chain, Consensus, Externs, Rand}; -use fvm_ipld_encoding::DAG_CBOR; -use fvm_shared::IDENTITY_HASH; -use multihash::Multihash; -use rand::distributions::Alphanumeric; -use rand::{thread_rng, Rng}; -pub struct DummyExterns; - -impl Externs for DummyExterns {} - -impl Rand for DummyExterns { - fn get_chain_randomness( - &self, - _round: fvm_shared::clock::ChainEpoch, - ) -> anyhow::Result<[u8; 32]> { - let rng: String = thread_rng() - .sample_iter(&Alphanumeric) - .take(32) - .map(char::from) - .collect(); - - Ok(<[u8; 32]>::try_from(rng.into_bytes()).unwrap()) - } - - fn get_beacon_randomness( - &self, - _round: fvm_shared::clock::ChainEpoch, - ) -> anyhow::Result<[u8; 32]> { - let rng: String = thread_rng() - .sample_iter(&Alphanumeric) - .take(32) - .map(char::from) - .collect(); - - Ok(<[u8; 32]>::try_from(rng.into_bytes()).unwrap()) - } -} - -impl Consensus for DummyExterns { - fn verify_consensus_fault( - &self, - _h1: &[u8], - _h2: &[u8], - _extra: &[u8], - ) -> anyhow::Result<(Option, i64)> { - Ok((None, 0)) - } -} - -impl Chain for DummyExterns { - fn get_tipset_cid(&self, epoch: fvm_shared::clock::ChainEpoch) -> anyhow::Result { - Ok(Cid::new_v1( - DAG_CBOR, - Multihash::wrap(IDENTITY_HASH, &epoch.to_be_bytes()).unwrap(), - )) - } -} diff --git a/testing/integration/src/error.rs b/testing/integration/src/error.rs deleted file mode 100644 index 0aa03c3c3..000000000 --- a/testing/integration/src/error.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use cid::Cid; - -#[derive(thiserror::Error, Debug)] -/// Util errors for the intergration test framework. -pub(crate) enum Error { - #[error("could not find manifest information for cid: {0}")] - NoManifestInformation(Cid), - #[error("could not load builtin manifest")] - FailedToLoadManifest, - #[error("could not set state in tree for: {0}")] - FailedToSetState(String), - #[error("failed to flush tree")] - FailedToFlushTree, -} diff --git a/testing/integration/src/lib.rs b/testing/integration/src/lib.rs deleted file mode 100644 index 706162647..000000000 --- a/testing/integration/src/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod builtin; -pub mod bundle; -pub mod dummy; -pub mod error; -pub mod tester; -pub mod testkit; diff --git a/testing/integration/src/tester.rs b/testing/integration/src/tester.rs deleted file mode 100644 index 584e3e249..000000000 --- a/testing/integration/src/tester.rs +++ /dev/null @@ -1,432 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use anyhow::{anyhow, Context, Result}; -use cid::Cid; -use fvm::call_manager::DefaultCallManager; -use fvm::engine::EnginePool; -use fvm::executor::DefaultExecutor; -use fvm::externs::Externs; -use fvm::machine::{DefaultMachine, Machine, MachineContext, NetworkConfig}; -use fvm::state_tree::{ActorState, StateTree}; -use fvm::{init_actor, system_actor, DefaultKernel}; -use fvm_ipld_blockstore::{Block, Blockstore, MemoryBlockstore}; -use fvm_ipld_encoding::{ser, CborStore}; -use fvm_shared::address::{Address, Protocol}; -use fvm_shared::econ::TokenAmount; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_shared::{ActorID, IPLD_RAW}; -use lazy_static::lazy_static; -use libsecp256k1::{PublicKey, SecretKey}; -use multihash::Code; - -use crate::builtin::{fetch_builtin_code_cid, set_eam_actor, set_init_actor, set_sys_actor}; -use crate::dummy::DummyExterns; -use crate::error::Error::{FailedToFlushTree, NoManifestInformation}; - -const DEFAULT_BASE_FEE: u64 = 100; - -lazy_static! { - pub static ref INITIAL_ACCOUNT_BALANCE: TokenAmount = TokenAmount::from_atto(10000); -} - -pub trait Store: Blockstore + Sized + 'static {} - -pub type IntegrationExecutor = - DefaultExecutor>>>; - -pub type Account = (ActorID, Address); - -/// Execution options -#[derive(Clone, Debug, Default)] -pub struct ExecutionOptions { - /// Enables debug logging - pub debug: bool, - /// Enables gas tracing - pub trace: bool, - /// Enabls events - pub events: bool, -} - -pub struct Tester { - // Network version used in the test - nv: NetworkVersion, - // Builtin actors root Cid used in the Machine - builtin_actors: Cid, - // Accounts actor cid - accounts_code_cid: Cid, - // Placeholder code cid. - placeholder_code_cid: Cid, - // Custom code cid deployed by developer - code_cids: Vec, - // Executor used to interact with deployed actors. - pub executor: Option>, - // State tree constructed before instantiating the Machine - pub state_tree: Option>, - - // execution options for machine instantiation - pub options: Option, - - // ready if the machine has been instantiated - pub ready: bool, -} - -impl Tester -where - B: Blockstore, - E: Externs, -{ - pub fn new( - nv: NetworkVersion, - stv: StateTreeVersion, - builtin_actors: Cid, - blockstore: B, - ) -> Result { - let (manifest_version, manifest_data_cid): (u32, Cid) = - match blockstore.get_cbor(&builtin_actors)? { - Some((manifest_version, manifest_data)) => (manifest_version, manifest_data), - None => return Err(NoManifestInformation(builtin_actors).into()), - }; - - // Get sys and init actors code cid - let (sys_code_cid, init_code_cid, accounts_code_cid, placeholder_code_cid, eam_code_cid) = - fetch_builtin_code_cid(&blockstore, &manifest_data_cid, manifest_version)?; - - // Initialize state tree - let init_state = init_actor::State::new_test(&blockstore); - let mut state_tree = StateTree::new(blockstore, stv).map_err(anyhow::Error::from)?; - - // Deploy init, sys, and eam actors - let sys_state = system_actor::State { builtin_actors }; - set_sys_actor(&mut state_tree, sys_state, sys_code_cid)?; - set_init_actor(&mut state_tree, init_code_cid, init_state)?; - set_eam_actor(&mut state_tree, eam_code_cid)?; - - Ok(Tester { - nv, - builtin_actors, - executor: None, - code_cids: vec![], - state_tree: Some(state_tree), - accounts_code_cid, - placeholder_code_cid, - options: None, - ready: false, - }) - } - - /// Creates new accounts in the testing context - /// Inserts the specified number of accounts in the state tree, all with 1000 FIL,returning their IDs and Addresses. - pub fn create_accounts(&mut self) -> Result<[Account; N]> { - use rand::SeedableRng; - - let rng = &mut rand_chacha::ChaCha8Rng::seed_from_u64(8); - - let mut ret: [Account; N] = [(0, Address::default()); N]; - for account in ret.iter_mut().take(N) { - let priv_key = SecretKey::random(rng); - *account = self.make_secp256k1_account(priv_key, INITIAL_ACCOUNT_BALANCE.clone())?; - } - Ok(ret) - } - - pub fn create_account(&mut self) -> Result { - let accounts: [Account; 1] = self.create_accounts()?; - Ok(accounts[0]) - } - - pub fn set_account_sequence(&mut self, id: ActorID, new_sequence: u64) -> anyhow::Result<()> { - let state_tree = self - .state_tree - .as_mut() - .ok_or_else(|| anyhow!("Expected state tree in set_account_sequence."))?; - - let mut state = state_tree - .get_actor(id)? - .ok_or_else(|| anyhow!("Can't set sequence of account that doesn't exist."))?; - - state.sequence = new_sequence; - - state_tree.set_actor(id, state); - Ok(()) - } - - pub fn create_placeholder( - &mut self, - address: &Address, - init_balance: TokenAmount, - ) -> Result<()> { - assert_eq!(address.protocol(), Protocol::Delegated); - - let state_tree = self - .state_tree - .as_mut() - .ok_or_else(|| anyhow!("unable get state tree"))?; - - let id = state_tree.register_new_address(address).unwrap(); - let state: [u8; 32] = [0; 32]; - - let cid = state_tree.store().put_cbor(&state, Code::Blake2b256)?; - - let actor_state = ActorState { - code: self.placeholder_code_cid, - state: cid, - sequence: 0, - balance: init_balance, - delegated_address: Some(*address), - }; - - state_tree.set_actor(id, actor_state); - Ok(()) - } - - /// Set a new state in the state tree - pub fn set_state(&mut self, state: &S) -> Result { - // Put state in tree - let state_cid = self - .state_tree - .as_mut() - .unwrap() - .store() - .put_cbor(state, Code::Blake2b256)?; - - Ok(state_cid) - } - - /// Set a new actor at a given address, provided with a given token balance - /// and returns the CodeCID of the installed actor - pub fn set_actor_from_bin( - &mut self, - wasm_bin: &[u8], - state_cid: Cid, - actor_address: Address, - balance: TokenAmount, - ) -> Result { - // Register actor address (unless it's an ID address) - let actor_id = match actor_address.id() { - Ok(id) => id, - Err(_) => self - .state_tree - .as_mut() - .unwrap() - .register_new_address(&actor_address) - .unwrap(), - }; - - // Put the WASM code into the blockstore. - let code_cid = put_wasm_code(self.state_tree.as_mut().unwrap().store(), wasm_bin)?; - - // Add code cid to list of deployed contract - self.code_cids.push(code_cid); - - // Initialize actor state - let actor_state = ActorState::new( - code_cid, - state_cid, - balance, - 1, - match actor_address.protocol() { - Protocol::ID | Protocol::Actor => None, - _ => Some(actor_address), - }, - ); - - // Create actor - self.state_tree - .as_mut() - .unwrap() - .set_actor(actor_id, actor_state); - - Ok(code_cid) - } - - /// Sets the Machine and the Executor in our Tester structure. - pub fn instantiate_machine(&mut self, externs: E) -> Result<()> { - self.instantiate_machine_with_config(externs, |_| (), |_| ())?; - self.ready = true; - Ok(()) - } - - /// Sets the Machine and the Executor in our Tester structure. - /// - /// The `configure_nc` and `configure_mc` functions allows the caller to adjust the - /// `NetworkConfiguration` and `MachineContext` before they are used to instantiate - /// the rest of the components. - pub fn instantiate_machine_with_config( - &mut self, - externs: E, - configure_nc: F, - configure_mc: G, - ) -> Result<()> - where - F: FnOnce(&mut NetworkConfig), - G: FnOnce(&mut MachineContext), - { - // Take the state tree and leave None behind. - let mut state_tree = self.state_tree.take().unwrap(); - - // Calculate the state root. - let state_root = state_tree - .flush() - .map_err(anyhow::Error::from) - .context(FailedToFlushTree)?; - - // Consume the state tree and take the blockstore. - let blockstore = state_tree.into_store(); - - let mut nc = NetworkConfig::new(self.nv); - nc.override_actors(self.builtin_actors); - nc.enable_actor_debugging(); - - // Custom configuration. - configure_nc(&mut nc); - - let mut mc = nc.for_epoch(0, 0, state_root); - mc.set_base_fee(TokenAmount::from_atto(DEFAULT_BASE_FEE)) - .enable_tracing(); - - // Custom configuration. - configure_mc(&mut mc); - - let engine = EnginePool::new_default((&mc.network.clone()).into())?; - engine.acquire().preload(&blockstore, &self.code_cids)?; - - let machine = DefaultMachine::new(&mc, blockstore, externs)?; - - let executor = - DefaultExecutor::>>>::new( - engine, machine, - )?; - - self.executor = Some(executor); - self.ready = true; - - Ok(()) - } - - /// Get blockstore - pub fn blockstore(&self) -> &dyn Blockstore { - if self.executor.is_some() { - self.executor.as_ref().unwrap().blockstore() - } else { - self.state_tree.as_ref().unwrap().store() - } - } - - /// Put account with specified private key and balance - pub fn make_secp256k1_account( - &mut self, - priv_key: SecretKey, - init_balance: TokenAmount, - ) -> Result { - let pub_key = PublicKey::from_secret_key(&priv_key); - let pub_key_addr = Address::new_secp256k1(&pub_key.serialize())?; - - let state_tree = self - .state_tree - .as_mut() - .ok_or_else(|| anyhow!("unable get state tree"))?; - let assigned_addr = state_tree.register_new_address(&pub_key_addr).unwrap(); - let state = fvm::account_actor::State { - address: pub_key_addr, - }; - - let cid = state_tree.store().put_cbor(&state, Code::Blake2b256)?; - - let actor_state = ActorState { - code: self.accounts_code_cid, - state: cid, - sequence: 0, - balance: init_balance, - delegated_address: None, - }; - - state_tree.set_actor(assigned_addr, actor_state); - Ok((assigned_addr, pub_key_addr)) - } -} - -pub type BasicTester = Tester; -pub type BasicExecutor = IntegrationExecutor; - -// TODO refactor base Account type to include the seqno; -// requires refactoring all over the place hpwever. -pub struct BasicAccount { - pub account: Account, - pub seqno: u64, -} - -impl BasicTester { - pub fn new_basic_tester(bundle_path: String, options: ExecutionOptions) -> Result { - let blockstore = MemoryBlockstore::default(); - let bundle_cid = - match crate::bundle::import_bundle_from_path(&blockstore, bundle_path.as_str()) { - Ok(cid) => cid, - Err(what) => return Err(what), - }; - - let mut tester = Tester::new( - NetworkVersion::V20, - StateTreeVersion::V5, - bundle_cid, - blockstore, - )?; - - tester.options = Some(options); - tester.ready = false; - - Ok(tester) - } - - pub fn create_basic_account(&mut self) -> Result { - let accounts: [Account; 1] = self.create_accounts()?; - Ok(BasicAccount { - account: accounts[0], - seqno: 0, - }) - } - - pub fn create_basic_accounts(&mut self) -> Result<[BasicAccount; N]> { - let accounts: [Account; N] = self.create_accounts()?; - Ok(accounts.map(|a| BasicAccount { - account: a, - seqno: 0, - })) - } - - pub fn with_executor(&mut self, f: F) -> Result - where - F: FnOnce(&mut BasicExecutor) -> Result, - { - self.prepare_execution()?; - f(self.executor.as_mut().unwrap()) - } - - fn prepare_execution(&mut self) -> Result<()> { - if !self.ready { - if let Some(options) = self.options.clone() { - self.instantiate_machine_with_config( - DummyExterns, - |cfg| cfg.actor_debugging = options.debug, - |mc| mc.tracing = options.trace, - )?; - } else { - self.instantiate_machine(DummyExterns)?; - } - self.ready = true - } - Ok(()) - } -} - -/// Inserts the WASM code for the actor into the blockstore. -fn put_wasm_code(blockstore: &impl Blockstore, wasm_binary: &[u8]) -> Result { - let cid = blockstore.put( - Code::Blake2b256, - &Block { - codec: IPLD_RAW, - data: wasm_binary, - }, - )?; - Ok(cid) -} diff --git a/testing/integration/src/testkit/fevm.rs b/testing/integration/src/testkit/fevm.rs deleted file mode 100644 index c06d3eb0b..000000000 --- a/testing/integration/src/testkit/fevm.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT - -use anyhow::Result; -use fvm::executor::{ApplyKind, ApplyRet, Executor}; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::{strict_bytes, BytesSer, RawBytes}; -use fvm_shared::address::Address; -use fvm_shared::message::Message; -use fvm_shared::{ActorID, METHOD_CONSTRUCTOR}; -use num_traits::Zero; - -use crate::tester::{BasicAccount, BasicTester}; - -pub const EAM_ADDRESS: Address = Address::new_id(10); -pub const DEFAULT_GAS: u64 = 10_000_000_000; - -pub fn create_contract( - tester: &mut BasicTester, - owner: &mut BasicAccount, - contract: &[u8], -) -> Result { - let create_msg = Message { - from: owner.account.1, - to: EAM_ADDRESS, - gas_limit: DEFAULT_GAS, - method_num: EAMMethod::CreateExternal as u64, - params: RawBytes::serialize(BytesSer(contract)).unwrap(), - value: Zero::zero(), - sequence: owner.seqno, - ..Message::default() - }; - let create_mlen = create_msg.params.len(); - - let create_res = tester - .with_executor(|e| e.execute_message(create_msg, ApplyKind::Explicit, create_mlen))?; - - owner.seqno += 1; - Ok(create_res) -} - -pub fn invoke_contract( - tester: &mut BasicTester, - src: &mut BasicAccount, - dest: Address, - input_data: &[u8], - gas: u64, -) -> Result { - let invoke_msg = Message { - from: src.account.1, - to: dest, - sequence: src.seqno, - gas_limit: gas, - method_num: EVMMethod::InvokeContract as u64, - params: RawBytes::serialize(BytesSer(input_data)).unwrap(), - ..Message::default() - }; - let invoke_mlen = invoke_msg.params.len(); - - let invoke_res = tester - .with_executor(|e| e.execute_message(invoke_msg, ApplyKind::Explicit, invoke_mlen))?; - - src.seqno += 1; - Ok(invoke_res) -} - -////////////////////////////////////////////////////////////////////////////////////////// -// we could theoretically have a dependency on the builtin actors themselves and reuse the -// actual definitions but it is currently a mess with the branches, so we just copy the types -///////////////////////////////////////////////////////////////////////////////////////// -#[repr(u64)] -pub enum EAMMethod { - Constructor = METHOD_CONSTRUCTOR, - Create = 2, - Create2 = 3, - CreateExternal = 4, -} - -#[repr(u64)] -pub enum EVMMethod { - Constructor = METHOD_CONSTRUCTOR, - Resurrect = 2, - GetBytecode = 3, - GetBytecodeHash = 4, - GetStorageAt = 5, - InvokeContractDelegate = 6, - // it is very unfortunate but the hasher creates a circular dependency, so we use the raw - // number. - //InvokeContract = frc42_dispatch::method_hash!("InvokeEVM"), - InvokeContract = 3844450837, -} - -#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, Copy, PartialEq, Eq)] -pub struct EthAddress(#[serde(with = "strict_bytes")] pub [u8; 20]); - -#[derive(Serialize_tuple, Deserialize_tuple)] -pub struct CreateReturn { - pub actor_id: ActorID, - pub robust_address: Option
, - pub eth_address: EthAddress, -} diff --git a/testing/integration/src/testkit/mod.rs b/testing/integration/src/testkit/mod.rs deleted file mode 100644 index 22aa7197c..000000000 --- a/testing/integration/src/testkit/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT - -pub mod fevm; diff --git a/testing/integration/tests/address_test.rs b/testing/integration/tests/address_test.rs deleted file mode 100644 index 4d68f309b..000000000 --- a/testing/integration/tests/address_test.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod bundles; -use bundles::*; -use fvm::executor::{ApplyKind, Executor}; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::ADDRESS_ACTOR_BINARY; -use num_traits::Zero; - -#[test] -fn basic_address_tests() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let [(_sender_id, sender_address)] = tester.create_accounts().unwrap(); - - let wasm_bin = ADDRESS_ACTOR_BINARY; - - // Set actor state - let actor_state = [(); 0]; - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.as_mut().unwrap(); - - // Test all methods. - for (seq, method) in (2..=5).enumerate() { - let message = Message { - from: sender_address, - to: actor_address, - gas_limit: 1000000000, - method_num: method, - sequence: seq as u64, - ..Message::default() - }; - - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - assert!( - res.msg_receipt.exit_code.is_success(), - "{:?}", - res.failure_info - ); - } -} diff --git a/testing/integration/tests/basic_send_test.rs b/testing/integration/tests/basic_send_test.rs deleted file mode 100644 index 87a00a03b..000000000 --- a/testing/integration/tests/basic_send_test.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#![cfg(test)] - -mod bundles; -use bundles::*; -use fvm::executor::{ApplyKind, Executor}; -use fvm::gas::GasCharge; -use fvm::machine::Machine; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_shared::METHOD_SEND; - -#[test] -fn basic_send() { - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let (_, sender) = tester.create_account().unwrap(); - - // Send to an f4 to create a placeholder. Otherwise, we end up invoking a constructor. - let receiver = Address::new_delegated(10, b"foobar").expect("failed to construct f4 address"); - - tester.instantiate_machine(DummyExterns).unwrap(); - let executor = tester.executor.as_mut().unwrap(); - - struct Case { - to: Address, - value: u64, - trace: Vec, - } - - let cases = { - let pl = executor.context().price_list; - [ - // Create the actor. - Case { - to: receiver, - value: 0, - trace: vec![ - // No explicit charges for updating/looking this up. - pl.on_chain_message(100), - // Create the actor. We do charge for the update/lookup because it didn't exist. - pl.on_create_actor(true), - pl.on_actor_lookup(), - pl.on_actor_update(), - ], - }, - // Poke it. Don't charge for an update because we don't transfer value. - Case { - to: receiver, - value: 0, - trace: vec![ - // No explicit charges for updating/looking this up. - pl.on_chain_message(100), - // No charges because we're not transferring value or executing code. - ], - }, - // Transfer value, update the target actor. - Case { - to: receiver, - value: 1, - trace: vec![ - // No explicit charges for updating/looking this up. - pl.on_chain_message(100), - // Transfer - pl.on_value_transfer(), - // Charge to update the target actor due to the value transfer. - pl.on_actor_update(), - ], - }, - // Transfer value to a system actor. We don't expect a state-update charge in this case. - Case { - to: Address::new_id(10), - value: 1, - trace: vec![ - // No explicit charges for updating/looking this up. - pl.on_chain_message(100), - // Transfer - pl.on_value_transfer(), - ], - }, - ] - }; - - for (i, case) in cases.into_iter().enumerate() { - let message = Message { - from: sender, - to: case.to, - gas_limit: 1000000000, - method_num: METHOD_SEND, - sequence: i as u64, - value: TokenAmount::from_atto(case.value), - ..Message::default() - }; - - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - assert!(res.msg_receipt.exit_code.is_success()); - - let charges: Vec<_> = res - .exec_trace - .into_iter() - .filter_map(|x| match x { - fvm::trace::ExecutionEvent::GasCharge(charge) => Some(charge), - _ => None, - }) - .collect(); - - assert_eq!(charges, case.trace); - } -} diff --git a/testing/integration/tests/bundles/mod.rs b/testing/integration/tests/bundles/mod.rs deleted file mode 100644 index 87d991115..000000000 --- a/testing/integration/tests/bundles/mod.rs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use std::collections::BTreeMap; - -use anyhow::Context; -use fvm::externs::Externs; -use fvm_integration_tests::bundle; -use fvm_integration_tests::tester::{BasicTester, ExecutionOptions, Tester}; -use fvm_ipld_blockstore::{Blockstore, MemoryBlockstore}; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use lazy_static::lazy_static; - -lazy_static! { - static ref BUNDLES: BTreeMap = - [(NetworkVersion::V18, actors_v10::BUNDLE_CAR),] - .into_iter() - .collect(); -} - -#[allow(dead_code)] -pub fn new_tester( - nv: NetworkVersion, - stv: StateTreeVersion, - blockstore: B, -) -> anyhow::Result> { - let bundle = BUNDLES - .get(&nv) - .with_context(|| format!("unsupported network version {nv}"))?; - let root = bundle::import_bundle(&blockstore, bundle)?; - Tester::new(nv, stv, root, blockstore) -} - -#[allow(dead_code)] -pub fn new_basic_tester(options: ExecutionOptions) -> anyhow::Result { - let blockstore = MemoryBlockstore::default(); - let bundle = BUNDLES - .get(&NetworkVersion::V18) - .with_context(|| format!("unsupported network version {}", NetworkVersion::V18))?; - - let bundle_cid = bundle::import_bundle(&blockstore, bundle)?; - - let mut tester = Tester::new( - NetworkVersion::V18, - StateTreeVersion::V5, - bundle_cid, - blockstore, - )?; - - tester.options = Some(options); - tester.ready = false; - - Ok(tester) -} diff --git a/testing/integration/tests/calibration/mod.rs b/testing/integration/tests/calibration/mod.rs deleted file mode 100644 index f8e6e1c28..000000000 --- a/testing/integration/tests/calibration/mod.rs +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#![allow(dead_code)] - -use std::io::Write; -use std::path::{Path, PathBuf}; - -use fvm::executor::{ApplyKind, ApplyRet, Executor}; -use fvm::gas::Gas; -use fvm::trace::ExecutionEvent; -use fvm_integration_tests::bundle; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::{Account, Tester}; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::RawBytes; -use fvm_shared::address::Address; -use fvm_shared::crypto::signature::SECP_SIG_LEN; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::GAS_CALIBRATION_ACTOR_BINARY; -use lazy_static::lazy_static; -use num_traits::Zero; -use serde::Serialize; - -pub const ENOUGH_GAS: Gas = Gas::new(1_000_000_000); - -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug, Default)] -pub struct State { - pub count: u64, -} - -pub struct TestEnv { - pub tester: Tester, - pub sender: Account, - pub actor_address: Address, - pub actor_sequence: u64, -} - -impl TestEnv { - /// Call a method with some parameters and return the results. - /// - /// Panics if the message hasn't executed successfully. - pub fn execute_or_die(&mut self, method_num: u64, params: &P) -> ApplyRet { - let raw_params = RawBytes::serialize(params).unwrap(); - let message = Message { - from: self.sender.1, - to: self.actor_address, - sequence: self.actor_sequence, - gas_limit: ENOUGH_GAS.as_milligas(), - method_num, - params: raw_params, - ..Message::default() - }; - - self.actor_sequence += 1; - - let ret = self - .tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if let Some(failure) = ret.failure_info { - panic!("message execution failed: {failure}"); - } - assert_eq!(ret.msg_receipt.exit_code, ExitCode::OK); - - ret - } -} - -lazy_static! { - /// The maximum parallelism when processing test vectors. - pub static ref OUTPUT_DIR: PathBuf = std::env::var("OUTPUT_DIR") - .map(|d| Path::new(&d).to_path_buf()) - .ok().unwrap_or_else(|| { - Path::new(env!("CARGO_MANIFEST_DIR")).to_path_buf().join("../calibration/measurements").join("out") - }); -} - -/// An observation that we can use to estimate coefficients -/// to model time in terms of some variables. -#[derive(Serialize)] -pub struct Obs { - pub charge: String, - pub label: String, - pub elapsed_nanos: u128, - pub variables: Vec, - pub compute_gas: u64, -} - -#[derive(Serialize)] -pub struct RegressionResult { - pub label: String, - pub intercept: f64, - pub slope: f64, - pub r_squared: f64, -} - -const NOP_ACTOR: &str = r#" -(module - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - (i32.const 0) - ) -) -"#; - -// Utility function to instantiation integration tester -pub fn instantiate_tester() -> TestEnv { - let blockstore = MemoryBlockstore::default(); - let root = bundle::import_bundle(&blockstore, actors_v10::BUNDLE_CAR).unwrap(); - // Instantiate tester - let mut tester = - Tester::new(NetworkVersion::V18, StateTreeVersion::V5, root, blockstore).unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin( - GAS_CALIBRATION_ACTOR_BINARY, - state_cid, - actor_address, - TokenAmount::from_whole(100), - ) - .unwrap(); - - // Setup a basic no-op actor. - let nop_actor_bin = wat::parse_str(NOP_ACTOR).unwrap(); - let nop_actor_address = Address::new_id(10001); - tester - .set_actor_from_bin( - &nop_actor_bin, - state_cid, - nop_actor_address, - TokenAmount::zero(), - ) - .unwrap(); - - tester - .instantiate_machine_with_config( - DummyExterns, - |_| (), - |mc| { - mc.enable_tracing(); - }, - ) - .unwrap(); - - TestEnv { - tester, - sender: sender[0], - actor_address, - actor_sequence: 0, - } -} - -pub fn export(name: &str, obs: &Vec, regs: &Vec) -> std::io::Result<()> { - let out = &*OUTPUT_DIR; - let file_name = format!("{name}.jsonline"); - export_json(&out.join("regressions").join(&file_name), regs)?; - export_json(&out.join("observations").join(&file_name), obs)?; - Ok(()) -} - -pub fn export_json(path: &PathBuf, values: &Vec) -> std::io::Result<()> { - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent)?; - } - let mut output = std::fs::File::create(path)?; - - for value in values { - let line = serde_json::to_string(&value).unwrap(); - writeln!(&mut output, "{}", line)?; - } - - Ok(()) -} - -pub fn run_linear_regression(obs: &Vec) -> Vec { - // split the observations by label into groups - use std::collections::HashMap; - let mut obs_by_label = HashMap::new(); - for ob in obs { - obs_by_label - .entry(ob.label.to_owned()) - .or_insert(Vec::new()) - .push(Obs { - charge: ob.charge.to_string(), - label: ob.label.to_owned(), - elapsed_nanos: ob.elapsed_nanos, - variables: ob.variables.to_owned(), - compute_gas: ob.compute_gas, - }); - } - - // run linear regression on each item - let mut regs: Vec = Vec::new(); - for entries in obs_by_label.values() { - regs.push(least_squares(entries[0].label.to_owned(), entries, 0)); - } - - regs -} - -/// Linear regression between one of the variables and time. -/// -/// https://www.mathsisfun.com/data/least-squares-regression.html -pub fn least_squares(label: String, obs: &[Obs], var_idx: usize) -> RegressionResult { - let mut sum_x = 0f64; - let mut sum_y = 0f64; - let mut sum_x2 = 0f64; - let mut sum_xy = 0f64; - let n = obs.len() as f64; - - let xys = obs - .iter() - .map(|obs| { - let x = obs.variables[var_idx] as f64; - let y = obs.elapsed_nanos as f64; - (x, y) - }) - .collect::>(); - - for (x, y) in xys.iter() { - sum_y += y; - sum_x += x; - sum_x2 += x * x; - sum_xy += x * y; - } - - let m: f64 = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x); - let b: f64 = (sum_y - m * sum_x) / n; - - // R2 = 1 - RSS/TSS - // RSS = sum of squares of residuals - // TSS = total sum of squares - let mean_y = sum_y / n; - let mut tss = 0f64; - let mut rss = 0f64; - - for (x, y) in xys.iter() { - let f = m * x + b; - let e = y - f; - rss += e * e; - - let e = y - mean_y; - tss += e * e; - } - let r_squared = 1.0 - rss / tss; - - RegressionResult { - label, - intercept: b, - slope: m, - r_squared, - } -} - -pub fn collect_obs(ret: &ApplyRet, name: &str, label: &str, size: usize) -> Vec { - ret.exec_trace - .iter() - .filter_map(|t| match t { - ExecutionEvent::GasCharge(charge) if charge.name == name => Some(Obs { - charge: charge.name.to_string(), - label: label.to_owned(), - elapsed_nanos: charge.elapsed.get().unwrap().as_nanos(), - variables: vec![size], - compute_gas: charge.compute_gas.as_milligas(), - }), - _ => None, - }) - .collect() -} - -/// Drop a certain fraction of the observations with the highest time as outliers. -pub fn eliminate_outliers(mut obs: Vec, drop: f32, eliminate: Eliminate) -> Vec { - obs.sort_by_key(|obs| obs.elapsed_nanos); - let size = obs.len(); - let drop = (size as f32 * drop) as usize; - match eliminate { - Eliminate::Top => obs.into_iter().take(size - drop).collect(), - Eliminate::Bottom => obs.into_iter().skip(drop).collect(), - Eliminate::Both => obs.into_iter().skip(drop).take(size - 2 * drop).collect(), - } -} - -pub enum Eliminate { - Top, - Bottom, - Both, -} - -pub fn common_sizes() -> Vec { - let mut sizes: Vec = vec![0]; - sizes.extend( - [10, 100, 1_000, 10_000, 100_000] - .into_iter() - .flat_map(|i| (1..10).map(move |m| m * i)), - ); - sizes.push(1_000_000); - sizes -} - -pub fn secp_sign(sk: &libsecp256k1::SecretKey, data: &[u8]) -> [u8; SECP_SIG_LEN] { - let hash: [u8; 32] = blake2b_simd::Params::new() - .hash_length(32) - .to_state() - .update(data) - .finalize() - .as_bytes() - .try_into() - .unwrap(); - - let (sig, recovery_id) = libsecp256k1::sign(&libsecp256k1::Message::parse(&hash), sk); - - let mut signature = [0u8; SECP_SIG_LEN]; - signature[..64].copy_from_slice(&sig.serialize()); - signature[64] = recovery_id.serialize(); - signature -} diff --git a/testing/integration/tests/embryo_sender_test.rs b/testing/integration/tests/embryo_sender_test.rs deleted file mode 100644 index c6801a23d..000000000 --- a/testing/integration/tests/embryo_sender_test.rs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod bundles; - -#[test] -fn placeholder_as_sender() { - use bundles::*; - use fvm::executor::{ApplyKind, Executor}; - use fvm::machine::Machine; - use fvm_integration_tests::dummy::DummyExterns; - use fvm_integration_tests::tester::INITIAL_ACCOUNT_BALANCE; - use fvm_ipld_blockstore::MemoryBlockstore; - use fvm_shared::address::Address; - use fvm_shared::econ::TokenAmount; - use fvm_shared::message::Message; - use fvm_shared::state::StateTreeVersion; - use fvm_shared::version::NetworkVersion; - use fvm_shared::METHOD_SEND; - - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let initial_balance = TokenAmount::from_whole(100); - let to_send = TokenAmount::from_atto(20000); - - let [(_, receiver)] = tester.create_accounts().unwrap(); - - let sender = Address::new_delegated(10, b"foobar").expect("failed to construct address"); - tester - .create_placeholder(&sender, initial_balance.clone()) - .expect("failed to instantiate placeholder"); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.as_mut().unwrap(); - - let message = Message { - from: sender, - to: receiver, - gas_limit: 1000000000, - method_num: METHOD_SEND, - sequence: 0, - value: to_send.clone(), - ..Message::default() - }; - - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert!( - res.msg_receipt.exit_code.is_success(), - "{:?}", - res.failure_info - ); - - let receiver_balance = tester - .executor - .as_ref() - .unwrap() - .state_tree() - .get_actor_by_address(&receiver) - .expect("couldn't find receiver actor") - .expect("actor state didn't exist") - .balance; - - assert_eq!( - receiver_balance, - to_send.clone() + INITIAL_ACCOUNT_BALANCE.clone() - ); - - let sender_balance = tester - .executor - .as_ref() - .unwrap() - .state_tree() - .get_actor_by_address(&sender) - .expect("couldn't find receiver actor") - .expect("actor state didn't exist") - .balance; - - assert_eq!(sender_balance, initial_balance - to_send); -} diff --git a/testing/integration/tests/events_test.rs b/testing/integration/tests/events_test.rs deleted file mode 100644 index 44ac03e1c..000000000 --- a/testing/integration/tests/events_test.rs +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod bundles; -use bundles::*; -use fvm::executor::{ApplyKind, Executor}; -use fvm::machine::Machine; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::IntegrationExecutor; -use fvm_ipld_blockstore::{Blockstore, MemoryBlockstore}; -use fvm_ipld_encoding::to_vec; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::EVENTS_ACTOR_BINARY; -use num_traits::Zero; - -#[test] -fn events_test() { - let (mut executor, sender_address, actor_address) = setup(); - - // === Emits two events === - - let message = Message { - from: sender_address, - to: actor_address, - gas_limit: 1000000000, - method_num: 2, - sequence: 0, - ..Message::default() - }; - - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - - let gas_used = res.msg_receipt.gas_used; - - // Check that we got two events. - assert_eq!(2, res.events.len()); - - // Check the events AMT. - assert!(res.msg_receipt.events_root.is_some()); - // Check that we haven't inserted the events AMT in the blockstore. - assert!(!executor - .blockstore() - .has(&res.msg_receipt.events_root.unwrap()) - .unwrap()); - - // === Emits an improperly formatted event === - - let message = Message { - method_num: 3, - sequence: 1, - ..message - }; - - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - assert!(res.msg_receipt.events_root.is_none()); - - let counter: u64 = 10; - - // === Performs subcalls, each emitting 2 events and all succeeding === - let message = Message { - method_num: 4, - sequence: 2, - params: to_vec(&counter).unwrap().into(), - ..message - }; - - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - - // Check that we got twenty events, 2 per actor in the chain. - assert_eq!(20, res.events.len()); - - // === Performs subcalls, each emitting 2 events and reverting === - let message = Message { - method_num: 5, - sequence: 3, - params: to_vec(&counter).unwrap().into(), - ..message - }; - - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - - // Check that we got ten events events only; the events from the last five - // actors in the call stack were discarded due to an abort. - assert_eq!(10, res.events.len()); - - // === Out of gas records no events === - let message = Message { - method_num: 2, - sequence: 4, - gas_limit: gas_used - 1, - ..message - }; - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(ExitCode::SYS_OUT_OF_GAS, res.msg_receipt.exit_code); - assert!(res.msg_receipt.events_root.is_none()); - assert_eq!(0, res.events.len()); -} - -fn setup() -> ( - IntegrationExecutor, - Address, - Address, -) { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let [(_sender_id, sender)] = tester.create_accounts().unwrap(); - - let wasm_bin = EVENTS_ACTOR_BINARY; - - // Set actor state - let actor_state = [(); 0]; - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.unwrap(); - (executor, sender, actor) -} diff --git a/testing/integration/tests/fil_integer_overflow.rs b/testing/integration/tests/fil_integer_overflow.rs deleted file mode 100644 index 1c35cad32..000000000 --- a/testing/integration/tests/fil_integer_overflow.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm::executor::{ApplyKind, Executor}; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::{Account, Tester}; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::RawBytes; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::INTEGER_OVERFLOW_ACTOR_BINARY; -use num_traits::Zero; - -mod bundles; -use bundles::*; - -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug, Default)] -pub struct State { - pub value: i64, -} - -// Utility function to instantiation integration tester -fn instantiate_tester() -> (Account, Tester, Address) { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - // Get wasm bin - let wasm_bin = INTEGER_OVERFLOW_ACTOR_BINARY; - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - (sender[0], tester, actor_address) -} - -#[test] -fn integer_overflow() { - // Instantiate tester - let (sender, mut tester, actor_address) = instantiate_tester(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Params setup - let x: i64 = 10000000000; - let params = RawBytes::serialize(x).unwrap(); - - // Send message to set - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - params, - ..Message::default() - }; - - // Set inner state value - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!( - ExitCode::OK, - res.msg_receipt.exit_code, - "{}", - res.failure_info.unwrap() - ); - - // Read inner state value - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 3, - sequence: 1, - ..Message::default() - }; - - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - let current_state_value: i64 = res.msg_receipt.return_data.deserialize().unwrap(); - - assert_eq!(current_state_value, x); - - // Overflow inner state integer - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 2, - sequence: 2, - ..Message::default() - }; - - // Set inner state value - tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - // Read inner state value - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 3, - sequence: 3, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - let current_state_value: i64 = res.msg_receipt.return_data.deserialize().unwrap(); - - // Check overflow - let overflow_value: i64 = -5340232216128654848; - - assert_eq!(current_state_value, overflow_value); -} diff --git a/testing/integration/tests/fil_syscall.rs b/testing/integration/tests/fil_syscall.rs deleted file mode 100644 index 889ad65fe..000000000 --- a/testing/integration/tests/fil_syscall.rs +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm::call_manager::backtrace::Cause; -use fvm::executor::{ApplyFailure, ApplyKind, Executor}; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::{Account, Tester}; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::RawBytes; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ErrorNumber; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::MALFORMED_SYSCALL_ACTOR_BINARY; -use num_traits::Zero; - -mod bundles; -use bundles::*; - -const WAT_UNKNOWN_SYSCALL: &str = r#" - (module - (type $t0 (func)) - (type $t1 (func (param i32) (result i32))) - ;; Non existing syscall - (import "vm" "do_not_exist" (func $fvm_sdk::sys::vm::do_not_exist::syscall (type $t0))) - (func $invoke (export "invoke") (type $t1) (param $p0 i32) (result i32) - (call $fvm_sdk::sys::vm::do_not_exist::syscall) - (unreachable)) - (memory $memory (export "memory") 16) - (global $__data_end (export "__data_end") i32 (i32.const 1048576)) - (global $__heap_base (export "__heap_base") i32 (i32.const 1048576))) - "#; - -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug, Default)] -pub struct State { - pub count: i64, -} - -// Utility function to instantiation integration tester -fn instantiate_tester( - wasm_bin: &[u8], -) -> (Account, Tester, Address) { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - (sender[0], tester, actor_address) -} - -#[test] -fn non_existing_syscall() { - // Get wasm bin - let wasm_bin = wat::parse_str(WAT_UNKNOWN_SYSCALL).unwrap(); - - // Instantiate tester - let (sender, mut tester, actor_address) = instantiate_tester(&wasm_bin); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Params setup - let params = RawBytes::new(Vec::::new()); - - // Send message to set - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - params, - ..Message::default() - }; - - // Set inner state value - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - // Should be an internal VM assertion failed exit code - assert_eq!( - res.msg_receipt.exit_code.value(), - 10, - "exit code should be internal VM assertion failed" - ); - - // Should be unknown import - match res.failure_info.as_ref().unwrap() { - ApplyFailure::MessageBacktrace(backtrace) => { - assert!( - backtrace - .cause - .as_ref() - .unwrap() - .to_string() - .contains("unknown import"), - "error cause should be unknown import" - ); - } - _ => panic!("transaction result should have a backtrace"), - } -} - -#[test] -fn malformed_syscall_parameter() { - // Get wasm bin - let wasm_bin = MALFORMED_SYSCALL_ACTOR_BINARY; - - // Instantiate tester - let (sender, mut tester, actor_address) = instantiate_tester(wasm_bin); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Params setup - let params = RawBytes::new(Vec::::new()); - - // Send message to set - let message = Message { - from: sender.1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - params, - ..Message::default() - }; - - // Set inner state value - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - // Actor should panic - assert_eq!(res.msg_receipt.exit_code.value(), 4); - - // Should have failed with an invalid proof type message. - match res.failure_info.as_ref().unwrap() { - ApplyFailure::MessageBacktrace(backtrace) => match backtrace.cause.as_ref().unwrap() { - Cause::Syscall { error, message, .. } => { - assert!(message.contains("invalid proof type")); - - match error { - ErrorNumber::IllegalArgument => {} - _ => panic!("error type should be IllegalArgument"), - } - } - _ => panic!("failure cause should be syscall"), - }, - _ => panic!("transaction result should have a backtrace"), - } -} diff --git a/testing/integration/tests/gas_calibration_test.rs b/testing/integration/tests/gas_calibration_test.rs deleted file mode 100644 index 5f34fd6c4..000000000 --- a/testing/integration/tests/gas_calibration_test.rs +++ /dev/null @@ -1,434 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod calibration; -#[cfg(feature = "calibration")] -use calibration::*; -use fvm_gas_calibration_shared::*; - -#[test] -#[cfg(feature = "calibration")] -fn on_block() { - use std::collections::HashMap; - - use fvm::trace::ExecutionEvent; - use fvm_shared::error::ExitCode; - use rand::{thread_rng, Rng}; - - let sizes = common_sizes(); - let iterations = 100; - - let mut all_obs: HashMap> = Default::default(); - - // NOTE: For actually modeling the effect of IO, we shouldn't be using the memory blockstore. - // But at the same time when the contracts are executed the changes are buffered in mory, - // not everything actually gets written to the disk. - let mut te = instantiate_tester(); - - let mut rng = thread_rng(); - - // NOTE: The order of sizes (doing them ascending, descending, or shuffled), - // and whether we reuse the same tester or make a new one for each, does make a difference. - - for size in sizes.iter() { - let params = OnBlockParams { - size: *size, - iterations, - seed: rng.gen(), - }; - - let ret = te.execute_or_die(Method::OnBlock as u64, ¶ms); - - if let Some(failure) = ret.failure_info { - panic!("message execution failed: {failure}"); - } - assert_eq!(ret.msg_receipt.exit_code, ExitCode::OK); - - let mut iter_obs: HashMap> = Default::default(); - - for event in ret.exec_trace { - if let ExecutionEvent::GasCharge(charge) = event { - if charge.name.starts_with("OnBlock") { - if let Some(t) = charge.elapsed.get() { - let ob = Obs { - charge: charge.name.to_string(), - label: "n/a".into(), - elapsed_nanos: t.as_nanos(), - variables: vec![*size], - compute_gas: charge.compute_gas.as_milligas(), - }; - iter_obs.entry(charge.name.into()).or_default().push(ob); - } - } - } - } - // The first OnBlockRead is for reading the parameters. From OnBlockStat that's the only record. - iter_obs.get_mut("OnBlockRead").unwrap().remove(0); - iter_obs.get_mut("OnBlockStat").unwrap().remove(0); - - for (name, mut obs) in iter_obs { - if !obs.is_empty() { - // According to the charts, there are odd outliers. - obs = eliminate_outliers(obs, 0.02, Eliminate::Top); - - all_obs.entry(name).or_default().extend(obs); - } - } - } - - for (name, obs) in all_obs { - let regs = vec![least_squares("".into(), &obs, 0)]; - export(&name, &obs, ®s).unwrap(); - } -} - -// TODO (fridrik): Enable this test after closing #1699 -//#[test] -#[allow(dead_code)] -#[cfg(feature = "calibration")] -fn on_event_evm_shapes() { - use fvm_shared::event::Flags; - use rand::{thread_rng, Rng}; - - const CHARGE_VALIDATE: &str = "OnActorEventValidate"; - const CHARGE_ACCEPT: &str = "OnActorEventAccept"; - const METHOD: Method = Method::OnEvent; - - let entries = 1..=5; - let (key_size, value_size) = (2, 32); // 2 bytes per key, 32 bytes per value (topics) - let last_entry_value_sizes = (5u32..=13).map(|n| u64::pow(2, n) as usize); // 32 bytes to 8KiB (payload) - - let iterations = 500; - - let (mut validate_obs, mut accept_obs) = (Vec::new(), Vec::new()); - - let mut te = instantiate_tester(); - - let mut rng = thread_rng(); - - for entry_count in entries { - for last_entry_value_size in last_entry_value_sizes.clone() { - let label = format!("{entry_count:?}entries"); - let params = OnEventParams { - iterations, - // number of entries to emit - entries: entry_count, - mode: EventCalibrationMode::Shape((key_size, value_size, last_entry_value_size)), - flags: Flags::FLAG_INDEXED_ALL, - seed: rng.gen(), - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - // Estimated length of the CBOR payload (confirmed with observations) - // 1 is the list header; 5 per entry CBOR overhead + flags. - let len = 1 - + ((entry_count - 1) * value_size) - + last_entry_value_size - + entry_count * key_size - + entry_count * 5; - - { - let mut series = collect_obs(&ret.clone(), CHARGE_VALIDATE, &label, len); - series = eliminate_outliers(series, 0.02, Eliminate::Top); - validate_obs.extend(series); - }; - - { - let mut series = collect_obs(&ret.clone(), CHARGE_ACCEPT, &label, len); - series = eliminate_outliers(series, 0.02, Eliminate::Top); - accept_obs.extend(series); - }; - } - } - - for (obs, name) in vec![(validate_obs, CHARGE_VALIDATE), (accept_obs, CHARGE_ACCEPT)].iter() { - let regression = run_linear_regression(obs); - - export(name, obs, ®ression).unwrap(); - } -} - -// intentionally left disabled since we're not interested in these observations at this stage. -#[allow(dead_code)] -fn on_event_target_size() { - const CHARGE_VALIDATE: &str = "OnActorEventValidate"; - const CHARGE_ACCEPT: &str = "OnActorEventAccept"; - const METHOD: Method = Method::OnEvent; - - use calibration::*; - use fvm_shared::event::Flags; - use rand::{thread_rng, Rng}; - - let mut config: Vec<(usize, usize)> = vec![]; - // 1 entry, ranging 8..1024 bytes - config.extend((3u32..=10).map(|n| (1usize, u64::pow(2, n) as usize))); - // 2 entry, ranging 16..1024 bytes - config.extend((4u32..=10).map(|n| (2usize, u64::pow(2, n) as usize))); - // 4 entries, ranging 32..1024 bytes - config.extend((5u32..=10).map(|n| (4usize, u64::pow(2, n) as usize))); - // 8 entries, ranging 64..1024 bytes - config.extend((6u32..=10).map(|n| (8usize, u64::pow(2, n) as usize))); - // 16 entries, ranging 128..1024 bytes - config.extend((7u32..=10).map(|n| (16usize, u64::pow(2, n) as usize))); - // 32 entries, ranging 256..1024 bytes - config.extend((8u32..=10).map(|n| (32usize, u64::pow(2, n) as usize))); - // 64 entries, ranging 512..1024 bytes - config.extend((9u32..=10).map(|n| (64usize, u64::pow(2, n) as usize))); - - let iterations = 500; - - let (mut validate_obs, mut accept_obs) = (Vec::new(), Vec::new()); - - let mut te = instantiate_tester(); - - let mut rng = thread_rng(); - - for (entries, target_size) in config.iter() { - let label = format!("{entries:?}entries"); - let params = OnEventParams { - iterations, - // number of entries to emit - entries: *entries, - // target size of the encoded CBOR; this is approximate. - mode: EventCalibrationMode::TargetSize(*target_size), - flags: Flags::FLAG_INDEXED_ALL, - seed: rng.gen(), - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - { - let mut series = collect_obs(&ret.clone(), CHARGE_VALIDATE, &label, *target_size); - series = eliminate_outliers(series, 0.02, Eliminate::Top); - validate_obs.extend(series); - }; - - { - let mut series = collect_obs(&ret.clone(), CHARGE_ACCEPT, &label, *target_size); - series = eliminate_outliers(series, 0.02, Eliminate::Top); - accept_obs.extend(series); - }; - } - - for (obs, name) in &[(validate_obs, CHARGE_VALIDATE), (accept_obs, CHARGE_ACCEPT)] { - let regression = run_linear_regression(obs); - - export(name, obs, ®ression).unwrap(); - } -} - -#[test] -#[cfg(feature = "calibration")] -fn on_hashing() { - use fvm_shared::crypto::hash::SupportedHashes; - use rand::{thread_rng, Rng}; - - const CHARGE_NAME: &str = "OnHashing"; - const METHOD: Method = Method::OnHashing; - - let hashers = vec![ - SupportedHashes::Sha2_256, - SupportedHashes::Blake2b256, - SupportedHashes::Blake2b512, - SupportedHashes::Keccak256, - SupportedHashes::Ripemd160, - ]; - - let sizes = common_sizes(); - let iterations = 100; - - let mut te = instantiate_tester(); - let mut obs = Vec::new(); - let mut rng = thread_rng(); - - for hasher in hashers.iter() { - let label = format!("{hasher:?}"); - for size in sizes.iter() { - let params = OnHashingParams { - hasher: *hasher as u64, - size: *size, - iterations, - seed: rng.gen(), - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - let iter_obs = collect_obs(&ret, CHARGE_NAME, &label, *size); - - // According to the charts there is always an outlier with 10x runtime, - // which can throw off the model. Maybe it's while some things are warming up. - // Seems to be present at each call, so once per size. I'll just throw these away. - let iter_obs = eliminate_outliers(iter_obs, 0.02, Eliminate::Top); - - obs.extend(iter_obs); - } - } - - let regression = run_linear_regression(&obs); - - export(CHARGE_NAME, &obs, ®ression).unwrap(); -} - -#[test] -#[cfg(feature = "calibration")] -fn on_recover_secp_public_key() { - use rand::{thread_rng, Rng, RngCore}; - - const CHARGE_NAME: &str = "OnRecoverSecpPublicKey"; - const METHOD: Method = Method::OnRecoverSecpPublicKey; - - // Just doing it for uniformity. - let sizes = common_sizes(); - let iterations = 10; - - let mut te = instantiate_tester(); - let mut obs = Vec::new(); - let mut rng = thread_rng(); - - // Generate a signature over some data to ensure it's not complete rubbish. - let mut data = vec![0u8; 100]; - rng.fill_bytes(&mut data); - - let sk = libsecp256k1::SecretKey::random(&mut rng); - let sig = secp_sign(&sk, &data); - - for size in sizes.iter() { - let params = OnRecoverSecpPublicKeyParams { - iterations, - size: *size, - signature: sig.to_vec(), - seed: rng.gen(), - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - let iter_obs = collect_obs(&ret, CHARGE_NAME, "n/a", *size); - //let iter_obs = eliminate_outliers(iter_obs, 0.02, Eliminate::Top); - - obs.extend(iter_obs); - } - - let regs = vec![least_squares("".into(), &obs, 0)]; - - export(CHARGE_NAME, &obs, ®s).unwrap(); -} - -#[test] -#[cfg(feature = "calibration")] -fn on_send() { - const TRANSFER_CHARGE_NAME: &str = "OnValueTransfer"; - const INVOKE_CHARGE_NAME: &str = "OnMethodInvocation"; - const METHOD: Method = Method::OnSend; - - let iterations = 100; - - let mut te = instantiate_tester(); - let mut invoke_obs = Vec::new(); - let mut transfer_obs = Vec::new(); - - for invoke in [true, false] { - for value_transfer in [true, false] { - let label = match (invoke, value_transfer) { - (true, true) => "invoke-and-transfer", - (false, true) => "transfer-only", - (true, false) => "invoke-only", - (false, false) => continue, - }; - let params = OnSendParams { - iterations, - value_transfer, - invoke, - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - let both = (value_transfer == invoke) as usize; - - if value_transfer { - let iter_transfer_obs = collect_obs(&ret, TRANSFER_CHARGE_NAME, label, both); - let iter_transfer_obs = eliminate_outliers(iter_transfer_obs, 0.02, Eliminate::Top); - transfer_obs.extend(iter_transfer_obs); - } - - if invoke { - let iter_invoke_obs = collect_obs(&ret, INVOKE_CHARGE_NAME, label, both); - let iter_invoke_obs = eliminate_outliers(iter_invoke_obs, 0.02, Eliminate::Top); - invoke_obs.extend(iter_invoke_obs); - } - } - } - - let transfer_regs = vec![least_squares("".into(), &transfer_obs, 0)]; - export(TRANSFER_CHARGE_NAME, &transfer_obs, &transfer_regs).unwrap(); - let invoke_regs = vec![least_squares("".into(), &invoke_obs, 0)]; - export(INVOKE_CHARGE_NAME, &invoke_obs, &invoke_regs).unwrap(); -} - -#[test] -#[cfg(feature = "calibration")] -fn on_verify_signature() { - use bls_signatures::Serialize; - use fvm_shared::address::Address; - use fvm_shared::crypto::signature::SignatureType; - use rand::{thread_rng, Rng, RngCore}; - - const CHARGE_NAME: &str = "OnVerifySignature"; - const METHOD: Method = Method::OnVerifySignature; - - let sig_types = vec![SignatureType::BLS, SignatureType::Secp256k1]; - - let sizes = common_sizes(); - let iterations = 100; - - let mut te = instantiate_tester(); - let mut obs = Vec::new(); - let mut rng = thread_rng(); - - // Just some random data over which we can generate an example signature. - // Having a valid BLS signature is important otherwise verification is - // an instant rejection without hasing the input data. - let mut data = vec![0u8; 100]; - rng.fill_bytes(&mut data); - - for sig_type in sig_types.iter() { - let label = format!("{sig_type:?}"); - - let (signer, signature) = match sig_type { - SignatureType::Secp256k1 => { - let sk = libsecp256k1::SecretKey::random(&mut rng); - let pk = libsecp256k1::PublicKey::from_secret_key(&sk); - let addr = Address::new_secp256k1(&pk.serialize()).unwrap(); - let sig = secp_sign(&sk, &data).into(); - (addr, sig) - } - SignatureType::BLS => { - let sk = bls_signatures::PrivateKey::generate(&mut rng); - let pk = sk.public_key(); - let addr = Address::new_bls(&pk.as_bytes()).unwrap(); - let sig = sk.sign(&data).as_bytes(); - (addr, sig) - } - }; - - for size in sizes.iter() { - let params = OnVerifySignatureParams { - iterations, - size: *size, - signer, - signature: signature.clone(), - seed: rng.gen(), - }; - - let ret = te.execute_or_die(METHOD as u64, ¶ms); - - let iter_obs = collect_obs(&ret, CHARGE_NAME, &label, *size); - let iter_obs = eliminate_outliers(iter_obs, 0.02, Eliminate::Top); - - obs.extend(iter_obs); - } - } - - let regression = run_linear_regression(&obs); - - export(CHARGE_NAME, &obs, ®ression).unwrap(); -} diff --git a/testing/integration/tests/gasfuzz.rs b/testing/integration/tests/gasfuzz.rs deleted file mode 100644 index 340d063e2..000000000 --- a/testing/integration/tests/gasfuzz.rs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT - -mod bundles; - -use std::fs; - -use anyhow::Context; -use fvm::trace::{ExecutionEvent, ExecutionTrace}; -use fvm_integration_tests::{tester, testkit}; -use fvm_shared::address::Address; -use fvm_shared::error::ExitCode; - -const CONTRACT_PATH: &str = "../../tools/contracts/gas-stress/recursive.bin"; - -#[test] -fn test_gasfuzz() { - // get all charge points we want to fuzz at - let trace = gasfuzz_get_exec_trace(); - - let mut charge_points_milligas = Vec::new(); - let mut aggregate_charge = 0u64; - for tr in trace.iter() { - if let ExecutionEvent::GasCharge(ch) = tr { - let this_charge = ch.total(); - aggregate_charge += this_charge.as_milligas(); - charge_points_milligas.push(aggregate_charge); - } - } - - gasfuzz_fuzz(charge_points_milligas); -} - -fn gasfuzz_fuzz(charge_points_milligas: Vec) { - // set up the tester - let options = tester::ExecutionOptions { - debug: false, - trace: false, - events: false, - }; - - let mut tester = bundles::new_basic_tester(options).unwrap(); - let mut account = tester.create_basic_account().unwrap(); - let contract = hex::decode(fs::read_to_string(CONTRACT_PATH).unwrap()) - .context("error decoding contract") - .unwrap(); - - // create the contract - let create_res = testkit::fevm::create_contract(&mut tester, &mut account, &contract).unwrap(); - assert!(create_res.msg_receipt.exit_code.is_success()); - - let create_return: testkit::fevm::CreateReturn = - create_res.msg_receipt.return_data.deserialize().unwrap(); - let actor = Address::new_id(create_return.actor_id); - - println!( - "Fuzzing gas for {} charge points", - charge_points_milligas.len() - ); - // invoke contract at every charge point +/- 1 gas.; we should still error with OutOfGas - // skip the first chage, as that results in SYS_SENDER_STATE_INVALID - for cpm in charge_points_milligas[1..].iter() { - println!("Fuzzing gas at {}", cpm / 1000); - - let gas_lo = (cpm - 500) / 1000; - let invoke_res = - testkit::fevm::invoke_contract(&mut tester, &mut account, actor, &[], gas_lo).unwrap(); - assert_eq!(invoke_res.msg_receipt.exit_code, ExitCode::SYS_OUT_OF_GAS); - - let gas_hi = (cpm + 500) / 1000; - let invoke_res = - testkit::fevm::invoke_contract(&mut tester, &mut account, actor, &[], gas_hi).unwrap(); - assert_eq!(invoke_res.msg_receipt.exit_code, ExitCode::SYS_OUT_OF_GAS); - } -} - -fn gasfuzz_get_exec_trace() -> ExecutionTrace { - let options = tester::ExecutionOptions { - debug: false, - trace: true, - events: false, - }; - - let mut tester = bundles::new_basic_tester(options).unwrap(); - let mut account = tester.create_basic_account().unwrap(); - let contract = hex::decode(fs::read_to_string(CONTRACT_PATH).unwrap()) - .context("error decoding contract") - .unwrap(); - - let create_res = testkit::fevm::create_contract(&mut tester, &mut account, &contract).unwrap(); - assert_eq!( - create_res.msg_receipt.exit_code, - ExitCode::OK, - "{:?}", - create_res.failure_info - ); - - let create_return: testkit::fevm::CreateReturn = - create_res.msg_receipt.return_data.deserialize().unwrap(); - let actor = Address::new_id(create_return.actor_id); - - // this number is not arbitrary. - // contract recurses if gas > 10M, and empty contract run takes a tad less than 2M. - // So upon execution the contract shoud have just enough for 1 recursive call. - let gas = 12_000_000; - let invoke_res = - testkit::fevm::invoke_contract(&mut tester, &mut account, actor, &[], gas).unwrap(); - assert_eq!(invoke_res.msg_receipt.exit_code, ExitCode::SYS_OUT_OF_GAS); - - invoke_res.exec_trace -} diff --git a/testing/integration/tests/gaslimit_test.rs b/testing/integration/tests/gaslimit_test.rs deleted file mode 100644 index 5836586c7..000000000 --- a/testing/integration/tests/gaslimit_test.rs +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use bundles::*; -use fvm::executor::{ApplyKind, Executor}; -use fvm::machine::Machine; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_ipld_encoding::to_vec; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::GASLIMIT_ACTOR_BINARY; -use num_traits::Zero; -use serde_tuple::*; - -mod bundles; - -#[test] -fn gaslimit_test() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let [(_sender_id, sender_address), (_dest_id, dest_address)] = - tester.create_accounts().unwrap(); - - // Set actor - let actor_address = { - let addr = Address::new_id(10000); - let actor_state = [(); 0]; - let state_cid = tester.set_state(&actor_state).unwrap(); - let wasm_bin = GASLIMIT_ACTOR_BINARY; - tester - .set_actor_from_bin(wasm_bin, state_cid, addr, TokenAmount::zero()) - .unwrap(); - addr - }; - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.as_mut().unwrap(); - - #[derive(Serialize_tuple, Deserialize_tuple, PartialEq, Eq, Clone, Debug)] - struct Params { - dest: Address, - inner_gas_limit: u64, - exhaust: bool, - expect_err: bool, - } - - // - // SCENARIO A: with a child gas limit which is exceeded; inner send reverted, no event published. - // - let params = Params { - dest: dest_address, - inner_gas_limit: 10000000, - exhaust: true, - expect_err: true, - }; - - let message = Message { - from: sender_address, - to: actor_address, - gas_limit: 1000000000, - method_num: 2, - sequence: 0, - value: TokenAmount::from_atto(100), - params: to_vec(¶ms).unwrap().into(), - ..Message::default() - }; - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - assert_eq!( - ExitCode::OK, - res.msg_receipt.exit_code, - "{:?}", - res.failure_info - ); - assert_eq!(0, res.events.len()); - assert!(res.msg_receipt.events_root.is_none()); - assert_eq!( - TokenAmount::from_atto(10050), // got 50 from actor, starting with 10000 initial balance - executor - .state_tree() - .get_actor_by_address(&dest_address) - .unwrap() - .unwrap() - .balance - ); - - // - // SCENARIO B: with a child gas limit which is not exceeded; inner send preserved, event published. - // - let params = Params { - dest: dest_address, - inner_gas_limit: 10000000, - exhaust: false, - expect_err: false, - }; - let message = Message { - sequence: 1, - params: to_vec(¶ms).unwrap().into(), - ..message - }; - let res = executor - .execute_message(message.clone(), ApplyKind::Explicit, 100) - .unwrap(); - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - assert_eq!(1, res.events.len()); - assert!(res.msg_receipt.events_root.is_some()); - assert_eq!( - TokenAmount::from_atto(10110), // got another 60 from actor - executor - .state_tree() - .get_actor_by_address(&dest_address) - .unwrap() - .unwrap() - .balance - ); - - // - // SCENARIO C: with no child gas limit; inner send preserved, event published. - // - let params = Params { - dest: dest_address, - inner_gas_limit: 0, - exhaust: false, - expect_err: false, - }; - let message = Message { - sequence: 2, - params: to_vec(¶ms).unwrap().into(), - ..message - }; - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - assert_eq!(ExitCode::OK, res.msg_receipt.exit_code); - assert_eq!(1, res.events.len()); - assert!(res.msg_receipt.events_root.is_some()); - assert_eq!( - TokenAmount::from_atto(10170), // got another 60 from actor - executor - .state_tree() - .get_actor_by_address(&dest_address) - .unwrap() - .unwrap() - .balance - ); -} diff --git a/testing/integration/tests/main.rs b/testing/integration/tests/main.rs deleted file mode 100644 index 9c0162338..000000000 --- a/testing/integration/tests/main.rs +++ /dev/null @@ -1,1039 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use std::cell::RefCell; -use std::collections::HashSet; -use std::rc::Rc; - -use anyhow::anyhow; -use cid::Cid; -use fvm::executor::{ApplyKind, Executor, ThreadedExecutor}; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_integration_tests::tester::{Account, IntegrationExecutor}; -use fvm_ipld_blockstore::{Blockstore, MemoryBlockstore}; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::RawBytes; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::{ErrorNumber, ExitCode}; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::{ - CREATE_ACTOR_BINARY, EXIT_DATA_ACTOR_BINARY, HELLO_WORLD_ACTOR_BINARY, IPLD_ACTOR_BINARY, - OOM_ACTOR_BINARY, SSELF_ACTOR_BINARY, STACK_OVERFLOW_ACTOR_BINARY, SYSCALL_ACTOR_BINARY, -}; -use num_traits::Zero; - -mod bundles; -use bundles::*; -use fvm_shared::chainid::ChainID; -use fvm_shared::ActorID; - -/// The state object. -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug, Default)] -pub struct State { - pub count: u64, -} - -#[test] -fn hello_world() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = HELLO_WORLD_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code.value(), 16) -} - -#[test] -fn ipld() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = IPLD_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if !res.msg_receipt.exit_code.is_success() { - if let Some(info) = res.failure_info { - panic!("{}", info) - } else { - panic!("non-zero exit code {}", res.msg_receipt.exit_code) - } - } -} - -#[test] -fn syscalls() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - tester.set_account_sequence(sender[0].0, 100).unwrap(); - - let wasm_bin = SYSCALL_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester - .instantiate_machine_with_config( - DummyExterns, - |nc| { - nc.chain_id = ChainID::from(1); - }, - |_| {}, - ) - .unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - sequence: 100, // sequence == nonce - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if !res.msg_receipt.exit_code.is_success() { - if let Some(info) = res.failure_info { - panic!("{}", info) - } else { - panic!("non-zero exit code {}", res.msg_receipt.exit_code) - } - } -} - -#[test] -fn sself() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - println!("sender: {:?}", sender); - - let wasm_bin = SSELF_ACTOR_BINARY; - - // Set actor state - let actor_state = [(); 0]; - let state_cid = tester.set_state(&actor_state).unwrap(); - println!("state_cid: {:?}", state_cid); - - // Set actor - let actor_address = Address::new_id(10000); - println!("actor_address: {:?}", actor_address); - - let actor_code_cid = tester - .set_actor_from_bin( - wasm_bin, - state_cid, - actor_address, - TokenAmount::from_nano(1_000_000), - ) - .unwrap(); - println!("actor_code_cid: {:?}", actor_code_cid); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if !res.msg_receipt.exit_code.is_success() { - if let Some(info) = res.failure_info { - panic!("{}", info) - } else { - panic!("non-zero exit code {}", res.msg_receipt.exit_code) - } - } -} - -#[test] -fn create_actor() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - // kernel has a specific actor ID reserved when testing that may create other actors - const TEST_ACTOR_ALLOWED_TO_CALL_CREATE_ACTOR: ActorID = 98; - // only the init actor (1) and test actor (98) may create other actors, here we just - // pick some other random value - const TEST_ACTOR_NOT_ALLOWED_TO_CALL_CREATE_ACTOR: ActorID = 99; - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - tester.set_account_sequence(sender[0].0, 100).unwrap(); - - let wasm_bin = CREATE_ACTOR_BINARY; - - // Configure actor allowed to call create_actor - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - let actor_allowed_to_create_actor = Address::new_id(TEST_ACTOR_ALLOWED_TO_CALL_CREATE_ACTOR); - tester - .set_actor_from_bin( - wasm_bin, - state_cid, - actor_allowed_to_create_actor, - TokenAmount::zero(), - ) - .unwrap(); - - // Configure actor not allowed to call create_actor - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - let actor_not_allowed_to_create_actor = - Address::new_id(TEST_ACTOR_NOT_ALLOWED_TO_CALL_CREATE_ACTOR); - tester - .set_actor_from_bin( - wasm_bin, - state_cid, - actor_not_allowed_to_create_actor, - TokenAmount::zero(), - ) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - { - let message = Message { - from: sender[0].1, - to: actor_allowed_to_create_actor, - gas_limit: 1000000000, - method_num: 1, - sequence: 100, - ..Message::default() - }; - - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if !res.msg_receipt.exit_code.is_success() { - if let Some(info) = res.failure_info { - panic!("{}", info) - } else { - panic!("non-zero exit code {}", res.msg_receipt.exit_code) - } - } - } - - { - let message = Message { - from: sender[0].1, - to: actor_not_allowed_to_create_actor, - gas_limit: 1000000000, - method_num: 2, - sequence: 101, - ..Message::default() - }; - - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - if !res.msg_receipt.exit_code.is_success() { - if let Some(info) = res.failure_info { - panic!("{}", info) - } else { - panic!("non-zero exit code {}", res.msg_receipt.exit_code) - } - } - } -} - -#[test] -fn exit_data() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = EXIT_DATA_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - { - // Send constructor message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - sequence: 0, - ..Message::default() - }; - - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert!(res.msg_receipt.exit_code.is_success()); - assert_eq!( - res.msg_receipt.return_data, - RawBytes::from(vec![1u8, 2u8, 3u8, 3u8, 7u8]) - ); - } - - { - // send method 2 - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 2, - sequence: 1, - ..Message::default() - }; - - let res = tester - .executor - .as_mut() - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert!(res.msg_receipt.exit_code.is_success()); - assert_eq!( - res.msg_receipt.return_data, - RawBytes::from(vec![1u8, 2u8, 3u8, 3u8, 7u8]) - ); - } - - { - // send method 3 - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 3, - sequence: 2, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code.value(), 0x42); - assert_eq!( - res.msg_receipt.return_data, - RawBytes::from(vec![1u8, 2u8, 3u8, 3u8, 7u8]) - ); - } -} - -#[test] -fn native_stack_overflow() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = STACK_OVERFLOW_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester - .instantiate_machine_with_config( - DummyExterns, - |nc| { - // The stack overflow test consumed the default 512MiB before it hit the recursion limit. - nc.max_memory_bytes = 4 * (1 << 30); - nc.max_inst_memory_bytes = 4 * (1 << 30); - }, - |_| (), - ) - .unwrap(); - - let exec_test = - |exec: &mut ThreadedExecutor>, - method| { - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 10_000_000_000, - method_num: method, - sequence: method - 1, - ..Message::default() - }; - - let res = exec - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - eprintln!("STACKOVERFLOW RESULT = {:?}", res); - - res.msg_receipt.exit_code.value() - }; - - let mut executor = ThreadedExecutor(tester.executor.unwrap()); - - // on method 0 the test actor should run out of stack - assert_eq!( - exec_test(&mut executor, 1), - ExitCode::SYS_ILLEGAL_INSTRUCTION.value() - ); - - // on method 1 the test actor should run out of recursive call limit - assert_eq!( - exec_test(&mut executor, 2), - 0xc0000000 + (ErrorNumber::LimitExceeded as u32) - ); - - // on method 2 the test actor should finish successfully - assert_eq!(exec_test(&mut executor, 3), 0x80000042); -} - -fn test_exitcode(wat: &str, code: ExitCode) { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - // Get wasm bin - let wasm_bin = wat::parse_str(wat).unwrap(); - - // Set actor state - let actor_state = State { count: 0 }; - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(&wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 10_000_000, - method_num: 1, - ..Message::default() - }; - - let mut executor = ThreadedExecutor(tester.executor.unwrap()); - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code, code) -} - -#[test] -fn out_of_gas() { - test_exitcode( - r#"(module - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - (loop (br 0)) - (i32.const 1)))"#, - ExitCode::SYS_OUT_OF_GAS, - ) -} - -#[test] -fn unreachable() { - test_exitcode( - r#"(module - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - unreachable))"#, - ExitCode::SYS_ILLEGAL_INSTRUCTION, - ); -} - -#[test] -fn div_by_zero() { - test_exitcode( - r#"(module - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - i32.const 10 - i32.const 0 - i32.div_u))"#, - ExitCode::SYS_ILLEGAL_INSTRUCTION, - ); -} - -#[test] -fn out_of_stack() { - test_exitcode( - r#"(module - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - (i64.const 123) - (call 1) - (drop) - (i32.const 0)) - (func (param $x i64) (result i64) - (local.get 0) - (call 1)))"#, - ExitCode::SYS_ILLEGAL_INSTRUCTION, - ); -} - -#[test] -fn no_memory() { - // Make sure we can construct a module with 0 memory pages. - test_exitcode( - r#"(module - (type (;0;) (func (param i32) (result i32))) - (func (;0;) (type 0) (param i32) (result i32) - i32.const 0 - ) - (memory (;0;) 0) - (export "invoke" (func 0)) - (export "memory" (memory 0)) - ) - "#, - ExitCode::OK, - ); -} - -#[test] -fn backtraces() { - // Note: this test **does not actually assert anything**, but it's useful to - // let us peep into FVM backtrace generation under different scenarios. - const WAT_ABORT: &str = r#" - (module - ;; ipld::open - (type (;0;) (func (param i32 i32) (result i32))) - (import "ipld" "open" (func $fvm_sdk::sys::ipld::open::syscall (type 0))) - ;; vm::abort -> vm::exit - (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (import "vm" "exit" (func $fvm_sdk::sys::vm::exit::syscall (type 1))) - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - (i32.const 123) - (i32.const 123) - (call $fvm_sdk::sys::ipld::open::syscall) - (i32.const 0) - (i32.const 0) - (i32.const 0) - (call $fvm_sdk::sys::vm::exit::syscall) - unreachable - ) - ) - "#; - - const WAT_FAIL: &str = r#" - (module - ;; ipld::open - (type (;0;) (func (param i32 i32) (result i32))) - (import "ipld" "open" (func $fvm_sdk::sys::ipld::open::syscall (type 0))) - ;; vm::abort -> vm::exit - (type (;1;) (func (param i32 i32 i32 i32) (result i32))) - (import "vm" "exit" (func $fvm_sdk::sys::vm::exit::syscall (type 1))) - (memory (export "memory") 1) - (func (export "invoke") (param $x i32) (result i32) - (i32.const 128) - (memory.grow) - (i32.const 4) - (i32.const 25493505) - (i32.store) - (i32.const 8) - (i32.const 0) - (i32.store) - (i32.const 4) - (call $fvm_sdk::sys::ipld::open::syscall) - (i32.const 0) - (i32.const 0) - (i32.const 0) - (call $fvm_sdk::sys::vm::exit::syscall) - unreachable - ) - ) - "#; - - let blockstore = { - let b = FailingBlockstore::default(); - b.add_fail(Cid::try_from("baeaikaia").unwrap()); - Rc::new(b) - }; - - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - blockstore.clone(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let state_cid = tester.set_state(&State { count: 0 }).unwrap(); - - // Set an actor that aborts. - let (wasm_abort, wasm_fatal) = ( - wat::parse_str(WAT_ABORT).unwrap(), - wat::parse_str(WAT_FAIL).unwrap(), - ); - let (abort_address, fatal_address) = (Address::new_id(10000), Address::new_id(10001)); - tester - .set_actor_from_bin(&wasm_abort, state_cid, abort_address, TokenAmount::zero()) - .unwrap(); - tester - .set_actor_from_bin(&wasm_fatal, state_cid, fatal_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.as_mut().unwrap(); - - let message = Message { - from: sender[0].1, - gas_limit: 10_000_000, - method_num: 1, - ..Message::default() - }; - - let res = { - let message = Message { - to: abort_address, - ..message.clone() - }; - executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap() - }; - - println!("abort backtrace: {}", res.failure_info.unwrap()); - - let res = { - let message = Message { - to: fatal_address, - sequence: 1, - ..message.clone() - }; - executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap() - }; - - println!("fatal backtrace: {}", res.failure_info.unwrap()); - - // Now make it panic. - blockstore.panic(true); - - let res = { - let message = Message { - to: fatal_address, - sequence: 2, - ..message - }; - executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap() - }; - - println!("panic backtrace: {}", res.failure_info.unwrap()); -} - -#[test] -fn test_oom1() { - // Test OOM condition 1: one big chunk. - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = OOM_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: i64::MAX as u64, - method_num: 1, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code, ExitCode::SYS_ILLEGAL_INSTRUCTION); -} - -#[test] -fn test_oom2() { - // Test OOM condition 2: many small chunks - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = OOM_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: i64::MAX as u64, - method_num: 2, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code, ExitCode::SYS_ILLEGAL_INSTRUCTION); -} - -#[test] -fn test_oom3() { - // Test Out of Memory Condition 3: Not enough total wasm memory; this uses the hello - // actor with the smallest possible limit (1 WASM page). - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = HELLO_WORLD_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester - .instantiate_machine_with_config( - DummyExterns, - // - |ncfg| ncfg.max_memory_bytes = 65536, - |_| {}, - ) - .unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 1, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code, ExitCode::SYS_ILLEGAL_INSTRUCTION); -} - -#[test] -fn test_oom4() { - // Test Out of Memory Condition 4: Not enough instance wasm memory; this uses the oom - // actor with a single allocation that exceeds the instance limit. - - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let sender: [Account; 1] = tester.create_accounts().unwrap(); - - let wasm_bin = OOM_ACTOR_BINARY; - - // Set actor state - let actor_state = State::default(); - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester - .instantiate_machine_with_config( - DummyExterns, - // the multiplier has to be 17 or larger: - // could not prepare actor with code CID {...} - // Caused by: - // memory index 0 has a minimum page size of 17 which exceeds the limit of 16 - |ncfg| { - ncfg.max_inst_memory_bytes = 32 * 65536; - }, - |_| {}, - ) - .unwrap(); - - // Send message - let message = Message { - from: sender[0].1, - to: actor_address, - gas_limit: 1000000000, - method_num: 3, - ..Message::default() - }; - - let res = tester - .executor - .unwrap() - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - - assert_eq!(res.msg_receipt.exit_code, ExitCode::SYS_ILLEGAL_INSTRUCTION); -} - -#[derive(Default)] -pub struct FailingBlockstore { - fail_for: RefCell>, - target: MemoryBlockstore, - panic: RefCell, -} - -impl FailingBlockstore { - pub fn add_fail(&self, cid: Cid) { - self.fail_for.borrow_mut().insert(cid); - } - - pub fn panic(&self, enabled: bool) { - *self.panic.borrow_mut() = enabled - } -} - -impl Blockstore for FailingBlockstore { - fn get(&self, k: &Cid) -> anyhow::Result>> { - if self.fail_for.borrow().contains(k) { - if *self.panic.borrow() { - panic!("panic triggered") - } - return Err(anyhow!("an error was triggered")); - } - self.target.get(k) - } - - fn put_keyed(&self, k: &Cid, block: &[u8]) -> anyhow::Result<()> { - self.target.put_keyed(k, block) - } -} diff --git a/testing/integration/tests/readonly_test.rs b/testing/integration/tests/readonly_test.rs deleted file mode 100644 index a15c83a12..000000000 --- a/testing/integration/tests/readonly_test.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -mod bundles; -use bundles::*; -use fvm::executor::{ApplyKind, Executor}; -use fvm_integration_tests::dummy::DummyExterns; -use fvm_ipld_blockstore::MemoryBlockstore; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use fvm_shared::message::Message; -use fvm_shared::state::StateTreeVersion; -use fvm_shared::version::NetworkVersion; -use fvm_test_actors::wasm_bin::READONLY_ACTOR_BINARY; -use num_traits::Zero; - -#[test] -fn readonly_actor_tests() { - // Instantiate tester - let mut tester = new_tester( - NetworkVersion::V18, - StateTreeVersion::V5, - MemoryBlockstore::default(), - ) - .unwrap(); - - let [(_sender_id, sender_address)] = tester.create_accounts().unwrap(); - - let wasm_bin = READONLY_ACTOR_BINARY; - - // Set actor state - let actor_state = [(); 0]; - let state_cid = tester.set_state(&actor_state).unwrap(); - - // Set actor - let actor_address = Address::new_id(10000); - - tester - .set_actor_from_bin(wasm_bin, state_cid, actor_address, TokenAmount::zero()) - .unwrap(); - - // Instantiate machine - tester.instantiate_machine(DummyExterns).unwrap(); - - let executor = tester.executor.as_mut().unwrap(); - - let message = Message { - from: sender_address, - to: actor_address, - gas_limit: 1000000000, - method_num: 2, - sequence: 0, - value: TokenAmount::from_atto(100), - ..Message::default() - }; - - let res = executor - .execute_message(message, ApplyKind::Explicit, 100) - .unwrap(); - assert!( - res.msg_receipt.exit_code.is_success(), - "{:?}", - res.failure_info - ); - assert!(res.msg_receipt.events_root.is_none()); -} diff --git a/testing/test_actors/Cargo.toml b/testing/test_actors/Cargo.toml deleted file mode 100644 index 8e37e75ee..000000000 --- a/testing/test_actors/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "fvm_test_actors" -description = "Filecoin Virtual Machine WASM actor builder" -version = "0.1.0" -edition = "2021" -license = "MIT OR Apache-2.0" -authors = ["Protocol Labs", "Filecoin Core Devs"] -repository = "https://github.com/filecoin-project/ref-fvm" -publish = false diff --git a/testing/test_actors/actors/fil-address-actor/Cargo.toml b/testing/test_actors/actors/fil-address-actor/Cargo.toml deleted file mode 100644 index c098884b2..000000000 --- a/testing/test_actors/actors/fil-address-actor/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "fil_address_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_ipld_encoding = { version = "0.4.0" } -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-address-actor/src/actor.rs b/testing/test_actors/actors/fil-address-actor/src/actor.rs deleted file mode 100644 index d7409e24a..000000000 --- a/testing/test_actors/actors/fil-address-actor/src/actor.rs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_sdk as sdk; -use fvm_shared::address::{Address, SECP_PUB_LEN}; -use fvm_shared::bigint::Zero; -use fvm_shared::error::ExitCode; -use sdk::sys::ErrorNumber; - -#[no_mangle] -pub fn invoke(params: u32) -> u32 { - sdk::initialize(); - - match sdk::message::method_number() { - // on construction, make sure the address matches the expected one.` - 1 => { - // Check our address. - let msg_params = sdk::message::params_raw(params).unwrap().unwrap(); - assert_eq!(msg_params.codec, fvm_ipld_encoding::CBOR); - let expected_address: Option
= - fvm_ipld_encoding::from_slice(msg_params.data.as_slice()).unwrap(); - let actual_address = sdk::actor::lookup_delegated_address(sdk::message::receiver()); - assert_eq!(expected_address, actual_address, "addresses did not match"); - } - // send to an f1, then resolve. - 2 => { - // Create an account. - let addr = Address::new_secp256k1(&[0; SECP_PUB_LEN]).unwrap(); - assert!( - sdk::send::send(&addr, 0, None, Zero::zero(), None, Default::default()) - .unwrap() - .exit_code - .is_success() - ); - - // Resolve the ID address of the account. - let id = sdk::actor::resolve_address(&addr).expect("failed to find new account"); - - assert!( - sdk::actor::lookup_delegated_address(id).is_none(), - "did not expect a delegated address to be assigned" - ); - } - // send to an f4 in the EAM's namespace, then resolve. - 3 => { - // Create a placeholder. - let addr = - Address::new_delegated(10, b"foobar").expect("failed to construct f4 address"); - assert!( - sdk::send::send(&addr, 0, None, Zero::zero(), None, Default::default()) - .unwrap() - .exit_code - .is_success() - ); - - // Resolve the ID address of the placeholder. - let id = sdk::actor::resolve_address(&addr).expect("failed to find new placeholder"); - - // Lookup the address of the account. - let new_addr = - sdk::actor::lookup_delegated_address(id).expect("failed to lookup account address"); - assert_eq!(addr, new_addr, "addresses don't match"); - } - // send to an f4 of an unassigned ID address, then resolve. - 4 => { - // Create a placeholder. - let addr = - Address::new_delegated(999, b"foobar").expect("failed to construct f4 address"); - assert_eq!( - Err(ErrorNumber::NotFound), - sdk::send::send(&addr, 0, None, Zero::zero(), None, Default::default()), - "expected send to unassignable f4 address to fail" - ); - } - // check the system actor's delegated address (should not exist). - 5 => { - assert!( - sdk::actor::lookup_delegated_address(0).is_none(), - "system actor shouldn't have a 'delegated' address" - ); - } - _ => sdk::vm::abort( - ExitCode::USR_UNHANDLED_MESSAGE.value(), - Some("unknown method number"), - ), - } - 0 -} diff --git a/testing/test_actors/actors/fil-address-actor/src/lib.rs b/testing/test_actors/actors/fil-address-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-address-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-create-actor/Cargo.toml b/testing/test_actors/actors/fil-create-actor/Cargo.toml deleted file mode 100644 index cabb245c1..000000000 --- a/testing/test_actors/actors/fil-create-actor/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "fil_create_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -actors_v10_runtime = { package = "fil_actors_runtime", git = "https://github.com/filecoin-project/builtin-actors", branch = "master" } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-create-actor/src/actor.rs b/testing/test_actors/actors/fil-create-actor/src/actor.rs deleted file mode 100644 index 8abd6de74..000000000 --- a/testing/test_actors/actors/fil-create-actor/src/actor.rs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use actors_v10_runtime::runtime::builtins::Type; -use fvm_sdk as sdk; -use fvm_shared::address::{Address, SECP_PUB_LEN}; -use fvm_shared::error::ErrorNumber; - -#[no_mangle] -pub fn invoke(_: u32) -> u32 { - sdk::initialize(); - - let method = sdk::message::method_number(); - - match method { - // our actor ID is allowed to call create actor - 1 => { - // verify we can create a MultiSig actor without "delegated" address - // - let msig_addr = Address::new_id(1000); - let msig_cid = sdk::actor::get_code_cid_for_type(Type::Multisig as i32); - sdk::actor::create_actor(msig_addr.id().unwrap(), &msig_cid, None).unwrap(); - assert_eq!( - None, - sdk::actor::lookup_delegated_address(msig_addr.id().unwrap()) - ); - assert_eq!( - msig_cid, - sdk::actor::get_actor_code_cid(&msig_addr).unwrap() - ); - - // verify we can create an Account actor with "delegated" address - // - let acct_addr = Address::new_id(1001); - let acct_cid = sdk::actor::get_code_cid_for_type(Type::Account as i32); - let dlg_addr = Address::new_secp256k1(&[0u8; SECP_PUB_LEN]).unwrap(); - sdk::actor::create_actor(acct_addr.id().unwrap(), &acct_cid, Some(dlg_addr)).unwrap(); - assert_eq!( - Some(dlg_addr), - sdk::actor::lookup_delegated_address(acct_addr.id().unwrap()) - ); - assert_eq!( - acct_cid, - sdk::actor::get_actor_code_cid(&acct_addr).unwrap() - ); - - // creating a Placeholder without delegated" address should fail - // - let placeholder_cid = sdk::actor::get_code_cid_for_type(Type::Placeholder as i32); - assert_eq!( - Err(ErrorNumber::Forbidden), - sdk::actor::create_actor(1002, &placeholder_cid, None) - ); - - // verify that resolving address returns None if address cannot be resolved - // - let not_found_addresss = Address::new_actor(&[0u8; SECP_PUB_LEN]); - let res = sdk::actor::resolve_address(¬_found_addresss); - assert_eq!(res, None); - - // verify that looking up code ID of an actor returns None if its not found - // - assert_eq!(None, sdk::actor::get_actor_code_cid(&Address::new_id(1919))); - } - // our actor ID is not allowed to call create actor - 2 => { - // verify that creating a MultiSig actor without "delegated" address should fail - // - let msig_cid = sdk::actor::get_code_cid_for_type(Type::Multisig as i32); - let res = sdk::actor::create_actor(1000, &msig_cid, None); - assert_eq!(res, Err(ErrorNumber::Forbidden)); - - // verify that creating an Account actor with "delegated" address should fail - // - let acct_cid = sdk::actor::get_code_cid_for_type(Type::Account as i32); - let acct_addr = Address::new_secp256k1(&[0u8; SECP_PUB_LEN]).unwrap(); - let res = sdk::actor::create_actor(1001, &acct_cid, Some(acct_addr)); - assert_eq!(res, Err(ErrorNumber::Forbidden)); - } - _ => { - sdk::vm::abort( - fvm_shared::error::ExitCode::FIRST_USER_EXIT_CODE, - Some(format!("bad method {}", method).as_str()), - ); - } - } - - 0 -} diff --git a/testing/test_actors/actors/fil-create-actor/src/lib.rs b/testing/test_actors/actors/fil-create-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-create-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-events-actor/Cargo.toml b/testing/test_actors/actors/fil-events-actor/Cargo.toml deleted file mode 100644 index 11c19c5b3..000000000 --- a/testing/test_actors/actors/fil-events-actor/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "fil_events_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_ipld_encoding = { version = "0.4.0" } -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -serde = {version = "1.0.164", features = ["derive"] } -serde_tuple = "0.5.0" - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-events-actor/src/actor.rs b/testing/test_actors/actors/fil-events-actor/src/actor.rs deleted file mode 100644 index 32d3705c3..000000000 --- a/testing/test_actors/actors/fil-events-actor/src/actor.rs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_ipld_encoding::ipld_block::IpldBlock; -use fvm_ipld_encoding::IPLD_RAW; -use fvm_sdk as sdk; -use fvm_shared::address::Address; -use fvm_shared::bigint::Zero; -use fvm_shared::error::ExitCode; -use fvm_shared::event::{Entry, Flags}; - -#[no_mangle] -pub fn invoke(params: u32) -> u32 { - sdk::initialize(); - - const EMIT_SEVERAL_OK: u64 = 2; - const EMIT_MALFORMED: u64 = 3; - const EMIT_SUBCALLS: u64 = 4; - const EMIT_SUBCALLS_REVERT: u64 = 5; - - let payload1 = "abc".as_bytes(); - let payload2 = "def".as_bytes(); - let payload3 = "123456789 abcdefg 123456789".as_bytes(); - - // Emit a single-entry event. - let single_entry_evt = vec![Entry { - flags: Flags::all(), - key: "foo".to_owned(), - codec: IPLD_RAW, - value: payload1.to_owned(), - }]; - - let multi_entry = vec![ - Entry { - flags: Flags::all(), - key: "bar".to_owned(), - codec: IPLD_RAW, - value: payload2.to_owned(), - }, - Entry { - flags: Flags::FLAG_INDEXED_KEY | Flags::FLAG_INDEXED_VALUE, - key: "baz".to_string(), - codec: IPLD_RAW, - value: payload3.to_owned(), - }, - ]; - - match sdk::message::method_number() { - EMIT_SEVERAL_OK => { - sdk::event::emit_event(&single_entry_evt.into()).unwrap(); - sdk::event::emit_event(&multi_entry.into()).unwrap(); - } - EMIT_MALFORMED => unsafe { - // mangle an event. - let mut serialized = fvm_ipld_encoding::to_vec(&single_entry_evt).unwrap(); - serialized[1] = 0xff; - - assert!( - sdk::sys::event::emit_event(serialized.as_ptr(), serialized.len() as u32).is_err(), - "expected failed syscall" - ); - }, - EMIT_SUBCALLS => { - let msg_params = sdk::message::params_raw(params).unwrap().unwrap(); - assert_eq!(msg_params.codec, fvm_ipld_encoding::CBOR); - - let mut counter: u64 = fvm_ipld_encoding::from_slice(msg_params.data.as_slice()) - .expect("failed to deserialize param"); - - counter -= 1; - - // emit two events. - sdk::event::emit_event(&single_entry_evt.clone().into()).unwrap(); - sdk::event::emit_event(&single_entry_evt.into()).unwrap(); - - let our_addr = Address::new_id(sdk::message::receiver()); - - if counter > 0 { - sdk::send::send( - &our_addr, - EMIT_SUBCALLS, - IpldBlock::serialize_cbor(&counter).unwrap(), - Zero::zero(), - None, - Default::default(), - ) - .unwrap(); - } - } - EMIT_SUBCALLS_REVERT => { - let msg_params = sdk::message::params_raw(params).unwrap().unwrap(); - assert_eq!(msg_params.codec, fvm_ipld_encoding::CBOR); - - let mut counter: u64 = - fvm_ipld_encoding::from_slice(msg_params.data.as_slice()).unwrap(); - - counter -= 1; - - // emit two events. - sdk::event::emit_event(&single_entry_evt.clone().into()).unwrap(); - sdk::event::emit_event(&single_entry_evt.into()).unwrap(); - - let our_addr = Address::new_id(sdk::message::receiver()); - - if counter > 0 { - // This call will fail when performing the 6th call. We do not unwrap or propagate - // the error here, we just ignore it and move on. That's part of the test scenario - // (want to verify that the FVM correctly discards only events under a failing - // callee, no more and no less) - let _ = sdk::send::send( - &our_addr, - EMIT_SUBCALLS_REVERT, - IpldBlock::serialize_cbor(&counter).unwrap(), - Zero::zero(), - None, - Default::default(), - ) - .ok(); - } - - // The 6th call will abort after performing its send. The caller won't rethrow, so we - // will observe an OK externally. The events from the depth-most 4 callees + us should - // be discarded (i.e. 10 events discarded). - if counter == 4 { - sdk::vm::abort(ExitCode::USR_ASSERTION_FAILED.value(), None); - } - } - _ => panic!("invalid method number"), - } - 0 -} diff --git a/testing/test_actors/actors/fil-events-actor/src/lib.rs b/testing/test_actors/actors/fil-events-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-events-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-exit-data-actor/Cargo.toml b/testing/test_actors/actors/fil-exit-data-actor/Cargo.toml deleted file mode 100644 index aeeb7076e..000000000 --- a/testing/test_actors/actors/fil-exit-data-actor/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "fil_exit_data_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -fvm_ipld_encoding = { version = "0.4.0" } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-exit-data-actor/src/actor.rs b/testing/test_actors/actors/fil-exit-data-actor/src/actor.rs deleted file mode 100644 index 33c55121d..000000000 --- a/testing/test_actors/actors/fil-exit-data-actor/src/actor.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_ipld_encoding::ipld_block::IpldBlock; -use fvm_ipld_encoding::CBOR; -use fvm_sdk as sdk; - -/// Placeholder invoke for testing -#[no_mangle] -#[cfg(target_arch = "wasm32")] -pub fn invoke(blk: u32) -> u32 { - invoke_method(blk) -} - -#[allow(dead_code)] -fn invoke_method(_: u32) -> ! { - let method = sdk::message::method_number(); - let exit_code = match method { - 0..=2 => 0, - _ => 0x42, - }; - - sdk::vm::exit( - exit_code, - Some(IpldBlock { - codec: CBOR, - data: vec![1u8, 2u8, 3u8, 3u8, 7u8], - }), - None, - ) -} diff --git a/testing/test_actors/actors/fil-exit-data-actor/src/lib.rs b/testing/test_actors/actors/fil-exit-data-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-exit-data-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-gas-calibration-actor/Cargo.toml b/testing/test_actors/actors/fil-gas-calibration-actor/Cargo.toml deleted file mode 100644 index 099bf6f57..000000000 --- a/testing/test_actors/actors/fil-gas-calibration-actor/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "fil_gas_calibration_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -fvm_ipld_encoding = { version = "0.4.0" } -fvm_gas_calibration_shared = { path = "../../../calibration/shared" } - -cid = { workspace = true } -num-derive = "0.4" -num-traits = "0.2" -serde = { version = "1.0", features = ["derive"] } -anyhow = "1.0.71" - -[lib] -crate-type = ["cdylib"] diff --git a/testing/test_actors/actors/fil-gas-calibration-actor/src/actor.rs b/testing/test_actors/actors/fil-gas-calibration-actor/src/actor.rs deleted file mode 100644 index edbbef4cc..000000000 --- a/testing/test_actors/actors/fil-gas-calibration-actor/src/actor.rs +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use anyhow::{anyhow, Result}; -use cid::multihash::Code; -use fvm_gas_calibration_shared::*; -use fvm_ipld_encoding::{DAG_CBOR, IPLD_RAW}; -use fvm_sdk::message::params_raw; -use fvm_sdk::vm::abort; -use fvm_shared::address::{Address, Protocol}; -use fvm_shared::crypto::signature::{Signature, SignatureType, SECP_SIG_LEN}; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::event::{ActorEvent, Entry}; -use fvm_shared::sys::SendFlags; -use num_traits::FromPrimitive; -use serde::de::DeserializeOwned; - -/// Just doing a few mutations in an array to make the hashes different. -const MUTATION_COUNT: usize = 10; -const NOP_ACTOR_ADDRESS: Address = Address::new_id(10001); - -#[no_mangle] -pub fn invoke(params_ptr: u32) -> u32 { - // Conduct method dispatch. Handle input parameters and run the scenario. - // The test is expected to capture gas metrics. Other than that we're not - // interested in any return value. - let method = FromPrimitive::from_u64(fvm_sdk::message::method_number()).unwrap_or_else(|| { - abort( - ExitCode::USR_UNHANDLED_MESSAGE.value(), - Some("unrecognized method"), - ) - }); - - if let Err(err) = dispatch(method, params_ptr) { - abort( - ExitCode::USR_UNHANDLED_MESSAGE.value(), - Some(format!("error running method: {err}").as_ref()), - ) - } - - 0 -} - -fn dispatch(method: Method, params_ptr: u32) -> Result<()> { - match method { - Method::OnHashing => dispatch_to(on_hashing, params_ptr), - Method::OnBlock => dispatch_to(on_block, params_ptr), - Method::OnVerifySignature => dispatch_to(on_verify_signature, params_ptr), - Method::OnRecoverSecpPublicKey => dispatch_to(on_recover_secp_public_key, params_ptr), - Method::OnSend => dispatch_to(on_send, params_ptr), - Method::OnEvent => dispatch_to(on_event, params_ptr), - } -} - -fn dispatch_to(f: F, params_ptr: u32) -> Result<()> -where - F: FnOnce(P) -> Result<()>, - P: DeserializeOwned, -{ - f(read_params::

(params_ptr)?) -} - -fn on_hashing(p: OnHashingParams) -> Result<()> { - let h = p.hasher().ok_or_else(|| anyhow!("unknown hasher"))?; - let mut data = random_bytes(p.size, p.seed); - for i in 0..p.iterations { - random_mutations(&mut data, p.seed + i as u64, MUTATION_COUNT); - fvm_sdk::crypto::hash_owned(h, &data); - } - Ok(()) -} - -fn on_block(p: OnBlockParams) -> Result<()> { - let mut data = random_bytes(p.size, p.seed); - let mut cids = Vec::new(); - - for i in 0..p.iterations { - random_mutations(&mut data, p.seed + i as u64, MUTATION_COUNT); - - let cid = fvm_sdk::ipld::put(Code::Blake2b256.into(), 32, DAG_CBOR, data.as_slice())?; - - // First just put it to the side, because if we read it back now, then strangely the times of puts go down by 10x in the beginning - // and only in later go up to where they are when they are the only thing we do. The distribution takes the shape of a sloping V. - cids.push(cid); - - // TODO: Why does including the following line affect the runtime of the put in the next iteration? - // let back = fvm_sdk::ipld::get(&cid)?; - //assert_eq!(data, back); - } - - // Read the data back so we have stats about that too. - for k in cids.iter().take(p.iterations) { - let _ = fvm_sdk::ipld::get(k)?; - } - - Ok(()) -} - -fn on_verify_signature(p: OnVerifySignatureParams) -> Result<()> { - let sig_type = match p.signer.protocol() { - Protocol::BLS => SignatureType::BLS, - Protocol::Secp256k1 => SignatureType::Secp256k1, - other => return Err(anyhow!("unexpected protocol: {other}")), - }; - let sig = Signature { - sig_type, - bytes: p.signature, - }; - - let mut data = random_bytes(p.size, p.seed); - - for i in 0..p.iterations { - random_mutations(&mut data, p.seed + i as u64, MUTATION_COUNT); - fvm_sdk::crypto::verify_signature(&sig, &p.signer, &data)?; - } - - Ok(()) -} - -fn on_recover_secp_public_key(p: OnRecoverSecpPublicKeyParams) -> Result<()> { - let mut data = random_bytes(p.size, p.seed); - let sig: [u8; SECP_SIG_LEN] = p - .signature - .try_into() - .map_err(|_| anyhow!("unexpected signature length"))?; - - for i in 0..p.iterations { - random_mutations(&mut data, p.seed + i as u64, MUTATION_COUNT); - let hash = fvm_sdk::crypto::hash_blake2b(&data); - fvm_sdk::crypto::recover_secp_public_key(&hash, &sig)?; - } - - Ok(()) -} - -fn on_send(p: OnSendParams) -> Result<()> { - let value = if p.value_transfer { - TokenAmount::from_atto(1) - } else { - TokenAmount::default() - }; - let method = p.invoke as u64; - - for _i in 0..p.iterations { - fvm_sdk::send::send( - &NOP_ACTOR_ADDRESS, - method, - None, - value.clone(), - None, - SendFlags::default(), - ) - .unwrap(); - } - Ok(()) -} - -fn on_event(p: OnEventParams) -> Result<()> { - match p.mode { - EventCalibrationMode::Shape(_) => on_event_shape(p), - EventCalibrationMode::TargetSize(_) => on_event_target_size(p), - } -} - -fn on_event_shape(p: OnEventParams) -> Result<()> { - const MAX_DATA: usize = 8 << 10; - - let EventCalibrationMode::Shape((key_size, value_size, last_value_size)) = p.mode else { - panic!() - }; - let mut value = vec![0; value_size]; - - // the last entry may not exceed total event values over MAX_DATA - let total_entry_size = (p.entries - 1) * value_size; - let mut tmp_size = last_value_size; - if tmp_size + total_entry_size > MAX_DATA { - tmp_size = MAX_DATA - total_entry_size; - } - let mut last_value = vec![0; tmp_size]; - - for i in 0..p.iterations { - random_mutations(&mut value, p.seed + i as u64, MUTATION_COUNT); - let key = random_ascii_string(key_size, p.seed + p.iterations as u64 + i as u64); // non-overlapping seed - let mut entries: Vec = std::iter::repeat_with(|| Entry { - flags: p.flags, - key: key.clone(), - codec: IPLD_RAW, - value: value.clone(), - }) - .take(p.entries - 1) - .collect(); - - random_mutations(&mut last_value, p.seed + i as u64, MUTATION_COUNT); - entries.push(Entry { - flags: p.flags, - key, - codec: IPLD_RAW, - value: last_value.clone(), - }); - - fvm_sdk::event::emit_event(&ActorEvent::from(entries))?; - } - - Ok(()) -} - -fn on_event_target_size(p: OnEventParams) -> Result<()> { - let EventCalibrationMode::TargetSize(target_size) = p.mode else { - panic!() - }; - - // Deduct the approximate overhead of each entry (3 bytes) + flag (1 byte). This - // is fuzzy because the size of the encoded CBOR depends on the length of fields, but it's good enough. - let size_per_entry = ((target_size.checked_sub(p.entries * 4).unwrap_or(1)) / p.entries).max(1); - let mut rand = lcg64(p.seed); - for _ in 0..p.iterations { - let mut entries = Vec::with_capacity(p.entries); - for _ in 0..p.entries { - let (r1, r2, r3) = ( - rand.next().unwrap(), - rand.next().unwrap(), - rand.next().unwrap(), - ); - // Generate a random key of an arbitrary length that fits within the size per entry. - // This will never be equal to size_per_entry, and it might be zero, which is fine - // for gas calculation purposes. - let key = random_ascii_string((r1 % size_per_entry as u64) as usize, r2); - // Generate a value to fill up the remaining bytes. - let value = random_bytes(size_per_entry - key.len(), r3); - entries.push(Entry { - flags: p.flags, - codec: IPLD_RAW, - key, - value, - }) - } - fvm_sdk::event::emit_event(&ActorEvent::from(entries))?; - } - - Ok(()) -} - -fn random_bytes(size: usize, seed: u64) -> Vec { - lcg8(seed).take(size).collect() -} - -fn random_mutations(data: &mut [u8], seed: u64, n: usize) { - let size = data.len(); - if size > 0 { - for (i, b) in lcg64(seed).zip(lcg8(seed + 1)).take(n) { - data[i as usize % size] = b; - } - } -} - -/// Generates a random string in the 0x20 - 0x7e ASCII character range -/// (alphanumeric + symbols, excluding the delete symbol). -fn random_ascii_string(n: usize, seed: u64) -> String { - let bytes = lcg64(seed).map(|x| ((x % 95) + 32) as u8).take(n).collect(); - String::from_utf8(bytes).unwrap() -} - -/// Knuth's quick and dirty random number generator. -/// https://en.wikipedia.org/wiki/Linear_congruential_generator -fn lcg64(initial_seed: u64) -> impl Iterator { - let a = 6364136223846793005_u64; - let c = 1442695040888963407_u64; - let mut seed = initial_seed; - std::iter::repeat_with(move || { - seed = a.wrapping_mul(seed).wrapping_add(c); - seed - }) -} - -fn lcg8(seed: u64) -> impl Iterator { - lcg64(seed).map(|x| (x % 256) as u8) -} - -fn read_params(params_ptr: u32) -> Result { - let params = params_raw(params_ptr).unwrap().unwrap(); - let value = params.deserialize()?; - Ok(value) -} diff --git a/testing/test_actors/actors/fil-gas-calibration-actor/src/lib.rs b/testing/test_actors/actors/fil-gas-calibration-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-gas-calibration-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-gaslimit-actor/Cargo.toml b/testing/test_actors/actors/fil-gaslimit-actor/Cargo.toml deleted file mode 100644 index 8f6401412..000000000 --- a/testing/test_actors/actors/fil-gaslimit-actor/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "fil_gaslimit_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_ipld_encoding = { version = "0.4.0" } -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -serde = {version = "1.0.164", features = ["derive"] } -serde_tuple = "0.5.0" -log = "0.4.19" - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-gaslimit-actor/src/actor.rs b/testing/test_actors/actors/fil-gaslimit-actor/src/actor.rs deleted file mode 100644 index 110ee09b5..000000000 --- a/testing/test_actors/actors/fil-gaslimit-actor/src/actor.rs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_ipld_encoding::IPLD_RAW; -use fvm_sdk as sdk; -use fvm_shared::address::Address; -use fvm_shared::bigint::Zero; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; -use fvm_shared::event::{Entry, Flags}; -use serde_tuple::*; - -#[derive(Serialize_tuple, Deserialize_tuple, PartialEq, Eq, Clone, Debug)] -struct Params { - dest: Address, - inner_gas_limit: u64, - exhaust: bool, - expect_err: bool, -} - -#[no_mangle] -pub fn invoke(params_id: u32) -> u32 { - sdk::initialize(); - - let self_addr = Address::new_id(sdk::message::receiver()); - let ten = TokenAmount::from_atto(10); - let fifty = TokenAmount::from_atto(50); - - // Gas limit to use is supplied as a param. - let params: Params = { - let msg_params = sdk::message::params_raw(params_id).unwrap().unwrap(); - assert_eq!(msg_params.codec, fvm_ipld_encoding::CBOR); - fvm_ipld_encoding::from_slice(msg_params.data.as_slice()).unwrap() - }; - - // If we're self-calling, send to the origin. - if Address::new_id(sdk::message::caller()) == self_addr { - // Check that we successfully lowered the gas limit. - if params.inner_gas_limit > 0 { - assert!(sdk::gas::available() <= params.inner_gas_limit); - } - - // This send will never be committed if we exhaust gas. - sdk::send::send( - ¶ms.dest, - 0, - Default::default(), - ten, - None, - Default::default(), - ) - .unwrap(); - - // This event is also discarded if we exhaust gas. - let single_entry_evt = { - let payload: u64 = 400; - vec![Entry { - flags: Flags::all(), - key: "foo".to_owned(), - codec: IPLD_RAW, - value: fvm_ipld_encoding::to_vec(&payload).unwrap(), - }] - }; - sdk::event::emit_event(&single_entry_evt.into()).unwrap(); - - // Conditionally exhaust gas. - if params.exhaust { - let mut _i = 0; - loop { - _i += 1 - } - } - - return 0; - } - - // Send 10 to origin. This send is always persisted. - sdk::send::send( - ¶ms.dest, - 0, - Default::default(), - fifty, - None, - Default::default(), - ) - .unwrap(); - - let gas_limit = if params.inner_gas_limit == 0 { - None - } else { - Some(params.inner_gas_limit) - }; - - // send to self with the supplied gas_limit, propagating params. - let msg_params = sdk::message::params_raw(params_id).unwrap(); - let ret = sdk::send::send( - &self_addr, - 2, - msg_params, - Zero::zero(), - gas_limit, - Default::default(), - ); - - match ret { - Ok(res) => { - if params.expect_err { - assert_eq!( - res.exit_code, - ExitCode::SYS_OUT_OF_GAS, - "expected to fail SYS_OUT_OF_GAS" - ); - } else { - assert!(res.exit_code.is_success(), "did not expect a failure"); - } - } - Err(_) => { - panic!("did not expect an error"); - } - }; - 0 -} diff --git a/testing/test_actors/actors/fil-gaslimit-actor/src/lib.rs b/testing/test_actors/actors/fil-gaslimit-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-gaslimit-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-hello-world-actor/Cargo.toml b/testing/test_actors/actors/fil-hello-world-actor/Cargo.toml deleted file mode 100644 index 57370a94d..000000000 --- a/testing/test_actors/actors/fil-hello-world-actor/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "fil_hello_world_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-hello-world-actor/src/lib.rs b/testing/test_actors/actors/fil-hello-world-actor/src/lib.rs deleted file mode 100644 index 6f3d4680d..000000000 --- a/testing/test_actors/actors/fil-hello-world-actor/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -/// Placeholder invoke for testing -#[no_mangle] -#[cfg(target_arch = "wasm32")] -pub fn invoke(_: u32) -> u32 { - use fvm_sdk as sdk; - - // Conduct method dispatch. Handle input parameters and return data. - sdk::vm::abort( - fvm_shared::error::ExitCode::FIRST_USER_EXIT_CODE, - Some("sample abort"), - ) -} diff --git a/testing/test_actors/actors/fil-integer-overflow-actor/Cargo.toml b/testing/test_actors/actors/fil-integer-overflow-actor/Cargo.toml deleted file mode 100644 index 0996214c2..000000000 --- a/testing/test_actors/actors/fil-integer-overflow-actor/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "fil_integer_overflow_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -fvm_ipld_encoding = { version = "0.4.0" } -fvm_ipld_blockstore = { version = "0.2.0" } - -anyhow = "1.0.71" -cid = { workspace = true } -serde = { version = "1.0.164", features = ["derive"] } -serde_tuple = "0.5" - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/blockstore.rs b/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/blockstore.rs deleted file mode 100644 index d74565ef3..000000000 --- a/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/blockstore.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use std::convert::TryFrom; - -use anyhow::{anyhow, Result}; -use cid::multihash::Code; -use cid::Cid; -use fvm_ipld_blockstore::Block; -use fvm_sdk as sdk; - -/// A blockstore that delegates to IPLD syscalls. -pub struct Blockstore; - -impl fvm_ipld_blockstore::Blockstore for Blockstore { - fn get(&self, cid: &Cid) -> Result>> { - // If this fails, the _CID_ is invalid. I.e., we have a bug. - sdk::ipld::get(cid) - .map(Some) - .map_err(|e| anyhow!("get failed with {:?} on CID '{}'", e, cid)) - } - - fn put_keyed(&self, k: &Cid, block: &[u8]) -> Result<()> { - let code = Code::try_from(k.hash().code()).map_err(|e| anyhow!(e.to_string()))?; - let k2 = self.put(code, &Block::new(k.codec(), block))?; - if k != &k2 { - return Err(anyhow!("put block with cid {} but has cid {}", k, k2)); - } - Ok(()) - } - - fn put(&self, code: Code, block: &Block) -> Result - where - D: AsRef<[u8]>, - { - // TODO: Don't hard-code the size. Unfortunately, there's no good way to get it from the - // codec at the moment. - const SIZE: u32 = 32; - let k = sdk::ipld::put(code.into(), SIZE, block.codec, block.data.as_ref()) - .map_err(|e| anyhow!("put failed with {:?}", e))?; - Ok(k) - } -} diff --git a/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/mod.rs b/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/mod.rs deleted file mode 100644 index edb7c9ed8..000000000 --- a/testing/test_actors/actors/fil-integer-overflow-actor/src/actor/mod.rs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use cid::multihash::Code; -use cid::Cid; -use fvm_ipld_encoding::tuple::*; -use fvm_ipld_encoding::{to_vec, CborStore, RawBytes, CBOR, DAG_CBOR}; -use fvm_sdk::message::params_raw; -use fvm_sdk::vm::abort; -use fvm_sdk::NO_DATA_BLOCK_ID; -use fvm_shared::error::ExitCode; -mod blockstore; -use blockstore::Blockstore; - -#[derive(Serialize_tuple, Deserialize_tuple, Clone, Debug, Default)] -pub struct State { - pub value: i64, -} - -impl State { - pub fn load() -> Self { - // First, load the current state root. - let root = match fvm_sdk::sself::root() { - Ok(root) => root, - Err(err) => abort( - ExitCode::USR_ILLEGAL_STATE.value(), - Some(format!("failed to get root: {:?}", err).as_str()), - ), - }; - - // Load the actor state from the state tree. - match Blockstore.get_cbor::(&root) { - Ok(Some(state)) => state, - Ok(None) => abort( - ExitCode::USR_ILLEGAL_STATE.value(), - Some("state does not exist"), - ), - Err(err) => abort( - ExitCode::USR_ILLEGAL_STATE.value(), - Some(format!("failed to get state: {}", err).as_str()), - ), - } - } - - pub fn save(&self) -> Cid { - let serialized = match to_vec(self) { - Ok(s) => s, - Err(err) => abort( - ExitCode::USR_SERIALIZATION.value(), - Some(format!("failed to serialize state: {:?}", err).as_str()), - ), - }; - let cid = match fvm_sdk::ipld::put( - Code::Blake2b256.into(), - 32, - DAG_CBOR, - serialized.as_slice(), - ) { - Ok(cid) => cid, - Err(err) => abort( - ExitCode::USR_SERIALIZATION.value(), - Some(format!("failed to store initial state: {:}", err).as_str()), - ), - }; - if let Err(err) = fvm_sdk::sself::set_root(&cid) { - abort( - ExitCode::USR_ILLEGAL_STATE.value(), - Some(format!("failed to set root ciid: {:}", err).as_str()), - ); - } - cid - } -} - -#[no_mangle] -pub fn invoke(params_pointer: u32) -> u32 { - // Conduct method dispatch. Handle input parameters and return data. - let ret: Option = match fvm_sdk::message::method_number() { - // Set initial value - 1 => { - let params = params_raw(params_pointer).unwrap().unwrap(); - let x: i64 = params.deserialize().unwrap(); - - let mut state = State::load(); - state.value = x; - state.save(); - - None - } - // Overflow value - 2 => { - let mut state = State::load(); - - state.value = (state.value >> 1i64) * (state.value + 1); - state.save(); - - None - } - // Get state value - 3 => { - let state = State::load(); - let ret = to_vec(&state.value); - match ret { - Ok(ret) => Some(RawBytes::new(ret)), - Err(err) => { - abort( - ExitCode::USR_ILLEGAL_STATE.value(), - Some(format!("failed to serialize return value: {:?}", err).as_str()), - ); - } - } - } - _ => abort( - ExitCode::USR_UNHANDLED_MESSAGE.value(), - Some("unrecognized method"), - ), - }; - - match ret { - None => NO_DATA_BLOCK_ID, - Some(v) => match fvm_sdk::ipld::put_block(CBOR, v.bytes()) { - Ok(id) => id, - Err(err) => abort( - ExitCode::USR_SERIALIZATION.value(), - Some(format!("failed to store return value: {}", err).as_str()), - ), - }, - } -} diff --git a/testing/test_actors/actors/fil-integer-overflow-actor/src/lib.rs b/testing/test_actors/actors/fil-integer-overflow-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-integer-overflow-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-ipld-actor/Cargo.toml b/testing/test_actors/actors/fil-ipld-actor/Cargo.toml deleted file mode 100644 index e5749e280..000000000 --- a/testing/test_actors/actors/fil-ipld-actor/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "fil_ipld_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_ipld_encoding = { version = "0.4.0" } -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } - -[target.'cfg(coverage)'.dependencies] -minicov = "0.3" - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-ipld-actor/src/actor.rs b/testing/test_actors/actors/fil-ipld-actor/src/actor.rs deleted file mode 100644 index 7d286a37b..000000000 --- a/testing/test_actors/actors/fil-ipld-actor/src/actor.rs +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_ipld_encoding::{to_vec, BytesSer, DAG_CBOR}; -use fvm_sdk as sdk; -use fvm_shared::error::ErrorNumber; -use fvm_shared::MAX_CID_LEN; - -fn gen_test_bytes(size: i32) -> Vec { - to_vec(&BytesSer( - &(0..size).map(|b| (b % 256) as u8).collect::>(), - )) - .unwrap() -} - -#[no_mangle] -pub fn invoke(_: u32) -> u32 { - sdk::initialize(); - - test_open_block(); - test_read_block(); - test_create_block(); - test_stat_block(); - test_link_block(); - - #[cfg(coverage)] - sdk::debug::store_artifact("ipld_actor.profraw", minicov::capture_coverage()); - 0 -} - -fn test_open_block() { - let test_bytes = gen_test_bytes(1 << 10); - - unsafe { - let cid = sdk::ipld::put(0xb220, 32, DAG_CBOR, &test_bytes).unwrap(); - - // The cid should be valid - let mut buf = [0u8; MAX_CID_LEN]; - cid.write_bytes(&mut buf[..]) - .expect("CID encoding should not fail"); - sdk::sys::ipld::block_open(buf.as_mut_ptr()).expect("shouldwork"); - - // Test for invalid Cid - buf.fill(0); - let res = sdk::sys::ipld::block_open(buf.as_mut_ptr()); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - - // Test for invalid Cid pointer - let some_big_number: i32 = 338473423; - let res = sdk::sys::ipld::block_open(some_big_number.to_le_bytes()[0] as *const u8); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - - // TODO (fridrik): Test for very large cid - } -} - -fn test_read_block() { - let test_bytes = gen_test_bytes(10 << 10); - let k = sdk::ipld::put(0xb220, 32, DAG_CBOR, &test_bytes).unwrap(); - { - let block = sdk::ipld::get(&k).unwrap(); - assert_eq!(test_bytes, block); - } - - unsafe { - // Open it. - let k_bytes = k.to_bytes(); - let sdk::sys::ipld::IpldOpen { codec, id, size } = - sdk::sys::ipld::block_open(k_bytes.as_ptr()).unwrap(); - - assert_eq!(test_bytes.len() as u32, size, "block has an incorrect size"); - assert_eq!(codec, DAG_CBOR, "block has an incorrect codec"); - - let mut buf = vec![0u8; 2 * test_bytes.len()]; - - // Try reading with too much space. - { - let remaining = - sdk::sys::ipld::block_read(id, 0, buf.as_mut_ptr(), buf.len() as u32).unwrap(); - assert_eq!( - test_bytes.len() as i32, - -remaining, - "should have over-allocated by 2x" - ); - assert_eq!( - test_bytes, - buf[..test_bytes.len()], - "should have read entire block" - ); - } - - buf.fill(0); - - // Try reading a slice - { - let remaining = sdk::sys::ipld::block_read(id, 10, buf.as_mut_ptr(), 10).unwrap(); - assert_eq!( - remaining, - (test_bytes.len() - (2 * 10)) as i32, - "should have all but 20 bytes remaining" - ); - - assert_eq!( - &test_bytes[10..20], - &buf[..10], - "should have read the second 10 bytes" - ); - } - - // Try reading past the end. - { - let remaining = - sdk::sys::ipld::block_read(id, test_bytes.len() as u32 + 10, buf.as_mut_ptr(), 10) - .unwrap(); - assert_eq!( - remaining, -20, - "reading past the end of the block should work" - ); - } - - // Test get_block with no hint - assert_eq!( - test_bytes, - sdk::ipld::get_block(id, None).unwrap(), - "can read with no hint" - ); - - // Test get_block with a small hint - assert_eq!( - test_bytes, - sdk::ipld::get_block(id, Some(10)).unwrap(), - "can read with a small hint" - ); - - // Test get_block with an exact hint - assert_eq!( - test_bytes, - sdk::ipld::get_block(id, Some(test_bytes.len() as u32)).unwrap(), - "can read with the correct size" - ); - - // Test get_block with an oversized hint. - assert_eq!( - test_bytes, - sdk::ipld::get_block(id, Some(test_bytes.len() as u32 + 10)).unwrap(), - "can read with an over-estimated size" - ); - - // Test an offset that overflows an i32: - let res = sdk::sys::ipld::block_read(id, (i32::MAX as u32) + 1, buf.as_mut_ptr(), 0); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - - // Test a length that overflows an i32 - let res = sdk::sys::ipld::block_read(id, 0, buf.as_mut_ptr(), (i32::MAX as u32) + 1); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - - // Test a combined length + offset that overflow an i32 - let res = sdk::sys::ipld::block_read(id, (i32::MAX as u32) - 10, buf.as_mut_ptr(), 20); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - } -} - -fn test_create_block() { - unsafe { - // Test creating a block with invalid codec - let test_bytes = gen_test_bytes(100); - let invalid_codec_id = 191919; - let res = sdk::sys::ipld::block_create( - invalid_codec_id, - test_bytes.as_ptr(), - test_bytes.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::IllegalCodec)); - - // Creating a block just within the 1Mib limit should work - let test_bytes = gen_test_bytes((1 << 20) - 8); - sdk::sys::ipld::block_create(DAG_CBOR, test_bytes.as_ptr(), test_bytes.len() as u32) - .expect("should be within block limit"); - - // Test creating a too large block - let test_bytes = gen_test_bytes((1 << 20) + 8); - let res = - sdk::sys::ipld::block_create(DAG_CBOR, test_bytes.as_ptr(), test_bytes.len() as u32); - assert_eq!(res, Err(ErrorNumber::LimitExceeded)); - } -} - -fn test_stat_block() { - let bytes = gen_test_bytes(10 << 10); - - unsafe { - let block_id = - sdk::sys::ipld::block_create(DAG_CBOR, bytes.as_ptr(), bytes.len() as u32).unwrap(); - - // Test happy case - let mut buf = [0u8; MAX_CID_LEN]; - sdk::sys::ipld::block_link(block_id, 0xb220, 32, buf.as_mut_ptr(), buf.len() as u32) - .expect("should work"); - let fvm_shared::sys::out::ipld::IpldStat { codec, size } = - sdk::sys::ipld::block_stat(block_id).unwrap(); - assert_eq!(codec, DAG_CBOR); - assert_eq!(size, bytes.len() as u32); - - // Test that giving invalid block id results in InvalidHandle error - let invalid_block_id = 1919; - let res = sdk::sys::ipld::block_stat(invalid_block_id); - assert_eq!(res, Err(ErrorNumber::InvalidHandle)); - } -} - -fn test_link_block() { - let bytes = gen_test_bytes(10 << 10); - - unsafe { - let block_id = - sdk::sys::ipld::block_create(DAG_CBOR, bytes.as_ptr(), bytes.len() as u32).unwrap(); - - // Test happy case - let mut buf = [0u8; MAX_CID_LEN]; - sdk::sys::ipld::block_link(block_id, 0xb220, 32, buf.as_mut_ptr(), buf.len() as u32) - .expect("should work"); - - // Test passing an invalid block id results in InvalidHandle error - let invalid_block_id = 1919; - let res = sdk::sys::ipld::block_link( - invalid_block_id, - 0xb220, - 32, - buf.as_mut_ptr(), - buf.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::InvalidHandle)); - - // Test that giving too small buffer results in BufferTooSmall error - let mut short_buf = [0u8; 3]; - let res = sdk::sys::ipld::block_link( - block_id, - 0xb220, - 32, - short_buf.as_mut_ptr(), - short_buf.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::BufferTooSmall)); - - // Test that invalid hash function results in IllegalCid error - let res = - sdk::sys::ipld::block_link(block_id, 0x1919, 32, buf.as_mut_ptr(), buf.len() as u32); - assert_eq!(res, Err(ErrorNumber::IllegalCid)); - - // Test that invalid hash length results in IllegalCid error - let res = - sdk::sys::ipld::block_link(block_id, 0xb220, 31, buf.as_mut_ptr(), buf.len() as u32); - assert_eq!(res, Err(ErrorNumber::IllegalCid)); - } -} diff --git a/testing/test_actors/actors/fil-ipld-actor/src/lib.rs b/testing/test_actors/actors/fil-ipld-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-ipld-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-malformed-syscall-actor/Cargo.toml b/testing/test_actors/actors/fil-malformed-syscall-actor/Cargo.toml deleted file mode 100644 index ff36afdbe..000000000 --- a/testing/test_actors/actors/fil-malformed-syscall-actor/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "fil_malformed_syscall_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_shared = { workspace = true } -fvm_sdk = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-malformed-syscall-actor/src/lib.rs b/testing/test_actors/actors/fil-malformed-syscall-actor/src/lib.rs deleted file mode 100644 index 3e24f472b..000000000 --- a/testing/test_actors/actors/fil-malformed-syscall-actor/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[no_mangle] -#[cfg(target_arch = "wasm32")] -pub fn invoke(_: u32) -> u32 { - use fvm_sdk::sys::crypto::compute_unsealed_sector_cid; - - let piece: Vec = vec![]; - let mut cid: Vec = vec![]; - - // Should fail for unknown proof type - unsafe { - compute_unsealed_sector_cid(100000, piece.as_ptr(), 100000, cid.as_mut_ptr(), 100000) - .expect(""); - } - - 0 -} diff --git a/testing/test_actors/actors/fil-oom-actor/Cargo.toml b/testing/test_actors/actors/fil-oom-actor/Cargo.toml deleted file mode 100644 index 294e12c4b..000000000 --- a/testing/test_actors/actors/fil-oom-actor/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "fil_oom_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-oom-actor/src/lib.rs b/testing/test_actors/actors/fil-oom-actor/src/lib.rs deleted file mode 100644 index 34cb659c2..000000000 --- a/testing/test_actors/actors/fil-oom-actor/src/lib.rs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#![allow(clippy::slow_vector_initialization)] - -/// Placeholder invoke for testing -#[no_mangle] -#[cfg(target_arch = "wasm32")] -pub fn invoke(blk: u32) -> u32 { - invoke_method(blk) -} - -#[cfg(target_arch = "wasm32")] -fn invoke_method(_: u32) -> ! { - use fvm_sdk as sdk; - let method = sdk::message::method_number(); - - match method { - 1 => { - allocate_one(); - } - 2 => { - allocate_many(); - } - 3 => { - allocate_some(); - sdk::vm::abort(314, Some(format!("not OOM {}", method).as_str())); - } - _ => { - sdk::vm::abort( - fvm_shared::error::ExitCode::FIRST_USER_EXIT_CODE, - Some(format!("bad method {}", method).as_str()), - ); - } - } - - sdk::vm::abort( - fvm_shared::error::ExitCode::FIRST_USER_EXIT_CODE, - Some("should have run out of memory..."), - ) -} - -// Allocate a single big chunk and keep resizing until OOm -#[cfg(target_arch = "wasm32")] -fn allocate_one() { - let mut mem = Vec::::new(); - mem.resize(1024 * 1024, 0); - for _ in 1.. { - let cap = mem.len(); - mem.resize(2 * cap, 0); - } -} - -// Allocate many small chunks until OOm -#[cfg(target_arch = "wasm32")] -fn allocate_many() { - let mut chunks = Vec::>::new(); - for _ in 1.. { - let mut chunk = Vec::::new(); - chunk.resize(1024 * 1024, 0); - chunks.push(chunk); - } -} - -#[cfg(target_arch = "wasm32")] -fn allocate_some() { - // 64 WASM pages - let _ = Vec::::with_capacity(64 * 65536); -} diff --git a/testing/test_actors/actors/fil-readonly-actor/Cargo.toml b/testing/test_actors/actors/fil-readonly-actor/Cargo.toml deleted file mode 100644 index 049387323..000000000 --- a/testing/test_actors/actors/fil-readonly-actor/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "fil_readonly_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -fvm_ipld_encoding = { version = "0.4.0" } -cid = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-readonly-actor/src/actor.rs b/testing/test_actors/actors/fil-readonly-actor/src/actor.rs deleted file mode 100644 index abdc21743..000000000 --- a/testing/test_actors/actors/fil-readonly-actor/src/actor.rs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use cid::multihash::{Code, MultihashDigest}; -use cid::Cid; -use fvm_ipld_encoding::ipld_block::IpldBlock; -use fvm_ipld_encoding::{to_vec, CBOR, DAG_CBOR, IPLD_RAW}; -use fvm_sdk as sdk; -use fvm_shared::address::{Address, SECP_PUB_LEN}; -use fvm_shared::econ::TokenAmount; -use fvm_shared::event::{Entry, Flags}; -use fvm_shared::sys::SendFlags; -use fvm_shared::METHOD_SEND; -use sdk::error::{ActorDeleteError, StateUpdateError}; -use sdk::sys::ErrorNumber; - -/// Placeholder invoke for testing -#[no_mangle] -#[cfg(target_arch = "wasm32")] -pub fn invoke(blk: u32) -> u32 { - invoke_method(blk, sdk::message::method_number()) -} - -#[allow(dead_code)] -fn invoke_method(blk: u32, method: u64) -> u32 { - let account = Address::new_secp256k1(&[0u8; SECP_PUB_LEN]).unwrap(); - match method { - 2 => { - assert!(!sdk::vm::read_only()); - // Can't create actors when read-only. - let resp = sdk::send::send( - &account, - METHOD_SEND, - None, - TokenAmount::default(), - None, - SendFlags::READ_ONLY, - ); - assert_eq!(resp, Err(ErrorNumber::ReadOnly)); - - // But can still create them when not read-only. - assert!(sdk::send::send( - &account, - METHOD_SEND, - Default::default(), - Default::default(), - None, - Default::default(), - ) - .unwrap() - .exit_code - .is_success()); - - // Now recurse. - assert!(sdk::send::send( - &Address::new_id(sdk::message::receiver()), - 3, - Default::default(), - Default::default(), - None, - SendFlags::READ_ONLY, - ) - .unwrap() - .exit_code - .is_success()); - } - 3 => { - // should now be in read-only mode. - assert!(sdk::vm::read_only()); - - // Sending value fails. - let resp = sdk::send::send( - &account, - 0, - Default::default(), - TokenAmount::from_atto(1), - None, - Default::default(), - ); - assert_eq!(resp, Err(ErrorNumber::ReadOnly)); - - // Sending nothing succeeds. - assert!(sdk::send::send( - &account, - 0, - Default::default(), - Default::default(), - None, - Default::default(), - ) - .unwrap() - .exit_code - .is_success()); - - // Writing should succeed. - let cid = sdk::ipld::put(0xb220, 32, 0x55, b"foo").unwrap(); - - // Setting root should fail. - let err = sdk::sself::set_root(&cid).expect_err("successfully set root"); - assert_eq!(err, StateUpdateError::ReadOnly); - - // Root should not be updated. - let empty = to_vec::<[(); 0]>(&[]).unwrap(); - let expected_root = Cid::new_v1(DAG_CBOR, Code::Blake2b256.digest(&empty)); - let root = sdk::sself::root().unwrap(); - assert_eq!(root, expected_root); - - // Send should be able to pass values. - let output = sdk::send::send( - &Address::new_id(sdk::message::receiver()), - 4, - Some(IpldBlock { - codec: CBOR, - data: "input".into(), - }), - Default::default(), - None, - Default::default(), - ) - .unwrap(); - assert!(output.exit_code.is_success()); - assert_eq!(output.return_data.unwrap().data, b"output"); - - // Aborts should work. - let output = sdk::send::send( - &Address::new_id(sdk::message::receiver()), - 5, - None, - Default::default(), - None, - Default::default(), - ) - .unwrap(); - assert_eq!(output.exit_code.value(), 42); - - // Should be able to recursivly send in read-only mode. - let output = sdk::send::send( - &Address::new_id(sdk::message::receiver()), - 4, - Some(IpldBlock { - codec: CBOR, - data: "input".into(), - }), - Default::default(), - None, - SendFlags::READ_ONLY, - ) - .unwrap(); - assert!(output.exit_code.is_success()); - assert_eq!(output.return_data.unwrap().data, b"output"); - - // Should fail to emit events. - let evt = vec![Entry { - flags: Flags::all(), - key: "foo".to_owned(), - codec: IPLD_RAW, - value: vec![0, 1, 2], - }]; - let err = sdk::event::emit_event(&evt.into()).unwrap_err(); - assert_eq!(err, ErrorNumber::ReadOnly); - - // Should not be able to delete self. - let err = - sdk::sself::self_destruct(&Address::new_id(sdk::message::origin())).unwrap_err(); - assert_eq!(err, ActorDeleteError::ReadOnly); - } - 4 => { - assert!(sdk::vm::read_only()); - // read params and return value entirely in read-only mode. - let input = sdk::ipld::get_block(blk, None).unwrap(); - assert_eq!(input, b"input"); - return sdk::ipld::put_block(0x55, b"output").unwrap(); - } - 5 => { - assert!(sdk::vm::read_only()); - sdk::vm::abort(42, None) - } - _ => panic!("unexpected method"), - } - 0 -} diff --git a/testing/test_actors/actors/fil-readonly-actor/src/lib.rs b/testing/test_actors/actors/fil-readonly-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-readonly-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-sself-actor/Cargo.toml b/testing/test_actors/actors/fil-sself-actor/Cargo.toml deleted file mode 100644 index ef54e0eaa..000000000 --- a/testing/test_actors/actors/fil-sself-actor/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "fil_sself_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -fvm_ipld_encoding = { version = "0.4.0" } -cid = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-sself-actor/src/actor.rs b/testing/test_actors/actors/fil-sself-actor/src/actor.rs deleted file mode 100644 index a0d0121bd..000000000 --- a/testing/test_actors/actors/fil-sself-actor/src/actor.rs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use cid::multihash::{Code, MultihashDigest}; -use cid::Cid; -use fvm_ipld_encoding::{to_vec, DAG_CBOR}; -use fvm_sdk as sdk; -use fvm_shared::address::Address; -use fvm_shared::econ::TokenAmount; -use sdk::error::{ActorDeleteError, StateReadError, StateUpdateError}; - -#[no_mangle] -pub fn invoke(_: u32) -> u32 { - sdk::initialize(); - - assert!(!sdk::vm::read_only()); - - // test that root() returns the correct root - // - let empty = to_vec::<[(); 0]>(&[]).unwrap(); - let expected_root = Cid::new_v1(DAG_CBOR, Code::Blake2b256.digest(&empty)); - let root = sdk::sself::root().unwrap(); - assert_eq!(root, expected_root); - - // test setting the root cid for the caling actor returns the correct root - // - let cid = sdk::ipld::put(0xb220, 32, 0x55, b"foo").unwrap(); - sdk::sself::set_root(&cid).unwrap(); - let root = sdk::sself::root().unwrap(); - assert_eq!(root, cid); - - let balance = sdk::sself::current_balance(); - assert_eq!(TokenAmount::from_nano(1_000_000), balance); - - // test that we can't destroy the calling actor when supplied beneficiary - // address does not exist or when its itself - // - assert_eq!( - sdk::sself::self_destruct(&Address::new_id(191919)), - Err(ActorDeleteError::BeneficiaryDoesNotExist), - ); - assert_eq!( - sdk::sself::self_destruct(&Address::new_id(10000)), - Err(ActorDeleteError::BeneficiaryIsSelf), - ); - - // now lets destroy the calling actor - // - sdk::sself::self_destruct(&Address::new_id(sdk::message::origin())).unwrap(); - - // test that root/set_root/self_destruct fail when the actor has been deleted - // and balance is 0 - assert_eq!(sdk::sself::root().unwrap_err(), StateReadError); - assert_eq!( - sdk::sself::set_root(&cid).unwrap_err(), - StateUpdateError::ActorDeleted - ); - assert_eq!(TokenAmount::from_nano(0), sdk::sself::current_balance()); - - // calling destroy on an already destroyed actor should succeed (since its - // balance is 0) - // - // TODO (fridrik): we should consider changing this behaviour in the future - // and disallow destroying actor with non-zero balance) - // - sdk::sself::self_destruct(&Address::new_id(sdk::message::origin())) - .expect("deleting an already deleted actor should succeed since it has zero balance"); - - #[cfg(coverage)] - sdk::debug::store_artifact("sself_actor.profraw", minicov::capture_coverage()); - - 0 -} diff --git a/testing/test_actors/actors/fil-sself-actor/src/lib.rs b/testing/test_actors/actors/fil-sself-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-sself-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-stack-overflow-actor/Cargo.toml b/testing/test_actors/actors/fil-stack-overflow-actor/Cargo.toml deleted file mode 100644 index 23bcd1bea..000000000 --- a/testing/test_actors/actors/fil-stack-overflow-actor/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "fil_stack_overflow_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build diff --git a/testing/test_actors/actors/fil-stack-overflow-actor/src/actor.rs b/testing/test_actors/actors/fil-stack-overflow-actor/src/actor.rs deleted file mode 100644 index a3026393f..000000000 --- a/testing/test_actors/actors/fil-stack-overflow-actor/src/actor.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_sdk as sdk; -use fvm_shared::address::Address; -use fvm_shared::bigint::Zero; -use fvm_shared::econ::TokenAmount; -use fvm_shared::error::ExitCode; - -#[no_mangle] -pub fn invoke(_: u32) -> u32 { - let m = sdk::message::method_number(); - // If we start with method 1, we'll be over recursive send limit, starting - // with method 2 should be fine - if m > 1025 { - sdk::vm::abort(0x42, None); - } - - if m == 1 { - // if method 0, we want to run out of stack - recurse(m, 1000) - } else { - // 5 stack elems per level (wasm-instrument charges for highest use in the - // function) + some overhead mean that with the 2048 element wasm limit we - // can do 396 recursive calls while still being able do do a send at that - // depth - recurse(m, 396) - } -} - -// we need two recurse functions; just one gets optimized into wasm loop - -#[inline(never)] -pub fn recurse(m: u64, n: u64) -> u32 { - if n > 0 { - call_extern(); - - return recurse2(m, n - 1); - } - do_send(m) -} - -#[inline(never)] -pub fn recurse2(m: u64, n: u64) -> u32 { - if n > 0 { - call_extern(); - - return recurse(m, n - 1); - } - do_send(m) -} - -// external call to prevent the compiler from doing smart things -#[inline(never)] -pub fn call_extern() { - let _ = sdk::message::method_number(); -} - -#[inline(never)] -pub fn do_send(m: u64) -> u32 { - let r = sdk::send::send( - &Address::new_id(10000), - m + 1, - None, - TokenAmount::zero(), - None, - Default::default(), - ); - match r { - Ok(rec) => match rec.exit_code { - ExitCode::OK => 0, - e => sdk::vm::abort(e.value() | 0x80000000, None), - }, - Err(e) => sdk::vm::abort((e as u32) | 0xc0000000, None), - } -} diff --git a/testing/test_actors/actors/fil-stack-overflow-actor/src/lib.rs b/testing/test_actors/actors/fil-stack-overflow-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-stack-overflow-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/actors/fil-syscall-actor/Cargo.toml b/testing/test_actors/actors/fil-syscall-actor/Cargo.toml deleted file mode 100644 index c4851ee5b..000000000 --- a/testing/test_actors/actors/fil-syscall-actor/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "fil_syscall_actor" -version = "0.1.0" -edition = "2021" -publish = false - -[target.'cfg(target_arch = "wasm32")'.dependencies] -fvm_ipld_encoding = { version = "0.4.0" } -fvm_sdk = { workspace = true } -fvm_shared = { workspace = true } -minicov = {version = "0.3", optional = true} -actors_v10_runtime = { package = "fil_actors_runtime", git = "https://github.com/filecoin-project/builtin-actors", branch = "master" } -multihash = { workspace = true, features = ["sha3", "sha2", "ripemd"] } - -[lib] -crate-type = ["cdylib"] ## cdylib is necessary for Wasm build - -[features] -coverage = ["minicov"] diff --git a/testing/test_actors/actors/fil-syscall-actor/src/actor.rs b/testing/test_actors/actors/fil-syscall-actor/src/actor.rs deleted file mode 100644 index d365d8daa..000000000 --- a/testing/test_actors/actors/fil-syscall-actor/src/actor.rs +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use fvm_sdk as sdk; -use fvm_sdk::sys::network::{context, NetworkContext}; -use fvm_shared::address::Address; -use fvm_shared::chainid::ChainID; -use fvm_shared::crypto::hash::SupportedHashes as SharedSupportedHashes; -use fvm_shared::crypto::signature::{Signature, SECP_SIG_LEN}; -use fvm_shared::error::ErrorNumber; -use fvm_shared::sector::RegisteredSealProof; -use multihash::derive::Multihash; -use multihash::{Blake2b256, Blake2b512, Keccak256, Ripemd160, Sha2_256}; -use std::ptr; - -#[derive(Clone, Copy, Debug, Eq, Multihash, PartialEq)] -#[mh(alloc_size = 64)] -// import hash functions into actor to test against output from syscall -pub enum SupportedHashes { - #[mh(code = 0x12, hasher = Sha2_256)] - Sha2_256, - #[mh(code = 0xb220, hasher = Blake2b256)] - Blake2b256, - #[mh(code = 0xb240, hasher = Blake2b512)] - Blake2b512, - #[mh(code = 0x1b, hasher = Keccak256)] - Keccak256, - #[mh(code = 0x1053, hasher = Ripemd160)] - Ripemd160, -} - -#[no_mangle] -pub fn invoke(_: u32) -> u32 { - sdk::initialize(); - - test_signature(); - test_expected_hash(); - test_hash_syscall(); - test_compute_unsealed_sector_cid(); - test_network_context(); - test_message_context(); - test_balance(); - test_unaligned(); - - #[cfg(coverage)] - sdk::debug::store_artifact("syscall_actor.profraw", minicov::capture_coverage()); - 0 -} - -fn test_signature() { - // the following vectors represent a valid secp256k1 signatures for an address and plaintext message - // - let signature_bytes: Vec = vec![ - 80, 210, 71, 248, 219, 226, 85, 142, 143, 235, 164, 155, 239, 68, 193, 23, 191, 215, 35, - 70, 25, 34, 203, 14, 116, 134, 214, 3, 91, 22, 196, 172, 105, 154, 134, 128, 228, 172, 12, - 25, 251, 166, 51, 0, 210, 45, 23, 91, 12, 18, 228, 43, 204, 157, 233, 81, 69, 3, 44, 121, - 167, 31, 168, 52, 0, - ]; - let pub_key_bytes: Vec = vec![ - 4, 223, 38, 78, 238, 254, 121, 58, 63, 120, 109, 108, 179, 105, 76, 211, 252, 223, 226, 1, - 20, 220, 212, 77, 23, 190, 224, 138, 62, 103, 27, 48, 60, 150, 151, 233, 30, 217, 137, 151, - 208, 24, 212, 117, 32, 94, 44, 118, 125, 40, 25, 31, 67, 154, 106, 97, 110, 32, 209, 62, - 194, 146, 27, 16, 114, - ]; - let message: Vec = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3]; - - // test the happy path - // - let signature = Signature::new_secp256k1(signature_bytes.clone()); - let address = Address::new_secp256k1(&pub_key_bytes).unwrap(); - let res = sdk::crypto::verify_signature(&signature, &address, message.as_slice()); - assert_eq!(res, Ok(true)); - - // test with invalid signature - // - let mut invalid_signature_bytes = signature_bytes.clone(); - invalid_signature_bytes[0] += 1; - let invalid_signature = Signature::new_secp256k1(invalid_signature_bytes.clone()); - let res = sdk::crypto::verify_signature(&invalid_signature, &address, message.as_slice()); - assert_eq!(res, Ok(false)); - - // test with invalid address - // - let mut invalid_pub_key_bytes = pub_key_bytes.clone(); - invalid_pub_key_bytes[0] += 1; - let invalid_address = Address::new_secp256k1(&invalid_pub_key_bytes).unwrap(); - let res = sdk::crypto::verify_signature(&signature, &invalid_address, message.as_slice()); - assert_eq!(res, Ok(false)); - - // test with invalid message - // - let mut invalid_message = message.clone(); - invalid_message[0] += 1; - let res = sdk::crypto::verify_signature(&signature, &address, invalid_message.as_slice()); - assert_eq!(res, Ok(false)); - - // test that calling sdk::sys::crypto::verify_signature with invalid parameters result - // in correct error value - // - unsafe { - let sig_type = signature.signature_type(); - let sig_bytes = signature.bytes(); - let signer = address.to_bytes(); - - // test invalid signature type - let res = sdk::sys::crypto::verify_signature( - u32::MAX, - sig_bytes.as_ptr(), - sig_bytes.len() as u32, - signer.as_ptr(), - signer.len() as u32, - message.as_ptr(), - message.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - - // test invalid signature ptr - let res = sdk::sys::crypto::verify_signature( - sig_type as u32, - sig_bytes.as_ptr(), - sig_bytes.len() as u32, - (u32::MAX) as *const u8, - signer.len() as u32, - message.as_ptr(), - message.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - } - - // test we can recover the public key from the signature - // - let hash = sdk::crypto::hash_blake2b(&message); - let sig: [u8; SECP_SIG_LEN] = signature_bytes.try_into().unwrap(); - let res = sdk::crypto::recover_secp_public_key(&hash, &sig).unwrap(); - assert_eq!(res, pub_key_bytes.as_slice()); - - // test that passing an invalid hash buffer results in IllegalArgument - // - unsafe { - let res = sdk::sys::crypto::recover_secp_public_key(hash.as_ptr(), (u32::MAX) as *const u8); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - } -} - -// use SDK methods to hash and compares against locally (inside the actor) hashed digest -fn test_expected_hash() { - use multihash::MultihashDigest; - let test_bytes = b"foo bar baz boxy"; - - let blake_local = SupportedHashes::Blake2b256.digest(test_bytes); - let blake_arr = sdk::crypto::hash_blake2b(test_bytes); // test against old SDK method since it does less unsafe things - let blake_vec = sdk::crypto::hash_owned(SharedSupportedHashes::Blake2b256, test_bytes); - - assert_eq!(blake_arr.as_slice(), blake_vec.as_slice()); - assert_eq!(blake_local.digest(), blake_vec.as_slice()); - - // macros dont work so im stuck with writing this out manually - - // blake2b512 - { - let local_digest = SupportedHashes::Blake2b512.digest(test_bytes); - let digest = sdk::crypto::hash_owned(SharedSupportedHashes::Blake2b512, test_bytes); - - assert_eq!(local_digest.digest(), digest.as_slice()); - } - // sha - { - let local_digest = SupportedHashes::Sha2_256.digest(test_bytes); - let digest = sdk::crypto::hash_owned(SharedSupportedHashes::Sha2_256, test_bytes); - - assert_eq!(local_digest.digest(), digest.as_slice()); - } - // keccack - { - let local_digest = SupportedHashes::Keccak256.digest(test_bytes); - let digest = sdk::crypto::hash_owned(SharedSupportedHashes::Keccak256, test_bytes); - - assert_eq!(local_digest.digest(), digest.as_slice()); - } - // ripemd - { - let local_digest = SupportedHashes::Ripemd160.digest(test_bytes); - let digest = sdk::crypto::hash_owned(SharedSupportedHashes::Ripemd160, test_bytes); - - assert_eq!(local_digest.digest(), digest.as_slice()); - } - - // hash_owned and hash_into should return the same digest - { - let digest = sdk::crypto::hash_owned(SharedSupportedHashes::Blake2b512, test_bytes); - let mut buffer = [0u8; 64]; - let len = - sdk::crypto::hash_into(SharedSupportedHashes::Blake2b512, test_bytes, &mut buffer); - assert_eq!(digest.len(), len); - assert_eq!(digest.as_slice(), buffer.as_slice()); - } -} - -// do funky things with hash syscall directly -fn test_hash_syscall() { - use sdk::sys::crypto; - - let test_bytes = b"the quick fox jumped over the lazy dog"; - let mut buffer = [0u8; 64]; - - let hasher: u64 = SharedSupportedHashes::Sha2_256 as u64; - let known_digest = sdk::crypto::hash_owned(SharedSupportedHashes::Sha2_256, test_bytes); - - // normal case - unsafe { - let written = crypto::hash( - hasher, - test_bytes.as_ptr(), - test_bytes.len() as u32, - buffer.as_mut_ptr(), - buffer.len() as u32, - ) - .unwrap_or_else(|_| panic!("failed compute hash using {:?}", hasher)); - assert_eq!(&buffer[..written as usize], known_digest.as_slice()) - } - // invalid hash code - unsafe { - let e = crypto::hash( - 0xFF, - test_bytes.as_ptr(), - test_bytes.len() as u32, - buffer.as_mut_ptr(), - buffer.len() as u32, - ) - .expect_err("Expected err from invalid code, got written bytes"); - assert_eq!(e, ErrorNumber::IllegalArgument) - } - // data pointer OOB - unsafe { - let e = crypto::hash( - hasher, - (u32::MAX) as *const u8, // pointer OOB - test_bytes.len() as u32, - buffer.as_mut_ptr(), - buffer.len() as u32, - ) - .expect_err("Expected err, got written bytes"); - assert_eq!(e, ErrorNumber::IllegalArgument) - } - // data length OOB - unsafe { - let e = crypto::hash( - hasher, - test_bytes.as_ptr(), - u32::MAX / 2, // byte length OOB (2GB) - buffer.as_mut_ptr(), - buffer.len() as u32, - ) - .expect_err("Expected err, got written bytes"); - assert_eq!(e, ErrorNumber::IllegalArgument) - } - // digest buffer pointer OOB - unsafe { - let e = crypto::hash( - hasher, - test_bytes.as_ptr(), - test_bytes.len() as u32, - (u32::MAX) as *mut u8, // pointer OOB - buffer.len() as u32, - ) - .expect_err("Expected err, got written bytes"); - assert_eq!(e, ErrorNumber::IllegalArgument) - } - // digest length out of memory - unsafe { - let e = crypto::hash( - hasher, - test_bytes.as_ptr(), - test_bytes.len() as u32, - buffer.as_mut_ptr(), - u32::MAX / 2, // byte length OOB (2GB) - ) - .expect_err("Expected err, got written bytes"); - assert_eq!(e, ErrorNumber::IllegalArgument) - } - // write bytes to the same buffer read from. (overlapping buffers is OK) - unsafe { - let len = test_bytes.len(); - // fill with "garbage" - buffer.fill(0x69); - buffer[..len].copy_from_slice(test_bytes); - - let written = crypto::hash( - hasher, - // read from buffer... - buffer.as_ptr(), - len as u32, - // and write to the same one - buffer.as_mut_ptr(), - buffer.len() as u32, - ) - .expect("Overlapping buffers should be allowed"); - assert_eq!(&buffer[..written as usize], known_digest.as_slice()) - } -} - -fn test_compute_unsealed_sector_cid() { - // test happy path - let pieces = Vec::new(); - sdk::crypto::compute_unsealed_sector_cid(RegisteredSealProof::StackedDRG2KiBV1, &pieces) - .unwrap(); - - // test that calling sdk::sys::crypto::compute_unsealed_sector_cid with invalid parameters - // result in correct error value - // - unsafe { - let piece: Vec = vec![]; - let mut cid: Vec = vec![]; - - // should fail for invalid RegisteredSealProof - let res = sdk::sys::crypto::compute_unsealed_sector_cid( - 999, - piece.as_ptr(), - piece.len() as u32, - cid.as_mut_ptr(), - cid.len() as u32, - ); - assert_eq!(res, Err(ErrorNumber::IllegalArgument)); - } -} - -fn test_network_context() { - use fvm_shared::econ::TokenAmount; - use fvm_shared::version::NetworkVersion; - assert_eq!(sdk::network::chain_id(), ChainID::from(1)); // hehe we are ETH now - assert_eq!(sdk::network::curr_epoch(), 0); - assert_eq!(sdk::network::version(), NetworkVersion::V18); - assert_eq!(sdk::network::tipset_timestamp(), 0); - assert_eq!(sdk::network::base_fee(), TokenAmount::from_atto(100)); -} - -fn test_message_context() { - assert_eq!(sdk::message::nonce(), 100); - assert_eq!(sdk::message::origin(), 100); - assert_eq!(sdk::message::caller(), 100); - assert_eq!(sdk::message::receiver(), 10000); - assert_eq!(sdk::message::method_number(), 1); - assert!(sdk::message::value_received().is_zero()); - assert!(sdk::message::gas_premium().is_zero()); -} - -fn test_balance() { - // Getting the balance of a non-existent actor should return None. - assert_eq!(sdk::actor::balance_of(9191919), None); - - // Our balance should match. - assert_eq!( - sdk::actor::balance_of(sdk::message::receiver()), - Some(sdk::sself::current_balance()) - ); -} - -/// Test to make sure we can return into unaligned pointers. Technically, we use repr-packed -/// everywhere so this should always work, but we should test anyways. -fn test_unaligned() { - unsafe { - #[link(wasm_import_module = "network")] - extern "C" { - #[link_name = "context"] - fn context_raw(out: *mut NetworkContext) -> u32; - } - - #[repr(packed, C)] - struct Unaligned { - _padding: u8, - ctx: NetworkContext, - } - let mut unaligned: Unaligned = std::mem::zeroed(); - assert_eq!(context_raw(ptr::addr_of_mut!(unaligned.ctx)), 0); - let out_ptr = ptr::addr_of!(unaligned.ctx); - let actual: NetworkContext = ptr::read_unaligned(out_ptr); - let expected = context().unwrap(); - assert_eq!(expected, actual); - } -} diff --git a/testing/test_actors/actors/fil-syscall-actor/src/lib.rs b/testing/test_actors/actors/fil-syscall-actor/src/lib.rs deleted file mode 100644 index 1d4daedef..000000000 --- a/testing/test_actors/actors/fil-syscall-actor/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -#[cfg(target_arch = "wasm32")] -mod actor; diff --git a/testing/test_actors/build.rs b/testing/test_actors/build.rs deleted file mode 100644 index a1865c6f5..000000000 --- a/testing/test_actors/build.rs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -use std::error::Error; -use std::fs::File; -use std::io::{BufRead, BufReader, BufWriter, Write}; -use std::path::{Path, PathBuf}; -use std::process::{Command, Stdio}; -use std::thread; - -const ACTORS: &[(&str, &str)] = &[ - // calibration test actors - ("GAS_CALIBRATION_ACTOR_BINARY", "fil_gas_calibration_actor"), - // integration test - ("HELLO_WORLD_ACTOR_BINARY", "fil_hello_world_actor"), - ("STACK_OVERFLOW_ACTOR_BINARY", "fil_stack_overflow_actor"), - ("IPLD_ACTOR_BINARY", "fil_ipld_actor"), - ( - "MALFORMED_SYSCALL_ACTOR_BINARY", - "fil_malformed_syscall_actor", - ), - ( - "INTEGER_OVERFLOW_ACTOR_BINARY", - "fil_integer_overflow_actor", - ), - ("SYSCALL_ACTOR_BINARY", "fil_syscall_actor"), - ("ADDRESS_ACTOR_BINARY", "fil_address_actor"), - ("EVENTS_ACTOR_BINARY", "fil_events_actor"), - ("EXIT_DATA_ACTOR_BINARY", "fil_exit_data_actor"), - ("GASLIMIT_ACTOR_BINARY", "fil_gaslimit_actor"), - ("READONLY_ACTOR_BINARY", "fil_readonly_actor"), - ("CREATE_ACTOR_BINARY", "fil_create_actor"), - ("OOM_ACTOR_BINARY", "fil_oom_actor"), - ("SSELF_ACTOR_BINARY", "fil_sself_actor"), -]; - -const WASM_TARGET: &str = "wasm32-unknown-unknown"; - -fn main() -> Result<(), Box> { - // Cargo executable location. - let cargo = std::env::var_os("CARGO").expect("no CARGO env var"); - - let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").expect("no OUT_DIR env var")); - let bundle_dir = out_dir.join("bundle"); - println!("cargo:warning=bundle_dir: {:?}", &bundle_dir); - - let manifest_path = - Path::new(&std::env::var_os("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR unset")) - .join("Cargo.toml"); - - for file in ["Cargo.toml", "src", "actors"] { - println!("cargo:rerun-if-changed={}", file); - } - - // Cargo build command for all actors at once. - let mut cmd = Command::new(cargo); - cmd.arg("build") - .args(ACTORS.iter().map(|(_, pkg)| "-p=".to_owned() + pkg)) - .arg(format!("--target={WASM_TARGET}")) - .arg("--profile=wasm") - .arg("--locked") - .arg("--manifest-path=".to_owned() + manifest_path.to_str().unwrap()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - // We are supposed to only generate artifacts under OUT_DIR, - // so set OUT_DIR as the target directory for this build. - .env("CARGO_TARGET_DIR", &bundle_dir) - // As we are being called inside a build-script, this env variable is set. However, we set - // our own `RUSTFLAGS` and thus, we need to remove this. Otherwise cargo favors this - // env variable. - .env_remove("CARGO_ENCODED_RUSTFLAGS"); - - // Print out the command line we're about to run. - println!("cargo:warning=cmd={:?}", &cmd); - - // Launch the command. - let mut child = cmd.spawn().expect("failed to launch cargo build"); - - // Pipe the output as cargo warnings. Unfortunately this is the only way to - // get cargo build to print the output. - let stdout = child.stdout.take().expect("no stdout"); - let stderr = child.stderr.take().expect("no stderr"); - let j1 = thread::spawn(move || { - for line in BufReader::new(stderr).lines() { - println!("cargo:warning={:?}", line.unwrap()); - } - }); - let j2 = thread::spawn(move || { - for line in BufReader::new(stdout).lines() { - println!("cargo:warning={:?}", line.unwrap()); - } - }); - - j1.join().unwrap(); - j2.join().unwrap(); - - let result = child.wait().expect("failed to wait for build to finish"); - if !result.success() { - return Err("actor build failed".into()); - } - - let wasm_bin_file = - File::create(out_dir.join("wasm_bin.rs")).expect("failed to create manifest"); - let mut wasm_bin_file = BufWriter::new(wasm_bin_file); - for (var, pkg) in ACTORS { - let bin = bundle_dir - .join(WASM_TARGET) - .join("wasm") - .join(format!("{pkg}.wasm")); - writeln!( - &mut wasm_bin_file, - "pub const {var}: &[u8] = include_bytes!({bin:?});" - ) - .expect("failed to write to manifest"); - } - wasm_bin_file.flush().expect("failed to flush manifest"); - Ok(()) -} diff --git a/testing/test_actors/src/lib.rs b/testing/test_actors/src/lib.rs deleted file mode 100644 index f162d46aa..000000000 --- a/testing/test_actors/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT -pub mod wasm_bin { - include!(concat!(env!("OUT_DIR"), "/wasm_bin.rs")); -} diff --git a/tools/contracts/benchmarks/RecursiveDelegateCall.sol b/tools/contracts/benchmarks/RecursiveDelegateCall.sol deleted file mode 100644 index b93e2c87a..000000000 --- a/tools/contracts/benchmarks/RecursiveDelegateCall.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.17; - -contract RecursiveDelegatecall { - event RecursiveCallEvent(uint256 count, address self); - // event RecursiveCallReturnEvent(bool success, bytes returnedData); - uint public totalCalls; - - function recursiveCall(uint256 count) public returns (uint256) { - emit RecursiveCallEvent(count, address(this)); - totalCalls += 1; - if (count > 1) { - count -= 1; - (bool success, bytes memory returnedData) = address(this).delegatecall( - abi.encodeWithSignature("recursiveCall(uint256)", count) - ); - // emit RecursiveCallReturnEvent(success, returnedData); - return count; - } - return count; - } -} - diff --git a/tools/contracts/benchmarks/RecursiveDelegatecall.bin b/tools/contracts/benchmarks/RecursiveDelegatecall.bin deleted file mode 100644 index fda2f9e86..000000000 --- a/tools/contracts/benchmarks/RecursiveDelegatecall.bin +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b50610459806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633af3f24f1461003b578063ec49254c14610059575b600080fd5b610043610089565b6040516100509190610221565b60405180910390f35b610073600480360381019061006e919061026d565b61008f565b6040516100809190610221565b60405180910390f35b60005481565b60007faab69767807d0ab32f0099452739da31b76ecd3e8694bb49898829c8bf9d063582306040516100c29291906102db565b60405180910390a160016000808282546100dc9190610333565b9250508190555060018211156101ff576001826100f99190610367565b91506000803073ffffffffffffffffffffffffffffffffffffffff16846040516024016101269190610221565b6040516020818303038152906040527fec49254c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101b0919061040c565b600060405180830381855af49150503d80600081146101eb576040519150601f19603f3d011682016040523d82523d6000602084013e6101f0565b606091505b50915091508392505050610203565b8190505b919050565b6000819050919050565b61021b81610208565b82525050565b60006020820190506102366000830184610212565b92915050565b600080fd5b61024a81610208565b811461025557600080fd5b50565b60008135905061026781610241565b92915050565b6000602082840312156102835761028261023c565b5b600061029184828501610258565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102c58261029a565b9050919050565b6102d5816102ba565b82525050565b60006040820190506102f06000830185610212565b6102fd60208301846102cc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061033e82610208565b915061034983610208565b925082820190508082111561036157610360610304565b5b92915050565b600061037282610208565b915061037d83610208565b925082820390508181111561039557610394610304565b5b92915050565b600081519050919050565b600081905092915050565b60005b838110156103cf5780820151818401526020810190506103b4565b60008484015250505050565b60006103e68261039b565b6103f081856103a6565b93506104008185602086016103b1565b80840191505092915050565b600061041882846103db565b91508190509291505056fea26469706673582212209cae39168969de56e3b240f8adcf7f91027754b77fbfaf5ad9a95aec83a5219364736f6c63430008110033 \ No newline at end of file diff --git a/tools/contracts/benchmarks/RecursiveDelegatecall.signatures b/tools/contracts/benchmarks/RecursiveDelegatecall.signatures deleted file mode 100644 index 5c380e74c..000000000 --- a/tools/contracts/benchmarks/RecursiveDelegatecall.signatures +++ /dev/null @@ -1,6 +0,0 @@ -Function signatures: -ec49254c: recursiveCall(uint256) -3af3f24f: totalCalls() - -Event signatures: -aab69767807d0ab32f0099452739da31b76ecd3e8694bb49898829c8bf9d0635: RecursiveCallEvent(uint256,address) diff --git a/tools/contracts/benchmarks/SimpleCoin.bin b/tools/contracts/benchmarks/SimpleCoin.bin deleted file mode 100644 index a9b550f3b..000000000 --- a/tools/contracts/benchmarks/SimpleCoin.bin +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610795806100656000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80637bd703e81461005157806390b98a1114610081578063c0626aa2146100b1578063f8b2cb4f146100e1575b600080fd5b61006b600480360381019061006691906103eb565b610111565b6040516100789190610431565b60405180910390f35b61009b60048036038101906100969190610478565b61012f565b6040516100a891906104d3565b60405180910390f35b6100cb60048036038101906100c691906104ee565b61029a565b6040516100d891906104d3565b60405180910390f35b6100fb60048036038101906100f691906103eb565b610340565b6040516101089190610431565b60405180910390f35b6000600261011e83610340565b610128919061054a565b9050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156101805760009050610294565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101ce919061058c565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461022391906105c0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516102879190610431565b60405180910390a3600190505b92915050565b6000600182116102ad576102ac6105f4565b5b60058210156102f45760026040517f442666110000000000000000000000000000000000000000000000000000000081526004016102eb91906106c5565b60405180910390fd5b600a8211610337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032e9061073f565b60405180910390fd5b60019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103b88261038d565b9050919050565b6103c8816103ad565b81146103d357600080fd5b50565b6000813590506103e5816103bf565b92915050565b60006020828403121561040157610400610388565b5b600061040f848285016103d6565b91505092915050565b6000819050919050565b61042b81610418565b82525050565b60006020820190506104466000830184610422565b92915050565b61045581610418565b811461046057600080fd5b50565b6000813590506104728161044c565b92915050565b6000806040838503121561048f5761048e610388565b5b600061049d858286016103d6565b92505060206104ae85828601610463565b9150509250929050565b60008115159050919050565b6104cd816104b8565b82525050565b60006020820190506104e860008301846104c4565b92915050565b60006020828403121561050457610503610388565b5b600061051284828501610463565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061055582610418565b915061056083610418565b925082820261056e81610418565b915082820484148315176105855761058461051b565b5b5092915050565b600061059782610418565b91506105a283610418565b92508282039050818111156105ba576105b961051b565b5b92915050565b60006105cb82610418565b91506105d683610418565b92508282019050808211156105ee576105ed61051b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082825260208201905092915050565b7f4c657373207468616e2066697665000000000000000000000000000000000000600082015250565b600061066a600e83610623565b915061067582610634565b602082019050919050565b6000819050919050565b6000819050919050565b60006106af6106aa6106a584610680565b61068a565b610418565b9050919050565b6106bf81610694565b82525050565b600060408201905081810360008301526106de8161065d565b90506106ed60208301846106b6565b92915050565b7f4c657373205468616e2074656e00000000000000000000000000000000000000600082015250565b6000610729600d83610623565b9150610734826106f3565b602082019050919050565b600060208201905081810360008301526107588161071c565b905091905056fea2646970667358221220a6ed6e1ad429eb3ff6712942fd81d137f4187d47310e3bbddc2af76ee5c585ba64736f6c63430008120033 \ No newline at end of file diff --git a/tools/contracts/benchmarks/SimpleCoin.sol b/tools/contracts/benchmarks/SimpleCoin.sol deleted file mode 100644 index afd1adc4b..000000000 --- a/tools/contracts/benchmarks/SimpleCoin.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.2; - -contract SimpleCoin { - mapping(address => uint256) balances; - - event Transfer(address indexed _from, address indexed _to, uint256 _value); - - error lessThanFive(string err, uint256 code); - - constructor() { - balances[tx.origin] = 10000; - } - - function sendCoin( - address receiver, - uint256 amount - ) public returns (bool sufficient) { - if (balances[msg.sender] < amount) return false; - balances[msg.sender] -= amount; - balances[receiver] += amount; - emit Transfer(msg.sender, receiver, amount); - return true; - } - - function greaterThanTen(uint256 num) public pure returns (bool) { - assert(num > 1); - if (num < 5) revert lessThanFive("Less than five", 2); - require(num > 10, "Less Than ten"); - return true; - } - - function getBalanceInEth(address addr) public view returns (uint256) { - return getBalance(addr) * 2; - } - - function getBalance(address addr) public view returns (uint256) { - return balances[addr]; - } -} diff --git a/tools/contracts/benchmarks/banker.bin b/tools/contracts/benchmarks/banker.bin deleted file mode 100644 index e61c9fd90..000000000 --- a/tools/contracts/benchmarks/banker.bin +++ /dev/null @@ -1 +0,0 @@ -602d80600b6000396000f3306103e85b90803150803150803150803150803150803150803150803150803150803150906001900380600457 \ No newline at end of file diff --git a/tools/contracts/benchmarks/banker.eas b/tools/contracts/benchmarks/banker.eas deleted file mode 100644 index 4ffd9bcea..000000000 --- a/tools/contracts/benchmarks/banker.eas +++ /dev/null @@ -1,12 +0,0 @@ -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("banker_body.eas") -body_end: \ No newline at end of file diff --git a/tools/contracts/benchmarks/banker_body.eas b/tools/contracts/benchmarks/banker_body.eas deleted file mode 100644 index db74545dd..000000000 --- a/tools/contracts/benchmarks/banker_body.eas +++ /dev/null @@ -1,52 +0,0 @@ -address - -## Iterations -%push(1000) # address | iters - -loop: -jumpdest - -swap1 # iters | address - -dup1 # iters | address | address -balance # iters | address | balance -pop # iters | address -dup1 # iters | address | address -balance # ... -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop -dup1 -balance -pop - -swap1 # address | iters - -# Update the counter. -%push(1) # address | iters | 1 -swap1 # address | 1 | iters -sub # address | iters-1 - -# maybe jump -dup1 -%push(loop) -jumpi \ No newline at end of file diff --git a/tools/contracts/benchmarks/easx b/tools/contracts/benchmarks/easx deleted file mode 100755 index 95106b0a6..000000000 --- a/tools/contracts/benchmarks/easx +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -compile() { - src=$1 - bin="$(basename $src .eas).bin" - echo "Assemble $src -> $bin" - eas $src | tr -d '\n' > $bin -} - -for x in $*; do - compile $x; -done diff --git a/tools/contracts/benchmarks/empty.bin b/tools/contracts/benchmarks/empty.bin deleted file mode 100644 index e69de29bb..000000000 diff --git a/tools/contracts/benchmarks/fibomaon.bin b/tools/contracts/benchmarks/fibomaon.bin deleted file mode 100644 index dd053a583..000000000 --- a/tools/contracts/benchmarks/fibomaon.bin +++ /dev/null @@ -1 +0,0 @@ -602280600b6000396000f36103e8600160015b80910160018303809350156019576007565b60005260206000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/fibomaon.eas b/tools/contracts/benchmarks/fibomaon.eas deleted file mode 100644 index 0a7a76331..000000000 --- a/tools/contracts/benchmarks/fibomaon.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that computes the 1000th non trivial fibo (ie ignoring the first two 1s) - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("fibomaon_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/fibomaon_body.eas b/tools/contracts/benchmarks/fibomaon_body.eas deleted file mode 100644 index 456cc61d7..000000000 --- a/tools/contracts/benchmarks/fibomaon_body.eas +++ /dev/null @@ -1,48 +0,0 @@ -## iterations of the loop -%push(1000) - -## initial values -push1 0x01 -push1 0x01 - -loop: -jumpdest - -## ... iter | fibo_1 | fibo_2 -dup1 -## ... iter | fibo_1 | fibo_2 | fibo_2 -swap2 -## ... iter | fibo_2 | fibo_2 | fibo_1 -add - -## ... iter | fibo_2 | fibo_3 -push1 0x01 -## ... iter | fibo_2 | fibo_3 | 1 -dup4 -## ... iter | fibo_2 | fibo_3 | 1 | iter -sub -## ... iter | fibo_2 | fibo_3 | iter - 1 -dup1 -## ... iter | fibo_2 | fibo_3 | iter - 1 | iter - 1 -swap4 -## ... iter-1 | fibo_2 | fibo_3 | iter - 1 | iter -pop -## ... iter-1 | fibo_2 | fibo_3 | iter - 1 - -## iter -1 == 0 -> jump done -iszero -%push(done) -jumpi - -%push(loop) -jump - -# return the final value -done: -jumpdest - -push1 0x00 -mstore -push1 0x20 -push1 0x00 -return diff --git a/tools/contracts/benchmarks/jmpfest-gen.ss b/tools/contracts/benchmarks/jmpfest-gen.ss deleted file mode 100755 index bfb447eed..000000000 --- a/tools/contracts/benchmarks/jmpfest-gen.ss +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env gxi -;; This script was used to generate the bodies of the two jumpfest contracts, -;; (linear and random). You shouldn't have to run it, but it is here as reference -;; if you want to understand the logic behind the two contracts. -;; Some complain that it is written in an alien language, but it is a one-shot script -;; that took me 10 min to write (as opposed to the 3 hours and frustration it would -;; take me to write it in rust), so you'll have to deal. Rust is good(ish) for lot of things, -;; but suitable for quick hacking it is not. - -(import :std/iter - :std/format - :std/misc/shuffle) - -(def (main what) - (case what - (("linear") - (generate-linear)) - (("random") - (generate-random)) - (else - (error "I don't know how to generate " what)))) - -(def (generate-linear) - (let* ((labels (make-labels)) - (targets (append (cdr labels) [(car labels)]))) - (with-output-to-file "jmpfest_linear_body.eas" (cut generate labels targets)))) - -(def (generate-random) - (let* ((labels (make-labels)) - (targets (shuffle labels))) - ;; verify that nothing jumps to itself - (for ((lbl labels) (tgt targets)) - (when (equal? lbl tgt) - (error "oh shit, self-jump; try again"))) - (with-output-to-file "jmpfest_random_body.eas" (cut generate labels targets)))) - -(def num-labels 1500) -(def num-iterations 1000000) - -(def (make-labels) - (map (cut format "L~a" <>) (iota num-labels))) - -(def (generate labels targets) - (ins "%push(~a)" num-iterations) - (for ((lbl labels) - (tgt targets)) - (ins "~a:" lbl) - (ins "jumpdest") - (ins "%push(1)") - (ins "swap1") - (ins "sub") - (ins "dup1") - (ins "iszero") - (ins "%push(done)") - (ins "jumpi") - (ins "%push(~a)" tgt) - (ins "jump")) - (ins "done:") - (ins "jumpdest") - (ins "%push(0)") - (ins "%push(0)") - (ins "return")) - -(def (ins fmt . args) - (displayln (apply format fmt args))) diff --git a/tools/contracts/benchmarks/jmpfest_linear.bin b/tools/contracts/benchmarks/jmpfest_linear.bin deleted file mode 100644 index 81baace89..000000000 --- a/tools/contracts/benchmarks/jmpfest_linear.bin +++ /dev/null @@ -1 +0,0 @@ -6157dc80600c6000396000f3620f42405b6001900380156157d6576012565b6001900380156157d6576020565b6001900380156157d657602e565b6001900380156157d657603c565b6001900380156157d657604a565b6001900380156157d6576058565b6001900380156157d6576066565b6001900380156157d6576074565b6001900380156157d6576082565b6001900380156157d6576090565b6001900380156157d657609e565b6001900380156157d65760ac565b6001900380156157d65760ba565b6001900380156157d65760c8565b6001900380156157d65760d6565b6001900380156157d65760e4565b6001900380156157d65760f2565b6001900380156157d657610101565b6001900380156157d657610110565b6001900380156157d65761011f565b6001900380156157d65761012e565b6001900380156157d65761013d565b6001900380156157d65761014c565b6001900380156157d65761015b565b6001900380156157d65761016a565b6001900380156157d657610179565b6001900380156157d657610188565b6001900380156157d657610197565b6001900380156157d6576101a6565b6001900380156157d6576101b5565b6001900380156157d6576101c4565b6001900380156157d6576101d3565b6001900380156157d6576101e2565b6001900380156157d6576101f1565b6001900380156157d657610200565b6001900380156157d65761020f565b6001900380156157d65761021e565b6001900380156157d65761022d565b6001900380156157d65761023c565b6001900380156157d65761024b565b6001900380156157d65761025a565b6001900380156157d657610269565b6001900380156157d657610278565b6001900380156157d657610287565b6001900380156157d657610296565b6001900380156157d6576102a5565b6001900380156157d6576102b4565b6001900380156157d6576102c3565b6001900380156157d6576102d2565b6001900380156157d6576102e1565b6001900380156157d6576102f0565b6001900380156157d6576102ff565b6001900380156157d65761030e565b6001900380156157d65761031d565b6001900380156157d65761032c565b6001900380156157d65761033b565b6001900380156157d65761034a565b6001900380156157d657610359565b6001900380156157d657610368565b6001900380156157d657610377565b6001900380156157d657610386565b6001900380156157d657610395565b6001900380156157d6576103a4565b6001900380156157d6576103b3565b6001900380156157d6576103c2565b6001900380156157d6576103d1565b6001900380156157d6576103e0565b6001900380156157d6576103ef565b6001900380156157d6576103fe565b6001900380156157d65761040d565b6001900380156157d65761041c565b6001900380156157d65761042b565b6001900380156157d65761043a565b6001900380156157d657610449565b6001900380156157d657610458565b6001900380156157d657610467565b6001900380156157d657610476565b6001900380156157d657610485565b6001900380156157d657610494565b6001900380156157d6576104a3565b6001900380156157d6576104b2565b6001900380156157d6576104c1565b6001900380156157d6576104d0565b6001900380156157d6576104df565b6001900380156157d6576104ee565b6001900380156157d6576104fd565b6001900380156157d65761050c565b6001900380156157d65761051b565b6001900380156157d65761052a565b6001900380156157d657610539565b6001900380156157d657610548565b6001900380156157d657610557565b6001900380156157d657610566565b6001900380156157d657610575565b6001900380156157d657610584565b6001900380156157d657610593565b6001900380156157d6576105a2565b6001900380156157d6576105b1565b6001900380156157d6576105c0565b6001900380156157d6576105cf565b6001900380156157d6576105de565b6001900380156157d6576105ed565b6001900380156157d6576105fc565b6001900380156157d65761060b565b6001900380156157d65761061a565b6001900380156157d657610629565b6001900380156157d657610638565b6001900380156157d657610647565b6001900380156157d657610656565b6001900380156157d657610665565b6001900380156157d657610674565b6001900380156157d657610683565b6001900380156157d657610692565b6001900380156157d6576106a1565b6001900380156157d6576106b0565b6001900380156157d6576106bf565b6001900380156157d6576106ce565b6001900380156157d6576106dd565b6001900380156157d6576106ec565b6001900380156157d6576106fb565b6001900380156157d65761070a565b6001900380156157d657610719565b6001900380156157d657610728565b6001900380156157d657610737565b6001900380156157d657610746565b6001900380156157d657610755565b6001900380156157d657610764565b6001900380156157d657610773565b6001900380156157d657610782565b6001900380156157d657610791565b6001900380156157d6576107a0565b6001900380156157d6576107af565b6001900380156157d6576107be565b6001900380156157d6576107cd565b6001900380156157d6576107dc565b6001900380156157d6576107eb565b6001900380156157d6576107fa565b6001900380156157d657610809565b6001900380156157d657610818565b6001900380156157d657610827565b6001900380156157d657610836565b6001900380156157d657610845565b6001900380156157d657610854565b6001900380156157d657610863565b6001900380156157d657610872565b6001900380156157d657610881565b6001900380156157d657610890565b6001900380156157d65761089f565b6001900380156157d6576108ae565b6001900380156157d6576108bd565b6001900380156157d6576108cc565b6001900380156157d6576108db565b6001900380156157d6576108ea565b6001900380156157d6576108f9565b6001900380156157d657610908565b6001900380156157d657610917565b6001900380156157d657610926565b6001900380156157d657610935565b6001900380156157d657610944565b6001900380156157d657610953565b6001900380156157d657610962565b6001900380156157d657610971565b6001900380156157d657610980565b6001900380156157d65761098f565b6001900380156157d65761099e565b6001900380156157d6576109ad565b6001900380156157d6576109bc565b6001900380156157d6576109cb565b6001900380156157d6576109da565b6001900380156157d6576109e9565b6001900380156157d6576109f8565b6001900380156157d657610a07565b6001900380156157d657610a16565b6001900380156157d657610a25565b6001900380156157d657610a34565b6001900380156157d657610a43565b6001900380156157d657610a52565b6001900380156157d657610a61565b6001900380156157d657610a70565b6001900380156157d657610a7f565b6001900380156157d657610a8e565b6001900380156157d657610a9d565b6001900380156157d657610aac565b6001900380156157d657610abb565b6001900380156157d657610aca565b6001900380156157d657610ad9565b6001900380156157d657610ae8565b6001900380156157d657610af7565b6001900380156157d657610b06565b6001900380156157d657610b15565b6001900380156157d657610b24565b6001900380156157d657610b33565b6001900380156157d657610b42565b6001900380156157d657610b51565b6001900380156157d657610b60565b6001900380156157d657610b6f565b6001900380156157d657610b7e565b6001900380156157d657610b8d565b6001900380156157d657610b9c565b6001900380156157d657610bab565b6001900380156157d657610bba565b6001900380156157d657610bc9565b6001900380156157d657610bd8565b6001900380156157d657610be7565b6001900380156157d657610bf6565b6001900380156157d657610c05565b6001900380156157d657610c14565b6001900380156157d657610c23565b6001900380156157d657610c32565b6001900380156157d657610c41565b6001900380156157d657610c50565b6001900380156157d657610c5f565b6001900380156157d657610c6e565b6001900380156157d657610c7d565b6001900380156157d657610c8c565b6001900380156157d657610c9b565b6001900380156157d657610caa565b6001900380156157d657610cb9565b6001900380156157d657610cc8565b6001900380156157d657610cd7565b6001900380156157d657610ce6565b6001900380156157d657610cf5565b6001900380156157d657610d04565b6001900380156157d657610d13565b6001900380156157d657610d22565b6001900380156157d657610d31565b6001900380156157d657610d40565b6001900380156157d657610d4f565b6001900380156157d657610d5e565b6001900380156157d657610d6d565b6001900380156157d657610d7c565b6001900380156157d657610d8b565b6001900380156157d657610d9a565b6001900380156157d657610da9565b6001900380156157d657610db8565b6001900380156157d657610dc7565b6001900380156157d657610dd6565b6001900380156157d657610de5565b6001900380156157d657610df4565b6001900380156157d657610e03565b6001900380156157d657610e12565b6001900380156157d657610e21565b6001900380156157d657610e30565b6001900380156157d657610e3f565b6001900380156157d657610e4e565b6001900380156157d657610e5d565b6001900380156157d657610e6c565b6001900380156157d657610e7b565b6001900380156157d657610e8a565b6001900380156157d657610e99565b6001900380156157d657610ea8565b6001900380156157d657610eb7565b6001900380156157d657610ec6565b6001900380156157d657610ed5565b6001900380156157d657610ee4565b6001900380156157d657610ef3565b6001900380156157d657610f02565b6001900380156157d657610f11565b6001900380156157d657610f20565b6001900380156157d657610f2f565b6001900380156157d657610f3e565b6001900380156157d657610f4d565b6001900380156157d657610f5c565b6001900380156157d657610f6b565b6001900380156157d657610f7a565b6001900380156157d657610f89565b6001900380156157d657610f98565b6001900380156157d657610fa7565b6001900380156157d657610fb6565b6001900380156157d657610fc5565b6001900380156157d657610fd4565b6001900380156157d657610fe3565b6001900380156157d657610ff2565b6001900380156157d657611001565b6001900380156157d657611010565b6001900380156157d65761101f565b6001900380156157d65761102e565b6001900380156157d65761103d565b6001900380156157d65761104c565b6001900380156157d65761105b565b6001900380156157d65761106a565b6001900380156157d657611079565b6001900380156157d657611088565b6001900380156157d657611097565b6001900380156157d6576110a6565b6001900380156157d6576110b5565b6001900380156157d6576110c4565b6001900380156157d6576110d3565b6001900380156157d6576110e2565b6001900380156157d6576110f1565b6001900380156157d657611100565b6001900380156157d65761110f565b6001900380156157d65761111e565b6001900380156157d65761112d565b6001900380156157d65761113c565b6001900380156157d65761114b565b6001900380156157d65761115a565b6001900380156157d657611169565b6001900380156157d657611178565b6001900380156157d657611187565b6001900380156157d657611196565b6001900380156157d6576111a5565b6001900380156157d6576111b4565b6001900380156157d6576111c3565b6001900380156157d6576111d2565b6001900380156157d6576111e1565b6001900380156157d6576111f0565b6001900380156157d6576111ff565b6001900380156157d65761120e565b6001900380156157d65761121d565b6001900380156157d65761122c565b6001900380156157d65761123b565b6001900380156157d65761124a565b6001900380156157d657611259565b6001900380156157d657611268565b6001900380156157d657611277565b6001900380156157d657611286565b6001900380156157d657611295565b6001900380156157d6576112a4565b6001900380156157d6576112b3565b6001900380156157d6576112c2565b6001900380156157d6576112d1565b6001900380156157d6576112e0565b6001900380156157d6576112ef565b6001900380156157d6576112fe565b6001900380156157d65761130d565b6001900380156157d65761131c565b6001900380156157d65761132b565b6001900380156157d65761133a565b6001900380156157d657611349565b6001900380156157d657611358565b6001900380156157d657611367565b6001900380156157d657611376565b6001900380156157d657611385565b6001900380156157d657611394565b6001900380156157d6576113a3565b6001900380156157d6576113b2565b6001900380156157d6576113c1565b6001900380156157d6576113d0565b6001900380156157d6576113df565b6001900380156157d6576113ee565b6001900380156157d6576113fd565b6001900380156157d65761140c565b6001900380156157d65761141b565b6001900380156157d65761142a565b6001900380156157d657611439565b6001900380156157d657611448565b6001900380156157d657611457565b6001900380156157d657611466565b6001900380156157d657611475565b6001900380156157d657611484565b6001900380156157d657611493565b6001900380156157d6576114a2565b6001900380156157d6576114b1565b6001900380156157d6576114c0565b6001900380156157d6576114cf565b6001900380156157d6576114de565b6001900380156157d6576114ed565b6001900380156157d6576114fc565b6001900380156157d65761150b565b6001900380156157d65761151a565b6001900380156157d657611529565b6001900380156157d657611538565b6001900380156157d657611547565b6001900380156157d657611556565b6001900380156157d657611565565b6001900380156157d657611574565b6001900380156157d657611583565b6001900380156157d657611592565b6001900380156157d6576115a1565b6001900380156157d6576115b0565b6001900380156157d6576115bf565b6001900380156157d6576115ce565b6001900380156157d6576115dd565b6001900380156157d6576115ec565b6001900380156157d6576115fb565b6001900380156157d65761160a565b6001900380156157d657611619565b6001900380156157d657611628565b6001900380156157d657611637565b6001900380156157d657611646565b6001900380156157d657611655565b6001900380156157d657611664565b6001900380156157d657611673565b6001900380156157d657611682565b6001900380156157d657611691565b6001900380156157d6576116a0565b6001900380156157d6576116af565b6001900380156157d6576116be565b6001900380156157d6576116cd565b6001900380156157d6576116dc565b6001900380156157d6576116eb565b6001900380156157d6576116fa565b6001900380156157d657611709565b6001900380156157d657611718565b6001900380156157d657611727565b6001900380156157d657611736565b6001900380156157d657611745565b6001900380156157d657611754565b6001900380156157d657611763565b6001900380156157d657611772565b6001900380156157d657611781565b6001900380156157d657611790565b6001900380156157d65761179f565b6001900380156157d6576117ae565b6001900380156157d6576117bd565b6001900380156157d6576117cc565b6001900380156157d6576117db565b6001900380156157d6576117ea565b6001900380156157d6576117f9565b6001900380156157d657611808565b6001900380156157d657611817565b6001900380156157d657611826565b6001900380156157d657611835565b6001900380156157d657611844565b6001900380156157d657611853565b6001900380156157d657611862565b6001900380156157d657611871565b6001900380156157d657611880565b6001900380156157d65761188f565b6001900380156157d65761189e565b6001900380156157d6576118ad565b6001900380156157d6576118bc565b6001900380156157d6576118cb565b6001900380156157d6576118da565b6001900380156157d6576118e9565b6001900380156157d6576118f8565b6001900380156157d657611907565b6001900380156157d657611916565b6001900380156157d657611925565b6001900380156157d657611934565b6001900380156157d657611943565b6001900380156157d657611952565b6001900380156157d657611961565b6001900380156157d657611970565b6001900380156157d65761197f565b6001900380156157d65761198e565b6001900380156157d65761199d565b6001900380156157d6576119ac565b6001900380156157d6576119bb565b6001900380156157d6576119ca565b6001900380156157d6576119d9565b6001900380156157d6576119e8565b6001900380156157d6576119f7565b6001900380156157d657611a06565b6001900380156157d657611a15565b6001900380156157d657611a24565b6001900380156157d657611a33565b6001900380156157d657611a42565b6001900380156157d657611a51565b6001900380156157d657611a60565b6001900380156157d657611a6f565b6001900380156157d657611a7e565b6001900380156157d657611a8d565b6001900380156157d657611a9c565b6001900380156157d657611aab565b6001900380156157d657611aba565b6001900380156157d657611ac9565b6001900380156157d657611ad8565b6001900380156157d657611ae7565b6001900380156157d657611af6565b6001900380156157d657611b05565b6001900380156157d657611b14565b6001900380156157d657611b23565b6001900380156157d657611b32565b6001900380156157d657611b41565b6001900380156157d657611b50565b6001900380156157d657611b5f565b6001900380156157d657611b6e565b6001900380156157d657611b7d565b6001900380156157d657611b8c565b6001900380156157d657611b9b565b6001900380156157d657611baa565b6001900380156157d657611bb9565b6001900380156157d657611bc8565b6001900380156157d657611bd7565b6001900380156157d657611be6565b6001900380156157d657611bf5565b6001900380156157d657611c04565b6001900380156157d657611c13565b6001900380156157d657611c22565b6001900380156157d657611c31565b6001900380156157d657611c40565b6001900380156157d657611c4f565b6001900380156157d657611c5e565b6001900380156157d657611c6d565b6001900380156157d657611c7c565b6001900380156157d657611c8b565b6001900380156157d657611c9a565b6001900380156157d657611ca9565b6001900380156157d657611cb8565b6001900380156157d657611cc7565b6001900380156157d657611cd6565b6001900380156157d657611ce5565b6001900380156157d657611cf4565b6001900380156157d657611d03565b6001900380156157d657611d12565b6001900380156157d657611d21565b6001900380156157d657611d30565b6001900380156157d657611d3f565b6001900380156157d657611d4e565b6001900380156157d657611d5d565b6001900380156157d657611d6c565b6001900380156157d657611d7b565b6001900380156157d657611d8a565b6001900380156157d657611d99565b6001900380156157d657611da8565b6001900380156157d657611db7565b6001900380156157d657611dc6565b6001900380156157d657611dd5565b6001900380156157d657611de4565b6001900380156157d657611df3565b6001900380156157d657611e02565b6001900380156157d657611e11565b6001900380156157d657611e20565b6001900380156157d657611e2f565b6001900380156157d657611e3e565b6001900380156157d657611e4d565b6001900380156157d657611e5c565b6001900380156157d657611e6b565b6001900380156157d657611e7a565b6001900380156157d657611e89565b6001900380156157d657611e98565b6001900380156157d657611ea7565b6001900380156157d657611eb6565b6001900380156157d657611ec5565b6001900380156157d657611ed4565b6001900380156157d657611ee3565b6001900380156157d657611ef2565b6001900380156157d657611f01565b6001900380156157d657611f10565b6001900380156157d657611f1f565b6001900380156157d657611f2e565b6001900380156157d657611f3d565b6001900380156157d657611f4c565b6001900380156157d657611f5b565b6001900380156157d657611f6a565b6001900380156157d657611f79565b6001900380156157d657611f88565b6001900380156157d657611f97565b6001900380156157d657611fa6565b6001900380156157d657611fb5565b6001900380156157d657611fc4565b6001900380156157d657611fd3565b6001900380156157d657611fe2565b6001900380156157d657611ff1565b6001900380156157d657612000565b6001900380156157d65761200f565b6001900380156157d65761201e565b6001900380156157d65761202d565b6001900380156157d65761203c565b6001900380156157d65761204b565b6001900380156157d65761205a565b6001900380156157d657612069565b6001900380156157d657612078565b6001900380156157d657612087565b6001900380156157d657612096565b6001900380156157d6576120a5565b6001900380156157d6576120b4565b6001900380156157d6576120c3565b6001900380156157d6576120d2565b6001900380156157d6576120e1565b6001900380156157d6576120f0565b6001900380156157d6576120ff565b6001900380156157d65761210e565b6001900380156157d65761211d565b6001900380156157d65761212c565b6001900380156157d65761213b565b6001900380156157d65761214a565b6001900380156157d657612159565b6001900380156157d657612168565b6001900380156157d657612177565b6001900380156157d657612186565b6001900380156157d657612195565b6001900380156157d6576121a4565b6001900380156157d6576121b3565b6001900380156157d6576121c2565b6001900380156157d6576121d1565b6001900380156157d6576121e0565b6001900380156157d6576121ef565b6001900380156157d6576121fe565b6001900380156157d65761220d565b6001900380156157d65761221c565b6001900380156157d65761222b565b6001900380156157d65761223a565b6001900380156157d657612249565b6001900380156157d657612258565b6001900380156157d657612267565b6001900380156157d657612276565b6001900380156157d657612285565b6001900380156157d657612294565b6001900380156157d6576122a3565b6001900380156157d6576122b2565b6001900380156157d6576122c1565b6001900380156157d6576122d0565b6001900380156157d6576122df565b6001900380156157d6576122ee565b6001900380156157d6576122fd565b6001900380156157d65761230c565b6001900380156157d65761231b565b6001900380156157d65761232a565b6001900380156157d657612339565b6001900380156157d657612348565b6001900380156157d657612357565b6001900380156157d657612366565b6001900380156157d657612375565b6001900380156157d657612384565b6001900380156157d657612393565b6001900380156157d6576123a2565b6001900380156157d6576123b1565b6001900380156157d6576123c0565b6001900380156157d6576123cf565b6001900380156157d6576123de565b6001900380156157d6576123ed565b6001900380156157d6576123fc565b6001900380156157d65761240b565b6001900380156157d65761241a565b6001900380156157d657612429565b6001900380156157d657612438565b6001900380156157d657612447565b6001900380156157d657612456565b6001900380156157d657612465565b6001900380156157d657612474565b6001900380156157d657612483565b6001900380156157d657612492565b6001900380156157d6576124a1565b6001900380156157d6576124b0565b6001900380156157d6576124bf565b6001900380156157d6576124ce565b6001900380156157d6576124dd565b6001900380156157d6576124ec565b6001900380156157d6576124fb565b6001900380156157d65761250a565b6001900380156157d657612519565b6001900380156157d657612528565b6001900380156157d657612537565b6001900380156157d657612546565b6001900380156157d657612555565b6001900380156157d657612564565b6001900380156157d657612573565b6001900380156157d657612582565b6001900380156157d657612591565b6001900380156157d6576125a0565b6001900380156157d6576125af565b6001900380156157d6576125be565b6001900380156157d6576125cd565b6001900380156157d6576125dc565b6001900380156157d6576125eb565b6001900380156157d6576125fa565b6001900380156157d657612609565b6001900380156157d657612618565b6001900380156157d657612627565b6001900380156157d657612636565b6001900380156157d657612645565b6001900380156157d657612654565b6001900380156157d657612663565b6001900380156157d657612672565b6001900380156157d657612681565b6001900380156157d657612690565b6001900380156157d65761269f565b6001900380156157d6576126ae565b6001900380156157d6576126bd565b6001900380156157d6576126cc565b6001900380156157d6576126db565b6001900380156157d6576126ea565b6001900380156157d6576126f9565b6001900380156157d657612708565b6001900380156157d657612717565b6001900380156157d657612726565b6001900380156157d657612735565b6001900380156157d657612744565b6001900380156157d657612753565b6001900380156157d657612762565b6001900380156157d657612771565b6001900380156157d657612780565b6001900380156157d65761278f565b6001900380156157d65761279e565b6001900380156157d6576127ad565b6001900380156157d6576127bc565b6001900380156157d6576127cb565b6001900380156157d6576127da565b6001900380156157d6576127e9565b6001900380156157d6576127f8565b6001900380156157d657612807565b6001900380156157d657612816565b6001900380156157d657612825565b6001900380156157d657612834565b6001900380156157d657612843565b6001900380156157d657612852565b6001900380156157d657612861565b6001900380156157d657612870565b6001900380156157d65761287f565b6001900380156157d65761288e565b6001900380156157d65761289d565b6001900380156157d6576128ac565b6001900380156157d6576128bb565b6001900380156157d6576128ca565b6001900380156157d6576128d9565b6001900380156157d6576128e8565b6001900380156157d6576128f7565b6001900380156157d657612906565b6001900380156157d657612915565b6001900380156157d657612924565b6001900380156157d657612933565b6001900380156157d657612942565b6001900380156157d657612951565b6001900380156157d657612960565b6001900380156157d65761296f565b6001900380156157d65761297e565b6001900380156157d65761298d565b6001900380156157d65761299c565b6001900380156157d6576129ab565b6001900380156157d6576129ba565b6001900380156157d6576129c9565b6001900380156157d6576129d8565b6001900380156157d6576129e7565b6001900380156157d6576129f6565b6001900380156157d657612a05565b6001900380156157d657612a14565b6001900380156157d657612a23565b6001900380156157d657612a32565b6001900380156157d657612a41565b6001900380156157d657612a50565b6001900380156157d657612a5f565b6001900380156157d657612a6e565b6001900380156157d657612a7d565b6001900380156157d657612a8c565b6001900380156157d657612a9b565b6001900380156157d657612aaa565b6001900380156157d657612ab9565b6001900380156157d657612ac8565b6001900380156157d657612ad7565b6001900380156157d657612ae6565b6001900380156157d657612af5565b6001900380156157d657612b04565b6001900380156157d657612b13565b6001900380156157d657612b22565b6001900380156157d657612b31565b6001900380156157d657612b40565b6001900380156157d657612b4f565b6001900380156157d657612b5e565b6001900380156157d657612b6d565b6001900380156157d657612b7c565b6001900380156157d657612b8b565b6001900380156157d657612b9a565b6001900380156157d657612ba9565b6001900380156157d657612bb8565b6001900380156157d657612bc7565b6001900380156157d657612bd6565b6001900380156157d657612be5565b6001900380156157d657612bf4565b6001900380156157d657612c03565b6001900380156157d657612c12565b6001900380156157d657612c21565b6001900380156157d657612c30565b6001900380156157d657612c3f565b6001900380156157d657612c4e565b6001900380156157d657612c5d565b6001900380156157d657612c6c565b6001900380156157d657612c7b565b6001900380156157d657612c8a565b6001900380156157d657612c99565b6001900380156157d657612ca8565b6001900380156157d657612cb7565b6001900380156157d657612cc6565b6001900380156157d657612cd5565b6001900380156157d657612ce4565b6001900380156157d657612cf3565b6001900380156157d657612d02565b6001900380156157d657612d11565b6001900380156157d657612d20565b6001900380156157d657612d2f565b6001900380156157d657612d3e565b6001900380156157d657612d4d565b6001900380156157d657612d5c565b6001900380156157d657612d6b565b6001900380156157d657612d7a565b6001900380156157d657612d89565b6001900380156157d657612d98565b6001900380156157d657612da7565b6001900380156157d657612db6565b6001900380156157d657612dc5565b6001900380156157d657612dd4565b6001900380156157d657612de3565b6001900380156157d657612df2565b6001900380156157d657612e01565b6001900380156157d657612e10565b6001900380156157d657612e1f565b6001900380156157d657612e2e565b6001900380156157d657612e3d565b6001900380156157d657612e4c565b6001900380156157d657612e5b565b6001900380156157d657612e6a565b6001900380156157d657612e79565b6001900380156157d657612e88565b6001900380156157d657612e97565b6001900380156157d657612ea6565b6001900380156157d657612eb5565b6001900380156157d657612ec4565b6001900380156157d657612ed3565b6001900380156157d657612ee2565b6001900380156157d657612ef1565b6001900380156157d657612f00565b6001900380156157d657612f0f565b6001900380156157d657612f1e565b6001900380156157d657612f2d565b6001900380156157d657612f3c565b6001900380156157d657612f4b565b6001900380156157d657612f5a565b6001900380156157d657612f69565b6001900380156157d657612f78565b6001900380156157d657612f87565b6001900380156157d657612f96565b6001900380156157d657612fa5565b6001900380156157d657612fb4565b6001900380156157d657612fc3565b6001900380156157d657612fd2565b6001900380156157d657612fe1565b6001900380156157d657612ff0565b6001900380156157d657612fff565b6001900380156157d65761300e565b6001900380156157d65761301d565b6001900380156157d65761302c565b6001900380156157d65761303b565b6001900380156157d65761304a565b6001900380156157d657613059565b6001900380156157d657613068565b6001900380156157d657613077565b6001900380156157d657613086565b6001900380156157d657613095565b6001900380156157d6576130a4565b6001900380156157d6576130b3565b6001900380156157d6576130c2565b6001900380156157d6576130d1565b6001900380156157d6576130e0565b6001900380156157d6576130ef565b6001900380156157d6576130fe565b6001900380156157d65761310d565b6001900380156157d65761311c565b6001900380156157d65761312b565b6001900380156157d65761313a565b6001900380156157d657613149565b6001900380156157d657613158565b6001900380156157d657613167565b6001900380156157d657613176565b6001900380156157d657613185565b6001900380156157d657613194565b6001900380156157d6576131a3565b6001900380156157d6576131b2565b6001900380156157d6576131c1565b6001900380156157d6576131d0565b6001900380156157d6576131df565b6001900380156157d6576131ee565b6001900380156157d6576131fd565b6001900380156157d65761320c565b6001900380156157d65761321b565b6001900380156157d65761322a565b6001900380156157d657613239565b6001900380156157d657613248565b6001900380156157d657613257565b6001900380156157d657613266565b6001900380156157d657613275565b6001900380156157d657613284565b6001900380156157d657613293565b6001900380156157d6576132a2565b6001900380156157d6576132b1565b6001900380156157d6576132c0565b6001900380156157d6576132cf565b6001900380156157d6576132de565b6001900380156157d6576132ed565b6001900380156157d6576132fc565b6001900380156157d65761330b565b6001900380156157d65761331a565b6001900380156157d657613329565b6001900380156157d657613338565b6001900380156157d657613347565b6001900380156157d657613356565b6001900380156157d657613365565b6001900380156157d657613374565b6001900380156157d657613383565b6001900380156157d657613392565b6001900380156157d6576133a1565b6001900380156157d6576133b0565b6001900380156157d6576133bf565b6001900380156157d6576133ce565b6001900380156157d6576133dd565b6001900380156157d6576133ec565b6001900380156157d6576133fb565b6001900380156157d65761340a565b6001900380156157d657613419565b6001900380156157d657613428565b6001900380156157d657613437565b6001900380156157d657613446565b6001900380156157d657613455565b6001900380156157d657613464565b6001900380156157d657613473565b6001900380156157d657613482565b6001900380156157d657613491565b6001900380156157d6576134a0565b6001900380156157d6576134af565b6001900380156157d6576134be565b6001900380156157d6576134cd565b6001900380156157d6576134dc565b6001900380156157d6576134eb565b6001900380156157d6576134fa565b6001900380156157d657613509565b6001900380156157d657613518565b6001900380156157d657613527565b6001900380156157d657613536565b6001900380156157d657613545565b6001900380156157d657613554565b6001900380156157d657613563565b6001900380156157d657613572565b6001900380156157d657613581565b6001900380156157d657613590565b6001900380156157d65761359f565b6001900380156157d6576135ae565b6001900380156157d6576135bd565b6001900380156157d6576135cc565b6001900380156157d6576135db565b6001900380156157d6576135ea565b6001900380156157d6576135f9565b6001900380156157d657613608565b6001900380156157d657613617565b6001900380156157d657613626565b6001900380156157d657613635565b6001900380156157d657613644565b6001900380156157d657613653565b6001900380156157d657613662565b6001900380156157d657613671565b6001900380156157d657613680565b6001900380156157d65761368f565b6001900380156157d65761369e565b6001900380156157d6576136ad565b6001900380156157d6576136bc565b6001900380156157d6576136cb565b6001900380156157d6576136da565b6001900380156157d6576136e9565b6001900380156157d6576136f8565b6001900380156157d657613707565b6001900380156157d657613716565b6001900380156157d657613725565b6001900380156157d657613734565b6001900380156157d657613743565b6001900380156157d657613752565b6001900380156157d657613761565b6001900380156157d657613770565b6001900380156157d65761377f565b6001900380156157d65761378e565b6001900380156157d65761379d565b6001900380156157d6576137ac565b6001900380156157d6576137bb565b6001900380156157d6576137ca565b6001900380156157d6576137d9565b6001900380156157d6576137e8565b6001900380156157d6576137f7565b6001900380156157d657613806565b6001900380156157d657613815565b6001900380156157d657613824565b6001900380156157d657613833565b6001900380156157d657613842565b6001900380156157d657613851565b6001900380156157d657613860565b6001900380156157d65761386f565b6001900380156157d65761387e565b6001900380156157d65761388d565b6001900380156157d65761389c565b6001900380156157d6576138ab565b6001900380156157d6576138ba565b6001900380156157d6576138c9565b6001900380156157d6576138d8565b6001900380156157d6576138e7565b6001900380156157d6576138f6565b6001900380156157d657613905565b6001900380156157d657613914565b6001900380156157d657613923565b6001900380156157d657613932565b6001900380156157d657613941565b6001900380156157d657613950565b6001900380156157d65761395f565b6001900380156157d65761396e565b6001900380156157d65761397d565b6001900380156157d65761398c565b6001900380156157d65761399b565b6001900380156157d6576139aa565b6001900380156157d6576139b9565b6001900380156157d6576139c8565b6001900380156157d6576139d7565b6001900380156157d6576139e6565b6001900380156157d6576139f5565b6001900380156157d657613a04565b6001900380156157d657613a13565b6001900380156157d657613a22565b6001900380156157d657613a31565b6001900380156157d657613a40565b6001900380156157d657613a4f565b6001900380156157d657613a5e565b6001900380156157d657613a6d565b6001900380156157d657613a7c565b6001900380156157d657613a8b565b6001900380156157d657613a9a565b6001900380156157d657613aa9565b6001900380156157d657613ab8565b6001900380156157d657613ac7565b6001900380156157d657613ad6565b6001900380156157d657613ae5565b6001900380156157d657613af4565b6001900380156157d657613b03565b6001900380156157d657613b12565b6001900380156157d657613b21565b6001900380156157d657613b30565b6001900380156157d657613b3f565b6001900380156157d657613b4e565b6001900380156157d657613b5d565b6001900380156157d657613b6c565b6001900380156157d657613b7b565b6001900380156157d657613b8a565b6001900380156157d657613b99565b6001900380156157d657613ba8565b6001900380156157d657613bb7565b6001900380156157d657613bc6565b6001900380156157d657613bd5565b6001900380156157d657613be4565b6001900380156157d657613bf3565b6001900380156157d657613c02565b6001900380156157d657613c11565b6001900380156157d657613c20565b6001900380156157d657613c2f565b6001900380156157d657613c3e565b6001900380156157d657613c4d565b6001900380156157d657613c5c565b6001900380156157d657613c6b565b6001900380156157d657613c7a565b6001900380156157d657613c89565b6001900380156157d657613c98565b6001900380156157d657613ca7565b6001900380156157d657613cb6565b6001900380156157d657613cc5565b6001900380156157d657613cd4565b6001900380156157d657613ce3565b6001900380156157d657613cf2565b6001900380156157d657613d01565b6001900380156157d657613d10565b6001900380156157d657613d1f565b6001900380156157d657613d2e565b6001900380156157d657613d3d565b6001900380156157d657613d4c565b6001900380156157d657613d5b565b6001900380156157d657613d6a565b6001900380156157d657613d79565b6001900380156157d657613d88565b6001900380156157d657613d97565b6001900380156157d657613da6565b6001900380156157d657613db5565b6001900380156157d657613dc4565b6001900380156157d657613dd3565b6001900380156157d657613de2565b6001900380156157d657613df1565b6001900380156157d657613e00565b6001900380156157d657613e0f565b6001900380156157d657613e1e565b6001900380156157d657613e2d565b6001900380156157d657613e3c565b6001900380156157d657613e4b565b6001900380156157d657613e5a565b6001900380156157d657613e69565b6001900380156157d657613e78565b6001900380156157d657613e87565b6001900380156157d657613e96565b6001900380156157d657613ea5565b6001900380156157d657613eb4565b6001900380156157d657613ec3565b6001900380156157d657613ed2565b6001900380156157d657613ee1565b6001900380156157d657613ef0565b6001900380156157d657613eff565b6001900380156157d657613f0e565b6001900380156157d657613f1d565b6001900380156157d657613f2c565b6001900380156157d657613f3b565b6001900380156157d657613f4a565b6001900380156157d657613f59565b6001900380156157d657613f68565b6001900380156157d657613f77565b6001900380156157d657613f86565b6001900380156157d657613f95565b6001900380156157d657613fa4565b6001900380156157d657613fb3565b6001900380156157d657613fc2565b6001900380156157d657613fd1565b6001900380156157d657613fe0565b6001900380156157d657613fef565b6001900380156157d657613ffe565b6001900380156157d65761400d565b6001900380156157d65761401c565b6001900380156157d65761402b565b6001900380156157d65761403a565b6001900380156157d657614049565b6001900380156157d657614058565b6001900380156157d657614067565b6001900380156157d657614076565b6001900380156157d657614085565b6001900380156157d657614094565b6001900380156157d6576140a3565b6001900380156157d6576140b2565b6001900380156157d6576140c1565b6001900380156157d6576140d0565b6001900380156157d6576140df565b6001900380156157d6576140ee565b6001900380156157d6576140fd565b6001900380156157d65761410c565b6001900380156157d65761411b565b6001900380156157d65761412a565b6001900380156157d657614139565b6001900380156157d657614148565b6001900380156157d657614157565b6001900380156157d657614166565b6001900380156157d657614175565b6001900380156157d657614184565b6001900380156157d657614193565b6001900380156157d6576141a2565b6001900380156157d6576141b1565b6001900380156157d6576141c0565b6001900380156157d6576141cf565b6001900380156157d6576141de565b6001900380156157d6576141ed565b6001900380156157d6576141fc565b6001900380156157d65761420b565b6001900380156157d65761421a565b6001900380156157d657614229565b6001900380156157d657614238565b6001900380156157d657614247565b6001900380156157d657614256565b6001900380156157d657614265565b6001900380156157d657614274565b6001900380156157d657614283565b6001900380156157d657614292565b6001900380156157d6576142a1565b6001900380156157d6576142b0565b6001900380156157d6576142bf565b6001900380156157d6576142ce565b6001900380156157d6576142dd565b6001900380156157d6576142ec565b6001900380156157d6576142fb565b6001900380156157d65761430a565b6001900380156157d657614319565b6001900380156157d657614328565b6001900380156157d657614337565b6001900380156157d657614346565b6001900380156157d657614355565b6001900380156157d657614364565b6001900380156157d657614373565b6001900380156157d657614382565b6001900380156157d657614391565b6001900380156157d6576143a0565b6001900380156157d6576143af565b6001900380156157d6576143be565b6001900380156157d6576143cd565b6001900380156157d6576143dc565b6001900380156157d6576143eb565b6001900380156157d6576143fa565b6001900380156157d657614409565b6001900380156157d657614418565b6001900380156157d657614427565b6001900380156157d657614436565b6001900380156157d657614445565b6001900380156157d657614454565b6001900380156157d657614463565b6001900380156157d657614472565b6001900380156157d657614481565b6001900380156157d657614490565b6001900380156157d65761449f565b6001900380156157d6576144ae565b6001900380156157d6576144bd565b6001900380156157d6576144cc565b6001900380156157d6576144db565b6001900380156157d6576144ea565b6001900380156157d6576144f9565b6001900380156157d657614508565b6001900380156157d657614517565b6001900380156157d657614526565b6001900380156157d657614535565b6001900380156157d657614544565b6001900380156157d657614553565b6001900380156157d657614562565b6001900380156157d657614571565b6001900380156157d657614580565b6001900380156157d65761458f565b6001900380156157d65761459e565b6001900380156157d6576145ad565b6001900380156157d6576145bc565b6001900380156157d6576145cb565b6001900380156157d6576145da565b6001900380156157d6576145e9565b6001900380156157d6576145f8565b6001900380156157d657614607565b6001900380156157d657614616565b6001900380156157d657614625565b6001900380156157d657614634565b6001900380156157d657614643565b6001900380156157d657614652565b6001900380156157d657614661565b6001900380156157d657614670565b6001900380156157d65761467f565b6001900380156157d65761468e565b6001900380156157d65761469d565b6001900380156157d6576146ac565b6001900380156157d6576146bb565b6001900380156157d6576146ca565b6001900380156157d6576146d9565b6001900380156157d6576146e8565b6001900380156157d6576146f7565b6001900380156157d657614706565b6001900380156157d657614715565b6001900380156157d657614724565b6001900380156157d657614733565b6001900380156157d657614742565b6001900380156157d657614751565b6001900380156157d657614760565b6001900380156157d65761476f565b6001900380156157d65761477e565b6001900380156157d65761478d565b6001900380156157d65761479c565b6001900380156157d6576147ab565b6001900380156157d6576147ba565b6001900380156157d6576147c9565b6001900380156157d6576147d8565b6001900380156157d6576147e7565b6001900380156157d6576147f6565b6001900380156157d657614805565b6001900380156157d657614814565b6001900380156157d657614823565b6001900380156157d657614832565b6001900380156157d657614841565b6001900380156157d657614850565b6001900380156157d65761485f565b6001900380156157d65761486e565b6001900380156157d65761487d565b6001900380156157d65761488c565b6001900380156157d65761489b565b6001900380156157d6576148aa565b6001900380156157d6576148b9565b6001900380156157d6576148c8565b6001900380156157d6576148d7565b6001900380156157d6576148e6565b6001900380156157d6576148f5565b6001900380156157d657614904565b6001900380156157d657614913565b6001900380156157d657614922565b6001900380156157d657614931565b6001900380156157d657614940565b6001900380156157d65761494f565b6001900380156157d65761495e565b6001900380156157d65761496d565b6001900380156157d65761497c565b6001900380156157d65761498b565b6001900380156157d65761499a565b6001900380156157d6576149a9565b6001900380156157d6576149b8565b6001900380156157d6576149c7565b6001900380156157d6576149d6565b6001900380156157d6576149e5565b6001900380156157d6576149f4565b6001900380156157d657614a03565b6001900380156157d657614a12565b6001900380156157d657614a21565b6001900380156157d657614a30565b6001900380156157d657614a3f565b6001900380156157d657614a4e565b6001900380156157d657614a5d565b6001900380156157d657614a6c565b6001900380156157d657614a7b565b6001900380156157d657614a8a565b6001900380156157d657614a99565b6001900380156157d657614aa8565b6001900380156157d657614ab7565b6001900380156157d657614ac6565b6001900380156157d657614ad5565b6001900380156157d657614ae4565b6001900380156157d657614af3565b6001900380156157d657614b02565b6001900380156157d657614b11565b6001900380156157d657614b20565b6001900380156157d657614b2f565b6001900380156157d657614b3e565b6001900380156157d657614b4d565b6001900380156157d657614b5c565b6001900380156157d657614b6b565b6001900380156157d657614b7a565b6001900380156157d657614b89565b6001900380156157d657614b98565b6001900380156157d657614ba7565b6001900380156157d657614bb6565b6001900380156157d657614bc5565b6001900380156157d657614bd4565b6001900380156157d657614be3565b6001900380156157d657614bf2565b6001900380156157d657614c01565b6001900380156157d657614c10565b6001900380156157d657614c1f565b6001900380156157d657614c2e565b6001900380156157d657614c3d565b6001900380156157d657614c4c565b6001900380156157d657614c5b565b6001900380156157d657614c6a565b6001900380156157d657614c79565b6001900380156157d657614c88565b6001900380156157d657614c97565b6001900380156157d657614ca6565b6001900380156157d657614cb5565b6001900380156157d657614cc4565b6001900380156157d657614cd3565b6001900380156157d657614ce2565b6001900380156157d657614cf1565b6001900380156157d657614d00565b6001900380156157d657614d0f565b6001900380156157d657614d1e565b6001900380156157d657614d2d565b6001900380156157d657614d3c565b6001900380156157d657614d4b565b6001900380156157d657614d5a565b6001900380156157d657614d69565b6001900380156157d657614d78565b6001900380156157d657614d87565b6001900380156157d657614d96565b6001900380156157d657614da5565b6001900380156157d657614db4565b6001900380156157d657614dc3565b6001900380156157d657614dd2565b6001900380156157d657614de1565b6001900380156157d657614df0565b6001900380156157d657614dff565b6001900380156157d657614e0e565b6001900380156157d657614e1d565b6001900380156157d657614e2c565b6001900380156157d657614e3b565b6001900380156157d657614e4a565b6001900380156157d657614e59565b6001900380156157d657614e68565b6001900380156157d657614e77565b6001900380156157d657614e86565b6001900380156157d657614e95565b6001900380156157d657614ea4565b6001900380156157d657614eb3565b6001900380156157d657614ec2565b6001900380156157d657614ed1565b6001900380156157d657614ee0565b6001900380156157d657614eef565b6001900380156157d657614efe565b6001900380156157d657614f0d565b6001900380156157d657614f1c565b6001900380156157d657614f2b565b6001900380156157d657614f3a565b6001900380156157d657614f49565b6001900380156157d657614f58565b6001900380156157d657614f67565b6001900380156157d657614f76565b6001900380156157d657614f85565b6001900380156157d657614f94565b6001900380156157d657614fa3565b6001900380156157d657614fb2565b6001900380156157d657614fc1565b6001900380156157d657614fd0565b6001900380156157d657614fdf565b6001900380156157d657614fee565b6001900380156157d657614ffd565b6001900380156157d65761500c565b6001900380156157d65761501b565b6001900380156157d65761502a565b6001900380156157d657615039565b6001900380156157d657615048565b6001900380156157d657615057565b6001900380156157d657615066565b6001900380156157d657615075565b6001900380156157d657615084565b6001900380156157d657615093565b6001900380156157d6576150a2565b6001900380156157d6576150b1565b6001900380156157d6576150c0565b6001900380156157d6576150cf565b6001900380156157d6576150de565b6001900380156157d6576150ed565b6001900380156157d6576150fc565b6001900380156157d65761510b565b6001900380156157d65761511a565b6001900380156157d657615129565b6001900380156157d657615138565b6001900380156157d657615147565b6001900380156157d657615156565b6001900380156157d657615165565b6001900380156157d657615174565b6001900380156157d657615183565b6001900380156157d657615192565b6001900380156157d6576151a1565b6001900380156157d6576151b0565b6001900380156157d6576151bf565b6001900380156157d6576151ce565b6001900380156157d6576151dd565b6001900380156157d6576151ec565b6001900380156157d6576151fb565b6001900380156157d65761520a565b6001900380156157d657615219565b6001900380156157d657615228565b6001900380156157d657615237565b6001900380156157d657615246565b6001900380156157d657615255565b6001900380156157d657615264565b6001900380156157d657615273565b6001900380156157d657615282565b6001900380156157d657615291565b6001900380156157d6576152a0565b6001900380156157d6576152af565b6001900380156157d6576152be565b6001900380156157d6576152cd565b6001900380156157d6576152dc565b6001900380156157d6576152eb565b6001900380156157d6576152fa565b6001900380156157d657615309565b6001900380156157d657615318565b6001900380156157d657615327565b6001900380156157d657615336565b6001900380156157d657615345565b6001900380156157d657615354565b6001900380156157d657615363565b6001900380156157d657615372565b6001900380156157d657615381565b6001900380156157d657615390565b6001900380156157d65761539f565b6001900380156157d6576153ae565b6001900380156157d6576153bd565b6001900380156157d6576153cc565b6001900380156157d6576153db565b6001900380156157d6576153ea565b6001900380156157d6576153f9565b6001900380156157d657615408565b6001900380156157d657615417565b6001900380156157d657615426565b6001900380156157d657615435565b6001900380156157d657615444565b6001900380156157d657615453565b6001900380156157d657615462565b6001900380156157d657615471565b6001900380156157d657615480565b6001900380156157d65761548f565b6001900380156157d65761549e565b6001900380156157d6576154ad565b6001900380156157d6576154bc565b6001900380156157d6576154cb565b6001900380156157d6576154da565b6001900380156157d6576154e9565b6001900380156157d6576154f8565b6001900380156157d657615507565b6001900380156157d657615516565b6001900380156157d657615525565b6001900380156157d657615534565b6001900380156157d657615543565b6001900380156157d657615552565b6001900380156157d657615561565b6001900380156157d657615570565b6001900380156157d65761557f565b6001900380156157d65761558e565b6001900380156157d65761559d565b6001900380156157d6576155ac565b6001900380156157d6576155bb565b6001900380156157d6576155ca565b6001900380156157d6576155d9565b6001900380156157d6576155e8565b6001900380156157d6576155f7565b6001900380156157d657615606565b6001900380156157d657615615565b6001900380156157d657615624565b6001900380156157d657615633565b6001900380156157d657615642565b6001900380156157d657615651565b6001900380156157d657615660565b6001900380156157d65761566f565b6001900380156157d65761567e565b6001900380156157d65761568d565b6001900380156157d65761569c565b6001900380156157d6576156ab565b6001900380156157d6576156ba565b6001900380156157d6576156c9565b6001900380156157d6576156d8565b6001900380156157d6576156e7565b6001900380156157d6576156f6565b6001900380156157d657615705565b6001900380156157d657615714565b6001900380156157d657615723565b6001900380156157d657615732565b6001900380156157d657615741565b6001900380156157d657615750565b6001900380156157d65761575f565b6001900380156157d65761576e565b6001900380156157d65761577d565b6001900380156157d65761578c565b6001900380156157d65761579b565b6001900380156157d6576157aa565b6001900380156157d6576157b9565b6001900380156157d6576157c8565b6001900380156157d6576004565b60006000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/jmpfest_linear.eas b/tools/contracts/benchmarks/jmpfest_linear.eas deleted file mode 100644 index 26dc6a2cf..000000000 --- a/tools/contracts/benchmarks/jmpfest_linear.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that does a lot of jumps, linear variant. - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("jmpfest_linear_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/jmpfest_linear_body.eas b/tools/contracts/benchmarks/jmpfest_linear_body.eas deleted file mode 100644 index fc4918104..000000000 --- a/tools/contracts/benchmarks/jmpfest_linear_body.eas +++ /dev/null @@ -1,16506 +0,0 @@ -%push(1000000) -L0: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1) -jump -L1: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L2) -jump -L2: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L3) -jump -L3: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L4) -jump -L4: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L5) -jump -L5: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L6) -jump -L6: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L7) -jump -L7: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L8) -jump -L8: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L9) -jump -L9: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L10) -jump -L10: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L11) -jump -L11: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L12) -jump -L12: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L13) -jump -L13: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L14) -jump -L14: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L15) -jump -L15: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L16) -jump -L16: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L17) -jump -L17: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L18) -jump -L18: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L19) -jump -L19: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L20) -jump -L20: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L21) -jump -L21: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L22) -jump -L22: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L23) -jump -L23: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L24) -jump -L24: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L25) -jump -L25: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L26) -jump -L26: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L27) -jump -L27: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L28) -jump -L28: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L29) -jump -L29: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L30) -jump -L30: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L31) -jump -L31: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L32) -jump -L32: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L33) -jump -L33: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L34) -jump -L34: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L35) -jump -L35: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L36) -jump -L36: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L37) -jump -L37: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L38) -jump -L38: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L39) -jump -L39: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L40) -jump -L40: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L41) -jump -L41: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L42) -jump -L42: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L43) -jump -L43: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L44) -jump -L44: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L45) -jump -L45: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L46) -jump -L46: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L47) -jump -L47: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L48) -jump -L48: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L49) -jump -L49: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L50) -jump -L50: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L51) -jump -L51: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L52) -jump -L52: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L53) -jump -L53: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L54) -jump -L54: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L55) -jump -L55: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L56) -jump -L56: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L57) -jump -L57: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L58) -jump -L58: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L59) -jump -L59: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L60) -jump -L60: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L61) -jump -L61: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L62) -jump -L62: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L63) -jump -L63: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L64) -jump -L64: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L65) -jump -L65: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L66) -jump -L66: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L67) -jump -L67: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L68) -jump -L68: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L69) -jump -L69: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L70) -jump -L70: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L71) -jump -L71: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L72) -jump -L72: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L73) -jump -L73: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L74) -jump -L74: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L75) -jump -L75: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L76) -jump -L76: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L77) -jump -L77: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L78) -jump -L78: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L79) -jump -L79: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L80) -jump -L80: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L81) -jump -L81: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L82) -jump -L82: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L83) -jump -L83: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L84) -jump -L84: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L85) -jump -L85: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L86) -jump -L86: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L87) -jump -L87: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L88) -jump -L88: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L89) -jump -L89: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L90) -jump -L90: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L91) -jump -L91: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L92) -jump -L92: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L93) -jump -L93: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L94) -jump -L94: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L95) -jump -L95: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L96) -jump -L96: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L97) -jump -L97: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L98) -jump -L98: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L99) -jump -L99: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L100) -jump -L100: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L101) -jump -L101: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L102) -jump -L102: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L103) -jump -L103: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L104) -jump -L104: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L105) -jump -L105: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L106) -jump -L106: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L107) -jump -L107: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L108) -jump -L108: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L109) -jump -L109: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L110) -jump -L110: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L111) -jump -L111: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L112) -jump -L112: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L113) -jump -L113: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L114) -jump -L114: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L115) -jump -L115: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L116) -jump -L116: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L117) -jump -L117: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L118) -jump -L118: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L119) -jump -L119: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L120) -jump -L120: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L121) -jump -L121: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L122) -jump -L122: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L123) -jump -L123: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L124) -jump -L124: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L125) -jump -L125: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L126) -jump -L126: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L127) -jump -L127: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L128) -jump -L128: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L129) -jump -L129: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L130) -jump -L130: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L131) -jump -L131: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L132) -jump -L132: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L133) -jump -L133: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L134) -jump -L134: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L135) -jump -L135: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L136) -jump -L136: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L137) -jump -L137: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L138) -jump -L138: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L139) -jump -L139: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L140) -jump -L140: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L141) -jump -L141: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L142) -jump -L142: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L143) -jump -L143: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L144) -jump -L144: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L145) -jump -L145: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L146) -jump -L146: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L147) -jump -L147: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L148) -jump -L148: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L149) -jump -L149: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L150) -jump -L150: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L151) -jump -L151: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L152) -jump -L152: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L153) -jump -L153: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L154) -jump -L154: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L155) -jump -L155: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L156) -jump -L156: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L157) -jump -L157: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L158) -jump -L158: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L159) -jump -L159: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L160) -jump -L160: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L161) -jump -L161: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L162) -jump -L162: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L163) -jump -L163: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L164) -jump -L164: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L165) -jump -L165: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L166) -jump -L166: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L167) -jump -L167: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L168) -jump -L168: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L169) -jump -L169: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L170) -jump -L170: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L171) -jump -L171: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L172) -jump -L172: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L173) -jump -L173: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L174) -jump -L174: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L175) -jump -L175: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L176) -jump -L176: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L177) -jump -L177: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L178) -jump -L178: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L179) -jump -L179: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L180) -jump -L180: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L181) -jump -L181: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L182) -jump -L182: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L183) -jump -L183: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L184) -jump -L184: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L185) -jump -L185: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L186) -jump -L186: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L187) -jump -L187: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L188) -jump -L188: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L189) -jump -L189: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L190) -jump -L190: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L191) -jump -L191: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L192) -jump -L192: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L193) -jump -L193: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L194) -jump -L194: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L195) -jump -L195: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L196) -jump -L196: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L197) -jump -L197: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L198) -jump -L198: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L199) -jump -L199: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L200) -jump -L200: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L201) -jump -L201: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L202) -jump -L202: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L203) -jump -L203: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L204) -jump -L204: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L205) -jump -L205: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L206) -jump -L206: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L207) -jump -L207: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L208) -jump -L208: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L209) -jump -L209: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L210) -jump -L210: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L211) -jump -L211: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L212) -jump -L212: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L213) -jump -L213: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L214) -jump -L214: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L215) -jump -L215: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L216) -jump -L216: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L217) -jump -L217: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L218) -jump -L218: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L219) -jump -L219: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L220) -jump -L220: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L221) -jump -L221: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L222) -jump -L222: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L223) -jump -L223: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L224) -jump -L224: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L225) -jump -L225: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L226) -jump -L226: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L227) -jump -L227: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L228) -jump -L228: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L229) -jump -L229: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L230) -jump -L230: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L231) -jump -L231: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L232) -jump -L232: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L233) -jump -L233: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L234) -jump -L234: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L235) -jump -L235: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L236) -jump -L236: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L237) -jump -L237: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L238) -jump -L238: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L239) -jump -L239: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L240) -jump -L240: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L241) -jump -L241: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L242) -jump -L242: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L243) -jump -L243: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L244) -jump -L244: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L245) -jump -L245: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L246) -jump -L246: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L247) -jump -L247: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L248) -jump -L248: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L249) -jump -L249: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L250) -jump -L250: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L251) -jump -L251: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L252) -jump -L252: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L253) -jump -L253: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L254) -jump -L254: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L255) -jump -L255: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L256) -jump -L256: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L257) -jump -L257: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L258) -jump -L258: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L259) -jump -L259: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L260) -jump -L260: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L261) -jump -L261: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L262) -jump -L262: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L263) -jump -L263: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L264) -jump -L264: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L265) -jump -L265: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L266) -jump -L266: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L267) -jump -L267: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L268) -jump -L268: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L269) -jump -L269: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L270) -jump -L270: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L271) -jump -L271: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L272) -jump -L272: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L273) -jump -L273: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L274) -jump -L274: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L275) -jump -L275: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L276) -jump -L276: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L277) -jump -L277: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L278) -jump -L278: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L279) -jump -L279: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L280) -jump -L280: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L281) -jump -L281: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L282) -jump -L282: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L283) -jump -L283: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L284) -jump -L284: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L285) -jump -L285: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L286) -jump -L286: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L287) -jump -L287: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L288) -jump -L288: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L289) -jump -L289: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L290) -jump -L290: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L291) -jump -L291: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L292) -jump -L292: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L293) -jump -L293: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L294) -jump -L294: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L295) -jump -L295: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L296) -jump -L296: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L297) -jump -L297: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L298) -jump -L298: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L299) -jump -L299: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L300) -jump -L300: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L301) -jump -L301: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L302) -jump -L302: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L303) -jump -L303: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L304) -jump -L304: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L305) -jump -L305: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L306) -jump -L306: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L307) -jump -L307: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L308) -jump -L308: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L309) -jump -L309: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L310) -jump -L310: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L311) -jump -L311: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L312) -jump -L312: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L313) -jump -L313: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L314) -jump -L314: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L315) -jump -L315: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L316) -jump -L316: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L317) -jump -L317: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L318) -jump -L318: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L319) -jump -L319: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L320) -jump -L320: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L321) -jump -L321: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L322) -jump -L322: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L323) -jump -L323: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L324) -jump -L324: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L325) -jump -L325: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L326) -jump -L326: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L327) -jump -L327: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L328) -jump -L328: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L329) -jump -L329: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L330) -jump -L330: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L331) -jump -L331: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L332) -jump -L332: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L333) -jump -L333: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L334) -jump -L334: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L335) -jump -L335: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L336) -jump -L336: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L337) -jump -L337: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L338) -jump -L338: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L339) -jump -L339: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L340) -jump -L340: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L341) -jump -L341: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L342) -jump -L342: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L343) -jump -L343: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L344) -jump -L344: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L345) -jump -L345: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L346) -jump -L346: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L347) -jump -L347: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L348) -jump -L348: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L349) -jump -L349: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L350) -jump -L350: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L351) -jump -L351: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L352) -jump -L352: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L353) -jump -L353: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L354) -jump -L354: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L355) -jump -L355: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L356) -jump -L356: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L357) -jump -L357: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L358) -jump -L358: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L359) -jump -L359: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L360) -jump -L360: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L361) -jump -L361: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L362) -jump -L362: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L363) -jump -L363: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L364) -jump -L364: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L365) -jump -L365: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L366) -jump -L366: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L367) -jump -L367: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L368) -jump -L368: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L369) -jump -L369: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L370) -jump -L370: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L371) -jump -L371: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L372) -jump -L372: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L373) -jump -L373: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L374) -jump -L374: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L375) -jump -L375: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L376) -jump -L376: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L377) -jump -L377: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L378) -jump -L378: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L379) -jump -L379: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L380) -jump -L380: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L381) -jump -L381: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L382) -jump -L382: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L383) -jump -L383: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L384) -jump -L384: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L385) -jump -L385: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L386) -jump -L386: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L387) -jump -L387: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L388) -jump -L388: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L389) -jump -L389: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L390) -jump -L390: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L391) -jump -L391: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L392) -jump -L392: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L393) -jump -L393: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L394) -jump -L394: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L395) -jump -L395: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L396) -jump -L396: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L397) -jump -L397: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L398) -jump -L398: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L399) -jump -L399: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L400) -jump -L400: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L401) -jump -L401: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L402) -jump -L402: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L403) -jump -L403: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L404) -jump -L404: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L405) -jump -L405: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L406) -jump -L406: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L407) -jump -L407: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L408) -jump -L408: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L409) -jump -L409: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L410) -jump -L410: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L411) -jump -L411: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L412) -jump -L412: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L413) -jump -L413: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L414) -jump -L414: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L415) -jump -L415: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L416) -jump -L416: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L417) -jump -L417: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L418) -jump -L418: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L419) -jump -L419: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L420) -jump -L420: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L421) -jump -L421: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L422) -jump -L422: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L423) -jump -L423: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L424) -jump -L424: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L425) -jump -L425: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L426) -jump -L426: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L427) -jump -L427: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L428) -jump -L428: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L429) -jump -L429: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L430) -jump -L430: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L431) -jump -L431: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L432) -jump -L432: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L433) -jump -L433: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L434) -jump -L434: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L435) -jump -L435: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L436) -jump -L436: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L437) -jump -L437: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L438) -jump -L438: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L439) -jump -L439: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L440) -jump -L440: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L441) -jump -L441: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L442) -jump -L442: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L443) -jump -L443: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L444) -jump -L444: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L445) -jump -L445: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L446) -jump -L446: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L447) -jump -L447: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L448) -jump -L448: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L449) -jump -L449: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L450) -jump -L450: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L451) -jump -L451: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L452) -jump -L452: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L453) -jump -L453: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L454) -jump -L454: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L455) -jump -L455: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L456) -jump -L456: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L457) -jump -L457: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L458) -jump -L458: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L459) -jump -L459: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L460) -jump -L460: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L461) -jump -L461: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L462) -jump -L462: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L463) -jump -L463: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L464) -jump -L464: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L465) -jump -L465: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L466) -jump -L466: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L467) -jump -L467: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L468) -jump -L468: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L469) -jump -L469: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L470) -jump -L470: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L471) -jump -L471: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L472) -jump -L472: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L473) -jump -L473: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L474) -jump -L474: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L475) -jump -L475: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L476) -jump -L476: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L477) -jump -L477: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L478) -jump -L478: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L479) -jump -L479: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L480) -jump -L480: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L481) -jump -L481: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L482) -jump -L482: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L483) -jump -L483: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L484) -jump -L484: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L485) -jump -L485: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L486) -jump -L486: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L487) -jump -L487: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L488) -jump -L488: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L489) -jump -L489: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L490) -jump -L490: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L491) -jump -L491: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L492) -jump -L492: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L493) -jump -L493: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L494) -jump -L494: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L495) -jump -L495: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L496) -jump -L496: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L497) -jump -L497: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L498) -jump -L498: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L499) -jump -L499: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L500) -jump -L500: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L501) -jump -L501: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L502) -jump -L502: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L503) -jump -L503: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L504) -jump -L504: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L505) -jump -L505: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L506) -jump -L506: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L507) -jump -L507: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L508) -jump -L508: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L509) -jump -L509: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L510) -jump -L510: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L511) -jump -L511: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L512) -jump -L512: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L513) -jump -L513: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L514) -jump -L514: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L515) -jump -L515: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L516) -jump -L516: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L517) -jump -L517: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L518) -jump -L518: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L519) -jump -L519: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L520) -jump -L520: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L521) -jump -L521: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L522) -jump -L522: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L523) -jump -L523: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L524) -jump -L524: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L525) -jump -L525: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L526) -jump -L526: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L527) -jump -L527: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L528) -jump -L528: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L529) -jump -L529: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L530) -jump -L530: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L531) -jump -L531: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L532) -jump -L532: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L533) -jump -L533: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L534) -jump -L534: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L535) -jump -L535: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L536) -jump -L536: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L537) -jump -L537: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L538) -jump -L538: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L539) -jump -L539: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L540) -jump -L540: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L541) -jump -L541: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L542) -jump -L542: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L543) -jump -L543: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L544) -jump -L544: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L545) -jump -L545: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L546) -jump -L546: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L547) -jump -L547: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L548) -jump -L548: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L549) -jump -L549: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L550) -jump -L550: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L551) -jump -L551: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L552) -jump -L552: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L553) -jump -L553: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L554) -jump -L554: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L555) -jump -L555: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L556) -jump -L556: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L557) -jump -L557: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L558) -jump -L558: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L559) -jump -L559: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L560) -jump -L560: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L561) -jump -L561: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L562) -jump -L562: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L563) -jump -L563: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L564) -jump -L564: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L565) -jump -L565: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L566) -jump -L566: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L567) -jump -L567: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L568) -jump -L568: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L569) -jump -L569: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L570) -jump -L570: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L571) -jump -L571: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L572) -jump -L572: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L573) -jump -L573: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L574) -jump -L574: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L575) -jump -L575: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L576) -jump -L576: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L577) -jump -L577: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L578) -jump -L578: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L579) -jump -L579: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L580) -jump -L580: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L581) -jump -L581: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L582) -jump -L582: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L583) -jump -L583: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L584) -jump -L584: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L585) -jump -L585: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L586) -jump -L586: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L587) -jump -L587: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L588) -jump -L588: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L589) -jump -L589: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L590) -jump -L590: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L591) -jump -L591: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L592) -jump -L592: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L593) -jump -L593: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L594) -jump -L594: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L595) -jump -L595: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L596) -jump -L596: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L597) -jump -L597: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L598) -jump -L598: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L599) -jump -L599: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L600) -jump -L600: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L601) -jump -L601: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L602) -jump -L602: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L603) -jump -L603: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L604) -jump -L604: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L605) -jump -L605: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L606) -jump -L606: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L607) -jump -L607: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L608) -jump -L608: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L609) -jump -L609: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L610) -jump -L610: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L611) -jump -L611: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L612) -jump -L612: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L613) -jump -L613: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L614) -jump -L614: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L615) -jump -L615: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L616) -jump -L616: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L617) -jump -L617: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L618) -jump -L618: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L619) -jump -L619: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L620) -jump -L620: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L621) -jump -L621: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L622) -jump -L622: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L623) -jump -L623: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L624) -jump -L624: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L625) -jump -L625: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L626) -jump -L626: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L627) -jump -L627: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L628) -jump -L628: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L629) -jump -L629: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L630) -jump -L630: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L631) -jump -L631: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L632) -jump -L632: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L633) -jump -L633: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L634) -jump -L634: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L635) -jump -L635: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L636) -jump -L636: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L637) -jump -L637: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L638) -jump -L638: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L639) -jump -L639: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L640) -jump -L640: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L641) -jump -L641: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L642) -jump -L642: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L643) -jump -L643: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L644) -jump -L644: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L645) -jump -L645: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L646) -jump -L646: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L647) -jump -L647: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L648) -jump -L648: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L649) -jump -L649: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L650) -jump -L650: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L651) -jump -L651: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L652) -jump -L652: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L653) -jump -L653: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L654) -jump -L654: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L655) -jump -L655: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L656) -jump -L656: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L657) -jump -L657: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L658) -jump -L658: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L659) -jump -L659: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L660) -jump -L660: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L661) -jump -L661: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L662) -jump -L662: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L663) -jump -L663: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L664) -jump -L664: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L665) -jump -L665: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L666) -jump -L666: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L667) -jump -L667: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L668) -jump -L668: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L669) -jump -L669: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L670) -jump -L670: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L671) -jump -L671: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L672) -jump -L672: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L673) -jump -L673: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L674) -jump -L674: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L675) -jump -L675: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L676) -jump -L676: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L677) -jump -L677: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L678) -jump -L678: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L679) -jump -L679: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L680) -jump -L680: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L681) -jump -L681: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L682) -jump -L682: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L683) -jump -L683: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L684) -jump -L684: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L685) -jump -L685: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L686) -jump -L686: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L687) -jump -L687: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L688) -jump -L688: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L689) -jump -L689: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L690) -jump -L690: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L691) -jump -L691: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L692) -jump -L692: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L693) -jump -L693: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L694) -jump -L694: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L695) -jump -L695: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L696) -jump -L696: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L697) -jump -L697: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L698) -jump -L698: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L699) -jump -L699: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L700) -jump -L700: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L701) -jump -L701: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L702) -jump -L702: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L703) -jump -L703: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L704) -jump -L704: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L705) -jump -L705: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L706) -jump -L706: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L707) -jump -L707: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L708) -jump -L708: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L709) -jump -L709: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L710) -jump -L710: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L711) -jump -L711: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L712) -jump -L712: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L713) -jump -L713: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L714) -jump -L714: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L715) -jump -L715: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L716) -jump -L716: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L717) -jump -L717: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L718) -jump -L718: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L719) -jump -L719: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L720) -jump -L720: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L721) -jump -L721: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L722) -jump -L722: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L723) -jump -L723: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L724) -jump -L724: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L725) -jump -L725: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L726) -jump -L726: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L727) -jump -L727: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L728) -jump -L728: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L729) -jump -L729: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L730) -jump -L730: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L731) -jump -L731: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L732) -jump -L732: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L733) -jump -L733: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L734) -jump -L734: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L735) -jump -L735: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L736) -jump -L736: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L737) -jump -L737: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L738) -jump -L738: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L739) -jump -L739: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L740) -jump -L740: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L741) -jump -L741: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L742) -jump -L742: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L743) -jump -L743: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L744) -jump -L744: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L745) -jump -L745: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L746) -jump -L746: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L747) -jump -L747: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L748) -jump -L748: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L749) -jump -L749: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L750) -jump -L750: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L751) -jump -L751: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L752) -jump -L752: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L753) -jump -L753: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L754) -jump -L754: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L755) -jump -L755: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L756) -jump -L756: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L757) -jump -L757: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L758) -jump -L758: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L759) -jump -L759: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L760) -jump -L760: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L761) -jump -L761: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L762) -jump -L762: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L763) -jump -L763: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L764) -jump -L764: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L765) -jump -L765: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L766) -jump -L766: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L767) -jump -L767: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L768) -jump -L768: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L769) -jump -L769: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L770) -jump -L770: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L771) -jump -L771: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L772) -jump -L772: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L773) -jump -L773: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L774) -jump -L774: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L775) -jump -L775: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L776) -jump -L776: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L777) -jump -L777: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L778) -jump -L778: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L779) -jump -L779: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L780) -jump -L780: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L781) -jump -L781: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L782) -jump -L782: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L783) -jump -L783: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L784) -jump -L784: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L785) -jump -L785: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L786) -jump -L786: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L787) -jump -L787: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L788) -jump -L788: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L789) -jump -L789: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L790) -jump -L790: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L791) -jump -L791: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L792) -jump -L792: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L793) -jump -L793: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L794) -jump -L794: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L795) -jump -L795: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L796) -jump -L796: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L797) -jump -L797: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L798) -jump -L798: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L799) -jump -L799: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L800) -jump -L800: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L801) -jump -L801: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L802) -jump -L802: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L803) -jump -L803: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L804) -jump -L804: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L805) -jump -L805: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L806) -jump -L806: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L807) -jump -L807: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L808) -jump -L808: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L809) -jump -L809: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L810) -jump -L810: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L811) -jump -L811: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L812) -jump -L812: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L813) -jump -L813: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L814) -jump -L814: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L815) -jump -L815: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L816) -jump -L816: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L817) -jump -L817: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L818) -jump -L818: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L819) -jump -L819: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L820) -jump -L820: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L821) -jump -L821: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L822) -jump -L822: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L823) -jump -L823: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L824) -jump -L824: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L825) -jump -L825: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L826) -jump -L826: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L827) -jump -L827: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L828) -jump -L828: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L829) -jump -L829: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L830) -jump -L830: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L831) -jump -L831: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L832) -jump -L832: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L833) -jump -L833: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L834) -jump -L834: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L835) -jump -L835: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L836) -jump -L836: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L837) -jump -L837: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L838) -jump -L838: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L839) -jump -L839: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L840) -jump -L840: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L841) -jump -L841: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L842) -jump -L842: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L843) -jump -L843: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L844) -jump -L844: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L845) -jump -L845: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L846) -jump -L846: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L847) -jump -L847: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L848) -jump -L848: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L849) -jump -L849: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L850) -jump -L850: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L851) -jump -L851: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L852) -jump -L852: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L853) -jump -L853: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L854) -jump -L854: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L855) -jump -L855: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L856) -jump -L856: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L857) -jump -L857: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L858) -jump -L858: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L859) -jump -L859: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L860) -jump -L860: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L861) -jump -L861: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L862) -jump -L862: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L863) -jump -L863: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L864) -jump -L864: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L865) -jump -L865: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L866) -jump -L866: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L867) -jump -L867: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L868) -jump -L868: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L869) -jump -L869: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L870) -jump -L870: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L871) -jump -L871: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L872) -jump -L872: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L873) -jump -L873: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L874) -jump -L874: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L875) -jump -L875: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L876) -jump -L876: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L877) -jump -L877: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L878) -jump -L878: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L879) -jump -L879: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L880) -jump -L880: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L881) -jump -L881: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L882) -jump -L882: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L883) -jump -L883: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L884) -jump -L884: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L885) -jump -L885: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L886) -jump -L886: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L887) -jump -L887: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L888) -jump -L888: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L889) -jump -L889: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L890) -jump -L890: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L891) -jump -L891: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L892) -jump -L892: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L893) -jump -L893: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L894) -jump -L894: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L895) -jump -L895: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L896) -jump -L896: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L897) -jump -L897: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L898) -jump -L898: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L899) -jump -L899: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L900) -jump -L900: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L901) -jump -L901: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L902) -jump -L902: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L903) -jump -L903: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L904) -jump -L904: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L905) -jump -L905: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L906) -jump -L906: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L907) -jump -L907: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L908) -jump -L908: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L909) -jump -L909: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L910) -jump -L910: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L911) -jump -L911: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L912) -jump -L912: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L913) -jump -L913: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L914) -jump -L914: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L915) -jump -L915: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L916) -jump -L916: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L917) -jump -L917: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L918) -jump -L918: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L919) -jump -L919: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L920) -jump -L920: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L921) -jump -L921: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L922) -jump -L922: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L923) -jump -L923: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L924) -jump -L924: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L925) -jump -L925: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L926) -jump -L926: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L927) -jump -L927: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L928) -jump -L928: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L929) -jump -L929: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L930) -jump -L930: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L931) -jump -L931: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L932) -jump -L932: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L933) -jump -L933: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L934) -jump -L934: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L935) -jump -L935: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L936) -jump -L936: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L937) -jump -L937: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L938) -jump -L938: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L939) -jump -L939: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L940) -jump -L940: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L941) -jump -L941: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L942) -jump -L942: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L943) -jump -L943: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L944) -jump -L944: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L945) -jump -L945: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L946) -jump -L946: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L947) -jump -L947: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L948) -jump -L948: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L949) -jump -L949: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L950) -jump -L950: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L951) -jump -L951: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L952) -jump -L952: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L953) -jump -L953: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L954) -jump -L954: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L955) -jump -L955: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L956) -jump -L956: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L957) -jump -L957: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L958) -jump -L958: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L959) -jump -L959: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L960) -jump -L960: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L961) -jump -L961: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L962) -jump -L962: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L963) -jump -L963: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L964) -jump -L964: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L965) -jump -L965: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L966) -jump -L966: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L967) -jump -L967: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L968) -jump -L968: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L969) -jump -L969: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L970) -jump -L970: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L971) -jump -L971: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L972) -jump -L972: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L973) -jump -L973: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L974) -jump -L974: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L975) -jump -L975: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L976) -jump -L976: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L977) -jump -L977: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L978) -jump -L978: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L979) -jump -L979: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L980) -jump -L980: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L981) -jump -L981: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L982) -jump -L982: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L983) -jump -L983: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L984) -jump -L984: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L985) -jump -L985: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L986) -jump -L986: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L987) -jump -L987: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L988) -jump -L988: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L989) -jump -L989: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L990) -jump -L990: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L991) -jump -L991: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L992) -jump -L992: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L993) -jump -L993: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L994) -jump -L994: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L995) -jump -L995: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L996) -jump -L996: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L997) -jump -L997: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L998) -jump -L998: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L999) -jump -L999: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1000) -jump -L1000: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1001) -jump -L1001: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1002) -jump -L1002: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1003) -jump -L1003: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1004) -jump -L1004: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1005) -jump -L1005: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1006) -jump -L1006: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1007) -jump -L1007: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1008) -jump -L1008: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1009) -jump -L1009: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1010) -jump -L1010: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1011) -jump -L1011: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1012) -jump -L1012: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1013) -jump -L1013: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1014) -jump -L1014: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1015) -jump -L1015: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1016) -jump -L1016: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1017) -jump -L1017: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1018) -jump -L1018: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1019) -jump -L1019: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1020) -jump -L1020: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1021) -jump -L1021: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1022) -jump -L1022: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1023) -jump -L1023: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1024) -jump -L1024: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1025) -jump -L1025: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1026) -jump -L1026: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1027) -jump -L1027: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1028) -jump -L1028: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1029) -jump -L1029: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1030) -jump -L1030: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1031) -jump -L1031: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1032) -jump -L1032: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1033) -jump -L1033: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1034) -jump -L1034: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1035) -jump -L1035: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1036) -jump -L1036: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1037) -jump -L1037: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1038) -jump -L1038: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1039) -jump -L1039: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1040) -jump -L1040: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1041) -jump -L1041: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1042) -jump -L1042: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1043) -jump -L1043: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1044) -jump -L1044: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1045) -jump -L1045: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1046) -jump -L1046: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1047) -jump -L1047: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1048) -jump -L1048: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1049) -jump -L1049: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1050) -jump -L1050: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1051) -jump -L1051: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1052) -jump -L1052: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1053) -jump -L1053: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1054) -jump -L1054: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1055) -jump -L1055: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1056) -jump -L1056: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1057) -jump -L1057: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1058) -jump -L1058: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1059) -jump -L1059: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1060) -jump -L1060: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1061) -jump -L1061: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1062) -jump -L1062: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1063) -jump -L1063: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1064) -jump -L1064: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1065) -jump -L1065: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1066) -jump -L1066: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1067) -jump -L1067: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1068) -jump -L1068: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1069) -jump -L1069: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1070) -jump -L1070: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1071) -jump -L1071: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1072) -jump -L1072: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1073) -jump -L1073: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1074) -jump -L1074: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1075) -jump -L1075: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1076) -jump -L1076: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1077) -jump -L1077: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1078) -jump -L1078: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1079) -jump -L1079: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1080) -jump -L1080: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1081) -jump -L1081: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1082) -jump -L1082: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1083) -jump -L1083: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1084) -jump -L1084: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1085) -jump -L1085: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1086) -jump -L1086: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1087) -jump -L1087: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1088) -jump -L1088: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1089) -jump -L1089: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1090) -jump -L1090: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1091) -jump -L1091: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1092) -jump -L1092: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1093) -jump -L1093: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1094) -jump -L1094: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1095) -jump -L1095: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1096) -jump -L1096: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1097) -jump -L1097: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1098) -jump -L1098: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1099) -jump -L1099: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1100) -jump -L1100: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1101) -jump -L1101: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1102) -jump -L1102: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1103) -jump -L1103: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1104) -jump -L1104: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1105) -jump -L1105: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1106) -jump -L1106: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1107) -jump -L1107: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1108) -jump -L1108: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1109) -jump -L1109: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1110) -jump -L1110: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1111) -jump -L1111: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1112) -jump -L1112: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1113) -jump -L1113: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1114) -jump -L1114: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1115) -jump -L1115: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1116) -jump -L1116: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1117) -jump -L1117: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1118) -jump -L1118: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1119) -jump -L1119: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1120) -jump -L1120: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1121) -jump -L1121: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1122) -jump -L1122: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1123) -jump -L1123: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1124) -jump -L1124: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1125) -jump -L1125: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1126) -jump -L1126: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1127) -jump -L1127: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1128) -jump -L1128: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1129) -jump -L1129: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1130) -jump -L1130: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1131) -jump -L1131: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1132) -jump -L1132: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1133) -jump -L1133: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1134) -jump -L1134: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1135) -jump -L1135: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1136) -jump -L1136: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1137) -jump -L1137: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1138) -jump -L1138: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1139) -jump -L1139: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1140) -jump -L1140: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1141) -jump -L1141: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1142) -jump -L1142: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1143) -jump -L1143: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1144) -jump -L1144: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1145) -jump -L1145: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1146) -jump -L1146: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1147) -jump -L1147: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1148) -jump -L1148: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1149) -jump -L1149: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1150) -jump -L1150: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1151) -jump -L1151: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1152) -jump -L1152: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1153) -jump -L1153: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1154) -jump -L1154: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1155) -jump -L1155: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1156) -jump -L1156: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1157) -jump -L1157: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1158) -jump -L1158: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1159) -jump -L1159: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1160) -jump -L1160: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1161) -jump -L1161: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1162) -jump -L1162: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1163) -jump -L1163: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1164) -jump -L1164: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1165) -jump -L1165: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1166) -jump -L1166: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1167) -jump -L1167: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1168) -jump -L1168: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1169) -jump -L1169: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1170) -jump -L1170: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1171) -jump -L1171: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1172) -jump -L1172: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1173) -jump -L1173: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1174) -jump -L1174: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1175) -jump -L1175: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1176) -jump -L1176: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1177) -jump -L1177: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1178) -jump -L1178: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1179) -jump -L1179: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1180) -jump -L1180: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1181) -jump -L1181: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1182) -jump -L1182: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1183) -jump -L1183: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1184) -jump -L1184: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1185) -jump -L1185: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1186) -jump -L1186: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1187) -jump -L1187: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1188) -jump -L1188: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1189) -jump -L1189: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1190) -jump -L1190: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1191) -jump -L1191: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1192) -jump -L1192: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1193) -jump -L1193: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1194) -jump -L1194: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1195) -jump -L1195: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1196) -jump -L1196: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1197) -jump -L1197: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1198) -jump -L1198: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1199) -jump -L1199: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1200) -jump -L1200: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1201) -jump -L1201: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1202) -jump -L1202: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1203) -jump -L1203: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1204) -jump -L1204: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1205) -jump -L1205: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1206) -jump -L1206: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1207) -jump -L1207: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1208) -jump -L1208: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1209) -jump -L1209: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1210) -jump -L1210: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1211) -jump -L1211: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1212) -jump -L1212: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1213) -jump -L1213: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1214) -jump -L1214: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1215) -jump -L1215: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1216) -jump -L1216: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1217) -jump -L1217: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1218) -jump -L1218: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1219) -jump -L1219: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1220) -jump -L1220: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1221) -jump -L1221: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1222) -jump -L1222: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1223) -jump -L1223: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1224) -jump -L1224: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1225) -jump -L1225: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1226) -jump -L1226: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1227) -jump -L1227: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1228) -jump -L1228: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1229) -jump -L1229: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1230) -jump -L1230: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1231) -jump -L1231: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1232) -jump -L1232: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1233) -jump -L1233: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1234) -jump -L1234: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1235) -jump -L1235: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1236) -jump -L1236: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1237) -jump -L1237: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1238) -jump -L1238: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1239) -jump -L1239: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1240) -jump -L1240: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1241) -jump -L1241: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1242) -jump -L1242: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1243) -jump -L1243: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1244) -jump -L1244: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1245) -jump -L1245: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1246) -jump -L1246: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1247) -jump -L1247: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1248) -jump -L1248: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1249) -jump -L1249: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1250) -jump -L1250: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1251) -jump -L1251: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1252) -jump -L1252: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1253) -jump -L1253: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1254) -jump -L1254: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1255) -jump -L1255: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1256) -jump -L1256: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1257) -jump -L1257: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1258) -jump -L1258: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1259) -jump -L1259: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1260) -jump -L1260: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1261) -jump -L1261: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1262) -jump -L1262: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1263) -jump -L1263: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1264) -jump -L1264: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1265) -jump -L1265: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1266) -jump -L1266: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1267) -jump -L1267: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1268) -jump -L1268: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1269) -jump -L1269: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1270) -jump -L1270: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1271) -jump -L1271: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1272) -jump -L1272: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1273) -jump -L1273: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1274) -jump -L1274: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1275) -jump -L1275: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1276) -jump -L1276: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1277) -jump -L1277: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1278) -jump -L1278: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1279) -jump -L1279: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1280) -jump -L1280: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1281) -jump -L1281: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1282) -jump -L1282: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1283) -jump -L1283: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1284) -jump -L1284: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1285) -jump -L1285: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1286) -jump -L1286: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1287) -jump -L1287: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1288) -jump -L1288: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1289) -jump -L1289: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1290) -jump -L1290: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1291) -jump -L1291: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1292) -jump -L1292: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1293) -jump -L1293: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1294) -jump -L1294: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1295) -jump -L1295: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1296) -jump -L1296: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1297) -jump -L1297: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1298) -jump -L1298: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1299) -jump -L1299: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1300) -jump -L1300: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1301) -jump -L1301: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1302) -jump -L1302: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1303) -jump -L1303: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1304) -jump -L1304: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1305) -jump -L1305: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1306) -jump -L1306: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1307) -jump -L1307: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1308) -jump -L1308: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1309) -jump -L1309: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1310) -jump -L1310: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1311) -jump -L1311: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1312) -jump -L1312: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1313) -jump -L1313: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1314) -jump -L1314: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1315) -jump -L1315: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1316) -jump -L1316: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1317) -jump -L1317: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1318) -jump -L1318: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1319) -jump -L1319: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1320) -jump -L1320: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1321) -jump -L1321: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1322) -jump -L1322: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1323) -jump -L1323: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1324) -jump -L1324: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1325) -jump -L1325: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1326) -jump -L1326: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1327) -jump -L1327: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1328) -jump -L1328: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1329) -jump -L1329: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1330) -jump -L1330: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1331) -jump -L1331: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1332) -jump -L1332: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1333) -jump -L1333: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1334) -jump -L1334: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1335) -jump -L1335: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1336) -jump -L1336: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1337) -jump -L1337: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1338) -jump -L1338: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1339) -jump -L1339: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1340) -jump -L1340: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1341) -jump -L1341: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1342) -jump -L1342: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1343) -jump -L1343: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1344) -jump -L1344: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1345) -jump -L1345: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1346) -jump -L1346: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1347) -jump -L1347: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1348) -jump -L1348: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1349) -jump -L1349: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1350) -jump -L1350: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1351) -jump -L1351: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1352) -jump -L1352: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1353) -jump -L1353: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1354) -jump -L1354: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1355) -jump -L1355: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1356) -jump -L1356: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1357) -jump -L1357: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1358) -jump -L1358: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1359) -jump -L1359: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1360) -jump -L1360: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1361) -jump -L1361: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1362) -jump -L1362: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1363) -jump -L1363: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1364) -jump -L1364: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1365) -jump -L1365: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1366) -jump -L1366: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1367) -jump -L1367: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1368) -jump -L1368: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1369) -jump -L1369: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1370) -jump -L1370: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1371) -jump -L1371: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1372) -jump -L1372: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1373) -jump -L1373: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1374) -jump -L1374: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1375) -jump -L1375: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1376) -jump -L1376: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1377) -jump -L1377: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1378) -jump -L1378: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1379) -jump -L1379: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1380) -jump -L1380: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1381) -jump -L1381: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1382) -jump -L1382: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1383) -jump -L1383: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1384) -jump -L1384: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1385) -jump -L1385: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1386) -jump -L1386: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1387) -jump -L1387: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1388) -jump -L1388: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1389) -jump -L1389: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1390) -jump -L1390: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1391) -jump -L1391: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1392) -jump -L1392: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1393) -jump -L1393: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1394) -jump -L1394: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1395) -jump -L1395: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1396) -jump -L1396: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1397) -jump -L1397: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1398) -jump -L1398: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1399) -jump -L1399: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1400) -jump -L1400: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1401) -jump -L1401: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1402) -jump -L1402: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1403) -jump -L1403: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1404) -jump -L1404: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1405) -jump -L1405: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1406) -jump -L1406: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1407) -jump -L1407: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1408) -jump -L1408: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1409) -jump -L1409: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1410) -jump -L1410: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1411) -jump -L1411: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1412) -jump -L1412: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1413) -jump -L1413: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1414) -jump -L1414: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1415) -jump -L1415: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1416) -jump -L1416: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1417) -jump -L1417: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1418) -jump -L1418: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1419) -jump -L1419: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1420) -jump -L1420: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1421) -jump -L1421: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1422) -jump -L1422: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1423) -jump -L1423: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1424) -jump -L1424: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1425) -jump -L1425: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1426) -jump -L1426: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1427) -jump -L1427: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1428) -jump -L1428: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1429) -jump -L1429: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1430) -jump -L1430: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1431) -jump -L1431: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1432) -jump -L1432: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1433) -jump -L1433: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1434) -jump -L1434: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1435) -jump -L1435: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1436) -jump -L1436: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1437) -jump -L1437: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1438) -jump -L1438: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1439) -jump -L1439: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1440) -jump -L1440: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1441) -jump -L1441: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1442) -jump -L1442: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1443) -jump -L1443: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1444) -jump -L1444: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1445) -jump -L1445: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1446) -jump -L1446: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1447) -jump -L1447: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1448) -jump -L1448: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1449) -jump -L1449: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1450) -jump -L1450: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1451) -jump -L1451: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1452) -jump -L1452: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1453) -jump -L1453: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1454) -jump -L1454: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1455) -jump -L1455: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1456) -jump -L1456: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1457) -jump -L1457: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1458) -jump -L1458: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1459) -jump -L1459: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1460) -jump -L1460: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1461) -jump -L1461: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1462) -jump -L1462: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1463) -jump -L1463: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1464) -jump -L1464: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1465) -jump -L1465: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1466) -jump -L1466: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1467) -jump -L1467: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1468) -jump -L1468: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1469) -jump -L1469: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1470) -jump -L1470: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1471) -jump -L1471: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1472) -jump -L1472: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1473) -jump -L1473: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1474) -jump -L1474: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1475) -jump -L1475: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1476) -jump -L1476: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1477) -jump -L1477: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1478) -jump -L1478: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1479) -jump -L1479: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1480) -jump -L1480: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1481) -jump -L1481: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1482) -jump -L1482: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1483) -jump -L1483: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1484) -jump -L1484: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1485) -jump -L1485: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1486) -jump -L1486: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1487) -jump -L1487: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1488) -jump -L1488: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1489) -jump -L1489: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1490) -jump -L1490: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1491) -jump -L1491: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1492) -jump -L1492: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1493) -jump -L1493: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1494) -jump -L1494: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1495) -jump -L1495: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1496) -jump -L1496: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1497) -jump -L1497: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1498) -jump -L1498: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1499) -jump -L1499: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L0) -jump -done: -jumpdest -%push(0) -%push(0) -return diff --git a/tools/contracts/benchmarks/jmpfest_random.bin b/tools/contracts/benchmarks/jmpfest_random.bin deleted file mode 100644 index c5a43629a..000000000 --- a/tools/contracts/benchmarks/jmpfest_random.bin +++ /dev/null @@ -1 +0,0 @@ -6157dd80600c6000396000f3620f42405b6001900380156157d757613e6f565b6001900380156157d757610f88565b6001900380156157d7576101c6565b6001900380156157d757615428565b6001900380156157d7576119d7565b6001900380156157d75761406d565b6001900380156157d7576107fb565b6001900380156157d757610af7565b6001900380156157d757613231565b6001900380156157d7576119b9565b6001900380156157d757611000565b6001900380156157d75761453b565b6001900380156157d757612897565b6001900380156157d75761460d565b6001900380156157d757614685565b6001900380156157d757610e11565b6001900380156157d757611b03565b6001900380156157d757611456565b6001900380156157d75761436a565b6001900380156157d757610bab565b6001900380156157d7576134a7565b6001900380156157d757610873565b6001900380156157d75761110e565b6001900380156157d757611f85565b6001900380156157d75761141a565b6001900380156157d75761461c565b6001900380156157d757612ab3565b6001900380156157d757613c17565b6001900380156157d757610fc4565b6001900380156157d757613b72565b6001900380156157d7576129ff565b6001900380156157d757610b42565b6001900380156157d7576121ec565b6001900380156157d757612cb1565b6001900380156157d75761292d565b6001900380156157d757611cf2565b6001900380156157d757611d6a565b6001900380156157d757614a08565b6001900380156157d7576154dc565b6001900380156157d75761111d565b6001900380156157d7576109e9565b6001900380156157d757610d30565b6001900380156157d757613fd7565b6001900380156157d757613e06565b6001900380156157d75761374a565b6001900380156157d757614a8f565b6001900380156157d757613f14565b6001900380156157d757615356565b6001900380156157d757614c5f565b6001900380156157d7576115cd565b6001900380156157d757614bbb565b6001900380156157d757610a43565b6001900380156157d75761268a565b6001900380156157d757613696565b6001900380156157d7576102f2565b6001900380156157d757613b27565b6001900380156157d7576137a4565b6001900380156157d75761530b565b6001900380156157d757613579565b6001900380156157d757611dc4565b6001900380156157d757614837565b6001900380156157d7576152de565b6001900380156157d7576113a2565b6001900380156157d7576126c6565b6001900380156157d757613a0a565b6001900380156157d757613cf8565b6001900380156157d757612255565b6001900380156157d7576115a0565b6001900380156157d7576153ce565b6001900380156157d757613597565b6001900380156157d757615167565b6001900380156157d757613fc8565b6001900380156157d7576139ce565b6001900380156157d757613043565b6001900380156157d7576150a5565b6001900380156157d7576126b7565b6001900380156157d757615347565b6001900380156157d7576120b1565b6001900380156157d757610a8e565b6001900380156157d7576136b4565b6001900380156157d75761026b565b6001900380156157d757613fb9565b6001900380156157d757614b16565b6001900380156157d7576137d1565b6001900380156157d75760f4565b6001900380156157d757613321565b6001900380156157d7576113de565b6001900380156157d757610c40565b6001900380156157d7576130ca565b6001900380156157d75761317d565b6001900380156157d757613b36565b6001900380156157d757611c89565b6001900380156157d757611cd4565b6001900380156157d7576113c0565b6001900380156157d757614388565b6001900380156157d757614f5b565b6001900380156157d757611852565b6001900380156157d757613d70565b6001900380156157d757614a9e565b6001900380156157d757613d25565b6001900380156157d757611780565b6001900380156157d757612631565b6001900380156157d7576148dc565b6001900380156157d757610ca9565b6001900380156157d7576142b6565b6001900380156157d757611636565b6001900380156157d757611950565b6001900380156157d757612daf565b6001900380156157d757612e09565b6001900380156157d757614ca9565b6001900380156157d757613213565b6001900380156157d757614e20565b6001900380156157d757612129565b6001900380156157d75761381c565b6001900380156157d757611bd5565b6001900380156157d7576120ed565b6001900380156157d7576136e1565b6001900380156157d757612570565b6001900380156157d757613132565b6001900380156157d7576156f6565b6001900380156157d757612381565b6001900380156157d7576102c5565b6001900380156157d757614379565b6001900380156157d75761281f565b6001900380156157d7576131e6565b6001900380156157d757615149565b6001900380156157d757610783565b6001900380156157d757614c41565b6001900380156157d757614f01565b6001900380156157d7576134b6565b6001900380156157d757610c5e565b6001900380156157d75761579b565b6001900380156157d757610df3565b6001900380156157d7576101e4565b6001900380156157d757610d6c565b6001900380156157d757613399565b6001900380156157d757611ad6565b6001900380156157d75761531a565b6001900380156157d757611492565b6001900380156157d757612291565b6001900380156157d757612c2a565b6001900380156157d75761120d565b6001900380156157d757610a61565b6001900380156157d757614c23565b6001900380156157d75761442d565b6001900380156157d757614ff1565b6001900380156157d757612eea565b6001900380156157d7576124cb565b6001900380156157d757610837565b6001900380156157d757610487565b6001900380156157d7576139ec565b6001900380156157d757613e51565b6001900380156157d757613669565b6001900380156157d757614d6c565b6001900380156157d75761426b565b6001900380156157d757610a25565b6001900380156157d7576151df565b6001900380156157d757610388565b6001900380156157d7576135a6565b6001900380156157d75761071a565b6001900380156157d75761315f565b6001900380156157d7576152b1565b6001900380156157d757614d5d565b6001900380156157d7576141f3565b6001900380156157d757615275565b6001900380156157d757610ae8565b6001900380156157d757606d565b6001900380156157d757613ff5565b6001900380156157d757614031565b6001900380156157d75761318c565b6001900380156157d757610909565b6001900380156157d757614199565b6001900380156157d757611726565b6001900380156157d757613bbd565b6001900380156157d757611cb6565b6001900380156157d757612534565b6001900380156157d757613894565b6001900380156157d75761480a565b6001900380156157d757615257565b6001900380156157d757612f17565b6001900380156157d757613929565b6001900380156157d757615518565b6001900380156157d757614bca565b6001900380156157d75761257f565b6001900380156157d757612264565b6001900380156157d757614945565b6001900380156157d757612552565b6001900380156157d757612c1b565b6001900380156157d75761202a565b6001900380156157d757611393565b6001900380156157d7576109f8565b6001900380156157d757611d3d565b6001900380156157d7576146ed565b6001900380156157d757613afa565b6001900380156157d757612bee565b6001900380156157d7576105df565b6001900380156157d757610567565b6001900380156157d7576103b5565b6001900380156157d757614aad565b6001900380156157d757611f76565b6001900380156157d757612a4a565b6001900380156157d7576102d4565b6001900380156157d757612622565b6001900380156157d757609a565b6001900380156157d757611c3e565b6001900380156157d7576134e3565b6001900380156157d75761014e565b6001900380156157d7576108dc565b6001900380156157d757610d03565b6001900380156157d757614586565b6001900380156157d757611285565b6001900380156157d7576151fd565b6001900380156157d757614ec5565b6001900380156157d7576124bc565b6001900380156157d75761362d565b6001900380156157d757610bc9565b6001900380156157d757610b9c565b6001900380156157d7576144b4565b6001900380156157d757613b90565b6001900380156157d757613240565b6001900380156157d7576117cb565b6001900380156157d7576140f4565b6001900380156157d7576115eb565b6001900380156157d757613eab565b6001900380156157d7576112c1565b6001900380156157d7576114a1565b6001900380156157d7576105b2565b6001900380156157d757611483565b6001900380156157d7576110a5565b6001900380156157d757613007565b6001900380156157d75761277a565b6001900380156157d7576156e7565b6001900380156157d757613de8565b6001900380156157d7576140c7565b6001900380156157d757614a62565b6001900380156157d757610f5b565b6001900380156157d757610211565b6001900380156157d757615642565b6001900380156157d75761105a565b6001900380156157d7576157b9565b6001900380156157d757611af4565b6001900380156157d757613a37565b6001900380156157d757612d1a565b6001900380156157d7576140d6565b6001900380156157d757611a04565b6001900380156157d757610bd8565b6001900380156157d7576118c9565b6001900380156157d757610f01565b6001900380156157d7576111b3565b6001900380156157d7576123ea565b6001900380156157d7576101d5565b6001900380156157d757613b9f565b6001900380156157d75761329a565b6001900380156157d75761100f565b6001900380156157d7576116bd565b6001900380156157d75761017b565b6001900380156157d7576111a4565b6001900380156157d757614fa6565b6001900380156157d757611df1565b6001900380156157d757613a91565b6001900380156157d75761503c565b6001900380156157d757611d5b565b6001900380156157d757611375565b6001900380156157d757615536565b6001900380156157d7576109cb565b6001900380156157d7576103c4565b6001900380156157d75761351f565b6001900380156157d7576106fc565b6001900380156157d757610fa6565b6001900380156157d757613d07565b6001900380156157d7576127b6565b6001900380156157d757611a40565b6001900380156157d75761042d565b6001900380156157d75761370e565b6001900380156157d757611069565b6001900380156157d757615527565b6001900380156157d7576142f2565b6001900380156157d7576143e2565b6001900380156157d757612ff8565b6001900380156157d75761104b565b6001900380156157d757611a31565b6001900380156157d757614e4d565b6001900380156157d757613e60565b6001900380156157d757610220565b6001900380156157d757614ee3565b6001900380156157d757611bb7565b6001900380156157d75761470b565b6001900380156157d757614df3565b6001900380156157d757613e7e565b6001900380156157d757610729565b6001900380156157d7576129e1565b6001900380156157d757614c32565b6001900380156157d75761405e565b6001900380156157d757615723565b6001900380156157d757612093565b6001900380156157d757611e78565b6001900380156157d757613947565b6001900380156157d757612ca2565b6001900380156157d757615741565b6001900380156157d757612f8f565b6001900380156157d7576118d8565b6001900380156157d7576122eb565b6001900380156157d75761344d565b6001900380156157d757610397565b6001900380156157d7576125e6565b6001900380156157d757613992565b6001900380156157d7576153ec565b6001900380156157d7576144f0565b6001900380156157d757614397565b6001900380156157d757610e7a565b6001900380156157d757612b76565b6001900380156157d757611e96565b6001900380156157d757610d8a565b6001900380156157d757611339565b6001900380156157d7576112d0565b6001900380156157d75761327c565b6001900380156157d757611e5a565b6001900380156157d75761471a565b6001900380156157d757611771565b6001900380156157d75761140b565b6001900380156157d757610ed4565b6001900380156157d757613600565b6001900380156157d7576146cf565b6001900380156157d757611ae5565b6001900380156157d757610ea7565b6001900380156157d7576154fa565b6001900380156157d7576145a4565b6001900380156157d757614f3d565b6001900380156157d757610abb565b6001900380156157d7576123bd565b6001900380156157d757612c48565b6001900380156157d757612444565b6001900380156157d757610cf4565b6001900380156157d757614f6a565b6001900380156157d75761122b565b6001900380156157d757610f1f565b6001900380156157d7576105c1565b6001900380156157d7576103e2565b6001900380156157d757614b07565b6001900380156157d7576125f5565b6001900380156157d7576146fc565b6001900380156157d757613303565b6001900380156157d75761308e565b6001900380156157d757612453565b6001900380156157d7576109ae565b6001900380156157d7576149ea565b6001900380156157d757612183565b6001900380156157d757610cc7565b6001900380156157d7576145b3565b6001900380156157d75761024d565b6001900380156157d757611159565b6001900380156157d757611834565b6001900380156157d757612d73565b6001900380156157d7576105ee565b6001900380156157d757610d5d565b6001900380156157d757613f6e565b6001900380156157d7576153fb565b6001900380156157d757610fd3565b6001900380156157d7576145c2565b6001900380156157d757612c93565b6001900380156157d75761189c565b6001900380156157d757614fd3565b6001900380156157d757610379565b6001900380156157d75761499f565b6001900380156157d757614a35565b6001900380156157d757614e02565b6001900380156157d7576147dd565b6001900380156157d757612c84565b6001900380156157d75761040f565b6001900380156157d757611168565b6001900380156157d75761249e565b6001900380156157d757610c6d565b6001900380156157d757612a2c565b6001900380156157d757614d99565b6001900380156157d757612fbc565b6001900380156157d75761285b565b6001900380156157d757614478565b6001900380156157d757613034565b6001900380156157d757612aef565b6001900380156157d757613e42565b6001900380156157d757612138565b6001900380156157d7576123cc565b6001900380156157d757611429565b6001900380156157d757613204565b6001900380156157d7576150d1565b6001900380156157d7576108be565b6001900380156157d757614c7d565b6001900380156157d7576132f4565b6001900380156157d757612372565b6001900380156157d75761284c565b6001900380156157d7576138fc565b6001900380156157d7576101f3565b6001900380156157d757611c4d565b6001900380156157d757611b4e565b6001900380156157d7576110e1565b6001900380156157d757610d7b565b6001900380156157d757611d10565b6001900380156157d757613fe6565b6001900380156157d757614ef2565b6001900380156157d7576135e2565b6001900380156157d757610e89565b6001900380156157d757612dcd565b6001900380156157d757611d88565b6001900380156157d757612900565b6001900380156157d7576128e2565b6001900380156157d7576150fe565b6001900380156157d757612f9e565b6001900380156157d7576137c2565b6001900380156157d7576150c3565b6001900380156157d757610c4f565b6001900380156157d75761265d565b6001900380156157d757611c20565b6001900380156157d75761512b565b6001900380156157d757613849565b6001900380156157d757611eb4565b6001900380156157d757610927565b6001900380156157d757613c44565b6001900380156157d757607c565b6001900380156157d757612996565b6001900380156157d757614e6b565b6001900380156157d757613dac565b6001900380156157d75761413f565b6001900380156157d757614b61565b6001900380156157d7576125c8565b6001900380156157d75761295a565b6001900380156157d7576121fb565b6001900380156157d757612d91565b6001900380156157d757612f62565b6001900380156157d757613489565b6001900380156157d757614855565b6001900380156157d757611e3c565b6001900380156157d757612561565b6001900380156157d7576103f1565b6001900380156157d757612309565b6001900380156157d75761343e565b6001900380156157d7576151c1565b6001900380156157d757613867565b6001900380156157d7576141b7565b6001900380156157d7576155e8565b6001900380156157d757614e3e565b6001900380156157d7576122fa565b6001900380156157d757611258565b6001900380156157d75761051c565b6001900380156157d757611d2e565b6001900380156157d757612cfc565b6001900380156157d7576150e0565b6001900380156157d75761424d565b6001900380156157d7576137ef565b6001900380156157d757614b43565b6001900380156157d757612336565b6001900380156157d757614db7565b6001900380156157d757612165565b6001900380156157d757610b24565b6001900380156157d757614873565b6001900380156157d757614d3f565b6001900380156157d757612ccf565b6001900380156157d7576133c6565b6001900380156157d757611a22565b6001900380156157d7576137b3565b6001900380156157d757614a17565b6001900380156157d757611519565b6001900380156157d7576137e0565b6001900380156157d75761044b565b6001900380156157d757610112565b6001900380156157d757614963565b6001900380156157d757611249565b6001900380156157d757610dd5565b6001900380156157d757611b6c565b6001900380156157d757613d8e565b6001900380156157d757611f49565b6001900380156157d757610a16565b6001900380156157d757614ce5565b6001900380156157d7576111ef565b6001900380156157d7576140e5565b6001900380156157d757612246565b6001900380156157d757610103565b6001900380156157d757613786565b6001900380156157d757611e2d565b6001900380156157d7576116db565b6001900380156157d757614be8565b6001900380156157d757615266565b6001900380156157d7576136c3565b6001900380156157d757614e89565b6001900380156157d757613402565b6001900380156157d757611708565b6001900380156157d757611753565b6001900380156157d7576148af565b6001900380156157d75761380d565b6001900380156157d757611609565b6001900380156157d757614990565b6001900380156157d757612ced565b6001900380156157d75761434c565b6001900380156157d7576114fb565b6001900380156157d757611f94565b6001900380156157d757611366565b6001900380156157d75761248f565b6001900380156157d75761114a565b6001900380156157d757615338565b6001900380156157d757613411565b6001900380156157d757610c22565b6001900380156157d757610db7565b6001900380156157d7576131c8565b6001900380156157d757614bf6565b6001900380156157d757613876565b6001900380156157d7576156ab565b6001900380156157d757610e5c565b6001900380156157d757613965565b6001900380156157d7576144d2565b6001900380156157d7576129f0565b6001900380156157d757611ef0565b6001900380156157d757611ca7565b6001900380156157d757613222565b6001900380156157d75761031f565b6001900380156157d757615732565b6001900380156157d757615464565b6001900380156157d75761309d565b6001900380156157d7576107ec565b6001900380156157d757610e20565b6001900380156157d75761361e565b6001900380156157d757611438565b6001900380156157d7576124ad565b6001900380156157d757611186565b6001900380156157d757613052565b6001900380156157d757611cc5565b6001900380156157d757611dd3565b6001900380156157d75761569c565b6001900380156157d757613d16565b6001900380156157d757610f97565b6001900380156157d757612f71565b6001900380156157d7576013565b6001900380156157d757611690565b6001900380156157d7576136d2565b6001900380156157d75761113b565b6001900380156157d7576129a5565b6001900380156157d75761022f565b6001900380156157d75761328b565b6001900380156157d757610dc6565b6001900380156157d75761423e565b6001900380156157d75761521b565b6001900380156157d75761500f565b6001900380156157d757613cbc565b6001900380156157d7576148cd565b6001900380156157d757611e1e565b6001900380156157d757614496565b6001900380156157d7576118ab565b6001900380156157d757611fd0565b6001900380156157d7576147fb565b6001900380156157d757612888565b6001900380156157d757615482565b6001900380156157d757613ee7565b6001900380156157d75761383a565b6001900380156157d7576127d4565b6001900380156157d757614676565b6001900380156157d75761363c565b6001900380156157d7576111c2565b6001900380156157d757610e6b565b6001900380156157d75761112c565b6001900380156157d75761505a565b6001900380156157d7576114b0565b6001900380156157d757614b52565b6001900380156157d757612a3b565b6001900380156157d757610be7565b6001900380156157d75761272f565b6001900380156157d75761263f565b6001900380156157d757610aac565b6001900380156157d7576110f0565b6001900380156157d75761121c565b6001900380156157d757610b33565b6001900380156157d757611e69565b6001900380156157d757611861565b6001900380156157d757614b8e565b6001900380156157d7576127a7565b6001900380156157d757610eb6565b6001900380156157d7576119e6565b6001900380156157d75761409a565b6001900380156157d757613f41565b6001900380156157d757611914565b6001900380156157d7576120c0565b6001900380156157d757612b2b565b6001900380156157d7576127f2565b6001900380156157d757610bf5565b6001900380156157d757614a44565b6001900380156157d7576132a9565b6001900380156157d7576130ac565b6001900380156157d75761502d565b6001900380156157d7576143c4565b6001900380156157d757612e18565b6001900380156157d757613510565b6001900380156157d7576104d2565b6001900380156157d757611762565b6001900380156157d7576110c3565b6001900380156157d75761267b565b6001900380156157d75761016c565b6001900380156157d757611a6d565b6001900380156157d7576109bd565b6001900380156157d757611bc6565b6001900380156157d757611d97565b6001900380156157d757614b25565b6001900380156157d7576107b0565b6001900380156157d757612237565b6001900380156157d757614927565b6001900380156157d757612a59565b6001900380156157d757613b81565b6001900380156157d75761566f565b6001900380156157d757611096565b6001900380156157d757612e63565b6001900380156157d757610828565b6001900380156157d7576111d1565b6001900380156157d75761101e565b6001900380156157d757614c50565b6001900380156157d75761337b565b6001900380156157d757610954565b6001900380156157d757614cf4565b6001900380156157d75761522a565b6001900380156157d7576150ef565b6001900380156157d757612e90565b6001900380156157d75761283d565b6001900380156157d757610a34565b6001900380156157d757614765565b6001900380156157d757612075565b6001900380156157d7576144c3565b6001900380156157d757613123565b6001900380156157d7576145e0565b6001900380156157d757613c08565b6001900380156157d757614da8565b6001900380156157d75761347a565b6001900380156157d757612f80565b6001900380156157d757614747565b6001900380156157d7576130bb565b6001900380156157d757610639565b6001900380156157d757610a52565b6001900380156157d7576116cc565b6001900380156157d757615554565b6001900380156157d75761307f565b6001900380156157d757610936565b6001900380156157d757610c7c565b6001900380156157d7576122cd565b6001900380156157d757611564565b6001900380156157d757610747565b6001900380156157d75761452c565b6001900380156157d757612789565b6001900380156157d7576040565b6001900380156157d757611b30565b6001900380156157d757611627565b6001900380156157d757605e565b6001900380156157d7576112b2565b6001900380156157d75761032e565b6001900380156157d757610c8b565b6001900380156157d757612228565b6001900380156157d7576128b5565b6001900380156157d757614040565b6001900380156157d757613c35565b6001900380156157d75760c7565b6001900380156157d757610d21565b6001900380156157d75761324f565b6001900380156157d757610792565b6001900380156157d75761433d565b6001900380156157d757614658565b6001900380156157d757610e3e565b6001900380156157d757613b18565b6001900380156157d757610666565b6001900380156157d7576103d3565b6001900380156157d757614fb5565b6001900380156157d757610891565b6001900380156157d757610990565b6001900380156157d757610855565b6001900380156157d7576107ce565b6001900380156157d757611eff565b6001900380156157d757613a64565b6001900380156157d757614568565b6001900380156157d757612525565b6001900380156157d75761578c565b6001900380156157d75761513a565b6001900380156157d75761352e565b6001900380156157d7576114bf565b6001900380156157d757610a9d565b6001900380156157d757615293565b6001900380156157d75761130c565b6001900380156157d75761036a565b6001900380156157d75761015d565b6001900380156157d757611ea5565b6001900380156157d7576120fc565b6001900380156157d7576150b4565b6001900380156157d75761416c565b6001900380156157d757613a46565b6001900380156157d757611087565b6001900380156157d7576149f9565b6001900380156157d75761070b565b6001900380156157d7576138b1565b6001900380156157d7576117da565b6001900380156157d757610a07565b6001900380156157d75761559e565b6001900380156157d757614882565b6001900380156157d75761390b565b6001900380156157d757612f26565b6001900380156157d757612c66565b6001900380156157d7576154a0565b6001900380156157d757613c26565b6001900380156157d757614819565b6001900380156157d757615284565b6001900380156157d757615580565b6001900380156157d75761504b565b6001900380156157d757614310565b6001900380156157d757611d01565b6001900380156157d7576133f3565b6001900380156157d7576149db565b6001900380156157d757610301565b6001900380156157d757611582565b6001900380156157d757610675565b6001900380156157d757612c39565b6001900380156157d75761220a565b6001900380156157d757613956565b6001900380156157d757613150565b6001900380156157d757610738565b6001900380156157d75761290f565b6001900380156157d7576147a1565b6001900380156157d757612d38565b6001900380156157d757611fb2565b6001900380156157d757610a70565b6001900380156157d757612978565b6001900380156157d757613ef6565b6001900380156157d75761062a565b6001900380156157d757610121565b6001900380156157d757612e72565b6001900380156157d757613b09565b6001900380156157d757611f3a565b6001900380156157d757614eb6565b6001900380156157d757611fc1565b6001900380156157d7576108eb565b6001900380156157d757611b7b565b6001900380156157d7576148fa565b6001900380156157d7576125ab565b6001900380156157d757612810565b6001900380156157d757612327565b6001900380156157d757612b1c565b6001900380156157d75761266c565b6001900380156157d7576126e4565b6001900380156157d75761025c565b6001900380156157d7576135d3565b6001900380156157d757614ada565b6001900380156157d757614487565b6001900380156157d757610945565b6001900380156157d7576130d9565b6001900380156157d757611870565b6001900380156157d757614d30565b6001900380156157d757610c31565b6001900380156157d75761188d565b6001900380156157d7576152a2565b6001900380156157d7576141a8565b6001900380156157d757612156565b6001900380156157d757612c75565b6001900380156157d757612fe9565b6001900380156157d7576147b0565b6001900380156157d757614ed4565b6001900380156157d75761540a565b6001900380156157d75761364b565b6001900380156157d75761131b565b6001900380156157d757611b21565b6001900380156157d75761211a565b6001900380156157d757612bdf565b6001900380156157d7576128c4565b6001900380156157d7576124e9565b6001900380156157d75761053a565b6001900380156157d757613f50565b6001900380156157d757610b15565b6001900380156157d757614af8565b6001900380156157d757613b45565b6001900380156157d7576126d5565b6001900380156157d757611348565b6001900380156157d757610202565b6001900380156157d757612174565b6001900380156157d757613d43565b6001900380156157d7576120cf565b6001900380156157d7576125ba565b6001900380156157d757608b565b6001900380156157d7576117bc565b6001900380156157d7576134d4565b6001900380156157d757615705565b6001900380156157d757614f4c565b6001900380156157d757614bac565b6001900380156157d757610130565b6001900380156157d75761404f565b6001900380156157d757613061565b6001900380156157d7576113b1565b6001900380156157d7576124f8565b6001900380156157d75761345c565b6001900380156157d7576145fe565b6001900380156157d757612f44565b6001900380156157d757610b6f565b6001900380156157d757611357565b6001900380156157d757613bf9565b6001900380156157d75761258e565b6001900380156157d757613faa565b6001900380156157d757611177565b6001900380156157d757612435565b6001900380156157d757611078565b6001900380156157d7576101b7565b6001900380156157d757611447565b6001900380156157d757610693565b6001900380156157d757614559565b6001900380156157d7576132e5565b6001900380156157d75761391a565b6001900380156157d757612d64565b6001900380156157d757613114565b6001900380156157d7576115dc565b6001900380156157d757615087565b6001900380156157d75761575f565b6001900380156157d75761045a565b6001900380156157d7576133d5565b6001900380156157d75761060c565b6001900380156157d7576121bf565b6001900380156157d757610918565b6001900380156157d75761195f565b6001900380156157d757613d61565b6001900380156157d757615624565b6001900380156157d757612fcb565b6001900380156157d75761346b565b6001900380156157d757613d9d565b6001900380156157d7576106cf565b6001900380156157d7576146a3565b6001900380156157d7576139bf565b6001900380156157d7576107bf565b6001900380156157d7576122af565b6001900380156157d75761196e565b6001900380156157d7576144ff565b6001900380156157d757614d7b565b6001900380156157d7576104f0565b6001900380156157d757610c04565b6001900380156157d7576116ea565b6001900380156157d757613c80565b6001900380156157d757612ae0565b6001900380156157d7576147bf565b6001900380156157d757610981565b6001900380156157d757611816565b6001900380156157d757614298565b6001900380156157d7576148eb565b6001900380156157d7576004565b6001900380156157d7576153dd565b6001900380156157d7576132d6565b6001900380156157d757611a7c565b6001900380156157d7576108cd565b6001900380156157d757612cc0565b6001900380156157d757610ee3565b6001900380156157d757612e27565b6001900380156157d75761027a565b6001900380156157d757612282565b6001900380156157d757614112565b6001900380156157d757614e7a565b6001900380156157d757615606565b6001900380156157d75761360f565b6001900380156157d757612f08565b6001900380156157d7576106de565b6001900380156157d75761371d565b6001900380156157d757614acb565b6001900380156157d757612dfa565b6001900380156157d757612b94565b6001900380156157d757612eae565b6001900380156157d757612a0e565b6001900380156157d757613c71565b6001900380156157d757610774565b6001900380156157d757612801565b6001900380156157d7576144a5565b6001900380156157d757613c9e565b6001900380156157d757614fc4565b6001900380156157d757611474565b6001900380156157d757612318565b6001900380156157d757612b0d565b6001900380156157d757613aa0565b6001900380156157d757611672565b6001900380156157d7576127e3565b6001900380156157d75761319b565b6001900380156157d7576141c6565b6001900380156157d757612969565b6001900380156157d757614b7f565b6001900380156157d757614891565b6001900380156157d7576130f7565b6001900380156157d75761577d565b6001900380156157d757613f9b565b6001900380156157d757612039565b6001900380156157d7576113ed565b6001900380156157d757614289565b6001900380156157d757611618565b6001900380156157d7576128a6565b6001900380156157d757612fda565b6001900380156157d757610fe2565b6001900380156157d757612ad1565b6001900380156157d757614e5c565b6001900380156157d757611c02565b6001900380156157d75761353d565b6001900380156157d757614fe2565b6001900380156157d7576156ba565b6001900380156157d7576104c3565b6001900380156157d757613a19565b6001900380156157d75761013f565b6001900380156157d7576141d5565b6001900380156157d75761326d565b6001900380156157d757614649565b6001900380156157d757612a86565b6001900380156157d757614c8b565b6001900380156157d75761451d565b6001900380156157d757611d4c565b6001900380156157d757613cda565b6001900380156157d7576122be565b6001900380156157d757612057565b6001900380156157d757614ae9565b6001900380156157d7576138cf565b6001900380156157d757613777565b6001900380156157d75761445a565b6001900380156157d7576139b0565b6001900380156157d757611b8a565b6001900380156157d757613f23565b6001900380156157d757610496565b6001900380156157d757611923565b6001900380156157d757611aa9565b6001900380156157d757612699565b6001900380156157d7576141e4565b6001900380156157d757611be4565b6001900380156157d7576149ae565b6001900380156157d757612b85565b6001900380156157d757613df7565b6001900380156157d7576138a2565b6001900380156157d757611465565b6001900380156157d7576107dd565b6001900380156157d757614f10565b6001900380156157d757613858565b6001900380156157d757613aaf565b6001900380156157d757613678565b6001900380156157d757611db5565b6001900380156157d7576112fd565b6001900380156157d75761273e565b6001900380156157d757614981565b6001900380156157d757613dbb565b6001900380156157d75761335d565b6001900380156157d757614130565b6001900380156157d757612ebd565b6001900380156157d7576128f1565b6001900380156157d757614a26565b6001900380156157d757612613565b6001900380156157d75761035b565b6001900380156157d757611843565b6001900380156157d757612a68565b6001900380156157d7576135c4565b6001900380156157d757613bae565b6001900380156157d757614d8a565b6001900380156157d7576108fa565b6001900380156157d75761511c565b6001900380156157d7576132b8565b6001900380156157d757610aca565b6001900380156157d7576102e3565b6001900380156157d75761276b565b6001900380156157d757613312565b6001900380156157d75761444b565b6001900380156157d7576145d1565b6001900380156157d7576134f2565b6001900380156157d757612462565b6001900380156157d75761342f565b6001900380156157d757614202565b6001900380156157d75761373b565b6001900380156157d757612fad565b6001900380156157d75761432e565b6001900380156157d757611294565b6001900380156157d757610e2f565b6001900380156157d757614972565b6001900380156157d757614864565b6001900380156157d757611b12565b6001900380156157d75761450e565b6001900380156157d757604f565b6001900380156157d757613d7f565b6001900380156157d75761325e565b6001900380156157d7576140a9565b6001900380156157d757614667565b6001900380156157d75761568d565b6001900380156157d757611384565b6001900380156157d757612e9f565b6001900380156157d7576153bf565b6001900380156157d75761041e565b6001900380156157d757610b8d565b6001900380156157d757611c11565b6001900380156157d75761520c565b6001900380156157d757612edb565b6001900380156157d757615158565b6001900380156157d757614918565b6001900380156157d7576131f5565b6001900380156157d75761431f565b6001900380156157d757613adc565b6001900380156157d757614220565b6001900380156157d757613025565b6001900380156157d7576125d7565b6001900380156157d7576146b2565b6001900380156157d7576105a3565b6001900380156157d7576121a1565b6001900380156157d757613885565b6001900380156157d75761333f565b6001900380156157d75761050d565b6001900380156157d757614a53565b6001900380156157d757614828565b6001900380156157d757614469565b6001900380156157d757615239565b6001900380156157d757611a9a565b6001900380156157d7576129c3565b6001900380156157d757611ffd565b6001900380156157d757614ea7565b6001900380156157d757611744565b6001900380156157d757614211565b6001900380156157d757615545565b6001900380156157d7576105d0565b6001900380156157d7576107a1565b6001900380156157d757615176565b6001900380156157d757611c2f565b6001900380156157d757612da0565b6001900380156157d757615185565b6001900380156157d757610b06565b6001900380156157d75761576e565b6001900380156157d757614d03565b6001900380156157d75761179e565b6001900380156157d757612aa4565b6001900380156157d7576118f6565b6001900380156157d75761291e565b6001900380156157d757612417565b6001900380156157d757615651565b6001900380156157d757611f0d565b6001900380156157d757610199565b6001900380156157d75761462b565b6001900380156157d757614c05565b6001900380156157d7576109da565b6001900380156157d75761187e565b6001900380156157d757612345565b6001900380156157d757612084565b6001900380156157d7576151b2565b6001900380156157d75761169f565b6001900380156157d757613070565b6001900380156157d757615750565b6001900380156157d757613f5f565b6001900380156157d757610ce5565b6001900380156157d75761558f565b6001900380156157d757611b99565b6001900380156157d7576119f5565b6001900380156157d75761414e565b6001900380156157d7576104e1565b6001900380156157d7576139a1565b6001900380156157d7576142a7565b6001900380156157d7576131b9565b6001900380156157d757612bc1565b6001900380156157d757614694565b6001900380156157d757610cb8565b6001900380156157d757612471565b6001900380156157d757613974565b6001900380156157d7576118e7565b6001900380156157d757612480565b6001900380156157d757615000565b6001900380156157d7576114dd565b6001900380156157d757611e0f565b6001900380156157d7576113fc565b6001900380156157d75761425c565b6001900380156157d7576135b5565b6001900380156157d75761435b565b6001900380156157d75761197d565b6001900380156157d757611e4b565b6001900380156157d75761102d565b6001900380156157d757615383565b6001900380156157d757610d4e565b6001900380156157d757613cad565b6001900380156157d757611654565b6001900380156157d7576124da565b6001900380156157d7576110d2565b6001900380156157d757610310565b6001900380156157d757610b60565b6001900380156157d757612147565b6001900380156157d757610c13565b6001900380156157d757613dd9565b6001900380156157d757613b63565b6001900380156157d757610f3d565b6001900380156157d757610d99565b6001900380156157d7576152c0565b6001900380156157d7576142e3565b6001900380156157d7576142c5565b6001900380156157d75761286a565b6001900380156157d7576111fe565b6001900380156157d7576119c8565b6001900380156157d75761033d565b6001900380156157d757611ac7565b6001900380156157d757613330565b6001900380156157d7576143d3565b6001900380156157d757610882565b6001900380156157d757615455565b6001900380156157d757615509565b6001900380156157d757614b70565b6001900380156157d7576142d4565b6001900380156157d757610594565b6001900380156157d7576145ef565b6001900380156157d757612b67565b6001900380156157d757611a8b565b6001900380156157d7576154af565b6001900380156157d757613795565b6001900380156157d7576108af565b6001900380156157d757612b3a565b6001900380156157d75761338a565b6001900380156157d757613a82565b6001900380156157d7576155ca565b6001900380156157d757615419565b6001900380156157d757613016565b6001900380156157d757614909565b6001900380156157d75761132a565b6001900380156157d7576104fe565b6001900380156157d757613abe565b6001900380156157d75761408b565b6001900380156157d75761510d565b6001900380156157d75761052b565b6001900380156157d757612543565b6001900380156157d757614a71565b6001900380156157d7576133b7565b6001900380156157d757610b7e565b6001900380156157d75761201b565b6001900380156157d757614121565b6001900380156157d757610f79565b6001900380156157d757611807565b6001900380156157d7576123f9565b6001900380156157d757610765565b6001900380156157d7576115be565b6001900380156157d757612ac2565b6001900380156157d757613687565b6001900380156157d757611825565b6001900380156157d757614c9a565b6001900380156157d7576122a0565b6001900380156157d7576154eb565b6001900380156157d75761103c565b6001900380156157d757611555565b6001900380156157d757611b5d565b6001900380156157d7576156c9565b6001900380156157d7576151d0565b6001900380156157d757614d4e565b6001900380156157d75761061b565b6001900380156157d757614f1f565b6001900380156157d757614954565b6001900380156157d757610846565b6001900380156157d7576143b5565b6001900380156157d757612bb2565b6001900380156157d75761150a565b6001900380156157d757611fdf565b6001900380156157d757613f05565b6001900380156157d757612a1d565b6001900380156157d757614e98565b6001900380156157d7576128d3565b6001900380156157d757610c9a565b6001900380156157d7576117e9565b6001900380156157d757612f53565b6001900380156157d75761336c565b6001900380156157d757610b51565b6001900380156157d757612d56565b6001900380156157d757613eba565b6001900380156157d757612a77565b6001900380156157d7576151a3565b6001900380156157d757615615565b6001900380156157d757611681565b6001900380156157d75761372c565b6001900380156157d757611ee1565b6001900380156157d7576116ae565b6001900380156157d7576155d9565b6001900380156157d757615563565b6001900380156157d757615329565b6001900380156157d757614cb8565b6001900380156157d75761443c565b6001900380156157d757611717565b6001900380156157d757614a80565b6001900380156157d757613ed8565b6001900380156157d7576146de565b6001900380156157d7576112ee565b6001900380156157d757613bdb565b6001900380156157d757610558565b6001900380156157d75761210b565b6001900380156157d7576117f8565b6001900380156157d757611e00565b6001900380156157d7576152cf565b6001900380156157d757612b49565b6001900380156157d757613d52565b6001900380156157d757614f79565b6001900380156157d7576131aa565b6001900380156157d757614936565b6001900380156157d75761080a565b6001900380156157d7576113cf565b6001900380156157d7576157aa565b6001900380156157d757611f1c565b6001900380156157d757614022565b6001900380156157d757613dca565b6001900380156157d757612ecc565b6001900380156157d757613ec9565b6001900380156157d757615248565b6001900380156157d75761199b565b6001900380156157d7576104b4565b6001900380156157d7576104a5565b6001900380156157d757613588565b6001900380156157d75761264e565b6001900380156157d75761043c565b6001900380156157d75761441e565b6001900380156157d7576136ff565b6001900380156157d757610bba565b6001900380156157d757610469565b6001900380156157d757611d79565b6001900380156157d7576148be565b6001900380156157d757611537565b6001900380156157d7576134c5565b6001900380156157d7576136f0565b6001900380156157d75761123a565b6001900380156157d757613b54565b6001900380156157d757614e11565b6001900380156157d757610e4d565b6001900380156157d757615571565b6001900380156157d75760d6565b6001900380156157d757612507565b6001900380156157d757614301565b6001900380156157d757613a28565b6001900380156157d7576119aa565b6001900380156157d757615633565b6001900380156157d75761275c565b6001900380156157d75761418a565b6001900380156157d7576126f3565b6001900380156157d757614f97565b6001900380156157d7576133e4565b6001900380156157d75761200c565b6001900380156157d757614b9d565b6001900380156157d75761422f565b6001900380156157d757611e87565b6001900380156157d757613e15565b6001900380156157d7576137fe565b6001900380156157d757615491565b6001900380156157d757611fa3565b6001900380156157d7576149cc565b6001900380156157d7576153a1565b6001900380156157d757613ce9565b6001900380156157d7576131d7565b6001900380156157d757615096565b6001900380156157d757614b34565b6001900380156157d75761316e565b6001900380156157d7576110ff565b6001900380156157d7576112a3565b6001900380156157d757613e33565b6001900380156157d757610cd6565b6001900380156157d757612d82565b6001900380156157d757612ef9565b6001900380156157d7576155bb565b6001900380156157d7576106a2565b6001900380156157d757610576565b6001900380156157d757612d29565b6001900380156157d75761501e565b6001900380156157d75761427a565b6001900380156157d757614e2f565b6001900380156157d757610f4c565b6001900380156157d757613c8f565b6001900380156157d7576143f1565b6001900380156157d757613105565b6001900380156157d7576123db565b6001900380156157d757612048565b6001900380156157d75761259c565b6001900380156157d757614c6e565b6001900380156157d757610864565b6001900380156157d7576108a0565b6001900380156157d7576138c0565b6001900380156157d757610fb5565b6001900380156157d757612d47565b6001900380156157d757612192565b6001900380156157d757614004565b6001900380156157d757611da6565b6001900380156157d757611276565b6001900380156157d757612a95565b6001900380156157d75761440f565b6001900380156157d7576154be565b6001900380156157d7576120a2565b6001900380156157d757611ec3565b6001900380156157d757610648565b6001900380156157d75761282e565b6001900380156157d757611c6b565b6001900380156157d757612720565b6001900380156157d757610289565b6001900380156157d7576114ce565b6001900380156157d757613a55565b6001900380156157d75761239f565b6001900380156157d757610ec5565b6001900380156157d75761023e565b6001900380156157d757613acd565b6001900380156157d757614d12565b6001900380156157d7576138ed565b6001900380156157d757611905565b6001900380156157d7576139dd565b6001900380156157d757615446565b6001900380156157d757611941565b6001900380156157d757613420565b6001900380156157d757615194565b6001900380156157d75761018a565b6001900380156157d7576154cd565b6001900380156157d757615437565b6001900380156157d757611ed2565b6001900380156157d757611932565b6001900380156157d757612702565b6001900380156157d75761294b565b6001900380156157d75761034c565b6001900380156157d75761415d565b6001900380156157d7576031565b6001900380156157d7576130e8565b6001900380156157d7576153b0565b6001900380156157d7576147ce565b6001900380156157d757612987565b6001900380156157d757612879565b6001900380156157d757614f88565b6001900380156157d7576146c0565b6001900380156157d757611f67565b6001900380156157d7576102b6565b6001900380156157d7576022565b6001900380156157d757613498565b6001900380156157d757613f7d565b6001900380156157d75761417b565b6001900380156157d757614cc7565b6001900380156157d757613bea565b6001900380156157d757612b58565b6001900380156157d757611573565b6001900380156157d757614792565b6001900380156157d7576129d2565b6001900380156157d7576106c0565b6001900380156157d757613a73565b6001900380156157d7576155f7565b6001900380156157d75761407c565b6001900380156157d75761382b565b6001900380156157d75761567e565b6001900380156157d757614103565b6001900380156157d757610972565b6001900380156157d757612390565b6001900380156157d757611ab8565b6001900380156157d757614dc6565b6001900380156157d757612deb565b6001900380156157d757615365565b6001900380156157d757613768565b6001900380156157d757615392565b6001900380156157d757613759565b6001900380156157d7576120de565b6001900380156157d7576116f9565b6001900380156157d757614595565b6001900380156157d7576121ce565b6001900380156157d757611f2b565b6001900380156157d7576139fb565b6001900380156157d757614774565b6001900380156157d757614400565b6001900380156157d7576110b4565b6001900380156157d757610756565b6001900380156157d757612f35565b6001900380156157d757611663565b6001900380156157d7576115af565b6001900380156157d757612bfd565b6001900380156157d7576132c7565b6001900380156157d757612426565b6001900380156157d757610d12565b6001900380156157d7576101a8565b6001900380156157d757612e45565b6001900380156157d757613c53565b6001900380156157d757612711565b6001900380156157d75761274d565b6001900380156157d757614729565b6001900380156157d757610963565b6001900380156157d757611546565b6001900380156157d757612c57565b6001900380156157d757610585565b6001900380156157d757612e81565b6001900380156157d757610a7f565b6001900380156157d757611bf3565b6001900380156157d757611591565b6001900380156157d7576155ac565b6001900380156157d757612ddc565b6001900380156157d757612798565b6001900380156157d757611735565b6001900380156157d757612219565b6001900380156157d7576117ad565b6001900380156157d757610ef2565b6001900380156157d757611195565b6001900380156157d757614783565b6001900380156157d7576152ed565b6001900380156157d7576156d8565b6001900380156157d757610da8565b6001900380156157d75761178f565b6001900380156157d757611645565b6001900380156157d7576118ba565b6001900380156157d7576157c8565b6001900380156157d75760a9565b6001900380156157d757612dbe565b6001900380156157d757613ccb565b6001900380156157d757611528565b6001900380156157d75761293c565b6001900380156157d7576121b0565b6001900380156157d757611a4f565b6001900380156157d757614abc565b6001900380156157d757613f8c565b6001900380156157d7576140b8565b6001900380156157d75761354c565b6001900380156157d757614577565b6001900380156157d757610478565b6001900380156157d7576151ee565b6001900380156157d757612273565b6001900380156157d7576133a8565b6001900380156157d75761198c565b6001900380156157d757612d0b565b6001900380156157d757615714565b6001900380156157d7576102a7565b6001900380156157d757615473565b6001900380156157d757612408565b6001900380156157d757613983565b6001900380156157d757610298565b6001900380156157d757610684565b6001900380156157d757611d1f565b6001900380156157d757613e8d565b6001900380156157d757613c62565b6001900380156157d7576129b4565b6001900380156157d757614bd9565b6001900380156157d757610ff1565b6001900380156157d7576138de565b6001900380156157d7576111e0565b6001900380156157d7576112df565b6001900380156157d7576147ec565b6001900380156157d757614d21565b6001900380156157d757611267565b6001900380156157d757613bcc565b6001900380156157d757610400565b6001900380156157d757611a5e565b6001900380156157d7576127c5565b6001900380156157d7576143a6565b6001900380156157d7576105fd565b6001900380156157d757610819565b6001900380156157d757612066565b6001900380156157d757612cde565b6001900380156157d757613938565b6001900380156157d7576126a8565b6001900380156157d757610f2e565b6001900380156157d757612c0c565b6001900380156157d75761463a565b6001900380156157d757614c14565b6001900380156157d757611c5c565b6001900380156157d757610f6a565b6001900380156157d757611a13565b6001900380156157d757615069565b6001900380156157d7576149bd565b6001900380156157d7576152fc565b6001900380156157d757611f58565b6001900380156157d757613d34565b6001900380156157d757612516565b6001900380156157d7576114ec565b6001900380156157d757612ba3565b6001900380156157d757610f10565b6001900380156157d757614dd5565b6001900380156157d757611de2565b6001900380156157d757613141565b6001900380156157d757611fee565b6001900380156157d757611c7a565b6001900380156157d75761365a565b6001900380156157d757610d3f565b6001900380156157d7576106b1565b6001900380156157d757615660565b6001900380156157d757614738565b6001900380156157d7576135f1565b6001900380156157d757612afe565b6001900380156157d757613aeb565b6001900380156157d7576144e1565b6001900380156157d7576103a6565b6001900380156157d75760e5565b6001900380156157d757613f32565b6001900380156157d75761356a565b6001900380156157d757615078565b6001900380156157d75760b8565b6001900380156157d75761355b565b6001900380156157d757614de4565b6001900380156157d75761334e565b6001900380156157d7576106ed565b6001900380156157d757610ad9565b6001900380156157d75761099f565b6001900380156157d757614013565b6001900380156157d757612354565b6001900380156157d757611ba8565b6001900380156157d7576121dd565b6001900380156157d757612e54565b6001900380156157d757613e9c565b6001900380156157d757614756565b6001900380156157d757615374565b6001900380156157d757610de4565b6001900380156157d7576115fa565b6001900380156157d7576136a5565b6001900380156157d757614cd6565b6001900380156157d757610657565b6001900380156157d7576123ae565b6001900380156157d757610e02565b6001900380156157d757612e36565b6001900380156157d7576148a0565b6001900380156157d757613501565b6001900380156157d757614f2e565b6001900380156157d757610e98565b6001900380156157d757611c98565b6001900380156157d757612363565b6001900380156157d757610549565b6001900380156157d757614846565b6001900380156157d757611b3f565b6001900380156157d7576122dc565b6001900380156157d75761454a565b6001900380156157d757612bd0565b6001900380156157d757613e24565b6001900380156157d757611ce3565b6001900380156157d757612604565b60006000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/jmpfest_random.eas b/tools/contracts/benchmarks/jmpfest_random.eas deleted file mode 100644 index cca1d1a72..000000000 --- a/tools/contracts/benchmarks/jmpfest_random.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that does a lot of jumps, random variant. - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("jmpfest_random_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/jmpfest_random_body.eas b/tools/contracts/benchmarks/jmpfest_random_body.eas deleted file mode 100644 index 80a2ce626..000000000 --- a/tools/contracts/benchmarks/jmpfest_random_body.eas +++ /dev/null @@ -1,16506 +0,0 @@ -%push(1000000) -L0: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1066) -jump -L1: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L265) -jump -L2: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L30) -jump -L3: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1437) -jump -L4: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L441) -jump -L5: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1100) -jump -L6: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L136) -jump -L7: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L187) -jump -L8: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L857) -jump -L9: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L439) -jump -L10: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L273) -jump -L11: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1182) -jump -L12: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L693) -jump -L13: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1196) -jump -L14: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1204) -jump -L15: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L240) -jump -L16: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L461) -jump -L17: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L347) -jump -L18: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1151) -jump -L19: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L199) -jump -L20: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L899) -jump -L21: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L144) -jump -L22: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L291) -jump -L23: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L538) -jump -L24: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L343) -jump -L25: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1197) -jump -L26: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L729) -jump -L27: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1026) -jump -L28: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L269) -jump -L29: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1015) -jump -L30: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L717) -jump -L31: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L192) -jump -L32: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L579) -jump -L33: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L763) -jump -L34: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L703) -jump -L35: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L494) -jump -L36: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L502) -jump -L37: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1264) -jump -L38: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1449) -jump -L39: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L292) -jump -L40: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L169) -jump -L41: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L225) -jump -L42: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1090) -jump -L43: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1059) -jump -L44: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L944) -jump -L45: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1273) -jump -L46: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1077) -jump -L47: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1423) -jump -L48: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1304) -jump -L49: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L372) -jump -L50: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1293) -jump -L51: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L175) -jump -L52: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L658) -jump -L53: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L932) -jump -L54: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L50) -jump -L55: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1010) -jump -L56: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L950) -jump -L57: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1418) -jump -L58: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L913) -jump -L59: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L508) -jump -L60: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1233) -jump -L61: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1415) -jump -L62: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L335) -jump -L63: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L662) -jump -L64: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L991) -jump -L65: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1041) -jump -L66: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L586) -jump -L67: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L369) -jump -L68: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1431) -jump -L69: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L915) -jump -L70: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1390) -jump -L71: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1089) -jump -L72: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L987) -jump -L73: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L824) -jump -L74: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1377) -jump -L75: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L661) -jump -L76: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1422) -jump -L77: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L558) -jump -L78: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L180) -jump -L79: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L934) -jump -L80: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L41) -jump -L81: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1088) -jump -L82: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1282) -jump -L83: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L953) -jump -L84: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L16) -jump -L85: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L873) -jump -L86: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L339) -jump -L87: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L209) -jump -L88: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L833) -jump -L89: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L845) -jump -L90: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1011) -jump -L91: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L487) -jump -L92: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L492) -jump -L93: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L337) -jump -L94: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1153) -jump -L95: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1355) -jump -L96: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L415) -jump -L97: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1049) -jump -L98: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1274) -jump -L99: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1044) -jump -L100: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L401) -jump -L101: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L652) -jump -L102: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1244) -jump -L103: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L216) -jump -L104: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1139) -jump -L105: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L379) -jump -L106: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L432) -jump -L107: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L780) -jump -L108: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L786) -jump -L109: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1309) -jump -L110: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L855) -jump -L111: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1334) -jump -L112: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L566) -jump -L113: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L958) -jump -L114: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L475) -jump -L115: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L562) -jump -L116: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L937) -jump -L117: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L639) -jump -L118: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L840) -jump -L119: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1485) -jump -L120: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L606) -jump -L121: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L47) -jump -L122: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1152) -jump -L123: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L685) -jump -L124: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L852) -jump -L125: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1388) -jump -L126: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L128) -jump -L127: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1302) -jump -L128: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1349) -jump -L129: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L900) -jump -L130: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L211) -jump -L131: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1496) -jump -L132: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L238) -jump -L133: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L32) -jump -L134: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L229) -jump -L135: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L881) -jump -L136: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L458) -jump -L137: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1419) -jump -L138: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L351) -jump -L139: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L590) -jump -L140: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L754) -jump -L141: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L308) -jump -L142: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L177) -jump -L143: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1300) -jump -L144: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1164) -jump -L145: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1365) -jump -L146: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L801) -jump -L147: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L628) -jump -L148: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L140) -jump -L149: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L77) -jump -L150: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L989) -jump -L151: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1064) -jump -L152: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L929) -jump -L153: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1322) -jump -L154: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1134) -jump -L155: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L173) -jump -L156: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1398) -jump -L157: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L60) -jump -L158: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L916) -jump -L159: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L121) -jump -L160: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L843) -jump -L161: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1412) -jump -L162: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1321) -jump -L163: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1126) -jump -L164: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1408) -jump -L165: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L186) -jump -L166: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L7) -jump -L167: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1092) -jump -L168: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1096) -jump -L169: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L846) -jump -L170: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L154) -jump -L171: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1120) -jump -L172: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L395) -jump -L173: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1020) -jump -L174: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L490) -jump -L175: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L635) -jump -L176: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L966) -jump -L177: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1230) -jump -L178: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1406) -jump -L179: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L804) -jump -L180: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L976) -jump -L181: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1453) -jump -L182: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1294) -jump -L183: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L640) -jump -L184: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L587) -jump -L185: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1251) -jump -L186: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L637) -jump -L187: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L753) -jump -L188: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L549) -jump -L189: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L334) -jump -L190: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L170) -jump -L191: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L499) -jump -L192: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1211) -jump -L193: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1007) -jump -L194: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L750) -jump -L195: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L100) -jump -L196: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L92) -jump -L197: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L63) -jump -L198: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1275) -jump -L199: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L537) -jump -L200: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L722) -jump -L201: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L48) -jump -L202: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L651) -jump -L203: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L10) -jump -L204: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L482) -jump -L205: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L903) -jump -L206: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L22) -jump -L207: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L151) -jump -L208: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L222) -jump -L209: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1187) -jump -L210: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L316) -jump -L211: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1400) -jump -L212: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1345) -jump -L213: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L627) -jump -L214: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L925) -jump -L215: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L201) -jump -L216: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L198) -jump -L217: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1173) -jump -L218: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1017) -jump -L219: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L858) -jump -L220: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L406) -jump -L221: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1109) -jump -L222: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L374) -jump -L223: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1070) -jump -L224: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L320) -jump -L225: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L352) -jump -L226: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L97) -jump -L227: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L350) -jump -L228: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L284) -jump -L229: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L820) -jump -L230: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L674) -jump -L231: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1484) -jump -L232: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1057) -jump -L233: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1106) -jump -L234: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1270) -jump -L235: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L262) -jump -L236: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L35) -jump -L237: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1473) -jump -L238: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L279) -jump -L239: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1498) -jump -L240: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L460) -jump -L241: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L994) -jump -L242: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L770) -jump -L243: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1107) -jump -L244: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L444) -jump -L245: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L202) -jump -L246: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L423) -jump -L247: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L256) -jump -L248: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L302) -jump -L249: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L613) -jump -L250: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L31) -jump -L251: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1018) -jump -L252: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L864) -jump -L253: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L274) -jump -L254: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L388) -jump -L255: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L25) -jump -L256: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L301) -jump -L257: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1360) -jump -L258: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L511) -jump -L259: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1000) -jump -L260: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1370) -jump -L261: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L501) -jump -L262: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L332) -jump -L263: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1455) -jump -L264: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L167) -jump -L265: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L64) -jump -L266: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L907) -jump -L267: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L119) -jump -L268: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L267) -jump -L269: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1042) -jump -L270: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L678) -jump -L271: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L448) -jump -L272: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L71) -jump -L273: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L940) -jump -L274: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L280) -jump -L275: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1454) -jump -L276: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1143) -jump -L277: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1159) -jump -L278: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L819) -jump -L279: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L278) -jump -L280: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L447) -jump -L281: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1337) -jump -L282: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1065) -jump -L283: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L36) -jump -L284: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1347) -jump -L285: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L473) -jump -L286: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1213) -jump -L287: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1331) -jump -L288: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1067) -jump -L289: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L122) -jump -L290: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L715) -jump -L291: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1301) -jump -L292: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1099) -jump -L293: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1488) -jump -L294: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L556) -jump -L295: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L520) -jump -L296: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L978) -jump -L297: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L762) -jump -L298: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1490) -jump -L299: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L812) -jump -L300: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L424) -jump -L301: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L596) -jump -L302: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L893) -jump -L303: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L61) -jump -L304: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L647) -jump -L305: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L983) -jump -L306: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1433) -jump -L307: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1177) -jump -L308: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1154) -jump -L309: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L247) -jump -L310: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L742) -jump -L311: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L522) -jump -L312: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L231) -jump -L313: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L328) -jump -L314: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L321) -jump -L315: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L862) -jump -L316: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L518) -jump -L317: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1214) -jump -L318: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L400) -jump -L319: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L342) -jump -L320: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L253) -jump -L321: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L922) -jump -L322: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1209) -jump -L323: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L459) -jump -L324: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L250) -jump -L325: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1451) -jump -L326: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1189) -jump -L327: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1353) -jump -L328: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L183) -jump -L329: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L610) -jump -L330: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L756) -jump -L331: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L619) -jump -L332: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L221) -jump -L333: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1356) -jump -L334: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L310) -jump -L335: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L258) -jump -L336: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L98) -jump -L337: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L66) -jump -L338: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1281) -jump -L339: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L648) -jump -L340: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1212) -jump -L341: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L871) -jump -L342: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L829) -jump -L343: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L620) -jump -L344: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L165) -jump -L345: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1262) -jump -L346: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L572) -jump -L347: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L218) -jump -L348: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1190) -jump -L349: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L39) -jump -L350: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L296) -jump -L351: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L413) -jump -L352: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L776) -jump -L353: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L101) -jump -L354: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L228) -jump -L355: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1083) -jump -L356: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1434) -jump -L357: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L270) -jump -L358: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1191) -jump -L359: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L761) -jump -L360: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L420) -jump -L361: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1363) -jump -L362: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L59) -jump -L363: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1257) -jump -L364: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1267) -jump -L365: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1332) -jump -L366: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1227) -jump -L367: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L760) -jump -L368: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L69) -jump -L369: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L297) -jump -L370: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L625) -jump -L371: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L212) -jump -L372: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L720) -jump -L373: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1325) -jump -L374: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L815) -jump -L375: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L689) -jump -L376: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1169) -jump -L377: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L823) -jump -L378: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L733) -jump -L379: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1063) -jump -L380: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L567) -jump -L381: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L611) -jump -L382: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L344) -jump -L383: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L854) -jump -L384: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1380) -jump -L385: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L149) -jump -L386: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1306) -jump -L387: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L870) -jump -L388: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L605) -jump -L389: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L688) -jump -L390: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L973) -jump -L391: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L33) -jump -L392: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L483) -jump -L393: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L466) -jump -L394: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L288) -jump -L395: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L230) -jump -L396: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L496) -jump -L397: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1091) -jump -L398: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1348) -jump -L399: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L920) -jump -L400: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L248) -jump -L401: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L782) -jump -L402: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L504) -jump -L403: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L700) -jump -L404: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L698) -jump -L405: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1383) -jump -L406: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L813) -jump -L407: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L952) -jump -L408: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1379) -jump -L409: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L210) -jump -L410: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L655) -jump -L411: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L480) -jump -L412: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1386) -jump -L413: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L961) -jump -L414: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L524) -jump -L415: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L156) -jump -L416: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1029) -jump -L417: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L8) -jump -L418: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L710) -jump -L419: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1339) -jump -L420: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1053) -jump -L421: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1114) -jump -L422: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1287) -jump -L423: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L645) -jump -L424: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L706) -jump -L425: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L580) -jump -L426: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L778) -jump -L427: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L809) -jump -L428: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L897) -jump -L429: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1235) -jump -L430: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L516) -jump -L431: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L638) -jump -L432: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L67) -jump -L433: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L598) -jump -L434: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L892) -jump -L435: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1396) -jump -L436: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L963) -jump -L437: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1122) -jump -L438: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1467) -jump -L439: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1336) -jump -L440: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L597) -jump -L441: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L313) -jump -L442: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L87) -jump -L443: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L498) -jump -L444: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L768) -jump -L445: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1381) -jump -L446: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1132) -jump -L447: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L955) -jump -L448: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1285) -jump -L449: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L601) -jump -L450: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1327) -jump -L451: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L570) -jump -L452: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L190) -jump -L453: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1237) -jump -L454: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1319) -jump -L455: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L765) -jump -L456: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L884) -jump -L457: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L446) -jump -L458: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L951) -jump -L459: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1265) -jump -L460: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L360) -jump -L461: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L954) -jump -L462: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L73) -jump -L463: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L18) -jump -L464: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1253) -jump -L465: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L312) -jump -L466: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L236) -jump -L467: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L468) -jump -L468: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1051) -jump -L469: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L534) -jump -L470: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L172) -jump -L471: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1313) -jump -L472: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L306) -jump -L473: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1108) -jump -L474: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L585) -jump -L475: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L17) -jump -L476: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L948) -jump -L477: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L515) -jump -L478: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L390) -jump -L479: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1296) -jump -L480: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1407) -jump -L481: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L935) -jump -L482: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1341) -jump -L483: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L888) -jump -L484: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L393) -jump -L485: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L398) -jump -L486: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1241) -jump -L487: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L957) -jump -L488: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L376) -jump -L489: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1256) -jump -L490: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L767) -jump -L491: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1149) -jump -L492: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L358) -jump -L493: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L539) -jump -L494: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L331) -jump -L495: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L624) -jump -L496: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L295) -jump -L497: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1421) -jump -L498: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L889) -jump -L499: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L207) -jump -L500: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L234) -jump -L501: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L850) -jump -L502: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1297) -jump -L503: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L964) -jump -L504: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1480) -jump -L505: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L245) -jump -L506: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L980) -jump -L507: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1175) -jump -L508: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L716) -jump -L509: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L528) -jump -L510: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L489) -jump -L511: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L856) -jump -L512: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L53) -jump -L513: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1489) -jump -L514: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1441) -jump -L515: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L830) -jump -L516: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L135) -jump -L517: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L241) -jump -L518: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L924) -jump -L519: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L345) -jump -L520: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L626) -jump -L521: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L299) -jump -L522: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L825) -jump -L523: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L491) -jump -L524: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L509) -jump -L525: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1479) -jump -L526: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1043) -jump -L527: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L266) -jump -L528: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L810) -jump -L529: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1) -jump -L530: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L385) -jump -L531: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L936) -jump -L532: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L294) -jump -L533: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L711) -jump -L534: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L37) -jump -L535: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L863) -jump -L536: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L235) -jump -L537: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1131) -jump -L538: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1402) -jump -L539: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1367) -jump -L540: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1037) -jump -L541: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1243) -jump -L542: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L514) -jump -L543: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1171) -jump -L544: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L421) -jump -L545: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L543) -jump -L546: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1229) -jump -L547: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L692) -jump -L548: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1443) -jump -L549: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1074) -jump -L550: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L960) -jump -L551: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L680) -jump -L552: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1203) -jump -L553: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L926) -jump -L554: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L303) -jump -L555: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L246) -jump -L556: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L293) -jump -L557: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1372) -jump -L558: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L353) -jump -L559: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1286) -jump -L560: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L721) -jump -L561: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L203) -jump -L562: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L669) -jump -L563: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L653) -jump -L564: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L182) -jump -L565: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L289) -jump -L566: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L309) -jump -L567: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L191) -jump -L568: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L519) -jump -L569: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L416) -jump -L570: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1290) -jump -L571: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L677) -jump -L572: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L251) -jump -L573: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L442) -jump -L574: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1103) -jump -L575: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1080) -jump -L576: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L428) -jump -L577: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L559) -jump -L578: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L737) -jump -L579: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L682) -jump -L580: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L204) -jump -L581: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1268) -jump -L582: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L865) -jump -L583: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L831) -jump -L584: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1369) -jump -L585: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1157) -jump -L586: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L787) -jump -L587: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L906) -jump -L588: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L82) -jump -L589: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L399) -jump -L590: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L286) -jump -L591: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L657) -jump -L592: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L24) -jump -L593: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L451) -jump -L594: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L166) -jump -L595: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L474) -jump -L596: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L505) -jump -L597: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1283) -jump -L598: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L131) -jump -L599: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L584) -jump -L600: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1249) -jump -L601: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L723) -jump -L602: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1016) -jump -L603: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1476) -jump -L604: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L283) -jump -L605: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L792) -jump -L606: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L139) -jump -L607: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L304) -jump -L608: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L275) -jump -L609: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1303) -jump -L610: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L879) -jump -L611: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L159) -jump -L612: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1314) -jump -L613: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1403) -jump -L614: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1382) -jump -L615: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L795) -jump -L616: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L687) -jump -L617: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L174) -jump -L618: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1219) -jump -L619: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L554) -jump -L620: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1174) -jump -L621: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L839) -jump -L622: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1193) -jump -L623: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1025) -jump -L624: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1326) -jump -L625: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L896) -jump -L626: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L811) -jump -L627: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1217) -jump -L628: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L832) -jump -L629: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L106) -jump -L630: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L176) -jump -L631: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L389) -jump -L632: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1457) -jump -L633: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L828) -jump -L634: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L157) -jump -L635: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L213) -jump -L636: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L594) -jump -L637: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L365) -jump -L638: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L124) -jump -L639: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1181) -jump -L640: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L675) -jump -L641: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L4) -jump -L642: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L464) -jump -L643: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L378) -jump -L644: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L6) -jump -L645: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L319) -jump -L646: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L54) -jump -L647: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L214) -jump -L648: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L583) -jump -L649: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L695) -jump -L650: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1097) -jump -L651: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1028) -jump -L652: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L13) -jump -L653: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L224) -jump -L654: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L859) -jump -L655: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L129) -jump -L656: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1148) -jump -L657: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1201) -jump -L658: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L243) -jump -L659: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1009) -jump -L660: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L109) -jump -L661: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L65) -jump -L662: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1361) -jump -L663: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L146) -jump -L664: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L163) -jump -L665: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L142) -jump -L666: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L133) -jump -L667: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L529) -jump -L668: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L997) -jump -L669: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1185) -jump -L670: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L634) -jump -L671: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1495) -jump -L672: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1387) -jump -L673: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L908) -jump -L674: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L354) -jump -L675: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L181) -jump -L676: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1410) -jump -L677: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L325) -jump -L678: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L58) -jump -L679: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L23) -jump -L680: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L523) -jump -L681: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L563) -jump -L682: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1378) -jump -L683: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1117) -jump -L684: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L995) -jump -L685: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L282) -jump -L686: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1263) -jump -L687: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L120) -jump -L688: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L968) -jump -L689: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L407) -jump -L690: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L171) -jump -L691: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1462) -jump -L692: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1238) -jump -L693: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L974) -jump -L694: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L805) -jump -L695: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L758) -jump -L696: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1445) -jump -L697: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1027) -jump -L698: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1231) -jump -L699: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1409) -jump -L700: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1460) -jump -L701: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1371) -jump -L702: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1145) -jump -L703: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L495) -jump -L704: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L887) -jump -L705: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1261) -jump -L706: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L51) -jump -L707: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L367) -jump -L708: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L110) -jump -L709: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L755) -jump -L710: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L581) -jump -L711: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L979) -jump -L712: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L842) -jump -L713: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L123) -jump -L714: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L701) -jump -L715: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1223) -jump -L716: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L772) -jump -L717: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L541) -jump -L718: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L178) -jump -L719: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L708) -jump -L720: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1075) -jump -L721: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L105) -jump -L722: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L19) -jump -L723: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L793) -jump -L724: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1008) -jump -L725: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L533) -jump -L726: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1344) -jump -L727: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L542) -jump -L728: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L152) -jump -L729: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L469) -jump -L730: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1246) -jump -L731: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L643) -jump -L732: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L684) -jump -L733: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L600) -jump -L734: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L736) -jump -L735: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L656) -jump -L736: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L664) -jump -L737: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L40) -jump -L738: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L919) -jump -L739: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1278) -jump -L740: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1170) -jump -L741: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L158) -jump -L742: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L834) -jump -L743: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L417) -jump -L744: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1318) -jump -L745: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L208) -jump -L746: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L419) -jump -L747: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1411) -jump -L748: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1121) -jump -L749: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L569) -jump -L750: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L759) -jump -L751: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L818) -jump -L752: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1224) -jump -L753: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1346) -jump -L754: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1435) -jump -L755: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L927) -jump -L756: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L326) -jump -L757: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L463) -jump -L758: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L565) -jump -L759: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L749) -jump -L760: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L696) -jump -L761: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L630) -jump -L762: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L89) -jump -L763: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1081) -jump -L764: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L189) -jump -L765: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1280) -jump -L766: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1012) -jump -L767: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L663) -jump -L768: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L329) -jump -L769: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L34) -jump -L770: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L571) -jump -L771: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1046) -jump -L772: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L560) -jump -L773: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L644) -jump -L774: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L9) -jump -L775: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L405) -jump -L776: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L902) -jump -L777: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1486) -jump -L778: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1354) -jump -L779: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1292) -jump -L780: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L20) -jump -L781: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1098) -jump -L782: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L826) -jump -L783: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L336) -jump -L784: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L631) -jump -L785: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L894) -jump -L786: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1195) -jump -L787: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L807) -jump -L788: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L195) -jump -L789: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L330) -jump -L790: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1024) -jump -L791: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L641) -jump -L792: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1087) -jump -L793: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L298) -jump -L794: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L618) -jump -L795: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L281) -jump -L796: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L29) -jump -L797: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L346) -jump -L798: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L112) -jump -L799: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1184) -jump -L800: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L869) -jump -L801: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L975) -jump -L802: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L775) -jump -L803: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L838) -jump -L804: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L373) -jump -L805: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1375) -jump -L806: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1492) -jump -L807: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L74) -jump -L808: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L885) -jump -L809: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L103) -jump -L810: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L576) -jump -L811: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L155) -jump -L812: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L433) -jump -L813: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1048) -jump -L814: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1471) -jump -L815: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L816) -jump -L816: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L895) -jump -L817: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1052) -jump -L818: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L116) -jump -L819: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1206) -jump -L820: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L986) -jump -L821: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L132) -jump -L822: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L592) -jump -L823: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L434) -jump -L824: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1178) -jump -L825: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1323) -jump -L826: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L84) -jump -L827: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L205) -jump -L828: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L391) -jump -L829: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1033) -jump -L830: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L732) -jump -L831: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1225) -jump -L832: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L162) -jump -L833: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L411) -jump -L834: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1137) -jump -L835: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1245) -jump -L836: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L0) -jump -L837: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1432) -jump -L838: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L868) -jump -L839: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L452) -jump -L840: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L150) -jump -L841: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L764) -jump -L842: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L254) -jump -L843: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L788) -jump -L844: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L42) -jump -L845: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L589) -jump -L846: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1111) -jump -L847: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1340) -jump -L848: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1469) -jump -L849: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L923) -jump -L850: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L803) -jump -L851: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L117) -jump -L852: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L941) -jump -L853: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1277) -jump -L854: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L785) -jump -L855: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L744) -jump -L856: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L797) -jump -L857: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L718) -jump -L858: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1032) -jump -L859: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L127) -jump -L860: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L683) -jump -L861: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1172) -jump -L862: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1035) -jump -L863: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1362) -jump -L864: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L349) -jump -L865: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L599) -jump -L866: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L735) -jump -L867: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1001) -jump -L868: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L383) -jump -L869: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L681) -jump -L870: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L847) -jump -L871: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1123) -jump -L872: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L707) -jump -L873: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1289) -jump -L874: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1239) -jump -L875: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L836) -jump -L876: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1494) -jump -L877: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1086) -jump -L878: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L550) -jump -L879: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L340) -jump -L880: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1136) -jump -L881: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L377) -jump -L882: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L694) -jump -L883: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L817) -jump -L884: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L271) -jump -L885: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L731) -jump -L886: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1338) -jump -L887: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L478) -jump -L888: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L909) -jump -L889: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1364) -jump -L890: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1481) -jump -L891: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L81) -jump -L892: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L992) -jump -L893: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L21) -jump -L894: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1124) -jump -L895: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L861) -jump -L896: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1200) -jump -L897: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L726) -jump -L898: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1307) -jump -L899: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1180) -jump -L900: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L500) -jump -L901: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1039) -jump -L902: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L593) -jump -L903: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L552) -jump -L904: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1279) -jump -L905: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L970) -jump -L906: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L947) -jump -L907: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1167) -jump -L908: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L985) -jump -L909: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L470) -jump -L910: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1078) -jump -L911: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L78) -jump -L912: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L429) -jump -L913: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L455) -jump -L914: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L659) -jump -L915: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1125) -jump -L916: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L476) -jump -L917: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1258) -jump -L918: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L743) -jump -L919: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1058) -jump -L920: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L967) -jump -L921: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L348) -jump -L922: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L134) -jump -L923: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1350) -jump -L924: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L962) -jump -L925: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1002) -jump -L926: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L930) -jump -L927: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L507) -jump -L928: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L324) -jump -L929: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L670) -jump -L930: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1255) -jump -L931: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1054) -jump -L932: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L877) -jump -L933: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1113) -jump -L934: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L798) -jump -L935: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L699) -jump -L936: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1266) -jump -L937: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L650) -jump -L938: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L57) -jump -L939: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L414) -jump -L940: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L724) -jump -L941: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L918) -jump -L942: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1019) -jump -L943: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1324) -jump -L944: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L153) -jump -L945: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1385) -jump -L946: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L866) -jump -L947: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L184) -jump -L948: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L49) -jump -L949: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L673) -jump -L950: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L872) -jump -L951: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1166) -jump -L952: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1192) -jump -L953: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L904) -jump -L954: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L621) -jump -L955: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L891) -jump -L956: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1127) -jump -L957: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L943) -jump -L958: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L814) -jump -L959: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1147) -jump -L960: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L317) -jump -L961: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L242) -jump -L962: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1254) -jump -L963: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1236) -jump -L964: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L462) -jump -L965: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1179) -jump -L966: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L5) -jump -L967: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1050) -jump -L968: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L860) -jump -L969: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1104) -jump -L970: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1202) -jump -L971: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1478) -jump -L972: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L333) -jump -L973: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L796) -jump -L974: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1430) -jump -L975: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L70) -jump -L976: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L197) -jump -L977: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L479) -jump -L978: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1401) -jump -L979: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L800) -jump -L980: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1389) -jump -L981: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1248) -jump -L982: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L853) -jump -L983: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1146) -jump -L984: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1005) -jump -L985: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1129) -jump -L986: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L822) -jump -L987: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L646) -jump -L988: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1207) -jump -L989: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L96) -jump -L990: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L574) -jump -L991: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L965) -jump -L992: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L875) -jump -L993: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L86) -jump -L994: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1269) -jump -L995: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1232) -jump -L996: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1168) -jump -L997: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1404) -jump -L998: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L454) -jump -L999: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L713) -jump -L1000: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L546) -jump -L1001: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1343) -jump -L1002: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L397) -jump -L1003: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1128) -jump -L1004: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1456) -jump -L1005: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L99) -jump -L1006: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L130) -jump -L1007: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1391) -jump -L1008: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L481) -jump -L1009: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L779) -jump -L1010: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1392) -jump -L1011: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L188) -jump -L1012: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1493) -jump -L1013: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1315) -jump -L1014: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L403) -jump -L1015: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L728) -jump -L1016: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L426) -jump -L1017: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L702) -jump -L1018: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L616) -jump -L1019: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1474) -jump -L1020: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L530) -jump -L1021: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L27) -jump -L1022: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1198) -jump -L1023: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1298) -jump -L1024: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L168) -jump -L1025: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L418) -jump -L1026: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L602) -jump -L1027: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L555) -jump -L1028: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1395) -jump -L1029: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L386) -jump -L1030: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L827) -jump -L1031: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1491) -jump -L1032: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1082) -jump -L1033: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L220) -jump -L1034: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1461) -jump -L1035: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L471) -jump -L1036: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L443) -jump -L1037: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1115) -jump -L1038: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L83) -jump -L1039: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L984) -jump -L1040: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1138) -jump -L1041: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L849) -jump -L1042: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L747) -jump -L1043: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1205) -jump -L1044: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L217) -jump -L1045: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L622) -jump -L1046: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L981) -jump -L1047: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L425) -jump -L1048: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L623) -jump -L1049: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1366) -jump -L1050: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L356) -jump -L1051: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L513) -jump -L1052: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L341) -jump -L1053: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1133) -jump -L1054: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L917) -jump -L1055: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1150) -jump -L1056: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L435) -jump -L1057: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L517) -jump -L1058: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L276) -jump -L1059: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1426) -jump -L1060: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L227) -jump -L1061: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1036) -jump -L1062: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L381) -jump -L1063: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L629) -jump -L1064: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L287) -jump -L1065: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L52) -jump -L1066: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L194) -jump -L1067: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L568) -jump -L1068: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L206) -jump -L1069: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1056) -jump -L1070: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1014) -jump -L1071: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L260) -jump -L1072: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L232) -jump -L1073: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1413) -jump -L1074: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1142) -jump -L1075: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1140) -jump -L1076: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L690) -jump -L1077: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L307) -jump -L1078: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L440) -jump -L1079: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L55) -jump -L1080: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L457) -jump -L1081: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L874) -jump -L1082: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1158) -jump -L1083: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L145) -jump -L1084: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1440) -jump -L1085: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1452) -jump -L1086: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1288) -jump -L1087: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1141) -jump -L1088: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L95) -jump -L1089: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1194) -jump -L1090: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L741) -jump -L1091: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L453) -jump -L1092: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1446) -jump -L1093: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L949) -jump -L1094: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L148) -jump -L1095: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L738) -jump -L1096: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L880) -jump -L1097: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L999) -jump -L1098: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1465) -jump -L1099: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1436) -jump -L1100: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L821) -jump -L1101: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1247) -jump -L1102: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L327) -jump -L1103: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L85) -jump -L1104: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1003) -jump -L1105: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1102) -jump -L1106: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1384) -jump -L1107: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L88) -jump -L1108: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L636) -jump -L1109: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1271) -jump -L1110: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L883) -jump -L1111: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L196) -jump -L1112: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L548) -jump -L1113: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1112) -jump -L1114: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L264) -jump -L1115: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L410) -jump -L1116: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L614) -jump -L1117: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L126) -jump -L1118: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L371) -jump -L1119: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L730) -jump -L1120: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L931) -jump -L1121: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L412) -jump -L1122: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1308) -jump -L1123: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L591) -jump -L1124: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1450) -jump -L1125: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L277) -jump -L1126: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L364) -jump -L1127: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L467) -jump -L1128: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1482) -jump -L1129: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1397) -jump -L1130: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1320) -jump -L1131: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L104) -jump -L1132: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1351) -jump -L1133: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1252) -jump -L1134: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L141) -jump -L1135: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1156) -jump -L1136: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L746) -jump -L1137: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L359) -jump -L1138: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L544) -jump -L1139: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1076) -jump -L1140: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L719) -jump -L1141: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1342) -jump -L1142: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L697) -jump -L1143: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L215) -jump -L1144: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L408) -jump -L1145: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L808) -jump -L1146: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L878) -jump -L1147: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L193) -jump -L1148: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L774) -jump -L1149: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1071) -jump -L1150: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L725) -jump -L1151: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1394) -jump -L1152: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1470) -jump -L1153: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L384) -jump -L1154: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L942) -jump -L1155: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L527) -jump -L1156: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L387) -jump -L1157: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1466) -jump -L1158: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1458) -jump -L1159: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1420) -jump -L1160: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1310) -jump -L1161: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1165) -jump -L1162: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L394) -jump -L1163: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1272) -jump -L1164: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1073) -jump -L1165: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1210) -jump -L1166: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L323) -jump -L1167: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1022) -jump -L1168: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L91) -jump -L1169: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L564) -jump -L1170: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L409) -jump -L1171: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L512) -jump -L1172: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1414) -jump -L1173: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L739) -jump -L1174: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1047) -jump -L1175: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1357) -jump -L1176: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L848) -jump -L1177: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1250) -jump -L1178: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L137) -jump -L1179: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L338) -jump -L1180: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1497) -jump -L1181: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L531) -jump -L1182: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1095) -jump -L1183: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1055) -jump -L1184: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L799) -jump -L1185: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1072) -jump -L1186: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1405) -jump -L1187: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L437) -jump -L1188: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L80) -jump -L1189: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L79) -jump -L1190: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L914) -jump -L1191: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L654) -jump -L1192: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L72) -jump -L1193: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1163) -jump -L1194: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L939) -jump -L1195: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L200) -jump -L1196: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L75) -jump -L1197: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L503) -jump -L1198: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1242) -jump -L1199: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L362) -jump -L1200: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L901) -jump -L1201: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L938) -jump -L1202: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L311) -jump -L1203: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1013) -jump -L1204: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1333) -jump -L1205: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L244) -jump -L1206: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1459) -jump -L1207: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L14) -jump -L1208: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L632) -jump -L1209: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1144) -jump -L1210: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L993) -jump -L1211: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L438) -jump -L1212: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1472) -jump -L1213: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L672) -jump -L1214: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1119) -jump -L1215: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L665) -jump -L1216: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1359) -jump -L1217: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L886) -jump -L1218: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L547) -jump -L1219: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1291) -jump -L1220: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1130) -jump -L1221: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L521) -jump -L1222: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1060) -jump -L1223: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L956) -jump -L1224: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1444) -jump -L1225: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L540) -jump -L1226: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1260) -jump -L1227: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1428) -jump -L1228: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1040) -jump -L1229: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L851) -jump -L1230: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1376) -jump -L1231: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1284) -jump -L1232: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L844) -jump -L1233: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L290) -jump -L1234: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L318) -jump -L1235: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1062) -jump -L1236: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L219) -jump -L1237: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L777) -jump -L1238: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L802) -jump -L1239: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1464) -jump -L1240: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L113) -jump -L1241: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L93) -jump -L1242: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L771) -jump -L1243: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1368) -jump -L1244: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1135) -jump -L1245: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1335) -jump -L1246: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L261) -jump -L1247: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1034) -jump -L1248: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1160) -jump -L1249: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L837) -jump -L1250: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L612) -jump -L1251: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L551) -jump -L1252: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L642) -jump -L1253: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1305) -jump -L1254: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L143) -jump -L1255: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L147) -jump -L1256: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L969) -jump -L1257: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L268) -jump -L1258: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L773) -jump -L1259: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L573) -jump -L1260: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1093) -jump -L1261: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L506) -jump -L1262: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L315) -jump -L1263: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L727) -jump -L1264: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1162) -jump -L1265: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1447) -jump -L1266: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L557) -jump -L1267: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L525) -jump -L1268: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L107) -jump -L1269: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L686) -jump -L1270: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L485) -jump -L1271: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L668) -jump -L1272: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L43) -jump -L1273: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L355) -jump -L1274: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L996) -jump -L1275: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L608) -jump -L1276: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L252) -jump -L1277: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L38) -jump -L1278: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1004) -jump -L1279: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1316) -jump -L1280: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L972) -jump -L1281: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L427) -jump -L1282: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L988) -jump -L1283: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1439) -jump -L1284: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L431) -jump -L1285: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L890) -jump -L1286: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1393) -jump -L1287: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L26) -jump -L1288: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1448) -jump -L1289: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1438) -jump -L1290: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L526) -jump -L1291: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L430) -jump -L1292: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L666) -jump -L1293: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L705) -jump -L1294: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L56) -jump -L1295: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1116) -jump -L1296: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L3) -jump -L1297: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L835) -jump -L1298: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1429) -jump -L1299: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1226) -jump -L1300: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L709) -jump -L1301: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L691) -jump -L1302: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1358) -jump -L1303: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1208) -jump -L1304: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L536) -jump -L1305: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L46) -jump -L1306: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L2) -jump -L1307: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L898) -jump -L1308: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1084) -jump -L1309: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1118) -jump -L1310: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1311) -jump -L1311: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1023) -jump -L1312: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L740) -jump -L1313: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L366) -jump -L1314: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1222) -jump -L1315: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L714) -jump -L1316: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L115) -jump -L1317: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L998) -jump -L1318: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1468) -jump -L1319: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1101) -jump -L1320: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L959) -jump -L1321: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1477) -jump -L1322: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1110) -jump -L1323: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L161) -jump -L1324: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L607) -jump -L1325: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L456) -jump -L1326: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1328) -jump -L1327: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L784) -jump -L1328: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1424) -jump -L1329: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L946) -jump -L1330: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1427) -jump -L1331: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L945) -jump -L1332: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L561) -jump -L1333: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L392) -jump -L1334: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1188) -jump -L1335: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L577) -jump -L1336: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L532) -jump -L1337: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L990) -jump -L1338: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1220) -jump -L1339: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1161) -jump -L1340: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L285) -jump -L1341: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L125) -jump -L1342: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L806) -jump -L1343: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L382) -jump -L1344: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L370) -jump -L1345: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L751) -jump -L1346: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L867) -jump -L1347: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L617) -jump -L1348: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L223) -jump -L1349: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L28) -jump -L1350: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L790) -jump -L1351: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1030) -jump -L1352: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L667) -jump -L1353: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L671) -jump -L1354: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1215) -jump -L1355: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L160) -jump -L1356: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L363) -jump -L1357: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L757) -jump -L1358: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L94) -jump -L1359: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L794) -jump -L1360: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L179) -jump -L1361: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L477) -jump -L1362: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L368) -jump -L1363: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1463) -jump -L1364: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L783) -jump -L1365: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L676) -jump -L1366: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L396) -jump -L1367: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L582) -jump -L1368: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L404) -jump -L1369: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L255) -jump -L1370: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L300) -jump -L1371: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1221) -jump -L1372: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1416) -jump -L1373: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1483) -jump -L1374: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L233) -jump -L1375: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L402) -jump -L1376: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L380) -jump -L1377: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L422) -jump -L1378: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1499) -jump -L1379: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L11) -jump -L1380: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L781) -jump -L1381: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1038) -jump -L1382: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L361) -jump -L1383: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L704) -jump -L1384: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L575) -jump -L1385: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L449) -jump -L1386: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1276) -jump -L1387: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1085) -jump -L1388: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1105) -jump -L1389: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L910) -jump -L1390: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1186) -jump -L1391: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L76) -jump -L1392: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1399) -jump -L1393: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L588) -jump -L1394: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L882) -jump -L1395: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L436) -jump -L1396: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L769) -jump -L1397: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1487) -jump -L1398: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L45) -jump -L1399: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1442) -jump -L1400: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L615) -jump -L1401: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L982) -jump -L1402: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L44) -jump -L1403: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L111) -jump -L1404: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L497) -jump -L1405: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1068) -jump -L1406: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1031) -jump -L1407: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L712) -jump -L1408: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1295) -jump -L1409: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L272) -jump -L1410: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L971) -jump -L1411: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L305) -jump -L1412: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L322) -jump -L1413: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1228) -jump -L1414: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1317) -jump -L1415: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L314) -jump -L1416: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1021) -jump -L1417: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L68) -jump -L1418: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L450) -jump -L1419: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L679) -jump -L1420: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1155) -jump -L1421: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L102) -jump -L1422: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L138) -jump -L1423: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L553) -jump -L1424: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L766) -jump -L1425: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L977) -jump -L1426: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L660) -jump -L1427: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L259) -jump -L1428: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L752) -jump -L1429: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1199) -jump -L1430: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1299) -jump -L1431: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L484) -jump -L1432: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L263) -jump -L1433: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L445) -jump -L1434: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1373) -jump -L1435: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1259) -jump -L1436: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1417) -jump -L1437: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L535) -jump -L1438: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1045) -jump -L1439: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L633) -jump -L1440: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L357) -jump -L1441: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L745) -jump -L1442: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L257) -jump -L1443: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1329) -jump -L1444: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L510) -jump -L1445: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L841) -jump -L1446: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L545) -jump -L1447: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L486) -jump -L1448: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L928) -jump -L1449: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L226) -jump -L1450: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L114) -jump -L1451: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1475) -jump -L1452: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1216) -jump -L1453: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L921) -jump -L1454: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L734) -jump -L1455: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1006) -jump -L1456: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1176) -jump -L1457: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L62) -jump -L1458: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L15) -jump -L1459: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1079) -jump -L1460: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L912) -jump -L1461: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1374) -jump -L1462: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L12) -jump -L1463: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L911) -jump -L1464: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1330) -jump -L1465: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L876) -jump -L1466: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L118) -jump -L1467: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L185) -jump -L1468: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L164) -jump -L1469: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1094) -jump -L1470: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L603) -jump -L1471: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L472) -jump -L1472: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L578) -jump -L1473: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L791) -jump -L1474: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1069) -jump -L1475: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1218) -jump -L1476: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1425) -jump -L1477: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L237) -jump -L1478: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L375) -jump -L1479: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L933) -jump -L1480: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1312) -jump -L1481: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L108) -jump -L1482: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L609) -jump -L1483: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L239) -jump -L1484: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L789) -jump -L1485: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1240) -jump -L1486: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L905) -jump -L1487: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1352) -jump -L1488: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L249) -jump -L1489: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L488) -jump -L1490: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L604) -jump -L1491: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L90) -jump -L1492: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1234) -jump -L1493: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L465) -jump -L1494: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L595) -jump -L1495: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1183) -jump -L1496: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L748) -jump -L1497: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L1061) -jump -L1498: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L493) -jump -L1499: -jumpdest -%push(1) -swap1 -sub -dup1 -iszero -%push(done) -jumpi -%push(L649) -jump -done: -jumpdest -%push(0) -%push(0) -return diff --git a/tools/contracts/benchmarks/memfest_linear.bin b/tools/contracts/benchmarks/memfest_linear.bin deleted file mode 100644 index 3075bd355..000000000 --- a/tools/contracts/benchmarks/memfest_linear.bin +++ /dev/null @@ -1 +0,0 @@ -604880600b6000396000f3602060020a6001600162989680600060005b828211602b57840283018590068083068260010192526011565b6298968060005b5190600190038015604257906032565b60006000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/memfest_linear.eas b/tools/contracts/benchmarks/memfest_linear.eas deleted file mode 100644 index a70aea8bf..000000000 --- a/tools/contracts/benchmarks/memfest_linear.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that thrashes memory, linear variant. - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("memfest_linear_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/memfest_linear_body.eas b/tools/contracts/benchmarks/memfest_linear_body.eas deleted file mode 100644 index 321f04ade..000000000 --- a/tools/contracts/benchmarks/memfest_linear_body.eas +++ /dev/null @@ -1,90 +0,0 @@ -## initialize memory slots linearly - -## RNG parameters for linear traversal -## M = 2^32, a = 1, c = 1 -## X_{n+1} = a * X_n + c mod M -%push(32) -%push(2) -exp -%push(1) -%push(1) - -## 10M slots = 320MB -%push(10000000) - -## initial slot -%push(0) - -## rng seed (X_0) -%push(0) - -init_loop: -jumpdest - -# ... M | a | c | 10M | slot | X_n - -dup3 -dup3 -gt -%push(init_fini) -jumpi - -# loop iteration: store X_{n+1} to current slot -dup5 # ... M | a | c | 10M | slot | X_n | a -mul # ... M | a | c | 10M | slot | X_n * a -dup4 # ... M | a | c | 10M | slot | X_n * a | c -add # ... M | a | c | 10M | slot | X_n * a + c -dup6 # ... M | a | c | 10M | slot | X_n * a + c | M -swap1 -mod # ... M | a | c | 10M | slot | X_{n+1} -dup1 # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} -dup4 # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} | 10M -mod # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} mod 10M = next-slot -dup3 # ... slot | X_{n+1} | next-slot | slot -%push(1) -add # ... slot | X_{n+1} | next-slot | slot+1 -swap3 # ... slot+1 | X_{n+1} | next-slot | slot -mstore - -%push(init_loop) -jump - -# finish: last point to first -init_fini: -jumpdest - -# Unfortunately we need to have this copied verbatim, eas generates a bad jump if we include this -# from a separate file.... sigh - -# 10M mloads -%push(10000000) - -# initial slot -%push(0) - -loop: -jumpdest - -# load the current slot to follow -mload # ... iters | next-slot - -# check the iteration count -swap1 # ... next-slot | iters -%push(1) -swap1 # ... next-slot | 1 | iters -sub # ... next-slot | iters-1 -dup1 # ... next-slot | iters-1 | iters-1 -iszero -%push(done) -jumpi - -# loop -swap1 # ... iters-1 | next-slot -%push(loop) -jump - -done: -jumpdest -%push(0) -%push(0) -return diff --git a/tools/contracts/benchmarks/memfest_random.bin b/tools/contracts/benchmarks/memfest_random.bin deleted file mode 100644 index afb423191..000000000 --- a/tools/contracts/benchmarks/memfest_random.bin +++ /dev/null @@ -1 +0,0 @@ -604e80600b6000396000f3602060020a6219660d633c6ef35f629896806000617ae35b828211603157840283018590068083068260010192526017565b6298968060005b5190600190038015604857906038565b60006000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/memfest_random.eas b/tools/contracts/benchmarks/memfest_random.eas deleted file mode 100644 index 23450881e..000000000 --- a/tools/contracts/benchmarks/memfest_random.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that thrashes memory, random variant - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("memfest_random_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/memfest_random_body.eas b/tools/contracts/benchmarks/memfest_random_body.eas deleted file mode 100644 index d59347de8..000000000 --- a/tools/contracts/benchmarks/memfest_random_body.eas +++ /dev/null @@ -1,90 +0,0 @@ -## initialize memory slots with random xrefs using a simple linear congruential rng - -## RNG parameters from Numerical Recipes -## M = 2^32, a = 1664525, c = 1013904223 -## X_{n+1} = a * X_n + c mod M -%push(32) -%push(2) -exp -%push(1664525) -%push(1013904223) - -## 10M slots = 320MB -%push(10000000) - -## initial slot -%push(0) - -## rng seed (X_0) -%push(31459) - -init_loop: -jumpdest - -# ... M | a | c | 10M | slot | X_n - -dup3 -dup3 -gt -%push(init_fini) -jumpi - -# loop iteration: store X_{n+1} to current slot -dup5 # ... M | a | c | 10M | slot | X_n | a -mul # ... M | a | c | 10M | slot | X_n * a -dup4 # ... M | a | c | 10M | slot | X_n * a | c -add # ... M | a | c | 10M | slot | X_n * a + c -dup6 # ... M | a | c | 10M | slot | X_n * a + c | M -swap1 -mod # ... M | a | c | 10M | slot | X_{n+1} -dup1 # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} -dup4 # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} | 10M -mod # ... M | a | c | 10M | slot | X_{n+1} | X_{n+1} mod 10M = next-slot -dup3 # ... slot | X_{n+1} | next-slot | slot -%push(1) -add # ... slot | X_{n+1} | next-slot | slot+1 -swap3 # ... slot+1 | X_{n+1} | next-slot | slot -mstore - -%push(init_loop) -jump - -# finish -init_fini: -jumpdest - -# Unfortunately we need to have this copied verbatim, eas generates a bad jump if we include this -# from a separate file.... sigh - -# 10M mloads -%push(10000000) - -# initial slot -%push(0) - -loop: -jumpdest - -# load the current slot to follow -mload # ... iters | next-slot - -# check the iteration count -swap1 # ... next-slot | iters -%push(1) -swap1 # ... next-slot | 1 | iters -sub # ... next-slot | iters-1 -dup1 # ... next-slot | iters-1 | iters-1 -iszero -%push(done) -jumpi - -# loop -swap1 # ... iters-1 | next-slot -%push(loop) -jump - -done: -jumpdest -%push(0) -%push(0) -return diff --git a/tools/contracts/benchmarks/pushfest.bin b/tools/contracts/benchmarks/pushfest.bin deleted file mode 100644 index 6f2b03127..000000000 --- a/tools/contracts/benchmarks/pushfest.bin +++ /dev/null @@ -1 +0,0 @@ -605180600b6000396000f36103e860005b6011016110110162100111016310000111016410000000110165100000000011016610000000000011016710000000000000110160018203809250156048576005565b60005260206000f3 \ No newline at end of file diff --git a/tools/contracts/benchmarks/pushfest.eas b/tools/contracts/benchmarks/pushfest.eas deleted file mode 100644 index 6f1fd6085..000000000 --- a/tools/contracts/benchmarks/pushfest.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that does a lot of pushes and additions - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("pushfest_body.eas") -body_end: diff --git a/tools/contracts/benchmarks/pushfest_body.eas b/tools/contracts/benchmarks/pushfest_body.eas deleted file mode 100644 index 92e9154bf..000000000 --- a/tools/contracts/benchmarks/pushfest_body.eas +++ /dev/null @@ -1,58 +0,0 @@ -## iterations of the loop -%push(1000) - -## initial value -push1 0x00 - -loop: -jumpdest - -%push(0x11) -add -%push(0x1011) -add -%push(0x100111) -add -%push(0x10000111) -add -%push(0x1000000011) -add -%push(0x100000000011) -add -%push(0x10000000000011) -add -%push(0x1000000000000011) -add - -## ... iter | value -push1 0x01 -## ... iter | value | 1 -dup3 -## ... iter | value | 1 | iter -sub -## ... iter | value | iter-1 -dup1 -## ... iter | value | iter-1 | iter-1 -swap3 -## ... iter-1 | value | iter-1 | iter -pop -## ... iter-1 | value | iter-1 - -## iter -1 == 0 -> jump done -iszero -%push(done) -jumpi - -%push(loop) -jump - -# return the final value -done: -jumpdest - -# ... value -push1 0x00 -mstore -push1 0x20 -push1 0x00 -return diff --git a/tools/contracts/gas-stress/README.md b/tools/contracts/gas-stress/README.md deleted file mode 100644 index 88859b579..000000000 --- a/tools/contracts/gas-stress/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Contracts for stressing the system - -These contracts do not terminate; instead they intend to run "for-ever" -- until they run -out of gus. -The contracts all runnable in fvm-bench with no arguments. -They must exit with an Out Of Gas error; any other exit is inadmissible. - -Example: -``` -$ ../../../target/release/fvm-bench -b ../../../../builtin-actors/output/builtin-actors.car counter.bin "" "" -ERROR: contract execution failed - -Caused by: - contract invocation failed: 7 -- Some(MessageBacktrace(Backtrace { frames: [Frame { source: 101, method: 3844450837, code: ExitCode { value: 7 }, message: "out of gas" }], cause: None })) -``` diff --git a/tools/contracts/gas-stress/counter.bin b/tools/contracts/gas-stress/counter.bin deleted file mode 100644 index 7f1267d41..000000000 --- a/tools/contracts/gas-stress/counter.bin +++ /dev/null @@ -1 +0,0 @@ -600980600b6000396000f360005b600101600256 \ No newline at end of file diff --git a/tools/contracts/gas-stress/counter.eas b/tools/contracts/gas-stress/counter.eas deleted file mode 100644 index 851de74e1..000000000 --- a/tools/contracts/gas-stress/counter.eas +++ /dev/null @@ -1,14 +0,0 @@ -## this is a simple contract that infinitely increments a counter - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("counter_body.eas") -body_end: diff --git a/tools/contracts/gas-stress/counter_body.eas b/tools/contracts/gas-stress/counter_body.eas deleted file mode 100644 index 0bfb4d146..000000000 --- a/tools/contracts/gas-stress/counter_body.eas +++ /dev/null @@ -1,8 +0,0 @@ -%push(0) - -loop: -jumpdest -%push(1) -add -%push(loop) -jump diff --git a/tools/contracts/gas-stress/easx b/tools/contracts/gas-stress/easx deleted file mode 100755 index 95106b0a6..000000000 --- a/tools/contracts/gas-stress/easx +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -compile() { - src=$1 - bin="$(basename $src .eas).bin" - echo "Assemble $src -> $bin" - eas $src | tr -d '\n' > $bin -} - -for x in $*; do - compile $x; -done diff --git a/tools/contracts/gas-stress/recursive.bin b/tools/contracts/gas-stress/recursive.bin deleted file mode 100644 index d538cbf07..000000000 --- a/tools/contracts/gas-stress/recursive.bin +++ /dev/null @@ -1 +0,0 @@ -602580600b6000396000f35b629896805a1160135760005b600101600c565b60006000600060006000305af150600056 \ No newline at end of file diff --git a/tools/contracts/gas-stress/recursive.eas b/tools/contracts/gas-stress/recursive.eas deleted file mode 100644 index 67195cd32..000000000 --- a/tools/contracts/gas-stress/recursive.eas +++ /dev/null @@ -1,15 +0,0 @@ -## this is a simple contract that infinitely recurses to itself while it has sufficient -## gas, otherwise just loops incrementing a counter. - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("recursive_body.eas") -body_end: diff --git a/tools/contracts/gas-stress/recursive_body.eas b/tools/contracts/gas-stress/recursive_body.eas deleted file mode 100644 index e9e36c508..000000000 --- a/tools/contracts/gas-stress/recursive_body.eas +++ /dev/null @@ -1,35 +0,0 @@ -main_loop: -jumpdest - -## gas check; 10M for a recursive call -%push(10000000) -gas -gt -%push(recurse) -jumpi - -## counter for the rest of gas -%push(0) -counter_loop: -jumpdest -%push(1) -add -%push(counter_loop) -jump - -recurse: -jumpdest - -%push(0) ## output -%push(0) -%push(0) ## input -%push(0) -%push(0) ## value -address ## dest -> self -gas -call -pop - -## we will run out of gas in the innermost recursion; this shouldn't be reachable. -%push(main_loop) -jump \ No newline at end of file diff --git a/tools/contracts/gas-stress/stateful.bin b/tools/contracts/gas-stress/stateful.bin deleted file mode 100644 index 26c7b73f3..000000000 --- a/tools/contracts/gas-stress/stateful.bin +++ /dev/null @@ -1 +0,0 @@ -603f80600b6000396000f35b629896805a116027575b620f42405a11601a573033146039575b600060005160010152600a565b60006000600060006000305af1506000565b60006000f3 \ No newline at end of file diff --git a/tools/contracts/gas-stress/stateful.eas b/tools/contracts/gas-stress/stateful.eas deleted file mode 100644 index e9f586b3b..000000000 --- a/tools/contracts/gas-stress/stateful.eas +++ /dev/null @@ -1,15 +0,0 @@ -## this is a stateful counter that recurses while it has enough gas, otherwise acts like an -## infinite counter - -# contract code -%push(body_end - body_begin) -dup1 -%push(body_begin) -push1 0x00 -codecopy -push1 0x00 -return - -body_begin: -%include("stateful_body.eas") -body_end: diff --git a/tools/contracts/gas-stress/stateful_body.eas b/tools/contracts/gas-stress/stateful_body.eas deleted file mode 100644 index 3f57bd11f..000000000 --- a/tools/contracts/gas-stress/stateful_body.eas +++ /dev/null @@ -1,62 +0,0 @@ -main_loop: -jumpdest - -## gas check; 10M for a recursive call -%push(10000000) -gas -gt -%push(recurse) -jumpi - -## counter for the rest of gas -## if we are in a recursive call, only do while enough gas to not bomb the whole stack -counter_loop: -jumpdest - -%push(1000000) -gas -gt -%push(counter) -jumpi - -## are we in recursive call? -address -caller -eq -%push(done) -jumpi - -counter: -jumpdest -%push(0) ## write offset -%push(0) ## read offset -mload ## read -%push(1) ## increment -add ## add -mstore ## write -%push(counter_loop) -jump - -## recursion -recurse: -jumpdest - -%push(0) ## output -%push(0) -%push(0) ## input -%push(0) -%push(0) ## value -address ## dest -> self -gas -call -pop - -## we will run out of gas in the innermost recursion; this shouldn't be reachable. -%push(main_loop) -jump - -done: -jumpdest -%push(0) -%push(0) -return diff --git a/tools/fvm-bench/.gitignore b/tools/fvm-bench/.gitignore deleted file mode 100644 index 22d351634..000000000 --- a/tools/fvm-bench/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - - -# Added by cargo - -/target diff --git a/tools/fvm-bench/Cargo.toml b/tools/fvm-bench/Cargo.toml deleted file mode 100644 index 9c122c6df..000000000 --- a/tools/fvm-bench/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "fvm-bench" -version = "0.1.0" -edition.workspace = true -publish = false - -[dependencies] -fvm = { workspace = true } -fvm_integration_tests = { workspace = true } -fvm_ipld_encoding = { version = "0.4" } -fvm_shared = { workspace = true } -anyhow = "1.0.71" -clap = { version = "4.3.9", features = ["derive", "std", "help", "usage", "error-context"], default-features = false } -hex = "0.4.3" -env_logger = "0.11.5" diff --git a/tools/fvm-bench/LICENSE b/tools/fvm-bench/LICENSE deleted file mode 100644 index d7a554dc2..000000000 --- a/tools/fvm-bench/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022, 2023 Protocol Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/tools/fvm-bench/README.md b/tools/fvm-bench/README.md deleted file mode 100644 index 5c745e4f0..000000000 --- a/tools/fvm-bench/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# fvm-bench -Tools for testing and benchmarking FVM - -## Status - -Currently this is a program called `fvm-bench`, which allows you to execute and gas-benchmark -fevm contracts. - -This is a barebones MVP, but it is the only program we have that can execute evm contracts with fvm. - -Usage: -``` -Run a contract invocation for benchmarking purposes - -Usage: fvm-bench [OPTIONS] --bundle - -Arguments: - Contract file - Invocation method; solidity entry point for fevm, actor method for wasm - Invocation parameters, in hex - -Options: - -m, --mode Execution mode: wasm or fevm [default: fevm] - -d, --debug Emit debug logs - -t, --trace Emit detailed gas tracing information - -e, --events Emit user generated logs - -b, --bundle Builtin actors bundle to use - -g, --gas-limit Gas limit in atto precision to use during invocation. Default: 10 billion gas [default: 10000000000] - -h, --help Print help -``` - -Example invocations: -``` -$ ../../target/release/fvm-bench -b ~/src/fvm/builtin-actors/output/builtin-actors.car ../contracts/benchmarks/empty.bin "" "" -Result: -Gas Used: 1364997 - -$ ../../target/release/fvm-bench -b ~/src/fvm/builtin-actors/output/builtin-actors.car ../contracts/benchmarks/SimpleCoin.bin f8b2cb4f 000000000000000000000000ff00000000000000000000000000000000000064 -Result: 0000000000000000000000000000000000000000000000000000000000002710 -Gas Used: 1764645 -``` diff --git a/tools/fvm-bench/src/fevm.rs b/tools/fvm-bench/src/fevm.rs deleted file mode 100644 index 7be7c2cc2..000000000 --- a/tools/fvm-bench/src/fevm.rs +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT - -use anyhow::anyhow; -use fvm::executor::ApplyRet; -use fvm_integration_tests::{tester, testkit}; -use fvm_ipld_encoding::BytesDe; -use fvm_shared::address::Address; - -// Eth ABI (solidity) panic codes. -const PANIC_ERROR_CODES: [(u64, &str); 10] = [ - (0x00, "Panic()"), - (0x01, "Assert()"), - (0x11, "ArithmeticOverflow()"), - (0x12, "DivideByZero()"), - (0x21, "InvalidEnumVariant()"), - (0x22, "InvalidStorageArray()"), - (0x31, "PopEmptyArray()"), - (0x32, "ArrayIndexOutOfBounds()"), - (0x41, "OutOfMemory()"), - (0x51, "CalledUninitializedFunction()"), -]; - -// Function Selectors -const ERROR_FUNCTION_SELECTOR: &[u8] = b"\x08\xc3\x79\xa0"; // Error(string) -const PANIC_FUNCTION_SELECTOR: &[u8] = b"\x4e\x48\x7b\x71"; // Panic(uint256) - -fn handle_result(tester: &tester::BasicTester, name: &str, res: &ApplyRet) -> anyhow::Result<()> { - let (trace, events) = tester - .options - .as_ref() - .map(|o| (o.trace, o.events)) - .unwrap_or_default(); - - if trace && !res.exec_trace.is_empty() { - println!(); - println!("**"); - println!("* BEGIN {name} execution trace"); - println!("**"); - println!(); - for tr in &res.exec_trace { - println!("{:?}", tr) - } - println!(); - println!("**"); - println!("* END {name} execution trace"); - println!("**"); - println!(); - } - if events && !res.events.is_empty() { - println!(); - println!("**"); - println!("* BEGIN {name} events"); - println!("**"); - println!(); - for evt in &res.events { - println!("{:?}", evt) - } - println!(); - println!("**"); - println!("* END {name} events"); - println!("**"); - println!(); - } - - if let Some(bt) = &res.failure_info { - println!("{bt}"); - } - - if res.msg_receipt.exit_code.is_success() { - Ok(()) - } else { - if res.msg_receipt.exit_code == 33.into() { - let BytesDe(returnval) = res.msg_receipt.return_data.deserialize().unwrap(); - println!("Revert Reason: {}", parse_eth_revert(&returnval).unwrap()); - } - Err(anyhow!("{name} failed")) - } -} - -pub fn run( - tester: &mut tester::BasicTester, - contract: &[u8], - entrypoint: &[u8], - params: &[u8], - gas: u64, -) -> anyhow::Result<()> { - let mut account = tester.create_basic_account()?; - - let create_res = testkit::fevm::create_contract(tester, &mut account, contract)?; - handle_result(tester, "contract creation", &create_res)?; - - let create_return: testkit::fevm::CreateReturn = - create_res.msg_receipt.return_data.deserialize().unwrap(); - let actor = Address::new_id(create_return.actor_id); - - // invoke contract - let mut input_data = Vec::from(entrypoint); - let mut input_params = Vec::from(params); - input_data.append(&mut input_params); - - let invoke_res = testkit::fevm::invoke_contract(tester, &mut account, actor, &input_data, gas)?; - let BytesDe(returnval) = invoke_res.msg_receipt.return_data.deserialize().unwrap(); - println!("Exit Code: {}", invoke_res.msg_receipt.exit_code); - println!("Result: {}", hex::encode(returnval)); - println!("Gas Used: {}", invoke_res.msg_receipt.gas_used); - - handle_result(tester, "contract invocation", &invoke_res) -} - -// Parses the error message from a revert reason of type Error(string) or Panic(uint256) -// See https://docs.soliditylang.org/en/latest/control-structures.html#panic-via-assert-and-error-via-require -pub fn parse_eth_revert(returnval: &Vec) -> anyhow::Result { - if returnval.is_empty() { - return Err(anyhow!("invalid return value")); - } - if returnval.len() < 4 + 32 { - return Ok(hex::encode(returnval)); - } - match &returnval[0..4] { - PANIC_FUNCTION_SELECTOR => { - let cbytes = &returnval[4..]; - match bytes_to_u64(&cbytes[..32]) { - Ok(panic_code) => { - let error = panic_error_codes(panic_code); - match error { - Some(s) => return Ok(format!("Panic Code: {}, msg: {}", s.0, s.1)), - None => return Err(anyhow!("Returned with panic code({})", panic_code)), - } - } - Err(_) => { - return Ok(hex::encode(returnval)); - } - } - } - ERROR_FUNCTION_SELECTOR => { - let cbytes = &returnval[4..]; - let cbytes_len = cbytes.len() as u64; - if let Ok(offset) = bytes_to_u64(&cbytes[0..32]) { - if cbytes_len >= offset + 32 { - if let Ok(length) = bytes_to_u64(&cbytes[offset as usize..offset as usize + 32]) - { - if cbytes_len >= offset + 32 + length { - let msg = String::from_utf8_lossy( - &cbytes - [offset as usize + 32..offset as usize + 32 + length as usize], - ); - return Ok(msg.to_string()); - } - } - } - } - } - _ => return Ok(hex::encode(returnval)), - }; - Ok(hex::encode(returnval)) -} - -// Converts a byte slice to a u64 -fn bytes_to_u64(bytes: &[u8]) -> Result { - if bytes.len() != 32 { - return Err(anyhow::anyhow!("Invalid byte slice length")); - } - let mut buf = [0u8; 8]; - buf.copy_from_slice(&bytes[24..32]); - Ok(u64::from_be_bytes(buf)) -} - -// Returns the panic code and message for a given panic code -fn panic_error_codes(code: u64) -> Option<&'static (u64, &'static str)> { - PANIC_ERROR_CODES.iter().find(|(c, _)| *c == code) -} - -////////////////////// -/////// Tests /////// -///////////////////// - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parse_eth_revert_empty_returnval() { - let returnval = vec![]; - let result = parse_eth_revert(&returnval); - assert!(result.is_err()); - assert_eq!(result.unwrap_err().to_string(), "invalid return value"); - } - - #[test] - fn test_parse_eth_revert_short_returnval() { - let returnval = vec![0x01, 0x02, 0x03]; - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), "010203"); - } - - #[test] - fn test_parse_eth_revert_panic_function_selector() { - let returnval = vec![ - 0x4e, 0x48, 0x7b, 0x71, // function selector for "Panic(uint256)" - 0x00, 0x00, 0x00, 0x00, - ]; - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), "4e487b7100000000"); - } - - #[test] - fn test_parse_eth_revert_panic_function_selector_with_message() { - // assert error from simplecoin contract - let returnval = - hex::decode("4e487b710000000000000000000000000000000000000000000000000000000000000001") - .unwrap(); - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), "Panic Code: 1, msg: Assert()"); - } - - #[test] - fn test_parse_eth_revert_error_function_selector() { - // "Less Than ten" error from simplecoin contract - let returnval = hex::decode("08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d4c657373205468616e2074656e00000000000000000000000000000000000000").unwrap(); - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), "Less Than ten"); - } - - #[test] - fn test_parse_eth_revert_error_function_selector_invalid_data() { - // invalid data for error function selector - let returnval = hex::decode("08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000").unwrap(); - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), hex::encode(&returnval)); - } - - #[test] - fn test_parse_eth_revert_custom_error() { - // any other data like custom error, etc. "lessThanFive" custom error of simplecoin contract in this case. - let returnval = hex::decode("4426661100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e4c657373207468616e2066697665000000000000000000000000000000000000").unwrap(); - let result = parse_eth_revert(&returnval); - assert!(result.is_ok()); - assert_eq!(result.unwrap(), hex::encode(&returnval)); - } -} diff --git a/tools/fvm-bench/src/main.rs b/tools/fvm-bench/src/main.rs deleted file mode 100644 index 584436d60..000000000 --- a/tools/fvm-bench/src/main.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2021-2023 Protocol Labs -// SPDX-License-Identifier: Apache-2.0, MIT - -mod fevm; - -use std::fs; - -use anyhow::{anyhow, Context}; -use clap::Parser; -use fvm_integration_tests::tester; - -/// Run a contract invocation for benchmarking purposes -#[derive(Parser, Debug)] -struct Args { - /// Execution mode: wasm or fevm - #[arg(short, long, default_value = "fevm")] - mode: String, - - /// Emit debug logs - #[arg(short, long, default_value = "false")] - debug: bool, - - /// Emit detailed gas tracing information - #[arg(short, long, default_value = "false")] - trace: bool, - - /// Emit user generated logs - #[arg(short, long, default_value = "false")] - events: bool, - - /// Builtin actors bundle to use. - #[arg(short, long)] - bundle: String, - - /// Contract file. - contract: String, - - /// Invocation method; solidity entry point for fevm, actor method for wasm. - method: String, - - /// Invocation parameters, in hex. - params: String, - - #[arg(short, long, default_value = "10000000000")] - /// Gas limit in atto precision to use during invocation. - /// Default: 10 billion gas - gas_limit: u64, -} - -fn run() -> anyhow::Result<()> { - env_logger::init(); - let args = Args::parse(); - let options = tester::ExecutionOptions { - debug: args.debug, - trace: args.trace, - events: args.events, - }; - let mut tester = tester::BasicTester::new_basic_tester(args.bundle, options)?; - - match args.mode.as_str() { - "fevm" => { - let contract_hex = - fs::read_to_string(args.contract).context("error reading contract")?; - let contract = hex::decode(contract_hex).context("error decoding contract")?; - let entrypoint = - hex::decode(args.method).context("error decoding contract entrypoint")?; - let params = hex::decode(args.params).context("error decoding contract params")?; - - fevm::run(&mut tester, &contract, &entrypoint, ¶ms, args.gas_limit) - .context("contract execution failed") - } - - "wasm" => Err(anyhow!("wasm actors not supported yet")), - _ => Err(anyhow!("unknown mode {}", args.mode)), - } -} - -fn main() { - if let Err(e) = run() { - eprintln!("ERROR: {:?}", e); - std::process::exit(1); - } -} diff --git a/tools/solidity-tests/README.md b/tools/solidity-tests/README.md deleted file mode 100644 index a97886e9e..000000000 --- a/tools/solidity-tests/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Alex Wade's Solidity Tests -This directory includes a test suite, developed by Alex Wade, using fvm-bench. - -## Running Solidity Tests - -### Install - -* solc-js: `npm i solc` -* foundry-rs: https://book.getfoundry.sh/getting-started/installation - -### Run Tests - -* `chmod a+x ./script.sh` - -... then `./script.sh` will run tests! - -### What this looks like - -In order, `./script.sh` does this: - -0. Clear the `/contracts-output` folder -1. Compile all `.sol` files located in the `/tests` folder, placing the results in `contracts-output` -2. For each compiled `/tests/*.sol` file, run `fvm-bench` and call the `run()` method on the target. Pass in empty calldata. -3. Parse output using `cast` (a tool in foundry-rs). Errors from failing tests are printed to the console. - -Example output: -``` -$ ./script.sh -Compiling ./tests/TestEVMPrecompiles.sol -Compiling ./tests/TestFilPrecompiles.sol -Compiling ./tests/TestLifecycle.sol -Testing contracts... - -Test results for ./contracts-output/tests_TestEVMPrecompiles_sol_TestEVMPrecompiles.bin: -========== -Gas Used: 9156564 -1 out of 1 tests passing. -========== - -Test results for ./contracts-output/tests_TestFilPrecompiles_sol_TestFilPrecompiles.bin: -========== -Gas Used: 70394037 -2 out of 3 tests passing. Failures: -Test 2 (test__ActorType) failed with: builtin singleton should be system type -- expected 0 == 1 -========== - -Test results for ./contracts-output/tests_TestLifecycle_sol_TestLifecycle.bin: -========== -Gas Used: 105440457 -3 out of 4 tests passing. Failures: -Test 2 (test__Create_Selfdestruct) failed with: should have no codesize after selfdestruct -- got nonzero value: 420 -========== - -``` - -### How to add a test - -Tests are located in the `/tests` folder. Each test contract defines the same entry point - the `run` method. Example: - -```solidity -function run() public returns (string[] memory results) { - return Test.getRunner() - .addM(this.test__Create_Codesize.named("test__Create_Codesize")) - .addP(this.test__Create_Ctx.named("test__Create_Ctx")) - .addV(this.test__Create_Rdonly.named("test__Create_Rdonly")) - .run(); -} -``` - -Within the `run` method, we use the `Test` library (`./libraries/Test.sol`) to set up and run tests. As shown in the example above, tests can be added to the `TestRunner` returned by `Test.getRunner()`. Adding tests in this way places them in contract storage until they're ready to be run - which we do at the end using `.run()`. - -We can select whether the tests are called using `STATICCALL`, `CALL`, or `CALL` with value by using: -* `.addV` -> "add view," adds a `view` test that will be called with `STATICCALL` -* `.addM` -> "add mut," adds a test that will be called with `CALL` -* `.addP` -> "add payable," adds a test that will be called with `CALL` and sent some Fil. - -Tests are defined like this: - -```solidity -// Test resolve_address -> lookup_delegated_address roundtrip -function test__ResolveRoundtrip() external view { - (bool success, uint64 id) = address(this).getActorID(); - Test.expect("resolve_address reverted or returned empty").success(success); - Test.expect("resolved actor id should be valid").gte(id, 100); - - address ethAddress; - (success, ethAddress) = id.getEthAddress(); - Test.expect("lookup_delegated_address reverted or returned empty").success(success); - Test.expect("did not roundtrip").eq(ethAddress, address(this)); -} -``` - -The `Test.expect` method attaches nicely-formatted error messages to assertions. Generally, the syntax is: -* `Test.expect("error message here").gt(1, 5);` - -... Which asserts that `1 > 5`, and fails the test with an error message using `REVERT`. This message is caught by the `TestRunner`, and printed out after all tests are run. - -There are multiple assertions available in the `Test` library, and it's pretty easy to add more if there's an assertion you need. - -**Remember:** Every time you add a test function to a contract, you must also add it to the `TestRunner` or it will not be run! diff --git a/tools/solidity-tests/libraries/EVMUtils.sol b/tools/solidity-tests/libraries/EVMUtils.sol deleted file mode 100644 index 4d6bbd83f..000000000 --- a/tools/solidity-tests/libraries/EVMUtils.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "./FilUtils.sol"; - -library EVMUtils { - // EVM Precompiles - address constant ECRECOVER = 0x0000000000000000000000000000000000000001; - address constant SHA2 = 0x0000000000000000000000000000000000000002; - address constant RIPEMD = 0x0000000000000000000000000000000000000003; - address constant IDENTITY = 0x0000000000000000000000000000000000000004; - address constant MODEXP = 0x0000000000000000000000000000000000000005; - address constant ECADD = 0x0000000000000000000000000000000000000006; - address constant ECMUL = 0x0000000000000000000000000000000000000007; - address constant ECPAIRING = 0x0000000000000000000000000000000000000008; - address constant BLAKE2F = 0x0000000000000000000000000000000000000009; - - function copyData(bytes memory data) internal view returns (bool success, bytes memory copy) { - // alloc copy - copy = new bytes(data.length); - assembly { - success := staticcall(gas(), IDENTITY, add(32, data), mload(data), add(32, copy), mload(copy)) - } - if (!success || FilUtils.returnSize() != data.length) { - return (false, bytes("")); - } - } - - function selfCodesize() internal pure returns (uint cs) { - assembly { cs := codesize() } - } - - function extCodesize(address a) internal view returns (uint cs) { - assembly { cs := extcodesize(a) } - } - - function selfCodehash() internal pure returns (bytes32 ch) { - assembly { - let ptr := mload(0x40) - codecopy(ptr, 0, codesize()) - ch := keccak256(ptr, codesize()) - } - } - - function extCodehash(address a) internal view returns (bytes32 ch) { - assembly { ch := extcodehash(a) } - } - - function getOwnCode() internal pure returns (bytes memory code) { - code = new bytes(selfCodesize()); - assembly { codecopy(add(32, code), 0, mload(code)) } - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/ErrLib.sol b/tools/solidity-tests/libraries/ErrLib.sol deleted file mode 100644 index 25f2c4ca2..000000000 --- a/tools/solidity-tests/libraries/ErrLib.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "./FilUtils.sol"; - -library ErrLib { - - function expect(bool condition, string memory err) internal pure { - require(condition, err); - } - - function concat(string memory strA, string memory strB) internal pure returns (string memory) { - return string.concat(strA, strB); - } - - function concat(string memory str, uint value) internal pure returns (string memory) { - return string.concat(str, toString(value)); - } - - // function concat(string memory str, uint64 value) internal pure returns (string memory) { - // return concat(str, uint(value)); - // } - - function concat(string memory str, address a) internal pure returns (string memory) { - return string.concat(str, toHexString(a)); - } - - function concat(string memory str, bytes32 b) internal pure returns (string memory) { - return string.concat(str, toHexString(b)); - } - - /** - * These methods from https://github.com/Raiden1411/LibStringUtils - */ - - function toString(uint256 value) internal pure returns (string memory str) { - assembly { - // The maximum value of a uint256 contains 78 digits (1 byte per digit), - // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aligned. - // We will need 1 32-byte word to store the length, - // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. - str := add(mload(0x40), 0x80) - // Update the free memory pointer to allocate. - mstore(0x40, str) - - // Cache the end of the memory to calculate the length later. - let end := str - - // We write the string from rightmost digit to leftmost digit. - // The following is essentially a do-while loop that also handles the zero case. - // prettier-ignore - for { let temp := value } 1 {} { - str := sub(str, 1) - // Write the character to the pointer. - // The ASCII index of the '0' character is 48. - mstore8(str, add(48, mod(temp, 10))) - // Keep dividing `temp` until zero. - temp := div(temp, 10) - // prettier-ignore - if iszero(temp) { break } - } - - let length := sub(end, str) - // Move the pointer 32 bytes leftwards to make room for the length. - str := sub(str, 0x20) - // Store the length. - mstore(str, length) - } - } - - function toHexString(bytes32 value) internal pure returns (string memory str) { - assembly { - let start := mload(0x40) - // We need 0x20 bytes for the length, 0x02 bytes for the prefix, - // and 0x40 bytes for the digits. - // The next multiple of 0x20 above (0x20 + 2 + 0x40) is 0x80. - str := add(start, 0x80) - - // Cache the end to calculate the length later. - let end := str - - // Allocate the memory. - mstore(0x40, str) - // Store "0123456789abcdef" in scratch space. - mstore(0x0f, 0x30313233343536373839616263646566) - - // We write the string from rightmost digit to leftmost digit. - // The following is essentially a do-while loop that also handles the zero case. - // prettier-ignore - for { let temp := value } 1 {} { - str := sub(str, 2) - mstore8(add(str, 1), mload(and(temp, 15))) - mstore8(str, mload(and(shr(4, temp), 15))) - temp := shr(8, temp) - // prettier-ignore - if iszero(temp) { break } - } - - // Compute the string's length. - let strLength := add(sub(end, str), 2) - // Move the pointer and write the "0x" prefix. - str := sub(str, 0x20) - mstore(str, 0x3078) - // Move the pointer and write the length. - str := sub(str, 2) - mstore(str, strLength) - } - } - - function toHexString(address value) internal pure returns (string memory str) { - assembly { - let start := mload(0x40) - // We need 32 bytes for the length, 2 bytes for the prefix, - // and 40 bytes for the digits. - // The next multiple of 32 above (32 + 2 + 40) is 96. - str := add(start, 96) - - // Allocate the memory. - mstore(0x40, str) - // Store "0123456789abcdef" in scratch space. - mstore(0x0f, 0x30313233343536373839616263646566) - - let length := 20 - // We write the string from rightmost digit to leftmost digit. - // The following is essentially a do-while loop that also handles the zero case. - // prettier-ignore - for { let temp := value } 1 {} { - str := sub(str, 2) - mstore8(add(str, 1), mload(and(temp, 15))) - mstore8(str, mload(and(shr(4, temp), 15))) - temp := shr(8, temp) - length := sub(length, 1) - // prettier-ignore - if iszero(length) { break } - } - - // Move the pointer and write the "0x" prefix. - str := sub(str, 32) - mstore(str, 0x3078) - // Move the pointer and write the length. - str := sub(str, 2) - mstore(str, 42) - } - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/FilUtils.sol b/tools/solidity-tests/libraries/FilUtils.sol deleted file mode 100644 index d9e795716..000000000 --- a/tools/solidity-tests/libraries/FilUtils.sol +++ /dev/null @@ -1,182 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -library FilUtils { - - // keccak([]) - bytes32 constant EVM_EMPTY_CODEHASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; - // keccak([0xFE]) - bytes32 constant FIL_NATIVE_CODEHASH = 0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b; - - // bytes20 constant NULL = 0x0000000000000000000000000000000000000000; - - bytes22 constant F4_ADDR_EXAMPLE = 0x040Aff00000000000000000000000000000000000001; - - // FIL BUILTIN ACTORS - address constant SYSTEM_ACTOR = 0xfF00000000000000000000000000000000000000; - address constant INIT_ACTOR = 0xff00000000000000000000000000000000000001; - address constant REWARD_ACTOR = 0xff00000000000000000000000000000000000002; - address constant CRON_ACTOR = 0xFF00000000000000000000000000000000000003; - address constant POWER_ACTOR = 0xFf00000000000000000000000000000000000004; - address constant MARKET_ACTOR = 0xff00000000000000000000000000000000000005; - address constant VERIFIED_REGISTRY_ACTOR = 0xFF00000000000000000000000000000000000006; - address constant DATACAP_TOKEN_ACTOR = 0xfF00000000000000000000000000000000000007; - address constant EAM_ACTOR = 0xfF0000000000000000000000000000000000000a; - // address constant CHAOS_ACTOR = 0xFF00000000000000000000000000000000000000; // 98 - // address constant BURNT_FUNDS_ACTOR = 0xFF00000000000000000000000000000000000000; // 99 - - // FIL Precompiles - address constant RESOLVE_ADDR = 0xFE00000000000000000000000000000000000001; - address constant LOOKUP_DELEGATED_ADDR = 0xfE00000000000000000000000000000000000002; - address constant CALL_ACTOR = 0xfe00000000000000000000000000000000000003; - // address constant GET_ACTOR_TYPE = 0xFe00000000000000000000000000000000000004; - address constant CALL_ACTOR_BY_ID = 0xfe00000000000000000000000000000000000005; - - uint64 constant MAX_RESERVED_METHOD = 1023; - bytes4 constant NATIVE_METHOD_SELECTOR = 0x868e10c4; - - uint64 constant DEFAULT_FLAG = 0x00000000; - uint64 constant READONLY_FLAG = 0x00000001; - - function callActor( - uint64 _id, - uint64 _method, - uint _value, - uint64 _codec, - bytes memory _data - ) internal returns (bool, bytes memory) { - return callHelper(false, _id, _method, _value, _codec, _data); - } - - function callActorReadonly( - uint64 _id, - uint64 _method, - uint64 _codec, - bytes memory _data - ) internal view returns (bool, bytes memory) { - function(bool, uint64, uint64, uint, uint64, bytes memory) internal view returns (bool, bytes memory) callFn; - function(bool, uint64, uint64, uint, uint64, bytes memory) internal returns (bool, bytes memory) helper = callHelper; - assembly { callFn := helper } - return callFn(true, _id, _method, 0, _codec, _data); - } - - function callHelper( - bool _readonly, - uint64 _id, - uint64 _method, - uint _value, - uint64 _codec, - bytes memory _data - ) private returns (bool, bytes memory) { - uint64 flags = _readonly ? READONLY_FLAG : DEFAULT_FLAG; - require(!_readonly || _value == 0); // sanity check - shouldn't hit this in a private method - bytes memory input = abi.encode(_method, _value, flags, _codec, _data, _id); - return CALL_ACTOR_BY_ID.delegatecall(input); - } - - /** - * Checks whether a given address is an ID address. If it is, the ID is returned. - * An ID address is defined as: - * [0xFF] [bytes11(0)] [uint64(id)] - */ - function isIDAddress(address _a) internal pure returns (bool isID, uint64 id) { - uint64 ID_MASK = type(uint64).max; - address system = SYSTEM_ACTOR; - assembly { - let id_temp := and(_a, ID_MASK) // Last 8 bytes of _a are the ID - let a_mask := and(_a, not(id_temp)) // Zero out the last 8 bytes of _a - // _a is an ID address if we zero out the last 8 bytes and it's equal to - // the SYSTEM_ACTOR addr, which is an ID address where ID is 0. - if eq(a_mask, system) { - isID := true - id := id_temp - } - } - } - - /** - * Given an Actor ID, converts it to an EVM-compatible ID address. See - * above for ID address definition. - */ - function toIDAddress(uint64 _id) internal pure returns (address addr) { - assembly { addr := or(SYSTEM_ACTOR, _id) } - } - - // function getEthAddress(uint64 _id) internal view returns (bool success, address eth) { - // bytes memory data = abi.encodePacked(_id); - // (success, data) = LOOKUP_DELEGATED_ADDR.staticcall(data); - - // // If we reverted the ID does not have a corresponding Eth address. - // if (!success) { - // return (false, address(0)); - // } - - // (success, eth) = fromF4Address(data); - // } - - /** - * Given an Actor id, queries LOOKUP_DELEGATED_ADDRESS precompile to try to convert - * it to an Eth address. If the id does not have an associated Eth address, this - * returns (false, 0x00) - */ - function getEthAddress(uint64 _id) internal view returns (bool success, address eth) { - uint160 ADDRESS_MASK = type(uint160).max; - assembly { - mstore(0, _id) - // LOOKUP_DELEGATED_ADDR returns an f4-encoded address. For Eth addresses, - // this looks like the 20-byte address, prefixed with 0x040A. - // So, our return size is 22 bytes. - success := staticcall(gas(), LOOKUP_DELEGATED_ADDR, 0, 0x20, 0x20, 22) - let result := mload(0x20) - eth := and( - shr(80, result), - ADDRESS_MASK - ) - // Sanity-check f4 prefix - should be 0x040A prepended to address - let prefix := shr(240, result) - if iszero(eq(prefix, 0x040A)) { - success := false - eth := 0 - } - } - if (!success || returnSize() != 22) { - return (false, address(0)); - } - } - - /** - * Given an Eth address, queries RESOLVE_ADDR precompile to look up the corresponding - * ID address. - * If there is no corresponding ID address, this returns (false, 0) - * If the address passed in is already an ID address, returns (true, id) - */ - function getActorID(address _eth) internal view returns (bool success, uint64 id) { - // If we were passed an ID address already, just return it - (success, id) = isIDAddress(_eth); - if (success) { - return(success, id); - } - - assembly { - // Convert EVM address to f4-encoded format: - // 22 bytes, prepended with: - // * protocol (0x04) - "f4" address - // * namespace (0x0A) - "10" for the EAM actor - _eth := or( - shl(240, 0x040A), - shl(80, _eth) - ) - mstore(0, _eth) - success := staticcall(gas(), RESOLVE_ADDR, 0, 22, 0, 0x20) - id := mload(0) - } - // If we got empty return data or the call reverted, return (false, 0) - if (!success || returnSize() == 0) { - return (false, 0); - } - } - - function returnSize() internal pure returns (uint size) { - assembly { size := returndatasize() } - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/Test.sol b/tools/solidity-tests/libraries/Test.sol deleted file mode 100644 index 5b932e2f8..000000000 --- a/tools/solidity-tests/libraries/Test.sol +++ /dev/null @@ -1,350 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "./ErrLib.sol"; - -library Test { - - using ErrLib for *; - - struct TestRunner { - TestFn[] tests; - } - - struct TestFn { - string name; - Mut mutability; - function() external test; - } - - enum Mut { - VIEW, - MUTABLE, - PAYABLE - } - - // Storing TestRunner at slot[some-hash] means test contracts - // can implement whatever storage footprint they want and there - // won't be any overwriting. - bytes32 constant STORAGE_SLOT = keccak256(bytes("test-storage-location")); - - function getRunner() internal pure returns (TestRunner storage t) { - bytes32 slot = STORAGE_SLOT; - assembly { t.slot := slot } - } - - function run(TestRunner storage tr) internal returns (string[] memory results) { - results = new string[](tr.tests.length + 1); - uint passCount; - - // Iterate over added tests and run each. Tests that revert should - // return an error message. These are tracked in the results array, - // which we return from this method. - - uint failCount = 1; - for (uint i = 0; i < tr.tests.length; i++) { - TestFn storage t = tr.tests[i]; - - // Run test. If target is payable or view, we - // cast the test function. - // view fns will be called with staticcall - // payable fns will be called with some amount of FIL - - if (t.mutability == Mut.PAYABLE) { - function() external payable payFn = toPayable(t.test); - try payFn{ value: 100 }() { - passCount++; - continue; - } catch Error(string memory reason) { - results[failCount] = getFailureString(i, t.name, reason); - } catch Panic(uint err) { - results[failCount] = getPanicString(i, t.name, err); - } catch { - results[failCount] = getUnknownErrString(i, t.name); - } - } else if (t.mutability == Mut.VIEW) { - function() external view viewFn = toView(t.test); - try viewFn() { - passCount++; - continue; - } catch Error(string memory reason) { - results[failCount] = getFailureString(i, t.name, reason); - } catch Panic(uint err) { - results[failCount] = getPanicString(i, t.name, err); - } catch { - results[failCount] = getUnknownErrString(i, t.name); - } - } else { - function() external mutFn = t.test; - try mutFn() { - passCount++; - continue; - } catch Error(string memory reason) { - results[failCount] = getFailureString(i, t.name, reason); - } catch Panic(uint err) { - results[failCount] = getPanicString(i, t.name, err); - } catch { - results[failCount] = getUnknownErrString(i, t.name); - } - } - - failCount++; - } - - results[0] = getResultsString(passCount, tr.tests.length); - - // Manually update the length of results - assembly { mstore(results, failCount) } - } - - /** - * Use these methods to add tests to the runner. - * - addV: If your test won't need any state changes (test fn is view) - * - addM: If your test will need state changes (test fn is default - mutable) - * - addP: If your test wants some Fil to play with (test fn is payable) - * - * These all return the passed-in TestRunner, so you can use this syntax: - * - testRunner.add(test1).add(test2).add(test3)... - * - * Unfortunately, a bug in solc means we can't overload a function - * accepts function types with different mutability requirements. - * So while I'd like to refactor these to be called "add" and accept - * a raw function type, we'll have to make do with "addM", "addP", and "addV" - * for mutable, payable, and view functions, respectively. Sorry. - * - * https://github.com/ethereum/solidity/issues/13879 - */ - - function addV(TestRunner storage tr, TestFn memory t) internal returns (TestRunner storage) { - t.mutability = Mut.VIEW; - tr.tests.push(t); - return tr; - } - - function addM(TestRunner storage tr, TestFn memory t) internal returns (TestRunner storage) { - t.mutability = Mut.MUTABLE; - tr.tests.push(t); - return tr; - } - - function addP(TestRunner storage tr, TestFn memory t) internal returns (TestRunner storage) { - t.mutability = Mut.PAYABLE; - tr.tests.push(t); - return tr; - } - - /** - * This method allows easy construction of TestFn structs, and should be used - * with the "add" methods above to easily add named tests to the runner. - * - * If a test fails, the name you give it will be printed to the console along - * with the error message it failed with. - * e.g. "test__Create2 failed with: expected nonzero addr" - * - * Together with the "add" methods, adding tests to the runner looks something like: - * - testRunner.addV(this.testFuncA.named("Test1")).addM(this.testFuncB.named("Test2"))... - */ - - function named(function() external fn, string memory name) internal pure returns (TestFn memory t) { - t.name = name; - t.test = fn; - } - - /** - * Conversions between function types with different mutability requirements - */ - - function toView(function() external fn) internal pure returns (function() external view viewFn) { - assembly { - viewFn.address := fn.address - viewFn.selector := fn.selector - } - } - - function toMut(function() external view viewFn) internal pure returns (function() external fn) { - assembly { - fn.address := viewFn.address - fn.selector := viewFn.selector - } - } - - function toPayable(function() external fn) internal pure returns (function() external payable payFn) { - assembly { - payFn.address := fn.address - payFn.selector := fn.selector - } - } - - function getResultsString(uint passCount, uint totalTests) internal pure returns (string memory) { - string memory result = string("\"").concat(passCount).concat(string(" out of ")).concat(totalTests); - if (passCount == totalTests) { - return result.concat(string(" tests passing.\"")); - } else { - return result.concat(string(" tests passing. Failures:\"")); - } - } - - function getFailureString(uint testNo, string memory name, string memory reason) private pure returns (string memory) { - return string("\"Test ").concat(testNo+1).concat(string(" (")).concat(name).concat(string(") failed with: ")).concat(reason).concat(string("\"")); - } - - function getPanicString(uint testNo, string memory name, uint err) private pure returns (string memory) { - return string("\"Test ").concat(testNo+1).concat(string(" (")).concat(name).concat(string(") paniced with errNo: ")).concat(err).concat(string("\"")); - } - - function getUnknownErrString(uint testNo, string memory name) private pure returns (string memory) { - return string("\"Test ").concat(testNo+1).concat(string(" (")).concat(name).concat(string(") failed with unknown error\"")); - } - - /** - * Assertions - */ - - // -- both values are: $a - string constant NEQ = " -- both values are: "; - // -- got nonzero value: $a - string constant IS_ZERO = " -- got nonzero value: "; - - // Used with separators for error messages with 2 values - string constant EXPECTED = " -- expected "; - string constant SEP_EQ = " == "; // -- expected $a == $b - string constant SEP_GT = " > "; // -- expected $a > $b - string constant SEP_GTE = " >= "; // -- expected $a >= $b - string constant SEP_LT = " < "; // -- expected $a < $b - string constant SEP_LTE = " <= "; // -- expected $a <= $b - - // bool - string constant EXPECTED_TRUE = " -- expected true, got false"; - string constant EXPECTED_FALSE = " -- expected false, got true"; - - string constant ASSERT_FAIL = " -- assertion failure: "; - - function expect(string memory str) internal pure returns (string memory) { - return str; - } - - function fail(string memory str) internal pure { - revert(ASSERT_FAIL.concat(str)); - } - - /** - * address assertions: - * - eq - * - neq - * - iszero - */ - - function eq(string memory str, address a, address b) internal pure { - if (a == b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_EQ).concat(b)); - } - - function neq(string memory str, address a, address b) internal pure { - if (a != b) return; - - revert(str.concat(NEQ).concat(a)); - } - - function iszero(string memory str, address a) internal pure { - if (a == address(0)) return; - - revert(str.concat(IS_ZERO).concat(a)); - } - - /** - * uint assertions: - * - eq - * - neq - * - iszero - * - gt - * - gte - * - lt - * - lte - */ - - function eq(string memory str, uint a, uint b) internal pure { - if (a == b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_EQ).concat(b)); - } - - function neq(string memory str, uint a, uint b) internal pure { - if (a != b) return; - - revert(str.concat(NEQ).concat(a)); - } - - function iszero(string memory str, uint a) internal pure { - if (a == uint(0)) return; - - revert(str.concat(IS_ZERO).concat(a)); - } - - function gt(string memory str, uint a, uint b) internal pure { - if (a > b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_GT).concat(b)); - } - - function gte(string memory str, uint a, uint b) internal pure { - if (a >= b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_GTE).concat(b)); - } - - function lt(string memory str, uint a, uint b) internal pure { - if (a < b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_LT).concat(b)); - } - - function lte(string memory str, uint a, uint b) internal pure { - if (a <= b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_LTE).concat(b)); - } - - /** - * bytes32 assertions: - * - eq - * - neq - * - iszero - */ - - function eq(string memory str, bytes32 a, bytes32 b) internal pure { - if (a == b) return; - - revert(str.concat(EXPECTED).concat(a).concat(SEP_EQ).concat(b)); - } - - function neq(string memory str, bytes32 a, bytes32 b) internal pure { - if (a != b) return; - - revert(str.concat(NEQ).concat(a)); - } - - function iszero(string memory str, bytes32 a) internal pure { - if (a == bytes32(0)) return; - - revert(str.concat(IS_ZERO).concat(a)); - } - - /** - * bool assertions - * - success - * - fail - */ - - function success(string memory str, bool cond) internal pure { - if (cond) return; - - revert(str.concat(EXPECTED_TRUE)); - } - - function fail(string memory str, bool cond) internal pure { - if (!cond) return; - - revert(str.concat(EXPECTED_FALSE)); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/deployable/Dummy.sol b/tools/solidity-tests/libraries/deployable/Dummy.sol deleted file mode 100644 index 75acc3727..000000000 --- a/tools/solidity-tests/libraries/deployable/Dummy.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -// No frills dummy used to test things on fresh-deployed contracts -contract Dummy { - - uint value = 100; - - event Value(uint indexed v); - - function receiveValue() public payable returns (uint) { - return msg.value; - } - - function logValue() public returns (uint) { - emit Value(value); - return value; - } - - function incrementValue() public returns (uint) { - return ++value; - } - - function getValueView() public view returns (uint) { - return value; - } - - function getValuePure() public pure returns (uint) { - return 42; - } -} - -library DummyLib { - - // Convenience method that deploys Dummy and returns it - // as an address - function newDummy() internal returns (address) { - Dummy d = new Dummy(); - return address(d); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/deployable/Lifecycle.sol b/tools/solidity-tests/libraries/deployable/Lifecycle.sol deleted file mode 100644 index 8930e1cc0..000000000 --- a/tools/solidity-tests/libraries/deployable/Lifecycle.sol +++ /dev/null @@ -1,119 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "./Dummy.sol"; -import "../FilUtils.sol"; -import "../EVMUtils.sol"; - -contract Lifecycle { - - // Record of codesize and codehash values - uint selfCodesize; - uint extCodesize; - bytes32 selfCodehash; - bytes32 extCodehash; - - // Record of call context - struct Ctx { - address self; - address origin; - address sender; - uint callValue; - uint balance; - uint selfBalance; - } - - Ctx ctx; - - constructor() payable { - updateCodeVals(); - updateCallCtxVals(); - } - - function getRecordedCodeVals() external view returns (uint, uint, bytes32, bytes32) { - return (selfCodesize, extCodesize, selfCodehash, extCodehash); - } - - function getRecordedCallCtxVals() external view returns (Ctx memory) { - return ctx; - } - - function updateCodeVals() public returns (uint, uint, bytes32, bytes32) { - selfCodesize = EVMUtils.selfCodesize(); - extCodesize = EVMUtils.extCodesize(address(this)); - selfCodehash = EVMUtils.selfCodehash(); - extCodehash = EVMUtils.extCodehash(address(this)); - return (selfCodesize, extCodesize, selfCodehash, extCodehash); - } - - function updateCallCtxVals() public payable returns (Ctx memory) { - ctx.self = address(this); - ctx.origin = tx.origin; - ctx.sender = msg.sender; - ctx.callValue = msg.value; - uint bal; - uint selfBal; - assembly { - bal := balance(address()) - selfBal := selfbalance() - } - ctx.balance = bal; - ctx.selfBalance = selfBal; - return ctx; - } -} - -contract LifecycleBlowup { - - uint value = 42; - - constructor(bool blowup) payable { - if (blowup) { - selfdestruct(payable(address(this))); - } - } - - function blowUp(address beneficiary) public { - selfdestruct(payable(beneficiary)); - } - - function blowUpAndReturn() public returns (uint) { - this.blowUp(address(this)); - return value; - } - - function blowUpMultiAndReturn() public returns (uint) { - this.blowUp(address(this)); - this.blowUp(msg.sender); - return this.getValue(); - } - - bytes32 constant SALT = bytes32("saltysaltysalt"); - - function createPrefundAndBlowUp() public returns (uint, address, address, address) { - Dummy d1 = new Dummy(); - - // Calculate address we'd deploy to if we CREATE2 a dummy - bytes32 initHash = keccak256(type(Dummy).creationCode); - address child = calculateChildCreate2(SALT, initHash, address(this)); - - // selfdestruct, prefunding dummy with funds - this.blowUp(child); - - Dummy d2 = new Dummy{ salt: SALT }(); - return (++value, address(d1), address(d2), child); - } - - function getValue() public view returns (uint) { - return value; - } - - function incrementValue() public returns (uint newValue) { - return ++value; - } - - // Calculate the address for the child n should deploy - function calculateChildCreate2(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { - return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xFF), deployer, salt, bytecodeHash))))); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/libraries/deployable/Nested.sol b/tools/solidity-tests/libraries/deployable/Nested.sol deleted file mode 100644 index dfc8c3845..000000000 --- a/tools/solidity-tests/libraries/deployable/Nested.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../EVMUtils.sol"; - -contract Nested { - - address child; - uint currentCount; - - // Deploys a copy of itself with recurseCount - 1 - // When recurseCount hits 0, returns without deploying - constructor(uint recurseCount) { - if (recurseCount == 0) return; - - // Get our initcode and decrement recurseCount for the next CREATE - bytes memory code = EVMUtils.getOwnCode(); - address result; - assembly { - // This points to the last 32 bytes of code - // ... which is where recurseCount is stored - let ptr := add(code, mload(code)) - mstore(ptr, sub(recurseCount, 1)) - - // Deploy with recurseCount - 1 - result := create(0, add(32, code), mload(code)) - } - - // Post deployment - record child and current recurseCount - child = result; - currentCount = recurseCount; - } - - function getChildAndCount() public view returns (address, uint) { - return (child, currentCount); - } -} - -contract Nested2 { - - address child; - uint currentCount; - bytes32 initcodeHash; - - bytes32 constant SALT = bytes32("saltysaltysalt"); - - // Using CREATE2, deploys a copy of itself with recurseCount - 1 - // When recurseCount hits 0, returns without deploying - constructor(uint recurseCount) { - if (recurseCount == 0) return; - - // Get our initcode and decrement recurseCount for the next CREATE - bytes memory code = EVMUtils.getOwnCode(); - bytes32 salt = SALT; - address result; - assembly { - // This points to the last 32 bytes of code - // ... which is where recurseCount is stored - let ptr := add(code, mload(code)) - mstore(ptr, sub(recurseCount, 1)) - - // Deploy with recurseCount - 1 - result := create2(0, add(32, code), mload(code), salt) - } - - // Post deployment - record child and current recurseCount - child = result; - currentCount = recurseCount; - // Record initcode hash for CREATE2 calc - initcodeHash = keccak256(code); - } - - function getChildCountAndHash() public view returns (address, uint, bytes32) { - return (child, currentCount, initcodeHash); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/package.json b/tools/solidity-tests/package.json deleted file mode 100644 index 5a71c02c4..000000000 --- a/tools/solidity-tests/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "solc": "^0.8.17" - } -} diff --git a/tools/solidity-tests/script.sh b/tools/solidity-tests/script.sh deleted file mode 100755 index 6ebe06e31..000000000 --- a/tools/solidity-tests/script.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash - -# BUNDLE varilabl emust be set -if [ -z "$BUNDLE" ]; then - echo "builtin-actors bundle not specified; please set the BUNDLE variable" - exit 1 -fi - -# fvm-bench tool path; if not user provided try to use the release from current path -fvm_bench=${FVM_BENCH:-../../target/release/fvm-bench} -if [ ! -e "$fvm_bench" ]; then - echo "fvm-bench executable $fvm_bench does not exist" - exit 1 -fi - -# Set the output directory to "./contracts-output" and create if it doesn't exist -output_dir="./contracts-output" -if [ ! -d "$output_dir" ]; then - mkdir "$output_dir" -fi - -# Clear directory of previous compiler output -rm "$output_dir"/* - -# Recursively find all files in the ./tests directory that end with ".sol" -# Use solcjs to compile each and generate binary+abi output -# Place all output in $output_dir -echo "Compiling..." -# If we passed in part of a file name, we only compile that file -# ... and only the files we compile get run as tests. -if [ -z "$1" ]; then - find ./tests -name "*.sol" -exec sh -c "echo Compiling {}; solcjs --optimize --bin --abi {} --output-dir ${output_dir}" \; -else - find ./tests -name "*$1*.sol" -exec sh -c "echo Compiling {}; solcjs --optimize --bin --abi {} --output-dir ${output_dir}" \; -fi - -echo "Testing contracts..." -echo " " - -# Find all files in the "./contracts-output" directory that end with ".bin" -for bin_file in "$output_dir"/*.bin; do - # Skip calling any libraries we've added to the libraries dir - if [[ $bin_file == "$output_dir/libraries_"* ]]; then - # echo "Skipping library: $bin_file" - continue - fi - - # if [[ $bin_file != *"TestRecursiveCall.bin" ]]; then - # continue - # fi - - # Run fvm-bench on the compiled file - # Call the `testEntry()` function, and send no other calldata - output=$("$fvm_bench" -b "$BUNDLE" "$bin_file" c0406226 0000000000000000000000000000000000000000000000000000000000000000) - - # echo "$output" - - # echo "Parsing output for $bin_file:" - gas_used=$(echo "$output" | grep "Gas Used:") - # echo "Output:" - # echo "==========" - # echo "$gas_used" - # echo "==========" - - if [ $? -ne 0 ]; then - exit 1 - fi - - # Parse the output to retrieve the returndata from the "Result" line - returndata=$(echo "$output" | grep "Result:" | awk '{print $2}') - # echo "Raw returndata:" - # echo "==========" - # echo "$returndata" - # echo "==========" - - # Use forge-cast to abi-decode the returndata and echo the result - # Note: right now, you need to manually change the return params - # here if you change testEntry() to return something new - decoded=$(cast --abi-decode "run()(string[])" "0x$returndata") - echo "Test results for $bin_file:" - echo "==========" - echo "$gas_used" - echo $decoded | jq -r ".[]" - echo "==========" - echo " " -done diff --git a/tools/solidity-tests/tests/TestEVMPrecompiles.sol b/tools/solidity-tests/tests/TestEVMPrecompiles.sol deleted file mode 100644 index e29209625..000000000 --- a/tools/solidity-tests/tests/TestEVMPrecompiles.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../libraries/Test.sol"; -import "../libraries/ErrLib.sol"; -import "../libraries/FilUtils.sol"; -import "../libraries/deployable/Dummy.sol"; -import "../libraries/EVMUtils.sol"; - -contract TestEVMPrecompiles { - - using FilUtils for *; - using Test for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addV(this.test__Identity.named("test__Identity")) - .run(); - } - - - // Test identity precompile - function test__Identity() external view { - // Empty data - bytes memory empty = new bytes(0); - (bool success, bytes memory copy) = EVMUtils.copyData(empty); - Test.expect("identity precompile reverted or returned invalid data").success(success); - Test.expect("copy should equal original").eq(hash(empty), hash(copy)); - - // One byte - bytes memory single = abi.encodePacked(uint8(42)); - (success, copy) = EVMUtils.copyData(single); - Test.expect("identity precompile reverted or returned invalid data").success(success); - Test.expect("copy should equal original").eq(hash(single), hash(copy)); - - // Lotsa bytes - bytes memory multi = abi.encodePacked(creator, msg.sender, block.timestamp, tx.origin); - (success, copy) = EVMUtils.copyData(multi); - Test.expect("identity precompile reverted or returned invalid data").success(success); - Test.expect("copy should equal original").eq(hash(multi), hash(copy)); - } - - function hash(bytes memory b) internal pure returns (bytes32) { - return keccak256(b); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/TestFilPrecompiles.sol b/tools/solidity-tests/tests/TestFilPrecompiles.sol deleted file mode 100644 index 2ece7d25a..000000000 --- a/tools/solidity-tests/tests/TestFilPrecompiles.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../libraries/Test.sol"; -import "../libraries/ErrLib.sol"; -import "../libraries/FilUtils.sol"; -import "../libraries/deployable/Dummy.sol"; -import "../libraries/deployable/Lifecycle.sol"; - -contract TestFilPrecompiles { - - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addV(this.test__Resolve_Roundtrip.named("test__Resolve_Roundtrip")) - .addM(this.test__Resolve_New_Actors.named("test__Resolve_New_Actors")) - .addM(this.test__Call_Unknown_Precompile.named("test__Call_Unknown_Precompile")) - .run(); - } - - // Test resolve_address -> lookup_delegated_address roundtrip - function test__Resolve_Roundtrip() external view { - (bool success, uint64 id) = address(this).getActorID(); - Test.expect("resolve_address reverted or returned empty").success(success); - Test.expect("resolved actor id should be valid").gte(id, 100); - - address ethAddress; - (success, ethAddress) = id.getEthAddress(); - Test.expect("lookup_delegated_address reverted or returned empty").success(success); - Test.expect("did not roundtrip").eq(ethAddress, address(this)); - } - - // Test resolve_address on fresh actors - function test__Resolve_New_Actors() external { - address a = DummyLib.newDummy(); - (bool success, uint64 curId) = a.getActorID(); - Test.expect("resolve_address reverted or returned empty").success(success); - Test.expect("resolved actor id should be valid").gte(curId, 100); - - // Deploy contract in a loop and check that the ID we retrieve - // is incremented each time - uint64 nextId; - for (uint i = 0; i < 5; i++) { - a = DummyLib.newDummy(); - - (success, nextId) = a.getActorID(); - Test.expect("resolve_address reverted or returned empty").success(success); - Test.expect("actor id should increment").eq(nextId, curId + 1); - - curId = nextId; - } - } - - // Test properties of calls to addresses that are formatted like precompiles - // ... but do not exist - function test__Call_Unknown_Precompile() external { - // Unknown EVM precompile - all CALL types - (bool success, bytes memory data) = address(uint160(100)).call(""); - Test.expect("call should succeed when calling unknown EVM precompile").success(success); - Test.expect("call should not return anything for unknown EVM precompile").iszero(data.length); - - (success, data) = address(uint160(100)).staticcall(""); - Test.expect("staticcall should succeed when calling unknown EVM precompile").success(success); - Test.expect("staticcall should not return anything for unknown EVM precompile").iszero(data.length); - - (success, data) = address(uint160(100)).delegatecall(""); - Test.expect("delegatecall should succeed when calling unknown EVM precompile").success(success); - Test.expect("delegatecall should not return anything for unknown EVM precompile").iszero(data.length); - - // Deprecated FIL precompile - all CALL types - address target = 0xFe00000000000000000000000000000000000004; - (success, data) = target.call(""); - Test.expect("call should succeed when calling deprecated precompile").success(success); - Test.expect("call should not return anything for deprecated precompile").iszero(data.length); - - (success, data) = target.staticcall(""); - Test.expect("staticcall should succeed when calling deprecated precompile").success(success); - Test.expect("staticcall should not return anything for deprecated precompile").iszero(data.length); - - (success, data) = target.delegatecall(""); - Test.expect("delegatecall should succeed when calling deprecated precompile").success(success); - Test.expect("delegatecall should not return anything for deprecated precompile").iszero(data.length); - - // Unknown FIL precompile - all CALL types - target = uint64(100).toIDAddress(); - (success, data) = target.call(""); - Test.expect("call should succeed when calling unknown precompile").success(success); - Test.expect("call should not return anything for unknown precompile").iszero(data.length); - - (success, data) = target.staticcall(""); - Test.expect("staticcall should succeed when calling unknown precompile").success(success); - Test.expect("staticcall should not return anything for unknown precompile").iszero(data.length); - - (success, data) = target.delegatecall(""); - Test.expect("delegatecall should succeed when calling unknown precompile").success(success); - Test.expect("delegatecall should not return anything for unknown precompile").iszero(data.length); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/TestLifecycle.sol b/tools/solidity-tests/tests/TestLifecycle.sol deleted file mode 100644 index e1b405f74..000000000 --- a/tools/solidity-tests/tests/TestLifecycle.sol +++ /dev/null @@ -1,305 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../libraries/Test.sol"; -import "../libraries/ErrLib.sol"; -import "../libraries/FilUtils.sol"; -import "../libraries/deployable/Dummy.sol"; -import "../libraries/deployable/Lifecycle.sol"; -import "../libraries/deployable/Nested.sol"; - -contract TestLifecycle { - - using EVMUtils for *; - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addM(this.test__Create_Codesize.named("test__Create_Codesize")) - .addP(this.test__Create_Ctx.named("test__Create_Ctx")) - .addP(this.test__Create_Selfdestruct.named("test__Create_Selfdestruct")) - .addP(this.test__Selfdestruct_After_Create.named("test__Selfdestruct_After_Create")) - .addP(this.test__Selfdestruct_Multi.named("test__Selfdestruct_Multi")) - .addP(this.test__Selfdestruct_Prefund_Child.named("test__Selfdestruct_Prefund_Child")) - .addP(this.test__Send_Precompile_Value.named("test__Send_Precompile_Value")) - .run(); - } - - // Test expected codesize and codehash values - function test__Create_Codesize() external { - Lifecycle l = new Lifecycle(); - - // Lifecycle recorded various codesize/hash values during construction: - (uint selfCodesize, uint extCodesize, bytes32 selfCodehash, bytes32 extCodehash) = l.getRecordedCodeVals(); - Test.expect("self codesize should be nonzero during constructor").neq(selfCodesize, 0); - Test.expect("extcodesize should be zero during constructor").iszero(extCodesize); - Test.expect("self codehash should not match empty account").neq(selfCodehash, FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("extcodehash should match empty account during constructor").eq(extCodehash, FilUtils.EVM_EMPTY_CODEHASH); - - // Compare against values we can calculate here: - uint calcedSize = type(Lifecycle).creationCode.length; - bytes32 calcedHash = keccak256(type(Lifecycle).creationCode); - Test.expect("self codesize should match creation code length").eq(selfCodesize, calcedSize); - Test.expect("self codehash should match creation code hash").eq(calcedHash, selfCodehash); - - // Now update the values and check against prev: - (uint newSelfCS, uint newExtCS, bytes32 newSelfCH, bytes32 newExtCH) = l.updateCodeVals(); - Test.expect("self codesize and extcodesize should match after construction").eq(newSelfCS, newExtCS); - Test.expect("self codehash and extcodehash should match after construction").eq(newSelfCH, newExtCH); - - // Compare against values we can calculate here: - calcedSize = type(Lifecycle).runtimeCode.length; - calcedHash = keccak256(type(Lifecycle).runtimeCode); - Test.expect("codesize should match runtime code length").eq(newSelfCS, calcedSize); - Test.expect("codehash should match runtime code hash").eq(newSelfCH, calcedHash); - } - - // Test properties of various call-context-related params - function test__Create_Ctx() external payable { - Lifecycle l = new Lifecycle(); - - // Lifecycle recorded various call context values during construction: - Lifecycle.Ctx memory ctx = l.getRecordedCallCtxVals(); - Test.expect("should know own address").eq(ctx.self, address(l)); - Test.expect("should agree on tx origin").eq(ctx.origin, tx.origin); - Test.expect("sender should be this contract").eq(ctx.sender, address(this)); - Test.expect("should not have been sent value").iszero(ctx.callValue); - Test.expect("balance should be zero").iszero(ctx.balance); - Test.expect("selfbalance should be zero").iszero(ctx.selfBalance); - - // Update recorded values now that constructor is complete. They should all be the same: - Lifecycle.Ctx memory newCtx = l.updateCallCtxVals(); - Test.expect("addresses should match").eq(ctx.self, newCtx.self); - Test.expect("origins should match").eq(ctx.origin, newCtx.origin); - Test.expect("callers should match").eq(ctx.sender, newCtx.sender); - Test.expect("callvalues should match").eq(ctx.callValue, newCtx.callValue); - Test.expect("balances should match").eq(ctx.balance, newCtx.balance); - Test.expect("selfbalances should match").eq(ctx.selfBalance, newCtx.selfBalance); - - // Now try the same thing, but with value sent to constructor: - uint toSend = msg.value; - Test.expect("we should have some funds to send").neq(toSend, 0); - uint prevBalance = address(this).balance; - - l = new Lifecycle{ value: toSend }(); - ctx = l.getRecordedCallCtxVals(); - Test.expect("should know own address").eq(ctx.self, address(l)); - Test.expect("should agree on tx origin").eq(ctx.origin, tx.origin); - Test.expect("sender should be this contract").eq(ctx.sender, address(this)); - Test.expect("should have been sent value").neq(ctx.callValue, 0); - Test.expect("balance should be equal to value sent").eq(ctx.balance, toSend); - Test.expect("selfbalance be equal to value sent").eq(ctx.selfBalance, toSend); - Test.expect("our balance should decrease by sent amount").eq(address(this).balance, prevBalance - toSend); - } - - // Test properties of selfdestruct in constructor - function test__Create_Selfdestruct() external payable { - uint balancePre = address(this).balance; - uint toSend = msg.value / 2; - // Sanity check and make sure we got some Fil - Test.expect("we should have received some Fil to play with").neq(toSend, 0); - - // Deploy 2 contracts, each of which SELFDESTRUCTS during constructor - // Send half CALLVALUE to each - address lb1 = address(new LifecycleBlowup{ value: toSend }(true)); - address lb2 = address(new LifecycleBlowup{ value: toSend }(true)); - - // Should result in 2 distinct EthAddresses - Test.expect("lb1 should be nonzero").neq(lb1, address(0)); - Test.expect("lb2 should be nonzero").neq(lb2, address(0)); - Test.expect("lb1 and lb2 should be distinct addresses").neq(lb1, lb2); - - // Neither should have extcodesize, and hash should be equal to the empty codehash - Test.expect("lb1 should have empty code").iszero(lb1.extCodesize()); - Test.expect("lb1 hash should be empty hash").eq(lb1.extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("lb2 should have empty code").iszero(lb2.extCodesize()); - Test.expect("lb2 hash should be empty hash").eq(lb2.extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - - // Actor ID should increment correctly - (bool success, uint64 id) = lb1.getActorID(); - uint firstId = id; - Test.expect("lb1 actor id should resolved successfully").success(success); - Test.expect("lb1 actor id should be valid").gte(id, 100); - (success, id) = lb2.getActorID(); - Test.expect("lb2 actor id should resolved successfully").success(success); - Test.expect("lb2 actor id should be 1 greater than lb1").eq(id, firstId+1); - - // Balance should update correctly - // This also tests a notable deviation from EVM behavior: - // LifecycleBlowup has selfdestructed with itself as beneficiary. - // In the EVM, it shouldn't have a balance. In FEVM, we expect it does. - uint expectedBalance = balancePre - (2*toSend); - Test.expect("our balance should have decreased by toSend * 2").eq(address(this).balance, expectedBalance); - Test.expect("lb1 should have a balance of toSend").eq(lb1.balance, toSend); - Test.expect("lb2 should have a balance of toSend").eq(lb2.balance, toSend); - } - - // Test basic properties of selfdestruct - - function test__Selfdestruct_After_Create() external payable { - uint toSend = msg.value; - // Sanity check and make sure we got some Fil - Test.expect("we should have received some Fil to play with").neq(toSend, 0); - - // Deploy a contract (does NOT selfdestruct in constructor) - // Send value - LifecycleBlowup lb = new LifecycleBlowup{ value: toSend }(false); - // Sanity check that we now have a normal contract deployed: - Test.expect("lb should be nonzero").neq(address(lb), address(0)); - // ... which has nonzero codesize and codehash - Test.expect("lb should have code").neq(address(lb).extCodesize(), 0); - Test.expect("lb codehash should NOT be empty hash").neq(address(lb).extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - // ... which has the Fil we sent on construction - Test.expect("lb should have a balance of toSend").eq(address(lb).balance, toSend); - - // And now the fun! - // Test retrieving a value after selfdestruct is run in a sub-call: - uint value = lb.blowUpAndReturn(); - Test.expect("should have returned the correct value").eq(value, 42); - Test.expect("lb should still have code").neq(address(lb).extCodesize(), 0); - Test.expect("lb codehash should still not empty").neq(address(lb).extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("lb should still have toSend balance").eq(address(lb).balance, toSend); - // Check if we can still call functions on it from here: - value = lb.incrementValue(); - Test.expect("should have incremented the value").eq(value, 43); - value = lb.getValue(); - Test.expect("should reflect the last state change").eq(value, 43); - value = lb.blowUpAndReturn(); - Test.expect("should still have toSend balance").eq(address(lb).balance, toSend); - Test.expect("should still return 43").eq(value, 43); - } - - // Test basic properties of selfdestruct - - function test__Selfdestruct_Multi() external payable { - uint balancePre = address(this).balance; - uint toSend = msg.value; - // Sanity check and make sure we got some Fil - Test.expect("we should have received some Fil to play with").neq(toSend, 0); - - // Deploy a contract (does NOT selfdestruct in constructor) - // Send value - LifecycleBlowup lb = new LifecycleBlowup{ value: toSend }(false); - // Sanity check that we now have a normal contract deployed: - Test.expect("lb should be nonzero").neq(address(lb), address(0)); - // ... which has nonzero codesize and codehash - Test.expect("lb should have code").neq(address(lb).extCodesize(), 0); - Test.expect("lb codehash should NOT be empty hash").neq(address(lb).extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - // ... which has the Fil we sent on construction - Test.expect("lb should have a balance of toSend").eq(address(lb).balance, toSend); - - // And now the fun! - // Test selfdestruct called multiple times - // The last selfdestruct sends value back to this contract - uint value = lb.blowUpMultiAndReturn(); - Test.expect("should have returned the correct value").eq(value, 42); - Test.expect("lb should still have code").neq(address(lb).extCodesize(), 0); - Test.expect("lb codehash should still not empty").neq(address(lb).extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("lb should not have balance").iszero(address(lb).balance); - Test.expect("our balance should be unchanged").eq(address(this).balance, balancePre); - // Check if we can still call functions on it from here: - value = lb.incrementValue(); - Test.expect("should have incremented the value").eq(value, 43); - value = lb.getValue(); - Test.expect("should reflect the last state change").eq(value, 43); - value = lb.blowUpAndReturn(); - Test.expect("should still have empty balance").iszero(address(lb).balance); - Test.expect("should still return 43").eq(value, 43); - } - - // Use selfdestruct to send funds to a contract before it is created - function test__Selfdestruct_Prefund_Child() external payable { - uint toSend = msg.value; - // Sanity check and make sure we got some Fil - Test.expect("we should have received some Fil to play with").neq(toSend, 0); - - // Deploy a contract (does NOT selfdestruct in constructor) - // Send value - LifecycleBlowup lb = new LifecycleBlowup{ value: toSend }(false); - // Sanity check that we now have a normal contract deployed: - Test.expect("lb should be nonzero").neq(address(lb), address(0)); - // ... which has nonzero codesize and codehash - Test.expect("lb should have code").neq(address(lb).extCodesize(), 0); - Test.expect("lb codehash should NOT be empty hash").neq(address(lb).extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - // ... which has the Fil we sent on construction - Test.expect("lb should have a balance of toSend").eq(address(lb).balance, toSend); - - // This method uses CREATE to create a child - // ... then calculates what child it would create with CREATE2+salt - // ... then uses SELFDESTRUCT to send funds to that child before it is created - // ... then uses CREATE2 to create the child - // ... and finally increments a stored value and returns 3 addresses: - (uint value, address firstChild, address secondChild, address calculatedChild) - = lb.createPrefundAndBlowUp(); - - // Get returned ID - (bool success, uint64 lbID) = address(lb).getActorID(); - Test.expect("ID should have resolved successfully").success(success); - Test.expect("returned ID should be valid").gte(lbID, 100); - - Test.expect("value should have incremented").eq(value, 43); - // Check expected values for first child: - uint64 childID; - (success, childID) = firstChild.getActorID(); - Test.expect("ID should have resolved successfully").success(success); - Test.expect("childID should be parent + 1").eq(childID, lbID+1); - Test.expect("firstChild should have a nonzero address").neq(firstChild, address(0)); - Test.expect("firstChild should have nonzero codesize").neq(firstChild.extCodesize(), 0); - Test.expect("firstChild should have nonzero codehash").neq(firstChild.extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("firstChild should have empty balance").iszero(firstChild.balance); - - // Check expected values for second child: - (success, childID) = secondChild.getActorID(); - Test.expect("ID should have resolved successfully").success(success); - Test.expect("childID should be parent + 2").eq(childID, lbID+2); - Test.expect("secondChild should be equal to calculated address").eq(secondChild, calculatedChild); - Test.expect("secondChild should have a nonzero address").neq(secondChild, address(0)); - Test.expect("secondChild should have nonzero codesize").neq(secondChild.extCodesize(), 0); - Test.expect("secondChild should have nonzero codehash").neq(secondChild.extCodehash(), FilUtils.EVM_EMPTY_CODEHASH); - Test.expect("secondChild should have been prefunded").eq(secondChild.balance, toSend); - } - - // Tests what happens when a precompile receives funds via SELFDESTRUCT - function test__Send_Precompile_Value() external payable { - uint toSend = msg.value / 2; - // Sanity check and make sure we got some Fil - Test.expect("we should have received some Fil to play with").neq(toSend, 0); - - // Deploy a contract that we'll trigger to blow up and send - // Fil to a precompile - LifecycleBlowup lb = new LifecycleBlowup{ value: toSend }(false); - // Check the actor ID and balance of the contract we just deployed - (bool success, uint64 lbID) = address(lb).getActorID(); - Test.expect("actor id should resolve successfully").success(success); - Test.expect("actor id should be valid").gte(lbID, 100); - Test.expect("should have balance of toSend").eq(address(lb).balance, toSend); - - // Check the actor ID and balance of the precompile - address beneficiary = FilUtils.CALL_ACTOR_BY_ID; - uint64 pcID; - (success, pcID) = beneficiary.getActorID(); - Test.expect("actor id should NOT resolve successfully").fail(success); - Test.expect("actor id should be zero (did not resolve)").iszero(pcID); - Test.expect("should have zero balance").iszero(beneficiary.balance); - - // Now, selfdestruct some funds to the precompile: - lb.blowUp(beneficiary); - // Sanity check that lb no longer has funds - Test.expect("lb should not have funds").iszero(address(lb).balance); - Test.expect("should not have funds, even if we ask about its ID addr").iszero(lbID.toIDAddress().balance); - - // Can we get an actor ID now? - (success, pcID) = beneficiary.getActorID(); - Test.expect("actor id should resolve successfully").success(success); - Test.expect("actor id should be lbID + 1").eq(pcID, lbID+1); - - // Does the precompile have a balance now? What if we use its ID address? - Test.expect("should have balance of toSend").eq(beneficiary.balance, toSend); - address bID = pcID.toIDAddress(); - Test.expect("should have balance of toSend when querying using ID address").eq(bID.balance, toSend); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/TestStaticContext.sol b/tools/solidity-tests/tests/TestStaticContext.sol deleted file mode 100644 index a94b298e3..000000000 --- a/tools/solidity-tests/tests/TestStaticContext.sol +++ /dev/null @@ -1,176 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../libraries/Test.sol"; -import "../libraries/ErrLib.sol"; -import "../libraries/FilUtils.sol"; -import "../libraries/deployable/Dummy.sol"; -import "../libraries/deployable/Lifecycle.sol"; -import "../libraries/deployable/Nested.sol"; - -// We're going to be delegatecalling Dummy, so inheriting it -// means we mimic its storage layout and callable functions. -contract TestStaticContext is Dummy { - - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - address dummy = DummyLib.newDummy(); - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addV(this.test__Call_Within_Staticcall.named("test__Call_Within_Staticcall")) - .addV(this.test__Delegatecall_Within_Staticcall.named("test__Delegatecall_Within_Staticcall")) - .run(); - } - - /** - * We're marking these "view" and using "addV" to add it - * to the runner above, which means these methods will get - * called using STATICCALL. - * - * So everything here is in a static context already. - * - * However, even though the EVM allows CALL/DELEGATECALL - * in a static context, Solidity doesn't like it and - * won't let you mark a function "view" if it contains - * a CALL or DELEGATECALL. So the weirdness below is - * because we're using function pointers to trick the - * compiler. - */ - - function test__Call_Within_Staticcall() external view { - function() internal view returns (bool, bytes memory) callFn; - - // CALL incrementValue - tries to modify state via SSTORE - callFn = cast(call_incrementValue); - (bool success, bytes memory data) = callFn(); - Test.expect("modifying state in a static context should fail").fail(success); - Test.expect("there should be no return data").iszero(data.length); - - // CALL logValue - tries to modify state via LOG - callFn = cast(call_logValue); - (success, data) = callFn(); - Test.expect("logging in a static context should fail").fail(success); - Test.expect("there should be no return data").iszero(data.length); - - // CALL getValueView - callFn = cast(call_getValueView); - (success, data) = callFn(); - uint valueRead = abi.decode(data, (uint)); - Test.expect("using CALL to read state should be fine").success(success); - Test.expect("return should decode to uint(100)").eq(valueRead, 100); - - // CALL getValuePure - callFn = cast(call_getValuePure); - (success, data) = callFn(); - valueRead = abi.decode(data, (uint)); - Test.expect("using CALL to read bytecode should be fine").success(success); - Test.expect("return should decode to uint(42)").eq(valueRead, 42); - } - - function test__Delegatecall_Within_Staticcall() external view { - function() internal view returns (bool, bytes memory) callFn; - - // DELEGATECALL incrementValue - tries to modify state via SSTORE - callFn = cast(dcall_incrementValue); - (bool success, bytes memory data) = callFn(); - Test.expect("modifying state in a static context should fail").fail(success); - Test.expect("there should be no return data").iszero(data.length); - - // DELEGATECALL logValue - tries to modify state via LOG - callFn = cast(dcall_logValue); - (success, data) = callFn(); - Test.expect("logging in a static context should fail").fail(success); - Test.expect("there should be no return data").iszero(data.length); - - // DELEGATECALL getValueView - callFn = cast(dcall_getValueView); - (success, data) = callFn(); - uint valueRead = abi.decode(data, (uint)); - Test.expect("using DELEGATECALL to read state should be fine").success(success); - Test.expect("return should decode to uint(100)").eq(valueRead, 100); - - // DELEGATECALL getValuePure - callFn = cast(dcall_getValuePure); - (success, data) = callFn(); - valueRead = abi.decode(data, (uint)); - Test.expect("using DELEGATECALL to read bytecode should be fine").success(success); - Test.expect("return should decode to uint(42)").eq(valueRead, 42); - } - - /** - * CALL methods: - */ - - // Use CALL to increment and retrieve a value from Dummy. - // This tries to modify state via SSTORE - function call_incrementValue() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.incrementValue.selector, ""); - (success, data) = dummy.call(input); - } - - // Use CALL to LOG and retrieve a value from Dummy. - // This tries to modify state via LOG - function call_logValue() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.logValue.selector, ""); - (success, data) = dummy.call(input); - } - - // Use CALL to read a value from Dummy state without attempting to change state - function call_getValueView() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.getValueView.selector, ""); - (success, data) = dummy.call(input); - } - - // Use CALL to read a value from Dummy bytecode without attempting to change state - function call_getValuePure() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.getValuePure.selector, ""); - (success, data) = dummy.call(input); - } - - /** - * DELEGATECALL methods: - */ - - // Use DELEGATECALL to increment and retrieve a value from our state - // This one tries to modify state. - function dcall_incrementValue() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.incrementValue.selector, ""); - (success, data) = dummy.delegatecall(input); - } - - // Use DELEGATECALL to LOG and retrieve a value from Dummy. - // This tries to modify state via LOG - function dcall_logValue() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.logValue.selector, ""); - (success, data) = dummy.delegatecall(input); - } - - // Use DELEGATECALL to read a value from our state without attempting to change state - function dcall_getValueView() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.getValueView.selector, ""); - (success, data) = dummy.delegatecall(input); - } - - // Use DELEGATECALL to read a value from our bytecode without attempting to change state - function dcall_getValuePure() internal returns (bool success, bytes memory data) { - bytes memory input = abi.encodeWithSelector(Dummy.getValuePure.selector, ""); - (success, data) = dummy.delegatecall(input); - } - - // Use assembly to cast a non-view function to "view" - // This rigmarole is to fool the compiler into letting us use CALL - // in a STATIC context. - function cast(function() internal returns (bool, bytes memory) target) - internal - pure - returns (function() internal view returns (bool, bytes memory) callFn) - { - assembly { callFn := target } - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/recursive/TestRecursiveCall.sol b/tools/solidity-tests/tests/recursive/TestRecursiveCall.sol deleted file mode 100644 index 2fc1cbf87..000000000 --- a/tools/solidity-tests/tests/recursive/TestRecursiveCall.sol +++ /dev/null @@ -1,153 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../../libraries/Test.sol"; -import "../../libraries/ErrLib.sol"; -import "../../libraries/FilUtils.sol"; -import "../../libraries/deployable/Dummy.sol"; -import "../../libraries/deployable/Lifecycle.sol"; -import "../../libraries/deployable/Nested.sol"; - -contract TestRecursiveCall { - - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addM(this.test__Recursive_Call.named("test__Recursive_Call")) - .addM(this.test__Recursive_Delegatecall.named("test__Recursive_Delegatecall")) - .addV(this.test__Recursive_Staticcall.named("test__Recursive_Staticcall")) - .run(); - } - - /** - * The call stack depth limit is technically 1024, but we can't - * actually reach that in practice, because each call only sends - * up to 63/64 available gas. With a gas limit of 10B, we end up failing - * somewhere in the 200's. - */ - uint constant RECURSE_COUNT = 200; - - /** - * Each of these tests tries to recurse RECURSE_COUNT times, - * each using a different call type. - * - * We'd expect to be able to approach the call stack depth limit of 1024 for each. - */ - - function test__Recursive_Call() external { - try this.recurse(RECURSE_COUNT, false) returns (uint val) { - Test.expect("should return 42").eq(val, 42); - } catch Error(string memory reason) { - revert(reason); - } catch (bytes memory data) { - Test.fail("should not have reached this point; got data: ".concat(string(data))); - } - } - - function test__Recursive_Delegatecall() external { - try this.recurse(RECURSE_COUNT, true) returns (uint val) { - Test.expect("should return 42").eq(val, 42); - } catch Error(string memory reason) { - revert(reason); - } catch (bytes memory data) { - Test.fail("should not have reached this point; got data: ".concat(string(data))); - } - } - - function test__Recursive_Staticcall() external view { - try this.recurseView(RECURSE_COUNT) returns (uint val) { - Test.expect("should return 42").eq(val, 42); - } catch Error(string memory reason) { - revert(reason); - } catch (bytes memory data) { - Test.fail("should not have reached this point; got data: ".concat(string(data))); - } - } - - /** - * The error catching here is a little weird - - * - * Basically, at some point we'll probably fail because - * we hit the call stack depth, or some other limitation of the FEVM. - * - * When that happens, it's treated like a revert with empty data. - * The try/catch statements below have 2 different "catches:" - * 1. If we get zero revert data, we've just hit the FEVM limit. - * Create an error string and revert with that. - * 2. If we get nonzero revert data, that's probably our error string. - * Just bubble that string up. - */ - - function recurse(uint val, bool delegate) public returns (uint) { - if (val == 0) { - return 42; - } - - uint gasLeftBefore = gasleft(); - - if (delegate) { - bool success; - bytes memory data = abi.encodeWithSelector(this.recurse.selector, val-1, delegate); - (success, data) = address(this).delegatecall(data); - if (success) { - assembly { return(add(32, data), mload(data)) } - } else if (data.length != 0) { - assembly { revert(add(32, data), mload(data)) } - } else { - revert( - "call failed at depth: " - .concat(RECURSE_COUNT - val) - .concat(string("; gas before call: ")) - .concat(gasLeftBefore) - .concat(string("; gas after: ")) - .concat(gasleft()) - ); - } - } else { - try this.recurse(val - 1, delegate) returns (uint v) { - return v; - } catch Error(string memory reason) { - revert(reason); - } catch { - revert( - "call failed at depth: " - .concat(RECURSE_COUNT - val) - .concat(string("; gas before call: ")) - .concat(gasLeftBefore) - .concat(string("; gas after: ")) - .concat(gasleft()) - ); - } - } - } - - function recurseView(uint val) public view returns (uint) { - if (val == 0) { - return 42; - } - - uint gasLeftBefore = gasleft(); - - try this.recurseView(val - 1) returns (uint v) { - return v; - } catch Error(string memory reason) { - revert(reason); - } catch { - revert( - "call failed at depth: " - .concat(RECURSE_COUNT - val) - .concat(string("; gas before call: ")) - .concat(gasLeftBefore) - .concat(string("; gas after: ")) - .concat(gasleft()) - ); - } - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/recursive/TestRecursiveCreate.sol b/tools/solidity-tests/tests/recursive/TestRecursiveCreate.sol deleted file mode 100644 index 212f4b9b0..000000000 --- a/tools/solidity-tests/tests/recursive/TestRecursiveCreate.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../../libraries/Test.sol"; -import "../../libraries/ErrLib.sol"; -import "../../libraries/FilUtils.sol"; -import "../../libraries/deployable/Dummy.sol"; -import "../../libraries/deployable/Lifecycle.sol"; -import "../../libraries/deployable/Nested.sol"; - -contract TestRecursiveCreate { - - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addM(this.test__Recursive_Create.named("test__Recursive_Create")) - .run(); - } - - // Test properties of contracts that deploy themselves - // We have to give this its own "run" invocation, because - // we're going to use a ton of gas. - function test__Recursive_Create() external { - // deep recursive CREATE - Nested n = new Nested(100); - (address curChild, uint curCount) = n.getChildAndCount(); - address calcedAddr = calculateChild(address(n)); - - (bool success, uint64 curId) = address(n).getActorID(); - Test.expect("should have successfully fetched id at top level").success(success); - Test.expect("top level resolved id should be valid").gte(curId, 100); - - address prevChild; - uint64 prevId; - uint prevCount; - while (curChild != address(0)) { - Test.expect("should correctly compute the next address for count: ".concat(curCount)).eq(curChild, calcedAddr); - - prevChild = curChild; - prevId = curId; - prevCount = curCount; - - // Update curChild and curCount - (curChild, curCount) = Nested(curChild).getChildAndCount(); - calcedAddr = calculateChild(prevChild); - (success, curId) = prevChild.getActorID(); - Test.expect("should have successfully fetched id at count: ".concat(prevCount)).success(success); - Test.expect("resolved id should be valid at count: ".concat(prevCount)).gte(curId, 100); - Test.expect("id should increment by 1").eq(curId, prevId + 1); - } - - Test.expect("should have ended with count 0").iszero(curCount); - Test.expect("should have ended with child 0").iszero(curChild); - } - - // Calculate the address for the child n should deploy - function calculateChild(address n) internal pure returns (address) { - return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), n, bytes1(0x01)))))); - } -} \ No newline at end of file diff --git a/tools/solidity-tests/tests/recursive/TestRecursiveCreate2.sol b/tools/solidity-tests/tests/recursive/TestRecursiveCreate2.sol deleted file mode 100644 index 863751971..000000000 --- a/tools/solidity-tests/tests/recursive/TestRecursiveCreate2.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import "../../libraries/Test.sol"; -import "../../libraries/ErrLib.sol"; -import "../../libraries/FilUtils.sol"; -import "../../libraries/deployable/Dummy.sol"; -import "../../libraries/deployable/Lifecycle.sol"; -import "../../libraries/deployable/Nested.sol"; - -contract TestRecursiveCreate2 { - - using FilUtils for *; - using Test for *; - using ErrLib for *; - - address creator = msg.sender; - - constructor() payable { } - - function run() public returns (string[] memory results) { - return Test.getRunner() - .addM(this.test__Recursive_Create2.named("test__Recursive_Create2")) - .run(); - } - - // Nested2 has an identical copy of this variable, so if you change the value... :( - bytes32 constant SALT = bytes32("saltysaltysalt"); - - // Test properties of contracts that deploy themselves - // We have to give this its own "run" invocation, because - // we're going to use a ton of gas. - function test__Recursive_Create2() external { - // deep recursive CREATE2 - Nested2 n = new Nested2{ salt: SALT }(100); - - (address curChild, uint curCount, bytes32 initcodeHash) = n.getChildCountAndHash(); - address calcedAddr = calculateChildCreate2(SALT, initcodeHash, address(n)); - (bool success, uint64 curId) = address(n).getActorID(); - Test.expect("should have successfully fetched id at top level").success(success); - Test.expect("top level resolved id should be valid").gte(curId, 100); - - address prevChild; - uint64 prevId; - uint prevCount; - while (curChild != address(0)) { - Test.expect("should correctly compute the next address for count: ".concat(curCount)).eq(curChild, calcedAddr); - - prevChild = curChild; - prevId = curId; - prevCount = curCount; - - // Get the next child - (curChild, curCount, initcodeHash) = Nested2(curChild).getChildCountAndHash(); - calcedAddr = calculateChildCreate2(SALT, initcodeHash, prevChild); - (success, curId) = prevChild.getActorID(); - Test.expect("should have successfully fetched id at count: ".concat(prevCount)).success(success); - Test.expect("resolved id should be valid at count: ".concat(prevCount)).gte(curId, 100); - Test.expect("id should increment by 1").eq(curId, prevId + 1); - } - - Test.expect("should have ended with count 0").iszero(curCount); - Test.expect("should have ended with child 0").iszero(curChild); - } - - // Calculate the address for the child n should deploy - function calculateChildCreate2(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { - return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xFF), deployer, salt, bytecodeHash))))); - } -} \ No newline at end of file