diff --git a/plugins/batch_operator_plugin/README.md b/plugins/batch_operator_plugin/README.md index b2869242d1..d6a2a9dadf 100644 --- a/plugins/batch_operator_plugin/README.md +++ b/plugins/batch_operator_plugin/README.md @@ -15,9 +15,9 @@ All 21 batch operators run this plugin in perpetuity. The epoch scheduler (`sysi 4. All 7 independently verify the delivered chain **Phase 2 — Inbound (Outposts → WIRE):** -1. Crank Outpost to finalize epoch (`OPP.finalizeEpoch()` / `finalize_epoch`) -2. Read inbound chain from Outpost (ETH: event logs, SOL: transaction logs) -3. Deliver to Depot (`sysio.msgch::deliver`) with chain hash +1. The consensus-reaching delivery emits the outpost's outbound envelope +2. Read the latest outbound envelope from Outpost storage +3. Deliver its raw protobuf bytes to Depot (`sysio.msgch::deliver`) 4. Depot evaluates consensus across all 7 deliveries ## Configuration diff --git a/plugins/outpost_client_plugin/include/sysio/outpost_client/outpost_client.hpp b/plugins/outpost_client_plugin/include/sysio/outpost_client/outpost_client.hpp index e04443fc6c..5546414d9f 100644 --- a/plugins/outpost_client_plugin/include/sysio/outpost_client/outpost_client.hpp +++ b/plugins/outpost_client_plugin/include/sysio/outpost_client/outpost_client.hpp @@ -67,9 +67,9 @@ class outpost_client { * @brief OPP OUTBOUND — submit a single envelope to the remote chain. * * Must enforce `deadline` internally; a hung chain RPC must not block the - * caller beyond this duration. Implementations that issue multiple chain - * transactions (e.g. Solana's `epoch_in` + `emit_outbound_envelope` pair) - * apply the deadline to the overall sequence. + * caller beyond this duration. Solana may chunk one envelope across + * multiple `epoch_in` transactions; the consensus-reaching transaction + * performs the outpost's outbound emit internally. * * @param epoch_index The current WIRE epoch this envelope belongs to. * @param envelope_bytes Raw protobuf `opp::Envelope` bytes. @@ -83,20 +83,21 @@ class outpost_client { fc::microseconds deadline) = 0; /** - * @brief OPP INBOUND — pull envelope(s) the remote chain has produced for - * this epoch and return the concatenated raw protobuf bytes. + * @brief OPP INBOUND — pull the envelope the remote chain has produced for + * this epoch and return its raw protobuf bytes. * - * Filters by `epoch_index` internally — both ETH's event log and Solana's - * signature history retain stale envelopes from prior epochs, and delivering - * a stale envelope to `sysio.msgch::deliver` trips an + * Filters by `epoch_index` internally. Ethereum and Solana each expose a + * single latest-outbound storage slot, so a poll may still observe the + * preceding epoch until the consensus-reaching delivery overwrites it. + * Delivering that stale envelope to `sysio.msgch::deliver` trips an * `envelope epoch_index mismatch` assertion. * * @param epoch_index Only envelopes whose `epoch_index` field matches this * value are returned; all others are silently dropped. * @param deadline Upper bound on the total time spent talking to the * remote chain for this call. - * @return Concatenated raw `opp::Envelope` bytes ready for - * `sysio.msgch::deliver`, or an empty vector if none matched. + * @return Raw `opp::Envelope` bytes ready for `sysio.msgch::deliver`, or an + * empty vector if the latest slot did not match. * @throws fc::exception on RPC failure or deadline expiry. */ virtual std::vector read_inbound_envelope(uint32_t epoch_index, diff --git a/plugins/outpost_ethereum_client_plugin/include/sysio/outpost_ethereum_client_plugin.hpp b/plugins/outpost_ethereum_client_plugin/include/sysio/outpost_ethereum_client_plugin.hpp index 01d14d7067..1be9389344 100644 --- a/plugins/outpost_ethereum_client_plugin/include/sysio/outpost_ethereum_client_plugin.hpp +++ b/plugins/outpost_ethereum_client_plugin/include/sysio/outpost_ethereum_client_plugin.hpp @@ -29,8 +29,12 @@ using ethereum_client_entry_ptr = std::shared_ptr; /// not silently drop (see epoch-859 stall RCA); the confirmed factory /// awaits `eth_getTransactionReceipt` + N blocks before returning. struct opp_contract_client : ethereum_contract_client { - ethereum_contract_tx_fn emit_outbound_envelope; - ethereum_contract_tx_fn finalize_epoch; + /// Recovery-only write matching `emitOutboundEnvelope(uint32)` on the + /// Ethereum outpost. No in-tree steady-state caller invokes this wrapper: + /// normal operation emits during inbound consensus. It remains available + /// for explicit operator recovery tooling that must advance a stalled + /// outpost with the expected WIRE epoch. + ethereum_contract_tx_fn emit_outbound_envelope; /// View: latest outbound envelope's raw bytes + epoch — overwritten /// on every `emitOutboundEnvelope`. Read by the WIRE batch operator /// to relay the envelope back to WIRE. @@ -40,8 +44,7 @@ struct opp_contract_client : ethereum_contract_client { const address_compat_type& contract_address, const std::vector& contracts) : ethereum_contract_client(client, contract_address, contracts) - , emit_outbound_envelope(create_tx_and_confirm(get_abi("emitOutboundEnvelope"))) - , finalize_epoch(create_tx_and_confirm(get_abi("finalizeEpoch"))) + , emit_outbound_envelope(create_tx_and_confirm(get_abi("emitOutboundEnvelope"))) , get_latest_outbound_envelope(create_call(get_abi("getLatestOutboundEnvelope"))) {} }; diff --git a/plugins/outpost_ethereum_client_plugin/test/test_outpost_ethereum_client_plugin.cpp b/plugins/outpost_ethereum_client_plugin/test/test_outpost_ethereum_client_plugin.cpp index 52ecd514ad..5d75f399ce 100644 --- a/plugins/outpost_ethereum_client_plugin/test/test_outpost_ethereum_client_plugin.cpp +++ b/plugins/outpost_ethereum_client_plugin/test/test_outpost_ethereum_client_plugin.cpp @@ -7,9 +7,11 @@ #include #include +#include #include #include #include +#include #include #include @@ -24,6 +26,9 @@ #include #include +#include +#include +#include using namespace std::literals; @@ -152,12 +157,66 @@ namespace { constexpr std::string_view opp_abi_fixture = "ethereum-abi-opp-current.json"; constexpr std::string_view opp_inbound_abi_fixture = "ethereum-abi-opp-inbound-current.json"; +constexpr std::string_view hex_prefix = "0x"; +constexpr std::string_view emit_outbound_envelope_abi_name = "emitOutboundEnvelope"; +constexpr std::string_view emit_outbound_envelope_selector = "a3ad9cc3"; +constexpr std::string_view test_opp_address = "5FbDB2315678afecb367f032d93F642f64180aa3"; +constexpr std::string_view latest_slot_test_rpc_url = "http://127.0.0.1:1"; +constexpr std::string_view latest_slot_test_entry_id = "latest-slot-test"; +constexpr std::string_view latest_slot_test_private_key = + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; +constexpr std::string_view latest_slot_test_public_key = + "0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed7535" + "47f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5"; +constexpr size_t evm_abi_word_bytes = 32; +constexpr size_t hex_chars_per_byte = 2; +constexpr size_t evm_abi_word_hex_chars = evm_abi_word_bytes * hex_chars_per_byte; +constexpr size_t evm_function_selector_bytes = 4; +constexpr size_t evm_function_selector_hex_chars = evm_function_selector_bytes * hex_chars_per_byte; +constexpr size_t latest_outbound_return_head_words = 2; +constexpr uint64_t latest_outbound_data_offset_bytes = latest_outbound_return_head_words * evm_abi_word_bytes; +constexpr size_t emit_outbound_envelope_call_hex_chars = + evm_function_selector_hex_chars + evm_abi_word_hex_chars; +constexpr uint64_t test_outpost_chain_code = 1; +constexpr uint32_t test_evm_chain_id = 31337; +constexpr uint32_t test_wire_epoch = 7; +constexpr uint32_t test_stale_wire_epoch = test_wire_epoch - 1; +constexpr uint32_t test_different_wire_epoch = test_wire_epoch + 1; +constexpr int64_t test_rpc_deadline_seconds = 1; +constexpr size_t rpc_length_oversized_envelope_bytes = sysio::OPP_MAX_ENVELOPE_BYTES + 1; +constexpr char malformed_envelope_byte = static_cast(0xff); +constexpr char oversized_envelope_fill_byte = static_cast(0x01); auto load_abi_fixture(std::string_view filename) { auto path = fc::test::get_test_fixtures_path() / bfs::path(filename); return fc::network::ethereum::abi::parse_contracts(std::filesystem::path(path.generic_string())); } +/// Encode an unsigned integer as one 32-byte Ethereum ABI word. +std::string abi_word(uint64_t value) { + std::ostringstream stream; + stream << std::hex << std::setfill('0') << std::setw(evm_abi_word_hex_chars) << value; + return stream.str(); +} + +/// Encode the raw return bytes for `getLatestOutboundEnvelope()`. +std::string encode_latest_outbound_result(uint32_t epoch, const std::vector& data) { + auto data_hex = data.empty() ? std::string{} : fc::to_hex(data.data(), data.size()); + data_hex.append( + (evm_abi_word_hex_chars - (data_hex.size() % evm_abi_word_hex_chars)) % evm_abi_word_hex_chars, + '0'); + return std::string(hex_prefix) + abi_word(epoch) + abi_word(latest_outbound_data_offset_bytes) + + abi_word(data.size()) + data_hex; +} + +/// Serialize a minimal protobuf envelope carrying only its epoch index. +std::vector serialize_envelope(uint32_t epoch) { + sysio::opp::Envelope envelope; + envelope.set_epoch_index(epoch); + const auto serialized = envelope.SerializeAsString(); + return {serialized.begin(), serialized.end()}; +} + } // anonymous namespace BOOST_AUTO_TEST_SUITE(outpost_ethereum_client_plugin) @@ -170,14 +229,26 @@ BOOST_AUTO_TEST_CASE(opp_contract_client_construction) try { auto abis = load_abi_fixture(opp_abi_fixture); BOOST_CHECK(!abis.empty()); - // Verify the expected function ABIs are found - bool has_emit = false, has_finalize = false; + // Construction resolves every required ABI entry. A null RPC client is + // sufficient here because the generated callables are not invoked. + auto client = std::make_shared( + ethereum_client_ptr{}, + address_compat_type{std::string(test_opp_address)}, + abis); + BOOST_REQUIRE(client); + BOOST_CHECK(client->emit_outbound_envelope); + BOOST_CHECK(client->get_latest_outbound_envelope); + + // Verify the live relay surface is present and the retired finalizer is not. + bool has_emit = false, has_latest = false, has_finalize = false; for (auto& c : abis) { - if (c.name == "emitOutboundEnvelope") has_emit = true; + if (c.name == emit_outbound_envelope_abi_name) has_emit = true; + if (c.name == "getLatestOutboundEnvelope") has_latest = true; if (c.name == "finalizeEpoch") has_finalize = true; } BOOST_CHECK(has_emit); - BOOST_CHECK(has_finalize); + BOOST_CHECK(has_latest); + BOOST_CHECK(!has_finalize); } FC_LOG_AND_RETHROW(); BOOST_AUTO_TEST_CASE(opp_inbound_contract_client_construction) try { @@ -220,21 +291,145 @@ BOOST_AUTO_TEST_CASE(epoch_in_abi_encoding_with_bytes_param) try { ); } FC_LOG_AND_RETHROW(); -BOOST_AUTO_TEST_CASE(emit_outbound_envelope_abi_encoding_zero_params) try { +BOOST_AUTO_TEST_CASE(emit_outbound_envelope_abi_encoding_wire_epoch) try { auto abis = load_abi_fixture(opp_abi_fixture); const eth::abi::contract* emit_abi = nullptr; for (auto& c : abis) { - if (c.name == "emitOutboundEnvelope") { emit_abi = &c; break; } + if (c.name == emit_outbound_envelope_abi_name) { emit_abi = &c; break; } } BOOST_REQUIRE(emit_abi != nullptr); - BOOST_CHECK_EQUAL(emit_abi->inputs.size(), 0u); + BOOST_REQUIRE_EQUAL(emit_abi->inputs.size(), 1u); + BOOST_CHECK(emit_abi->inputs[0].type == eth::abi::data_type::uint32); - // Encoding with 0 params should succeed (no inputs expected) - auto encoded = contract_encode_data(*emit_abi, std::vector{}); + // Encoding carries the WIRE epoch expected by the Solidity recovery call. + auto encoded = contract_encode_data( + *emit_abi, + std::vector{fc::variant(uint64_t{test_wire_epoch})}); BOOST_CHECK(!encoded.empty()); - // Should be just the 4-byte selector - BOOST_CHECK_EQUAL(encoded.size(), 8u); // hex chars = 4 bytes * 2 + BOOST_CHECK(encoded.substr(0, evm_function_selector_hex_chars) == emit_outbound_envelope_selector); + BOOST_CHECK_EQUAL(encoded.size(), emit_outbound_envelope_call_hex_chars); +} FC_LOG_AND_RETHROW(); + +BOOST_AUTO_TEST_CASE(emit_outbound_envelope_recovery_wrapper_forwards_wire_epoch) try { + auto abis = load_abi_fixture(opp_abi_fixture); + auto client = std::make_shared( + ethereum_client_ptr{}, + address_compat_type{std::string(test_opp_address)}, + abis); + + uint32_t observed_epoch = 0; + std::string observed_call_data; + client->emit_outbound_envelope = + [&](uint32_t& wire_epoch) -> fc::variant { + observed_epoch = wire_epoch; + observed_call_data = contract_encode_data( + client->get_abi(std::string(emit_outbound_envelope_abi_name)), + std::vector{fc::variant(uint64_t{wire_epoch})}); + return fc::variant(observed_call_data); + }; + + // Replace network submission at the typed callable boundary, then invoke + // the recovery surface exposed for operator tooling. The mock sink encodes + // with the production ABI so the assertion covers both argument forwarding + // and the exact transaction call data without requiring a live EVM node. + uint32_t wire_epoch = test_wire_epoch; + const auto result = client->emit_outbound_envelope(wire_epoch); + const auto expected_call_data = + std::string(emit_outbound_envelope_selector) + abi_word(test_wire_epoch); + BOOST_CHECK_EQUAL(observed_epoch, test_wire_epoch); + BOOST_CHECK_EQUAL(observed_call_data, expected_call_data); + BOOST_CHECK_EQUAL(result.as_string(), expected_call_data); +} FC_LOG_AND_RETHROW(); + +BOOST_AUTO_TEST_CASE(read_inbound_envelope_validates_latest_slot) try { + auto clean_app = gsl_lite::finally([]() { + appbase::application::reset_app_singleton(); + }); + auto tester = create_app(); + auto private_key_spec = to_private_key_spec(std::string(latest_slot_test_private_key)); + auto sig_provider = tester->plugin().create_provider( + std::string(latest_slot_test_entry_id), + chain_kind_ethereum, + chain_key_type_ethereum, + std::string(latest_slot_test_public_key), + private_key_spec); + + const std::string rpc_url{latest_slot_test_rpc_url}; + auto eth_client = std::make_shared( + sig_provider, + std::variant{rpc_url}, + fc::uint256{test_evm_chain_id}); + auto abis = load_abi_fixture(opp_abi_fixture); + const std::string opp_address{test_opp_address}; + auto typed_opp = eth_client->get_contract(opp_address, abis); + + auto entry = std::make_shared(); + entry->id = latest_slot_test_entry_id; + entry->url = rpc_url; + entry->signature_provider = sig_provider; + entry->client = eth_client; + entry->chain_id = test_evm_chain_id; + + sysio::outpost_ethereum_client outpost( + entry, + opp_address, + "", + "", + abis, + test_outpost_chain_code, + test_evm_chain_id); + + auto set_response = [&](std::string response) { + typed_opp->get_latest_outbound_envelope = + [response = std::move(response)](const block_number_or_tag_t& block) -> fc::variant { + BOOST_CHECK(std::holds_alternative(block)); + BOOST_CHECK(std::get(block) == block_tag_t::finalized); + return fc::variant(response); + }; + }; + + const auto matching = serialize_envelope(test_wire_epoch); + set_response(encode_latest_outbound_result(test_wire_epoch, matching)); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)) == matching); + + set_response(encode_latest_outbound_result(test_stale_wire_epoch, matching)); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)).empty()); + + set_response(encode_latest_outbound_result(test_wire_epoch, {})); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)).empty()); + + set_response(encode_latest_outbound_result( + test_wire_epoch, + std::vector{malformed_envelope_byte})); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)).empty()); + + set_response(encode_latest_outbound_result( + test_wire_epoch, + serialize_envelope(test_different_wire_epoch))); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)).empty()); + + // A bytes value one byte over the envelope cap necessarily makes the + // complete `(uint32, bytes)` ABI result exceed the RPC hex-length cap. + // This case therefore verifies the pre-decode RPC boundary, not the later + // decoded-byte defense-in-depth check. + std::vector rpc_length_oversized( + rpc_length_oversized_envelope_bytes, + oversized_envelope_fill_byte); + set_response(encode_latest_outbound_result(test_wire_epoch, rpc_length_oversized)); + BOOST_CHECK(outpost.read_inbound_envelope( + test_wire_epoch, + fc::seconds(test_rpc_deadline_seconds)).empty()); } FC_LOG_AND_RETHROW(); // --------------------------------------------------------------------------- diff --git a/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin.hpp b/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin.hpp index afc0b9f2f5..486db4fc6b 100644 --- a/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin.hpp +++ b/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin.hpp @@ -131,6 +131,9 @@ struct opp_solana_outpost_client : fc::network::solana::solana_program_client { /// `epoch_index`. Rent returns to the original uploader. solana_program_tx_fn cleanup_envelope_chunks; /// `emit_outbound_envelope(wire_epoch_index: u32) -> signature`. + /// Recovery/admin escape hatch only. The steady-state batch-operator relay + /// never calls it because the consensus-reaching terminal `epoch_in` emits + /// the outbound envelope inline. solana_program_tx_fn emit_outbound_envelope; /// `add_attestation(attestation_type: i32, data: bytes) -> signature`. solana_program_tx_fn> add_attestation; @@ -321,6 +324,8 @@ struct opp_solana_outpost_client : fc::network::solana::solana_program_client { program_invoke_data_items params = {fc::variant(epoch_index)}; return execute_tx_and_confirm(instr, resolve_accounts(instr, params, overrides), params); }) + // Retained as the program's explicit recovery/admin escape hatch. The + // steady-state relay intentionally uses only terminal `epoch_in`. , emit_outbound_envelope([this](uint32_t wire_epoch_index) -> std::string { account_overrides_t overrides = { {"config", config_pda}, diff --git a/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin/outpost_solana_client.hpp b/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin/outpost_solana_client.hpp index 3a6d4cc363..4b62a65410 100644 --- a/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin/outpost_solana_client.hpp +++ b/plugins/outpost_solana_client_plugin/include/sysio/outpost_solana_client_plugin/outpost_solana_client.hpp @@ -35,11 +35,10 @@ inline constexpr size_t SOLANA_MAX_CHUNK_BYTES = 672; * signature provider) with the outpost program id + IDL to implement the * chain-agnostic SPI. * - * The `deliver_outbound_envelope` implementation preserves the two-step - * Solana pattern: call `epoch_in` to stage the incoming envelope, then - * `emit_outbound_envelope` so the outpost emits any queued outgoing ones — - * the return value is the signature of the second call (the one that signals - * "work done for this epoch"). + * `deliver_outbound_envelope` stages chunks through `epoch_in`, then sends a + * zero-data terminal `epoch_in` call. When that call reaches consensus the + * program emits its queued outbound envelope inline; the return value is the + * terminal call's signature. * * Constructed by `outpost_solana_client_plugin::create_outpost_client` — * `batch_operator_plugin` never builds one directly. diff --git a/plugins/outpost_solana_client_plugin/src/outpost_solana_client.cpp b/plugins/outpost_solana_client_plugin/src/outpost_solana_client.cpp index a01e79ce57..4b7a82bdc7 100644 --- a/plugins/outpost_solana_client_plugin/src/outpost_solana_client.cpp +++ b/plugins/outpost_solana_client_plugin/src/outpost_solana_client.cpp @@ -636,7 +636,9 @@ std::string outpost_solana_client::deliver_outbound_envelope( // attestations into a packed envelope and writes it to the // `latest_outbound_envelope` PDA), and (c) self-closes this // operator's chunk_buffer. No separate `emit_outbound_envelope` or - // `cleanup_envelope_chunks` tx is needed in the relay. + // `cleanup_envelope_chunks` tx is needed in the steady-state relay; the + // typed program client retains them as explicit recovery and maintenance + // surfaces. std::string last_sig; for (uint16_t i = 0; i < total_chunks; ++i) { throw_if_past_deadline(deadline_abs, OP_EPOCH_IN); diff --git a/tests/fixtures/ethereum-abi-opp-current.json b/tests/fixtures/ethereum-abi-opp-current.json index 4a0888c979..ab1e98df9e 100644 --- a/tests/fixtures/ethereum-abi-opp-current.json +++ b/tests/fixtures/ethereum-abi-opp-current.json @@ -83,6 +83,22 @@ "name": "NotInitializing", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "actualBytes", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxBytes", + "type": "uint256" + } + ], + "name": "OPP_EnvelopeOverCap", + "type": "error" + }, { "inputs": [ { @@ -99,6 +115,33 @@ "name": "OPP_EpochHashMismatch", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "epochIndex", + "type": "uint32" + } + ], + "name": "OPP_InboundEnvelopeRecordMissing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "epochIndex", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "evictBoundary", + "type": "uint32" + } + ], + "name": "OPP_InboundEnvelopeStillInRetention", + "type": "error" + }, { "inputs": [ { @@ -131,6 +174,11 @@ "name": "OPP_InvalidOPPAddress", "type": "error" }, + { + "inputs": [], + "name": "OPP_InvalidRetentionConfig", + "type": "error" + }, { "inputs": [ { @@ -157,6 +205,17 @@ "name": "OPP_NoPendingAttestations", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "previousEnvelopeHash", + "type": "bytes" + } + ], + "name": "OPP_NonCanonicalPreviousEpochHash", + "type": "error" + }, { "inputs": [ { @@ -174,29 +233,24 @@ "type": "error" }, { - "inputs": [], - "name": "OPP_NotSending", + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + } + ], + "name": "OPP_NotActiveOperator", "type": "error" }, { "inputs": [], - "name": "OPP_OPPAddressNotSet", + "name": "OPP_NotSending", "type": "error" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "expected", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "actual", - "type": "bytes32" - } - ], - "name": "OPP_PayloadChecksumMismatch", + "inputs": [], + "name": "OPP_OPPAddressNotSet", "type": "error" }, { @@ -207,34 +261,28 @@ "type": "uint32" }, { - "internalType": "uint256", - "name": "messageCount", - "type": "uint256" + "internalType": "address", + "name": "caller", + "type": "address" } ], - "name": "OPP_PreviousEpochPendingMessages", + "name": "OPP_OperatorAlreadyDelivered", "type": "error" }, { "inputs": [ { - "internalType": "uint32", - "name": "epochIndex", - "type": "uint32" - } - ], - "name": "OPP_PreviousEpochSent", - "type": "error" - }, - { - "inputs": [ + "internalType": "bytes32", + "name": "expected", + "type": "bytes32" + }, { - "internalType": "uint32", - "name": "epochIndex", - "type": "uint32" + "internalType": "bytes32", + "name": "actual", + "type": "bytes32" } ], - "name": "OPP_PreviousEpochUnsent", + "name": "OPP_PayloadChecksumMismatch", "type": "error" }, { @@ -248,22 +296,6 @@ "name": "OPP_SendStackError", "type": "error" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expectedMaxMessages", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "actualMessages", - "type": "uint256" - } - ], - "name": "OPP_TooManyMessages", - "type": "error" - }, { "inputs": [ { @@ -291,6 +323,27 @@ "name": "OPP_UnhandledAttestationType", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedChainId", + "type": "uint256" + }, + { + "internalType": "ChainKind", + "name": "actualKind", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "actualId", + "type": "uint32" + } + ], + "name": "OPP_WrongDestinationChain", + "type": "error" + }, { "inputs": [], "name": "OPP_ZeroTag", @@ -351,19 +404,6 @@ "name": "OPPEnvelope", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "OPPEpoch", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -379,7 +419,7 @@ }, { "inputs": [], - "name": "MESSAGE_EPOCH_SECS", + "name": "MAX_ENVELOPE_BYTES", "outputs": [ { "internalType": "uint256", @@ -473,7 +513,13 @@ "type": "function" }, { - "inputs": [], + "inputs": [ + { + "internalType": "uint32", + "name": "wireEpochIndex", + "type": "uint32" + } + ], "name": "emitOutboundEnvelope", "outputs": [], "stateMutability": "nonpayable", @@ -492,14 +538,32 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tag", + "type": "uint256" + } + ], + "name": "exitSendMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], - "name": "epochIndex", + "name": "getLatestOutboundEnvelope", "outputs": [ { "internalType": "uint32", - "name": "", + "name": "epoch_", "type": "uint32" + }, + { + "internalType": "bytes", + "name": "data_", + "type": "bytes" } ], "stateMutability": "view", @@ -508,21 +572,37 @@ { "inputs": [ { - "internalType": "uint256", - "name": "tag", - "type": "uint256" + "internalType": "uint32", + "name": "epochIndex_", + "type": "uint32" } ], - "name": "exitSendMode", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "finalizeEpoch", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getOutboundEnvelope", + "outputs": [ + { + "components": [ + { + "internalType": "uint32", + "name": "epochIndex", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "emittedAt", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "checksum", + "type": "bytes32" + } + ], + "internalType": "struct OPPEnvelopeRetention.EnvelopeRecord", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -544,11 +624,6 @@ "internalType": "address", "name": "_authority", "type": "address" - }, - { - "internalType": "uint256", - "name": "messageEpochSecs", - "type": "uint256" } ], "name": "initialize", @@ -597,12 +672,12 @@ }, { "inputs": [], - "name": "pendingAttestationCount", + "name": "latestOutboundEnvelope", "outputs": [ { - "internalType": "uint256", + "internalType": "bytes", "name": "", - "type": "uint256" + "type": "bytes" } ], "stateMutability": "view", @@ -610,12 +685,67 @@ }, { "inputs": [], - "name": "prevEpochSent", + "name": "latestOutboundEpoch", "outputs": [ { - "internalType": "bool", + "internalType": "uint32", "name": "", - "type": "bool" + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "name": "outboundEnvelopes", + "outputs": [ + { + "internalType": "uint32", + "name": "epochIndex", + "type": "uint32" + }, + { + "internalType": "uint64", + "name": "emittedAt", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "checksum", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "outboundRetentionConfig", + "outputs": [ + { + "internalType": "uint32", + "name": "retentionEpochs", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingAttestationCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" } ], "stateMutability": "view", @@ -634,6 +764,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint32", + "name": "epochIndex_", + "type": "uint32" + } + ], + "name": "pruneOutboundEnvelope", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "queuedMessageCount", @@ -715,28 +858,6 @@ "name": "previousMessageId", "type": "bytes" }, - { - "components": [ - { - "internalType": "Endianness", - "name": "endianness", - "type": "uint8" - }, - { - "internalType": "HashAlgorithm", - "name": "hashAlgorithm", - "type": "uint8" - }, - { - "internalType": "LengthEncoding", - "name": "lengthEncoding", - "type": "uint8" - } - ], - "internalType": "struct EncodingFlags", - "name": "encodingFlags", - "type": "tuple" - }, { "internalType": "uint32", "name": "payloadSize", @@ -852,28 +973,6 @@ "name": "previousMessageId", "type": "bytes" }, - { - "components": [ - { - "internalType": "Endianness", - "name": "endianness", - "type": "uint8" - }, - { - "internalType": "HashAlgorithm", - "name": "hashAlgorithm", - "type": "uint8" - }, - { - "internalType": "LengthEncoding", - "name": "lengthEncoding", - "type": "uint8" - } - ], - "internalType": "struct EncodingFlags", - "name": "encodingFlags", - "type": "tuple" - }, { "internalType": "uint32", "name": "payloadSize", @@ -919,25 +1018,12 @@ { "inputs": [ { - "internalType": "uint256", - "name": "secs", - "type": "uint256" - } - ], - "name": "setMessageEpochSecs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "adjustment", - "type": "uint256" + "internalType": "uint32", + "name": "retentionEpochs", + "type": "uint32" } ], - "name": "testAdvanceEpochClock", + "name": "setEnvelopeRetentionConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -961,40 +1047,48 @@ "type": "function" } ], - "bytecode": "0x60a0806040523460295730608052614657908161002f8239608051818181610a2101526135680152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806306c106f9146101b75780631e1afc48146101b257806327e935a1146101ad57806347453a2a146101a85780634f1ef286146101a357806352d1902d1461019e578063621fbd59146101995780637a9e5e4b1461019457806382ae9ef71461018f5780638fb360371461018a5780639039e4951461018557806395fabcf0146101805780639b0715001461017b578063a9e50c1014610176578063ad3cb1cc14610171578063bf7e214f1461016c578063c94c93e714610167578063cd6dc68714610162578063da55d96a1461015d578063e006490014610158578063e0c14aa814610153578063e11418b71461014e578063e36f9a0714610149578063e44efb5a14610144578063f5786b4b1461013f5763f8c7dd2c1461013a57600080fd5b611193565b610feb565b610fcb565b610fad565b610f64565b610e36565b610e18565b610df5565b610cc4565b610c93565b610c5d565b610c17565b610bdd565b610bbf565b610ba1565b610b7e565b610b2b565b610b12565b610a97565b610a79565b610a0e565b610901565b610890565b6107e1565b6106ac565b6101cc565b60009103126101c757565b600080fd5b346101c75760003660031901126101c757602063ffffffff60085416604051908152f35b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761022157604052565b6101f0565b606081019081106001600160401b0382111761022157604052565b6001600160401b03811161022157604052565b602081019081106001600160401b0382111761022157604052565b90601f801991011681019081106001600160401b0382111761022157604052565b6040519061010082018281106001600160401b0382111761022157604052565b604051906102bd82610226565b565b60ff8116036101c757565b63ffffffff8116036101c757565b35906102bd826102ca565b91908260409103126101c7576040516102fb81610206565b6020808294803561030b816102bf565b8452013591610319836102ca565b0152565b91906080838203126101c75760206103516040519261033b84610206565b6040849661034983826102e3565b8652016102e3565b910152565b6001600160401b03811161022157601f01601f191660200190565b81601f820112156101c75780359061038882610356565b92610396604051948561026f565b828452602083830101116101c757816000926020809301838601378301015290565b91908260609103126101c7576040516103d081610226565b604080829480356103e0816102bf565b845260208101356103f0816102bf565b6020850152013591610319836102bf565b35906001600160401b03821682036101c757565b6001600160401b0381116102215760051b60200190565b6004359061ffff821682036101c757565b359061ffff821682036101c757565b91909160409081818503126101c757815161046681610206565b80948235610473816102ca565b8252602092838101356001600160401b03918282116101c757019180601f840112156101c7578235906104a582610415565b966104b28151988961026f565b828852868089019360051b860101948286116101c757878101935b8685106104df57505050505050500152565b84358681116101c75782019060609081601f1984880301126101c75784519161050783610226565b6105128c850161043d565b835285840135610521816102ca565b8c840152830135918883116101c757610541878d80969581960101610371565b868201528152019401936104cd565b90604060206102bd9361057784825163ffffffff6020809260ff8151168552015116910152565b015191019063ffffffff6020809260ff8151168552015116910152565b60005b8381106105a75750506000910152565b8181015183820152602001610597565b906020916105d081518092818552858086019101610594565b601f01601f1916010190565b906106a991602081526105f3602082018351610550565b6020820151906106116101a0928360a08401526101c08301906105b7565b9160e0610685610633604087015195601f1996878783030160c08801526105b7565b61065f60608801518487019060ff60408092828151168552826020820151166020860152015116910152565b608087015163ffffffff1661014086015260a087015186868303016101608701526105b7565b60c08601516001600160401b031661018085015294015192828503019101526105b7565b90565b346101c7576003196040368201126101c757600480356001600160401b03928382116101c7576101a09082360301126101c7576106e7610290565b906106f43682850161031d565b825260848101358481116101c75761071190843691840101610371565b602083015260a48101358481116101c75761073190843691840101610371565b60408301526107433660c483016103b8565b606083015261075561012482016102d8565b60808301526101448101358481116101c75761077690843691840101610371565b60a08301526107886101648201610401565b60c0830152610184810135908482116101c757836107a99236920101610371565b60e08201526024359283116101c7576107cb6107d1926107dd9436910161044c565b906113a4565b604051918291826105dc565b0390f35b346101c75760203660031901126101c7576004356107ff36336120d9565b8015610819576004541561080f57005b6004556000600355005b604051636ad43cc360e11b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b6010548110156108665760106000526000805160206145c28339815191520190600090565b61082b565b600f5481101561086657600f6000526000805160206146028339815191520190600090565b346101c75760203660031901126101c7576004356006548110156101c75760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01546040516001600160a01b039091168152602090f35b600435906001600160a01b03821682036101c757565b60403660031901126101c7576109156108eb565b6024356001600160401b0381116101c757610934903690600401610371565b9061093d61355e565b61094736336120d9565b61094f61355e565b6040516352d1902d60e01b8152916020836004816001600160a01b0386165afa600093816109dd575b506109a257604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b0390fd5b906000805160206145a283398151915283036109c4576109c29250613e2c565b005b604051632a87526960e21b815260048101849052602490fd5b610a0091945060203d602011610a07575b6109f8818361026f565b81019061125a565b9238610978565b503d6109ee565b346101c75760003660031901126101c7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610a675760206040516000805160206145a28339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101c75760003660031901126101c7576020600054604051908152f35b346101c75760203660031901126101c757610ab06108eb565b600080516020614582833981519152546001600160a01b03919082163303610afb57803b15610ae2576109c2906121f8565b6040516361798f2f60e11b815291166004820152602490fd5b60405162d1953b60e31b8152336004820152602490fd5b346101c75760003660031901126101c7576109c2611630565b346101c75760003660031901126101c7576000805160206145828339815191525460a01c60ff1615610b75576020638fb3603760e01b5b6040516001600160e01b03199091168152f35b60206000610b62565b346101c75760203660031901126101c757610b9936336120d9565b600435600755005b346101c75760003660031901126101c7576020600354604051908152f35b346101c75760003660031901126101c7576020600754604051908152f35b346101c75760003660031901126101c75760206001600160401b0360015416604051908152f35b60405190610c1182610254565b60008252565b346101c75760003660031901126101c7576107dd604051610c3781610206565b60058152640352e302e360dc1b60208201526040519182916020835260208301906105b7565b346101c75760003660031901126101c757600080516020614582833981519152546040516001600160a01b039091168152602090f35b346101c75760203660031901126101c7576004356000526005602052602060ff604060002054166040519015158152f35b346101c75760403660031901126101c757610cdd6108eb565b6000805160206145e283398151915254906001600160401b0360ff8360401c1615921680159081610ded575b6001149081610de3575b159081610dda575b50610dc8576000805160206145e2833981519152805467ffffffffffffffff19166001179055610d549082610da3575b602435906129f8565b610d5a57005b6000805160206145e2833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6000805160206145e2833981519152805460ff60401b1916600160401b179055610d4b565b60405163f92ee8a960e01b8152600490fd5b90501538610d1b565b303b159150610d13565b839150610d09565b346101c75760003660031901126101c757602060ff601754166040519015158152f35b346101c75760003660031901126101c7576020601954604051908152f35b346101c7576040806003193601126101c757610e5061042c565b6024356001600160401b0381116101c757610e6f903690600401610371565b9160045415610f5457610e8236336120d9565b60008051602061458283398151915254610eb290610ea6906001600160a01b031681565b6001600160a01b031690565b81516368fc2b7760e11b815261ffff841662010000176004820152336024820152908290829060449082905afa908115610f4f57600091610f21575b5015610efe576109c28383612d5a565b51639a28d60760e01b815233600482015261ffff91909116602482015260449150fd5b610f419150823d8411610f48575b610f39818361026f565b81019061178f565b5038610eee565b503d610f2f565b611315565b5163738c481160e01b8152600490fd5b346101c75760203660031901126101c757600435610f8236336120d9565b60115480610f9e57504203428111610f9957601155005b6115f3565b908103908111610f9957601155005b346101c75760003660031901126101c7576020600454604051908152f35b346101c75760003660031901126101c75760206004541515604051908152f35b346101c7576020806003193601126101c75760049081358254156111825761101336336120d9565b80156111715782541461102257005b6000825560035491821561116257506110396111e7565b91611045600054611ee4565b604084810191909152426001600160401b031660c08501529061106661191f565b600181529161107482612df3565b84840190815260005b8381106110e95750505050611095816110cc946113a4565b916110b96110a582850151611ed0565b60c08501516001600160401b031690613d21565b6110c1611939565b928352820152613041565b6110df6110da60195461240d565b601955565b6109c26000600355565b8061115b816111026110fc600195612b2d565b50612e5b565b8961110f825161ffff1690565b910151611144611123825163ffffffff1690565b61113861112e6102b0565b61ffff9095168552565b63ffffffff16838d0152565b8782015285519061115583836119b8565b526119b8565b500161107d565b60405163783bc0f160e11b8152fd5b604051636ad43cc360e11b81528390fd5b60405163738c481160e01b81528390fd5b346101c75760003660031901126101c7576109c2611dbb565b604051906111b982610206565b60006020838281520152565b604051906111d282610206565b816111db6111ac565b815260206103516111ac565b6040519061010082018281106001600160401b0382111761022157604052606060e0836112126111c5565b815282602082015282604082015260405161122c81610226565b60008152600060208201526000604082015283820152600060808201528260a0820152600060c08201520152565b908160209103126101c7575190565b90602080835260609060608401908063ffffffff94858151168288015201519460408080830152865180945260808201908360808660051b8501019801956000935b8685106112be5750505050505050505090565b909192939495969799988680611300600193868f89908f607f198a8603018d52519061ffff8251168552868201511686850152015191818a82015201906105b7565b9b9c9a019897969190910194019291906112ab565b6040513d6000823e3d90fd5b6020818303126101c7578051906001600160401b0382116101c7570181601f820112156101c757805161135381610356565b92611361604051948561026f565b818452602082840101116101c7576106a99160208085019101610594565b90916113966106a9936040845260408401906105b7565b9160208184039101526105b7565b906113ad6111e7565b5073__$b91d2ad766fd07dc99f56c1a0b020615bb$__60405163765809ab60e11b81526020928382806113e38460048301611269565b0381865af4918215610f4f5760009261156f575b5060a0850180518051611532575061142a916114209161141961143795611ee4565b9052611f11565b5163ffffffff1690565b63ffffffff166080850152565b60405162409a0960e81b81526000818061145487600483016105dc565b0381855af4908115610f4f57600091611511575b5083830180518051806114da5750505281604051809263b93612a760e01b8252818061149788600483016105dc565b03915af4908115610f4f576114b5926000926114bd575b5050611ee4565b60e082015290565b6114d39250803d10610a07576109f8818361026f565b38806114ae565b9150938092935084012090825190830120036114f557505090565b61099e604051928392630ca2e06d60e11b84526004840161137f565b61152c913d8091833e611524818361026f565b810190611321565b38611468565b905061153e9150611ed0565b9080820361154d575050611437565b604051631d97afef60e31b815260048101919091526024810191909152604490fd5b611587919250843d8611610a07576109f8818361026f565b90386113f7565b6040519061014082018281106001600160401b03821117610221576040526060808352610120836115bd6111c5565b602082015260006040820152600083820152600060808201528260a08201528260c08201528260e0820152826101008201520152565b634e487b7160e01b600052601160045260246000fd5b63ffffffff9081166000190191908211610f9957565b9060206106a99281815201906105b7565b60175460ff16611782575b60175460ff16611740577f17c789cd9b6ebb5030c7b906ed9f08f64563805e0aeab6d5f53dda9305a8348b61171461170861167461241c565b6116cb61167f61158e565b916116a761169a61169560085463ffffffff1690565b611609565b63ffffffff166060850152565b426001600160401b031660408401526116c1601354611ee4565b60c0840152611ee4565b60a08201526116db601554611ee4565b60e08201526116eb601654611ee4565b610100820152611703600160ff196017541617601755565b61252d565b6040519182918261161f565b0390a161171f612251565b61173261172e60175460ff1690565b1590565b61173857565b6102bd611630565b61099e63ffffffff60001961175a60085463ffffffff1690565b0116604051918291630642fe1b60e11b83526004830191909163ffffffff6020820193169052565b61178a612251565b61163b565b91908260409103126101c757815180151581036101c7576020909201516106a9816102ca565b600019810191908211610f9957565b600119810191908211610f9957565b601854156108665760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90600090565b60185481101561086657600b906018600052027fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b90600182811c92168015611872575b602083101461185c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611851565b9060405191826000825461188f81611842565b908184526020946001916001811690816000146118fd57506001146118be575b5050506102bd9250038361026f565b600090815285812095935091905b8183106118e55750506102bd93508201013880806118af565b855488840185015294850194879450918301916118cc565b925050506102bd94925060ff191682840152151560051b8201013880806118af565b6040519061192c82610206565b6060602083600081520152565b6040519061194682610206565b8161194f6111e7565b8152602061035161191f565b9061196582610415565b611972604051918261026f565b8281528092611983601f1991610415565b019060005b82811061199457505050565b60209061199f611939565b82828501015201611988565b8051156108665760200190565b80518210156108665760209160051b010190565b906040516119d981610206565b915460ff8116835260081c63ffffffff166020830152565b906040516119fe81610206565b602061035160018395611a10816119cc565b8552016119cc565b90604051611a2581610226565b604060ff8294548181168452818160081c16602085015260101c16910152565b9060408051611a5381610206565b809363ffffffff8082541683526001809201805491611a7183610415565b95611a7f604051978861026f565b83875260209160208801936000526020600020916000945b868610611aac57505050505050505060200152565b60028589928451611abc81610226565b86885461ffff8116835260101c1683820152611ad985890161187c565b86820152815201940195019492611a97565b90604051611af881610206565b602061035160098395611b09610290565b611b12826119f1565b8152611b206002830161187c565b85820152611b306003830161187c565b6040820152611b4160048301611a18565b6060820152611b67611b5a600584015463ffffffff1690565b63ffffffff166080830152565b611b736006830161187c565b60a0820152611b9f611b8f60078401546001600160401b031690565b6001600160401b031660c0830152565b611bab6008830161187c565b60e0820152855201611a45565b634e487b7160e01b600052600060045260246000fd5b818110611bd9575050565b60008155600101611bce565b611bef8154611842565b9081611bf9575050565b81601f60009311600114611c0b575055565b908083918252611c2a601f60208420940160051c840160018501611bce565b5555565b600160401b821161022157805490828155818310611c4b57505050565b6001916001600160ff1b038082168203610f995784168403610f995760009160005260206000209060011b81019360011b015b838110611c8b5750505050565b808260029255611c9c848201611be5565b01611c7e565b600090600081556001809101918254926000815583611cc2575b50505050565b6001600160ff1b0384168403610f995760005260206000209260011b8301925b83811015611cbc57808260029255611cfb848201611be5565b01611ce2565b6018546000908160185580611d14575050565b600b9181600b0291600b830403610f9957601881527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e918201915b828110611d5c5750505050565b8082859255826001820155611d7360028201611be5565b611d7f60038201611be5565b826004820155826005820155611d9760068201611be5565b826007820155611da960088201611be5565b611db560098201611ca2565b01611d4f565b6019548015611ecd57611dcc61158e565b90611dec611ddf60085463ffffffff1690565b63ffffffff166060840152565b426001600160401b03166040830152611e06601354611ee4565b60c0830152611e1f6002611e186117d3565b500161187c565b60e0830152611e3a6002611e18611e35846117b5565b611807565b610100830152611e498161195b565b610120830190815260005b828110611ea057505050611e8b6117087fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d8879261252d565b0390a1611e96611d01565b6102bd6000601955565b80611ec681611eb0600194611807565b50611ebc865191611aeb565b61115583836119b8565b5001611e54565b50565b805115611ede576020015190565b50600090565b604051906020820152602081526106a981610206565b90611f0d60209282815194859201610594565b0190565b611f4a91611f1d610c04565b90611f266131a9565b611f44611f9e604092604051978891611f4460209889850190611efa565b90611efa565b0396611f5e601f199889810183528261026f565b611f92611f83611f7e611f758a5163ffffffff1690565b63ffffffff1690565b613349565b60405194859389850190611efa565b0387810183528261026f565b916000925b84860180515185101561205b57611f44612051611f4461204589956120378d612005611fff8d60019a611ff98f611fed8f91611f44611fe06131c0565b91519b8c94850190611efa565b0386810189528861026f565b516119b8565b516133ca565b9261202b61201d611f7e86516001600160401b031690565b8d519788938d850190611efa565b0390810185528461026f565b885194859388850190611efa565b038a810183528261026f565b9401939050611fa3565b5095509350505050565b6004116101c757600090600490565b6001600160e01b0319903581811693926004811061209157505050565b60040360031b82901b16169150565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b6000805160206145828339815191528054612112906001600160a01b031661210961210386612065565b90612074565b908430916134cf565b901561211e5750505050565b63ffffffff16156121d857600080516020614582833981519152805460ff60a01b1916600160a01b17905561216090610ea6908190546001600160a01b031690565b91823b156101c75761218c9260009283604051809681958294634a63ebf760e11b8452600484016120a0565b03925af18015610f4f576121bf575b50600080516020614582833981519152805460ff60a01b1916905538808080611cbc565b806121cc6121d292610241565b806101bc565b3861219b565b60405162d1953b60e31b81526001600160a01b0383166004820152602490fd5b60008051602061458283398151915280546001600160a01b0319166001600160a01b0390921691821790556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602090a1565b601154156123b0576011546007548101809111610f995742101561227157565b61228061172e60175460ff1690565b61236e5761229360ff1960175416601755565b61229e600954600a55565b6122a9600b54600c55565b6122c16122b46135b8565b6122bc613780565b6138d0565b6122cb6000600955565b6122d56000600b55565b6122de42601155565b61230f6122f36001546001600160401b031690565b6001600160401b03166001600160401b03196012541617601255565b61231a601454601555565b612325600054601655565b61233460ff1960175416601755565b61233e6000601455565b6102bd61235861235360085463ffffffff1690565b613925565b63ffffffff1663ffffffff196008541617600855565b61099e63ffffffff60001961238860085463ffffffff1690565b0116604051918291631c70a36560e21b83526004830191909163ffffffff6020820193169052565b42601155565b6040516123c281610254565b60008152906000368137565b906123d882610415565b6123e5604051918261026f565b82815280926123f6601f1991610415565b0190602036910137565b8015610f99576000190190565b6000198114610f995760010190565b600a5490600c5491801561252657612433836123ce565b9260005b8181106124fc5750905b600190818111806124f3575b156124e25780821682036124a8576124a09061248e61247461246e866117b5565b886119b8565b51612487612481876117b5565b896119b8565b519061393a565b61249a61246e866117b5565b5261240d565b905b1c612441565b9091806124ca6124bd61246e6124dc946117c4565b51612487612481846117b5565b6124d661246e836117c4565b52612400565b916124a2565b505050906124ef906119ab565b5190565b5081831161244d565b8061251561250b600193610841565b90549060031b1c90565b61251f82886119b8565b5201612437565b5060009150565b612535610c04565b61253d6131d3565b9260408051809560209485830161255391611efa565b61255c91611efa565b0394601f19958681018252612571908261026f565b845161257c90613a33565b90825191829186830161258e91611efa565b61259791611efa565b0386810182526125a7908261026f565b6125af6131c0565b9082519182918683016125c191611efa565b6125ca91611efa565b0386810182526125da908261026f565b838501516125e790613a83565b9081516125fa906001600160401b031690565b61260390613349565b90835191829187830161261591611efa565b61261e91611efa565b03878101825261262e908261026f565b825191829186830161263f91611efa565b61264891611efa565b038681018252612658908261026f565b6126606131e6565b90825191829186830161267291611efa565b61267b91611efa565b03868101825261268b908261026f565b848201516001600160401b03166126a190613349565b9082519182918683016126b391611efa565b6126bc91611efa565b0386810182526126cc908261026f565b6126d46131f9565b9082519182918683016126e691611efa565b6126ef91611efa565b0386810182526126ff908261026f565b60608501516127139063ffffffff16613349565b90825191829186830161272591611efa565b61272e91611efa565b03868101825261273e908261026f565b61274661320c565b90825191829186830161275891611efa565b61276191611efa565b038681018252612771908261026f565b60808501516127859063ffffffff16613349565b90825191829186830161279791611efa565b6127a091611efa565b0386810182526127b0908261026f565b6127b861321f565b9082519182918683016127ca91611efa565b6127d391611efa565b0386810182526127e3908261026f565b60a08501516127f190613a33565b90825191829186830161280391611efa565b61280c91611efa565b03868101825261281c908261026f565b612824613232565b90825191829186830161283691611efa565b61283f91611efa565b03868101825261284f908261026f565b60c085015161285d90613a33565b90825191829186830161286f91611efa565b61287891611efa565b038681018252612888908261026f565b612890613278565b9082519182918683016128a291611efa565b6128ab91611efa565b0386810182526128bb908261026f565b60e08501516128c990613a33565b9082519182918683016128db91611efa565b6128e491611efa565b0386810182526128f4908261026f565b6128fc613297565b90825191829186830161290e91611efa565b61291791611efa565b038681018252612927908261026f565b61010085015161293690613a33565b90825191829186830161294891611efa565b61295191611efa565b038681018252612961908261026f565b916000925b610120860180515185101561205b57611f446129ee610120936120456129b36129ad8a6001978f611ff9908f6129a18f611f44611fe06132b6565b0390810188528761026f565b51613bf2565b6129e08d8c61202b8c611f446129d3611f7e88516001600160401b031690565b9151988994850190611efa565b88519485938c850190611efa565b9401939050612966565b612a2190612a04613cf2565b612a0c613cf2565b612a14613cf2565b612a1c613cf2565b6121f8565b612a29613cf2565b612a31613cf2565b612a396123b6565b8051906001600160401b039182811161022157612a5581613614565b6020809201600d60005260005b828110612afb57505050612a746123b6565b805192831161022157602090612a8984613678565b0190600e60005260005b838110612ac957505050506102bd90612ab4600160ff196017541617601755565b612abc6137e4565b612ac461385a565b600755565b82517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd82015591810191600101612a93565b81517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb582015590830190600101612a62565b60025481101561086657600260005260011b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b9190601f8111612b7657505050565b6102bd926000526020600020906020601f840160051c83019310612ba2575b601f0160051c0190611bce565b9091508190612b95565b91909182516001600160401b03811161022157612bd381612bcd8454611842565b84612b67565b602080601f8311600114612c1657508190612c07939495600092612c0b575b50508160011b916000199060031b1c19161790565b9055565b015190503880612bf2565b90601f19831695612c2c85600052602060002090565b926000905b888210612c6957505083600195969710612c50575b505050811b019055565b015160001960f88460031b161c19169055388080612c46565b80600185968294968601518155019501930190612c31565b929190612d55578051835461ffff191661ffff91909116178355600180930190602080910151938451916001600160401b03831161022157612ccd83612cc78654611842565b86612b67565b602091601f8411600114612d015750508190612c07939495600092612c0b5750508160011b916000199060031b1c19161790565b95601f92919219841696612d1a86600052602060002090565b936000915b898310612d3e5750505083600195969710612c5057505050811b019055565b838501518655948501949381019391810191612d1f565b611bb8565b60025491600354808411600014612db057506102bd9250612d8960405192612d8184610206565b61ffff168352565b6020820152612daa600354612da5612da08261240d565b600355565b612b2d565b90612c81565b612db99061240d565b60035561ffff60405192612dcc84610206565b1682526020820152600160401b82101561022157612daa8260016102bd9401600255612b2d565b90612dfd82610415565b6040612e0c604051928361026f565b8382528193612e1d601f1991610415565b019160009060005b848110612e33575050505050565b6020908451612e4181610226565b848152828581830152606087830152828501015201612e25565b90604051612e6881610206565b60206103516001839561ffff81541685520161187c565b81518051825460ff191660ff9190911617825560200151602080600184549464ffffffff0095869564ffffffff001996879160081b16911617815501940151612ed660ff825116869060ff1660ff19825416179055565b01519183549260081b169116179055565b8151815463ffffffff191663ffffffff919091161781556001809101916020809101519080825192612f198487611c2e565b0190600094855280852085925b848410612f365750505050505050565b8051805183548583015165ffffffff000060109190911b1661ffff90921665ffffffffffff19909116171783556040015180519187840191906001600160401b03841161022157828692612f8f86612bcd8d9754611842565b83908c601f8811600114612fd15796612fc29281926002989992612c0b5750508160011b916000199060031b1c19161790565b90555b01920193019290612f26565b969190601f198316612fe885600052602060002090565b985b8181106130285750918798918460029995941061300f575b505050811b019055612fc5565b015160001960f88460031b161c19169055388080613002565b838301518a5597909801978d978b979384019301612fea565b601854600160401b811015610221578060016130609201601855611807565b612d5557600960208361316c60e06102bd965161307e815188612e7f565b61308e8582015160028901612bac565b61309f604082015160038901612bac565b6130ed6060820151600489018151815460ff191660ff91909116178155906020810151825460409092015162ffff001990921660089190911b61ff00161760109190911b62ff000016179055565b61311a613101608083015163ffffffff1690565b600589019063ffffffff1663ffffffff19825416179055565b61312b60a082015160068901612bac565b61316161314260c08301516001600160401b031690565b60078901906001600160401b03166001600160401b0319825416179055565b015160088601612bac565b01519101612ee7565b6040519061318282610206565b6001825260203681840137565b6040519061319c82610206565b600a825260203681840137565b6131b1613175565b60086131bc826119ab565b5390565b6131c8613175565b60126131bc826119ab565b6131db613175565b600a6131bc826119ab565b6131ee613175565b60286131bc826119ab565b613201613175565b60306131bc826119ab565b613214613175565b60386131bc826119ab565b613227613175565b607a6131bc826119ab565b61323a61318f565b60a260005b607f808311156132645790608060019284161760208286010153019060071c9061323f565b50607f600192166020828501015301815290565b61328061318f565b60f260016000826020850153019060071c9061323f565b61329f61318f565b60fa60016000826020850153019060071c9061323f565b6132be61318f565b6101426001600060c26020850153019060071c9061323f565b6132df613175565b60106131bc826119ab565b6132f2613175565b601a6131bc826119ab565b613305613175565b60226131bc826119ab565b613318613175565b60326131bc826119ab565b61332b613175565b60426131bc826119ab565b61333e613175565b60186131bc826119ab565b9060809160806001600160401b038216106133a55761336661318f565b60005b607f8084111561338d57908560019285161760208285010153019160071c91613369565b5090929350607f600192166020828501015301815290565b9091506133b0613175565b9060f81b6001600160f81b03191660001a6131bc826119ab565b6106a961340b611f44926134c36134af611f446134b66133e8610c04565b946133f16131a9565b9060409485928351998a91611f4460209b8c850190611efa565b039861341f601f199a8b810183528261026f565b61345e89613452613442611f7e61343b61343b895161ffff1690565b61ffff1690565b611f448851958694850190611efa565b038b810183528261026f565b61346d896134526134426132d7565b61348a89613452613442611f7e611f758489015163ffffffff1690565b6134a36134956132ea565b85519d8e938c850190611efa565b038981018c528b61026f565b0151613a33565b9151968794850190611efa565b0390810183528261026f565b60405163b700961360e01b602082019081526001600160a01b0393841660248301529290931660448401526001600160e01b03199093166064808401919091528252600093849390928492909160a08301916001600160401b0383118484101761022157604093859385528380528360205251915afa61354c5750565b9150915051906020518060201c150290565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811630811491821561359c575b5050610a6757565b6000805160206145a28339815191525416141590503880613594565b6040519060105480835282602091602082019060106000526000805160206145c2833981519152936000905b8282106135fa575050506102bd9250038361026f565b8554845260019586019588955093810193909101906135e4565b600160401b811161022157600d549080600d55818110613632575050565b600090600d6000527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb592830192015b82811061366d57505050565b818155600101613661565b600160401b811161022157600e549080600e55818110613696575050565b600090600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd92830192015b8281106136d157505050565b8181556001016136c5565b600160401b81116102215760105490806010558181106136fa575050565b60009060106000526000805160206145c283398151915292830192015b82811061372357505050565b818155600101613717565b600160401b811161022157600f549080600f5581811061374c575050565b600090600f60005260008051602061460283398151915292830192015b82811061377557505050565b818155600101613769565b600f546001600160401b0381116102215761379a816136dc565b6010600090815260008051602061460283398151915280545b8383106137c05750505050565b60018091920192835492816000805160206145c283398151915201550191906137b3565b600d546001600160401b038111610221576137fe8161372e565b600f60009081527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb580545b8383106138365750505050565b60018091920192835492816000805160206146028339815191520155019190613829565b600e546001600160401b03811161022157613874816136dc565b601060009081527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd80545b8383106138ac5750505050565b60018091920192835492816000805160206145c2833981519152015501919061389f565b8051906001600160401b038211610221576138ea8261372e565b602080910190600f60005260005b8381106139055750505050565b8251600080516020614602833981519152820155918101916001016138f8565b90600163ffffffff80931601918211610f9957565b6040516334509dd160e01b8152600481019190915273__$398d4f030862acab53d338aebf0b4256d7$__916020908183602481875af4928315610f4f57600093613a0e575b506040516333aec0ad60e21b815260048101919091529192819083908180602481015b03915af4918215610f4f576000926139eb575b506139e5906139d7604051938492830195869091604092825260208201520190565b03601f19810183528261026f565b51902090565b819250613a07906139e5923d8511610a07576109f8818361026f565b91906139b5565b6139a2935090613a2b8392833d8511610a07576109f8818361026f565b93509061397f565b6106a96020613a4b6001600160401b03845116613349565b6040519381613a638693518092868087019101610594565b8201613a7782518093868085019101610594565b0103808452018261026f565b613a8b610c04565b90613a946131d3565b6040805193846020938492838301613aab91611efa565b613ab491611efa565b0393601f19948581018752613ac9908761026f565b8051613ad490613ed0565b958651613ae7906001600160401b031690565b613af090613349565b908451918291858301613b0291611efa565b613b0b91611efa565b038681018252613b1b908261026f565b8351968791848301613b2c91611efa565b613b3591611efa565b038581018752613b45908761026f565b613b4d6131c0565b958351968791848301613b5f91611efa565b613b6891611efa565b038581018752613b78908761026f565b0151613b8390613ed0565b908151613b96906001600160401b031690565b613b9f90613349565b948151958691858301613bb191611efa565b613bba91611efa565b038481018652613bca908661026f565b519384928301613bd991611efa565b613be291611efa565b0390810182526106a9908261026f565b613bfa610c04565b90613c036131d3565b6040805193846020938492838301613c1a91611efa565b613c2391611efa565b0393601f19948581018752613c38908761026f565b8051613c4390613f88565b958651613c56906001600160401b031690565b613c5f90613349565b908451918291858301613c7191611efa565b613c7a91611efa565b038681018252613c8a908261026f565b8351968791848301613c9b91611efa565b613ca491611efa565b038581018752613cb4908761026f565b613cbc6131c0565b958351968791848301613cce91611efa565b613cd791611efa565b038581018752613ce7908761026f565b0151613b8390611f11565b60ff6000805160206145e28339815191525460401c1615613d0f57565b604051631afcd79f60e31b8152600490fd5b90613d2a612251565b60145415613e23575b816000556001600160401b03600191166001600160401b03196001541617600155613d5f60095461240d565b613d6881600955565b90613d74600b5461240d565b92600f54613d81856117b5565b1015613e1257613db590613d9c613d97866117b5565b61086b565b90919082549060031b91821b91600019901b1916179055565b9190915b80831615613dc85750600b5550565b9080613e03613df7613de261250b613d97613e08966117c4565b613df161250b613d97866117b5565b9061393a565b613d9c613d97846117c4565b612400565b91811c9190613db9565b613e1b90614374565b919091613db9565b81601455613d33565b90813b15613eaf576000805160206145a283398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115613e9457611ecd916143aa565b505034613e9d57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b6106a9611f44611f446134c3613f78611f7e611f756020611f4498613f6d611f44613f47613efc610c04565b613f16613f076131a9565b6040519d8e9389850190611efa565b039a613f2a601f199c8d810183528261026f565b613452611f83611f7e613f41613f41895160ff1690565b60ff1690565b613f61613f526132d7565b6040519a8b9387850190611efa565b0389810189528861026f565b015163ffffffff1690565b6040519586936020850190611efa565b613f90610c04565b90613f996131d3565b91604080518094602093848301613faf91611efa565b613fb891611efa565b0392601f19938481018652613fcd908661026f565b8051613fd890613a83565b948551613feb906001600160401b031690565b613ff490613349565b90835191829186830161400691611efa565b61400f91611efa565b03858101825261401f908261026f565b825195869185830161403091611efa565b61403991611efa565b038481018652614049908661026f565b6140516131c0565b94825195869185830161406391611efa565b61406c91611efa565b03848101865261407c908661026f565b8281015161408990613a33565b94825195869185830161409b91611efa565b6140a491611efa565b0384810186526140b4908661026f565b6140bc6132ea565b9482519586918583016140ce91611efa565b6140d791611efa565b0384810186526140e7908661026f565b818101516140f490613a33565b94825195869185830161410691611efa565b61410f91611efa565b03848101865261411f908661026f565b6141276132fd565b94825195869185830161413991611efa565b61414291611efa565b038481018652614152908661026f565b6060810151614160906143f0565b948551614173906001600160401b031690565b61417c90613349565b90835191829186830161418e91611efa565b61419791611efa565b0385810182526141a7908261026f565b82519586918583016141b891611efa565b6141c191611efa565b0384810186526141d1908661026f565b6141d96131e6565b9482519586918583016141eb91611efa565b6141f491611efa565b038481018652614204908661026f565b60808101516142189063ffffffff16613349565b94825195869185830161422a91611efa565b61423391611efa565b038481018652614243908661026f565b61424b613310565b94825195869185830161425d91611efa565b61426691611efa565b038481018652614276908661026f565b60a081015161428490613a33565b94825195869185830161429691611efa565b61429f91611efa565b0384810186526142af908661026f565b6142b761320c565b9482519586918583016142c991611efa565b6142d291611efa565b0384810186526142e2908661026f565b60c08101516001600160401b03166142f990613349565b94825195869185830161430b91611efa565b61431491611efa565b038481018652614324908661026f565b61432c613323565b94825195869185830161433e91611efa565b61434791611efa565b038481018652614357908661026f565b60e0015161436490613a33565b90519384928301613bd991611efa565b600f54600160401b811015610221576001810180600f5581101561086657600f6000526000805160206146028339815191520155565b6000806106a993602081519101845af43d156143e8573d916143cb83610356565b926143d9604051948561026f565b83523d6000602085013e61451e565b60609161451e565b6143f8610c04565b906144016131a9565b916040808051809560209485830161441891611efa565b61442191611efa565b0393601f19948581018752614436908761026f565b80516144449060ff16613349565b95825196879186830161445691611efa565b61445f91611efa565b03858101875261446f908761026f565b6144776132d7565b95825196879186830161448991611efa565b61449291611efa565b0385810187526144a2908761026f565b838101516144b29060ff16613349565b9582519687918683016144c491611efa565b6144cd91611efa565b0385810187526144dd908761026f565b6144e5613336565b9582519687918683016144f791611efa565b61450091611efa565b038581018752614510908761026f565b01516143649060ff16613349565b90614545575080511561453357602081519101fd5b60405163d6bda27560e01b8152600490fd5b81511580614578575b614556575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561454e56fef3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220305069e1de09e0b83f870a665df49a0020cfebdc7facb5713cd273efb122364164736f6c63430008190033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806306c106f9146101b75780631e1afc48146101b257806327e935a1146101ad57806347453a2a146101a85780634f1ef286146101a357806352d1902d1461019e578063621fbd59146101995780637a9e5e4b1461019457806382ae9ef71461018f5780638fb360371461018a5780639039e4951461018557806395fabcf0146101805780639b0715001461017b578063a9e50c1014610176578063ad3cb1cc14610171578063bf7e214f1461016c578063c94c93e714610167578063cd6dc68714610162578063da55d96a1461015d578063e006490014610158578063e0c14aa814610153578063e11418b71461014e578063e36f9a0714610149578063e44efb5a14610144578063f5786b4b1461013f5763f8c7dd2c1461013a57600080fd5b611193565b610feb565b610fcb565b610fad565b610f64565b610e36565b610e18565b610df5565b610cc4565b610c93565b610c5d565b610c17565b610bdd565b610bbf565b610ba1565b610b7e565b610b2b565b610b12565b610a97565b610a79565b610a0e565b610901565b610890565b6107e1565b6106ac565b6101cc565b60009103126101c757565b600080fd5b346101c75760003660031901126101c757602063ffffffff60085416604051908152f35b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761022157604052565b6101f0565b606081019081106001600160401b0382111761022157604052565b6001600160401b03811161022157604052565b602081019081106001600160401b0382111761022157604052565b90601f801991011681019081106001600160401b0382111761022157604052565b6040519061010082018281106001600160401b0382111761022157604052565b604051906102bd82610226565b565b60ff8116036101c757565b63ffffffff8116036101c757565b35906102bd826102ca565b91908260409103126101c7576040516102fb81610206565b6020808294803561030b816102bf565b8452013591610319836102ca565b0152565b91906080838203126101c75760206103516040519261033b84610206565b6040849661034983826102e3565b8652016102e3565b910152565b6001600160401b03811161022157601f01601f191660200190565b81601f820112156101c75780359061038882610356565b92610396604051948561026f565b828452602083830101116101c757816000926020809301838601378301015290565b91908260609103126101c7576040516103d081610226565b604080829480356103e0816102bf565b845260208101356103f0816102bf565b6020850152013591610319836102bf565b35906001600160401b03821682036101c757565b6001600160401b0381116102215760051b60200190565b6004359061ffff821682036101c757565b359061ffff821682036101c757565b91909160409081818503126101c757815161046681610206565b80948235610473816102ca565b8252602092838101356001600160401b03918282116101c757019180601f840112156101c7578235906104a582610415565b966104b28151988961026f565b828852868089019360051b860101948286116101c757878101935b8685106104df57505050505050500152565b84358681116101c75782019060609081601f1984880301126101c75784519161050783610226565b6105128c850161043d565b835285840135610521816102ca565b8c840152830135918883116101c757610541878d80969581960101610371565b868201528152019401936104cd565b90604060206102bd9361057784825163ffffffff6020809260ff8151168552015116910152565b015191019063ffffffff6020809260ff8151168552015116910152565b60005b8381106105a75750506000910152565b8181015183820152602001610597565b906020916105d081518092818552858086019101610594565b601f01601f1916010190565b906106a991602081526105f3602082018351610550565b6020820151906106116101a0928360a08401526101c08301906105b7565b9160e0610685610633604087015195601f1996878783030160c08801526105b7565b61065f60608801518487019060ff60408092828151168552826020820151166020860152015116910152565b608087015163ffffffff1661014086015260a087015186868303016101608701526105b7565b60c08601516001600160401b031661018085015294015192828503019101526105b7565b90565b346101c7576003196040368201126101c757600480356001600160401b03928382116101c7576101a09082360301126101c7576106e7610290565b906106f43682850161031d565b825260848101358481116101c75761071190843691840101610371565b602083015260a48101358481116101c75761073190843691840101610371565b60408301526107433660c483016103b8565b606083015261075561012482016102d8565b60808301526101448101358481116101c75761077690843691840101610371565b60a08301526107886101648201610401565b60c0830152610184810135908482116101c757836107a99236920101610371565b60e08201526024359283116101c7576107cb6107d1926107dd9436910161044c565b906113a4565b604051918291826105dc565b0390f35b346101c75760203660031901126101c7576004356107ff36336120d9565b8015610819576004541561080f57005b6004556000600355005b604051636ad43cc360e11b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b6010548110156108665760106000526000805160206145c28339815191520190600090565b61082b565b600f5481101561086657600f6000526000805160206146028339815191520190600090565b346101c75760203660031901126101c7576004356006548110156101c75760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01546040516001600160a01b039091168152602090f35b600435906001600160a01b03821682036101c757565b60403660031901126101c7576109156108eb565b6024356001600160401b0381116101c757610934903690600401610371565b9061093d61355e565b61094736336120d9565b61094f61355e565b6040516352d1902d60e01b8152916020836004816001600160a01b0386165afa600093816109dd575b506109a257604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b0390fd5b906000805160206145a283398151915283036109c4576109c29250613e2c565b005b604051632a87526960e21b815260048101849052602490fd5b610a0091945060203d602011610a07575b6109f8818361026f565b81019061125a565b9238610978565b503d6109ee565b346101c75760003660031901126101c7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610a675760206040516000805160206145a28339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101c75760003660031901126101c7576020600054604051908152f35b346101c75760203660031901126101c757610ab06108eb565b600080516020614582833981519152546001600160a01b03919082163303610afb57803b15610ae2576109c2906121f8565b6040516361798f2f60e11b815291166004820152602490fd5b60405162d1953b60e31b8152336004820152602490fd5b346101c75760003660031901126101c7576109c2611630565b346101c75760003660031901126101c7576000805160206145828339815191525460a01c60ff1615610b75576020638fb3603760e01b5b6040516001600160e01b03199091168152f35b60206000610b62565b346101c75760203660031901126101c757610b9936336120d9565b600435600755005b346101c75760003660031901126101c7576020600354604051908152f35b346101c75760003660031901126101c7576020600754604051908152f35b346101c75760003660031901126101c75760206001600160401b0360015416604051908152f35b60405190610c1182610254565b60008252565b346101c75760003660031901126101c7576107dd604051610c3781610206565b60058152640352e302e360dc1b60208201526040519182916020835260208301906105b7565b346101c75760003660031901126101c757600080516020614582833981519152546040516001600160a01b039091168152602090f35b346101c75760203660031901126101c7576004356000526005602052602060ff604060002054166040519015158152f35b346101c75760403660031901126101c757610cdd6108eb565b6000805160206145e283398151915254906001600160401b0360ff8360401c1615921680159081610ded575b6001149081610de3575b159081610dda575b50610dc8576000805160206145e2833981519152805467ffffffffffffffff19166001179055610d549082610da3575b602435906129f8565b610d5a57005b6000805160206145e2833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b6000805160206145e2833981519152805460ff60401b1916600160401b179055610d4b565b60405163f92ee8a960e01b8152600490fd5b90501538610d1b565b303b159150610d13565b839150610d09565b346101c75760003660031901126101c757602060ff601754166040519015158152f35b346101c75760003660031901126101c7576020601954604051908152f35b346101c7576040806003193601126101c757610e5061042c565b6024356001600160401b0381116101c757610e6f903690600401610371565b9160045415610f5457610e8236336120d9565b60008051602061458283398151915254610eb290610ea6906001600160a01b031681565b6001600160a01b031690565b81516368fc2b7760e11b815261ffff841662010000176004820152336024820152908290829060449082905afa908115610f4f57600091610f21575b5015610efe576109c28383612d5a565b51639a28d60760e01b815233600482015261ffff91909116602482015260449150fd5b610f419150823d8411610f48575b610f39818361026f565b81019061178f565b5038610eee565b503d610f2f565b611315565b5163738c481160e01b8152600490fd5b346101c75760203660031901126101c757600435610f8236336120d9565b60115480610f9e57504203428111610f9957601155005b6115f3565b908103908111610f9957601155005b346101c75760003660031901126101c7576020600454604051908152f35b346101c75760003660031901126101c75760206004541515604051908152f35b346101c7576020806003193601126101c75760049081358254156111825761101336336120d9565b80156111715782541461102257005b6000825560035491821561116257506110396111e7565b91611045600054611ee4565b604084810191909152426001600160401b031660c08501529061106661191f565b600181529161107482612df3565b84840190815260005b8381106110e95750505050611095816110cc946113a4565b916110b96110a582850151611ed0565b60c08501516001600160401b031690613d21565b6110c1611939565b928352820152613041565b6110df6110da60195461240d565b601955565b6109c26000600355565b8061115b816111026110fc600195612b2d565b50612e5b565b8961110f825161ffff1690565b910151611144611123825163ffffffff1690565b61113861112e6102b0565b61ffff9095168552565b63ffffffff16838d0152565b8782015285519061115583836119b8565b526119b8565b500161107d565b60405163783bc0f160e11b8152fd5b604051636ad43cc360e11b81528390fd5b60405163738c481160e01b81528390fd5b346101c75760003660031901126101c7576109c2611dbb565b604051906111b982610206565b60006020838281520152565b604051906111d282610206565b816111db6111ac565b815260206103516111ac565b6040519061010082018281106001600160401b0382111761022157604052606060e0836112126111c5565b815282602082015282604082015260405161122c81610226565b60008152600060208201526000604082015283820152600060808201528260a0820152600060c08201520152565b908160209103126101c7575190565b90602080835260609060608401908063ffffffff94858151168288015201519460408080830152865180945260808201908360808660051b8501019801956000935b8685106112be5750505050505050505090565b909192939495969799988680611300600193868f89908f607f198a8603018d52519061ffff8251168552868201511686850152015191818a82015201906105b7565b9b9c9a019897969190910194019291906112ab565b6040513d6000823e3d90fd5b6020818303126101c7578051906001600160401b0382116101c7570181601f820112156101c757805161135381610356565b92611361604051948561026f565b818452602082840101116101c7576106a99160208085019101610594565b90916113966106a9936040845260408401906105b7565b9160208184039101526105b7565b906113ad6111e7565b5073__$b91d2ad766fd07dc99f56c1a0b020615bb$__60405163765809ab60e11b81526020928382806113e38460048301611269565b0381865af4918215610f4f5760009261156f575b5060a0850180518051611532575061142a916114209161141961143795611ee4565b9052611f11565b5163ffffffff1690565b63ffffffff166080850152565b60405162409a0960e81b81526000818061145487600483016105dc565b0381855af4908115610f4f57600091611511575b5083830180518051806114da5750505281604051809263b93612a760e01b8252818061149788600483016105dc565b03915af4908115610f4f576114b5926000926114bd575b5050611ee4565b60e082015290565b6114d39250803d10610a07576109f8818361026f565b38806114ae565b9150938092935084012090825190830120036114f557505090565b61099e604051928392630ca2e06d60e11b84526004840161137f565b61152c913d8091833e611524818361026f565b810190611321565b38611468565b905061153e9150611ed0565b9080820361154d575050611437565b604051631d97afef60e31b815260048101919091526024810191909152604490fd5b611587919250843d8611610a07576109f8818361026f565b90386113f7565b6040519061014082018281106001600160401b03821117610221576040526060808352610120836115bd6111c5565b602082015260006040820152600083820152600060808201528260a08201528260c08201528260e0820152826101008201520152565b634e487b7160e01b600052601160045260246000fd5b63ffffffff9081166000190191908211610f9957565b9060206106a99281815201906105b7565b60175460ff16611782575b60175460ff16611740577f17c789cd9b6ebb5030c7b906ed9f08f64563805e0aeab6d5f53dda9305a8348b61171461170861167461241c565b6116cb61167f61158e565b916116a761169a61169560085463ffffffff1690565b611609565b63ffffffff166060850152565b426001600160401b031660408401526116c1601354611ee4565b60c0840152611ee4565b60a08201526116db601554611ee4565b60e08201526116eb601654611ee4565b610100820152611703600160ff196017541617601755565b61252d565b6040519182918261161f565b0390a161171f612251565b61173261172e60175460ff1690565b1590565b61173857565b6102bd611630565b61099e63ffffffff60001961175a60085463ffffffff1690565b0116604051918291630642fe1b60e11b83526004830191909163ffffffff6020820193169052565b61178a612251565b61163b565b91908260409103126101c757815180151581036101c7576020909201516106a9816102ca565b600019810191908211610f9957565b600119810191908211610f9957565b601854156108665760186000527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90600090565b60185481101561086657600b906018600052027fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0190600090565b90600182811c92168015611872575b602083101461185c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611851565b9060405191826000825461188f81611842565b908184526020946001916001811690816000146118fd57506001146118be575b5050506102bd9250038361026f565b600090815285812095935091905b8183106118e55750506102bd93508201013880806118af565b855488840185015294850194879450918301916118cc565b925050506102bd94925060ff191682840152151560051b8201013880806118af565b6040519061192c82610206565b6060602083600081520152565b6040519061194682610206565b8161194f6111e7565b8152602061035161191f565b9061196582610415565b611972604051918261026f565b8281528092611983601f1991610415565b019060005b82811061199457505050565b60209061199f611939565b82828501015201611988565b8051156108665760200190565b80518210156108665760209160051b010190565b906040516119d981610206565b915460ff8116835260081c63ffffffff166020830152565b906040516119fe81610206565b602061035160018395611a10816119cc565b8552016119cc565b90604051611a2581610226565b604060ff8294548181168452818160081c16602085015260101c16910152565b9060408051611a5381610206565b809363ffffffff8082541683526001809201805491611a7183610415565b95611a7f604051978861026f565b83875260209160208801936000526020600020916000945b868610611aac57505050505050505060200152565b60028589928451611abc81610226565b86885461ffff8116835260101c1683820152611ad985890161187c565b86820152815201940195019492611a97565b90604051611af881610206565b602061035160098395611b09610290565b611b12826119f1565b8152611b206002830161187c565b85820152611b306003830161187c565b6040820152611b4160048301611a18565b6060820152611b67611b5a600584015463ffffffff1690565b63ffffffff166080830152565b611b736006830161187c565b60a0820152611b9f611b8f60078401546001600160401b031690565b6001600160401b031660c0830152565b611bab6008830161187c565b60e0820152855201611a45565b634e487b7160e01b600052600060045260246000fd5b818110611bd9575050565b60008155600101611bce565b611bef8154611842565b9081611bf9575050565b81601f60009311600114611c0b575055565b908083918252611c2a601f60208420940160051c840160018501611bce565b5555565b600160401b821161022157805490828155818310611c4b57505050565b6001916001600160ff1b038082168203610f995784168403610f995760009160005260206000209060011b81019360011b015b838110611c8b5750505050565b808260029255611c9c848201611be5565b01611c7e565b600090600081556001809101918254926000815583611cc2575b50505050565b6001600160ff1b0384168403610f995760005260206000209260011b8301925b83811015611cbc57808260029255611cfb848201611be5565b01611ce2565b6018546000908160185580611d14575050565b600b9181600b0291600b830403610f9957601881527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e918201915b828110611d5c5750505050565b8082859255826001820155611d7360028201611be5565b611d7f60038201611be5565b826004820155826005820155611d9760068201611be5565b826007820155611da960088201611be5565b611db560098201611ca2565b01611d4f565b6019548015611ecd57611dcc61158e565b90611dec611ddf60085463ffffffff1690565b63ffffffff166060840152565b426001600160401b03166040830152611e06601354611ee4565b60c0830152611e1f6002611e186117d3565b500161187c565b60e0830152611e3a6002611e18611e35846117b5565b611807565b610100830152611e498161195b565b610120830190815260005b828110611ea057505050611e8b6117087fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d8879261252d565b0390a1611e96611d01565b6102bd6000601955565b80611ec681611eb0600194611807565b50611ebc865191611aeb565b61115583836119b8565b5001611e54565b50565b805115611ede576020015190565b50600090565b604051906020820152602081526106a981610206565b90611f0d60209282815194859201610594565b0190565b611f4a91611f1d610c04565b90611f266131a9565b611f44611f9e604092604051978891611f4460209889850190611efa565b90611efa565b0396611f5e601f199889810183528261026f565b611f92611f83611f7e611f758a5163ffffffff1690565b63ffffffff1690565b613349565b60405194859389850190611efa565b0387810183528261026f565b916000925b84860180515185101561205b57611f44612051611f4461204589956120378d612005611fff8d60019a611ff98f611fed8f91611f44611fe06131c0565b91519b8c94850190611efa565b0386810189528861026f565b516119b8565b516133ca565b9261202b61201d611f7e86516001600160401b031690565b8d519788938d850190611efa565b0390810185528461026f565b885194859388850190611efa565b038a810183528261026f565b9401939050611fa3565b5095509350505050565b6004116101c757600090600490565b6001600160e01b0319903581811693926004811061209157505050565b60040360031b82901b16169150565b6001600160a01b0390911681526040602082018190528101829052606091806000848401376000828201840152601f01601f1916010190565b6000805160206145828339815191528054612112906001600160a01b031661210961210386612065565b90612074565b908430916134cf565b901561211e5750505050565b63ffffffff16156121d857600080516020614582833981519152805460ff60a01b1916600160a01b17905561216090610ea6908190546001600160a01b031690565b91823b156101c75761218c9260009283604051809681958294634a63ebf760e11b8452600484016120a0565b03925af18015610f4f576121bf575b50600080516020614582833981519152805460ff60a01b1916905538808080611cbc565b806121cc6121d292610241565b806101bc565b3861219b565b60405162d1953b60e31b81526001600160a01b0383166004820152602490fd5b60008051602061458283398151915280546001600160a01b0319166001600160a01b0390921691821790556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602090a1565b601154156123b0576011546007548101809111610f995742101561227157565b61228061172e60175460ff1690565b61236e5761229360ff1960175416601755565b61229e600954600a55565b6122a9600b54600c55565b6122c16122b46135b8565b6122bc613780565b6138d0565b6122cb6000600955565b6122d56000600b55565b6122de42601155565b61230f6122f36001546001600160401b031690565b6001600160401b03166001600160401b03196012541617601255565b61231a601454601555565b612325600054601655565b61233460ff1960175416601755565b61233e6000601455565b6102bd61235861235360085463ffffffff1690565b613925565b63ffffffff1663ffffffff196008541617600855565b61099e63ffffffff60001961238860085463ffffffff1690565b0116604051918291631c70a36560e21b83526004830191909163ffffffff6020820193169052565b42601155565b6040516123c281610254565b60008152906000368137565b906123d882610415565b6123e5604051918261026f565b82815280926123f6601f1991610415565b0190602036910137565b8015610f99576000190190565b6000198114610f995760010190565b600a5490600c5491801561252657612433836123ce565b9260005b8181106124fc5750905b600190818111806124f3575b156124e25780821682036124a8576124a09061248e61247461246e866117b5565b886119b8565b51612487612481876117b5565b896119b8565b519061393a565b61249a61246e866117b5565b5261240d565b905b1c612441565b9091806124ca6124bd61246e6124dc946117c4565b51612487612481846117b5565b6124d661246e836117c4565b52612400565b916124a2565b505050906124ef906119ab565b5190565b5081831161244d565b8061251561250b600193610841565b90549060031b1c90565b61251f82886119b8565b5201612437565b5060009150565b612535610c04565b61253d6131d3565b9260408051809560209485830161255391611efa565b61255c91611efa565b0394601f19958681018252612571908261026f565b845161257c90613a33565b90825191829186830161258e91611efa565b61259791611efa565b0386810182526125a7908261026f565b6125af6131c0565b9082519182918683016125c191611efa565b6125ca91611efa565b0386810182526125da908261026f565b838501516125e790613a83565b9081516125fa906001600160401b031690565b61260390613349565b90835191829187830161261591611efa565b61261e91611efa565b03878101825261262e908261026f565b825191829186830161263f91611efa565b61264891611efa565b038681018252612658908261026f565b6126606131e6565b90825191829186830161267291611efa565b61267b91611efa565b03868101825261268b908261026f565b848201516001600160401b03166126a190613349565b9082519182918683016126b391611efa565b6126bc91611efa565b0386810182526126cc908261026f565b6126d46131f9565b9082519182918683016126e691611efa565b6126ef91611efa565b0386810182526126ff908261026f565b60608501516127139063ffffffff16613349565b90825191829186830161272591611efa565b61272e91611efa565b03868101825261273e908261026f565b61274661320c565b90825191829186830161275891611efa565b61276191611efa565b038681018252612771908261026f565b60808501516127859063ffffffff16613349565b90825191829186830161279791611efa565b6127a091611efa565b0386810182526127b0908261026f565b6127b861321f565b9082519182918683016127ca91611efa565b6127d391611efa565b0386810182526127e3908261026f565b60a08501516127f190613a33565b90825191829186830161280391611efa565b61280c91611efa565b03868101825261281c908261026f565b612824613232565b90825191829186830161283691611efa565b61283f91611efa565b03868101825261284f908261026f565b60c085015161285d90613a33565b90825191829186830161286f91611efa565b61287891611efa565b038681018252612888908261026f565b612890613278565b9082519182918683016128a291611efa565b6128ab91611efa565b0386810182526128bb908261026f565b60e08501516128c990613a33565b9082519182918683016128db91611efa565b6128e491611efa565b0386810182526128f4908261026f565b6128fc613297565b90825191829186830161290e91611efa565b61291791611efa565b038681018252612927908261026f565b61010085015161293690613a33565b90825191829186830161294891611efa565b61295191611efa565b038681018252612961908261026f565b916000925b610120860180515185101561205b57611f446129ee610120936120456129b36129ad8a6001978f611ff9908f6129a18f611f44611fe06132b6565b0390810188528761026f565b51613bf2565b6129e08d8c61202b8c611f446129d3611f7e88516001600160401b031690565b9151988994850190611efa565b88519485938c850190611efa565b9401939050612966565b612a2190612a04613cf2565b612a0c613cf2565b612a14613cf2565b612a1c613cf2565b6121f8565b612a29613cf2565b612a31613cf2565b612a396123b6565b8051906001600160401b039182811161022157612a5581613614565b6020809201600d60005260005b828110612afb57505050612a746123b6565b805192831161022157602090612a8984613678565b0190600e60005260005b838110612ac957505050506102bd90612ab4600160ff196017541617601755565b612abc6137e4565b612ac461385a565b600755565b82517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd82015591810191600101612a93565b81517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb582015590830190600101612a62565b60025481101561086657600260005260011b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b9190601f8111612b7657505050565b6102bd926000526020600020906020601f840160051c83019310612ba2575b601f0160051c0190611bce565b9091508190612b95565b91909182516001600160401b03811161022157612bd381612bcd8454611842565b84612b67565b602080601f8311600114612c1657508190612c07939495600092612c0b575b50508160011b916000199060031b1c19161790565b9055565b015190503880612bf2565b90601f19831695612c2c85600052602060002090565b926000905b888210612c6957505083600195969710612c50575b505050811b019055565b015160001960f88460031b161c19169055388080612c46565b80600185968294968601518155019501930190612c31565b929190612d55578051835461ffff191661ffff91909116178355600180930190602080910151938451916001600160401b03831161022157612ccd83612cc78654611842565b86612b67565b602091601f8411600114612d015750508190612c07939495600092612c0b5750508160011b916000199060031b1c19161790565b95601f92919219841696612d1a86600052602060002090565b936000915b898310612d3e5750505083600195969710612c5057505050811b019055565b838501518655948501949381019391810191612d1f565b611bb8565b60025491600354808411600014612db057506102bd9250612d8960405192612d8184610206565b61ffff168352565b6020820152612daa600354612da5612da08261240d565b600355565b612b2d565b90612c81565b612db99061240d565b60035561ffff60405192612dcc84610206565b1682526020820152600160401b82101561022157612daa8260016102bd9401600255612b2d565b90612dfd82610415565b6040612e0c604051928361026f565b8382528193612e1d601f1991610415565b019160009060005b848110612e33575050505050565b6020908451612e4181610226565b848152828581830152606087830152828501015201612e25565b90604051612e6881610206565b60206103516001839561ffff81541685520161187c565b81518051825460ff191660ff9190911617825560200151602080600184549464ffffffff0095869564ffffffff001996879160081b16911617815501940151612ed660ff825116869060ff1660ff19825416179055565b01519183549260081b169116179055565b8151815463ffffffff191663ffffffff919091161781556001809101916020809101519080825192612f198487611c2e565b0190600094855280852085925b848410612f365750505050505050565b8051805183548583015165ffffffff000060109190911b1661ffff90921665ffffffffffff19909116171783556040015180519187840191906001600160401b03841161022157828692612f8f86612bcd8d9754611842565b83908c601f8811600114612fd15796612fc29281926002989992612c0b5750508160011b916000199060031b1c19161790565b90555b01920193019290612f26565b969190601f198316612fe885600052602060002090565b985b8181106130285750918798918460029995941061300f575b505050811b019055612fc5565b015160001960f88460031b161c19169055388080613002565b838301518a5597909801978d978b979384019301612fea565b601854600160401b811015610221578060016130609201601855611807565b612d5557600960208361316c60e06102bd965161307e815188612e7f565b61308e8582015160028901612bac565b61309f604082015160038901612bac565b6130ed6060820151600489018151815460ff191660ff91909116178155906020810151825460409092015162ffff001990921660089190911b61ff00161760109190911b62ff000016179055565b61311a613101608083015163ffffffff1690565b600589019063ffffffff1663ffffffff19825416179055565b61312b60a082015160068901612bac565b61316161314260c08301516001600160401b031690565b60078901906001600160401b03166001600160401b0319825416179055565b015160088601612bac565b01519101612ee7565b6040519061318282610206565b6001825260203681840137565b6040519061319c82610206565b600a825260203681840137565b6131b1613175565b60086131bc826119ab565b5390565b6131c8613175565b60126131bc826119ab565b6131db613175565b600a6131bc826119ab565b6131ee613175565b60286131bc826119ab565b613201613175565b60306131bc826119ab565b613214613175565b60386131bc826119ab565b613227613175565b607a6131bc826119ab565b61323a61318f565b60a260005b607f808311156132645790608060019284161760208286010153019060071c9061323f565b50607f600192166020828501015301815290565b61328061318f565b60f260016000826020850153019060071c9061323f565b61329f61318f565b60fa60016000826020850153019060071c9061323f565b6132be61318f565b6101426001600060c26020850153019060071c9061323f565b6132df613175565b60106131bc826119ab565b6132f2613175565b601a6131bc826119ab565b613305613175565b60226131bc826119ab565b613318613175565b60326131bc826119ab565b61332b613175565b60426131bc826119ab565b61333e613175565b60186131bc826119ab565b9060809160806001600160401b038216106133a55761336661318f565b60005b607f8084111561338d57908560019285161760208285010153019160071c91613369565b5090929350607f600192166020828501015301815290565b9091506133b0613175565b9060f81b6001600160f81b03191660001a6131bc826119ab565b6106a961340b611f44926134c36134af611f446134b66133e8610c04565b946133f16131a9565b9060409485928351998a91611f4460209b8c850190611efa565b039861341f601f199a8b810183528261026f565b61345e89613452613442611f7e61343b61343b895161ffff1690565b61ffff1690565b611f448851958694850190611efa565b038b810183528261026f565b61346d896134526134426132d7565b61348a89613452613442611f7e611f758489015163ffffffff1690565b6134a36134956132ea565b85519d8e938c850190611efa565b038981018c528b61026f565b0151613a33565b9151968794850190611efa565b0390810183528261026f565b60405163b700961360e01b602082019081526001600160a01b0393841660248301529290931660448401526001600160e01b03199093166064808401919091528252600093849390928492909160a08301916001600160401b0383118484101761022157604093859385528380528360205251915afa61354c5750565b9150915051906020518060201c150290565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811630811491821561359c575b5050610a6757565b6000805160206145a28339815191525416141590503880613594565b6040519060105480835282602091602082019060106000526000805160206145c2833981519152936000905b8282106135fa575050506102bd9250038361026f565b8554845260019586019588955093810193909101906135e4565b600160401b811161022157600d549080600d55818110613632575050565b600090600d6000527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb592830192015b82811061366d57505050565b818155600101613661565b600160401b811161022157600e549080600e55818110613696575050565b600090600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd92830192015b8281106136d157505050565b8181556001016136c5565b600160401b81116102215760105490806010558181106136fa575050565b60009060106000526000805160206145c283398151915292830192015b82811061372357505050565b818155600101613717565b600160401b811161022157600f549080600f5581811061374c575050565b600090600f60005260008051602061460283398151915292830192015b82811061377557505050565b818155600101613769565b600f546001600160401b0381116102215761379a816136dc565b6010600090815260008051602061460283398151915280545b8383106137c05750505050565b60018091920192835492816000805160206145c283398151915201550191906137b3565b600d546001600160401b038111610221576137fe8161372e565b600f60009081527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb580545b8383106138365750505050565b60018091920192835492816000805160206146028339815191520155019190613829565b600e546001600160401b03811161022157613874816136dc565b601060009081527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd80545b8383106138ac5750505050565b60018091920192835492816000805160206145c2833981519152015501919061389f565b8051906001600160401b038211610221576138ea8261372e565b602080910190600f60005260005b8381106139055750505050565b8251600080516020614602833981519152820155918101916001016138f8565b90600163ffffffff80931601918211610f9957565b6040516334509dd160e01b8152600481019190915273__$398d4f030862acab53d338aebf0b4256d7$__916020908183602481875af4928315610f4f57600093613a0e575b506040516333aec0ad60e21b815260048101919091529192819083908180602481015b03915af4918215610f4f576000926139eb575b506139e5906139d7604051938492830195869091604092825260208201520190565b03601f19810183528261026f565b51902090565b819250613a07906139e5923d8511610a07576109f8818361026f565b91906139b5565b6139a2935090613a2b8392833d8511610a07576109f8818361026f565b93509061397f565b6106a96020613a4b6001600160401b03845116613349565b6040519381613a638693518092868087019101610594565b8201613a7782518093868085019101610594565b0103808452018261026f565b613a8b610c04565b90613a946131d3565b6040805193846020938492838301613aab91611efa565b613ab491611efa565b0393601f19948581018752613ac9908761026f565b8051613ad490613ed0565b958651613ae7906001600160401b031690565b613af090613349565b908451918291858301613b0291611efa565b613b0b91611efa565b038681018252613b1b908261026f565b8351968791848301613b2c91611efa565b613b3591611efa565b038581018752613b45908761026f565b613b4d6131c0565b958351968791848301613b5f91611efa565b613b6891611efa565b038581018752613b78908761026f565b0151613b8390613ed0565b908151613b96906001600160401b031690565b613b9f90613349565b948151958691858301613bb191611efa565b613bba91611efa565b038481018652613bca908661026f565b519384928301613bd991611efa565b613be291611efa565b0390810182526106a9908261026f565b613bfa610c04565b90613c036131d3565b6040805193846020938492838301613c1a91611efa565b613c2391611efa565b0393601f19948581018752613c38908761026f565b8051613c4390613f88565b958651613c56906001600160401b031690565b613c5f90613349565b908451918291858301613c7191611efa565b613c7a91611efa565b038681018252613c8a908261026f565b8351968791848301613c9b91611efa565b613ca491611efa565b038581018752613cb4908761026f565b613cbc6131c0565b958351968791848301613cce91611efa565b613cd791611efa565b038581018752613ce7908761026f565b0151613b8390611f11565b60ff6000805160206145e28339815191525460401c1615613d0f57565b604051631afcd79f60e31b8152600490fd5b90613d2a612251565b60145415613e23575b816000556001600160401b03600191166001600160401b03196001541617600155613d5f60095461240d565b613d6881600955565b90613d74600b5461240d565b92600f54613d81856117b5565b1015613e1257613db590613d9c613d97866117b5565b61086b565b90919082549060031b91821b91600019901b1916179055565b9190915b80831615613dc85750600b5550565b9080613e03613df7613de261250b613d97613e08966117c4565b613df161250b613d97866117b5565b9061393a565b613d9c613d97846117c4565b612400565b91811c9190613db9565b613e1b90614374565b919091613db9565b81601455613d33565b90813b15613eaf576000805160206145a283398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115613e9457611ecd916143aa565b505034613e9d57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b6106a9611f44611f446134c3613f78611f7e611f756020611f4498613f6d611f44613f47613efc610c04565b613f16613f076131a9565b6040519d8e9389850190611efa565b039a613f2a601f199c8d810183528261026f565b613452611f83611f7e613f41613f41895160ff1690565b60ff1690565b613f61613f526132d7565b6040519a8b9387850190611efa565b0389810189528861026f565b015163ffffffff1690565b6040519586936020850190611efa565b613f90610c04565b90613f996131d3565b91604080518094602093848301613faf91611efa565b613fb891611efa565b0392601f19938481018652613fcd908661026f565b8051613fd890613a83565b948551613feb906001600160401b031690565b613ff490613349565b90835191829186830161400691611efa565b61400f91611efa565b03858101825261401f908261026f565b825195869185830161403091611efa565b61403991611efa565b038481018652614049908661026f565b6140516131c0565b94825195869185830161406391611efa565b61406c91611efa565b03848101865261407c908661026f565b8281015161408990613a33565b94825195869185830161409b91611efa565b6140a491611efa565b0384810186526140b4908661026f565b6140bc6132ea565b9482519586918583016140ce91611efa565b6140d791611efa565b0384810186526140e7908661026f565b818101516140f490613a33565b94825195869185830161410691611efa565b61410f91611efa565b03848101865261411f908661026f565b6141276132fd565b94825195869185830161413991611efa565b61414291611efa565b038481018652614152908661026f565b6060810151614160906143f0565b948551614173906001600160401b031690565b61417c90613349565b90835191829186830161418e91611efa565b61419791611efa565b0385810182526141a7908261026f565b82519586918583016141b891611efa565b6141c191611efa565b0384810186526141d1908661026f565b6141d96131e6565b9482519586918583016141eb91611efa565b6141f491611efa565b038481018652614204908661026f565b60808101516142189063ffffffff16613349565b94825195869185830161422a91611efa565b61423391611efa565b038481018652614243908661026f565b61424b613310565b94825195869185830161425d91611efa565b61426691611efa565b038481018652614276908661026f565b60a081015161428490613a33565b94825195869185830161429691611efa565b61429f91611efa565b0384810186526142af908661026f565b6142b761320c565b9482519586918583016142c991611efa565b6142d291611efa565b0384810186526142e2908661026f565b60c08101516001600160401b03166142f990613349565b94825195869185830161430b91611efa565b61431491611efa565b038481018652614324908661026f565b61432c613323565b94825195869185830161433e91611efa565b61434791611efa565b038481018652614357908661026f565b60e0015161436490613a33565b90519384928301613bd991611efa565b600f54600160401b811015610221576001810180600f5581101561086657600f6000526000805160206146028339815191520155565b6000806106a993602081519101845af43d156143e8573d916143cb83610356565b926143d9604051948561026f565b83523d6000602085013e61451e565b60609161451e565b6143f8610c04565b906144016131a9565b916040808051809560209485830161441891611efa565b61442191611efa565b0393601f19948581018752614436908761026f565b80516144449060ff16613349565b95825196879186830161445691611efa565b61445f91611efa565b03858101875261446f908761026f565b6144776132d7565b95825196879186830161448991611efa565b61449291611efa565b0385810187526144a2908761026f565b838101516144b29060ff16613349565b9582519687918683016144c491611efa565b6144cd91611efa565b0385810187526144dd908761026f565b6144e5613336565b9582519687918683016144f791611efa565b61450091611efa565b038581018752614510908761026f565b01516143649060ff16613349565b90614545575080511561453357602081519101fd5b60405163d6bda27560e01b8152600490fd5b81511580614578575b614556575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561454e56fef3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a2646970667358221220305069e1de09e0b83f870a665df49a0020cfebdc7facb5713cd273efb122364164736f6c63430008190033", + "bytecode": "0x60a0806040523460c857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c1660b957506001600160401b036002600160401b0319828216016075575b6040516142ba90816100cd82396080518181816106a2015261370a0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80806056565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c806304676e38146101e45780630d6f1e9d146101df57806327e935a1146101da57806347453a2a146101d55780634f1ef286146101d05780634fca79cb146101cb57806352d1902d146101c6578063621fbd59146101c15780637a9e5e4b146101bc5780638fb36037146101b757806393ec06be146101b257806395fabcf0146101ad578063a3ad9cc3146101a8578063a593aec2146101a3578063a9e50c101461019e578063ad3cb1cc14610199578063b244542b14610194578063b8f8d7e51461018f578063bf7e214f1461018a578063c16a8a5614610185578063c4d66de814610180578063c94c93e71461017b578063d5b5272a14610176578063e006490014610171578063e0c14aa81461016c578063e2fc04ae14610167578063e36f9a0714610162578063e44efb5a1461015d5763f5786b4b14610158575f80fd5b6115f5565b6115d6565b6115b9565b61149c565b6110e9565b6110ac565b611010565b610fe1565b610eb5565b610e92565b610e5e565b610e3b565b610e0c565b610c07565b610bcf565b610af3565b610819565b6107fc565b6107df565b61078f565b610715565b6106f9565b610690565b6105e4565b6104d9565b61033b565b6102e4565b610290565b610208565b63ffffffff8116036101f757565b5f80fd5b3590610206826101e9565b565b346101f75760203660031901126101f7576060600435610227816101e9565b63ffffffff8091165f52600960205260405f206001600160401b036001825492015491604051938116845260201c1660208301526040820152f35b5f9103126101f757565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346101f7575f3660031901126101f75763ffffffff600c54166102b1610c97565b906102ce604051928392835260406020840152604083019061026c565b0390f35b60209060031901126101f75760043590565b346101f7576102f2366102d2565b6102fc3633612905565b8015610315576004541561030c57005b6004555f600355005b604051636ad43cc360e11b8152600490fd5b634e487b7160e01b5f52603260045260245ffd5b346101f757610349366102d2565b6006548110156101f75760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01546040516001600160a01b039091168152602090f35b600435906001600160a01b03821682036101f757565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176103d457604052565b6103a5565b602081019081106001600160401b038211176103d457604052565b604081019081106001600160401b038211176103d457604052565b60e081019081106001600160401b038211176103d457604052565b6001600160401b0381116103d457604052565b90601f801991011681019081106001600160401b038211176103d457604052565b604051906102068261040f565b60405190610206826103b9565b6001600160401b0381116103d457601f01601f191660200190565b81601f820112156101f7578035906104aa82610478565b926104b8604051948561043d565b828452602083830101116101f757815f926020809301838601378301015290565b60403660031901126101f7576104ed61038f565b6024356001600160401b0381116101f75761050c903690600401610493565b90610515613700565b61051f3633612905565b610527613700565b6040516352d1902d60e01b8152916020836004816001600160a01b0386165afa5f93816105b3575b5061057957604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b0390fd5b905f80516020614245833981519152830361059a576105989250613cea565b005b604051632a87526960e21b815260048101849052602490fd5b6105d691945060203d6020116105dd575b6105ce818361043d565b810190612496565b925f61054f565b503d6105c4565b346101f75760203660031901126101f7576102ce600435610604816101e9565b60405f818051610613816103b9565b828152826020820152015263ffffffff8092165f5260096020526001815f206001600160401b03835194610646866103b9565b8254908116865260201c1660208501520154818301525191829182919091604080606083019463ffffffff81511684526001600160401b0360208201511660208501520151910152565b346101f7575f3660031901126101f7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036106e75760206040515f805160206142458339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f7575f3660031901126101f75760205f54604051908152f35b346101f75760203660031901126101f75761072e61038f565b5f80516020614225833981519152546001600160a01b0391908216330361077857803b1561075f5761059890612a21565b6040516361798f2f60e11b815291166004820152602490fd5b60405162d1953b60e31b8152336004820152602490fd5b346101f7575f3660031901126101f7575f805160206142258339815191525460a01c60ff16156107d7576020638fb3603760e01b5b6040516001600160e01b03199091168152f35b60205f6107c4565b346101f7575f3660031901126101f7576020604051620100008152f35b346101f7575f3660031901126101f7576020600354604051908152f35b346101f75760203660031901126101f757600435610836816101e9565b6108403633612905565b600c5463ffffffff1661085e610855826118a4565b63ffffffff1690565b63ffffffff831603610ac457506108736118f8565b63ffffffff821660608201526108a46108946001600160401b034216611935565b6001600160401b03166040830152565b6108ac612a79565b60a08201525f60085480151580610952575b7fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d88761094d866109416108ef88612b56565b9161090062010000845111156121f7565b610922835160208501206109148184612f19565b61091d83612f7f565b600d55565b61092b83612269565b63ffffffff1663ffffffff19600c541617600c55565b60405191829182610df8565b0390a1005b5f6101005b838210610a6e575b50506109759083159081610a66575b5015611b50565b8161097f81611c2b565b60c085019081525f5b828110610a2e57505061099a91611c8e565b905f5b828110610a0057505f5b8181106109ef575050916109416108ef61094d936109e57fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d88796600855565b93508294506108be565b6001906109fa612125565b016109a7565b80610a28610a18610a1360019486611b35565b611951565b50610a2283611951565b90611fb6565b0161099d565b6001919250610a5c81610a4081611951565b50610a4c865191611a57565b610a568383611c7a565b52611c7a565b5001908391610988565b90505f61096e565b610a8a610a85610a7f849794611951565b50611a57565b612ae8565b9062010000610a998383611b35565b11610abb57610aad600192610ab392611b35565b92611b42565b940190610957565b5081945061095f565b610acd906118a4565b6040516307d3e83d60e51b815263ffffffff918216600482015291166024820152604490fd5b346101f75760203660031901126101f757600435610b10816101e9565b610b1a3633612905565b63ffffffff80821690815f52600960205260405f20541615610b8a5761059891610b6b610b7f92610b64610855610b56600a5463ffffffff1690565b600c5463ffffffff16612fd7565b101561240b565b63ffffffff165f52600960205260405f2090565b60015f918281550155565b60405162461bcd60e51b815260206004820152601760248201527f4f50503a207265636f7264206e6f742070726573656e740000000000000000006044820152606490fd5b346101f7575f3660031901126101f75760206001600160401b0360015416604051908152f35b60405190610c02826103d9565b5f8252565b346101f7575f3660031901126101f7576102ce604051610c26816103f4565b60058152640352e302e360dc1b602082015260405191829160208352602083019061026c565b634e487b7160e01b5f525f60045260245ffd5b90600182811c92168015610c8d575b6020831014610c7957565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610c6e565b604051905f82600b5491610caa83610c5f565b80835292602090600190818116908115610d345750600114610cd5575b50506102069250038361043d565b915092600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9935f925b828410610d1c57506102069450505081016020015f80610cc7565b85548885018301529485019487945092810192610d01565b9150506020925061020694915060ff191682840152151560051b8201015f80610cc7565b9060405191825f8254610d6a81610c5f565b908184526020946001916001811690815f14610dd65750600114610d98575b5050506102069250038361043d565b5f90815285812095935091905b818310610dbe57505061020693508201015f8080610d89565b85548884018501529485019487945091830191610da5565b9250505061020694925060ff191682840152151560051b8201015f8080610d89565b906020610e0992818152019061026c565b90565b346101f7575f3660031901126101f7576102ce610e27610c97565b60405191829160208352602083019061026c565b346101f7575f3660031901126101f757602063ffffffff600c5416604051908152f35b346101f7575f3660031901126101f7575f80516020614225833981519152546040516001600160a01b039091168152602090f35b346101f7575f3660031901126101f757602063ffffffff600a5416604051908152f35b346101f75760203660031901126101f757610ece61038f565b5f8051602061426583398151915254906001600160401b0360ff8360401c1615921680159081610fd9575b6001149081610fcf575b159081610fc6575b50610fb4575f80516020614265833981519152805467ffffffffffffffff19166001179055610f3e9082610f9057612ff6565b610f4457005b5f80516020614265833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290806020810161094d565b5f80516020614265833981519152805460ff60401b1916600160401b179055612ff6565b60405163f92ee8a960e01b8152600490fd5b9050155f610f0b565b303b159150610f03565b839150610ef9565b346101f75760203660031901126101f7576004355f526005602052602060ff60405f2054166040519015158152f35b346101f75760203660031901126101f75760043561102d816101e9565b6110373633612905565b604051611043816103d9565b63ffffffff8092168082521561106757511663ffffffff19600a541617600a555f80f35b60405162461bcd60e51b815260206004820152601d60248201527f4f50503a20696e76616c696420726574656e74696f6e20636f6e6669670000006044820152606490fd5b346101f7575f3660031901126101f7576020600854604051908152f35b6004359061ffff821682036101f757565b359061ffff821682036101f757565b346101f7576040806003193601126101f7576111036110c9565b6024356001600160401b0381116101f757611122903690600401610493565b9160045415611205576111353633612905565b5f805160206142258339815191525461116490611158906001600160a01b031681565b6001600160a01b031690565b81516368fc2b7760e11b815261ffff841662010000176004820152336024820152908290829060449082905afa908115611200575f916111d2575b50156111af576105988383613157565b51639a28d60760e01b815233600482015261ffff91909116602482015260449150fd5b6111f29150823d84116111f9575b6111ea818361043d565b810190612465565b505f61119f565b503d6111e0565b61248b565b5163738c481160e01b8152600490fd5b91908260409103126101f75760405161122d816103f4565b8092803560ff811681036101f75782526020908101359161124d836101e9565b0152565b91906080838203126101f75760206112856040519261126f846103f4565b6040849661127d8382611215565b865201611215565b910152565b35906001600160401b03821682036101f757565b6001600160401b0381116103d45760051b60200190565b91909160409081818503126101f75781516112cf816103f4565b809482356112dc816101e9565b8252602092838101356001600160401b03918282116101f757019180601f840112156101f75782359061130e8261129e565b9661131b8151988961043d565b828852868089019360051b860101948286116101f757878101935b86851061134857505050505050500152565b84358681116101f75782019060609081601f1984880301126101f757845191611370836103b9565b61137b8c85016110da565b83528584013561138a816101e9565b8c840152830135918883116101f7576113aa878d80969581960101610493565b86820152815201940193611336565b9060406020610206936113e084825163ffffffff6020809260ff8151168552015116910152565b015191019063ffffffff6020809260ff8151168552015116910152565b90610e0991602081526114146020820183516113b9565b602082015190611432610140928360a084015261016083019061026c565b9160c0611478611453604087015195601f199687878303018588015261026c565b606087015163ffffffff1660e08601526080870151868683030161010087015261026c565b60a08601516001600160401b0316610120850152940151928285030191015261026c565b346101f7576003196040368201126101f757600480356001600160401b03928382116101f7576101409082360301126101f7576114d761045e565b906114e436828501611251565b825260848101358481116101f75761150190843691840101610493565b602083015260a48101358481116101f75761152190843691840101610493565b604083015261153260c482016101fb565b606083015260e48101358481116101f75761155290843691840101610493565b6080830152611564610104820161128a565b60a0830152610124810135908482116101f757836115859236920101610493565b60c08201526024359283116101f7576115a76115ad926102ce943691016112b5565b906125d7565b604051918291826113fd565b346101f7575f3660031901126101f7576020600454604051908152f35b346101f7575f3660031901126101f75760206004541515604051908152f35b346101f757611603366102d2565b600490815415611880576116173633612905565b80156118705781541461162657005b5f81556003549081156118615761163b611bb3565b915f5480155f146117f5575061164f6132f9565b604090604085015261167c61166c6001600160401b034216611935565b6001600160401b031660a0860152565b611684611bf0565b600181529161169281613343565b916020928385019081525f5b8381106117825750505050806116b7836116d6966125d7565b93818501519060405196879283926347f5343160e01b84528301610df8565b038173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4801561120057611749945f91611765575b505f5561173661171a60a08501516001600160401b031690565b6001600160401b03166001600160401b03196001541617600155565b61173e611c09565b92835282015261351d565b61175c611757600854611b42565b600855565b6105985f600355565b61177c9150823d84116105dd576105ce818361043d565b5f611700565b806117ee8161179b611795600195613050565b506133a7565b886117a8825161ffff1690565b9101516117dd6117bc825163ffffffff1690565b6117d16117c761046b565b61ffff9095168552565b63ffffffff16838c0152565b87820152855190610a568383611c7a565b500161169e565b604051630c9b3d8760e21b8152838101918252905f9082908190602001038173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4908115611200575f9161183f575b5061164f565b61185b91503d805f833e611853818361043d565b810190612550565b5f611839565b60405163783bc0f160e11b8152fd5b50604051636ad43cc360e11b8152fd5b5060405163738c481160e01b8152fd5b634e487b7160e01b5f52601160045260245ffd5b90600163ffffffff809316019182116118b957565b611890565b604051906118cb826103f4565b5f6020838281520152565b604051906118e3826103f4565b816118ec6118be565b815260206112856118be565b604051906119058261040f565b606060c0838281526119156118d6565b60208201525f60408201525f838201525f60808201528260a08201520152565b906103e86001600160401b03809316029182169182036118b957565b60075481101561198a57600a9060075f52027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801905f90565b610327565b9060405161199c816103f4565b915460ff8116835260081c63ffffffff166020830152565b90604080516119c2816103f4565b809363ffffffff80825416835260018092018054916119e08361129e565b956119ee604051978861043d565b83875260209160208801935f5260205f20915f945b868610611a1857505050505050505060200152565b60028589928451611a28816103b9565b86885461ffff8116835260101c1683820152611a45858901610d58565b86820152815201940195019492611a03565b90604051611a64816103f4565b602061128560088395604051611a798161040f565b604051611a85816103f4565b611a8e8361198f565b8152611a9c6001840161198f565b868201528152611aae60028301610d58565b85820152611abe60038301610d58565b6040820152611ae4611ad7600484015463ffffffff1690565b63ffffffff166060830152565b611af060058301610d58565b6080820152611b1c611b0c60068401546001600160401b031690565b6001600160401b031660a0830152565b611b2860078301610d58565b60c08201528552016119b4565b919082018092116118b957565b5f1981146118b95760010190565b15611b5757565b60405162461bcd60e51b815260206004820152602e60248201527f4f50503a20717565756564206d6573736167652065786365656473204d41585f60448201526d454e56454c4f50455f425954455360901b6064820152608490fd5b60405190611bc08261040f565b606060c083611bcd6118d6565b81528260208201528260408201525f838201528260808201525f60a08201520152565b60405190611bfd826103f4565b60606020835f81520152565b60405190611c16826103f4565b81611c1f611bb3565b81526020611285611bf0565b90611c358261129e565b611c42604051918261043d565b8281528092611c53601f199161129e565b01905f5b828110611c6357505050565b602090611c6e611c09565b82828501015201611c57565b805182101561198a5760209160051b010190565b919082039182116118b957565b818110611ca6575050565b5f8155600101611c9b565b90601f8211611cbe575050565b61020691600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020601f840160051c83019310611d07575b601f0160051c0190611c9b565b9091508190611cfa565b9190601f8111611d2057505050565b610206925f5260205f20906020601f840160051c83019310611d0757601f0160051c0190611c9b565b919091828114611e3057611d5d8354610c5f565b6001600160401b0381116103d457611d7f81611d798454610c5f565b84611d11565b5f93601f8211600114611dbe57611daf92939482915f92611db3575b50508160011b915f199060031b1c19161790565b9055565b015490505f80611d9b565b611dd0601f198316915f5260205f2090565b94611dde845f5260205f2090565b915f5b818110611e1857509583600195969710611e00575b505050811b019055565b01545f1960f88460031b161c191690555f8080611df6565b87830154845560019384019390920191602001611de1565b509050565b611e3f8154610c5f565b9081611e49575050565b81601f5f9311600114611e5a575055565b908083918252611e79601f60208420940160051c840160018501611c9b565b5555565b600160401b82116103d4578054828255808310611e9957505050565b6001916001600160ff1b0382811683036118b957841684036118b9575f5260205f209060011b81019260011b015b828110611ed357505050565b805f60029255611ee4838201611e35565b01611ec7565b818114611f7757815491611efe8383611e7d565b5f5260205f20905f5260205f20905f905b838210611f1c5750505050565b806001918403611f37575b6002809101930191019091611f0f565b8054845461ffff191661ffff919091161784558054845465ffffffff0000191665ffffffff0000909116178455611f72818301858401611d49565b611f27565b5050565b818103611f86575050565b60018083611fae63ffffffff610206965416859063ffffffff1663ffffffff19825416179055565b019101611eea565b9061212057818114159182611fca57505050565b600880918461020695611fe1575b50019101611f7b565b80612091575b50611ff86002820160028601611d49565b6120086003820160038601611d49565b61203561201c600483015463ffffffff1690565b600486019063ffffffff1663ffffffff19825416179055565b6120456005820160058601611d49565b61207b61205c60068301546001600160401b031690565b60068601906001600160401b03166001600160401b0319825416179055565b61208b6007820160078601611d49565b5f611fd8565b6120ee575b6001840160018201908181036120ad575b50611fe7565b8154815460ff191660ff919091161781556120e79163ffffffff9054851c1664ffffffff0082549160081b169064ffffffff001916179055565b5f806120a7565b8054845460ff191660ff919091161784558054845464ffffffff00191690831c60081b64ffffffff0016178455612096565b610c4c565b60075480156121e3575f190161213a81611951565b612120575f815560015f6001830155600960029261215a60028201611e35565b61216660038201611e35565b5f600482015561217860058201611e35565b5f600682015561218a60078201611e35565b5f600882015501908154915f8155826121a7575b50505050600755565b6001600160ff1b03831683036118b9575f5260205f209160011b8201915b8281101561219e57805f8592556121dd838201611e35565b016121c5565b634e487b7160e01b5f52603160045260245ffd5b156121fe57565b60405162461bcd60e51b815260206004820152603a60248201527f4f50503a20656e76656c6f70652065786365656473204d41585f454e56454c4f60448201527f50455f42595445532028657374696d61746f72206472696674290000000000006064820152608490fd5b9081516001600160401b0381116103d45761228e81612289600b54610c5f565b611cb1565b602080601f83116001146122ce575081906122be93945f926122c35750508160011b915f199060031b1c19161790565b600b55565b015190505f80611d9b565b90601f19831694612300600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990565b925f905b87821061233b575050836001959610612323575b505050811b01600b55565b01515f1960f88460031b161c191690555f8080612318565b80600185968294968601518155019501930190612304565b91909182516001600160401b0381116103d45761237481611d798454610c5f565b602080601f83116001146123a557508190611daf9394955f926122c35750508160011b915f199060031b1c19161790565b90601f198316956123b9855f5260205f2090565b925f905b8882106123f3575050836001959697106123db57505050811b019055565b01515f1960f88460031b161c191690555f8080611df6565b806001859682949686015181550195019301906123bd565b1561241257565b60405162461bcd60e51b815260206004820152602560248201527f4f50503a207265636f7264207374696c6c20696e20726574656e74696f6e2077604482015264696e646f7760d81b6064820152608490fd5b91908260409103126101f757815180151581036101f757602090920151610e09816101e9565b6040513d5f823e3d90fd5b908160209103126101f7575190565b90602080835260609060608401908063ffffffff94858151168288015201519460408080830152865180945260808201908360808660051b8501019801955f935b8685106124f95750505050505050505090565b90919293949596979998868061253b600193868f89908f607f198a8603018d52519061ffff8251168552868201511686850152015191818a820152019061026c565b9b9c9a019897969190910194019291906124e6565b6020818303126101f7578051906001600160401b0382116101f7570181601f820112156101f75780519061258382610478565b92612591604051948561043d565b828452602083830101116101f757815f9260208093018386015e8301015290565b90916125c9610e099360408452604084019061026c565b91602081840391015261026c565b906125e0611bb3565b506040805163765809ab60e11b81526004926020929173__$b91d2ad766fd07dc99f56c1a0b020615bb$__919084818061261c858a83016124a5565b0381865af4908115611200575f91612877575b5060808701908582518051155f146127f35750508451630c9b3d8760e21b8152878101918252905f90829081906020010381875af49283156112005761269c9361268f93612685935f926127d7575b50526131ef565b5163ffffffff1690565b63ffffffff166060870152565b815162409a0960e81b81525f81806126b6898983016113fd565b0381855af4908115611200575f916127bd575b50858401805180518061278257505052815163b93612a760e01b8152938385806126f5898583016113fd565b0381855af49283156112005761272e955f958695612763575b505051630c9b3d8760e21b81529081019283529384928391829160200190565b03915af4908115611200575f91612749575b5060c082015290565b61275d91503d805f833e611853818361043d565b5f612740565b61277a929550803d106105dd576105ce818361043d565b925f8061270e565b9150939250848496959296012090855190860120036127a2575050505090565b51630ca2e06d60e11b815292839261057592919084016125b2565b6127d191503d805f833e611853818361043d565b5f6126c9565b6127ec9192503d805f833e611853818361043d565b905f61267e565b9091935061281492508551809381926347f5343160e01b83528a8301610df8565b0381865af4908115611200575f9161285a575b5081810361283657505061269c565b8351631d97afef60e31b815280870192835260208301919091529081906040010390fd5b6128719150853d87116105dd576105ce818361043d565b5f612827565b61288e9150853d87116105dd576105ce818361043d565b5f61262f565b6004116101f7575f90600490565b6001600160e01b031990358181169392600481106128bf57505050565b60040360031b82901b16169150565b6001600160a01b0390911681526040602082018190528101829052606091805f848401375f828201840152601f01601f1916010190565b5f80516020614225833981519152805461293d906001600160a01b031661293461292e86612894565b906128a2565b9084309161367f565b901561294a575b50505050565b63ffffffff1615612a01575f80516020614225833981519152805460ff60a01b1916600160a01b17905561298b90611158908190546001600160a01b031690565b91823b156101f7576129b6925f9283604051809681958294634a63ebf760e11b8452600484016128ce565b03925af18015611200576129e8575b505f80516020614225833981519152805460ff60a01b191690555f808080612944565b806129f56129fb9261042a565b80610262565b5f6129c5565b60405162d1953b60e31b81526001600160a01b0383166004820152602490fd5b5f8051602061422583398151915280546001600160a01b0319166001600160a01b0390921691821790556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602090a1565b600d5480612a945750604051612a8e816103d9565b5f815290565b60405190630c9b3d8760e21b825260048201525f8160248173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4908115611200575f91612ad4575090565b610e0991503d805f833e611853818361043d565b61010090602080910190602082510151515f925b818410612b0a575050505090565b909192936018808201918281116118b9576040612b2b888887510151611c7a565b5101515101018091116118b95793600101929190612afc565b805191908290602001825e015f815290565b612b5e610bf5565b612b66613911565b92604080518095602094858301612b7c91612b44565b612b8591612b44565b0394601f19958681018252612b9a908261043d565b8451612ba590613759565b908251918291868301612bb791612b44565b612bc091612b44565b038681018252612bd0908261043d565b612bd8613928565b908251918291868301612bea91612b44565b612bf391612b44565b038681018252612c03908261043d565b83850151612c1090613795565b908151612c23906001600160401b031690565b612c2c90613a38565b908351918291878301612c3e91612b44565b612c4791612b44565b038781018252612c57908261043d565b8251918291868301612c6891612b44565b612c7191612b44565b038681018252612c81908261043d565b612c8961393b565b908251918291868301612c9b91612b44565b612ca491612b44565b038681018252612cb4908261043d565b848201516001600160401b0316612cca90613a38565b908251918291868301612cdc91612b44565b612ce591612b44565b038681018252612cf5908261043d565b612cfd61394e565b908251918291868301612d0f91612b44565b612d1891612b44565b038681018252612d28908261043d565b6060850151612d3c9063ffffffff16613a38565b908251918291868301612d4e91612b44565b612d5791612b44565b038681018252612d67908261043d565b612d6f613961565b908251918291868301612d8191612b44565b612d8a91612b44565b038681018252612d9a908261043d565b6080850151612dae9063ffffffff16613a38565b908251918291868301612dc091612b44565b612dc991612b44565b038681018252612dd9908261043d565b612de1613974565b908251918291868301612df391612b44565b612dfc91612b44565b038681018252612e0c908261043d565b60a0850151612e1a90613759565b908251918291868301612e2c91612b44565b612e3591612b44565b038681018252612e45908261043d565b915f925b60c08601805151851015612f0f57612e8f612f0560c093612ef9612ead612ea78a6001978f612ea1908f612e958f612e8f612e826139b9565b91519b8c94850190612b44565b90612b44565b0390810188528761043d565b51611c7a565b51613ab7565b612eeb8d8c612edf8c612e8f612ed2612ecd88516001600160401b031690565b613a38565b9151988994850190612b44565b0390810185528461043d565b88519485938c850190612b44565b038a810183528261043d565b9401939050612e49565b5095509350505050565b63ffffffff8082165f52600960205260405f2090815416612f7a57612f50600192829063ffffffff1663ffffffff19825416179055565b80546bffffffffffffffff0000000019164260201b6bffffffffffffffff00000000161781550155565b505050565b612f969063ffffffff91829182600a541690612fd7565b16908115159081612fbf575b50612faa5750565b5f5260096020525f6001604082208281550155565b9050815f52600960205260405f20541615155f612fa2565b63ffffffff91908282168382161115612fef57031690565b5050505f90565b61301f90613002613bb7565b61300a613bb7565b613012613bb7565b61301a613bb7565b612a21565b613027613bb7565b61302f613bb7565b60c860405161303d816103d9565b5260c863ffffffff19600a541617600a55565b60025481101561198a5760025f5260011b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01905f90565b929190612120578051835461ffff191661ffff91909116178355600180930190602080910151938451916001600160401b0383116103d4576130d4836130ce8654610c5f565b86611d11565b602091601f84116001146131065750508190611daf9394955f926122c35750508160011b915f199060031b1c19161790565b95601f9291921984169661311d865f5260205f2090565b935f915b89831061314057505050836001959697106123db57505050811b019055565b838501518655948501949381019391810191613121565b600254916003548084115f146131ac575061020692506131856040519261317d846103f4565b61ffff168352565b60208201526131a66003546131a161319c82611b42565b600355565b613050565b90613088565b6131b590611b42565b60035561ffff604051926131c8846103f4565b1682526020820152600160401b8210156103d4576131a68260016102069401600255613050565b613222916131fb610bf5565b906132046139d9565b612e8f613268604092604051978891612e8f60209889850190612b44565b0396613236601f199889810183528261043d565b61325c61324d612ecd6108558a5163ffffffff1690565b60405194859389850190612b44565b0387810183528261043d565b915f925b848601805151851015612f0f57612e8f6132ef612e8f612ef989956132e18d6132bb6132b58d60019a612ea18f6132a98f91612e8f612e82613928565b0386810189528861043d565b51613be5565b92612edf6132d3612ecd86516001600160401b031690565b8d519788938d850190612b44565b885194859388850190612b44565b940193905061326c565b604051613305816103d9565b5f8152905f368137565b6040519061331c826103f4565b6001825260203681840137565b60405190613336826103f4565b600a825260203681840137565b9061334d8261129e565b60409061335d604051918261043d565b838152809361336e601f199161129e565b01915f5b83811061337f5750505050565b602090825161338d816103b9565b5f8152825f81830152606085830152828601015201613372565b906040516133b4816103f4565b60206112856001839561ffff815416855201610d58565b8151815463ffffffff191663ffffffff91821617825591600180920160208092015191808351936133fc8585611e7d565b01915f52805f205f925b8484106134165750505050505050565b8051805183548583015161ffff90921665ffffffffffff199091161790891660101b65ffffffff0000161783556040015180519187840191906001600160401b0384116103d45782869261346f86611d798d9754610c5f565b8390601f87116001146134af5795806134a092600297985f926122c35750508160011b915f199060031b1c19161790565b90555b01920193019290613406565b9590601f198216966134c4845f5260205f2090565b975f5b818110613504575091879891846002999594106134ec575b505050811b0190556134a3565b01515f1960f88460031b161c191690555f80806134df565b838301518a5597909801978d978b9793840193016134c7565b600754600160401b8110156103d45780600161353c9201600755611951565b61212057600860208361367660c061020696516135d6815186613598825161357260ff8251168d9060ff1660ff19825416179055565b909101518a5464ffffffff00191660089190911b64ffffffff0016178a5563ffffffff90565b878060018c019301516135b960ff825116859060ff1660ff19825416179055565b0151825464ffffffff001916911660081b64ffffffff0016179055565b6135e68582015160028901612353565b6135f7604082015160038901612353565b61362461360b606083015163ffffffff1690565b600489019063ffffffff1663ffffffff19825416179055565b613635608082015160058901612353565b61366b61364c60a08301516001600160401b031690565b60068901906001600160401b03166001600160401b0319825416179055565b015160078601612353565b015191016133cb565b93915f945f9460405193602085019363b700961360e01b855260018060a01b03809216602487015216604485015263ffffffff60e01b1660648401526064835260a08301918383106001600160401b038411176103d4576040935f9385528380528360205251915afa6136ee57565b9150505f51906020518060201c150290565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811630811491821561373e575b50506106e757565b5f805160206142458339815191525416141590505f80613736565b610e09612e8f916137876137766001600160401b03835116613a38565b916040519485936020850190612b44565b03601f19810183528261043d565b61379d610bf5565b906137a6613911565b60408051938460209384928383016137bd91612b44565b6137c691612b44565b0393601f199485810187526137db908761043d565b80516137e690613d8f565b9586516137f9906001600160401b031690565b61380290613a38565b90845191829185830161381491612b44565b61381d91612b44565b03868101825261382d908261043d565b835196879184830161383e91612b44565b61384791612b44565b038581018752613857908761043d565b61385f613928565b95835196879184830161387191612b44565b61387a91612b44565b03858101875261388a908761043d565b015161389590613d8f565b9081516138a8906001600160401b031690565b6138b190613a38565b9481519586918583016138c391612b44565b6138cc91612b44565b0384810186526138dc908661043d565b5193849283016138eb91612b44565b6138f491612b44565b039081018252610e09908261043d565b80511561198a5760200190565b61391961330f565b600a61392482613904565b5390565b61393061330f565b601261392482613904565b61394361330f565b602861392482613904565b61395661330f565b603061392482613904565b61396961330f565b603861392482613904565b61397c613329565b60a25f5b607f808311156139a55790608060019284161760208286010153019060071c90613980565b50607f600192166020828501015301815290565b6139c1613329565b61014260015f60c26020850153019060071c90613980565b6139e161330f565b600861392482613904565b6139f461330f565b601061392482613904565b613a0761330f565b601a61392482613904565b613a1a61330f565b603261392482613904565b613a2d61330f565b604261392482613904565b9060809160806001600160401b03821610613a9357613a55613329565b5f5b607f80841115613a7b57908560019285161760208285010153019160071c91613a57565b5090929350607f600192166020828501015301815290565b909150613a9e61330f565b9060f81b6001600160f81b0319165f1a61392482613904565b613abf610bf5565b90613ac8613911565b6040805193846020938492838301613adf91612b44565b613ae891612b44565b0393601f19948581018752613afd908761043d565b8051613b0890613e47565b958651613b1b906001600160401b031690565b613b2490613a38565b908451918291858301613b3691612b44565b613b3f91612b44565b038681018252613b4f908261043d565b8351968791848301613b6091612b44565b613b6991612b44565b038581018752613b79908761043d565b613b81613928565b958351968791848301613b9391612b44565b613b9c91612b44565b038581018752613bac908761043d565b0151613895906131ef565b60ff5f805160206142658339815191525460401c1615613bd357565b604051631afcd79f60e31b8152600490fd5b610e09613c26612e8f92613cde613cca612e8f613cd1613c03610bf5565b94613c0c6139d9565b9060409485928351998a91612e8f60209b8c850190612b44565b0398613c3a601f199a8b810183528261043d565b613c7989613c6d613c5d612ecd613c56613c56895161ffff1690565b61ffff1690565b612e8f8851958694850190612b44565b038b810183528261043d565b613c8889613c6d613c5d6139ec565b613ca589613c6d613c5d612ecd6108558489015163ffffffff1690565b613cbe613cb06139ff565b85519d8e938c850190612b44565b038981018c528b61043d565b0151613759565b9151968794850190612b44565b0390810183528261043d565b90813b15613d6e575f8051602061424583398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115613d5357613d5091614181565b50565b505034613d5c57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b610e09612e8f612e8f613cde613e37612ecd6108556020612e8f98613e2c612e8f613e06613dbb610bf5565b613dd5613dc66139d9565b6040519d8e9389850190612b44565b039a613de9601f199c8d810183528261043d565b613c6d61324d612ecd613e00613e00895160ff1690565b60ff1690565b613e20613e116139ec565b6040519a8b9387850190612b44565b0389810189528861043d565b015163ffffffff1690565b6040519586936020850190612b44565b613e4f610bf5565b90613e58613911565b91604080518094602093848301613e6e91612b44565b613e7791612b44565b0392601f19938481018652613e8c908661043d565b8051613e9790613795565b948551613eaa906001600160401b031690565b613eb390613a38565b908351918291868301613ec591612b44565b613ece91612b44565b038581018252613ede908261043d565b8251958691858301613eef91612b44565b613ef891612b44565b038481018652613f08908661043d565b613f10613928565b948251958691858301613f2291612b44565b613f2b91612b44565b038481018652613f3b908661043d565b82810151613f4890613759565b948251958691858301613f5a91612b44565b613f6391612b44565b038481018652613f73908661043d565b613f7b6139ff565b948251958691858301613f8d91612b44565b613f9691612b44565b038481018652613fa6908661043d565b81810151613fb390613759565b948251958691858301613fc591612b44565b613fce91612b44565b038481018652613fde908661043d565b613fe661393b565b948251958691858301613ff891612b44565b61400191612b44565b038481018652614011908661043d565b60608101516140259063ffffffff16613a38565b94825195869185830161403791612b44565b61404091612b44565b038481018652614050908661043d565b614058613a12565b94825195869185830161406a91612b44565b61407391612b44565b038481018652614083908661043d565b608081015161409190613759565b9482519586918583016140a391612b44565b6140ac91612b44565b0384810186526140bc908661043d565b6140c4613961565b9482519586918583016140d691612b44565b6140df91612b44565b0384810186526140ef908661043d565b60a08101516001600160401b031661410690613a38565b94825195869185830161411891612b44565b61412191612b44565b038481018652614131908661043d565b614139613a25565b94825195869185830161414b91612b44565b61415491612b44565b038481018652614164908661043d565b60c0015161417190613759565b905193849283016138eb91612b44565b5f80610e0993602081519101845af43d156141bd573d916141a183610478565b926141af604051948561043d565b83523d5f602085013e6141c1565b6060915b906141e857508051156141d657602081519101fd5b60405163d6bda27560e01b8152600490fd5b8151158061421b575b6141f9575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156141f156fef3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212201dd53cc2caf86754ed88247c9b779f72471445dd4bcf6d516a7bf3bb29c0dce864736f6c63430008190033", + "deployedBytecode": "0x60806040526004361015610011575f80fd5b5f3560e01c806304676e38146101e45780630d6f1e9d146101df57806327e935a1146101da57806347453a2a146101d55780634f1ef286146101d05780634fca79cb146101cb57806352d1902d146101c6578063621fbd59146101c15780637a9e5e4b146101bc5780638fb36037146101b757806393ec06be146101b257806395fabcf0146101ad578063a3ad9cc3146101a8578063a593aec2146101a3578063a9e50c101461019e578063ad3cb1cc14610199578063b244542b14610194578063b8f8d7e51461018f578063bf7e214f1461018a578063c16a8a5614610185578063c4d66de814610180578063c94c93e71461017b578063d5b5272a14610176578063e006490014610171578063e0c14aa81461016c578063e2fc04ae14610167578063e36f9a0714610162578063e44efb5a1461015d5763f5786b4b14610158575f80fd5b6115f5565b6115d6565b6115b9565b61149c565b6110e9565b6110ac565b611010565b610fe1565b610eb5565b610e92565b610e5e565b610e3b565b610e0c565b610c07565b610bcf565b610af3565b610819565b6107fc565b6107df565b61078f565b610715565b6106f9565b610690565b6105e4565b6104d9565b61033b565b6102e4565b610290565b610208565b63ffffffff8116036101f757565b5f80fd5b3590610206826101e9565b565b346101f75760203660031901126101f7576060600435610227816101e9565b63ffffffff8091165f52600960205260405f206001600160401b036001825492015491604051938116845260201c1660208301526040820152f35b5f9103126101f757565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346101f7575f3660031901126101f75763ffffffff600c54166102b1610c97565b906102ce604051928392835260406020840152604083019061026c565b0390f35b60209060031901126101f75760043590565b346101f7576102f2366102d2565b6102fc3633612905565b8015610315576004541561030c57005b6004555f600355005b604051636ad43cc360e11b8152600490fd5b634e487b7160e01b5f52603260045260245ffd5b346101f757610349366102d2565b6006548110156101f75760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01546040516001600160a01b039091168152602090f35b600435906001600160a01b03821682036101f757565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176103d457604052565b6103a5565b602081019081106001600160401b038211176103d457604052565b604081019081106001600160401b038211176103d457604052565b60e081019081106001600160401b038211176103d457604052565b6001600160401b0381116103d457604052565b90601f801991011681019081106001600160401b038211176103d457604052565b604051906102068261040f565b60405190610206826103b9565b6001600160401b0381116103d457601f01601f191660200190565b81601f820112156101f7578035906104aa82610478565b926104b8604051948561043d565b828452602083830101116101f757815f926020809301838601378301015290565b60403660031901126101f7576104ed61038f565b6024356001600160401b0381116101f75761050c903690600401610493565b90610515613700565b61051f3633612905565b610527613700565b6040516352d1902d60e01b8152916020836004816001600160a01b0386165afa5f93816105b3575b5061057957604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b0390fd5b905f80516020614245833981519152830361059a576105989250613cea565b005b604051632a87526960e21b815260048101849052602490fd5b6105d691945060203d6020116105dd575b6105ce818361043d565b810190612496565b925f61054f565b503d6105c4565b346101f75760203660031901126101f7576102ce600435610604816101e9565b60405f818051610613816103b9565b828152826020820152015263ffffffff8092165f5260096020526001815f206001600160401b03835194610646866103b9565b8254908116865260201c1660208501520154818301525191829182919091604080606083019463ffffffff81511684526001600160401b0360208201511660208501520151910152565b346101f7575f3660031901126101f7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036106e75760206040515f805160206142458339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f7575f3660031901126101f75760205f54604051908152f35b346101f75760203660031901126101f75761072e61038f565b5f80516020614225833981519152546001600160a01b0391908216330361077857803b1561075f5761059890612a21565b6040516361798f2f60e11b815291166004820152602490fd5b60405162d1953b60e31b8152336004820152602490fd5b346101f7575f3660031901126101f7575f805160206142258339815191525460a01c60ff16156107d7576020638fb3603760e01b5b6040516001600160e01b03199091168152f35b60205f6107c4565b346101f7575f3660031901126101f7576020604051620100008152f35b346101f7575f3660031901126101f7576020600354604051908152f35b346101f75760203660031901126101f757600435610836816101e9565b6108403633612905565b600c5463ffffffff1661085e610855826118a4565b63ffffffff1690565b63ffffffff831603610ac457506108736118f8565b63ffffffff821660608201526108a46108946001600160401b034216611935565b6001600160401b03166040830152565b6108ac612a79565b60a08201525f60085480151580610952575b7fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d88761094d866109416108ef88612b56565b9161090062010000845111156121f7565b610922835160208501206109148184612f19565b61091d83612f7f565b600d55565b61092b83612269565b63ffffffff1663ffffffff19600c541617600c55565b60405191829182610df8565b0390a1005b5f6101005b838210610a6e575b50506109759083159081610a66575b5015611b50565b8161097f81611c2b565b60c085019081525f5b828110610a2e57505061099a91611c8e565b905f5b828110610a0057505f5b8181106109ef575050916109416108ef61094d936109e57fe93b186dfb145614c1bb2c64e844f7211236c8c919656e5e745d6cdb6260d88796600855565b93508294506108be565b6001906109fa612125565b016109a7565b80610a28610a18610a1360019486611b35565b611951565b50610a2283611951565b90611fb6565b0161099d565b6001919250610a5c81610a4081611951565b50610a4c865191611a57565b610a568383611c7a565b52611c7a565b5001908391610988565b90505f61096e565b610a8a610a85610a7f849794611951565b50611a57565b612ae8565b9062010000610a998383611b35565b11610abb57610aad600192610ab392611b35565b92611b42565b940190610957565b5081945061095f565b610acd906118a4565b6040516307d3e83d60e51b815263ffffffff918216600482015291166024820152604490fd5b346101f75760203660031901126101f757600435610b10816101e9565b610b1a3633612905565b63ffffffff80821690815f52600960205260405f20541615610b8a5761059891610b6b610b7f92610b64610855610b56600a5463ffffffff1690565b600c5463ffffffff16612fd7565b101561240b565b63ffffffff165f52600960205260405f2090565b60015f918281550155565b60405162461bcd60e51b815260206004820152601760248201527f4f50503a207265636f7264206e6f742070726573656e740000000000000000006044820152606490fd5b346101f7575f3660031901126101f75760206001600160401b0360015416604051908152f35b60405190610c02826103d9565b5f8252565b346101f7575f3660031901126101f7576102ce604051610c26816103f4565b60058152640352e302e360dc1b602082015260405191829160208352602083019061026c565b634e487b7160e01b5f525f60045260245ffd5b90600182811c92168015610c8d575b6020831014610c7957565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610c6e565b604051905f82600b5491610caa83610c5f565b80835292602090600190818116908115610d345750600114610cd5575b50506102069250038361043d565b915092600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9935f925b828410610d1c57506102069450505081016020015f80610cc7565b85548885018301529485019487945092810192610d01565b9150506020925061020694915060ff191682840152151560051b8201015f80610cc7565b9060405191825f8254610d6a81610c5f565b908184526020946001916001811690815f14610dd65750600114610d98575b5050506102069250038361043d565b5f90815285812095935091905b818310610dbe57505061020693508201015f8080610d89565b85548884018501529485019487945091830191610da5565b9250505061020694925060ff191682840152151560051b8201015f8080610d89565b906020610e0992818152019061026c565b90565b346101f7575f3660031901126101f7576102ce610e27610c97565b60405191829160208352602083019061026c565b346101f7575f3660031901126101f757602063ffffffff600c5416604051908152f35b346101f7575f3660031901126101f7575f80516020614225833981519152546040516001600160a01b039091168152602090f35b346101f7575f3660031901126101f757602063ffffffff600a5416604051908152f35b346101f75760203660031901126101f757610ece61038f565b5f8051602061426583398151915254906001600160401b0360ff8360401c1615921680159081610fd9575b6001149081610fcf575b159081610fc6575b50610fb4575f80516020614265833981519152805467ffffffffffffffff19166001179055610f3e9082610f9057612ff6565b610f4457005b5f80516020614265833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290806020810161094d565b5f80516020614265833981519152805460ff60401b1916600160401b179055612ff6565b60405163f92ee8a960e01b8152600490fd5b9050155f610f0b565b303b159150610f03565b839150610ef9565b346101f75760203660031901126101f7576004355f526005602052602060ff60405f2054166040519015158152f35b346101f75760203660031901126101f75760043561102d816101e9565b6110373633612905565b604051611043816103d9565b63ffffffff8092168082521561106757511663ffffffff19600a541617600a555f80f35b60405162461bcd60e51b815260206004820152601d60248201527f4f50503a20696e76616c696420726574656e74696f6e20636f6e6669670000006044820152606490fd5b346101f7575f3660031901126101f7576020600854604051908152f35b6004359061ffff821682036101f757565b359061ffff821682036101f757565b346101f7576040806003193601126101f7576111036110c9565b6024356001600160401b0381116101f757611122903690600401610493565b9160045415611205576111353633612905565b5f805160206142258339815191525461116490611158906001600160a01b031681565b6001600160a01b031690565b81516368fc2b7760e11b815261ffff841662010000176004820152336024820152908290829060449082905afa908115611200575f916111d2575b50156111af576105988383613157565b51639a28d60760e01b815233600482015261ffff91909116602482015260449150fd5b6111f29150823d84116111f9575b6111ea818361043d565b810190612465565b505f61119f565b503d6111e0565b61248b565b5163738c481160e01b8152600490fd5b91908260409103126101f75760405161122d816103f4565b8092803560ff811681036101f75782526020908101359161124d836101e9565b0152565b91906080838203126101f75760206112856040519261126f846103f4565b6040849661127d8382611215565b865201611215565b910152565b35906001600160401b03821682036101f757565b6001600160401b0381116103d45760051b60200190565b91909160409081818503126101f75781516112cf816103f4565b809482356112dc816101e9565b8252602092838101356001600160401b03918282116101f757019180601f840112156101f75782359061130e8261129e565b9661131b8151988961043d565b828852868089019360051b860101948286116101f757878101935b86851061134857505050505050500152565b84358681116101f75782019060609081601f1984880301126101f757845191611370836103b9565b61137b8c85016110da565b83528584013561138a816101e9565b8c840152830135918883116101f7576113aa878d80969581960101610493565b86820152815201940193611336565b9060406020610206936113e084825163ffffffff6020809260ff8151168552015116910152565b015191019063ffffffff6020809260ff8151168552015116910152565b90610e0991602081526114146020820183516113b9565b602082015190611432610140928360a084015261016083019061026c565b9160c0611478611453604087015195601f199687878303018588015261026c565b606087015163ffffffff1660e08601526080870151868683030161010087015261026c565b60a08601516001600160401b0316610120850152940151928285030191015261026c565b346101f7576003196040368201126101f757600480356001600160401b03928382116101f7576101409082360301126101f7576114d761045e565b906114e436828501611251565b825260848101358481116101f75761150190843691840101610493565b602083015260a48101358481116101f75761152190843691840101610493565b604083015261153260c482016101fb565b606083015260e48101358481116101f75761155290843691840101610493565b6080830152611564610104820161128a565b60a0830152610124810135908482116101f757836115859236920101610493565b60c08201526024359283116101f7576115a76115ad926102ce943691016112b5565b906125d7565b604051918291826113fd565b346101f7575f3660031901126101f7576020600454604051908152f35b346101f7575f3660031901126101f75760206004541515604051908152f35b346101f757611603366102d2565b600490815415611880576116173633612905565b80156118705781541461162657005b5f81556003549081156118615761163b611bb3565b915f5480155f146117f5575061164f6132f9565b604090604085015261167c61166c6001600160401b034216611935565b6001600160401b031660a0860152565b611684611bf0565b600181529161169281613343565b916020928385019081525f5b8381106117825750505050806116b7836116d6966125d7565b93818501519060405196879283926347f5343160e01b84528301610df8565b038173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4801561120057611749945f91611765575b505f5561173661171a60a08501516001600160401b031690565b6001600160401b03166001600160401b03196001541617600155565b61173e611c09565b92835282015261351d565b61175c611757600854611b42565b600855565b6105985f600355565b61177c9150823d84116105dd576105ce818361043d565b5f611700565b806117ee8161179b611795600195613050565b506133a7565b886117a8825161ffff1690565b9101516117dd6117bc825163ffffffff1690565b6117d16117c761046b565b61ffff9095168552565b63ffffffff16838c0152565b87820152855190610a568383611c7a565b500161169e565b604051630c9b3d8760e21b8152838101918252905f9082908190602001038173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4908115611200575f9161183f575b5061164f565b61185b91503d805f833e611853818361043d565b810190612550565b5f611839565b60405163783bc0f160e11b8152fd5b50604051636ad43cc360e11b8152fd5b5060405163738c481160e01b8152fd5b634e487b7160e01b5f52601160045260245ffd5b90600163ffffffff809316019182116118b957565b611890565b604051906118cb826103f4565b5f6020838281520152565b604051906118e3826103f4565b816118ec6118be565b815260206112856118be565b604051906119058261040f565b606060c0838281526119156118d6565b60208201525f60408201525f838201525f60808201528260a08201520152565b906103e86001600160401b03809316029182169182036118b957565b60075481101561198a57600a9060075f52027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68801905f90565b610327565b9060405161199c816103f4565b915460ff8116835260081c63ffffffff166020830152565b90604080516119c2816103f4565b809363ffffffff80825416835260018092018054916119e08361129e565b956119ee604051978861043d565b83875260209160208801935f5260205f20915f945b868610611a1857505050505050505060200152565b60028589928451611a28816103b9565b86885461ffff8116835260101c1683820152611a45858901610d58565b86820152815201940195019492611a03565b90604051611a64816103f4565b602061128560088395604051611a798161040f565b604051611a85816103f4565b611a8e8361198f565b8152611a9c6001840161198f565b868201528152611aae60028301610d58565b85820152611abe60038301610d58565b6040820152611ae4611ad7600484015463ffffffff1690565b63ffffffff166060830152565b611af060058301610d58565b6080820152611b1c611b0c60068401546001600160401b031690565b6001600160401b031660a0830152565b611b2860078301610d58565b60c08201528552016119b4565b919082018092116118b957565b5f1981146118b95760010190565b15611b5757565b60405162461bcd60e51b815260206004820152602e60248201527f4f50503a20717565756564206d6573736167652065786365656473204d41585f60448201526d454e56454c4f50455f425954455360901b6064820152608490fd5b60405190611bc08261040f565b606060c083611bcd6118d6565b81528260208201528260408201525f838201528260808201525f60a08201520152565b60405190611bfd826103f4565b60606020835f81520152565b60405190611c16826103f4565b81611c1f611bb3565b81526020611285611bf0565b90611c358261129e565b611c42604051918261043d565b8281528092611c53601f199161129e565b01905f5b828110611c6357505050565b602090611c6e611c09565b82828501015201611c57565b805182101561198a5760209160051b010190565b919082039182116118b957565b818110611ca6575050565b5f8155600101611c9b565b90601f8211611cbe575050565b61020691600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020601f840160051c83019310611d07575b601f0160051c0190611c9b565b9091508190611cfa565b9190601f8111611d2057505050565b610206925f5260205f20906020601f840160051c83019310611d0757601f0160051c0190611c9b565b919091828114611e3057611d5d8354610c5f565b6001600160401b0381116103d457611d7f81611d798454610c5f565b84611d11565b5f93601f8211600114611dbe57611daf92939482915f92611db3575b50508160011b915f199060031b1c19161790565b9055565b015490505f80611d9b565b611dd0601f198316915f5260205f2090565b94611dde845f5260205f2090565b915f5b818110611e1857509583600195969710611e00575b505050811b019055565b01545f1960f88460031b161c191690555f8080611df6565b87830154845560019384019390920191602001611de1565b509050565b611e3f8154610c5f565b9081611e49575050565b81601f5f9311600114611e5a575055565b908083918252611e79601f60208420940160051c840160018501611c9b565b5555565b600160401b82116103d4578054828255808310611e9957505050565b6001916001600160ff1b0382811683036118b957841684036118b9575f5260205f209060011b81019260011b015b828110611ed357505050565b805f60029255611ee4838201611e35565b01611ec7565b818114611f7757815491611efe8383611e7d565b5f5260205f20905f5260205f20905f905b838210611f1c5750505050565b806001918403611f37575b6002809101930191019091611f0f565b8054845461ffff191661ffff919091161784558054845465ffffffff0000191665ffffffff0000909116178455611f72818301858401611d49565b611f27565b5050565b818103611f86575050565b60018083611fae63ffffffff610206965416859063ffffffff1663ffffffff19825416179055565b019101611eea565b9061212057818114159182611fca57505050565b600880918461020695611fe1575b50019101611f7b565b80612091575b50611ff86002820160028601611d49565b6120086003820160038601611d49565b61203561201c600483015463ffffffff1690565b600486019063ffffffff1663ffffffff19825416179055565b6120456005820160058601611d49565b61207b61205c60068301546001600160401b031690565b60068601906001600160401b03166001600160401b0319825416179055565b61208b6007820160078601611d49565b5f611fd8565b6120ee575b6001840160018201908181036120ad575b50611fe7565b8154815460ff191660ff919091161781556120e79163ffffffff9054851c1664ffffffff0082549160081b169064ffffffff001916179055565b5f806120a7565b8054845460ff191660ff919091161784558054845464ffffffff00191690831c60081b64ffffffff0016178455612096565b610c4c565b60075480156121e3575f190161213a81611951565b612120575f815560015f6001830155600960029261215a60028201611e35565b61216660038201611e35565b5f600482015561217860058201611e35565b5f600682015561218a60078201611e35565b5f600882015501908154915f8155826121a7575b50505050600755565b6001600160ff1b03831683036118b9575f5260205f209160011b8201915b8281101561219e57805f8592556121dd838201611e35565b016121c5565b634e487b7160e01b5f52603160045260245ffd5b156121fe57565b60405162461bcd60e51b815260206004820152603a60248201527f4f50503a20656e76656c6f70652065786365656473204d41585f454e56454c4f60448201527f50455f42595445532028657374696d61746f72206472696674290000000000006064820152608490fd5b9081516001600160401b0381116103d45761228e81612289600b54610c5f565b611cb1565b602080601f83116001146122ce575081906122be93945f926122c35750508160011b915f199060031b1c19161790565b600b55565b015190505f80611d9b565b90601f19831694612300600b5f527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990565b925f905b87821061233b575050836001959610612323575b505050811b01600b55565b01515f1960f88460031b161c191690555f8080612318565b80600185968294968601518155019501930190612304565b91909182516001600160401b0381116103d45761237481611d798454610c5f565b602080601f83116001146123a557508190611daf9394955f926122c35750508160011b915f199060031b1c19161790565b90601f198316956123b9855f5260205f2090565b925f905b8882106123f3575050836001959697106123db57505050811b019055565b01515f1960f88460031b161c191690555f8080611df6565b806001859682949686015181550195019301906123bd565b1561241257565b60405162461bcd60e51b815260206004820152602560248201527f4f50503a207265636f7264207374696c6c20696e20726574656e74696f6e2077604482015264696e646f7760d81b6064820152608490fd5b91908260409103126101f757815180151581036101f757602090920151610e09816101e9565b6040513d5f823e3d90fd5b908160209103126101f7575190565b90602080835260609060608401908063ffffffff94858151168288015201519460408080830152865180945260808201908360808660051b8501019801955f935b8685106124f95750505050505050505090565b90919293949596979998868061253b600193868f89908f607f198a8603018d52519061ffff8251168552868201511686850152015191818a820152019061026c565b9b9c9a019897969190910194019291906124e6565b6020818303126101f7578051906001600160401b0382116101f7570181601f820112156101f75780519061258382610478565b92612591604051948561043d565b828452602083830101116101f757815f9260208093018386015e8301015290565b90916125c9610e099360408452604084019061026c565b91602081840391015261026c565b906125e0611bb3565b506040805163765809ab60e11b81526004926020929173__$b91d2ad766fd07dc99f56c1a0b020615bb$__919084818061261c858a83016124a5565b0381865af4908115611200575f91612877575b5060808701908582518051155f146127f35750508451630c9b3d8760e21b8152878101918252905f90829081906020010381875af49283156112005761269c9361268f93612685935f926127d7575b50526131ef565b5163ffffffff1690565b63ffffffff166060870152565b815162409a0960e81b81525f81806126b6898983016113fd565b0381855af4908115611200575f916127bd575b50858401805180518061278257505052815163b93612a760e01b8152938385806126f5898583016113fd565b0381855af49283156112005761272e955f958695612763575b505051630c9b3d8760e21b81529081019283529384928391829160200190565b03915af4908115611200575f91612749575b5060c082015290565b61275d91503d805f833e611853818361043d565b5f612740565b61277a929550803d106105dd576105ce818361043d565b925f8061270e565b9150939250848496959296012090855190860120036127a2575050505090565b51630ca2e06d60e11b815292839261057592919084016125b2565b6127d191503d805f833e611853818361043d565b5f6126c9565b6127ec9192503d805f833e611853818361043d565b905f61267e565b9091935061281492508551809381926347f5343160e01b83528a8301610df8565b0381865af4908115611200575f9161285a575b5081810361283657505061269c565b8351631d97afef60e31b815280870192835260208301919091529081906040010390fd5b6128719150853d87116105dd576105ce818361043d565b5f612827565b61288e9150853d87116105dd576105ce818361043d565b5f61262f565b6004116101f7575f90600490565b6001600160e01b031990358181169392600481106128bf57505050565b60040360031b82901b16169150565b6001600160a01b0390911681526040602082018190528101829052606091805f848401375f828201840152601f01601f1916010190565b5f80516020614225833981519152805461293d906001600160a01b031661293461292e86612894565b906128a2565b9084309161367f565b901561294a575b50505050565b63ffffffff1615612a01575f80516020614225833981519152805460ff60a01b1916600160a01b17905561298b90611158908190546001600160a01b031690565b91823b156101f7576129b6925f9283604051809681958294634a63ebf760e11b8452600484016128ce565b03925af18015611200576129e8575b505f80516020614225833981519152805460ff60a01b191690555f808080612944565b806129f56129fb9261042a565b80610262565b5f6129c5565b60405162d1953b60e31b81526001600160a01b0383166004820152602490fd5b5f8051602061422583398151915280546001600160a01b0319166001600160a01b0390921691821790556040519081527f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90602090a1565b600d5480612a945750604051612a8e816103d9565b5f815290565b60405190630c9b3d8760e21b825260048201525f8160248173__$b91d2ad766fd07dc99f56c1a0b020615bb$__5af4908115611200575f91612ad4575090565b610e0991503d805f833e611853818361043d565b61010090602080910190602082510151515f925b818410612b0a575050505090565b909192936018808201918281116118b9576040612b2b888887510151611c7a565b5101515101018091116118b95793600101929190612afc565b805191908290602001825e015f815290565b612b5e610bf5565b612b66613911565b92604080518095602094858301612b7c91612b44565b612b8591612b44565b0394601f19958681018252612b9a908261043d565b8451612ba590613759565b908251918291868301612bb791612b44565b612bc091612b44565b038681018252612bd0908261043d565b612bd8613928565b908251918291868301612bea91612b44565b612bf391612b44565b038681018252612c03908261043d565b83850151612c1090613795565b908151612c23906001600160401b031690565b612c2c90613a38565b908351918291878301612c3e91612b44565b612c4791612b44565b038781018252612c57908261043d565b8251918291868301612c6891612b44565b612c7191612b44565b038681018252612c81908261043d565b612c8961393b565b908251918291868301612c9b91612b44565b612ca491612b44565b038681018252612cb4908261043d565b848201516001600160401b0316612cca90613a38565b908251918291868301612cdc91612b44565b612ce591612b44565b038681018252612cf5908261043d565b612cfd61394e565b908251918291868301612d0f91612b44565b612d1891612b44565b038681018252612d28908261043d565b6060850151612d3c9063ffffffff16613a38565b908251918291868301612d4e91612b44565b612d5791612b44565b038681018252612d67908261043d565b612d6f613961565b908251918291868301612d8191612b44565b612d8a91612b44565b038681018252612d9a908261043d565b6080850151612dae9063ffffffff16613a38565b908251918291868301612dc091612b44565b612dc991612b44565b038681018252612dd9908261043d565b612de1613974565b908251918291868301612df391612b44565b612dfc91612b44565b038681018252612e0c908261043d565b60a0850151612e1a90613759565b908251918291868301612e2c91612b44565b612e3591612b44565b038681018252612e45908261043d565b915f925b60c08601805151851015612f0f57612e8f612f0560c093612ef9612ead612ea78a6001978f612ea1908f612e958f612e8f612e826139b9565b91519b8c94850190612b44565b90612b44565b0390810188528761043d565b51611c7a565b51613ab7565b612eeb8d8c612edf8c612e8f612ed2612ecd88516001600160401b031690565b613a38565b9151988994850190612b44565b0390810185528461043d565b88519485938c850190612b44565b038a810183528261043d565b9401939050612e49565b5095509350505050565b63ffffffff8082165f52600960205260405f2090815416612f7a57612f50600192829063ffffffff1663ffffffff19825416179055565b80546bffffffffffffffff0000000019164260201b6bffffffffffffffff00000000161781550155565b505050565b612f969063ffffffff91829182600a541690612fd7565b16908115159081612fbf575b50612faa5750565b5f5260096020525f6001604082208281550155565b9050815f52600960205260405f20541615155f612fa2565b63ffffffff91908282168382161115612fef57031690565b5050505f90565b61301f90613002613bb7565b61300a613bb7565b613012613bb7565b61301a613bb7565b612a21565b613027613bb7565b61302f613bb7565b60c860405161303d816103d9565b5260c863ffffffff19600a541617600a55565b60025481101561198a5760025f5260011b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01905f90565b929190612120578051835461ffff191661ffff91909116178355600180930190602080910151938451916001600160401b0383116103d4576130d4836130ce8654610c5f565b86611d11565b602091601f84116001146131065750508190611daf9394955f926122c35750508160011b915f199060031b1c19161790565b95601f9291921984169661311d865f5260205f2090565b935f915b89831061314057505050836001959697106123db57505050811b019055565b838501518655948501949381019391810191613121565b600254916003548084115f146131ac575061020692506131856040519261317d846103f4565b61ffff168352565b60208201526131a66003546131a161319c82611b42565b600355565b613050565b90613088565b6131b590611b42565b60035561ffff604051926131c8846103f4565b1682526020820152600160401b8210156103d4576131a68260016102069401600255613050565b613222916131fb610bf5565b906132046139d9565b612e8f613268604092604051978891612e8f60209889850190612b44565b0396613236601f199889810183528261043d565b61325c61324d612ecd6108558a5163ffffffff1690565b60405194859389850190612b44565b0387810183528261043d565b915f925b848601805151851015612f0f57612e8f6132ef612e8f612ef989956132e18d6132bb6132b58d60019a612ea18f6132a98f91612e8f612e82613928565b0386810189528861043d565b51613be5565b92612edf6132d3612ecd86516001600160401b031690565b8d519788938d850190612b44565b885194859388850190612b44565b940193905061326c565b604051613305816103d9565b5f8152905f368137565b6040519061331c826103f4565b6001825260203681840137565b60405190613336826103f4565b600a825260203681840137565b9061334d8261129e565b60409061335d604051918261043d565b838152809361336e601f199161129e565b01915f5b83811061337f5750505050565b602090825161338d816103b9565b5f8152825f81830152606085830152828601015201613372565b906040516133b4816103f4565b60206112856001839561ffff815416855201610d58565b8151815463ffffffff191663ffffffff91821617825591600180920160208092015191808351936133fc8585611e7d565b01915f52805f205f925b8484106134165750505050505050565b8051805183548583015161ffff90921665ffffffffffff199091161790891660101b65ffffffff0000161783556040015180519187840191906001600160401b0384116103d45782869261346f86611d798d9754610c5f565b8390601f87116001146134af5795806134a092600297985f926122c35750508160011b915f199060031b1c19161790565b90555b01920193019290613406565b9590601f198216966134c4845f5260205f2090565b975f5b818110613504575091879891846002999594106134ec575b505050811b0190556134a3565b01515f1960f88460031b161c191690555f80806134df565b838301518a5597909801978d978b9793840193016134c7565b600754600160401b8110156103d45780600161353c9201600755611951565b61212057600860208361367660c061020696516135d6815186613598825161357260ff8251168d9060ff1660ff19825416179055565b909101518a5464ffffffff00191660089190911b64ffffffff0016178a5563ffffffff90565b878060018c019301516135b960ff825116859060ff1660ff19825416179055565b0151825464ffffffff001916911660081b64ffffffff0016179055565b6135e68582015160028901612353565b6135f7604082015160038901612353565b61362461360b606083015163ffffffff1690565b600489019063ffffffff1663ffffffff19825416179055565b613635608082015160058901612353565b61366b61364c60a08301516001600160401b031690565b60068901906001600160401b03166001600160401b0319825416179055565b015160078601612353565b015191016133cb565b93915f945f9460405193602085019363b700961360e01b855260018060a01b03809216602487015216604485015263ffffffff60e01b1660648401526064835260a08301918383106001600160401b038411176103d4576040935f9385528380528360205251915afa6136ee57565b9150505f51906020518060201c150290565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811630811491821561373e575b50506106e757565b5f805160206142458339815191525416141590505f80613736565b610e09612e8f916137876137766001600160401b03835116613a38565b916040519485936020850190612b44565b03601f19810183528261043d565b61379d610bf5565b906137a6613911565b60408051938460209384928383016137bd91612b44565b6137c691612b44565b0393601f199485810187526137db908761043d565b80516137e690613d8f565b9586516137f9906001600160401b031690565b61380290613a38565b90845191829185830161381491612b44565b61381d91612b44565b03868101825261382d908261043d565b835196879184830161383e91612b44565b61384791612b44565b038581018752613857908761043d565b61385f613928565b95835196879184830161387191612b44565b61387a91612b44565b03858101875261388a908761043d565b015161389590613d8f565b9081516138a8906001600160401b031690565b6138b190613a38565b9481519586918583016138c391612b44565b6138cc91612b44565b0384810186526138dc908661043d565b5193849283016138eb91612b44565b6138f491612b44565b039081018252610e09908261043d565b80511561198a5760200190565b61391961330f565b600a61392482613904565b5390565b61393061330f565b601261392482613904565b61394361330f565b602861392482613904565b61395661330f565b603061392482613904565b61396961330f565b603861392482613904565b61397c613329565b60a25f5b607f808311156139a55790608060019284161760208286010153019060071c90613980565b50607f600192166020828501015301815290565b6139c1613329565b61014260015f60c26020850153019060071c90613980565b6139e161330f565b600861392482613904565b6139f461330f565b601061392482613904565b613a0761330f565b601a61392482613904565b613a1a61330f565b603261392482613904565b613a2d61330f565b604261392482613904565b9060809160806001600160401b03821610613a9357613a55613329565b5f5b607f80841115613a7b57908560019285161760208285010153019160071c91613a57565b5090929350607f600192166020828501015301815290565b909150613a9e61330f565b9060f81b6001600160f81b0319165f1a61392482613904565b613abf610bf5565b90613ac8613911565b6040805193846020938492838301613adf91612b44565b613ae891612b44565b0393601f19948581018752613afd908761043d565b8051613b0890613e47565b958651613b1b906001600160401b031690565b613b2490613a38565b908451918291858301613b3691612b44565b613b3f91612b44565b038681018252613b4f908261043d565b8351968791848301613b6091612b44565b613b6991612b44565b038581018752613b79908761043d565b613b81613928565b958351968791848301613b9391612b44565b613b9c91612b44565b038581018752613bac908761043d565b0151613895906131ef565b60ff5f805160206142658339815191525460401c1615613bd357565b604051631afcd79f60e31b8152600490fd5b610e09613c26612e8f92613cde613cca612e8f613cd1613c03610bf5565b94613c0c6139d9565b9060409485928351998a91612e8f60209b8c850190612b44565b0398613c3a601f199a8b810183528261043d565b613c7989613c6d613c5d612ecd613c56613c56895161ffff1690565b61ffff1690565b612e8f8851958694850190612b44565b038b810183528261043d565b613c8889613c6d613c5d6139ec565b613ca589613c6d613c5d612ecd6108558489015163ffffffff1690565b613cbe613cb06139ff565b85519d8e938c850190612b44565b038981018c528b61043d565b0151613759565b9151968794850190612b44565b0390810183528261043d565b90813b15613d6e575f8051602061424583398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115613d5357613d5091614181565b50565b505034613d5c57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b610e09612e8f612e8f613cde613e37612ecd6108556020612e8f98613e2c612e8f613e06613dbb610bf5565b613dd5613dc66139d9565b6040519d8e9389850190612b44565b039a613de9601f199c8d810183528261043d565b613c6d61324d612ecd613e00613e00895160ff1690565b60ff1690565b613e20613e116139ec565b6040519a8b9387850190612b44565b0389810189528861043d565b015163ffffffff1690565b6040519586936020850190612b44565b613e4f610bf5565b90613e58613911565b91604080518094602093848301613e6e91612b44565b613e7791612b44565b0392601f19938481018652613e8c908661043d565b8051613e9790613795565b948551613eaa906001600160401b031690565b613eb390613a38565b908351918291868301613ec591612b44565b613ece91612b44565b038581018252613ede908261043d565b8251958691858301613eef91612b44565b613ef891612b44565b038481018652613f08908661043d565b613f10613928565b948251958691858301613f2291612b44565b613f2b91612b44565b038481018652613f3b908661043d565b82810151613f4890613759565b948251958691858301613f5a91612b44565b613f6391612b44565b038481018652613f73908661043d565b613f7b6139ff565b948251958691858301613f8d91612b44565b613f9691612b44565b038481018652613fa6908661043d565b81810151613fb390613759565b948251958691858301613fc591612b44565b613fce91612b44565b038481018652613fde908661043d565b613fe661393b565b948251958691858301613ff891612b44565b61400191612b44565b038481018652614011908661043d565b60608101516140259063ffffffff16613a38565b94825195869185830161403791612b44565b61404091612b44565b038481018652614050908661043d565b614058613a12565b94825195869185830161406a91612b44565b61407391612b44565b038481018652614083908661043d565b608081015161409190613759565b9482519586918583016140a391612b44565b6140ac91612b44565b0384810186526140bc908661043d565b6140c4613961565b9482519586918583016140d691612b44565b6140df91612b44565b0384810186526140ef908661043d565b60a08101516001600160401b031661410690613a38565b94825195869185830161411891612b44565b61412191612b44565b038481018652614131908661043d565b614139613a25565b94825195869185830161414b91612b44565b61415491612b44565b038481018652614164908661043d565b60c0015161417190613759565b905193849283016138eb91612b44565b5f80610e0993602081519101845af43d156141bd573d916141a183610478565b926141af604051948561043d565b83523d5f602085013e6141c1565b6060915b906141e857508051156141d657602081519101fd5b60405163d6bda27560e01b8152600490fd5b8151158061421b575b6141f9575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156141f156fef3177357ab46d8af007ab3fdb9af81da189e1068fefdc0073dca88a2cab40a00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a26469706673582212201dd53cc2caf86754ed88247c9b779f72471445dd4bcf6d516a7bf3bb29c0dce864736f6c63430008190033", "linkReferences": { - "contracts/common/sysio_merkle.sol": { - "sysio_merkle": [ - { - "length": 20, - "start": 14720 - } - ] - }, "contracts/outpost/OPPCommon.sol": { "OPPCommon": [ { "length": 20, - "start": 5087 + "start": 6055 + }, + { + "length": 20, + "start": 6371 + }, + { + "length": 20, + "start": 9925 + }, + { + "length": 20, + "start": 11131 } ] } }, "deployedLinkReferences": { - "contracts/common/sysio_merkle.sol": { - "sysio_merkle": [ - { - "length": 20, - "start": 14673 - } - ] - }, "contracts/outpost/OPPCommon.sol": { "OPPCommon": [ { "length": 20, - "start": 5040 + "start": 5850 + }, + { + "length": 20, + "start": 6166 + }, + { + "length": 20, + "start": 9720 + }, + { + "length": 20, + "start": 10926 } ] }