diff --git a/src/abstract/RebaseMigratable.sol b/src/abstract/RebaseMigratable.sol new file mode 100644 index 00000000..8f38c355 --- /dev/null +++ b/src/abstract/RebaseMigratable.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +/// @title RebaseMigratable +/// @notice Shared skeleton for the lazy rebase-migration algorithm. Both +/// `StoxReceiptVault` (share side) and `StoxReceipt` (receipt side) lazily +/// rasterize each holder's stored balance to the latest completed corporate +/// action on first touch in `_update`. The orchestration is identical: +/// +/// 1. Zero-address short-circuit (mint `from`, burn `to`). +/// 2. Read the holder's current cursor + stored balance. +/// 3. Walk the rebase from that cursor forward, returning the rasterized +/// balance and the advanced cursor. +/// 4. Early-return if the cursor didn't advance (no completed action newer +/// than the holder's last touch). +/// 5. Write the new cursor. +/// 6. If the balance changed (it can stay equal under the identity bootstrap +/// or after a truncate-to-zero), write the new stored balance. +/// 7. Emit the migration event. +/// 8. Run the post-migrate hook (share side updates the totalSupply pots; +/// receipt side is a no-op). +/// +/// The differences are entirely plug-points (which storage to read/write, +/// which rebase walk to invoke, which event to emit, whether the post-hook +/// touches additional state). This abstract owns the orchestration; the +/// concrete contracts implement the plug-points and the shape stays a +/// single-source-of-truth instead of being mirrored across two files. +/// +/// **`id` parameter.** The receipt side is keyed by `(holder, id)` for the +/// ERC-1155 token id. The share side has no id concept — its overrides +/// ignore the parameter, and its `_emitMigrated` hook drops the field +/// from the event signature. The slight smell of an always-zero `id` on +/// the share side is the cost of keeping one orchestration; the +/// alternative (separate `_migrateAccount` / `_migrateHolderId` shapes) +/// is exactly the duplication this base eliminates. +abstract contract RebaseMigratable { + /// @dev Read the holder's current migration cursor. + /// @param account The holder. + /// @param id The ERC-1155 token id (ignored by share-side overrides). + function _readCursor(address account, uint256 id) internal view virtual returns (uint256); + + /// @dev Write the holder's new migration cursor. + function _writeCursor(address account, uint256 id, uint256 cursor) internal virtual; + + /// @dev Read the holder's raw stored balance (pre-rebase, before any + /// pending multipliers are applied). + function _readStoredBalance(address account, uint256 id) internal view virtual returns (uint256); + + /// @dev Write the holder's rasterized stored balance (post-rebase). + function _writeStoredBalance(address account, uint256 id, uint256 balance) internal virtual; + + /// @dev Walk the rebase from `cursor` forward, returning the rasterized + /// balance and the advanced cursor. + function _walkRebase(uint256 storedBalance, uint256 cursor) internal view virtual returns (uint256, uint256); + + /// @dev Emit the migration event with the override's preferred shape. + /// Share-side overrides drop `id`; receipt-side keeps it. + function _emitMigrated( + address account, + uint256 id, + uint256 fromActionId, + uint256 toActionId, + uint256 oldBalance, + uint256 newBalance + ) internal virtual; + + /// @dev Hook called after the migration is fully written. Share side + /// updates the per-cursor totalSupply pots via + /// `LibTotalSupply.onAccountMigrated`; receipt side is a no-op. + function _postMigrate(uint256 fromActionId, uint256 toActionId, uint256 oldBalance, uint256 newBalance) + internal + virtual; + + /// @dev Run the lazy rebase migration for `(account, id)`. Idempotent — + /// calling on an account already at the latest cursor is a no-op. + function _migrate(address account, uint256 id) internal { + if (account == address(0)) return; + + uint256 currentCursor = _readCursor(account, id); + uint256 storedBalance = _readStoredBalance(account, id); + + (uint256 newBalance, uint256 newCursor) = _walkRebase(storedBalance, currentCursor); + + if (newCursor == currentCursor) return; + + _writeCursor(account, id, newCursor); + + // Skip the SSTORE when the rasterized balance is unchanged. Equal + // balances arise under the identity bootstrap (no real multiplier + // applied) and when fractional truncation lands on the same + // integer (e.g. a 1-wei balance at any multiplier). The cursor + // advancement above is what matters for these cases. + if (newBalance != storedBalance) { + _writeStoredBalance(account, id, newBalance); + } + + _emitMigrated(account, id, currentCursor, newCursor, storedBalance, newBalance); + + _postMigrate(currentCursor, newCursor, storedBalance, newBalance); + } +} diff --git a/src/concrete/StoxReceipt.sol b/src/concrete/StoxReceipt.sol index e25f15bc..849be183 100644 --- a/src/concrete/StoxReceipt.sol +++ b/src/concrete/StoxReceipt.sol @@ -5,6 +5,7 @@ pragma solidity =0.8.25; import {Receipt} from "rain.vats/concrete/receipt/Receipt.sol"; import {ERC1155Upgradeable} from "openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol"; import {IERC1155} from "openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol"; +import {RebaseMigratable} from "../abstract/RebaseMigratable.sol"; import {ICorporateActionsV1} from "../interface/ICorporateActionsV1.sol"; import {LibCorporateActionReceipt} from "../lib/LibCorporateActionReceipt.sol"; import {LibERC1155Storage} from "../lib/LibERC1155Storage.sol"; @@ -60,7 +61,7 @@ import {LibReceiptRebase} from "../lib/LibReceiptRebase.sol"; /// written post-rebase balance, silently inflating the position. See the /// `testZeroBalanceAdvancesCursor` regression in both `LibRebase.t.sol` and /// `LibReceiptRebase.t.sol`. -contract StoxReceipt is Receipt { +contract StoxReceipt is Receipt, RebaseMigratable { /// @notice Emitted whenever `_migrateHolderId` advances a `(account, id)` /// pair's migration cursor. The cursor itself is storage state, so the /// event fires on every cursor advance regardless of whether @@ -163,17 +164,12 @@ contract StoxReceipt is Receipt { virtual override { - // Snapshot the vault once so we don't pay the external self-call - // per iteration. `manager()` is the external view on Receipt that - // returns the configured vault address from Receipt7201Storage. - ICorporateActionsV1 vault = _vault(); - // Migrate each (account, id) pair before the transfer executes. - // `_migrateHolderId` short-circuits on `address(0)` so mint (from == - // 0) and burn (to == 0) pass straight through to super._update. + // `_migrate` short-circuits on `address(0)` so mint (from == 0) + // and burn (to == 0) pass straight through to super._update. for (uint256 i = 0; i < ids.length; i++) { - _migrateHolderId(from, ids[i], vault); - _migrateHolderId(to, ids[i], vault); + _migrate(from, ids[i]); + _migrate(to, ids[i]); } // Now that both sides are rasterized to the current cursor, run @@ -182,35 +178,60 @@ contract StoxReceipt is Receipt { super._update(from, to, ids, amounts); } - /// @dev Migrate a single `(account, id)` pair through every completed - /// stock split the pair has not yet been migrated through. Both the - /// balance rasterization and the cursor advancement happen here; for - /// zero-balance pairs the rewrite is a no-op but the cursor advancement - /// still matters — see contract-level NatSpec for the inflation bug this - /// prevents. - /// - /// `internal` so test harnesses derived from this contract can exercise - /// the migration logic in isolation. - function _migrateHolderId(address account, uint256 id, ICorporateActionsV1 vault) internal { - if (account == address(0)) return; + // ----------------------------------------------------------------------- + // RebaseMigratable plug-points (receipt-side) + // ----------------------------------------------------------------------- - LibCorporateActionReceipt.CorporateActionReceiptStorage storage s = LibCorporateActionReceipt.getStorage(); - uint256 currentCursor = s.accountIdCursor[account][id]; - uint256 storedBalance = LibERC1155Storage.underlyingBalance(account, id); + /// @inheritdoc RebaseMigratable + function _readCursor(address account, uint256 id) internal view override returns (uint256) { + return LibCorporateActionReceipt.getStorage().accountIdCursor[account][id]; + } - (uint256 newBalance, uint256 newCursor) = LibReceiptRebase.migratedBalance(storedBalance, currentCursor, vault); + /// @inheritdoc RebaseMigratable + function _writeCursor(address account, uint256 id, uint256 cursor) internal override { + LibCorporateActionReceipt.getStorage().accountIdCursor[account][id] = cursor; + } - if (newCursor == currentCursor) return; + /// @inheritdoc RebaseMigratable + function _readStoredBalance(address account, uint256 id) internal view override returns (uint256) { + return LibERC1155Storage.underlyingBalance(account, id); + } - s.accountIdCursor[account][id] = newCursor; + /// @inheritdoc RebaseMigratable + function _writeStoredBalance(address account, uint256 id, uint256 balance) internal override { + LibERC1155Storage.setUnderlyingBalance(account, id, balance); + } - // Skip the SSTORE when the rasterized balance is unchanged. - if (newBalance != storedBalance) { - LibERC1155Storage.setUnderlyingBalance(account, id, newBalance); - } - emit ReceiptAccountMigrated(account, id, currentCursor, newCursor, storedBalance, newBalance); + /// @inheritdoc RebaseMigratable + /// @dev `_vault()` is an external self-call (`this.manager()`); the + /// previous shape cached the result once per `_update` and passed it + /// down. Under the unified `RebaseMigratable._migrate` shape, the + /// vault is fetched per pair instead. Per-call cost is one extra + /// CALL opcode against `address(this).manager()`, paid for each + /// `_migrate` invocation in the batch. + function _walkRebase(uint256 storedBalance, uint256 cursor) internal view override returns (uint256, uint256) { + return LibReceiptRebase.migratedBalance(storedBalance, cursor, _vault()); } + /// @inheritdoc RebaseMigratable + function _emitMigrated( + address account, + uint256 id, + uint256 fromActionId, + uint256 toActionId, + uint256 oldBalance, + uint256 newBalance + ) internal override { + emit ReceiptAccountMigrated(account, id, fromActionId, toActionId, oldBalance, newBalance); + } + + /// @inheritdoc RebaseMigratable + /// @dev Receipt side has no per-cursor pot accounting; the share side + /// (`StoxReceiptVault`) drives the totalSupply pots via + /// `LibTotalSupply.onAccountMigrated` from its own override. This + /// hook is intentionally empty. + function _postMigrate(uint256, uint256, uint256, uint256) internal override {} + /// @dev Cached / fresh read of the configured vault address, cast to /// the corporate-actions read interface. Uses `this.manager()` (an /// external self-call) to avoid hardcoding the rain.vats diff --git a/src/concrete/StoxReceiptVault.sol b/src/concrete/StoxReceiptVault.sol index 87d77551..b3248f0c 100644 --- a/src/concrete/StoxReceiptVault.sol +++ b/src/concrete/StoxReceiptVault.sol @@ -3,6 +3,7 @@ pragma solidity =0.8.25; import {OffchainAssetReceiptVault} from "rain.vats/concrete/vault/OffchainAssetReceiptVault.sol"; +import {RebaseMigratable} from "../abstract/RebaseMigratable.sol"; import {LibCorporateAction} from "../lib/LibCorporateAction.sol"; import {LibRebase} from "../lib/LibRebase.sol"; import {LibTotalSupply} from "../lib/LibTotalSupply.sol"; @@ -35,7 +36,7 @@ import {LibProdDeployV3} from "../lib/LibProdDeployV3.sol"; /// a balance that was already written at the post-rebase basis, silently /// inflating the recipient's balance. See `LibRebase.migratedBalance` and /// its zero-balance regression tests. -contract StoxReceiptVault is OffchainAssetReceiptVault { +contract StoxReceiptVault is OffchainAssetReceiptVault, RebaseMigratable { /// @notice Emitted whenever `_migrateAccount` advances an account's /// migration cursor. The cursor itself is storage state, so the event /// fires on every cursor advance regardless of whether @@ -106,8 +107,12 @@ contract StoxReceiptVault is OffchainAssetReceiptVault { function _update(address from, address to, uint256 amount) internal virtual override { LibTotalSupply.fold(); - _migrateAccount(from); - _migrateAccount(to); + // Share-side migration uses `id = 0` — the share has no ERC-1155 + // token id concept; the parameter is part of the unified + // `RebaseMigratable._migrate` shape and the share-side overrides + // ignore it. See `RebaseMigratable` NatSpec. + _migrate(from, 0); + _migrate(to, 0); super._update(from, to, amount); @@ -118,38 +123,53 @@ contract StoxReceiptVault is OffchainAssetReceiptVault { } } - /// @dev Migrate a single account through every completed split that has - /// not yet been applied to it (i.e. completed split nodes whose index is - /// past the account's current `accountMigrationCursor`). This both - /// rasterizes the account's stored balance to the post-rebase basis and - /// advances the cursor; for zero-balance accounts the balance rewrite is - /// a no-op but the cursor advancement still matters — see - /// `LibRebase.migratedBalance` and its zero-balance regression tests for - /// the bug this prevents. - /// - /// `internal` (rather than `private`) so test harnesses derived from this - /// contract can exercise the migration logic in isolation. The function is - /// only ever called from this contract's `_update` override. - function _migrateAccount(address account) internal { - if (account == address(0)) return; + // ----------------------------------------------------------------------- + // RebaseMigratable plug-points (share-side) + // ----------------------------------------------------------------------- - LibCorporateAction.CorporateActionStorage storage s = LibCorporateAction.getStorage(); - uint256 currentCursor = s.accountMigrationCursor[account]; - uint256 storedBalance = LibERC20Storage.underlyingBalance(account); + /// @inheritdoc RebaseMigratable + function _readCursor(address account, uint256) internal view override returns (uint256) { + return LibCorporateAction.getStorage().accountMigrationCursor[account]; + } + + /// @inheritdoc RebaseMigratable + function _writeCursor(address account, uint256, uint256 cursor) internal override { + LibCorporateAction.getStorage().accountMigrationCursor[account] = cursor; + } - (uint256 newBalance, uint256 newCursor) = LibRebase.migratedBalance(storedBalance, currentCursor); + /// @inheritdoc RebaseMigratable + function _readStoredBalance(address account, uint256) internal view override returns (uint256) { + return LibERC20Storage.underlyingBalance(account); + } - if (newCursor == currentCursor) return; + /// @inheritdoc RebaseMigratable + function _writeStoredBalance(address account, uint256, uint256 balance) internal override { + LibERC20Storage.setUnderlyingBalance(account, balance); + } - s.accountMigrationCursor[account] = newCursor; + /// @inheritdoc RebaseMigratable + function _walkRebase(uint256 storedBalance, uint256 cursor) internal view override returns (uint256, uint256) { + return LibRebase.migratedBalance(storedBalance, cursor); + } - // Skip the SSTORE when the rasterized balance is unchanged. - if (newBalance != storedBalance) { - LibERC20Storage.setUnderlyingBalance(account, newBalance); - } - emit AccountMigrated(account, currentCursor, newCursor, storedBalance, newBalance); + /// @inheritdoc RebaseMigratable + function _emitMigrated( + address account, + uint256, + uint256 fromActionId, + uint256 toActionId, + uint256 oldBalance, + uint256 newBalance + ) internal override { + emit AccountMigrated(account, fromActionId, toActionId, oldBalance, newBalance); + } - LibTotalSupply.onAccountMigrated(currentCursor, storedBalance, newCursor, newBalance); + /// @inheritdoc RebaseMigratable + function _postMigrate(uint256 fromActionId, uint256 toActionId, uint256 oldBalance, uint256 newBalance) + internal + override + { + LibTotalSupply.onAccountMigrated(fromActionId, oldBalance, toActionId, newBalance); } /// @notice Routes calls with non-matching selectors to the corporate actions diff --git a/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol b/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol index 5ac13895..cecede74 100644 --- a/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol +++ b/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xce0e3f0d13c8db1e8badb6928b48570d044cf1d805201429ac403f41f79203a0); +bytes32 constant BYTECODE_HASH = bytes32(0x832327f0ff167d28ae301b5632a3b37f7f93e88fefc724dba04575fe06f074ca); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xA672661d9D00FD168ffc6c002b42B3Ff8161FD6c); +address constant DEPLOYED_ADDRESS = address(0xb98430a717658c5541A081E1c4A8F1e32447F576); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b808252733ea928a31d7360bc3969f29490ffe98405aa2aa960208301819052738a88a9753603cec3c825382176a6430e6137e2c38385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b6104f780610fd783390190565b60805160a051610e926101455f395f818160c701526102d801525f8181607b01526102630152610e925ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000060405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f0000000000000000000000000000000000000000000000000000000000000000604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b506040516104f73803806104f783398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b61035a8061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; + hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b80825273e943310b0b3d70e2bedf2b81ea6ba530298e7e2b60208301819052731db61076e5dd1fb3f1145bfc40c5f69adea55bf68385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b6104f780610fd783390190565b60805160a051610e926101455f395f818160c701526102d801525f8181607b01526102630152610e925ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000060405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f0000000000000000000000000000000000000000000000000000000000000000604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b506040516104f73803806104f783398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b61035a8061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000d5d0dddc6a9c811e48d72bb7811469f86bcbb72a81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f000000000000000000000000de55321665be9759024441551fce1f6257c65a6581565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000d5d0dddc6a9c811e48d72bb7811469f86bcbb72a60405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f000000000000000000000000de55321665be9759024441551fce1f6257c65a65604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; + hex"608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000f83b69ca6c76abb5429be6c01f579d947b6b9bf581565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f00000000000000000000000073c0cec527b1e4388775f8b7561a287d92b7ae3581565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000f83b69ca6c76abb5429be6c01f579d947b6b9bf560405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f00000000000000000000000073c0cec527b1e4388775f8b7561a287d92b7ae35604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; diff --git a/src/generated/StoxReceipt.pointers.sol b/src/generated/StoxReceipt.pointers.sol index fc6e2333..93d7283a 100644 --- a/src/generated/StoxReceipt.pointers.sol +++ b/src/generated/StoxReceipt.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x30296b4e016ca1d166c0a45bdf918ffdf60289e2b0539194b73d59587c81aa74); +bytes32 constant BYTECODE_HASH = bytes32(0x5e20d004ccfd57667e6bd91069997ec37eccbbb2e0fba609646ac6e45efae7e1); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x3EA928a31D7360Bc3969f29490ffe98405aA2AA9); +address constant DEPLOYED_ADDRESS = address(0xe943310b0B3D70E2bEDf2b81EA6bA530298e7E2B); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d1a806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612ea9565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f00565b6102fb565b604051901515815260200161011b565b61015a61015536600461302e565b6103dd565b005b6101646104a7565b60405161011b91906130fc565b61016461017f36600461310e565b61050c565b61015a610192366004613125565b6105db565b61015a6101a53660046131f3565b6105f1565b6101116101b836600461329a565b6106fa565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b6102176102123660046132d4565b610912565b60405161011b91906133c0565b61015a6102323660046133d2565b610a24565b610164610aef565b61015a61024d366004613436565b610b40565b61015a6102603660046133d2565b610b52565b610137610273366004613471565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da3660046133d2565b610bd0565b5f6102f283836102ed610ccc565b610d3f565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610e31565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610f01565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f89291906134b4565b604051602081830303815290604052905090565b60605f61052261051a610fda565b60ff1661108c565b61052a610f01565b610532611148565b61053a6104a7565b60405160200161054d94939291906134c8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611242565b6040516020016105c49291906134b4565b604051602081830303815290604052915050919050565b6105ed6105e661124e565b83836112bf565b5050565b5f6105fa61124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610689575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b156106e5576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b6106f28686868686611307565b505050505050565b5f806107046113b9565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61080960405180602001604052805f8152506113e1565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f88806020019051810190610842919061360a565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156109085784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461095c57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f610965610ccc565b90505f845167ffffffffffffffff81111561098257610982612f1b565b6040519080825280602002602001820160405280156109ab578160200160208202803683370190505b5090505f5b8551811015610a1b576109f68682815181106109ce576109ce613625565b60200260200101518683815181106109e8576109e8613625565b602002602001015185610d3f565b828281518110610a0857610a08613625565b60209081029190910101526001016109b0565b50949350505050565b610a2c610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610a978685846112bf565b610aa3858585856113f2565b6106f27fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060610af9610f01565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f89291906134b4565b6105ed610b4b61124e565b8383611473565b610b5a610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610bc58685846112bf565b610aa385858561157d565b5f610bd961124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610c68575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b15610cbf576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044016106dc565b6106f28686868686610e31565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3a919061360a565b905090565b5f80610d4b858561160a565b90505f610d5661161f565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610d928383876116bc565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff16610de161124e565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610e80576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8516610ecf576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484876119eb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610f8f573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610fd49190810190613688565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd491906136cd565b60605f61109883611a54565b60010190505f8167ffffffffffffffff8111156110b7576110b7612f1b565b6040519080825280601f01601f1916602001820160405280156110e1576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846110eb57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa1580156111d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fb919061360a565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f8f573d5f803e3d5ffd5b60606102f5825f611b35565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff1680156112b657806112b8565b335b9250505090565b805115611302577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d658383836040516112f99392919061371a565b60405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff8416611356576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff85166113a5576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6113b285858585856119eb565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b6113e9611cb4565b610e2e81611cf4565b73ffffffffffffffffffffffffffffffffffffffff8416611441576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018690528183019081526060820185905260808201909252906106f25f878484876119eb565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff83166114e3576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166115cc576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916113b2918791859085906119eb565b5f806116168484611d05565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061166d60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f82613784565b60405160200161167f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9083908290819073ffffffffffffffffffffffffffffffffffffffff8616906379ba43059061171c908690600390600190600401613797565b606060405180830381865afa158015611737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175b91906137e8565b5091509150865f03611840575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214611836576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8616906379ba4305906117ec908590600390600190600401613797565b606060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b91906137e8565b509092509050611768565b5f935050506119e3565b865b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146119de578293506002820361193c576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f9061192c9073ffffffffffffffffffffffffffffffffffffffff89169063b21a2494906024015f60405180830381865afa1580156118e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119279190810190613688565b611db5565b90506119388282611dca565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716906379ba430590611994908690600390600190600401613797565b606060405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d391906137e8565b509093509150611842565b935050505b935093915050565b6119f785858585611e45565b73ffffffffffffffffffffffffffffffffffffffff8416156113b2575f611a1c61124e565b90508351600103611a465760208481015190840151611a3f838989858589611eaa565b50506106f2565b6106f2818787878787612099565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a9c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611ac8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ae657662386f26fc10000830492506010015b6305f5e1008310611afe576305f5e100830492506008015b6127108310611b1257612710830492506004015b60648310611b24576064830492506002015b600a83106102f55760010192915050565b606082515f03611b53575060408051602081019091525f81526102f5565b5f82611b8357600384516002611b69919061382a565b611b73919061383d565b611b7e906004613875565b611ba8565b600384516004611b939190613875565b611b9e90600261382a565b611ba8919061383d565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611c66576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611c13565b905250859050611ca757600386510660018114611c8a5760028114611c9d57611ca5565b603d6001840353603d6002840353611ca5565b603d60018403535b505b9183525060405292915050565b611cbc612228565b611cf2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611cfc611cb4565b610e2e81612246565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611d5360017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d7613784565b604051602001611d6591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f5919061388c565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611e28576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016106dc565b5f610a1b611e3f611e39865f612292565b856122ec565b5f612351565b5f611e4e610ccc565b90505f5b8351811015611e9d57611e7f86858381518110611e7157611e71613625565b602002602001015184612393565b611e9585858381518110611e7157611e71613625565b600101611e52565b506113b2858585856124c9565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611f2190899089908890889088906004016138a3565b6020604051808303815f875af1925050508015611f79575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f76918101906138f2565b60015b612006573d808015611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b606091505b5080515f03611ffe576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612110908990899088908890889060040161390d565b6020604051808303815f875af1925050508015612168575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612165918101906138f2565b60015b612195573d808015611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b5f6122316113b9565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026113028382613a0c565b5f805f61229f858561256c565b91509150806122e4576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061233186868686612672565b915091505f80612341848461256c565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d612385828287612791565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff83166123b357505050565b5f6123bc61161f565b73ffffffffffffffffffffffffffffffffffffffff85165f908152602082815260408083208784529091528120549192506123f7868661160a565b90505f806124068385886116bc565b9150915083810361241b575050505050505050565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602086815260408083208a8452909152902081905581831461245d5761245d8888846128dd565b604080518581526020810183905290810184905260608101839052879073ffffffffffffffffffffffffffffffffffffffff8a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff1663e5be7d9061250f61124e565b878787876040518663ffffffff1660e01b8152600401612533959493929190613b24565b5f604051808303815f87803b15801561254a575f80fd5b505af115801561255c573d5f803e3d5ffd5b505050506113b2858585856128f1565b5f601b83900b83148383826125d0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156125b057620186a0860595506005850194505b8586601b0b146125cb57600a860595508460010194506125b0565b6125e6565b855f036125e657505f92506001915061238c9050565b848560030b14612642575f85121561260657505f925082915061238c9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106dc565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561268a575f92505f9150612787565b6126948487613b76565b91505f6126a088612bfb565b90505f6126ac87612bfb565b90505f6126b98383612c5c565b5090505f6f0785ee10d5da46d900f436a0000000008211156126ee576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561270f57670de0b6b3a7640000820491506012015b633b9aca0082111561272857633b9aca00820491506009015b61271082111561273d57612710820491506004015b811561275157600a8204915060010161273d565b61275b8187613b76565b955061277d8b8a612777878761277287600a613cbb565b612c97565b89612d7c565b9097509550505050505b5094509492505050565b5f805f8512156127d7576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b845f036127e957505f905060016119e3565b8460ff8416850185811215612834576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016106dc565b5f805f83121561289e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215612875575f8095509550505050506119e3565b825f03600a0a915081848161288c5761288c6136ed565b04955050840290911491506119e39050565b5f8313156128cd576128b183600a613cbb565b91506128bd8285613875565b9550600194506119e39350505050565b83600195509550505050506119e3565b5f6128e88484611d05565b91909155505050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500911461295b57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f61296461124e565b90505f5b8451811015612ace5760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612a66575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612a33576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1660048201526024810182905260448101839052606481018490526084016106dc565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612ac4575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612abe90849061382a565b90915550505b5050600101612968565b508351600103612b755760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612b66929190918252602082015260400190565b60405180910390a450506106f2565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612beb929190613cc6565b60405180910390a4505050505050565b5f80821215612c58577f80000000000000000000000000000000000000000000000000000000000000008203612c5257507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612ca48686612c5c565b91509150815f03612cc857838181612cbe57612cbe6136ed565b0492505050610d99565b838210612d12576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016106dc565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612e46577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e3357612ddb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161382a565b8403612e0b57507f8000000000000000000000000000000000000000000000000000000000000000905081612e7f565b612e16600a8561383d565b612e1f90613cea565b612e2a846001613b76565b91509150612e7f565b612e3c84613cea565b8391509150612e7f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e7957612e1f600a8561383d565b50829050815b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2e575f80fd5b5f8060408385031215612eba575f80fd5b8235612ec581612e88565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e575f80fd5b5f60208284031215612f10575f80fd5b8135610d9981612ed3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f8f57612f8f612f1b565b604052919050565b5f67ffffffffffffffff821115612fb057612fb0612f1b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612feb575f80fd5b8135612ffe612ff982612f97565b612f48565b818152846020838601011115613012575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613043575f80fd5b863561304e81612e88565b9550602087013561305e81612e88565b9450604087013561306e81612e88565b9350606087013592506080870135915060a087013567ffffffffffffffff811115613097575f80fd5b6130a389828a01612fdc565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f260208301846130b0565b5f6020828403121561311e575f80fd5b5035919050565b5f8060408385031215613136575f80fd5b82359150602083013567ffffffffffffffff811115613153575f80fd5b61315f85828601612fdc565b9150509250929050565b5f67ffffffffffffffff82111561318257613182612f1b565b5060051b60200190565b5f82601f83011261319b575f80fd5b813560206131ab612ff983613169565b8083825260208201915060208460051b8701019350868411156131cc575f80fd5b602086015b848110156131e857803583529183019183016131d1565b509695505050505050565b5f805f805f60a08688031215613207575f80fd5b853561321281612e88565b9450602086013561322281612e88565b9350604086013567ffffffffffffffff8082111561323e575f80fd5b61324a89838a0161318c565b9450606088013591508082111561325f575f80fd5b61326b89838a0161318c565b93506080880135915080821115613280575f80fd5b5061328d88828901612fdc565b9150509295509295909350565b5f602082840312156132aa575f80fd5b813567ffffffffffffffff8111156132c0575f80fd5b6132cc84828501612fdc565b949350505050565b5f80604083850312156132e5575f80fd5b823567ffffffffffffffff808211156132fc575f80fd5b818501915085601f83011261330f575f80fd5b8135602061331f612ff983613169565b82815260059290921b8401810191818101908984111561333d575f80fd5b948201945b8386101561336457853561335581612e88565b82529482019490820190613342565b96505086013592505080821115613379575f80fd5b5061315f8582860161318c565b5f815180845260208085019450602084015f5b838110156133b557815187529582019590820190600101613399565b509495945050505050565b602081525f6102f26020830184613386565b5f805f805f60a086880312156133e6575f80fd5b85356133f181612e88565b9450602086013561340181612e88565b93506040860135925060608601359150608086013567ffffffffffffffff81111561342a575f80fd5b61328d88828901612fdc565b5f8060408385031215613447575f80fd5b823561345281612e88565b915060208301358015158114613466575f80fd5b809150509250929050565b5f8060408385031215613482575f80fd5b823561348d81612e88565b9150602083013561346681612e88565b5f81518060208401855e5f93019283525090919050565b5f6132cc6134c2838661349d565b8461349d565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f6134f9600c83018761349d565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e67736964652031200000602082015261354f603e82018761349d565b90507f20746f2072656465656d200000000000000000000000000000000000000000008152613581600b82018661349d565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a2200000000000000000000000000000000000000000000000060128201526135d9601a82018561349d565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f6020828403121561361a575f80fd5b8151610d9981612e88565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61365f612ff984612f97565b9050828152838383011115613672575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613698575f80fd5b815167ffffffffffffffff8111156136ae575f80fd5b8201601f810184136136be575f80fd5b6132cc84825160208401613652565b5f602082840312156136dd575f80fd5b815160ff81168114610d99575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f61374e60608301846130b0565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f5613757565b8381526020810183905260608101600383106137da577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f606084860312156137fa575f80fd5b8351925060208401519150604084015167ffffffffffffffff8116811461381f575f80fd5b809150509250925092565b808201808211156102f5576102f5613757565b5f82613870577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f5613757565b5f6020828403121561389c575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526138e760a08301846130b0565b979650505050505050565b5f60208284031215613902575f80fd5b8151610d9981612ed3565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261394560a0830186613386565b82810360608401526139578186613386565b9050828103608084015261396b81856130b0565b98975050505050505050565b600181811c9082168061398b57607f821691505b6020821081036139c2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f82111561130257805f5260205f20601f840160051c810160208510156139ed5750805b601f840160051c820191505b818110156113b2575f81556001016139f9565b815167ffffffffffffffff811115613a2657613a26612f1b565b613a3a81613a348454613977565b846139c8565b602080601f831160018114613a8c575f8415613a565750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106f2565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613ad857888601518255948401946001909101908401613ab9565b5085821015613b1457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613b6460a0830185613386565b828103608084015261396b8185613386565b8082018281125f831280158216821582161715613b9557613b95613757565b505092915050565b600181815b80851115613bf657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613bdc57613bdc613757565b80851615613be957918102915b93841c9390800290613ba2565b509250929050565b5f82613c0c575060016102f5565b81613c1857505f6102f5565b8160018114613c2e5760028114613c3857613c54565b60019150506102f5565b60ff841115613c4957613c49613757565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613c77575081810a6102f5565b613c818383613b9d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613cb357613cb3613757565b029392505050565b5f6102f28383613bfe565b604081525f613cd86040830185613386565b828103602084015261374e8185613386565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612c5257612c5261375756"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d81806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612f10565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f67565b6102fb565b604051901515815260200161011b565b61015a610155366004613095565b6103dd565b005b6101646104a7565b60405161011b9190613163565b61016461017f366004613175565b61050c565b61015a61019236600461318c565b6105db565b61015a6101a536600461325a565b6105f1565b6101116101b8366004613301565b6106fa565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b61021761021236600461333b565b610912565b60405161011b9190613427565b61015a610232366004613439565b610a24565b610164610aef565b61015a61024d36600461349d565b610b40565b61015a610260366004613439565b610b52565b6101376102733660046134d8565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da366004613439565b610bd0565b5f6102f283836102ed610ccc565b610d3f565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610e31565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610f01565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f892919061351b565b604051602081830303815290604052905090565b60605f61052261051a610fda565b60ff1661108c565b61052a610f01565b610532611148565b61053a6104a7565b60405160200161054d949392919061352f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611242565b6040516020016105c492919061351b565b604051602081830303815290604052915050919050565b6105ed6105e661124e565b83836112bf565b5050565b5f6105fa61124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610689575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b156106e5576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b6106f28686868686611307565b505050505050565b5f806107046113b9565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61080960405180602001604052805f8152506113e1565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906108429190613671565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156109085784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461095c57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f610965610ccc565b90505f845167ffffffffffffffff81111561098257610982612f82565b6040519080825280602002602001820160405280156109ab578160200160208202803683370190505b5090505f5b8551811015610a1b576109f68682815181106109ce576109ce61368c565b60200260200101518683815181106109e8576109e861368c565b602002602001015185610d3f565b828281518110610a0857610a0861368c565b60209081029190910101526001016109b0565b50949350505050565b610a2c610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610a978685846112bf565b610aa3858585856113f2565b6106f27fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060610af9610f01565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f892919061351b565b6105ed610b4b61124e565b8383611473565b610b5a610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610bc58685846112bf565b610aa385858561157d565b5f610bd961124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610c68575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b15610cbf576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044016106dc565b6106f28686868686610e31565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3a9190613671565b905090565b5f80610d4b858561160a565b90505f610d5661161f565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610d928383876116bc565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff16610de161124e565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610e80576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8516610ecf576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484876119eb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610f8f573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610fd491908101906136ef565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd49190613734565b60605f61109883611a54565b60010190505f8167ffffffffffffffff8111156110b7576110b7612f82565b6040519080825280601f01601f1916602001820160405280156110e1576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846110eb57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa1580156111d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fb9190613671565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f8f573d5f803e3d5ffd5b60606102f5825f611b35565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff1680156112b657806112b8565b335b9250505090565b805115611302577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d658383836040516112f993929190613781565b60405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff8416611356576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff85166113a5576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6113b285858585856119eb565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b6113e9611cb4565b610e2e81611cf4565b73ffffffffffffffffffffffffffffffffffffffff8416611441576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018690528183019081526060820185905260808201909252906106f25f878484876119eb565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff83166114e3576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166115cc576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916113b2918791859085906119eb565b5f806116168484611d05565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061166d60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f826137eb565b60405160200161167f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9083908290819073ffffffffffffffffffffffffffffffffffffffff8616906379ba43059061171c9086906003906001906004016137fe565b606060405180830381865afa158015611737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175b919061384f565b5091509150865f03611840575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214611836576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8616906379ba4305906117ec9085906003906001906004016137fe565b606060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b919061384f565b509092509050611768565b5f935050506119e3565b865b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146119de578293506002820361193c576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f9061192c9073ffffffffffffffffffffffffffffffffffffffff89169063b21a2494906024015f60405180830381865afa1580156118e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261192791908101906136ef565b611db5565b90506119388282611dca565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906119949086906003906001906004016137fe565b606060405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d3919061384f565b509093509150611842565b935050505b935093915050565b6119f785858585611e45565b73ffffffffffffffffffffffffffffffffffffffff8416156113b2575f611a1c61124e565b90508351600103611a465760208481015190840151611a3f838989858589611ea4565b50506106f2565b6106f2818787878787612093565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a9c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611ac8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ae657662386f26fc10000830492506010015b6305f5e1008310611afe576305f5e100830492506008015b6127108310611b1257612710830492506004015b60648310611b24576064830492506002015b600a83106102f55760010192915050565b606082515f03611b53575060408051602081019091525f81526102f5565b5f82611b8357600384516002611b699190613891565b611b7391906138a4565b611b7e9060046138dc565b611ba8565b600384516004611b9391906138dc565b611b9e906002613891565b611ba891906138a4565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611c66576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611c13565b905250859050611ca757600386510660018114611c8a5760028114611c9d57611ca5565b603d6001840353603d6002840353611ca5565b603d60018403535b505b9183525060405292915050565b611cbc612222565b611cf2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611cfc611cb4565b610e2e81612240565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611d5360017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d76137eb565b604051602001611d6591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f591906138f3565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611e28576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016106dc565b5f610a1b611e3f611e39865f61228c565b856122e6565b5f61234b565b5f5b8251811015611e9157611e7385848381518110611e6657611e6661368c565b602002602001015161238d565b611e8984848381518110611e6657611e6661368c565b600101611e47565b50611e9e84848484612415565b50505050565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611f1b908990899088908890889060040161390a565b6020604051808303815f875af1925050508015611f73575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f7091810190613959565b60015b612000573d808015611fa0576040519150601f19603f3d011682016040523d82523d5f602084013e611fa5565b606091505b5080515f03611ff8576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c819061210a9089908990889088908890600401613974565b6020604051808303815f875af1925050508015612162575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261215f91810190613959565b60015b61218f573d808015611fa0576040519150601f19603f3d011682016040523d82523d5f602084013e611fa5565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b5f61222b6113b9565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026113028382613a73565b5f805f61229985856124b8565b91509150806122de576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061232b868686866125be565b915091505f8061233b84846124b8565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d61237f8282876126dd565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff82166123ac575050565b5f6123b78383612829565b90505f6123c48484612867565b90505f806123d28385612872565b915091508381036123e557505050505050565b6123f0868683612891565b828214612402576124028686846128cf565b6124108686868487876128da565b6106f2565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff1663e5be7d9061245b61124e565b878787876040518663ffffffff1660e01b815260040161247f959493929190613b8b565b5f604051808303815f87803b158015612496575f80fd5b505af11580156124a8573d5f803e3d5ffd5b505050506113b285858585612944565b5f601b83900b831483838261251c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156124fc57620186a0860595506005850194505b8586601b0b1461251757600a860595508460010194506124fc565b612532565b855f0361253257505f9250600191506123869050565b848560030b1461258e575f85121561255257505f92508291506123869050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106dc565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f80851584151780156125d6575f92505f91506126d3565b6125e08487613bdd565b91505f6125ec88612c4e565b90505f6125f887612c4e565b90505f6126058383612caf565b5090505f6f0785ee10d5da46d900f436a00000000082111561263a576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561265b57670de0b6b3a7640000820491506012015b633b9aca0082111561267457633b9aca00820491506009015b61271082111561268957612710820491506004015b811561269d57600a82049150600101612689565b6126a78187613bdd565b95506126c98b8a6126c387876126be87600a613d22565b612cea565b89612dcf565b9097509550505050505b5094509492505050565b5f805f851215612723576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b845f0361273557505f905060016119e3565b8460ff8416850185811215612780576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016106dc565b5f805f8312156127ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156127c1575f8095509550505050506119e3565b825f03600a0a91508184816127d8576127d8613754565b04955050840290911491506119e39050565b5f831315612819576127fd83600a613d22565b915061280982856138dc565b9550600194506119e39350505050565b83600195509550505050506119e3565b5f61283261161f565b73ffffffffffffffffffffffffffffffffffffffff84165f908152602091825260408082208583529092522054905092915050565b5f6102f2838361160a565b5f806128868484612881610ccc565b6116bc565b915091509250929050565b8061289a61161f565b73ffffffffffffffffffffffffffffffffffffffff9094165f9081526020948552604080822094825293909452919092205550565b611302838383612edb565b604080518581526020810185905290810183905260608101829052859073ffffffffffffffffffffffffffffffffffffffff8816907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a3505050505050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146129ae57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f6129b761124e565b90505f5b8451811015612b215760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612ab9575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612a86576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1660048201526024810182905260448101839052606481018490526084016106dc565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612b17575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612b11908490613891565b90915550505b50506001016129bb565b508351600103612bc85760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612bb9929190918252602082015260400190565b60405180910390a450506106f2565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c3e929190613d2d565b60405180910390a4505050505050565b5f80821215612cab577f80000000000000000000000000000000000000000000000000000000000000008203612ca557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612cf78686612caf565b91509150815f03612d1b57838181612d1157612d11613754565b0492505050610d99565b838210612d65576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016106dc565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612e99577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e8657612e2e7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001613891565b8403612e5e57507f8000000000000000000000000000000000000000000000000000000000000000905081612ed2565b612e69600a856138a4565b612e7290613d51565b612e7d846001613bdd565b91509150612ed2565b612e8f84613d51565b8391509150612ed2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612ecc57612e72600a856138a4565b50829050815b94509492505050565b5f612ee68484611d05565b91909155505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2e575f80fd5b5f8060408385031215612f21575f80fd5b8235612f2c81612eef565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e575f80fd5b5f60208284031215612f77575f80fd5b8135610d9981612f3a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612ff657612ff6612f82565b604052919050565b5f67ffffffffffffffff82111561301757613017612f82565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613052575f80fd5b813561306561306082612ffe565b612faf565b818152846020838601011115613079575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156130aa575f80fd5b86356130b581612eef565b955060208701356130c581612eef565b945060408701356130d581612eef565b9350606087013592506080870135915060a087013567ffffffffffffffff8111156130fe575f80fd5b61310a89828a01613043565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f26020830184613117565b5f60208284031215613185575f80fd5b5035919050565b5f806040838503121561319d575f80fd5b82359150602083013567ffffffffffffffff8111156131ba575f80fd5b6131c685828601613043565b9150509250929050565b5f67ffffffffffffffff8211156131e9576131e9612f82565b5060051b60200190565b5f82601f830112613202575f80fd5b81356020613212613060836131d0565b8083825260208201915060208460051b870101935086841115613233575f80fd5b602086015b8481101561324f5780358352918301918301613238565b509695505050505050565b5f805f805f60a0868803121561326e575f80fd5b853561327981612eef565b9450602086013561328981612eef565b9350604086013567ffffffffffffffff808211156132a5575f80fd5b6132b189838a016131f3565b945060608801359150808211156132c6575f80fd5b6132d289838a016131f3565b935060808801359150808211156132e7575f80fd5b506132f488828901613043565b9150509295509295909350565b5f60208284031215613311575f80fd5b813567ffffffffffffffff811115613327575f80fd5b61333384828501613043565b949350505050565b5f806040838503121561334c575f80fd5b823567ffffffffffffffff80821115613363575f80fd5b818501915085601f830112613376575f80fd5b81356020613386613060836131d0565b82815260059290921b840181019181810190898411156133a4575f80fd5b948201945b838610156133cb5785356133bc81612eef565b825294820194908201906133a9565b965050860135925050808211156133e0575f80fd5b506131c6858286016131f3565b5f815180845260208085019450602084015f5b8381101561341c57815187529582019590820190600101613400565b509495945050505050565b602081525f6102f260208301846133ed565b5f805f805f60a0868803121561344d575f80fd5b853561345881612eef565b9450602086013561346881612eef565b93506040860135925060608601359150608086013567ffffffffffffffff811115613491575f80fd5b6132f488828901613043565b5f80604083850312156134ae575f80fd5b82356134b981612eef565b9150602083013580151581146134cd575f80fd5b809150509250929050565b5f80604083850312156134e9575f80fd5b82356134f481612eef565b915060208301356134cd81612eef565b5f81518060208401855e5f93019283525090919050565b5f6133336135298386613504565b84613504565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613560600c830187613504565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e6773696465203120000060208201526135b6603e820187613504565b90507f20746f2072656465656d2000000000000000000000000000000000000000000081526135e8600b820186613504565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613640601a820185613504565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215613681575f80fd5b8151610d9981612eef565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6136c661306084612ffe565b90508281528383830111156136d9575f80fd5b8282602083015e5f602084830101529392505050565b5f602082840312156136ff575f80fd5b815167ffffffffffffffff811115613715575f80fd5b8201601f81018413613725575f80fd5b613333848251602084016136b9565b5f60208284031215613744575f80fd5b815160ff81168114610d99575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6137b56060830184613117565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f56137be565b838152602081018390526060810160038310613841577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613861575f80fd5b8351925060208401519150604084015167ffffffffffffffff81168114613886575f80fd5b809150509250925092565b808201808211156102f5576102f56137be565b5f826138d7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f56137be565b5f60208284031215613903575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261394e60a0830184613117565b979650505050505050565b5f60208284031215613969575f80fd5b8151610d9981612f3a565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526139ac60a08301866133ed565b82810360608401526139be81866133ed565b905082810360808401526139d28185613117565b98975050505050505050565b600181811c908216806139f257607f821691505b602082108103613a29577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f82111561130257805f5260205f20601f840160051c81016020851015613a545750805b601f840160051c820191505b818110156113b2575f8155600101613a60565b815167ffffffffffffffff811115613a8d57613a8d612f82565b613aa181613a9b84546139de565b84613a2f565b602080601f831160018114613af3575f8415613abd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106f2565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b3f57888601518255948401946001909101908401613b20565b5085821015613b7b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613bcb60a08301856133ed565b82810360808401526139d281856133ed565b8082018281125f831280158216821582161715613bfc57613bfc6137be565b505092915050565b600181815b80851115613c5d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613c4357613c436137be565b80851615613c5057918102915b93841c9390800290613c09565b509250929050565b5f82613c73575060016102f5565b81613c7f57505f6102f5565b8160018114613c955760028114613c9f57613cbb565b60019150506102f5565b60ff841115613cb057613cb06137be565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613cde575081810a6102f5565b613ce88383613c04565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613d1a57613d1a6137be565b029392505050565b5f6102f28383613c65565b604081525f613d3f60408301856133ed565b82810360208401526137b581856133ed565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612ca557612ca56137be56"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612ea9565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f00565b6102fb565b604051901515815260200161011b565b61015a61015536600461302e565b6103dd565b005b6101646104a7565b60405161011b91906130fc565b61016461017f36600461310e565b61050c565b61015a610192366004613125565b6105db565b61015a6101a53660046131f3565b6105f1565b6101116101b836600461329a565b6106fa565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b6102176102123660046132d4565b610912565b60405161011b91906133c0565b61015a6102323660046133d2565b610a24565b610164610aef565b61015a61024d366004613436565b610b40565b61015a6102603660046133d2565b610b52565b610137610273366004613471565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da3660046133d2565b610bd0565b5f6102f283836102ed610ccc565b610d3f565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610e31565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610f01565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f89291906134b4565b604051602081830303815290604052905090565b60605f61052261051a610fda565b60ff1661108c565b61052a610f01565b610532611148565b61053a6104a7565b60405160200161054d94939291906134c8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611242565b6040516020016105c49291906134b4565b604051602081830303815290604052915050919050565b6105ed6105e661124e565b83836112bf565b5050565b5f6105fa61124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610689575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b156106e5576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b6106f28686868686611307565b505050505050565b5f806107046113b9565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61080960405180602001604052805f8152506113e1565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f88806020019051810190610842919061360a565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156109085784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461095c57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f610965610ccc565b90505f845167ffffffffffffffff81111561098257610982612f1b565b6040519080825280602002602001820160405280156109ab578160200160208202803683370190505b5090505f5b8551811015610a1b576109f68682815181106109ce576109ce613625565b60200260200101518683815181106109e8576109e8613625565b602002602001015185610d3f565b828281518110610a0857610a08613625565b60209081029190910101526001016109b0565b50949350505050565b610a2c610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610a978685846112bf565b610aa3858585856113f2565b6106f27fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060610af9610f01565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f89291906134b4565b6105ed610b4b61124e565b8383611473565b610b5a610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610bc58685846112bf565b610aa385858561157d565b5f610bd961124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610c68575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b15610cbf576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044016106dc565b6106f28686868686610e31565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3a919061360a565b905090565b5f80610d4b858561160a565b90505f610d5661161f565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610d928383876116bc565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff16610de161124e565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610e80576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8516610ecf576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484876119eb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610f8f573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610fd49190810190613688565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd491906136cd565b60605f61109883611a54565b60010190505f8167ffffffffffffffff8111156110b7576110b7612f1b565b6040519080825280601f01601f1916602001820160405280156110e1576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846110eb57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa1580156111d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fb919061360a565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f8f573d5f803e3d5ffd5b60606102f5825f611b35565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff1680156112b657806112b8565b335b9250505090565b805115611302577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d658383836040516112f99392919061371a565b60405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff8416611356576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff85166113a5576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6113b285858585856119eb565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b6113e9611cb4565b610e2e81611cf4565b73ffffffffffffffffffffffffffffffffffffffff8416611441576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018690528183019081526060820185905260808201909252906106f25f878484876119eb565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff83166114e3576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166115cc576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916113b2918791859085906119eb565b5f806116168484611d05565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061166d60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f82613784565b60405160200161167f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9083908290819073ffffffffffffffffffffffffffffffffffffffff8616906379ba43059061171c908690600390600190600401613797565b606060405180830381865afa158015611737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175b91906137e8565b5091509150865f03611840575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214611836576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8616906379ba4305906117ec908590600390600190600401613797565b606060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b91906137e8565b509092509050611768565b5f935050506119e3565b865b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146119de578293506002820361193c576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f9061192c9073ffffffffffffffffffffffffffffffffffffffff89169063b21a2494906024015f60405180830381865afa1580156118e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119279190810190613688565b611db5565b90506119388282611dca565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716906379ba430590611994908690600390600190600401613797565b606060405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d391906137e8565b509093509150611842565b935050505b935093915050565b6119f785858585611e45565b73ffffffffffffffffffffffffffffffffffffffff8416156113b2575f611a1c61124e565b90508351600103611a465760208481015190840151611a3f838989858589611eaa565b50506106f2565b6106f2818787878787612099565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a9c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611ac8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ae657662386f26fc10000830492506010015b6305f5e1008310611afe576305f5e100830492506008015b6127108310611b1257612710830492506004015b60648310611b24576064830492506002015b600a83106102f55760010192915050565b606082515f03611b53575060408051602081019091525f81526102f5565b5f82611b8357600384516002611b69919061382a565b611b73919061383d565b611b7e906004613875565b611ba8565b600384516004611b939190613875565b611b9e90600261382a565b611ba8919061383d565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611c66576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611c13565b905250859050611ca757600386510660018114611c8a5760028114611c9d57611ca5565b603d6001840353603d6002840353611ca5565b603d60018403535b505b9183525060405292915050565b611cbc612228565b611cf2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611cfc611cb4565b610e2e81612246565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611d5360017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d7613784565b604051602001611d6591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f5919061388c565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611e28576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016106dc565b5f610a1b611e3f611e39865f612292565b856122ec565b5f612351565b5f611e4e610ccc565b90505f5b8351811015611e9d57611e7f86858381518110611e7157611e71613625565b602002602001015184612393565b611e9585858381518110611e7157611e71613625565b600101611e52565b506113b2858585856124c9565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611f2190899089908890889088906004016138a3565b6020604051808303815f875af1925050508015611f79575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f76918101906138f2565b60015b612006573d808015611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b606091505b5080515f03611ffe576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190612110908990899088908890889060040161390d565b6020604051808303815f875af1925050508015612168575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612165918101906138f2565b60015b612195573d808015611fa6576040519150601f19603f3d011682016040523d82523d5f602084013e611fab565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b5f6122316113b9565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026113028382613a0c565b5f805f61229f858561256c565b91509150806122e4576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061233186868686612672565b915091505f80612341848461256c565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d612385828287612791565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff83166123b357505050565b5f6123bc61161f565b73ffffffffffffffffffffffffffffffffffffffff85165f908152602082815260408083208784529091528120549192506123f7868661160a565b90505f806124068385886116bc565b9150915083810361241b575050505050505050565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602086815260408083208a8452909152902081905581831461245d5761245d8888846128dd565b604080518581526020810183905290810184905260608101839052879073ffffffffffffffffffffffffffffffffffffffff8a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff1663e5be7d9061250f61124e565b878787876040518663ffffffff1660e01b8152600401612533959493929190613b24565b5f604051808303815f87803b15801561254a575f80fd5b505af115801561255c573d5f803e3d5ffd5b505050506113b2858585856128f1565b5f601b83900b83148383826125d0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156125b057620186a0860595506005850194505b8586601b0b146125cb57600a860595508460010194506125b0565b6125e6565b855f036125e657505f92506001915061238c9050565b848560030b14612642575f85121561260657505f925082915061238c9050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106dc565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561268a575f92505f9150612787565b6126948487613b76565b91505f6126a088612bfb565b90505f6126ac87612bfb565b90505f6126b98383612c5c565b5090505f6f0785ee10d5da46d900f436a0000000008211156126ee576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561270f57670de0b6b3a7640000820491506012015b633b9aca0082111561272857633b9aca00820491506009015b61271082111561273d57612710820491506004015b811561275157600a8204915060010161273d565b61275b8187613b76565b955061277d8b8a612777878761277287600a613cbb565b612c97565b89612d7c565b9097509550505050505b5094509492505050565b5f805f8512156127d7576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b845f036127e957505f905060016119e3565b8460ff8416850185811215612834576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016106dc565b5f805f83121561289e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215612875575f8095509550505050506119e3565b825f03600a0a915081848161288c5761288c6136ed565b04955050840290911491506119e39050565b5f8313156128cd576128b183600a613cbb565b91506128bd8285613875565b9550600194506119e39350505050565b83600195509550505050506119e3565b5f6128e88484611d05565b91909155505050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4500911461295b57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f61296461124e565b90505f5b8451811015612ace5760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612a66575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612a33576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1660048201526024810182905260448101839052606481018490526084016106dc565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612ac4575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612abe90849061382a565b90915550505b5050600101612968565b508351600103612b755760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612b66929190918252602082015260400190565b60405180910390a450506106f2565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612beb929190613cc6565b60405180910390a4505050505050565b5f80821215612c58577f80000000000000000000000000000000000000000000000000000000000000008203612c5257507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612ca48686612c5c565b91509150815f03612cc857838181612cbe57612cbe6136ed565b0492505050610d99565b838210612d12576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016106dc565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612e46577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e3357612ddb7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600161382a565b8403612e0b57507f8000000000000000000000000000000000000000000000000000000000000000905081612e7f565b612e16600a8561383d565b612e1f90613cea565b612e2a846001613b76565b91509150612e7f565b612e3c84613cea565b8391509150612e7f565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e7957612e1f600a8561383d565b50829050815b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2e575f80fd5b5f8060408385031215612eba575f80fd5b8235612ec581612e88565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e575f80fd5b5f60208284031215612f10575f80fd5b8135610d9981612ed3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f8f57612f8f612f1b565b604052919050565b5f67ffffffffffffffff821115612fb057612fb0612f1b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612feb575f80fd5b8135612ffe612ff982612f97565b612f48565b818152846020838601011115613012575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613043575f80fd5b863561304e81612e88565b9550602087013561305e81612e88565b9450604087013561306e81612e88565b9350606087013592506080870135915060a087013567ffffffffffffffff811115613097575f80fd5b6130a389828a01612fdc565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f260208301846130b0565b5f6020828403121561311e575f80fd5b5035919050565b5f8060408385031215613136575f80fd5b82359150602083013567ffffffffffffffff811115613153575f80fd5b61315f85828601612fdc565b9150509250929050565b5f67ffffffffffffffff82111561318257613182612f1b565b5060051b60200190565b5f82601f83011261319b575f80fd5b813560206131ab612ff983613169565b8083825260208201915060208460051b8701019350868411156131cc575f80fd5b602086015b848110156131e857803583529183019183016131d1565b509695505050505050565b5f805f805f60a08688031215613207575f80fd5b853561321281612e88565b9450602086013561322281612e88565b9350604086013567ffffffffffffffff8082111561323e575f80fd5b61324a89838a0161318c565b9450606088013591508082111561325f575f80fd5b61326b89838a0161318c565b93506080880135915080821115613280575f80fd5b5061328d88828901612fdc565b9150509295509295909350565b5f602082840312156132aa575f80fd5b813567ffffffffffffffff8111156132c0575f80fd5b6132cc84828501612fdc565b949350505050565b5f80604083850312156132e5575f80fd5b823567ffffffffffffffff808211156132fc575f80fd5b818501915085601f83011261330f575f80fd5b8135602061331f612ff983613169565b82815260059290921b8401810191818101908984111561333d575f80fd5b948201945b8386101561336457853561335581612e88565b82529482019490820190613342565b96505086013592505080821115613379575f80fd5b5061315f8582860161318c565b5f815180845260208085019450602084015f5b838110156133b557815187529582019590820190600101613399565b509495945050505050565b602081525f6102f26020830184613386565b5f805f805f60a086880312156133e6575f80fd5b85356133f181612e88565b9450602086013561340181612e88565b93506040860135925060608601359150608086013567ffffffffffffffff81111561342a575f80fd5b61328d88828901612fdc565b5f8060408385031215613447575f80fd5b823561345281612e88565b915060208301358015158114613466575f80fd5b809150509250929050565b5f8060408385031215613482575f80fd5b823561348d81612e88565b9150602083013561346681612e88565b5f81518060208401855e5f93019283525090919050565b5f6132cc6134c2838661349d565b8461349d565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f6134f9600c83018761349d565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e67736964652031200000602082015261354f603e82018761349d565b90507f20746f2072656465656d200000000000000000000000000000000000000000008152613581600b82018661349d565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a2200000000000000000000000000000000000000000000000060128201526135d9601a82018561349d565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f6020828403121561361a575f80fd5b8151610d9981612e88565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61365f612ff984612f97565b9050828152838383011115613672575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613698575f80fd5b815167ffffffffffffffff8111156136ae575f80fd5b8201601f810184136136be575f80fd5b6132cc84825160208401613652565b5f602082840312156136dd575f80fd5b815160ff81168114610d99575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f61374e60608301846130b0565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f5613757565b8381526020810183905260608101600383106137da577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f606084860312156137fa575f80fd5b8351925060208401519150604084015167ffffffffffffffff8116811461381f575f80fd5b809150509250925092565b808201808211156102f5576102f5613757565b5f82613870577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f5613757565b5f6020828403121561389c575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526138e760a08301846130b0565b979650505050505050565b5f60208284031215613902575f80fd5b8151610d9981612ed3565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261394560a0830186613386565b82810360608401526139578186613386565b9050828103608084015261396b81856130b0565b98975050505050505050565b600181811c9082168061398b57607f821691505b6020821081036139c2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f82111561130257805f5260205f20601f840160051c810160208510156139ed5750805b601f840160051c820191505b818110156113b2575f81556001016139f9565b815167ffffffffffffffff811115613a2657613a26612f1b565b613a3a81613a348454613977565b846139c8565b602080601f831160018114613a8c575f8415613a565750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106f2565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613ad857888601518255948401946001909101908401613ab9565b5085821015613b1457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613b6460a0830185613386565b828103608084015261396b8185613386565b8082018281125f831280158216821582161715613b9557613b95613757565b505092915050565b600181815b80851115613bf657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613bdc57613bdc613757565b80851615613be957918102915b93841c9390800290613ba2565b509250929050565b5f82613c0c575060016102f5565b81613c1857505f6102f5565b8160018114613c2e5760028114613c3857613c54565b60019150506102f5565b60ff841115613c4957613c49613757565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613c77575081810a6102f5565b613c818383613b9d565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613cb357613cb3613757565b029392505050565b5f6102f28383613bfe565b604081525f613cd86040830185613386565b828103602084015261374e8185613386565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612c5257612c5261375756"; + hex"608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612f10565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f67565b6102fb565b604051901515815260200161011b565b61015a610155366004613095565b6103dd565b005b6101646104a7565b60405161011b9190613163565b61016461017f366004613175565b61050c565b61015a61019236600461318c565b6105db565b61015a6101a536600461325a565b6105f1565b6101116101b8366004613301565b6106fa565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b61021761021236600461333b565b610912565b60405161011b9190613427565b61015a610232366004613439565b610a24565b610164610aef565b61015a61024d36600461349d565b610b40565b61015a610260366004613439565b610b52565b6101376102733660046134d8565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da366004613439565b610bd0565b5f6102f283836102ed610ccc565b610d3f565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610e31565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610f01565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f892919061351b565b604051602081830303815290604052905090565b60605f61052261051a610fda565b60ff1661108c565b61052a610f01565b610532611148565b61053a6104a7565b60405160200161054d949392919061352f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611242565b6040516020016105c492919061351b565b604051602081830303815290604052915050919050565b6105ed6105e661124e565b83836112bf565b5050565b5f6105fa61124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610689575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b156106e5576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b6106f28686868686611307565b505050505050565b5f806107046113b9565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61080960405180602001604052805f8152506113e1565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906108429190613671565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156109085784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461095c57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f610965610ccc565b90505f845167ffffffffffffffff81111561098257610982612f82565b6040519080825280602002602001820160405280156109ab578160200160208202803683370190505b5090505f5b8551811015610a1b576109f68682815181106109ce576109ce61368c565b60200260200101518683815181106109e8576109e861368c565b602002602001015185610d3f565b828281518110610a0857610a0861368c565b60209081029190910101526001016109b0565b50949350505050565b610a2c610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610a978685846112bf565b610aa3858585856113f2565b6106f27fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060610af9610f01565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f892919061351b565b6105ed610b4b61124e565b8383611473565b610b5a610da0565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610bc58685846112bf565b610aa385858561157d565b5f610bd961124e565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610c68575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b15610cbf576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044016106dc565b6106f28686868686610e31565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3a9190613671565b905090565b5f80610d4b858561160a565b90505f610d5661161f565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610d928383876116bc565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff16610de161124e565b73ffffffffffffffffffffffffffffffffffffffff1614610e2e576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610e80576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8516610ecf576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484876119eb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610f8f573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610fd491908101906136ef565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015611068573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd49190613734565b60605f61109883611a54565b60010190505f8167ffffffffffffffff8111156110b7576110b7612f82565b6040519080825280601f01601f1916602001820160405280156110e1576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846110eb57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa1580156111d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fb9190613671565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610f8f573d5f803e3d5ffd5b60606102f5825f611b35565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff1680156112b657806112b8565b335b9250505090565b805115611302577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d658383836040516112f993929190613781565b60405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff8416611356576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff85166113a5576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b6113b285858585856119eb565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b6113e9611cb4565b610e2e81611cf4565b73ffffffffffffffffffffffffffffffffffffffff8416611441576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018690528183019081526060820185905260808201909252906106f25f878484876119eb565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff83166114e3576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166115cc576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016106dc565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916113b2918791859085906119eb565b5f806116168484611d05565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061166d60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f826137eb565b60405160200161167f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9083908290819073ffffffffffffffffffffffffffffffffffffffff8616906379ba43059061171c9086906003906001906004016137fe565b606060405180830381865afa158015611737573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175b919061384f565b5091509150865f03611840575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214611836576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8616906379ba4305906117ec9085906003906001906004016137fe565b606060405180830381865afa158015611807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182b919061384f565b509092509050611768565b5f935050506119e3565b865b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146119de578293506002820361193c576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f9061192c9073ffffffffffffffffffffffffffffffffffffffff89169063b21a2494906024015f60405180830381865afa1580156118e2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261192791908101906136ef565b611db5565b90506119388282611dca565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906119949086906003906001906004016137fe565b606060405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d3919061384f565b509093509150611842565b935050505b935093915050565b6119f785858585611e45565b73ffffffffffffffffffffffffffffffffffffffff8416156113b2575f611a1c61124e565b90508351600103611a465760208481015190840151611a3f838989858589611ea4565b50506106f2565b6106f2818787878787612093565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611a9c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611ac8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ae657662386f26fc10000830492506010015b6305f5e1008310611afe576305f5e100830492506008015b6127108310611b1257612710830492506004015b60648310611b24576064830492506002015b600a83106102f55760010192915050565b606082515f03611b53575060408051602081019091525f81526102f5565b5f82611b8357600384516002611b699190613891565b611b7391906138a4565b611b7e9060046138dc565b611ba8565b600384516004611b9391906138dc565b611b9e906002613891565b611ba891906138a4565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611c66576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611c13565b905250859050611ca757600386510660018114611c8a5760028114611c9d57611ca5565b603d6001840353603d6002840353611ca5565b603d60018403535b505b9183525060405292915050565b611cbc612222565b611cf2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611cfc611cb4565b610e2e81612240565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611d5360017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d76137eb565b604051602001611d6591815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f591906138f3565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611e28576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016106dc565b5f610a1b611e3f611e39865f61228c565b856122e6565b5f61234b565b5f5b8251811015611e9157611e7385848381518110611e6657611e6661368c565b602002602001015161238d565b611e8984848381518110611e6657611e6661368c565b600101611e47565b50611e9e84848484612415565b50505050565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611f1b908990899088908890889060040161390a565b6020604051808303815f875af1925050508015611f73575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f7091810190613959565b60015b612000573d808015611fa0576040519150601f19603f3d011682016040523d82523d5f602084013e611fa5565b606091505b5080515f03611ff8576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b73ffffffffffffffffffffffffffffffffffffffff84163b156106f2576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c819061210a9089908990889088908890600401613974565b6020604051808303815f875af1925050508015612162575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261215f91810190613959565b60015b61218f573d808015611fa0576040519150601f19603f3d011682016040523d82523d5f602084013e611fa5565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024016106dc565b5f61222b6113b9565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026113028382613a73565b5f805f61229985856124b8565b91509150806122de576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061232b868686866125be565b915091505f8061233b84846124b8565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d61237f8282876126dd565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff82166123ac575050565b5f6123b78383612829565b90505f6123c48484612867565b90505f806123d28385612872565b915091508381036123e557505050505050565b6123f0868683612891565b828214612402576124028686846128cf565b6124108686868487876128da565b6106f2565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff1663e5be7d9061245b61124e565b878787876040518663ffffffff1660e01b815260040161247f959493929190613b8b565b5f604051808303815f87803b158015612496575f80fd5b505af11580156124a8573d5f803e3d5ffd5b505050506113b285858585612944565b5f601b83900b831483838261251c577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156124fc57620186a0860595506005850194505b8586601b0b1461251757600a860595508460010194506124fc565b612532565b855f0361253257505f9250600191506123869050565b848560030b1461258e575f85121561255257505f92508291506123869050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106dc565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f80851584151780156125d6575f92505f91506126d3565b6125e08487613bdd565b91505f6125ec88612c4e565b90505f6125f887612c4e565b90505f6126058383612caf565b5090505f6f0785ee10d5da46d900f436a00000000082111561263a576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561265b57670de0b6b3a7640000820491506012015b633b9aca0082111561267457633b9aca00820491506009015b61271082111561268957612710820491506004015b811561269d57600a82049150600101612689565b6126a78187613bdd565b95506126c98b8a6126c387876126be87600a613d22565b612cea565b89612dcf565b9097509550505050505b5094509492505050565b5f805f851215612723576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016106dc565b845f0361273557505f905060016119e3565b8460ff8416850185811215612780576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016106dc565b5f805f8312156127ea577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156127c1575f8095509550505050506119e3565b825f03600a0a91508184816127d8576127d8613754565b04955050840290911491506119e39050565b5f831315612819576127fd83600a613d22565b915061280982856138dc565b9550600194506119e39350505050565b83600195509550505050506119e3565b5f61283261161f565b73ffffffffffffffffffffffffffffffffffffffff84165f908152602091825260408082208583529092522054905092915050565b5f6102f2838361160a565b5f806128868484612881610ccc565b6116bc565b915091509250929050565b8061289a61161f565b73ffffffffffffffffffffffffffffffffffffffff9094165f9081526020948552604080822094825293909452919092205550565b611302838383612edb565b604080518581526020810185905290810183905260608101829052859073ffffffffffffffffffffffffffffffffffffffff8816907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a3505050505050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146129ae57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016106dc565b5f6129b761124e565b90505f5b8451811015612b215760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612ab9575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612a86576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1660048201526024810182905260448101839052606481018490526084016106dc565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612b17575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612b11908490613891565b90915550505b50506001016129bb565b508351600103612bc85760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612bb9929190918252602082015260400190565b60405180910390a450506106f2565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c3e929190613d2d565b60405180910390a4505050505050565b5f80821215612cab577f80000000000000000000000000000000000000000000000000000000000000008203612ca557507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612cf78686612caf565b91509150815f03612d1b57838181612d1157612d11613754565b0492505050610d99565b838210612d65576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016106dc565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612e99577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612e8657612e2e7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001613891565b8403612e5e57507f8000000000000000000000000000000000000000000000000000000000000000905081612ed2565b612e69600a856138a4565b612e7290613d51565b612e7d846001613bdd565b91509150612ed2565b612e8f84613d51565b8391509150612ed2565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612ecc57612e72600a856138a4565b50829050815b94509492505050565b5f612ee68484611d05565b91909155505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2e575f80fd5b5f8060408385031215612f21575f80fd5b8235612f2c81612eef565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2e575f80fd5b5f60208284031215612f77575f80fd5b8135610d9981612f3a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612ff657612ff6612f82565b604052919050565b5f67ffffffffffffffff82111561301757613017612f82565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613052575f80fd5b813561306561306082612ffe565b612faf565b818152846020838601011115613079575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156130aa575f80fd5b86356130b581612eef565b955060208701356130c581612eef565b945060408701356130d581612eef565b9350606087013592506080870135915060a087013567ffffffffffffffff8111156130fe575f80fd5b61310a89828a01613043565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f26020830184613117565b5f60208284031215613185575f80fd5b5035919050565b5f806040838503121561319d575f80fd5b82359150602083013567ffffffffffffffff8111156131ba575f80fd5b6131c685828601613043565b9150509250929050565b5f67ffffffffffffffff8211156131e9576131e9612f82565b5060051b60200190565b5f82601f830112613202575f80fd5b81356020613212613060836131d0565b8083825260208201915060208460051b870101935086841115613233575f80fd5b602086015b8481101561324f5780358352918301918301613238565b509695505050505050565b5f805f805f60a0868803121561326e575f80fd5b853561327981612eef565b9450602086013561328981612eef565b9350604086013567ffffffffffffffff808211156132a5575f80fd5b6132b189838a016131f3565b945060608801359150808211156132c6575f80fd5b6132d289838a016131f3565b935060808801359150808211156132e7575f80fd5b506132f488828901613043565b9150509295509295909350565b5f60208284031215613311575f80fd5b813567ffffffffffffffff811115613327575f80fd5b61333384828501613043565b949350505050565b5f806040838503121561334c575f80fd5b823567ffffffffffffffff80821115613363575f80fd5b818501915085601f830112613376575f80fd5b81356020613386613060836131d0565b82815260059290921b840181019181810190898411156133a4575f80fd5b948201945b838610156133cb5785356133bc81612eef565b825294820194908201906133a9565b965050860135925050808211156133e0575f80fd5b506131c6858286016131f3565b5f815180845260208085019450602084015f5b8381101561341c57815187529582019590820190600101613400565b509495945050505050565b602081525f6102f260208301846133ed565b5f805f805f60a0868803121561344d575f80fd5b853561345881612eef565b9450602086013561346881612eef565b93506040860135925060608601359150608086013567ffffffffffffffff811115613491575f80fd5b6132f488828901613043565b5f80604083850312156134ae575f80fd5b82356134b981612eef565b9150602083013580151581146134cd575f80fd5b809150509250929050565b5f80604083850312156134e9575f80fd5b82356134f481612eef565b915060208301356134cd81612eef565b5f81518060208401855e5f93019283525090919050565b5f6133336135298386613504565b84613504565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613560600c830187613504565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e6773696465203120000060208201526135b6603e820187613504565b90507f20746f2072656465656d2000000000000000000000000000000000000000000081526135e8600b820186613504565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613640601a820185613504565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215613681575f80fd5b8151610d9981612eef565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6136c661306084612ffe565b90508281528383830111156136d9575f80fd5b8282602083015e5f602084830101529392505050565b5f602082840312156136ff575f80fd5b815167ffffffffffffffff811115613715575f80fd5b8201601f81018413613725575f80fd5b613333848251602084016136b9565b5f60208284031215613744575f80fd5b815160ff81168114610d99575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6137b56060830184613117565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f56137be565b838152602081018390526060810160038310613841577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613861575f80fd5b8351925060208401519150604084015167ffffffffffffffff81168114613886575f80fd5b809150509250925092565b808201808211156102f5576102f56137be565b5f826138d7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f56137be565b5f60208284031215613903575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261394e60a0830184613117565b979650505050505050565b5f60208284031215613969575f80fd5b8151610d9981612f3a565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526139ac60a08301866133ed565b82810360608401526139be81866133ed565b905082810360808401526139d28185613117565b98975050505050505050565b600181811c908216806139f257607f821691505b602082108103613a29577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f82111561130257805f5260205f20601f840160051c81016020851015613a545750805b601f840160051c820191505b818110156113b2575f8155600101613a60565b815167ffffffffffffffff811115613a8d57613a8d612f82565b613aa181613a9b84546139de565b84613a2f565b602080601f831160018114613af3575f8415613abd5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556106f2565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b3f57888601518255948401946001909101908401613b20565b5085821015613b7b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613bcb60a08301856133ed565b82810360808401526139d281856133ed565b8082018281125f831280158216821582161715613bfc57613bfc6137be565b505092915050565b600181815b80851115613c5d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613c4357613c436137be565b80851615613c5057918102915b93841c9390800290613c09565b509250929050565b5f82613c73575060016102f5565b81613c7f57505f6102f5565b8160018114613c955760028114613c9f57613cbb565b60019150506102f5565b60ff841115613cb057613cb06137be565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613cde575081810a6102f5565b613ce88383613c04565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613d1a57613d1a6137be565b029392505050565b5f6102f28383613c65565b604081525f613d3f60408301856133ed565b82810360208401526137b581856133ed565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612ca557612ca56137be56"; diff --git a/src/generated/StoxReceiptVault.pointers.sol b/src/generated/StoxReceiptVault.pointers.sol index 4af9204d..d9a13349 100644 --- a/src/generated/StoxReceiptVault.pointers.sol +++ b/src/generated/StoxReceiptVault.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x98b019aa6af7b24929e611da32f600e51a0560193fb762bde7740dc3be6dee56); +bytes32 constant BYTECODE_HASH = bytes32(0x2bba26e83e023daf6976920f5742d67c9b1ec9eee0029755430bbc6e5d73d1c9); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x8A88A9753603CEC3C825382176a6430E6137E2C3); +address constant DEPLOYED_ADDRESS = address(0x1Db61076E5dd1fB3f1145Bfc40c5f69ADea55bF6); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615e0c806101005f395ff3fe608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73662d3076e827f5b138a3e96dd99f7ed4895becaf365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614c55565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614ca8565b610aba565b3480156103f3575f80fd5b506103fc610ace565b6040516103919190614d0f565b348015610414575f80fd5b506103b9610423366004614d21565b610ba1565b610387610436366004614eaa565b610bb8565b348015610446575f80fd5b50610387610c02565b34801561045a575f80fd5b50610387610469366004614f09565b610c0b565b348015610479575f80fd5b50610371610488366004614f29565b610c2a565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da366004614f40565b610cb6565b3480156104ea575f80fd5b506103716104f9366004614d21565b610cd9565b61038761050c366004614f09565b610e18565b34801561051c575f80fd5b50610525610e43565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b610ee8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614ca8565b505f1990565b34801561058e575f80fd5b5061038761059d366004614f7e565b610f1c565b3480156105ad575f80fd5b506103876105bc366004614f09565b6111c1565b3480156105cc575f80fd5b506103876105db366004614d21565b6111d9565b3480156105eb575f80fd5b506103876105fa366004614fb0565b611293565b34801561060a575f80fd5b50610371610619366004614ff7565b6115d4565b348015610629575f80fd5b50610371610638366004614ca8565b61160c565b348015610648575f80fd5b50610387610657366004614ca8565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614ca8565b611739565b3480156106ba575f80fd5b506103876106c9366004614ca8565b611839565b3480156106d9575f80fd5b50610371611882565b3480156106ed575f80fd5b506103876106fc366004614ff7565b611895565b34801561070c575f80fd5b5061037161071b366004614d21565b611a4f565b61038761072e366004614f09565b611b80565b34801561073e575f80fd5b5061037161074d366004614f7e565b611b95565b34801561075d575f80fd5b5061038761076c366004614d21565b611bd1565b34801561077c575f80fd5b5061054b611c9b565b348015610790575f80fd5b5061038761079f36600461504c565b611ca4565b3480156107af575f80fd5b506103fc611cd1565b3480156107c3575f80fd5b506103b96107d2366004614d21565b611d22565b3480156107e2575f80fd5b506107f66107f13660046150bd565b611d2f565b604051610391919061512c565b34801561080e575f80fd5b5061038761081d36600461504c565b611e15565b34801561082d575f80fd5b5061038761083c366004614ca8565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004614f09565b611e38565b34801561089f575f80fd5b506103876108ae3660046151ea565b611e46565b6103876108c1366004614eaa565b611f2e565b3480156108d1575f80fd5b5061054b611f5d565b6103876108e8366004614f09565b611f85565b3480156108f8575f80fd5b5061038761090736600461524f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a63660046152f8565b611f99565b3480156109b6575f80fd5b506103716109c536600461538e565b6120d0565b3480156109d5575f80fd5b506103716109e4366004614ca8565b612239565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610c02565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab48261228c565b92915050565b610ac26123ba565b610acb81612405565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f906153e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b906153e6565b8015610b965780601f10610b6d57610100808354040283529160200191610b96565b820191905f5260205f20905b815481529060010190602001808311610b7957829003601f168201915b505050505091505090565b5f33610bae818585612565565b5060019392505050565b5f80610bc2612577565b90505f610bdc87610bd6335b89865f6125ce565b876125e2565b9050610beb87878385886125f8565b610bf6335b4761281f565b9150505b949350505050565b5f610a5a6128c8565b5f610c2383670de0b6b3a7640000612a27565b612a27565b9392505050565b610c326123ba565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610c60578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610c89611c9b565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610cc3858285612a33565b610cce858585612ae7565b506001949350505050565b610ce16123ba565b805f03610d2a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610da7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610dd0611c9b565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f80610e3884610e32335b33610e2c612577565b5f6125ce565b85612b76565b9050610c2333610bf0565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b80610e80576012610ee0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee09190615431565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80610f26612b8d565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610f525750825b90505f8267ffffffffffffffff166001148015610f6e5750303b155b905081158015610f7c575080155b15610fb3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110145784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61101c612bb5565b5f87806020019051810190611031919061549e565b90506110408160200151612bee565b6020810151516001600160a01b031615611086576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166110c7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d030612405565b80516110db90612d61565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161112a929190615595565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156111b75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610c23836111d4335b338660016125ce565b612de9565b5f61120b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561126f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190615639565b5f61129c612df6565b825f036112d5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6113998461130b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561136f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113939190615639565b90612e24565b905080156114b6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516113da96959493929190615650565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561149f575f80fd5b505af11580156114b1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161154d9190615699565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161157a939291906156e4565b5f604051808303815f87803b158015611591575f80fd5b505af11580156115a3573d5f803e3d5ffd5b5093945050505050610bfa60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610d21939291906156e4565b6116146123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116116c9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61170c611c9b565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610caa565b6117416123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116117f6576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161170c611c9b565b5f8061184483612e33565b90505f61184f612e46565b6001600160a01b0385165f90815260038201602052604081205491925090611878908490612ee3565b5095945050505050565b61188a6123ba565b6118935f612d61565b565b5f61189e612df6565b825f036118d7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6118e58461139387611839565b90508015611937577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e338686848760405161192495949392919061570b565b60405180910390a1611937853383612ae7565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a8152602001878152602001898152506040516020016119c89190615742565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016119f5939291906156e4565b5f604051808303815f87803b158015611a0c575f80fd5b505af1158015611a1e573d5f803e3d5ffd5b5093945050505050610c2360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611a576123ba565b805f03611a9b576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610d21565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611b18576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611b41611c9b565b6001600160a01b038581165f81815260018601602090815260409182902054825195909416855284019190915282018590526060820152608001610e0b565b5f80610e3884611b8f33610e23565b856125e2565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611bc6929190615783565b60405180910390a150565b5f610c23611c067f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052919091169062fdd58e90604401602060405180830381865afa158015611c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8e9190615639565b610c1e85868660016125ce565b5f610a5a612f8d565b5f80611cb787610c1e87898860016125ce565b9050611cc78187878a8888612fb5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f906153e6565b5f33610bae818585612ae7565b604080515f8152602081019091526060908267ffffffffffffffff811115611d5957611d59614d4b565b604051908082528060200260200182016040528015611d8c57816020015b6060815260200190600190039081611d775790505b5091505f5b83811015611e0d57611de830868684818110611daf57611daf6157e4565b9050602002810190611dc19190615811565b85604051602001611dd493929190615872565b60405160208183030381529060405261337b565b838281518110611dfa57611dfa6157e4565b6020908102919091010152600101611d91565b505092915050565b5f80611e28876111d487898860016125ce565b9050611cc7878787848888612fb5565b5f610c2383610c1e336111cb565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090851115611ec8576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610d21565b5f611edf88611ed9338a8a5f6125ce565b5f6125e2565b9050611f238888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125f892505050565b979650505050505050565b5f80611f38612577565b90505f611f4e87611f4833610bce565b87612b76565b9050610beb81878985886125f8565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00610f0c565b5f80610e3884670de0b6b3a7640000611ed9565b611fa68585858585613416565b611fb08484613479565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a48906080810161205a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b1515905260405161206e91906020016158cf565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161209b939291906156e4565b5f604051808303815f87803b1580156120b2575f80fd5b505af11580156120c4573d5f803e3d5ffd5b50505050505050505050565b835f03612109576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806121a35750816002015486115b156121b75760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516121ee95949392919061595f565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533918460405160200161206e91906159cb565b6122416123ba565b6001600160a01b038116612283576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b610acb81612d61565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061231e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061236a57507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b336123c3611c9b565b6001600160a01b031614611893576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610d21565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a49190615a0f565b6124da576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610caa565b6125728383836001613539565b505050565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906125c8906001615a2a565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f6125ed8284613661565b610bfa84845f6136a5565b612600612df6565b845f03612639576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03612672576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166126b2576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036126ed576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea33858786868660405161272696959493929190615650565b60405180910390a161273b85858585856136ba565b6127458484613715565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906127b5903390889087908990889060040161570b565b5f604051808303815f87803b1580156127cc575f80fd5b505af11580156127de573d5f803e3d5ffd5b505050506127ef8585858585613762565b61281860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b80471015612862576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610d21565b61287b828260405180602001604052805f81525061380e565b15612884575050565b3d1561289657612892613823565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806128d2612e46565b60028101549091505f036128e8576125c861382e565b5f6128f75f19600360016138b2565b90505f5b5f198214610c23575f836002018381548110612919576129196157e4565b905f5260205f2090600502015f01549050600281036129f6575f6129e685600201858154811061294b5761294b6157e4565b905f5260205f2090600502016004018054612965906153e6565b80601f0160208091040260200160405190810160405280929190818152602001828054612991906153e6565b80156129dc5780601f106129b3576101008083540402835291602001916129dc565b820191905f5260205f20905b8154815290600101906020018083116129bf57829003601f168201915b50505050506139ad565b90506129f283826139c2565b9250505b5f838152600485016020526040902054612a109083615a2a565b9150612a1f83600360016138b2565b9250506128fb565b5f610c23838383613a46565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612ae15781811015612ad3576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610d21565b612ae184848484035f613539565b50505050565b6001600160a01b038316612b29576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038216612b6b576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612572838383613a5b565b5f612b818284613661565b610bfa84846001613a46565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611893576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf6613aae565b612c0881602001518260400151613ab6565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612ce8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d0c9190615a3d565b90506001600160a01b0381163014612572576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610d21565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610c23838360016136a5565b612dfe613ac8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610c23565b5f80612e3e83613b23565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00612e9460017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e716157d1565b604051602001612ea691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f8181612eee612e46565b9050845f612eff86600360016138b2565b90505b5f198114612f81579250828115801590612f3f57506002836002018281548110612f2e57612f2e6157e4565b905f5260205f2090600502015f0154145b15612f6d575f612f5d84600201838154811061294b5761294b6157e4565b9050612f6983826139c2565b9250505b612f7a81600360016138b2565b9050612f02565b509250505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610f0c565b612fbd612df6565b855f03612ff6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361302f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661306f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166130af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036130eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610d21565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131269796959493929190615a58565b60405180910390a16001600160a01b038416331461329557613149843385612a33565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156131e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132099190615a0f565b613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610d21565b61329f8484613baf565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061330f903390889087908990889060040161570b565b5f604051808303815f87803b158015613326575f80fd5b505af1158015613338573d5f803e3d5ffd5b5050505061334a868686868686613bfc565b61337360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6133888484613d05565b90508080156133a957505f3d11806133a957505f846001600160a01b03163b115b156133be576133b6613d18565b915050610ab4565b8015613401576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610d21565b3d156128965761340f613823565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612818576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906134c257506001600160a01b0383165f908152600182016020526040902054155b80156134e557506001600160a01b0382165f908152600282016020526040902054155b156125725780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610d21565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661359c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b0384166135de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561281857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161365291815260200190565b60405180910390a35050505050565b81811015612892576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b5f610bfa8484670de0b6b3a764000085613d31565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137089084613d73565b6001909101555050505050565b6001600160a01b038216613757576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6128925f8383613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806137cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b81526020018981526020018781525060405160200161206e9190615afd565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061387c60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff6157d1565b60405160200161388e91815260200190565b60405160208183030381529060405280519060200120169050600281015491505090565b5f6007831681036138ef576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138f8612e46565b60028101549091505f03613910575f19915050610c23565b5f5f1986146139435781600201868154811061392e5761392e6157e4565b905f5260205f20906005020160030154613946565b81545b9050600284600281111561395c5761395c615b0f565b0361397e576139758261396f8484613d82565b87613dfd565b92505050610c23565b600184600281111561399257613992615b0f565b036139a257613975828287613e55565b611cc7828287613dfd565b5f81806020019051810190610ab49190615639565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a20576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610d21565b5f613a3d613a37613a31865f613ec2565b85613f1c565b5f613f81565b50949350505050565b5f610bfa84670de0b6b3a76400008585613d31565b613a63613fc2565b613a6c83614028565b613a7582614028565b613a80838383614115565b6001600160a01b038316613a975761257281614275565b6001600160a01b03821661257257612572816142b8565b6118936142f2565b613abe6142f2565b6128928282614330565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611893576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613b7160017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff6157d1565b604051602001613b8391815260200190565b60405160208183030381529060405280519060200120169050825f528060205260405f20915050919050565b6001600160a01b038216613bf1576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612892825f83613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ca29190615afd565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613ccf939291906156e4565b5f604051808303815f87803b158015613ce6575f80fd5b505af1158015613cf8573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613d5e613d3e83614393565b8015613d5957505f8480613d5457613d54615b3c565b868809115b151590565b613d698686866143bf565b6125d99190615a2a565b5f828218828411028218610c23565b5f5b5f198214158015613dc6575042836002018381548110613da657613da66157e4565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613df757826002018281548110613de057613de06157e4565b905f5260205f209060050201600301549150613d84565b50919050565b5f5b5f198314613e4b575f846002018481548110613e1d57613e1d6157e4565b905f5260205f209060050201905082815f0154165f14613e405783915050610c23565b600301549250613dff565b505f199392505050565b5f5b5f198314613e4b575f846002018481548110613e7557613e756157e4565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ea55750613e4b565b8054831615613eb75783915050610c23565b600301549250613e57565b5f805f613ecf858561446f565b9150915080613f14576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613f6186868686614575565b915091505f80613f71848461446f565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613fb5828287614694565b9350935050509250929050565b5f613fcb612e46565b60028101549091505f03613fdc5750565b5f613ff18260050154600260011760016138b2565b90505f195b5f19821461401457508061400d81600360016138b2565b9150613ff6565b5f1981146125725760058301819055505050565b6001600160a01b0381166140395750565b5f614042612e46565b6001600160a01b0383165f90815260038201602052604081205491925061406884612e33565b90505f806140768385612ee3565b9150915083810361408957505050505050565b6001600160a01b0386165f90815260038601602052604090208190558183146140b6576140b686836147e3565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a2613373848483856147f5565b61411f8383613479565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016141cf7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b815260040161423d939291906156e4565b5f604051808303815f87803b158015614254575f80fd5b505af1158015614266573d5f803e3d5ffd5b50505050612ae1848484614852565b5f61427e612e46565b6002810154909150156128925760058101545f908152600482016020526040812080548492906142af908490615a2a565b90915550505050565b5f6142c1612e46565b6002810154909150156128925760058101545f908152600482016020526040812080548492906142af9084906157d1565b6142fa61485d565b611893576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143386142f2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036143848482615bad565b5060048101612ae18382615bad565b5f60028260038111156143a8576143a8615b0f565b6143b29190615c87565b60ff166001149050919050565b5f805f6143cc868661487b565b91509150815f036143f0578381816143e6576143e6615b3c565b0492505050610c23565b818411614407576144076003851502601118614897565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b83148383826144d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156144b357620186a0860595506005850194505b8586601b0b146144ce57600a860595508460010194506144b3565b6144e9565b855f036144e957505f925060019150612f869050565b848560030b14614545575f85121561450957505f9250829150612f869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561458d575f92505f915061468a565b6145978487615ca8565b91505f6145a3886148a8565b90505f6145af876148a8565b90505f6145bc838361487b565b5090505f6f0785ee10d5da46d900f436a0000000008211156145f1576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561461257670de0b6b3a7640000820491506012015b633b9aca0082111561462b57633b9aca00820491506009015b61271082111561464057612710820491506004015b811561465457600a82049150600101614640565b61465e8187615ca8565b95506146808b8a61467a878761467587600a615da7565b614909565b896149e4565b9097509550505050505b5094509492505050565b5f805f8512156146da576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b845f036146ec57505f905060016147db565b8460ff8416850185811215614737576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610d21565b5f805f8312156147a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614778575f8095509550505050506147db565b825f03600a0a915081848161478f5761478f615b3c565b04955050840290911491506147db9050565b5f8313156147d0576147b483600a615da7565b91506147c08285615db2565b9550600194506147db9350505050565b509193506001925050505b935093915050565b5f6147ed83613b23565b919091555050565b5f6147fe612e46565b905083816004015f8781526020019081526020015f205f82825461482291906157d1565b90915550505f83815260048201602052604081208054849290614846908490615a2a565b90915550505050505050565b612572838383614af0565b5f614866612b8d565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614905577f800000000000000000000000000000000000000000000000000000000000000082036148ff57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614916868661487b565b91509150815f03614930578381816143e6576143e6615b3c565b83821061497a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610d21565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614aae577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614a9b57614a437f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615a2a565b8403614a7357507f8000000000000000000000000000000000000000000000000000000000000000905081614ae7565b614a7e600a85615dc9565b614a8790615ddc565b614a92846001615ca8565b91509150614ae7565b614aa484615ddc565b8391509150614ae7565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614ae157614a87600a85615dc9565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614b3d5781816002015f828254614b329190615a2a565b90915550614bc69050565b6001600160a01b0384165f9081526020829052604090205482811015614ba8576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610d21565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614be4576002810180548390039055614c02565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614c4791815260200190565b60405180910390a350505050565b5f60208284031215614c65575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c23575f80fd5b6001600160a01b0381168114610acb575f80fd5b5f60208284031215614cb8575f80fd5b8135610c2381614c94565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c236020830184614cc3565b5f8060408385031215614d32575f80fd5b8235614d3d81614c94565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614d9b57614d9b614d4b565b60405290565b6040516080810167ffffffffffffffff81118282101715614d9b57614d9b614d4b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614e0b57614e0b614d4b565b604052919050565b5f67ffffffffffffffff821115614e2c57614e2c614d4b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614e67575f80fd5b8135614e7a614e7582614e13565b614dc4565b818152846020838601011115614e8e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614ebd575f80fd5b843593506020850135614ecf81614c94565b925060408501359150606085013567ffffffffffffffff811115614ef1575f80fd5b614efd87828801614e58565b91505092959194509250565b5f8060408385031215614f1a575f80fd5b50508035926020909101359150565b5f60208284031215614f39575f80fd5b5035919050565b5f805f60608486031215614f52575f80fd5b8335614f5d81614c94565b92506020840135614f6d81614c94565b929592945050506040919091013590565b5f60208284031215614f8e575f80fd5b813567ffffffffffffffff811115614fa4575f80fd5b610bfa84828501614e58565b5f805f8060808587031215614fc3575f80fd5b8435614fce81614c94565b93506020850135925060408501359150606085013567ffffffffffffffff811115614ef1575f80fd5b5f805f60608486031215615009575f80fd5b833561501481614c94565b925060208401359150604084013567ffffffffffffffff811115615036575f80fd5b61504286828701614e58565b9150509250925092565b5f805f805f60a08688031215615060575f80fd5b85359450602086013561507281614c94565b9350604086013561508281614c94565b925060608601359150608086013567ffffffffffffffff8111156150a4575f80fd5b6150b088828901614e58565b9150509295509295909350565b5f80602083850312156150ce575f80fd5b823567ffffffffffffffff808211156150e5575f80fd5b818501915085601f8301126150f8575f80fd5b813581811115615106575f80fd5b8660208260051b850101111561511a575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561519f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261518d858351614cc3565b94509285019290850190600101615153565b5092979650505050505050565b5f8083601f8401126151bc575f80fd5b50813567ffffffffffffffff8111156151d3575f80fd5b602083019150836020828501011115612f86575f80fd5b5f805f805f608086880312156151fe575f80fd5b85359450602086013561521081614c94565b935060408601359250606086013567ffffffffffffffff811115615232575f80fd5b61523e888289016151ac565b969995985093965092949392505050565b5f8060408385031215615260575f80fd5b823561526b81614c94565b9150602083013561527b81614c94565b809150509250929050565b5f82601f830112615295575f80fd5b8135602067ffffffffffffffff8211156152b1576152b1614d4b565b8160051b6152c0828201614dc4565b92835284810182019282810190878511156152d9575f80fd5b83870192505b84831015611f23578235825291830191908301906152df565b5f805f805f60a0868803121561530c575f80fd5b853561531781614c94565b9450602086013561532781614c94565b9350604086013561533781614c94565b9250606086013567ffffffffffffffff80821115615353575f80fd5b61535f89838a01615286565b93506080880135915080821115615374575f80fd5b506150b088828901615286565b8015158114610acb575f80fd5b5f805f80606085870312156153a1575f80fd5b8435935060208501356153b381615381565b9250604085013567ffffffffffffffff8111156153ce575f80fd5b6153da878288016151ac565b95989497509550505050565b600181811c908216806153fa57607f821691505b602082108103613df7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60208284031215615441575f80fd5b815160ff81168114610c23575f80fd5b5f82601f830112615460575f80fd5b815161546e614e7582614e13565b818152846020838601011115615482575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f602082840312156154ae575f80fd5b815167ffffffffffffffff808211156154c5575f80fd5b90830190604082860312156154d8575f80fd5b6154e0614d78565b82516154eb81614c94565b81526020830151828111156154fe575f80fd5b929092019160808387031215615512575f80fd5b61551a614da1565b835161552581614c94565b8152602084015183811115615538575f80fd5b61554488828701615451565b60208301525060408401518381111561555b575f80fd5b61556788828701615451565b6040830152506060840151935061557d84614c94565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a08601526155e2610100860182614cc3565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c087015261561d8282614cc3565b9150508260608301511660e08601528093505050509392505050565b5f60208284031215615649575f80fd5b5051919050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261568d60c0830184614cc3565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610bfa60c0840182614cc3565b6001600160a01b0384168152826020820152606060408201525f6125d96060830184614cc3565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611f2360a0830184614cc3565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610bfa60a0840182614cc3565b6001600160a01b0383168152604060208201525f610bfa6040830184614cc3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab46157a4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615844575f80fd5b83018035915067ffffffffffffffff82111561585e575f80fd5b602001915036819003821315612f86575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b838110156158c4578151875295820195908201906001016158a8565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a0606084015261590b60c0840182615895565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160808501526159468282615895565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610bfa60c0840182614cc3565b5f60208284031215615a1f575f80fd5b8151610c2381615381565b80820180821115610ab457610ab46157a4565b5f60208284031215615a4d575f80fd5b8151610c2381614c94565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615a9d60e0830184614cc3565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610bfa60c0850182614cc3565b602081525f610c236020830184615aaa565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f82111561257257805f5260205f20601f840160051c81016020851015615b8e5750805b601f840160051c820191505b81811015612818575f8155600101615b9a565b815167ffffffffffffffff811115615bc757615bc7614d4b565b615bdb81615bd584546153e6565b84615b69565b602080601f831160018114615c0e575f8415615bf75750858301515b5f19600386901b1c1916600185901b178555613373565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615c5a57888601518255948401946001909101908401615c3b565b5085821015615c7757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615c9957615c99615b3c565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611e0d57611e0d6157a4565b600181815b80851115615d0157815f1904821115615ce757615ce76157a4565b80851615615cf457918102915b93841c9390800290615ccc565b509250929050565b5f82615d1757506001610ab4565b81615d2357505f610ab4565b8160018114615d395760028114615d4357615d5f565b6001915050610ab4565b60ff841115615d5457615d546157a4565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615d82575081810a610ab4565b615d8c8383615cc7565b805f1904821115615d9f57615d9f6157a4565b029392505050565b5f610c238383615d09565b8082028115828204841417610ab457610ab46157a4565b5f82615dd757615dd7615b3c565b500490565b5f7f800000000000000000000000000000000000000000000000000000000000000082036148ff576148ff6157a456"; + hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615e8e806101005f395ff3fe608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73662d3076e827f5b138a3e96dd99f7ed4895becaf365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614cd7565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614d2a565b610aba565b3480156103f3575f80fd5b506103fc610ace565b6040516103919190614d91565b348015610414575f80fd5b506103b9610423366004614da3565b610ba1565b610387610436366004614f2c565b610bb8565b348015610446575f80fd5b50610387610c02565b34801561045a575f80fd5b50610387610469366004614f8b565b610c0b565b348015610479575f80fd5b50610371610488366004614fab565b610c2a565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da366004614fc2565b610cb6565b3480156104ea575f80fd5b506103716104f9366004614da3565b610cd9565b61038761050c366004614f8b565b610e18565b34801561051c575f80fd5b50610525610e43565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b610ee8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614d2a565b505f1990565b34801561058e575f80fd5b5061038761059d366004615000565b610f1c565b3480156105ad575f80fd5b506103876105bc366004614f8b565b6111c1565b3480156105cc575f80fd5b506103876105db366004614da3565b6111d9565b3480156105eb575f80fd5b506103876105fa366004615032565b611293565b34801561060a575f80fd5b50610371610619366004615079565b6115d4565b348015610629575f80fd5b50610371610638366004614d2a565b61160c565b348015610648575f80fd5b50610387610657366004614d2a565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614d2a565b611739565b3480156106ba575f80fd5b506103876106c9366004614d2a565b611839565b3480156106d9575f80fd5b50610371611882565b3480156106ed575f80fd5b506103876106fc366004615079565b611895565b34801561070c575f80fd5b5061037161071b366004614da3565b611a4f565b61038761072e366004614f8b565b611b80565b34801561073e575f80fd5b5061037161074d366004615000565b611b95565b34801561075d575f80fd5b5061038761076c366004614da3565b611bd1565b34801561077c575f80fd5b5061054b611c9b565b348015610790575f80fd5b5061038761079f3660046150ce565b611ca4565b3480156107af575f80fd5b506103fc611cd1565b3480156107c3575f80fd5b506103b96107d2366004614da3565b611d22565b3480156107e2575f80fd5b506107f66107f136600461513f565b611d2f565b60405161039191906151ae565b34801561080e575f80fd5b5061038761081d3660046150ce565b611e15565b34801561082d575f80fd5b5061038761083c366004614d2a565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004614f8b565b611e38565b34801561089f575f80fd5b506103876108ae36600461526c565b611e46565b6103876108c1366004614f2c565b611f2e565b3480156108d1575f80fd5b5061054b611f5d565b6103876108e8366004614f8b565b611f85565b3480156108f8575f80fd5b506103876109073660046152d1565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a636600461537a565b611f99565b3480156109b6575f80fd5b506103716109c5366004615410565b6120d0565b3480156109d5575f80fd5b506103716109e4366004614d2a565b612239565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610c02565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab48261228c565b92915050565b610ac26123ba565b610acb81612405565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f90615468565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90615468565b8015610b965780601f10610b6d57610100808354040283529160200191610b96565b820191905f5260205f20905b815481529060010190602001808311610b7957829003601f168201915b505050505091505090565b5f33610bae818585612565565b5060019392505050565b5f80610bc2612577565b90505f610bdc87610bd6335b89865f6125ce565b876125e2565b9050610beb87878385886125f8565b610bf6335b4761281f565b9150505b949350505050565b5f610a5a6128c8565b5f610c2383670de0b6b3a7640000612a27565b612a27565b9392505050565b610c326123ba565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610c60578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610c89611c9b565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610cc3858285612a33565b610cce858585612ae7565b506001949350505050565b610ce16123ba565b805f03610d2a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610da7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610dd0611c9b565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f80610e3884610e32335b33610e2c612577565b5f6125ce565b85612b76565b9050610c2333610bf0565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b80610e80576012610ee0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee091906154b3565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80610f26612b8d565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610f525750825b90505f8267ffffffffffffffff166001148015610f6e5750303b155b905081158015610f7c575080155b15610fb3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110145784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61101c612bb5565b5f878060200190518101906110319190615520565b90506110408160200151612bee565b6020810151516001600160a01b031615611086576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166110c7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d030612405565b80516110db90612d61565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161112a929190615617565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156111b75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610c23836111d4335b338660016125ce565b612de9565b5f61120b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561126f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2391906156bb565b5f61129c612df6565b825f036112d5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6113998461130b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561136f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139391906156bb565b90612e24565b905080156114b6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516113da969594939291906156d2565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561149f575f80fd5b505af11580156114b1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161154d919061571b565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161157a93929190615766565b5f604051808303815f87803b158015611591575f80fd5b505af11580156115a3573d5f803e3d5ffd5b5093945050505050610bfa60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610d2193929190615766565b6116146123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116116c9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61170c611c9b565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610caa565b6117416123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116117f6576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161170c611c9b565b5f8061184483612e33565b90505f61184f612e46565b6001600160a01b0385165f90815260038201602052604081205491925090611878908490612ee3565b5095945050505050565b61188a6123ba565b6118935f612d61565b565b5f61189e612df6565b825f036118d7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6118e58461139387611839565b90508015611937577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e338686848760405161192495949392919061578d565b60405180910390a1611937853383612ae7565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a8152602001878152602001898152506040516020016119c891906157c4565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016119f593929190615766565b5f604051808303815f87803b158015611a0c575f80fd5b505af1158015611a1e573d5f803e3d5ffd5b5093945050505050610c2360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611a576123ba565b805f03611a9b576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610d21565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611b18576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611b41611c9b565b6001600160a01b038581165f81815260018601602090815260409182902054825195909416855284019190915282018590526060820152608001610e0b565b5f80610e3884611b8f33610e23565b856125e2565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611bc6929190615805565b60405180910390a150565b5f610c23611c067f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052919091169062fdd58e90604401602060405180830381865afa158015611c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8e91906156bb565b610c1e85868660016125ce565b5f610a5a612f8d565b5f80611cb787610c1e87898860016125ce565b9050611cc78187878a8888612fb5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f90615468565b5f33610bae818585612ae7565b604080515f8152602081019091526060908267ffffffffffffffff811115611d5957611d59614dcd565b604051908082528060200260200182016040528015611d8c57816020015b6060815260200190600190039081611d775790505b5091505f5b83811015611e0d57611de830868684818110611daf57611daf615866565b9050602002810190611dc19190615893565b85604051602001611dd4939291906158f4565b60405160208183030381529060405261337b565b838281518110611dfa57611dfa615866565b6020908102919091010152600101611d91565b505092915050565b5f80611e28876111d487898860016125ce565b9050611cc7878787848888612fb5565b5f610c2383610c1e336111cb565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090851115611ec8576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610d21565b5f611edf88611ed9338a8a5f6125ce565b5f6125e2565b9050611f238888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125f892505050565b979650505050505050565b5f80611f38612577565b90505f611f4e87611f4833610bce565b87612b76565b9050610beb81878985886125f8565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00610f0c565b5f80610e3884670de0b6b3a7640000611ed9565b611fa68585858585613416565b611fb08484613479565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a48906080810161205a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b1515905260405161206e9190602001615951565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161209b93929190615766565b5f604051808303815f87803b1580156120b2575f80fd5b505af11580156120c4573d5f803e3d5ffd5b50505050505050505050565b835f03612109576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806121a35750816002015486115b156121b75760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516121ee9594939291906159e1565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533918460405160200161206e9190615a4d565b6122416123ba565b6001600160a01b038116612283576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b610acb81612d61565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061231e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061236a57507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b336123c3611c9b565b6001600160a01b031614611893576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610d21565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a49190615a91565b6124da576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610caa565b6125728383836001613539565b505050565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906125c8906001615aac565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f6125ed8284613661565b610bfa84845f6136a5565b612600612df6565b845f03612639576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03612672576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166126b2576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036126ed576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea338587868686604051612726969594939291906156d2565b60405180910390a161273b85858585856136ba565b6127458484613715565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906127b5903390889087908990889060040161578d565b5f604051808303815f87803b1580156127cc575f80fd5b505af11580156127de573d5f803e3d5ffd5b505050506127ef8585858585613762565b61281860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b80471015612862576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610d21565b61287b828260405180602001604052805f81525061380e565b15612884575050565b3d1561289657612892613823565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806128d2612e46565b60028101549091505f036128e8576125c861382e565b5f6128f75f19600360016138b2565b90505f5b5f198214610c23575f83600201838154811061291957612919615866565b905f5260205f2090600502015f01549050600281036129f6575f6129e685600201858154811061294b5761294b615866565b905f5260205f209060050201600401805461296590615468565b80601f016020809104026020016040519081016040528092919081815260200182805461299190615468565b80156129dc5780601f106129b3576101008083540402835291602001916129dc565b820191905f5260205f20905b8154815290600101906020018083116129bf57829003601f168201915b50505050506139ad565b90506129f283826139c2565b9250505b5f838152600485016020526040902054612a109083615aac565b9150612a1f83600360016138b2565b9250506128fb565b5f610c23838383613a46565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612ae15781811015612ad3576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610d21565b612ae184848484035f613539565b50505050565b6001600160a01b038316612b29576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038216612b6b576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612572838383613a5b565b5f612b818284613661565b610bfa84846001613a46565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611893576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf6613ab0565b612c0881602001518260400151613ab8565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612ce8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d0c9190615abf565b90506001600160a01b0381163014612572576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610d21565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610c23838360016136a5565b612dfe613aca565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610c23565b5f80612e3e83613b25565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00612e9460017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615853565b604051602001612ea691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f8181612eee612e46565b9050845f612eff86600360016138b2565b90505b5f198114612f81579250828115801590612f3f57506002836002018281548110612f2e57612f2e615866565b905f5260205f2090600502015f0154145b15612f6d575f612f5d84600201838154811061294b5761294b615866565b9050612f6983826139c2565b9250505b612f7a81600360016138b2565b9050612f02565b509250505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610f0c565b612fbd612df6565b855f03612ff6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361302f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661306f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166130af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036130eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610d21565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131269796959493929190615ada565b60405180910390a16001600160a01b038416331461329557613149843385612a33565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156131e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132099190615a91565b613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610d21565b61329f8484613bb1565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061330f903390889087908990889060040161578d565b5f604051808303815f87803b158015613326575f80fd5b505af1158015613338573d5f803e3d5ffd5b5050505061334a868686868686613bfe565b61337360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6133888484613d07565b90508080156133a957505f3d11806133a957505f846001600160a01b03163b115b156133be576133b6613d1a565b915050610ab4565b8015613401576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610d21565b3d156128965761340f613823565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612818576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906134c257506001600160a01b0383165f908152600182016020526040902054155b80156134e557506001600160a01b0382165f908152600282016020526040902054155b156125725780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610d21565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661359c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b0384166135de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561281857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161365291815260200190565b60405180910390a35050505050565b81811015612892576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b5f610bfa8484670de0b6b3a764000085613d33565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137089084613d75565b6001909101555050505050565b6001600160a01b038216613757576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6128925f8383613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806137cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b81526020018981526020018781525060405160200161206e9190615b7f565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061387c60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615853565b60405160200161388e91815260200190565b60405160208183030381529060405280519060200120169050600281015491505090565b5f6007831681036138ef576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138f8612e46565b60028101549091505f03613910575f19915050610c23565b5f5f1986146139435781600201868154811061392e5761392e615866565b905f5260205f20906005020160030154613946565b81545b9050600284600281111561395c5761395c615b91565b0361397e576139758261396f8484613d84565b87613dff565b92505050610c23565b600184600281111561399257613992615b91565b036139a257613975828287613e57565b611cc7828287613dff565b5f81806020019051810190610ab491906156bb565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a20576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610d21565b5f613a3d613a37613a31865f613ec4565b85613f1e565b5f613f83565b50949350505050565b5f610bfa84670de0b6b3a76400008585613d33565b613a63613fc4565b613a6d835f61402a565b613a77825f61402a565b613a828383836140ac565b6001600160a01b038316613a99576125728161420c565b6001600160a01b038216612572576125728161424f565b611893614289565b613ac0614289565b61289282826142c7565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611893576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613b7360017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615853565b604051602001613b8591815260200190565b60405160208183030381529060405280519060200120169050825f528060205260405f20915050919050565b6001600160a01b038216613bf3576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612892825f83613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ca49190615b7f565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613cd193929190615766565b5f604051808303815f87803b158015613ce8575f80fd5b505af1158015613cfa573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613d60613d408361432a565b8015613d5b57505f8480613d5657613d56615bbe565b868809115b151590565b613d6b868686614356565b6125d99190615aac565b5f828218828411028218610c23565b5f5b5f198214158015613dc8575042836002018381548110613da857613da8615866565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613df957826002018281548110613de257613de2615866565b905f5260205f209060050201600301549150613d86565b50919050565b5f5b5f198314613e4d575f846002018481548110613e1f57613e1f615866565b905f5260205f209060050201905082815f0154165f14613e425783915050610c23565b600301549250613e01565b505f199392505050565b5f5b5f198314613e4d575f846002018481548110613e7757613e77615866565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ea75750613e4d565b8054831615613eb95783915050610c23565b600301549250613e59565b5f805f613ed18585614406565b9150915080613f16576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613f638686868661450c565b915091505f80613f738484614406565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613fb782828761462b565b9350935050509250929050565b5f613fcd612e46565b60028101549091505f03613fde5750565b5f613ff38260050154600260011760016138b2565b90505f195b5f19821461401657508061400f81600360016138b2565b9150613ff8565b5f1981146125725760058301819055505050565b6001600160a01b03821661403c575050565b5f614047838361477a565b90505f61405484846147a5565b90505f8061406283856147af565b9150915083810361407557505050505050565b6140808686836147c6565b828214614092576140928686846147f4565b6140a08686868487876147fe565b61337384828585614859565b6140b68383613479565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016141667fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016141d493929190615766565b5f604051808303815f87803b1580156141eb575f80fd5b505af11580156141fd573d5f803e3d5ffd5b50505050612ae1848484614865565b5f614215612e46565b6002810154909150156128925760058101545f90815260048201602052604081208054849290614246908490615aac565b90915550505050565b5f614258612e46565b6002810154909150156128925760058101545f90815260048201602052604081208054849290614246908490615853565b614291614870565b611893576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142cf614289565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361431b8482615c2f565b5060048101612ae18382615c2f565b5f600282600381111561433f5761433f615b91565b6143499190615d09565b60ff166001149050919050565b5f805f614363868661488e565b91509150815f036143875783818161437d5761437d615bbe565b0492505050610c23565b81841161439e5761439e60038515026011186148aa565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b831483838261446a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561444a57620186a0860595506005850194505b8586601b0b1461446557600a8605955084600101945061444a565b614480565b855f0361448057505f925060019150612f869050565b848560030b146144dc575f8512156144a057505f9250829150612f869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015614524575f92505f9150614621565b61452e8487615d2a565b91505f61453a886148bb565b90505f614546876148bb565b90505f614553838361488e565b5090505f6f0785ee10d5da46d900f436a000000000821115614588576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156145a957670de0b6b3a7640000820491506012015b633b9aca008211156145c257633b9aca00820491506009015b6127108211156145d757612710820491506004015b81156145eb57600a820491506001016145d7565b6145f58187615d2a565b95506146178b8a614611878761460c87600a615e29565b61491c565b896149f7565b9097509550505050505b5094509492505050565b5f805f851215614671576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b845f0361468357505f90506001614772565b8460ff84168501858112156146ce576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610d21565b5f805f831215614738577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561470f575f809550955050505050614772565b825f03600a0a915081848161472657614726615bbe565b04955050840290911491506147729050565b5f8313156147675761474b83600a615e29565b91506147578285615e34565b9550600194506147729350505050565b509193506001925050505b935093915050565b5f614783612e46565b6001600160a01b03939093165f90815260039093016020525050604090205490565b5f610c2383612e33565b5f806147bb8484612ee3565b915091509250929050565b806147cf612e46565b6001600160a01b039094165f9081526003949094016020526040909320929092555050565b6125728382614b03565b6040805185815260208101859052908101839052606081018290526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a2505050505050565b612ae184838584614b15565b612572838383614b72565b5f614879612b8d565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614918577f8000000000000000000000000000000000000000000000000000000000000000820361491257507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614929868661488e565b91509150815f036149435783818161437d5761437d615bbe565b83821061498d576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610d21565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ac1577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614aae57614a567f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615aac565b8403614a8657507f8000000000000000000000000000000000000000000000000000000000000000905081614afa565b614a91600a85615e4b565b614a9a90615e5e565b614aa5846001615d2a565b91509150614afa565b614ab784615e5e565b8391509150614afa565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614af457614a9a600a85615e4b565b50829050815b94509492505050565b5f614b0d83613b25565b919091555050565b5f614b1e612e46565b905083816004015f8781526020019081526020015f205f828254614b429190615853565b90915550505f83815260048201602052604081208054849290614b66908490615aac565b90915550505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614bbf5781816002015f828254614bb49190615aac565b90915550614c489050565b6001600160a01b0384165f9081526020829052604090205482811015614c2a576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610d21565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614c66576002810180548390039055614c84565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614cc991815260200190565b60405180910390a350505050565b5f60208284031215614ce7575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c23575f80fd5b6001600160a01b0381168114610acb575f80fd5b5f60208284031215614d3a575f80fd5b8135610c2381614d16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c236020830184614d45565b5f8060408385031215614db4575f80fd5b8235614dbf81614d16565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614e1d57614e1d614dcd565b60405290565b6040516080810167ffffffffffffffff81118282101715614e1d57614e1d614dcd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614e8d57614e8d614dcd565b604052919050565b5f67ffffffffffffffff821115614eae57614eae614dcd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614ee9575f80fd5b8135614efc614ef782614e95565b614e46565b818152846020838601011115614f10575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614f3f575f80fd5b843593506020850135614f5181614d16565b925060408501359150606085013567ffffffffffffffff811115614f73575f80fd5b614f7f87828801614eda565b91505092959194509250565b5f8060408385031215614f9c575f80fd5b50508035926020909101359150565b5f60208284031215614fbb575f80fd5b5035919050565b5f805f60608486031215614fd4575f80fd5b8335614fdf81614d16565b92506020840135614fef81614d16565b929592945050506040919091013590565b5f60208284031215615010575f80fd5b813567ffffffffffffffff811115615026575f80fd5b610bfa84828501614eda565b5f805f8060808587031215615045575f80fd5b843561505081614d16565b93506020850135925060408501359150606085013567ffffffffffffffff811115614f73575f80fd5b5f805f6060848603121561508b575f80fd5b833561509681614d16565b925060208401359150604084013567ffffffffffffffff8111156150b8575f80fd5b6150c486828701614eda565b9150509250925092565b5f805f805f60a086880312156150e2575f80fd5b8535945060208601356150f481614d16565b9350604086013561510481614d16565b925060608601359150608086013567ffffffffffffffff811115615126575f80fd5b61513288828901614eda565b9150509295509295909350565b5f8060208385031215615150575f80fd5b823567ffffffffffffffff80821115615167575f80fd5b818501915085601f83011261517a575f80fd5b813581811115615188575f80fd5b8660208260051b850101111561519c575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015615221577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261520f858351614d45565b945092850192908501906001016151d5565b5092979650505050505050565b5f8083601f84011261523e575f80fd5b50813567ffffffffffffffff811115615255575f80fd5b602083019150836020828501011115612f86575f80fd5b5f805f805f60808688031215615280575f80fd5b85359450602086013561529281614d16565b935060408601359250606086013567ffffffffffffffff8111156152b4575f80fd5b6152c08882890161522e565b969995985093965092949392505050565b5f80604083850312156152e2575f80fd5b82356152ed81614d16565b915060208301356152fd81614d16565b809150509250929050565b5f82601f830112615317575f80fd5b8135602067ffffffffffffffff82111561533357615333614dcd565b8160051b615342828201614e46565b928352848101820192828101908785111561535b575f80fd5b83870192505b84831015611f2357823582529183019190830190615361565b5f805f805f60a0868803121561538e575f80fd5b853561539981614d16565b945060208601356153a981614d16565b935060408601356153b981614d16565b9250606086013567ffffffffffffffff808211156153d5575f80fd5b6153e189838a01615308565b935060808801359150808211156153f6575f80fd5b5061513288828901615308565b8015158114610acb575f80fd5b5f805f8060608587031215615423575f80fd5b84359350602085013561543581615403565b9250604085013567ffffffffffffffff811115615450575f80fd5b61545c8782880161522e565b95989497509550505050565b600181811c9082168061547c57607f821691505b602082108103613df9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156154c3575f80fd5b815160ff81168114610c23575f80fd5b5f82601f8301126154e2575f80fd5b81516154f0614ef782614e95565b818152846020838601011115615504575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615530575f80fd5b815167ffffffffffffffff80821115615547575f80fd5b908301906040828603121561555a575f80fd5b615562614dfa565b825161556d81614d16565b8152602083015182811115615580575f80fd5b929092019160808387031215615594575f80fd5b61559c614e23565b83516155a781614d16565b81526020840151838111156155ba575f80fd5b6155c6888287016154d3565b6020830152506040840151838111156155dd575f80fd5b6155e9888287016154d3565b604083015250606084015193506155ff84614d16565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615664610100860182614d45565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c087015261569f8282614d45565b9150508260608301511660e08601528093505050509392505050565b5f602082840312156156cb575f80fd5b5051919050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261570f60c0830184614d45565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610bfa60c0840182614d45565b6001600160a01b0384168152826020820152606060408201525f6125d96060830184614d45565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611f2360a0830184614d45565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610bfa60a0840182614d45565b6001600160a01b0383168152604060208201525f610bfa6040830184614d45565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615826565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158c6575f80fd5b83018035915067ffffffffffffffff8211156158e0575f80fd5b602001915036819003821315612f86575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b838110156159465781518752958201959082019060010161592a565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a0606084015261598d60c0840182615917565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160808501526159c88282615917565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610bfa60c0840182614d45565b5f60208284031215615aa1575f80fd5b8151610c2381615403565b80820180821115610ab457610ab4615826565b5f60208284031215615acf575f80fd5b8151610c2381614d16565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615b1f60e0830184614d45565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610bfa60c0850182614d45565b602081525f610c236020830184615b2c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f82111561257257805f5260205f20601f840160051c81016020851015615c105750805b601f840160051c820191505b81811015612818575f8155600101615c1c565b815167ffffffffffffffff811115615c4957615c49614dcd565b615c5d81615c578454615468565b84615beb565b602080601f831160018114615c90575f8415615c795750858301515b5f19600386901b1c1916600185901b178555613373565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615cdc57888601518255948401946001909101908401615cbd565b5085821015615cf957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615d1b57615d1b615bbe565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611e0d57611e0d615826565b600181815b80851115615d8357815f1904821115615d6957615d69615826565b80851615615d7657918102915b93841c9390800290615d4e565b509250929050565b5f82615d9957506001610ab4565b81615da557505f610ab4565b8160018114615dbb5760028114615dc557615de1565b6001915050610ab4565b60ff841115615dd657615dd6615826565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615e04575081810a610ab4565b615e0e8383615d49565b805f1904821115615e2157615e21615826565b029392505050565b5f610c238383615d8b565b8082028115828204841417610ab457610ab4615826565b5f82615e5957615e59615bbe565b500490565b5f7f800000000000000000000000000000000000000000000000000000000000000082036149125761491261582656"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73662d3076e827f5b138a3e96dd99f7ed4895becaf365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614c55565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614ca8565b610aba565b3480156103f3575f80fd5b506103fc610ace565b6040516103919190614d0f565b348015610414575f80fd5b506103b9610423366004614d21565b610ba1565b610387610436366004614eaa565b610bb8565b348015610446575f80fd5b50610387610c02565b34801561045a575f80fd5b50610387610469366004614f09565b610c0b565b348015610479575f80fd5b50610371610488366004614f29565b610c2a565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da366004614f40565b610cb6565b3480156104ea575f80fd5b506103716104f9366004614d21565b610cd9565b61038761050c366004614f09565b610e18565b34801561051c575f80fd5b50610525610e43565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b610ee8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614ca8565b505f1990565b34801561058e575f80fd5b5061038761059d366004614f7e565b610f1c565b3480156105ad575f80fd5b506103876105bc366004614f09565b6111c1565b3480156105cc575f80fd5b506103876105db366004614d21565b6111d9565b3480156105eb575f80fd5b506103876105fa366004614fb0565b611293565b34801561060a575f80fd5b50610371610619366004614ff7565b6115d4565b348015610629575f80fd5b50610371610638366004614ca8565b61160c565b348015610648575f80fd5b50610387610657366004614ca8565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614ca8565b611739565b3480156106ba575f80fd5b506103876106c9366004614ca8565b611839565b3480156106d9575f80fd5b50610371611882565b3480156106ed575f80fd5b506103876106fc366004614ff7565b611895565b34801561070c575f80fd5b5061037161071b366004614d21565b611a4f565b61038761072e366004614f09565b611b80565b34801561073e575f80fd5b5061037161074d366004614f7e565b611b95565b34801561075d575f80fd5b5061038761076c366004614d21565b611bd1565b34801561077c575f80fd5b5061054b611c9b565b348015610790575f80fd5b5061038761079f36600461504c565b611ca4565b3480156107af575f80fd5b506103fc611cd1565b3480156107c3575f80fd5b506103b96107d2366004614d21565b611d22565b3480156107e2575f80fd5b506107f66107f13660046150bd565b611d2f565b604051610391919061512c565b34801561080e575f80fd5b5061038761081d36600461504c565b611e15565b34801561082d575f80fd5b5061038761083c366004614ca8565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004614f09565b611e38565b34801561089f575f80fd5b506103876108ae3660046151ea565b611e46565b6103876108c1366004614eaa565b611f2e565b3480156108d1575f80fd5b5061054b611f5d565b6103876108e8366004614f09565b611f85565b3480156108f8575f80fd5b5061038761090736600461524f565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a63660046152f8565b611f99565b3480156109b6575f80fd5b506103716109c536600461538e565b6120d0565b3480156109d5575f80fd5b506103716109e4366004614ca8565b612239565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610c02565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab48261228c565b92915050565b610ac26123ba565b610acb81612405565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f906153e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b906153e6565b8015610b965780601f10610b6d57610100808354040283529160200191610b96565b820191905f5260205f20905b815481529060010190602001808311610b7957829003601f168201915b505050505091505090565b5f33610bae818585612565565b5060019392505050565b5f80610bc2612577565b90505f610bdc87610bd6335b89865f6125ce565b876125e2565b9050610beb87878385886125f8565b610bf6335b4761281f565b9150505b949350505050565b5f610a5a6128c8565b5f610c2383670de0b6b3a7640000612a27565b612a27565b9392505050565b610c326123ba565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610c60578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610c89611c9b565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610cc3858285612a33565b610cce858585612ae7565b506001949350505050565b610ce16123ba565b805f03610d2a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610da7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610dd0611c9b565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f80610e3884610e32335b33610e2c612577565b5f6125ce565b85612b76565b9050610c2333610bf0565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b80610e80576012610ee0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee09190615431565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80610f26612b8d565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610f525750825b90505f8267ffffffffffffffff166001148015610f6e5750303b155b905081158015610f7c575080155b15610fb3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110145784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61101c612bb5565b5f87806020019051810190611031919061549e565b90506110408160200151612bee565b6020810151516001600160a01b031615611086576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166110c7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d030612405565b80516110db90612d61565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161112a929190615595565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156111b75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610c23836111d4335b338660016125ce565b612de9565b5f61120b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561126f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190615639565b5f61129c612df6565b825f036112d5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6113998461130b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561136f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113939190615639565b90612e24565b905080156114b6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516113da96959493929190615650565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561149f575f80fd5b505af11580156114b1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161154d9190615699565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161157a939291906156e4565b5f604051808303815f87803b158015611591575f80fd5b505af11580156115a3573d5f803e3d5ffd5b5093945050505050610bfa60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610d21939291906156e4565b6116146123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116116c9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61170c611c9b565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610caa565b6117416123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116117f6576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161170c611c9b565b5f8061184483612e33565b90505f61184f612e46565b6001600160a01b0385165f90815260038201602052604081205491925090611878908490612ee3565b5095945050505050565b61188a6123ba565b6118935f612d61565b565b5f61189e612df6565b825f036118d7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6118e58461139387611839565b90508015611937577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e338686848760405161192495949392919061570b565b60405180910390a1611937853383612ae7565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a8152602001878152602001898152506040516020016119c89190615742565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016119f5939291906156e4565b5f604051808303815f87803b158015611a0c575f80fd5b505af1158015611a1e573d5f803e3d5ffd5b5093945050505050610c2360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611a576123ba565b805f03611a9b576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610d21565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611b18576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611b41611c9b565b6001600160a01b038581165f81815260018601602090815260409182902054825195909416855284019190915282018590526060820152608001610e0b565b5f80610e3884611b8f33610e23565b856125e2565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611bc6929190615783565b60405180910390a150565b5f610c23611c067f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052919091169062fdd58e90604401602060405180830381865afa158015611c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8e9190615639565b610c1e85868660016125ce565b5f610a5a612f8d565b5f80611cb787610c1e87898860016125ce565b9050611cc78187878a8888612fb5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f906153e6565b5f33610bae818585612ae7565b604080515f8152602081019091526060908267ffffffffffffffff811115611d5957611d59614d4b565b604051908082528060200260200182016040528015611d8c57816020015b6060815260200190600190039081611d775790505b5091505f5b83811015611e0d57611de830868684818110611daf57611daf6157e4565b9050602002810190611dc19190615811565b85604051602001611dd493929190615872565b60405160208183030381529060405261337b565b838281518110611dfa57611dfa6157e4565b6020908102919091010152600101611d91565b505092915050565b5f80611e28876111d487898860016125ce565b9050611cc7878787848888612fb5565b5f610c2383610c1e336111cb565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090851115611ec8576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610d21565b5f611edf88611ed9338a8a5f6125ce565b5f6125e2565b9050611f238888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125f892505050565b979650505050505050565b5f80611f38612577565b90505f611f4e87611f4833610bce565b87612b76565b9050610beb81878985886125f8565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00610f0c565b5f80610e3884670de0b6b3a7640000611ed9565b611fa68585858585613416565b611fb08484613479565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a48906080810161205a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b1515905260405161206e91906020016158cf565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161209b939291906156e4565b5f604051808303815f87803b1580156120b2575f80fd5b505af11580156120c4573d5f803e3d5ffd5b50505050505050505050565b835f03612109576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806121a35750816002015486115b156121b75760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516121ee95949392919061595f565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533918460405160200161206e91906159cb565b6122416123ba565b6001600160a01b038116612283576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b610acb81612d61565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061231e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061236a57507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b336123c3611c9b565b6001600160a01b031614611893576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610d21565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a49190615a0f565b6124da576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610caa565b6125728383836001613539565b505050565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906125c8906001615a2a565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f6125ed8284613661565b610bfa84845f6136a5565b612600612df6565b845f03612639576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03612672576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166126b2576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036126ed576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea33858786868660405161272696959493929190615650565b60405180910390a161273b85858585856136ba565b6127458484613715565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906127b5903390889087908990889060040161570b565b5f604051808303815f87803b1580156127cc575f80fd5b505af11580156127de573d5f803e3d5ffd5b505050506127ef8585858585613762565b61281860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b80471015612862576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610d21565b61287b828260405180602001604052805f81525061380e565b15612884575050565b3d1561289657612892613823565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806128d2612e46565b60028101549091505f036128e8576125c861382e565b5f6128f75f19600360016138b2565b90505f5b5f198214610c23575f836002018381548110612919576129196157e4565b905f5260205f2090600502015f01549050600281036129f6575f6129e685600201858154811061294b5761294b6157e4565b905f5260205f2090600502016004018054612965906153e6565b80601f0160208091040260200160405190810160405280929190818152602001828054612991906153e6565b80156129dc5780601f106129b3576101008083540402835291602001916129dc565b820191905f5260205f20905b8154815290600101906020018083116129bf57829003601f168201915b50505050506139ad565b90506129f283826139c2565b9250505b5f838152600485016020526040902054612a109083615a2a565b9150612a1f83600360016138b2565b9250506128fb565b5f610c23838383613a46565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612ae15781811015612ad3576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610d21565b612ae184848484035f613539565b50505050565b6001600160a01b038316612b29576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038216612b6b576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612572838383613a5b565b5f612b818284613661565b610bfa84846001613a46565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611893576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf6613aae565b612c0881602001518260400151613ab6565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612ce8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d0c9190615a3d565b90506001600160a01b0381163014612572576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610d21565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610c23838360016136a5565b612dfe613ac8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610c23565b5f80612e3e83613b23565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00612e9460017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e716157d1565b604051602001612ea691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f8181612eee612e46565b9050845f612eff86600360016138b2565b90505b5f198114612f81579250828115801590612f3f57506002836002018281548110612f2e57612f2e6157e4565b905f5260205f2090600502015f0154145b15612f6d575f612f5d84600201838154811061294b5761294b6157e4565b9050612f6983826139c2565b9250505b612f7a81600360016138b2565b9050612f02565b509250505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610f0c565b612fbd612df6565b855f03612ff6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361302f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661306f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166130af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036130eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610d21565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131269796959493929190615a58565b60405180910390a16001600160a01b038416331461329557613149843385612a33565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156131e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132099190615a0f565b613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610d21565b61329f8484613baf565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061330f903390889087908990889060040161570b565b5f604051808303815f87803b158015613326575f80fd5b505af1158015613338573d5f803e3d5ffd5b5050505061334a868686868686613bfc565b61337360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6133888484613d05565b90508080156133a957505f3d11806133a957505f846001600160a01b03163b115b156133be576133b6613d18565b915050610ab4565b8015613401576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610d21565b3d156128965761340f613823565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612818576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906134c257506001600160a01b0383165f908152600182016020526040902054155b80156134e557506001600160a01b0382165f908152600282016020526040902054155b156125725780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610d21565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661359c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b0384166135de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561281857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161365291815260200190565b60405180910390a35050505050565b81811015612892576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b5f610bfa8484670de0b6b3a764000085613d31565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137089084613d73565b6001909101555050505050565b6001600160a01b038216613757576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6128925f8383613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806137cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b81526020018981526020018781525060405160200161206e9190615afd565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061387c60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff6157d1565b60405160200161388e91815260200190565b60405160208183030381529060405280519060200120169050600281015491505090565b5f6007831681036138ef576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138f8612e46565b60028101549091505f03613910575f19915050610c23565b5f5f1986146139435781600201868154811061392e5761392e6157e4565b905f5260205f20906005020160030154613946565b81545b9050600284600281111561395c5761395c615b0f565b0361397e576139758261396f8484613d82565b87613dfd565b92505050610c23565b600184600281111561399257613992615b0f565b036139a257613975828287613e55565b611cc7828287613dfd565b5f81806020019051810190610ab49190615639565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a20576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610d21565b5f613a3d613a37613a31865f613ec2565b85613f1c565b5f613f81565b50949350505050565b5f610bfa84670de0b6b3a76400008585613d31565b613a63613fc2565b613a6c83614028565b613a7582614028565b613a80838383614115565b6001600160a01b038316613a975761257281614275565b6001600160a01b03821661257257612572816142b8565b6118936142f2565b613abe6142f2565b6128928282614330565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611893576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613b7160017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff6157d1565b604051602001613b8391815260200190565b60405160208183030381529060405280519060200120169050825f528060205260405f20915050919050565b6001600160a01b038216613bf1576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612892825f83613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ca29190615afd565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613ccf939291906156e4565b5f604051808303815f87803b158015613ce6575f80fd5b505af1158015613cf8573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613d5e613d3e83614393565b8015613d5957505f8480613d5457613d54615b3c565b868809115b151590565b613d698686866143bf565b6125d99190615a2a565b5f828218828411028218610c23565b5f5b5f198214158015613dc6575042836002018381548110613da657613da66157e4565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613df757826002018281548110613de057613de06157e4565b905f5260205f209060050201600301549150613d84565b50919050565b5f5b5f198314613e4b575f846002018481548110613e1d57613e1d6157e4565b905f5260205f209060050201905082815f0154165f14613e405783915050610c23565b600301549250613dff565b505f199392505050565b5f5b5f198314613e4b575f846002018481548110613e7557613e756157e4565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ea55750613e4b565b8054831615613eb75783915050610c23565b600301549250613e57565b5f805f613ecf858561446f565b9150915080613f14576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613f6186868686614575565b915091505f80613f71848461446f565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613fb5828287614694565b9350935050509250929050565b5f613fcb612e46565b60028101549091505f03613fdc5750565b5f613ff18260050154600260011760016138b2565b90505f195b5f19821461401457508061400d81600360016138b2565b9150613ff6565b5f1981146125725760058301819055505050565b6001600160a01b0381166140395750565b5f614042612e46565b6001600160a01b0383165f90815260038201602052604081205491925061406884612e33565b90505f806140768385612ee3565b9150915083810361408957505050505050565b6001600160a01b0386165f90815260038601602052604090208190558183146140b6576140b686836147e3565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a2613373848483856147f5565b61411f8383613479565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016141cf7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b815260040161423d939291906156e4565b5f604051808303815f87803b158015614254575f80fd5b505af1158015614266573d5f803e3d5ffd5b50505050612ae1848484614852565b5f61427e612e46565b6002810154909150156128925760058101545f908152600482016020526040812080548492906142af908490615a2a565b90915550505050565b5f6142c1612e46565b6002810154909150156128925760058101545f908152600482016020526040812080548492906142af9084906157d1565b6142fa61485d565b611893576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143386142f2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036143848482615bad565b5060048101612ae18382615bad565b5f60028260038111156143a8576143a8615b0f565b6143b29190615c87565b60ff166001149050919050565b5f805f6143cc868661487b565b91509150815f036143f0578381816143e6576143e6615b3c565b0492505050610c23565b818411614407576144076003851502601118614897565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b83148383826144d3577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156144b357620186a0860595506005850194505b8586601b0b146144ce57600a860595508460010194506144b3565b6144e9565b855f036144e957505f925060019150612f869050565b848560030b14614545575f85121561450957505f9250829150612f869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561458d575f92505f915061468a565b6145978487615ca8565b91505f6145a3886148a8565b90505f6145af876148a8565b90505f6145bc838361487b565b5090505f6f0785ee10d5da46d900f436a0000000008211156145f1576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561461257670de0b6b3a7640000820491506012015b633b9aca0082111561462b57633b9aca00820491506009015b61271082111561464057612710820491506004015b811561465457600a82049150600101614640565b61465e8187615ca8565b95506146808b8a61467a878761467587600a615da7565b614909565b896149e4565b9097509550505050505b5094509492505050565b5f805f8512156146da576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b845f036146ec57505f905060016147db565b8460ff8416850185811215614737576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610d21565b5f805f8312156147a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614778575f8095509550505050506147db565b825f03600a0a915081848161478f5761478f615b3c565b04955050840290911491506147db9050565b5f8313156147d0576147b483600a615da7565b91506147c08285615db2565b9550600194506147db9350505050565b509193506001925050505b935093915050565b5f6147ed83613b23565b919091555050565b5f6147fe612e46565b905083816004015f8781526020019081526020015f205f82825461482291906157d1565b90915550505f83815260048201602052604081208054849290614846908490615a2a565b90915550505050505050565b612572838383614af0565b5f614866612b8d565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614905577f800000000000000000000000000000000000000000000000000000000000000082036148ff57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614916868661487b565b91509150815f03614930578381816143e6576143e6615b3c565b83821061497a576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610d21565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614aae577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614a9b57614a437f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615a2a565b8403614a7357507f8000000000000000000000000000000000000000000000000000000000000000905081614ae7565b614a7e600a85615dc9565b614a8790615ddc565b614a92846001615ca8565b91509150614ae7565b614aa484615ddc565b8391509150614ae7565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614ae157614a87600a85615dc9565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614b3d5781816002015f828254614b329190615a2a565b90915550614bc69050565b6001600160a01b0384165f9081526020829052604090205482811015614ba8576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610d21565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614be4576002810180548390039055614c02565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614c4791815260200190565b60405180910390a350505050565b5f60208284031215614c65575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c23575f80fd5b6001600160a01b0381168114610acb575f80fd5b5f60208284031215614cb8575f80fd5b8135610c2381614c94565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c236020830184614cc3565b5f8060408385031215614d32575f80fd5b8235614d3d81614c94565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614d9b57614d9b614d4b565b60405290565b6040516080810167ffffffffffffffff81118282101715614d9b57614d9b614d4b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614e0b57614e0b614d4b565b604052919050565b5f67ffffffffffffffff821115614e2c57614e2c614d4b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614e67575f80fd5b8135614e7a614e7582614e13565b614dc4565b818152846020838601011115614e8e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614ebd575f80fd5b843593506020850135614ecf81614c94565b925060408501359150606085013567ffffffffffffffff811115614ef1575f80fd5b614efd87828801614e58565b91505092959194509250565b5f8060408385031215614f1a575f80fd5b50508035926020909101359150565b5f60208284031215614f39575f80fd5b5035919050565b5f805f60608486031215614f52575f80fd5b8335614f5d81614c94565b92506020840135614f6d81614c94565b929592945050506040919091013590565b5f60208284031215614f8e575f80fd5b813567ffffffffffffffff811115614fa4575f80fd5b610bfa84828501614e58565b5f805f8060808587031215614fc3575f80fd5b8435614fce81614c94565b93506020850135925060408501359150606085013567ffffffffffffffff811115614ef1575f80fd5b5f805f60608486031215615009575f80fd5b833561501481614c94565b925060208401359150604084013567ffffffffffffffff811115615036575f80fd5b61504286828701614e58565b9150509250925092565b5f805f805f60a08688031215615060575f80fd5b85359450602086013561507281614c94565b9350604086013561508281614c94565b925060608601359150608086013567ffffffffffffffff8111156150a4575f80fd5b6150b088828901614e58565b9150509295509295909350565b5f80602083850312156150ce575f80fd5b823567ffffffffffffffff808211156150e5575f80fd5b818501915085601f8301126150f8575f80fd5b813581811115615106575f80fd5b8660208260051b850101111561511a575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561519f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261518d858351614cc3565b94509285019290850190600101615153565b5092979650505050505050565b5f8083601f8401126151bc575f80fd5b50813567ffffffffffffffff8111156151d3575f80fd5b602083019150836020828501011115612f86575f80fd5b5f805f805f608086880312156151fe575f80fd5b85359450602086013561521081614c94565b935060408601359250606086013567ffffffffffffffff811115615232575f80fd5b61523e888289016151ac565b969995985093965092949392505050565b5f8060408385031215615260575f80fd5b823561526b81614c94565b9150602083013561527b81614c94565b809150509250929050565b5f82601f830112615295575f80fd5b8135602067ffffffffffffffff8211156152b1576152b1614d4b565b8160051b6152c0828201614dc4565b92835284810182019282810190878511156152d9575f80fd5b83870192505b84831015611f23578235825291830191908301906152df565b5f805f805f60a0868803121561530c575f80fd5b853561531781614c94565b9450602086013561532781614c94565b9350604086013561533781614c94565b9250606086013567ffffffffffffffff80821115615353575f80fd5b61535f89838a01615286565b93506080880135915080821115615374575f80fd5b506150b088828901615286565b8015158114610acb575f80fd5b5f805f80606085870312156153a1575f80fd5b8435935060208501356153b381615381565b9250604085013567ffffffffffffffff8111156153ce575f80fd5b6153da878288016151ac565b95989497509550505050565b600181811c908216806153fa57607f821691505b602082108103613df7577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60208284031215615441575f80fd5b815160ff81168114610c23575f80fd5b5f82601f830112615460575f80fd5b815161546e614e7582614e13565b818152846020838601011115615482575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f602082840312156154ae575f80fd5b815167ffffffffffffffff808211156154c5575f80fd5b90830190604082860312156154d8575f80fd5b6154e0614d78565b82516154eb81614c94565b81526020830151828111156154fe575f80fd5b929092019160808387031215615512575f80fd5b61551a614da1565b835161552581614c94565b8152602084015183811115615538575f80fd5b61554488828701615451565b60208301525060408401518381111561555b575f80fd5b61556788828701615451565b6040830152506060840151935061557d84614c94565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a08601526155e2610100860182614cc3565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c087015261561d8282614cc3565b9150508260608301511660e08601528093505050509392505050565b5f60208284031215615649575f80fd5b5051919050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261568d60c0830184614cc3565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610bfa60c0840182614cc3565b6001600160a01b0384168152826020820152606060408201525f6125d96060830184614cc3565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611f2360a0830184614cc3565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610bfa60a0840182614cc3565b6001600160a01b0383168152604060208201525f610bfa6040830184614cc3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab46157a4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615844575f80fd5b83018035915067ffffffffffffffff82111561585e575f80fd5b602001915036819003821315612f86575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b838110156158c4578151875295820195908201906001016158a8565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a0606084015261590b60c0840182615895565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160808501526159468282615895565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610bfa60c0840182614cc3565b5f60208284031215615a1f575f80fd5b8151610c2381615381565b80820180821115610ab457610ab46157a4565b5f60208284031215615a4d575f80fd5b8151610c2381614c94565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615a9d60e0830184614cc3565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610bfa60c0850182614cc3565b602081525f610c236020830184615aaa565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f82111561257257805f5260205f20601f840160051c81016020851015615b8e5750805b601f840160051c820191505b81811015612818575f8155600101615b9a565b815167ffffffffffffffff811115615bc757615bc7614d4b565b615bdb81615bd584546153e6565b84615b69565b602080601f831160018114615c0e575f8415615bf75750858301515b5f19600386901b1c1916600185901b178555613373565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615c5a57888601518255948401946001909101908401615c3b565b5085821015615c7757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615c9957615c99615b3c565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611e0d57611e0d6157a4565b600181815b80851115615d0157815f1904821115615ce757615ce76157a4565b80851615615cf457918102915b93841c9390800290615ccc565b509250929050565b5f82615d1757506001610ab4565b81615d2357505f610ab4565b8160018114615d395760028114615d4357615d5f565b6001915050610ab4565b60ff841115615d5457615d546157a4565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615d82575081810a610ab4565b615d8c8383615cc7565b805f1904821115615d9f57615d9f6157a4565b029392505050565b5f610c238383615d09565b8082028115828204841417610ab457610ab46157a4565b5f82615dd757615dd7615b3c565b500490565b5f7f800000000000000000000000000000000000000000000000000000000000000082036148ff576148ff6157a456"; + hex"608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73662d3076e827f5b138a3e96dd99f7ed4895becaf365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614cd7565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614d2a565b610aba565b3480156103f3575f80fd5b506103fc610ace565b6040516103919190614d91565b348015610414575f80fd5b506103b9610423366004614da3565b610ba1565b610387610436366004614f2c565b610bb8565b348015610446575f80fd5b50610387610c02565b34801561045a575f80fd5b50610387610469366004614f8b565b610c0b565b348015610479575f80fd5b50610371610488366004614fab565b610c2a565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da366004614fc2565b610cb6565b3480156104ea575f80fd5b506103716104f9366004614da3565b610cd9565b61038761050c366004614f8b565b610e18565b34801561051c575f80fd5b50610525610e43565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b610ee8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614d2a565b505f1990565b34801561058e575f80fd5b5061038761059d366004615000565b610f1c565b3480156105ad575f80fd5b506103876105bc366004614f8b565b6111c1565b3480156105cc575f80fd5b506103876105db366004614da3565b6111d9565b3480156105eb575f80fd5b506103876105fa366004615032565b611293565b34801561060a575f80fd5b50610371610619366004615079565b6115d4565b348015610629575f80fd5b50610371610638366004614d2a565b61160c565b348015610648575f80fd5b50610387610657366004614d2a565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614d2a565b611739565b3480156106ba575f80fd5b506103876106c9366004614d2a565b611839565b3480156106d9575f80fd5b50610371611882565b3480156106ed575f80fd5b506103876106fc366004615079565b611895565b34801561070c575f80fd5b5061037161071b366004614da3565b611a4f565b61038761072e366004614f8b565b611b80565b34801561073e575f80fd5b5061037161074d366004615000565b611b95565b34801561075d575f80fd5b5061038761076c366004614da3565b611bd1565b34801561077c575f80fd5b5061054b611c9b565b348015610790575f80fd5b5061038761079f3660046150ce565b611ca4565b3480156107af575f80fd5b506103fc611cd1565b3480156107c3575f80fd5b506103b96107d2366004614da3565b611d22565b3480156107e2575f80fd5b506107f66107f136600461513f565b611d2f565b60405161039191906151ae565b34801561080e575f80fd5b5061038761081d3660046150ce565b611e15565b34801561082d575f80fd5b5061038761083c366004614d2a565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004614f8b565b611e38565b34801561089f575f80fd5b506103876108ae36600461526c565b611e46565b6103876108c1366004614f2c565b611f2e565b3480156108d1575f80fd5b5061054b611f5d565b6103876108e8366004614f8b565b611f85565b3480156108f8575f80fd5b506103876109073660046152d1565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a636600461537a565b611f99565b3480156109b6575f80fd5b506103716109c5366004615410565b6120d0565b3480156109d5575f80fd5b506103716109e4366004614d2a565b612239565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610c02565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab48261228c565b92915050565b610ac26123ba565b610acb81612405565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f90615468565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90615468565b8015610b965780601f10610b6d57610100808354040283529160200191610b96565b820191905f5260205f20905b815481529060010190602001808311610b7957829003601f168201915b505050505091505090565b5f33610bae818585612565565b5060019392505050565b5f80610bc2612577565b90505f610bdc87610bd6335b89865f6125ce565b876125e2565b9050610beb87878385886125f8565b610bf6335b4761281f565b9150505b949350505050565b5f610a5a6128c8565b5f610c2383670de0b6b3a7640000612a27565b612a27565b9392505050565b610c326123ba565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610c60578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610c89611c9b565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610cc3858285612a33565b610cce858585612ae7565b506001949350505050565b610ce16123ba565b805f03610d2a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024015b60405180910390fd5b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610da7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610dd0611c9b565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f80610e3884610e32335b33610e2c612577565b5f6125ce565b85612b76565b9050610c2333610bf0565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b80610e80576012610ee0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee091906154b3565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80610f26612b8d565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f81158015610f525750825b90505f8267ffffffffffffffff166001148015610f6e5750303b155b905081158015610f7c575080155b15610fb3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110145784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61101c612bb5565b5f878060200190518101906110319190615520565b90506110408160200151612bee565b6020810151516001600160a01b031615611086576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166110c7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110d030612405565b80516110db90612d61565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161112a929190615617565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156111b75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610c23836111d4335b338660016125ce565b612de9565b5f61120b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561126f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2391906156bb565b5f61129c612df6565b825f036112d5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6113998461130b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561136f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139391906156bb565b90612e24565b905080156114b6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516113da969594939291906156d2565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b15801561149f575f80fd5b505af11580156114b1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161154d919061571b565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161157a93929190615766565b5f604051808303815f87803b158015611591575f80fd5b505af11580156115a3573d5f803e3d5ffd5b5093945050505050610bfa60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610d2193929190615766565b6116146123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116116c9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61170c611c9b565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610caa565b6117416123ba565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116117f6576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610d21565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161170c611c9b565b5f8061184483612e33565b90505f61184f612e46565b6001600160a01b0385165f90815260038201602052604081205491925090611878908490612ee3565b5095945050505050565b61188a6123ba565b6118935f612d61565b565b5f61189e612df6565b825f036118d7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6118e58461139387611839565b90508015611937577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e338686848760405161192495949392919061578d565b60405180910390a1611937853383612ae7565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a8152602001878152602001898152506040516020016119c891906157c4565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016119f593929190615766565b5f604051808303815f87803b158015611a0c575f80fd5b505af1158015611a1e573d5f803e3d5ffd5b5093945050505050610c2360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611a576123ba565b805f03611a9b576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610d21565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611b18576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611b41611c9b565b6001600160a01b038581165f81815260018601602090815260409182902054825195909416855284019190915282018590526060820152608001610e0b565b5f80610e3884611b8f33610e23565b856125e2565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611bc6929190615805565b60405180910390a150565b5f610c23611c067f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201869052919091169062fdd58e90604401602060405180830381865afa158015611c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8e91906156bb565b610c1e85868660016125ce565b5f610a5a612f8d565b5f80611cb787610c1e87898860016125ce565b9050611cc78187878a8888612fb5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b1f90615468565b5f33610bae818585612ae7565b604080515f8152602081019091526060908267ffffffffffffffff811115611d5957611d59614dcd565b604051908082528060200260200182016040528015611d8c57816020015b6060815260200190600190039081611d775790505b5091505f5b83811015611e0d57611de830868684818110611daf57611daf615866565b9050602002810190611dc19190615893565b85604051602001611dd4939291906158f4565b60405160208183030381529060405261337b565b838281518110611dfa57611dfa615866565b6020908102919091010152600101611d91565b505092915050565b5f80611e28876111d487898860016125ce565b9050611cc7878787848888612fb5565b5f610c2383610c1e336111cb565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090851115611ec8576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610d21565b5f611edf88611ed9338a8a5f6125ce565b5f6125e2565b9050611f238888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125f892505050565b979650505050505050565b5f80611f38612577565b90505f611f4e87611f4833610bce565b87612b76565b9050610beb81878985886125f8565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00610f0c565b5f80610e3884670de0b6b3a7640000611ed9565b611fa68585858585613416565b611fb08484613479565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a48906080810161205a7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b1515905260405161206e9190602001615951565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161209b93929190615766565b5f604051808303815f87803b1580156120b2575f80fd5b505af11580156120c4573d5f803e3d5ffd5b50505050505050505050565b835f03612109576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806121a35750816002015486115b156121b75760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e50795815833878787876040516121ee9594939291906159e1565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533918460405160200161206e9190615a4d565b6122416123ba565b6001600160a01b038116612283576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b610acb81612d61565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061231e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061236a57507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b336123c3611c9b565b6001600160a01b031614611893576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610d21565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612480573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a49190615a91565b6124da576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610caa565b6125728383836001613539565b505050565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906125c8906001615aac565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f6125ed8284613661565b610bfa84845f6136a5565b612600612df6565b845f03612639576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03612672576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166126b2576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036126ed576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea338587868686604051612726969594939291906156d2565b60405180910390a161273b85858585856136ba565b6127458484613715565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906127b5903390889087908990889060040161578d565b5f604051808303815f87803b1580156127cc575f80fd5b505af11580156127de573d5f803e3d5ffd5b505050506127ef8585858585613762565b61281860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b80471015612862576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610d21565b61287b828260405180602001604052805f81525061380e565b15612884575050565b3d1561289657612892613823565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806128d2612e46565b60028101549091505f036128e8576125c861382e565b5f6128f75f19600360016138b2565b90505f5b5f198214610c23575f83600201838154811061291957612919615866565b905f5260205f2090600502015f01549050600281036129f6575f6129e685600201858154811061294b5761294b615866565b905f5260205f209060050201600401805461296590615468565b80601f016020809104026020016040519081016040528092919081815260200182805461299190615468565b80156129dc5780601f106129b3576101008083540402835291602001916129dc565b820191905f5260205f20905b8154815290600101906020018083116129bf57829003601f168201915b50505050506139ad565b90506129f283826139c2565b9250505b5f838152600485016020526040902054612a109083615aac565b9150612a1f83600360016138b2565b9250506128fb565b5f610c23838383613a46565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612ae15781811015612ad3576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610d21565b612ae184848484035f613539565b50505050565b6001600160a01b038316612b29576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038216612b6b576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612572838383613a5b565b5f612b818284613661565b610bfa84846001613a46565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611893576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bf6613ab0565b612c0881602001518260400151613ab8565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612ce8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d0c9190615abf565b90506001600160a01b0381163014612572576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610d21565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610c23838360016136a5565b612dfe613aca565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610c23565b5f80612e3e83613b25565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00612e9460017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615853565b604051602001612ea691815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f8181612eee612e46565b9050845f612eff86600360016138b2565b90505b5f198114612f81579250828115801590612f3f57506002836002018281548110612f2e57612f2e615866565b905f5260205f2090600502015f0154145b15612f6d575f612f5d84600201838154811061294b5761294b615866565b9050612f6983826139c2565b9250505b612f7a81600360016138b2565b9050612f02565b509250505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610f0c565b612fbd612df6565b855f03612ff6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361302f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661306f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166130af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036130eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610d21565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516131269796959493929190615ada565b60405180910390a16001600160a01b038416331461329557613149843385612a33565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156131e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132099190615a91565b613295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610d21565b61329f8484613bb1565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061330f903390889087908990889060040161578d565b5f604051808303815f87803b158015613326575f80fd5b505af1158015613338573d5f803e3d5ffd5b5050505061334a868686868686613bfe565b61337360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6133888484613d07565b90508080156133a957505f3d11806133a957505f846001600160a01b03163b115b156133be576133b6613d1a565b915050610ab4565b8015613401576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610d21565b3d156128965761340f613823565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03163314612818576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906134c257506001600160a01b0383165f908152600182016020526040902054155b80156134e557506001600160a01b0382165f908152600282016020526040902054155b156125725780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610d21565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661359c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b0384166135de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561281857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161365291815260200190565b60405180910390a35050505050565b81811015612892576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b5f610bfa8484670de0b6b3a764000085613d33565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906137089084613d75565b6001909101555050505050565b6001600160a01b038216613757576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b6128925f8383613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806137cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b81526020018981526020018781525060405160200161206e9190615b7f565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061387c60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615853565b60405160200161388e91815260200190565b60405160208183030381529060405280519060200120169050600281015491505090565b5f6007831681036138ef576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138f8612e46565b60028101549091505f03613910575f19915050610c23565b5f5f1986146139435781600201868154811061392e5761392e615866565b905f5260205f20906005020160030154613946565b81545b9050600284600281111561395c5761395c615b91565b0361397e576139758261396f8484613d84565b87613dff565b92505050610c23565b600184600281111561399257613992615b91565b036139a257613975828287613e57565b611cc7828287613dff565b5f81806020019051810190610ab491906156bb565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613a20576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610d21565b5f613a3d613a37613a31865f613ec4565b85613f1e565b5f613f83565b50949350505050565b5f610bfa84670de0b6b3a76400008585613d33565b613a63613fc4565b613a6d835f61402a565b613a77825f61402a565b613a828383836140ac565b6001600160a01b038316613a99576125728161420c565b6001600160a01b038216612572576125728161424f565b611893614289565b613ac0614289565b61289282826142c7565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611893576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613b7360017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615853565b604051602001613b8591815260200190565b60405160208183030381529060405280519060200120169050825f528060205260405f20915050919050565b6001600160a01b038216613bf3576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610d21565b612892825f83613a5b565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613ca49190615b7f565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613cd193929190615766565b5f604051808303815f87803b158015613ce8575f80fd5b505af1158015613cfa573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613d60613d408361432a565b8015613d5b57505f8480613d5657613d56615bbe565b868809115b151590565b613d6b868686614356565b6125d99190615aac565b5f828218828411028218610c23565b5f5b5f198214158015613dc8575042836002018381548110613da857613da8615866565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613df957826002018281548110613de257613de2615866565b905f5260205f209060050201600301549150613d86565b50919050565b5f5b5f198314613e4d575f846002018481548110613e1f57613e1f615866565b905f5260205f209060050201905082815f0154165f14613e425783915050610c23565b600301549250613e01565b505f199392505050565b5f5b5f198314613e4d575f846002018481548110613e7757613e77615866565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115613ea75750613e4d565b8054831615613eb95783915050610c23565b600301549250613e59565b5f805f613ed18585614406565b9150915080613f16576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480613f638686868661450c565b915091505f80613f738484614406565b509b9a5050505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d613fb782828761462b565b9350935050509250929050565b5f613fcd612e46565b60028101549091505f03613fde5750565b5f613ff38260050154600260011760016138b2565b90505f195b5f19821461401657508061400f81600360016138b2565b9150613ff8565b5f1981146125725760058301819055505050565b6001600160a01b03821661403c575050565b5f614047838361477a565b90505f61405484846147a5565b90505f8061406283856147af565b9150915083810361407557505050505050565b6140808686836147c6565b828214614092576140928686846147f4565b6140a08686868487876147fe565b61337384828585614859565b6140b68383613479565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016141667fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016141d493929190615766565b5f604051808303815f87803b1580156141eb575f80fd5b505af11580156141fd573d5f803e3d5ffd5b50505050612ae1848484614865565b5f614215612e46565b6002810154909150156128925760058101545f90815260048201602052604081208054849290614246908490615aac565b90915550505050565b5f614258612e46565b6002810154909150156128925760058101545f90815260048201602052604081208054849290614246908490615853565b614291614870565b611893576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142cf614289565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361431b8482615c2f565b5060048101612ae18382615c2f565b5f600282600381111561433f5761433f615b91565b6143499190615d09565b60ff166001149050919050565b5f805f614363868661488e565b91509150815f036143875783818161437d5761437d615bbe565b0492505050610c23565b81841161439e5761439e60038515026011186148aa565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b831483838261446a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561444a57620186a0860595506005850194505b8586601b0b1461446557600a8605955084600101945061444a565b614480565b855f0361448057505f925060019150612f869050565b848560030b146144dc575f8512156144a057505f9250829150612f869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610d21565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015614524575f92505f9150614621565b61452e8487615d2a565b91505f61453a886148bb565b90505f614546876148bb565b90505f614553838361488e565b5090505f6f0785ee10d5da46d900f436a000000000821115614588576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156145a957670de0b6b3a7640000820491506012015b633b9aca008211156145c257633b9aca00820491506009015b6127108211156145d757612710820491506004015b81156145eb57600a820491506001016145d7565b6145f58187615d2a565b95506146178b8a614611878761460c87600a615e29565b61491c565b896149f7565b9097509550505050505b5094509492505050565b5f805f851215614671576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610d21565b845f0361468357505f90506001614772565b8460ff84168501858112156146ce576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610d21565b5f805f831215614738577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb383121561470f575f809550955050505050614772565b825f03600a0a915081848161472657614726615bbe565b04955050840290911491506147729050565b5f8313156147675761474b83600a615e29565b91506147578285615e34565b9550600194506147729350505050565b509193506001925050505b935093915050565b5f614783612e46565b6001600160a01b03939093165f90815260039093016020525050604090205490565b5f610c2383612e33565b5f806147bb8484612ee3565b915091509250929050565b806147cf612e46565b6001600160a01b039094165f9081526003949094016020526040909320929092555050565b6125728382614b03565b6040805185815260208101859052908101839052606081018290526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a2505050505050565b612ae184838584614b15565b612572838383614b72565b5f614879612b8d565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614918577f8000000000000000000000000000000000000000000000000000000000000000820361491257507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614929868661488e565b91509150815f036149435783818161437d5761437d615bbe565b83821061498d576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610d21565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614ac1577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614aae57614a567f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615aac565b8403614a8657507f8000000000000000000000000000000000000000000000000000000000000000905081614afa565b614a91600a85615e4b565b614a9a90615e5e565b614aa5846001615d2a565b91509150614afa565b614ab784615e5e565b8391509150614afa565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614af457614a9a600a85615e4b565b50829050815b94509492505050565b5f614b0d83613b25565b919091555050565b5f614b1e612e46565b905083816004015f8781526020019081526020015f205f828254614b429190615853565b90915550505f83815260048201602052604081208054849290614b66908490615aac565b90915550505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614bbf5781816002015f828254614bb49190615aac565b90915550614c489050565b6001600160a01b0384165f9081526020829052604090205482811015614c2a576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610d21565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614c66576002810180548390039055614c84565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614cc991815260200190565b60405180910390a350505050565b5f60208284031215614ce7575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c23575f80fd5b6001600160a01b0381168114610acb575f80fd5b5f60208284031215614d3a575f80fd5b8135610c2381614d16565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c236020830184614d45565b5f8060408385031215614db4575f80fd5b8235614dbf81614d16565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715614e1d57614e1d614dcd565b60405290565b6040516080810167ffffffffffffffff81118282101715614e1d57614e1d614dcd565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614e8d57614e8d614dcd565b604052919050565b5f67ffffffffffffffff821115614eae57614eae614dcd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614ee9575f80fd5b8135614efc614ef782614e95565b614e46565b818152846020838601011115614f10575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215614f3f575f80fd5b843593506020850135614f5181614d16565b925060408501359150606085013567ffffffffffffffff811115614f73575f80fd5b614f7f87828801614eda565b91505092959194509250565b5f8060408385031215614f9c575f80fd5b50508035926020909101359150565b5f60208284031215614fbb575f80fd5b5035919050565b5f805f60608486031215614fd4575f80fd5b8335614fdf81614d16565b92506020840135614fef81614d16565b929592945050506040919091013590565b5f60208284031215615010575f80fd5b813567ffffffffffffffff811115615026575f80fd5b610bfa84828501614eda565b5f805f8060808587031215615045575f80fd5b843561505081614d16565b93506020850135925060408501359150606085013567ffffffffffffffff811115614f73575f80fd5b5f805f6060848603121561508b575f80fd5b833561509681614d16565b925060208401359150604084013567ffffffffffffffff8111156150b8575f80fd5b6150c486828701614eda565b9150509250925092565b5f805f805f60a086880312156150e2575f80fd5b8535945060208601356150f481614d16565b9350604086013561510481614d16565b925060608601359150608086013567ffffffffffffffff811115615126575f80fd5b61513288828901614eda565b9150509295509295909350565b5f8060208385031215615150575f80fd5b823567ffffffffffffffff80821115615167575f80fd5b818501915085601f83011261517a575f80fd5b813581811115615188575f80fd5b8660208260051b850101111561519c575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b82811015615221577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261520f858351614d45565b945092850192908501906001016151d5565b5092979650505050505050565b5f8083601f84011261523e575f80fd5b50813567ffffffffffffffff811115615255575f80fd5b602083019150836020828501011115612f86575f80fd5b5f805f805f60808688031215615280575f80fd5b85359450602086013561529281614d16565b935060408601359250606086013567ffffffffffffffff8111156152b4575f80fd5b6152c08882890161522e565b969995985093965092949392505050565b5f80604083850312156152e2575f80fd5b82356152ed81614d16565b915060208301356152fd81614d16565b809150509250929050565b5f82601f830112615317575f80fd5b8135602067ffffffffffffffff82111561533357615333614dcd565b8160051b615342828201614e46565b928352848101820192828101908785111561535b575f80fd5b83870192505b84831015611f2357823582529183019190830190615361565b5f805f805f60a0868803121561538e575f80fd5b853561539981614d16565b945060208601356153a981614d16565b935060408601356153b981614d16565b9250606086013567ffffffffffffffff808211156153d5575f80fd5b6153e189838a01615308565b935060808801359150808211156153f6575f80fd5b5061513288828901615308565b8015158114610acb575f80fd5b5f805f8060608587031215615423575f80fd5b84359350602085013561543581615403565b9250604085013567ffffffffffffffff811115615450575f80fd5b61545c8782880161522e565b95989497509550505050565b600181811c9082168061547c57607f821691505b602082108103613df9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156154c3575f80fd5b815160ff81168114610c23575f80fd5b5f82601f8301126154e2575f80fd5b81516154f0614ef782614e95565b818152846020838601011115615504575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615530575f80fd5b815167ffffffffffffffff80821115615547575f80fd5b908301906040828603121561555a575f80fd5b615562614dfa565b825161556d81614d16565b8152602083015182811115615580575f80fd5b929092019160808387031215615594575f80fd5b61559c614e23565b83516155a781614d16565b81526020840151838111156155ba575f80fd5b6155c6888287016154d3565b6020830152506040840151838111156155dd575f80fd5b6155e9888287016154d3565b604083015250606084015193506155ff84614d16565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615664610100860182614d45565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c087015261569f8282614d45565b9150508260608301511660e08601528093505050509392505050565b5f602082840312156156cb575f80fd5b5051919050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261570f60c0830184614d45565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610bfa60c0840182614d45565b6001600160a01b0384168152826020820152606060408201525f6125d96060830184614d45565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611f2360a0830184614d45565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610bfa60a0840182614d45565b6001600160a01b0383168152604060208201525f610bfa6040830184614d45565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615826565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126158c6575f80fd5b83018035915067ffffffffffffffff8211156158e0575f80fd5b602001915036819003821315612f86575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b838110156159465781518752958201959082019060010161592a565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a0606084015261598d60c0840182615917565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160808501526159c88282615917565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610bfa60c0840182614d45565b5f60208284031215615aa1575f80fd5b8151610c2381615403565b80820180821115610ab457610ab4615826565b5f60208284031215615acf575f80fd5b8151610c2381614d16565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615b1f60e0830184614d45565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610bfa60c0850182614d45565b602081525f610c236020830184615b2c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f82111561257257805f5260205f20601f840160051c81016020851015615c105750805b601f840160051c820191505b81811015612818575f8155600101615c1c565b815167ffffffffffffffff811115615c4957615c49614dcd565b615c5d81615c578454615468565b84615beb565b602080601f831160018114615c90575f8415615c795750858301515b5f19600386901b1c1916600185901b178555613373565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615cdc57888601518255948401946001909101908401615cbd565b5085821015615cf957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615d1b57615d1b615bbe565b8060ff84160691505092915050565b8082018281125f831280158216821582161715611e0d57611e0d615826565b600181815b80851115615d8357815f1904821115615d6957615d69615826565b80851615615d7657918102915b93841c9390800290615d4e565b509250929050565b5f82615d9957506001610ab4565b81615da557505f610ab4565b8160018114615dbb5760028114615dc557615de1565b6001915050610ab4565b60ff841115615dd657615dd6615826565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615e04575081810a610ab4565b615e0e8383615d49565b805f1904821115615e2157615e21615826565b029392505050565b5f610c238383615d8b565b8082028115828204841417610ab457610ab4615826565b5f82615e5957615e59615bbe565b500490565b5f7f800000000000000000000000000000000000000000000000000000000000000082036149125761491261582656"; diff --git a/src/generated/StoxUnifiedDeployer.pointers.sol b/src/generated/StoxUnifiedDeployer.pointers.sol index ab7f44e3..aabc641a 100644 --- a/src/generated/StoxUnifiedDeployer.pointers.sol +++ b/src/generated/StoxUnifiedDeployer.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x0c386aa41081d894b18d2fe6fdacdcf97bda940ce2362d4337de4d5978f43426); +bytes32 constant BYTECODE_HASH = bytes32(0xc22070ce32a12abb3e4ace57cbfda63ff5b864c2e0b9add1de3c7ede6b18dd94); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x8DE508D1024Fca365CB434A8C894D3F077D3CBd1); +address constant DEPLOYED_ADDRESS = address(0xcfb89301181D0aA7c2b6b7Ef3D5E4FfC51B13D0b); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506106308061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073a672661d9d00fd168ffc6c002b42b3ff8161fd6c90634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f907302be7f0b93a78685fa7312d2e587a5ad1f776f8c9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; + hex"6080604052348015600e575f80fd5b506106308061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073b98430a717658c5541a081e1c4a8f1e32447f57690634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f907302be7f0b93a78685fa7312d2e587a5ad1f776f8c9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073a672661d9d00fd168ffc6c002b42b3ff8161fd6c90634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f907302be7f0b93a78685fa7312d2e587a5ad1f776f8c9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; + hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073b98430a717658c5541a081e1c4a8f1e32447f57690634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f907302be7f0b93a78685fa7312d2e587a5ad1f776f8c9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; diff --git a/test/src/concrete/StoxCorporateActionsInvariant.t.sol b/test/src/concrete/StoxCorporateActionsInvariant.t.sol index fbee2c52..f2e9b22b 100644 --- a/test/src/concrete/StoxCorporateActionsInvariant.t.sol +++ b/test/src/concrete/StoxCorporateActionsInvariant.t.sol @@ -32,8 +32,8 @@ contract InvariantVault is StoxReceiptVault { function _update(address from, address to, uint256 amount) internal override { LibTotalSupply.fold(); - _migrateAccount(from); - _migrateAccount(to); + _migrate(from, 0); + _migrate(to, 0); ERC20Upgradeable._update(from, to, amount); diff --git a/test/src/concrete/StoxReceipt.t.sol b/test/src/concrete/StoxReceipt.t.sol index 255d585c..1c629df7 100644 --- a/test/src/concrete/StoxReceipt.t.sol +++ b/test/src/concrete/StoxReceipt.t.sol @@ -174,7 +174,7 @@ contract TestStoxReceipt is StoxReceipt { /// Expose internal migration so tests can exercise the zero-address /// short-circuit directly. function publicMigrateHolderId(address account, uint256 id) external { - _migrateHolderId(account, id, ICorporateActionsV1(this.manager())); + _migrate(account, id); } } diff --git a/test/src/concrete/StoxReceiptVault.t.sol b/test/src/concrete/StoxReceiptVault.t.sol index 4f5c366b..cd3a8c42 100644 --- a/test/src/concrete/StoxReceiptVault.t.sol +++ b/test/src/concrete/StoxReceiptVault.t.sol @@ -37,8 +37,8 @@ contract TestStoxReceiptVault is StoxReceiptVault { // bypassing the OffchainAssetReceiptVault authorizer/freeze layer. LibTotalSupply.fold(); - _migrateAccount(from); - _migrateAccount(to); + _migrate(from, 0); + _migrate(to, 0); ERC20Upgradeable._update(from, to, amount);