More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
6 addresses found via
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TreasurerWallet
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-02 */ // File: openzeppelin-solidity/contracts/utils/Context.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: openzeppelin-solidity/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: openzeppelin-solidity/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/Controllable.sol pragma solidity ^0.8.0; /** * @title Controllable * @dev Contract used for handling controllers. */ contract Controllable is Ownable { using Address for address; address public controller; event ControllerChanged(address indexed controller); /** * @dev Throws if called by any account other than the controller. */ modifier onlyController() { require(_msgSender() == controller, "Controllable: caller is not the controller"); _; } /** * @dev Sets address of the controller to `newController`. */ function setController(address newController) external onlyOwner { require(newController != controller, "Controllable: new value is the same"); require(newController != address(0), "Controllable: controller must be a valid address"); require(newController.isContract(), "Controllable: controller must be a contract"); controller = newController; emit ControllerChanged(controller); } } // File: openzeppelin-solidity/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: openzeppelin-solidity/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: openzeppelin-solidity/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: openzeppelin-solidity/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: contracts/TreasurerWallet.sol pragma solidity ^0.8.0; /** * @title TreasurerWallet * @dev Contract that keeps tokens. */ contract TreasurerWallet is Controllable, ERC165, IERC721Receiver, IERC1155Receiver { using Address for address; bool public isLocked = false; event MigrationStarted(); event ERC721Received(address indexed token, uint256 indexed identifier); event ERC1155Received(address indexed token, uint256 indexed identifier, uint256 indexed amount); event ERC1155BatchReceived(address indexed token, uint256[] indexed identifiers, uint256[] indexed amounts); event ERC721Withdrawal(address indexed token, uint256 indexed identifier, address indexed beneficiary); event ERC1155Withdrawal(address indexed token, uint256 indexed identifier, uint256 indexed amount, address beneficiary); event ERC1155BatchWithdrawal(address indexed token, uint256[] indexed identifiers, uint256[] indexed amounts, address beneficiary); /** * @dev Throws if called after the contract was locked. */ modifier onlyUnlocked() { require(controller != address(0), "TreasurerWallet: controller was not set yet"); require(!isLocked, "TreasurerWallet: wallet is already locked"); _; } /** * @dev Starts tokens migration. */ function startMigration() external onlyUnlocked onlyOwner { require(!isLocked, "TreasurerWallet: migration has already started"); isLocked = true; emit MigrationStarted(); } /** * @dev Allows to migrate ERC721 tokens to new wallet address by the owner. */ function migrateERC721(address[] calldata tokens, uint256[] calldata identifiers, address wallet) external onlyOwner { require(isLocked, "TreasurerWallet: migration has not started yet"); require(wallet.isContract(), "TreasurerWallet: new wallet must be a contract"); require(tokens.length == identifiers.length, "TreasurerWallet: length of tokens and identifiers must be the same"); for (uint256 i = 0; i < tokens.length; ++i) { IERC721(tokens[i]).safeTransferFrom(address(this), wallet, identifiers[i], ""); } } /** * @dev Allows to migrate ERC1155 tokens to new wallet address by the owner. */ function migrateERC1155(address[] calldata tokens, uint256[] calldata identifiers, uint256[] calldata amounts, address wallet) external onlyOwner { require(isLocked, "TreasurerWallet: migration has not started yet"); require(wallet.isContract(), "TreasurerWallet: new wallet must be a contract"); require(tokens.length == identifiers.length, "TreasurerWallet: length of tokens and identifiers must be the same"); require(identifiers.length == amounts.length, "TreasurerWallet: length of identifiers and amounts must be the same"); for (uint256 i = 0; i < tokens.length; ++i) { require(amounts[i] > 0, "TreasurerWallet: amount must be greater than zero"); IERC1155(tokens[i]).safeTransferFrom(address(this), wallet, identifiers[i], amounts[i], ""); } } /** * @dev Allows to withdraw ERC721 token by the controller. */ function withdrawERC721(address token, uint256 identifier, address beneficiary) external onlyUnlocked onlyController { require(beneficiary != address(0), "TreasurerWallet: withdrawal to the zero address"); IERC721(token).safeTransferFrom(address(this), beneficiary, identifier, ""); emit ERC721Withdrawal(token, identifier, beneficiary); } /** * @dev Allows to withdraw ERC1155 token by the controller. */ function withdrawERC1155(address token, uint256 identifier, uint256 amount, address beneficiary) external onlyUnlocked onlyController { require(beneficiary != address(0), "TreasurerWallet: withdrawal to the zero address"); require(amount > 0, "TreasurerWallet: amount must be greater than zero"); IERC1155(token).safeTransferFrom(address(this), beneficiary, identifier, amount, ""); emit ERC1155Withdrawal(token, identifier, amount, beneficiary); } /** * @dev Allows to withdraw multiple ERC1155 tokens by the controller. */ function withdrawERC1155Batch(address token, uint256[] calldata identifiers, uint256[] calldata amounts, address beneficiary) external onlyUnlocked onlyController { require(beneficiary != address(0), "TreasurerWallet: withdrawal to the zero address"); require(identifiers.length > 0, "TreasurerWallet: at least one identifier is requiredt"); require(identifiers.length == amounts.length, "TreasurerWallet: length of identifiers and amounts must be the same"); IERC1155(token).safeBatchTransferFrom(address(this), beneficiary, identifiers, amounts, ""); emit ERC1155BatchWithdrawal(token, identifiers, amounts, beneficiary); } /** * @dev Emits event when ERC721 tokens are received. */ function onERC721Received(address, address, uint256 identifier, bytes calldata) external override returns (bytes4) { if (isLocked) { return ""; } emit ERC721Received(_msgSender(), identifier); return this.onERC721Received.selector; } /** * @dev Emits event when ERC1155 tokens are received. */ function onERC1155Received(address, address, uint256 identifier, uint256 amount, bytes calldata) external override returns (bytes4) { if (isLocked) { return ""; } emit ERC1155Received(_msgSender(), identifier, amount); return this.onERC1155Received.selector; } /** * @dev Emits event when ERC1155 tokens are received. */ function onERC1155BatchReceived(address, address, uint256[] calldata identifiers, uint256[] calldata amounts, bytes calldata) external override returns (bytes4) { if (isLocked) { return ""; } emit ERC1155BatchReceived(_msgSender(), identifiers, amounts); return this.onERC1155BatchReceived.selector; } /** * @dev Returns true if `interfaceId` is supported. */ function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721Receiver).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"indexed":true,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"ERC1155BatchReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"indexed":true,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"ERC1155BatchWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"identifier","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC1155Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"identifier","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"ERC1155Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"identifier","type":"uint256"}],"name":"ERC721Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"identifier","type":"uint256"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"}],"name":"ERC721Withdrawal","type":"event"},{"anonymous":false,"inputs":[],"name":"MigrationStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"wallet","type":"address"}],"name":"migrateERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"internalType":"address","name":"wallet","type":"address"}],"name":"migrateERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newController","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"identifiers","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawERC1155Batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600160146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506200004d620000416200005360201b60201c565b6200005b60201b60201c565b6200011f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fda806200012f6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806392eefe9b11610097578063e987788411610066578063e987788414610271578063f23a6e611461028d578063f2fde38b146102bd578063f77c4791146102d957610100565b806392eefe9b146101eb578063a2cdfe5814610207578063a4e2d63414610223578063bc197c811461024157610100565b806333e59859116100d357806333e598591461018b578063715018a6146101a75780637b9f76b5146101b15780638da5cb5b146101cd57610100565b806301ffc9a714610105578063150b7a021461013557806318264f3314610165578063256451ac1461016f575b600080fd5b61011f600480360381019061011a91906121d6565b6102f7565b60405161012c919061268a565b60405180910390f35b61014f600480360381019061014a9190611df5565b6103d9565b60405161015c91906126a5565b60405180910390f35b61016d610458565b005b61018960048036038101906101849190612011565b61064e565b005b6101a560048036038101906101a0919061210d565b610941565b005b6101af610c49565b005b6101cb60048036038101906101c69190611fbe565b610cd1565b005b6101d5610f89565b6040516101e29190612563565b60405180910390f35b61020560048036038101906102009190611cec565b610fb2565b005b610221600480360381019061021c9190612078565b611236565b005b61022b61147d565b604051610238919061268a565b60405180910390f35b61025b60048036038101906102569190611d19565b611490565b60405161026891906126a5565b60405180910390f35b61028b60048036038101906102869190611f17565b611541565b005b6102a760048036038101906102a29190611e7d565b6118b3565b6040516102b491906126a5565b60405180910390f35b6102d760048036038101906102d29190611cec565b611934565b005b6102e1611a2c565b6040516102ee9190612563565b60405180910390f35b60007f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103c257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103d257506103d182611a52565b5b9050919050565b6000600160149054906101000a900460ff16156103f9576000905061044f565b83610402611abc565b73ffffffffffffffffffffffffffffffffffffffff167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a363150b7a0260e01b90505b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156104ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e190612880565b60405180910390fd5b600160149054906101000a900460ff161561053a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053190612760565b60405180910390fd5b610542611abc565b73ffffffffffffffffffffffffffffffffffffffff16610560610f89565b73ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90612800565b60405180910390fd5b600160149054906101000a900460ff1615610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906128a0565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f882ea0955bd5561a49a52ef27eb0a7b8263561bd890de2ccfbc107df7724f18860405160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d790612880565b60405180910390fd5b600160149054906101000a900460ff1615610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610771611abc565b73ffffffffffffffffffffffffffffffffffffffff16146107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90612860565b60405180910390fd5b6000821161087a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610871906127c0565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663f242432a308386866040518563ffffffff1660e01b81526004016108b99493929190612632565b600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b5050505081838573ffffffffffffffffffffffffffffffffffffffff167f947a534c1419cd328fc4d2c3908e2a853560befd914bea86e4b728643660b915846040516109339190612563565b60405180910390a450505050565b610949611abc565b73ffffffffffffffffffffffffffffffffffffffff16610967610f89565b73ffffffffffffffffffffffffffffffffffffffff16146109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612800565b60405180910390fd5b600160149054906101000a900460ff16610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390612820565b60405180910390fd5b610a2b8173ffffffffffffffffffffffffffffffffffffffff16611ac4565b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190612720565b60405180910390fd5b848490508787905014610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906127a0565b60405180910390fd5b828290508585905014610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190612780565b60405180910390fd5b60005b87879050811015610c3f576000848483818110610b1d57610b1c6129f9565b5b9050602002013511610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b906127c0565b60405180910390fd5b878782818110610b7757610b766129f9565b5b9050602002016020810190610b8c9190611cec565b73ffffffffffffffffffffffffffffffffffffffff1663f242432a3084898986818110610bbc57610bbb6129f9565b5b90506020020135888887818110610bd657610bd56129f9565b5b905060200201356040518563ffffffff1660e01b8152600401610bfc9493929190612632565b600060405180830381600087803b158015610c1657600080fd5b505af1158015610c2a573d6000803e3d6000fd5b5050505080610c3890612981565b9050610afd565b5050505050505050565b610c51611abc565b73ffffffffffffffffffffffffffffffffffffffff16610c6f610f89565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612800565b60405180910390fd5b610ccf6000611ae7565b565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90612880565b60405180910390fd5b600160149054906101000a900460ff1615610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610df4611abc565b73ffffffffffffffffffffffffffffffffffffffff1614610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e41906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190612860565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3083856040518463ffffffff1660e01b8152600401610ef7939291906125e8565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff167f6dac6dd80e1a327f990537d7a698bdf7e4ff0367e10c6f709980c9b27f8a5b2760405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fba611abc565b73ffffffffffffffffffffffffffffffffffffffff16610fd8610f89565b73ffffffffffffffffffffffffffffffffffffffff161461102e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102590612800565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b6906127e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690612740565b60405180910390fd5b61114e8173ffffffffffffffffffffffffffffffffffffffff16611ac4565b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490612840565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f027c3e080ed9215f564a9455a666f7e459b3edc0bb6e02a1bf842fde4d0ccfc160405160405180910390a250565b61123e611abc565b73ffffffffffffffffffffffffffffffffffffffff1661125c610f89565b73ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990612800565b60405180910390fd5b600160149054906101000a900460ff16611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890612820565b60405180910390fd5b6113208173ffffffffffffffffffffffffffffffffffffffff16611ac4565b61135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612720565b60405180910390fd5b8282905085859050146113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906127a0565b60405180910390fd5b60005b85859050811015611475578585828181106113c8576113c76129f9565b5b90506020020160208101906113dd9190611cec565b73ffffffffffffffffffffffffffffffffffffffff1663b88d4fde308487878681811061140d5761140c6129f9565b5b905060200201356040518463ffffffff1660e01b8152600401611432939291906125e8565b600060405180830381600087803b15801561144c57600080fd5b505af1158015611460573d6000803e3d6000fd5b505050508061146e90612981565b90506113aa565b505050505050565b600160149054906101000a900460ff1681565b6000600160149054906101000a900460ff16156114b05760009050611535565b84846040516114c092919061254a565b604051809103902087876040516114d892919061254a565b60405180910390206114e8611abc565b73ffffffffffffffffffffffffffffffffffffffff167ffb30a259afee330fadec0f7ee1c86aaaf44d0516ae72be601643ca8212eb80ec60405160405180910390a463bc197c8160e01b90505b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90612880565b60405180910390fd5b600160149054906101000a900460ff1615611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611664611abc565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b1906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190612860565b60405180910390fd5b60008585905011611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790612700565b60405180910390fd5b8282905085859050146117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af90612780565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63083888888886040518763ffffffff1660e01b81526004016117fb9695949392919061257e565b600060405180830381600087803b15801561181557600080fd5b505af1158015611829573d6000803e3d6000fd5b50505050828260405161183d92919061254a565b6040518091039020858560405161185592919061254a565b60405180910390208773ffffffffffffffffffffffffffffffffffffffff167f40b0b29cf8512c5bab262f0bb81d749c4f17c8455fc6764deb650121d73ec0fc846040516118a39190612563565b60405180910390a4505050505050565b6000600160149054906101000a900460ff16156118d3576000905061192a565b83856118dd611abc565b73ffffffffffffffffffffffffffffffffffffffff167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b53360405160405180910390a463f23a6e6160e01b90505b9695505050505050565b61193c611abc565b73ffffffffffffffffffffffffffffffffffffffff1661195a610f89565b73ffffffffffffffffffffffffffffffffffffffff16146119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790612800565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a17906126c0565b60405180910390fd5b611a2981611ae7565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081359050611bba81612f5f565b92915050565b60008083601f840112611bd657611bd5612a2d565b5b8235905067ffffffffffffffff811115611bf357611bf2612a28565b5b602083019150836020820283011115611c0f57611c0e612a32565b5b9250929050565b60008083601f840112611c2c57611c2b612a2d565b5b8235905067ffffffffffffffff811115611c4957611c48612a28565b5b602083019150836020820283011115611c6557611c64612a32565b5b9250929050565b600081359050611c7b81612f76565b92915050565b60008083601f840112611c9757611c96612a2d565b5b8235905067ffffffffffffffff811115611cb457611cb3612a28565b5b602083019150836001820283011115611cd057611ccf612a32565b5b9250929050565b600081359050611ce681612f8d565b92915050565b600060208284031215611d0257611d01612a41565b5b6000611d1084828501611bab565b91505092915050565b60008060008060008060008060a0898b031215611d3957611d38612a41565b5b6000611d478b828c01611bab565b9850506020611d588b828c01611bab565b975050604089013567ffffffffffffffff811115611d7957611d78612a37565b5b611d858b828c01611c16565b9650965050606089013567ffffffffffffffff811115611da857611da7612a37565b5b611db48b828c01611c16565b9450945050608089013567ffffffffffffffff811115611dd757611dd6612a37565b5b611de38b828c01611c81565b92509250509295985092959890939650565b600080600080600060808688031215611e1157611e10612a41565b5b6000611e1f88828901611bab565b9550506020611e3088828901611bab565b9450506040611e4188828901611cd7565b935050606086013567ffffffffffffffff811115611e6257611e61612a37565b5b611e6e88828901611c81565b92509250509295509295909350565b60008060008060008060a08789031215611e9a57611e99612a41565b5b6000611ea889828a01611bab565b9650506020611eb989828a01611bab565b9550506040611eca89828a01611cd7565b9450506060611edb89828a01611cd7565b935050608087013567ffffffffffffffff811115611efc57611efb612a37565b5b611f0889828a01611c81565b92509250509295509295509295565b60008060008060008060808789031215611f3457611f33612a41565b5b6000611f4289828a01611bab565b965050602087013567ffffffffffffffff811115611f6357611f62612a37565b5b611f6f89828a01611c16565b9550955050604087013567ffffffffffffffff811115611f9257611f91612a37565b5b611f9e89828a01611c16565b93509350506060611fb189828a01611bab565b9150509295509295509295565b600080600060608486031215611fd757611fd6612a41565b5b6000611fe586828701611bab565b9350506020611ff686828701611cd7565b925050604061200786828701611bab565b9150509250925092565b6000806000806080858703121561202b5761202a612a41565b5b600061203987828801611bab565b945050602061204a87828801611cd7565b935050604061205b87828801611cd7565b925050606061206c87828801611bab565b91505092959194509250565b60008060008060006060868803121561209457612093612a41565b5b600086013567ffffffffffffffff8111156120b2576120b1612a37565b5b6120be88828901611bc0565b9550955050602086013567ffffffffffffffff8111156120e1576120e0612a37565b5b6120ed88828901611c16565b9350935050604061210088828901611bab565b9150509295509295909350565b60008060008060008060006080888a03121561212c5761212b612a41565b5b600088013567ffffffffffffffff81111561214a57612149612a37565b5b6121568a828b01611bc0565b9750975050602088013567ffffffffffffffff81111561217957612178612a37565b5b6121858a828b01611c16565b9550955050604088013567ffffffffffffffff8111156121a8576121a7612a37565b5b6121b48a828b01611c16565b935093505060606121c78a828b01611bab565b91505092959891949750929550565b6000602082840312156121ec576121eb612a41565b5b60006121fa84828501611c6c565b91505092915050565b61220c816128fe565b82525050565b600061221e83856128c0565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561225157612250612a3c565b5b602083029250612262838584612972565b82840190509392505050565b600061227a83856128d1565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156122ad576122ac612a3c565b5b6020830292506122be838584612972565b82840190509392505050565b6122d381612910565b82525050565b6122e28161291c565b82525050565b60006122f56026836128ed565b915061230082612a46565b604082019050919050565b6000612318602a836128ed565b915061232382612a95565b604082019050919050565b600061233b6035836128ed565b915061234682612ae4565b604082019050919050565b600061235e602e836128ed565b915061236982612b33565b604082019050919050565b60006123816030836128ed565b915061238c82612b82565b604082019050919050565b60006123a46029836128ed565b91506123af82612bd1565b604082019050919050565b60006123c76043836128ed565b91506123d282612c20565b606082019050919050565b60006123ea6042836128ed565b91506123f582612c95565b606082019050919050565b600061240d6031836128ed565b915061241882612d0a565b604082019050919050565b60006124306023836128ed565b915061243b82612d59565b604082019050919050565b60006124536020836128ed565b915061245e82612da8565b602082019050919050565b6000612476602e836128ed565b915061248182612dd1565b604082019050919050565b60006124996000836128dc565b91506124a482612e20565b600082019050919050565b60006124bc602b836128ed565b91506124c782612e23565b604082019050919050565b60006124df602f836128ed565b91506124ea82612e72565b604082019050919050565b6000612502602b836128ed565b915061250d82612ec1565b604082019050919050565b6000612525602e836128ed565b915061253082612f10565b604082019050919050565b61254481612968565b82525050565b600061255782848661226e565b91508190509392505050565b60006020820190506125786000830184612203565b92915050565b600060a0820190506125936000830189612203565b6125a06020830188612203565b81810360408301526125b3818688612212565b905081810360608301526125c8818486612212565b905081810360808301526125db8161248c565b9050979650505050505050565b60006080820190506125fd6000830186612203565b61260a6020830185612203565b612617604083018461253b565b81810360608301526126288161248c565b9050949350505050565b600060a0820190506126476000830187612203565b6126546020830186612203565b612661604083018561253b565b61266e606083018461253b565b818103608083015261267f8161248c565b905095945050505050565b600060208201905061269f60008301846122ca565b92915050565b60006020820190506126ba60008301846122d9565b92915050565b600060208201905081810360008301526126d9816122e8565b9050919050565b600060208201905081810360008301526126f98161230b565b9050919050565b600060208201905081810360008301526127198161232e565b9050919050565b6000602082019050818103600083015261273981612351565b9050919050565b6000602082019050818103600083015261275981612374565b9050919050565b6000602082019050818103600083015261277981612397565b9050919050565b60006020820190508181036000830152612799816123ba565b9050919050565b600060208201905081810360008301526127b9816123dd565b9050919050565b600060208201905081810360008301526127d981612400565b9050919050565b600060208201905081810360008301526127f981612423565b9050919050565b6000602082019050818103600083015261281981612446565b9050919050565b6000602082019050818103600083015261283981612469565b9050919050565b60006020820190508181036000830152612859816124af565b9050919050565b60006020820190508181036000830152612879816124d2565b9050919050565b60006020820190508181036000830152612899816124f5565b9050919050565b600060208201905081810360008301526128b981612518565b9050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061290982612948565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b600061298c82612968565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129bf576129be6129ca565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a2063616c6c6572206973206e6f74207468652060008201527f636f6e74726f6c6c657200000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206174206c65617374206f6e6520696460008201527f656e746966696572206973207265717569726564740000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206e65772077616c6c6574206d75737460008201527f206265206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a20636f6e74726f6c6c6572206d75737420626560008201527f20612076616c6964206164647265737300000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a2077616c6c657420697320616c72656160008201527f6479206c6f636b65640000000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206c656e677468206f66206964656e7460008201527f69666965727320616e6420616d6f756e7473206d75737420626520746865207360208201527f616d650000000000000000000000000000000000000000000000000000000000604082015250565b7f54726561737572657257616c6c65743a206c656e677468206f6620746f6b656e60008201527f7320616e64206964656e74696669657273206d7573742062652074686520736160208201527f6d65000000000000000000000000000000000000000000000000000000000000604082015250565b7f54726561737572657257616c6c65743a20616d6f756e74206d7573742062652060008201527f67726561746572207468616e207a65726f000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a206e65772076616c756520697320746865207360008201527f616d650000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54726561737572657257616c6c65743a206d6967726174696f6e20686173206e60008201527f6f74207374617274656420796574000000000000000000000000000000000000602082015250565b50565b7f436f6e74726f6c6c61626c653a20636f6e74726f6c6c6572206d75737420626560008201527f206120636f6e7472616374000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a207769746864726177616c20746f207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a20636f6e74726f6c6c6572207761732060008201527f6e6f742073657420796574000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206d6967726174696f6e20686173206160008201527f6c72656164792073746172746564000000000000000000000000000000000000602082015250565b612f68816128fe565b8114612f7357600080fd5b50565b612f7f8161291c565b8114612f8a57600080fd5b50565b612f9681612968565b8114612fa157600080fd5b5056fea2646970667358221220027935ab32f465578aaf9d92d2bfdaeb29ccacf1075f6cfbf2b255b990b8a84a64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c806392eefe9b11610097578063e987788411610066578063e987788414610271578063f23a6e611461028d578063f2fde38b146102bd578063f77c4791146102d957610100565b806392eefe9b146101eb578063a2cdfe5814610207578063a4e2d63414610223578063bc197c811461024157610100565b806333e59859116100d357806333e598591461018b578063715018a6146101a75780637b9f76b5146101b15780638da5cb5b146101cd57610100565b806301ffc9a714610105578063150b7a021461013557806318264f3314610165578063256451ac1461016f575b600080fd5b61011f600480360381019061011a91906121d6565b6102f7565b60405161012c919061268a565b60405180910390f35b61014f600480360381019061014a9190611df5565b6103d9565b60405161015c91906126a5565b60405180910390f35b61016d610458565b005b61018960048036038101906101849190612011565b61064e565b005b6101a560048036038101906101a0919061210d565b610941565b005b6101af610c49565b005b6101cb60048036038101906101c69190611fbe565b610cd1565b005b6101d5610f89565b6040516101e29190612563565b60405180910390f35b61020560048036038101906102009190611cec565b610fb2565b005b610221600480360381019061021c9190612078565b611236565b005b61022b61147d565b604051610238919061268a565b60405180910390f35b61025b60048036038101906102569190611d19565b611490565b60405161026891906126a5565b60405180910390f35b61028b60048036038101906102869190611f17565b611541565b005b6102a760048036038101906102a29190611e7d565b6118b3565b6040516102b491906126a5565b60405180910390f35b6102d760048036038101906102d29190611cec565b611934565b005b6102e1611a2c565b6040516102ee9190612563565b60405180910390f35b60007f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103c257507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103d257506103d182611a52565b5b9050919050565b6000600160149054906101000a900460ff16156103f9576000905061044f565b83610402611abc565b73ffffffffffffffffffffffffffffffffffffffff167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a363150b7a0260e01b90505b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156104ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e190612880565b60405180910390fd5b600160149054906101000a900460ff161561053a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053190612760565b60405180910390fd5b610542611abc565b73ffffffffffffffffffffffffffffffffffffffff16610560610f89565b73ffffffffffffffffffffffffffffffffffffffff16146105b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ad90612800565b60405180910390fd5b600160149054906101000a900460ff1615610606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fd906128a0565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f882ea0955bd5561a49a52ef27eb0a7b8263561bd890de2ccfbc107df7724f18860405160405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d790612880565b60405180910390fd5b600160149054906101000a900460ff1615610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610771611abc565b73ffffffffffffffffffffffffffffffffffffffff16146107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90612860565b60405180910390fd5b6000821161087a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610871906127c0565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663f242432a308386866040518563ffffffff1660e01b81526004016108b99493929190612632565b600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b5050505081838573ffffffffffffffffffffffffffffffffffffffff167f947a534c1419cd328fc4d2c3908e2a853560befd914bea86e4b728643660b915846040516109339190612563565b60405180910390a450505050565b610949611abc565b73ffffffffffffffffffffffffffffffffffffffff16610967610f89565b73ffffffffffffffffffffffffffffffffffffffff16146109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b490612800565b60405180910390fd5b600160149054906101000a900460ff16610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0390612820565b60405180910390fd5b610a2b8173ffffffffffffffffffffffffffffffffffffffff16611ac4565b610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6190612720565b60405180910390fd5b848490508787905014610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906127a0565b60405180910390fd5b828290508585905014610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190612780565b60405180910390fd5b60005b87879050811015610c3f576000848483818110610b1d57610b1c6129f9565b5b9050602002013511610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b906127c0565b60405180910390fd5b878782818110610b7757610b766129f9565b5b9050602002016020810190610b8c9190611cec565b73ffffffffffffffffffffffffffffffffffffffff1663f242432a3084898986818110610bbc57610bbb6129f9565b5b90506020020135888887818110610bd657610bd56129f9565b5b905060200201356040518563ffffffff1660e01b8152600401610bfc9493929190612632565b600060405180830381600087803b158015610c1657600080fd5b505af1158015610c2a573d6000803e3d6000fd5b5050505080610c3890612981565b9050610afd565b5050505050505050565b610c51611abc565b73ffffffffffffffffffffffffffffffffffffffff16610c6f610f89565b73ffffffffffffffffffffffffffffffffffffffff1614610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90612800565b60405180910390fd5b610ccf6000611ae7565b565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90612880565b60405180910390fd5b600160149054906101000a900460ff1615610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610df4611abc565b73ffffffffffffffffffffffffffffffffffffffff1614610e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e41906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190612860565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3083856040518463ffffffff1660e01b8152600401610ef7939291906125e8565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff167f6dac6dd80e1a327f990537d7a698bdf7e4ff0367e10c6f709980c9b27f8a5b2760405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fba611abc565b73ffffffffffffffffffffffffffffffffffffffff16610fd8610f89565b73ffffffffffffffffffffffffffffffffffffffff161461102e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102590612800565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b6906127e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561112f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112690612740565b60405180910390fd5b61114e8173ffffffffffffffffffffffffffffffffffffffff16611ac4565b61118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490612840565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f027c3e080ed9215f564a9455a666f7e459b3edc0bb6e02a1bf842fde4d0ccfc160405160405180910390a250565b61123e611abc565b73ffffffffffffffffffffffffffffffffffffffff1661125c610f89565b73ffffffffffffffffffffffffffffffffffffffff16146112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990612800565b60405180910390fd5b600160149054906101000a900460ff16611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890612820565b60405180910390fd5b6113208173ffffffffffffffffffffffffffffffffffffffff16611ac4565b61135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612720565b60405180910390fd5b8282905085859050146113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906127a0565b60405180910390fd5b60005b85859050811015611475578585828181106113c8576113c76129f9565b5b90506020020160208101906113dd9190611cec565b73ffffffffffffffffffffffffffffffffffffffff1663b88d4fde308487878681811061140d5761140c6129f9565b5b905060200201356040518463ffffffff1660e01b8152600401611432939291906125e8565b600060405180830381600087803b15801561144c57600080fd5b505af1158015611460573d6000803e3d6000fd5b505050508061146e90612981565b90506113aa565b505050505050565b600160149054906101000a900460ff1681565b6000600160149054906101000a900460ff16156114b05760009050611535565b84846040516114c092919061254a565b604051809103902087876040516114d892919061254a565b60405180910390206114e8611abc565b73ffffffffffffffffffffffffffffffffffffffff167ffb30a259afee330fadec0f7ee1c86aaaf44d0516ae72be601643ca8212eb80ec60405160405180910390a463bc197c8160e01b90505b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90612880565b60405180910390fd5b600160149054906101000a900460ff1615611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90612760565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611664611abc565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b1906126e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190612860565b60405180910390fd5b60008585905011611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790612700565b60405180910390fd5b8282905085859050146117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af90612780565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63083888888886040518763ffffffff1660e01b81526004016117fb9695949392919061257e565b600060405180830381600087803b15801561181557600080fd5b505af1158015611829573d6000803e3d6000fd5b50505050828260405161183d92919061254a565b6040518091039020858560405161185592919061254a565b60405180910390208773ffffffffffffffffffffffffffffffffffffffff167f40b0b29cf8512c5bab262f0bb81d749c4f17c8455fc6764deb650121d73ec0fc846040516118a39190612563565b60405180910390a4505050505050565b6000600160149054906101000a900460ff16156118d3576000905061192a565b83856118dd611abc565b73ffffffffffffffffffffffffffffffffffffffff167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b53360405160405180910390a463f23a6e6160e01b90505b9695505050505050565b61193c611abc565b73ffffffffffffffffffffffffffffffffffffffff1661195a610f89565b73ffffffffffffffffffffffffffffffffffffffff16146119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a790612800565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a17906126c0565b60405180910390fd5b611a2981611ae7565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081359050611bba81612f5f565b92915050565b60008083601f840112611bd657611bd5612a2d565b5b8235905067ffffffffffffffff811115611bf357611bf2612a28565b5b602083019150836020820283011115611c0f57611c0e612a32565b5b9250929050565b60008083601f840112611c2c57611c2b612a2d565b5b8235905067ffffffffffffffff811115611c4957611c48612a28565b5b602083019150836020820283011115611c6557611c64612a32565b5b9250929050565b600081359050611c7b81612f76565b92915050565b60008083601f840112611c9757611c96612a2d565b5b8235905067ffffffffffffffff811115611cb457611cb3612a28565b5b602083019150836001820283011115611cd057611ccf612a32565b5b9250929050565b600081359050611ce681612f8d565b92915050565b600060208284031215611d0257611d01612a41565b5b6000611d1084828501611bab565b91505092915050565b60008060008060008060008060a0898b031215611d3957611d38612a41565b5b6000611d478b828c01611bab565b9850506020611d588b828c01611bab565b975050604089013567ffffffffffffffff811115611d7957611d78612a37565b5b611d858b828c01611c16565b9650965050606089013567ffffffffffffffff811115611da857611da7612a37565b5b611db48b828c01611c16565b9450945050608089013567ffffffffffffffff811115611dd757611dd6612a37565b5b611de38b828c01611c81565b92509250509295985092959890939650565b600080600080600060808688031215611e1157611e10612a41565b5b6000611e1f88828901611bab565b9550506020611e3088828901611bab565b9450506040611e4188828901611cd7565b935050606086013567ffffffffffffffff811115611e6257611e61612a37565b5b611e6e88828901611c81565b92509250509295509295909350565b60008060008060008060a08789031215611e9a57611e99612a41565b5b6000611ea889828a01611bab565b9650506020611eb989828a01611bab565b9550506040611eca89828a01611cd7565b9450506060611edb89828a01611cd7565b935050608087013567ffffffffffffffff811115611efc57611efb612a37565b5b611f0889828a01611c81565b92509250509295509295509295565b60008060008060008060808789031215611f3457611f33612a41565b5b6000611f4289828a01611bab565b965050602087013567ffffffffffffffff811115611f6357611f62612a37565b5b611f6f89828a01611c16565b9550955050604087013567ffffffffffffffff811115611f9257611f91612a37565b5b611f9e89828a01611c16565b93509350506060611fb189828a01611bab565b9150509295509295509295565b600080600060608486031215611fd757611fd6612a41565b5b6000611fe586828701611bab565b9350506020611ff686828701611cd7565b925050604061200786828701611bab565b9150509250925092565b6000806000806080858703121561202b5761202a612a41565b5b600061203987828801611bab565b945050602061204a87828801611cd7565b935050604061205b87828801611cd7565b925050606061206c87828801611bab565b91505092959194509250565b60008060008060006060868803121561209457612093612a41565b5b600086013567ffffffffffffffff8111156120b2576120b1612a37565b5b6120be88828901611bc0565b9550955050602086013567ffffffffffffffff8111156120e1576120e0612a37565b5b6120ed88828901611c16565b9350935050604061210088828901611bab565b9150509295509295909350565b60008060008060008060006080888a03121561212c5761212b612a41565b5b600088013567ffffffffffffffff81111561214a57612149612a37565b5b6121568a828b01611bc0565b9750975050602088013567ffffffffffffffff81111561217957612178612a37565b5b6121858a828b01611c16565b9550955050604088013567ffffffffffffffff8111156121a8576121a7612a37565b5b6121b48a828b01611c16565b935093505060606121c78a828b01611bab565b91505092959891949750929550565b6000602082840312156121ec576121eb612a41565b5b60006121fa84828501611c6c565b91505092915050565b61220c816128fe565b82525050565b600061221e83856128c0565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561225157612250612a3c565b5b602083029250612262838584612972565b82840190509392505050565b600061227a83856128d1565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156122ad576122ac612a3c565b5b6020830292506122be838584612972565b82840190509392505050565b6122d381612910565b82525050565b6122e28161291c565b82525050565b60006122f56026836128ed565b915061230082612a46565b604082019050919050565b6000612318602a836128ed565b915061232382612a95565b604082019050919050565b600061233b6035836128ed565b915061234682612ae4565b604082019050919050565b600061235e602e836128ed565b915061236982612b33565b604082019050919050565b60006123816030836128ed565b915061238c82612b82565b604082019050919050565b60006123a46029836128ed565b91506123af82612bd1565b604082019050919050565b60006123c76043836128ed565b91506123d282612c20565b606082019050919050565b60006123ea6042836128ed565b91506123f582612c95565b606082019050919050565b600061240d6031836128ed565b915061241882612d0a565b604082019050919050565b60006124306023836128ed565b915061243b82612d59565b604082019050919050565b60006124536020836128ed565b915061245e82612da8565b602082019050919050565b6000612476602e836128ed565b915061248182612dd1565b604082019050919050565b60006124996000836128dc565b91506124a482612e20565b600082019050919050565b60006124bc602b836128ed565b91506124c782612e23565b604082019050919050565b60006124df602f836128ed565b91506124ea82612e72565b604082019050919050565b6000612502602b836128ed565b915061250d82612ec1565b604082019050919050565b6000612525602e836128ed565b915061253082612f10565b604082019050919050565b61254481612968565b82525050565b600061255782848661226e565b91508190509392505050565b60006020820190506125786000830184612203565b92915050565b600060a0820190506125936000830189612203565b6125a06020830188612203565b81810360408301526125b3818688612212565b905081810360608301526125c8818486612212565b905081810360808301526125db8161248c565b9050979650505050505050565b60006080820190506125fd6000830186612203565b61260a6020830185612203565b612617604083018461253b565b81810360608301526126288161248c565b9050949350505050565b600060a0820190506126476000830187612203565b6126546020830186612203565b612661604083018561253b565b61266e606083018461253b565b818103608083015261267f8161248c565b905095945050505050565b600060208201905061269f60008301846122ca565b92915050565b60006020820190506126ba60008301846122d9565b92915050565b600060208201905081810360008301526126d9816122e8565b9050919050565b600060208201905081810360008301526126f98161230b565b9050919050565b600060208201905081810360008301526127198161232e565b9050919050565b6000602082019050818103600083015261273981612351565b9050919050565b6000602082019050818103600083015261275981612374565b9050919050565b6000602082019050818103600083015261277981612397565b9050919050565b60006020820190508181036000830152612799816123ba565b9050919050565b600060208201905081810360008301526127b9816123dd565b9050919050565b600060208201905081810360008301526127d981612400565b9050919050565b600060208201905081810360008301526127f981612423565b9050919050565b6000602082019050818103600083015261281981612446565b9050919050565b6000602082019050818103600083015261283981612469565b9050919050565b60006020820190508181036000830152612859816124af565b9050919050565b60006020820190508181036000830152612879816124d2565b9050919050565b60006020820190508181036000830152612899816124f5565b9050919050565b600060208201905081810360008301526128b981612518565b9050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061290982612948565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b600061298c82612968565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129bf576129be6129ca565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a2063616c6c6572206973206e6f74207468652060008201527f636f6e74726f6c6c657200000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206174206c65617374206f6e6520696460008201527f656e746966696572206973207265717569726564740000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206e65772077616c6c6574206d75737460008201527f206265206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a20636f6e74726f6c6c6572206d75737420626560008201527f20612076616c6964206164647265737300000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a2077616c6c657420697320616c72656160008201527f6479206c6f636b65640000000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206c656e677468206f66206964656e7460008201527f69666965727320616e6420616d6f756e7473206d75737420626520746865207360208201527f616d650000000000000000000000000000000000000000000000000000000000604082015250565b7f54726561737572657257616c6c65743a206c656e677468206f6620746f6b656e60008201527f7320616e64206964656e74696669657273206d7573742062652074686520736160208201527f6d65000000000000000000000000000000000000000000000000000000000000604082015250565b7f54726561737572657257616c6c65743a20616d6f756e74206d7573742062652060008201527f67726561746572207468616e207a65726f000000000000000000000000000000602082015250565b7f436f6e74726f6c6c61626c653a206e65772076616c756520697320746865207360008201527f616d650000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54726561737572657257616c6c65743a206d6967726174696f6e20686173206e60008201527f6f74207374617274656420796574000000000000000000000000000000000000602082015250565b50565b7f436f6e74726f6c6c61626c653a20636f6e74726f6c6c6572206d75737420626560008201527f206120636f6e7472616374000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a207769746864726177616c20746f207460008201527f6865207a65726f20616464726573730000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a20636f6e74726f6c6c6572207761732060008201527f6e6f742073657420796574000000000000000000000000000000000000000000602082015250565b7f54726561737572657257616c6c65743a206d6967726174696f6e20686173206160008201527f6c72656164792073746172746564000000000000000000000000000000000000602082015250565b612f68816128fe565b8114612f7357600080fd5b50565b612f7f8161291c565b8114612f8a57600080fd5b50565b612f9681612968565b8114612fa157600080fd5b5056fea2646970667358221220027935ab32f465578aaf9d92d2bfdaeb29ccacf1075f6cfbf2b255b990b8a84a64736f6c63430008070033
Deployed Bytecode Sourcemap
27831:6460:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34021:267;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32800:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29045:209;;;:::i;:::-;;31443:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30047:840;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2649:103;;;:::i;:::-;;30977:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1998:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12612:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29361:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27956:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33579:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32037:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33176:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2907:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12200:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34021:267;34115:4;34154:33;34139:48;;;:11;:48;;;;:101;;;;34206:34;34191:49;;;:11;:49;;;;34139:101;:141;;;;34244:36;34268:11;34244:23;:36::i;:::-;34139:141;34132:148;;34021:267;;;:::o;32800:291::-;32907:6;32930:8;;;;;;;;;;;32926:50;;;32955:9;;;;;32926:50;33022:10;33008:12;:10;:12::i;:::-;32993:40;;;;;;;;;;;;33053:30;;;33046:37;;32800:291;;;;;;;;:::o;29045:209::-;28837:1;28815:24;;:10;;;;;;;;;;;:24;;;;28807:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:8;;;;;;;;;;;28906:9;28898:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2229:12:::1;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29123:8:::2;;;;;;;;;;;29122:9;29114:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29206:4;29195:8:::0;::::2;:15;;;;;;;;;;;;;;;;;;29228:18;;;;;;;;;;29045:209::o:0;31443:493::-;28837:1;28815:24;;:10;;;;;;;;;;;:24;;;;28807:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:8;;;;;;;;;;;28906:9;28898:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12445:10:::1;;;;;;;;;;;12429:26;;:12;:10;:12::i;:::-;:26;;;12421:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31619:1:::2;31596:25;;:11;:25;;;;31588:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31701:1;31692:6;:10;31684:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;31778:5;31769:32;;;31810:4;31817:11;31830:10;31842:6;31769:84;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;31908:6;31896:10;31889:5;31871:57;;;31916:11;31871:57;;;;;;:::i;:::-;;;;;;;;31443:493:::0;;;;:::o;30047:840::-;2229:12;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30212:8:::1;;;;;;;;;;;30204:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30290:19;:6;:17;;;:19::i;:::-;30282:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30396:11;;:18;;30379:6;;:13;;:35;30371:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;30526:7;;:14;;30504:11;;:18;;:36;30496:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;30630:9;30625:255;30649:6;;:13;;30645:1;:17;30625:255;;;30705:1;30692:7;;30700:1;30692:10;;;;;;;:::i;:::-;;;;;;;;:14;30684:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30786:6;;30793:1;30786:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;30777:36;;;30822:4;30829:6;30837:11;;30849:1;30837:14;;;;;;;:::i;:::-;;;;;;;;30853:7;;30861:1;30853:10;;;;;;;:::i;:::-;;;;;;;;30777:91;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30664:3;;;;:::i;:::-;;;30625:255;;;;30047:840:::0;;;;;;;:::o;2649:103::-;2229:12;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2714:30:::1;2741:1;2714:18;:30::i;:::-;2649:103::o:0;30977:375::-;28837:1;28815:24;;:10;;;;;;;;;;;:24;;;;28807:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:8;;;;;;;;;;;28906:9;28898:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12445:10:::1;;;;;;;;;;;12429:26;;:12;:10;:12::i;:::-;:26;;;12421:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31136:1:::2;31113:25;;:11;:25;;;;31105:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31211:5;31203:31;;;31243:4;31250:11;31263:10;31203:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;31332:11;31296:48;;31320:10;31313:5;31296:48;;;;;;;;;;;;30977:375:::0;;;:::o;1998:87::-;2044:7;2071:6;;;;;;;;;;;2064:13;;1998:87;:::o;12612:437::-;2229:12;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12713:10:::1;;;;;;;;;;;12696:27;;:13;:27;;;;12688:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;12807:1;12782:27;;:13;:27;;;;12774:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;12881:26;:13;:24;;;:26::i;:::-;12873:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;12981:13;12968:10;;:26;;;;;;;;;;;;;;;;;;13030:10;;;;;;;;;;;13012:29;;;;;;;;;;;;12612:437:::0;:::o;29361:578::-;2229:12;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29497:8:::1;;;;;;;;;;;29489:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29575:19;:6;:17;;;:19::i;:::-;29567:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;29681:11;;:18;;29664:6;;:13;;:35;29656:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;29788:9;29783:149;29807:6;;:13;;29803:1;:17;29783:149;;;29850:6;;29857:1;29850:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;29842:35;;;29886:4;29893:6;29901:11;;29913:1;29901:14;;;;;;;:::i;:::-;;;;;;;;29842:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29822:3;;;;:::i;:::-;;;29783:149;;;;29361:578:::0;;;;;:::o;27956:28::-;;;;;;;;;;;;;:::o;33579:359::-;33732:6;33755:8;;;;;;;;;;;33751:50;;;33780:9;;;;;33751:50;33866:7;;33818:56;;;;;;;:::i;:::-;;;;;;;;33853:11;;33818:56;;;;;;;:::i;:::-;;;;;;;;33839:12;:10;:12::i;:::-;33818:56;;;;;;;;;;;;33894:36;;;33887:43;;33579:359;;;;;;;;;;;:::o;32037:679::-;28837:1;28815:24;;:10;;;;;;;;;;;:24;;;;28807:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:8;;;;;;;;;;;28906:9;28898:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12445:10:::1;;;;;;;;;;;12429:26;;:12;:10;:12::i;:::-;:26;;;12421:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32242:1:::2;32219:25;;:11;:25;;;;32211:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32336:1;32315:11;;:18;;:22;32307:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;32436:7;;:14;;32414:11;;:18;;:36;32406:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;32544:5;32535:37;;;32581:4;32588:11;32601;;32614:7;;32535:91;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32687:7;;32644:64;;;;;;;:::i;:::-;;;;;;;;32674:11;;32644:64;;;;;;;:::i;:::-;;;;;;;;32667:5;32644:64;;;32696:11;32644:64;;;;;;:::i;:::-;;;;;;;;32037:679:::0;;;;;;:::o;33176:318::-;33300:6;33323:8;;;;;;;;;;;33319:50;;;33348:9;;;;;33319:50;33428:6;33416:10;33402:12;:10;:12::i;:::-;33386:49;;;;;;;;;;;;33455:31;;;33448:38;;33176:318;;;;;;;;;:::o;2907:201::-;2229:12;:10;:12::i;:::-;2218:23;;:7;:5;:7::i;:::-;:23;;;2210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3016:1:::1;2996:22;;:8;:22;;;;2988:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3072:28;3091:8;3072:18;:28::i;:::-;2907:201:::0;:::o;12200:25::-;;;;;;;;;;;;;:::o;27522:157::-;27607:4;27646:25;27631:40;;;:11;:40;;;;27624:47;;27522:157;;;:::o;718:98::-;771:7;798:10;791:17;;718:98;:::o;4705:326::-;4765:4;5022:1;5000:7;:19;;;:23;4993:30;;4705:326;;;:::o;3268:191::-;3342:16;3361:6;;;;;;;;;;;3342:25;;3387:8;3378:6;;:17;;;;;;;;;;;;;;;;;;3442:8;3411:40;;3432:8;3411:40;;;;;;;;;;;;3331:128;3268:191;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;169:568::-;242:8;252:6;302:3;295:4;287:6;283:17;279:27;269:122;;310:79;;:::i;:::-;269:122;423:6;410:20;400:30;;453:18;445:6;442:30;439:117;;;475:79;;:::i;:::-;439:117;589:4;581:6;577:17;565:29;;643:3;635:4;627:6;623:17;613:8;609:32;606:41;603:128;;;650:79;;:::i;:::-;603:128;169:568;;;;;:::o;760:::-;833:8;843:6;893:3;886:4;878:6;874:17;870:27;860:122;;901:79;;:::i;:::-;860:122;1014:6;1001:20;991:30;;1044:18;1036:6;1033:30;1030:117;;;1066:79;;:::i;:::-;1030:117;1180:4;1172:6;1168:17;1156:29;;1234:3;1226:4;1218:6;1214:17;1204:8;1200:32;1197:41;1194:128;;;1241:79;;:::i;:::-;1194:128;760:568;;;;;:::o;1334:137::-;1379:5;1417:6;1404:20;1395:29;;1433:32;1459:5;1433:32;:::i;:::-;1334:137;;;;:::o;1490:552::-;1547:8;1557:6;1607:3;1600:4;1592:6;1588:17;1584:27;1574:122;;1615:79;;:::i;:::-;1574:122;1728:6;1715:20;1705:30;;1758:18;1750:6;1747:30;1744:117;;;1780:79;;:::i;:::-;1744:117;1894:4;1886:6;1882:17;1870:29;;1948:3;1940:4;1932:6;1928:17;1918:8;1914:32;1911:41;1908:128;;;1955:79;;:::i;:::-;1908:128;1490:552;;;;;:::o;2048:139::-;2094:5;2132:6;2119:20;2110:29;;2148:33;2175:5;2148:33;:::i;:::-;2048:139;;;;:::o;2193:329::-;2252:6;2301:2;2289:9;2280:7;2276:23;2272:32;2269:119;;;2307:79;;:::i;:::-;2269:119;2427:1;2452:53;2497:7;2488:6;2477:9;2473:22;2452:53;:::i;:::-;2442:63;;2398:117;2193:329;;;;:::o;2528:1569::-;2688:6;2696;2704;2712;2720;2728;2736;2744;2793:3;2781:9;2772:7;2768:23;2764:33;2761:120;;;2800:79;;:::i;:::-;2761:120;2920:1;2945:53;2990:7;2981:6;2970:9;2966:22;2945:53;:::i;:::-;2935:63;;2891:117;3047:2;3073:53;3118:7;3109:6;3098:9;3094:22;3073:53;:::i;:::-;3063:63;;3018:118;3203:2;3192:9;3188:18;3175:32;3234:18;3226:6;3223:30;3220:117;;;3256:79;;:::i;:::-;3220:117;3369:80;3441:7;3432:6;3421:9;3417:22;3369:80;:::i;:::-;3351:98;;;;3146:313;3526:2;3515:9;3511:18;3498:32;3557:18;3549:6;3546:30;3543:117;;;3579:79;;:::i;:::-;3543:117;3692:80;3764:7;3755:6;3744:9;3740:22;3692:80;:::i;:::-;3674:98;;;;3469:313;3849:3;3838:9;3834:19;3821:33;3881:18;3873:6;3870:30;3867:117;;;3903:79;;:::i;:::-;3867:117;4016:64;4072:7;4063:6;4052:9;4048:22;4016:64;:::i;:::-;3998:82;;;;3792:298;2528:1569;;;;;;;;;;;:::o;4103:963::-;4200:6;4208;4216;4224;4232;4281:3;4269:9;4260:7;4256:23;4252:33;4249:120;;;4288:79;;:::i;:::-;4249:120;4408:1;4433:53;4478:7;4469:6;4458:9;4454:22;4433:53;:::i;:::-;4423:63;;4379:117;4535:2;4561:53;4606:7;4597:6;4586:9;4582:22;4561:53;:::i;:::-;4551:63;;4506:118;4663:2;4689:53;4734:7;4725:6;4714:9;4710:22;4689:53;:::i;:::-;4679:63;;4634:118;4819:2;4808:9;4804:18;4791:32;4850:18;4842:6;4839:30;4836:117;;;4872:79;;:::i;:::-;4836:117;4985:64;5041:7;5032:6;5021:9;5017:22;4985:64;:::i;:::-;4967:82;;;;4762:297;4103:963;;;;;;;;:::o;5072:1109::-;5178:6;5186;5194;5202;5210;5218;5267:3;5255:9;5246:7;5242:23;5238:33;5235:120;;;5274:79;;:::i;:::-;5235:120;5394:1;5419:53;5464:7;5455:6;5444:9;5440:22;5419:53;:::i;:::-;5409:63;;5365:117;5521:2;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5492:118;5649:2;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5620:118;5777:2;5803:53;5848:7;5839:6;5828:9;5824:22;5803:53;:::i;:::-;5793:63;;5748:118;5933:3;5922:9;5918:19;5905:33;5965:18;5957:6;5954:30;5951:117;;;5987:79;;:::i;:::-;5951:117;6100:64;6156:7;6147:6;6136:9;6132:22;6100:64;:::i;:::-;6082:82;;;;5876:298;5072:1109;;;;;;;;:::o;6187:1225::-;6327:6;6335;6343;6351;6359;6367;6416:3;6404:9;6395:7;6391:23;6387:33;6384:120;;;6423:79;;:::i;:::-;6384:120;6543:1;6568:53;6613:7;6604:6;6593:9;6589:22;6568:53;:::i;:::-;6558:63;;6514:117;6698:2;6687:9;6683:18;6670:32;6729:18;6721:6;6718:30;6715:117;;;6751:79;;:::i;:::-;6715:117;6864:80;6936:7;6927:6;6916:9;6912:22;6864:80;:::i;:::-;6846:98;;;;6641:313;7021:2;7010:9;7006:18;6993:32;7052:18;7044:6;7041:30;7038:117;;;7074:79;;:::i;:::-;7038:117;7187:80;7259:7;7250:6;7239:9;7235:22;7187:80;:::i;:::-;7169:98;;;;6964:313;7316:2;7342:53;7387:7;7378:6;7367:9;7363:22;7342:53;:::i;:::-;7332:63;;7287:118;6187:1225;;;;;;;;:::o;7418:619::-;7495:6;7503;7511;7560:2;7548:9;7539:7;7535:23;7531:32;7528:119;;;7566:79;;:::i;:::-;7528:119;7686:1;7711:53;7756:7;7747:6;7736:9;7732:22;7711:53;:::i;:::-;7701:63;;7657:117;7813:2;7839:53;7884:7;7875:6;7864:9;7860:22;7839:53;:::i;:::-;7829:63;;7784:118;7941:2;7967:53;8012:7;8003:6;7992:9;7988:22;7967:53;:::i;:::-;7957:63;;7912:118;7418:619;;;;;:::o;8043:765::-;8129:6;8137;8145;8153;8202:3;8190:9;8181:7;8177:23;8173:33;8170:120;;;8209:79;;:::i;:::-;8170:120;8329:1;8354:53;8399:7;8390:6;8379:9;8375:22;8354:53;:::i;:::-;8344:63;;8300:117;8456:2;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8427:118;8584:2;8610:53;8655:7;8646:6;8635:9;8631:22;8610:53;:::i;:::-;8600:63;;8555:118;8712:2;8738:53;8783:7;8774:6;8763:9;8759:22;8738:53;:::i;:::-;8728:63;;8683:118;8043:765;;;;;;;:::o;8814:1079::-;8945:6;8953;8961;8969;8977;9026:2;9014:9;9005:7;9001:23;8997:32;8994:119;;;9032:79;;:::i;:::-;8994:119;9180:1;9169:9;9165:17;9152:31;9210:18;9202:6;9199:30;9196:117;;;9232:79;;:::i;:::-;9196:117;9345:80;9417:7;9408:6;9397:9;9393:22;9345:80;:::i;:::-;9327:98;;;;9123:312;9502:2;9491:9;9487:18;9474:32;9533:18;9525:6;9522:30;9519:117;;;9555:79;;:::i;:::-;9519:117;9668:80;9740:7;9731:6;9720:9;9716:22;9668:80;:::i;:::-;9650:98;;;;9445:313;9797:2;9823:53;9868:7;9859:6;9848:9;9844:22;9823:53;:::i;:::-;9813:63;;9768:118;8814:1079;;;;;;;;:::o;9899:1455::-;10066:6;10074;10082;10090;10098;10106;10114;10163:3;10151:9;10142:7;10138:23;10134:33;10131:120;;;10170:79;;:::i;:::-;10131:120;10318:1;10307:9;10303:17;10290:31;10348:18;10340:6;10337:30;10334:117;;;10370:79;;:::i;:::-;10334:117;10483:80;10555:7;10546:6;10535:9;10531:22;10483:80;:::i;:::-;10465:98;;;;10261:312;10640:2;10629:9;10625:18;10612:32;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10806:80;10878:7;10869:6;10858:9;10854:22;10806:80;:::i;:::-;10788:98;;;;10583:313;10963:2;10952:9;10948:18;10935:32;10994:18;10986:6;10983:30;10980:117;;;11016:79;;:::i;:::-;10980:117;11129:80;11201:7;11192:6;11181:9;11177:22;11129:80;:::i;:::-;11111:98;;;;10906:313;11258:2;11284:53;11329:7;11320:6;11309:9;11305:22;11284:53;:::i;:::-;11274:63;;11229:118;9899:1455;;;;;;;;;;:::o;11360:327::-;11418:6;11467:2;11455:9;11446:7;11442:23;11438:32;11435:119;;;11473:79;;:::i;:::-;11435:119;11593:1;11618:52;11662:7;11653:6;11642:9;11638:22;11618:52;:::i;:::-;11608:62;;11564:116;11360:327;;;;:::o;11693:118::-;11780:24;11798:5;11780:24;:::i;:::-;11775:3;11768:37;11693:118;;:::o;11847:537::-;11975:3;11996:86;12075:6;12070:3;11996:86;:::i;:::-;11989:93;;12106:66;12098:6;12095:78;12092:165;;;12176:79;;:::i;:::-;12092:165;12288:4;12280:6;12276:17;12266:27;;12303:43;12339:6;12334:3;12327:5;12303:43;:::i;:::-;12371:6;12366:3;12362:16;12355:23;;11847:537;;;;;:::o;12420:573::-;12566:3;12587:104;12684:6;12679:3;12587:104;:::i;:::-;12580:111;;12715:66;12707:6;12704:78;12701:165;;;12785:79;;:::i;:::-;12701:165;12897:4;12889:6;12885:17;12875:27;;12912:43;12948:6;12943:3;12936:5;12912:43;:::i;:::-;12980:6;12975:3;12971:16;12964:23;;12420:573;;;;;:::o;12999:109::-;13080:21;13095:5;13080:21;:::i;:::-;13075:3;13068:34;12999:109;;:::o;13114:115::-;13199:23;13216:5;13199:23;:::i;:::-;13194:3;13187:36;13114:115;;:::o;13235:366::-;13377:3;13398:67;13462:2;13457:3;13398:67;:::i;:::-;13391:74;;13474:93;13563:3;13474:93;:::i;:::-;13592:2;13587:3;13583:12;13576:19;;13235:366;;;:::o;13607:::-;13749:3;13770:67;13834:2;13829:3;13770:67;:::i;:::-;13763:74;;13846:93;13935:3;13846:93;:::i;:::-;13964:2;13959:3;13955:12;13948:19;;13607:366;;;:::o;13979:::-;14121:3;14142:67;14206:2;14201:3;14142:67;:::i;:::-;14135:74;;14218:93;14307:3;14218:93;:::i;:::-;14336:2;14331:3;14327:12;14320:19;;13979:366;;;:::o;14351:::-;14493:3;14514:67;14578:2;14573:3;14514:67;:::i;:::-;14507:74;;14590:93;14679:3;14590:93;:::i;:::-;14708:2;14703:3;14699:12;14692:19;;14351:366;;;:::o;14723:::-;14865:3;14886:67;14950:2;14945:3;14886:67;:::i;:::-;14879:74;;14962:93;15051:3;14962:93;:::i;:::-;15080:2;15075:3;15071:12;15064:19;;14723:366;;;:::o;15095:::-;15237:3;15258:67;15322:2;15317:3;15258:67;:::i;:::-;15251:74;;15334:93;15423:3;15334:93;:::i;:::-;15452:2;15447:3;15443:12;15436:19;;15095:366;;;:::o;15467:::-;15609:3;15630:67;15694:2;15689:3;15630:67;:::i;:::-;15623:74;;15706:93;15795:3;15706:93;:::i;:::-;15824:2;15819:3;15815:12;15808:19;;15467:366;;;:::o;15839:::-;15981:3;16002:67;16066:2;16061:3;16002:67;:::i;:::-;15995:74;;16078:93;16167:3;16078:93;:::i;:::-;16196:2;16191:3;16187:12;16180:19;;15839:366;;;:::o;16211:::-;16353:3;16374:67;16438:2;16433:3;16374:67;:::i;:::-;16367:74;;16450:93;16539:3;16450:93;:::i;:::-;16568:2;16563:3;16559:12;16552:19;;16211:366;;;:::o;16583:::-;16725:3;16746:67;16810:2;16805:3;16746:67;:::i;:::-;16739:74;;16822:93;16911:3;16822:93;:::i;:::-;16940:2;16935:3;16931:12;16924:19;;16583:366;;;:::o;16955:::-;17097:3;17118:67;17182:2;17177:3;17118:67;:::i;:::-;17111:74;;17194:93;17283:3;17194:93;:::i;:::-;17312:2;17307:3;17303:12;17296:19;;16955:366;;;:::o;17327:::-;17469:3;17490:67;17554:2;17549:3;17490:67;:::i;:::-;17483:74;;17566:93;17655:3;17566:93;:::i;:::-;17684:2;17679:3;17675:12;17668:19;;17327:366;;;:::o;17699:362::-;17840:3;17861:65;17924:1;17919:3;17861:65;:::i;:::-;17854:72;;17935:93;18024:3;17935:93;:::i;:::-;18053:1;18048:3;18044:11;18037:18;;17699:362;;;:::o;18067:366::-;18209:3;18230:67;18294:2;18289:3;18230:67;:::i;:::-;18223:74;;18306:93;18395:3;18306:93;:::i;:::-;18424:2;18419:3;18415:12;18408:19;;18067:366;;;:::o;18439:::-;18581:3;18602:67;18666:2;18661:3;18602:67;:::i;:::-;18595:74;;18678:93;18767:3;18678:93;:::i;:::-;18796:2;18791:3;18787:12;18780:19;;18439:366;;;:::o;18811:::-;18953:3;18974:67;19038:2;19033:3;18974:67;:::i;:::-;18967:74;;19050:93;19139:3;19050:93;:::i;:::-;19168:2;19163:3;19159:12;19152:19;;18811:366;;;:::o;19183:::-;19325:3;19346:67;19410:2;19405:3;19346:67;:::i;:::-;19339:74;;19422:93;19511:3;19422:93;:::i;:::-;19540:2;19535:3;19531:12;19524:19;;19183:366;;;:::o;19555:118::-;19642:24;19660:5;19642:24;:::i;:::-;19637:3;19630:37;19555:118;;:::o;19679:355::-;19851:3;19873:135;20004:3;19995:6;19987;19873:135;:::i;:::-;19866:142;;20025:3;20018:10;;19679:355;;;;;:::o;20040:222::-;20133:4;20171:2;20160:9;20156:18;20148:26;;20184:71;20252:1;20241:9;20237:17;20228:6;20184:71;:::i;:::-;20040:222;;;;:::o;20268:1201::-;20665:4;20703:3;20692:9;20688:19;20680:27;;20717:71;20785:1;20774:9;20770:17;20761:6;20717:71;:::i;:::-;20798:72;20866:2;20855:9;20851:18;20842:6;20798:72;:::i;:::-;20917:9;20911:4;20907:20;20902:2;20891:9;20887:18;20880:48;20945:118;21058:4;21049:6;21041;20945:118;:::i;:::-;20937:126;;21110:9;21104:4;21100:20;21095:2;21084:9;21080:18;21073:48;21138:118;21251:4;21242:6;21234;21138:118;:::i;:::-;21130:126;;21304:9;21298:4;21294:20;21288:3;21277:9;21273:19;21266:49;21332:130;21457:4;21332:130;:::i;:::-;21324:138;;20268:1201;;;;;;;;;:::o;21475:748::-;21724:4;21762:3;21751:9;21747:19;21739:27;;21776:71;21844:1;21833:9;21829:17;21820:6;21776:71;:::i;:::-;21857:72;21925:2;21914:9;21910:18;21901:6;21857:72;:::i;:::-;21939;22007:2;21996:9;21992:18;21983:6;21939:72;:::i;:::-;22058:9;22052:4;22048:20;22043:2;22032:9;22028:18;22021:48;22086:130;22211:4;22086:130;:::i;:::-;22078:138;;21475:748;;;;;;:::o;22229:859::-;22506:4;22544:3;22533:9;22529:19;22521:27;;22558:71;22626:1;22615:9;22611:17;22602:6;22558:71;:::i;:::-;22639:72;22707:2;22696:9;22692:18;22683:6;22639:72;:::i;:::-;22721;22789:2;22778:9;22774:18;22765:6;22721:72;:::i;:::-;22803;22871:2;22860:9;22856:18;22847:6;22803:72;:::i;:::-;22923:9;22917:4;22913:20;22907:3;22896:9;22892:19;22885:49;22951:130;23076:4;22951:130;:::i;:::-;22943:138;;22229:859;;;;;;;:::o;23094:210::-;23181:4;23219:2;23208:9;23204:18;23196:26;;23232:65;23294:1;23283:9;23279:17;23270:6;23232:65;:::i;:::-;23094:210;;;;:::o;23310:218::-;23401:4;23439:2;23428:9;23424:18;23416:26;;23452:69;23518:1;23507:9;23503:17;23494:6;23452:69;:::i;:::-;23310:218;;;;:::o;23534:419::-;23700:4;23738:2;23727:9;23723:18;23715:26;;23787:9;23781:4;23777:20;23773:1;23762:9;23758:17;23751:47;23815:131;23941:4;23815:131;:::i;:::-;23807:139;;23534:419;;;:::o;23959:::-;24125:4;24163:2;24152:9;24148:18;24140:26;;24212:9;24206:4;24202:20;24198:1;24187:9;24183:17;24176:47;24240:131;24366:4;24240:131;:::i;:::-;24232:139;;23959:419;;;:::o;24384:::-;24550:4;24588:2;24577:9;24573:18;24565:26;;24637:9;24631:4;24627:20;24623:1;24612:9;24608:17;24601:47;24665:131;24791:4;24665:131;:::i;:::-;24657:139;;24384:419;;;:::o;24809:::-;24975:4;25013:2;25002:9;24998:18;24990:26;;25062:9;25056:4;25052:20;25048:1;25037:9;25033:17;25026:47;25090:131;25216:4;25090:131;:::i;:::-;25082:139;;24809:419;;;:::o;25234:::-;25400:4;25438:2;25427:9;25423:18;25415:26;;25487:9;25481:4;25477:20;25473:1;25462:9;25458:17;25451:47;25515:131;25641:4;25515:131;:::i;:::-;25507:139;;25234:419;;;:::o;25659:::-;25825:4;25863:2;25852:9;25848:18;25840:26;;25912:9;25906:4;25902:20;25898:1;25887:9;25883:17;25876:47;25940:131;26066:4;25940:131;:::i;:::-;25932:139;;25659:419;;;:::o;26084:::-;26250:4;26288:2;26277:9;26273:18;26265:26;;26337:9;26331:4;26327:20;26323:1;26312:9;26308:17;26301:47;26365:131;26491:4;26365:131;:::i;:::-;26357:139;;26084:419;;;:::o;26509:::-;26675:4;26713:2;26702:9;26698:18;26690:26;;26762:9;26756:4;26752:20;26748:1;26737:9;26733:17;26726:47;26790:131;26916:4;26790:131;:::i;:::-;26782:139;;26509:419;;;:::o;26934:::-;27100:4;27138:2;27127:9;27123:18;27115:26;;27187:9;27181:4;27177:20;27173:1;27162:9;27158:17;27151:47;27215:131;27341:4;27215:131;:::i;:::-;27207:139;;26934:419;;;:::o;27359:::-;27525:4;27563:2;27552:9;27548:18;27540:26;;27612:9;27606:4;27602:20;27598:1;27587:9;27583:17;27576:47;27640:131;27766:4;27640:131;:::i;:::-;27632:139;;27359:419;;;:::o;27784:::-;27950:4;27988:2;27977:9;27973:18;27965:26;;28037:9;28031:4;28027:20;28023:1;28012:9;28008:17;28001:47;28065:131;28191:4;28065:131;:::i;:::-;28057:139;;27784:419;;;:::o;28209:::-;28375:4;28413:2;28402:9;28398:18;28390:26;;28462:9;28456:4;28452:20;28448:1;28437:9;28433:17;28426:47;28490:131;28616:4;28490:131;:::i;:::-;28482:139;;28209:419;;;:::o;28634:::-;28800:4;28838:2;28827:9;28823:18;28815:26;;28887:9;28881:4;28877:20;28873:1;28862:9;28858:17;28851:47;28915:131;29041:4;28915:131;:::i;:::-;28907:139;;28634:419;;;:::o;29059:::-;29225:4;29263:2;29252:9;29248:18;29240:26;;29312:9;29306:4;29302:20;29298:1;29287:9;29283:17;29276:47;29340:131;29466:4;29340:131;:::i;:::-;29332:139;;29059:419;;;:::o;29484:::-;29650:4;29688:2;29677:9;29673:18;29665:26;;29737:9;29731:4;29727:20;29723:1;29712:9;29708:17;29701:47;29765:131;29891:4;29765:131;:::i;:::-;29757:139;;29484:419;;;:::o;29909:::-;30075:4;30113:2;30102:9;30098:18;30090:26;;30162:9;30156:4;30152:20;30148:1;30137:9;30133:17;30126:47;30190:131;30316:4;30190:131;:::i;:::-;30182:139;;29909:419;;;:::o;30415:184::-;30514:11;30548:6;30543:3;30536:19;30588:4;30583:3;30579:14;30564:29;;30415:184;;;;:::o;30605:163::-;30722:11;30759:3;30744:18;;30605:163;;;;:::o;30774:168::-;30857:11;30891:6;30886:3;30879:19;30931:4;30926:3;30922:14;30907:29;;30774:168;;;;:::o;30948:169::-;31032:11;31066:6;31061:3;31054:19;31106:4;31101:3;31097:14;31082:29;;30948:169;;;;:::o;31123:96::-;31160:7;31189:24;31207:5;31189:24;:::i;:::-;31178:35;;31123:96;;;:::o;31225:90::-;31259:7;31302:5;31295:13;31288:21;31277:32;;31225:90;;;:::o;31321:149::-;31357:7;31397:66;31390:5;31386:78;31375:89;;31321:149;;;:::o;31476:126::-;31513:7;31553:42;31546:5;31542:54;31531:65;;31476:126;;;:::o;31608:77::-;31645:7;31674:5;31663:16;;31608:77;;;:::o;31691:154::-;31775:6;31770:3;31765;31752:30;31837:1;31828:6;31823:3;31819:16;31812:27;31691:154;;;:::o;31851:233::-;31890:3;31913:24;31931:5;31913:24;:::i;:::-;31904:33;;31959:66;31952:5;31949:77;31946:103;;;32029:18;;:::i;:::-;31946:103;32076:1;32069:5;32065:13;32058:20;;31851:233;;;:::o;32090:180::-;32138:77;32135:1;32128:88;32235:4;32232:1;32225:15;32259:4;32256:1;32249:15;32276:180;32324:77;32321:1;32314:88;32421:4;32418:1;32411:15;32445:4;32442:1;32435:15;32462:117;32571:1;32568;32561:12;32585:117;32694:1;32691;32684:12;32708:117;32817:1;32814;32807:12;32831:117;32940:1;32937;32930:12;32954:117;33063:1;33060;33053:12;33077:117;33186:1;33183;33176:12;33200:225;33340:34;33336:1;33328:6;33324:14;33317:58;33409:8;33404:2;33396:6;33392:15;33385:33;33200:225;:::o;33431:229::-;33571:34;33567:1;33559:6;33555:14;33548:58;33640:12;33635:2;33627:6;33623:15;33616:37;33431:229;:::o;33666:240::-;33806:34;33802:1;33794:6;33790:14;33783:58;33875:23;33870:2;33862:6;33858:15;33851:48;33666:240;:::o;33912:233::-;34052:34;34048:1;34040:6;34036:14;34029:58;34121:16;34116:2;34108:6;34104:15;34097:41;33912:233;:::o;34151:235::-;34291:34;34287:1;34279:6;34275:14;34268:58;34360:18;34355:2;34347:6;34343:15;34336:43;34151:235;:::o;34392:228::-;34532:34;34528:1;34520:6;34516:14;34509:58;34601:11;34596:2;34588:6;34584:15;34577:36;34392:228;:::o;34626:291::-;34766:34;34762:1;34754:6;34750:14;34743:58;34835:34;34830:2;34822:6;34818:15;34811:59;34904:5;34899:2;34891:6;34887:15;34880:30;34626:291;:::o;34923:290::-;35063:34;35059:1;35051:6;35047:14;35040:58;35132:34;35127:2;35119:6;35115:15;35108:59;35201:4;35196:2;35188:6;35184:15;35177:29;34923:290;:::o;35219:236::-;35359:34;35355:1;35347:6;35343:14;35336:58;35428:19;35423:2;35415:6;35411:15;35404:44;35219:236;:::o;35461:222::-;35601:34;35597:1;35589:6;35585:14;35578:58;35670:5;35665:2;35657:6;35653:15;35646:30;35461:222;:::o;35689:182::-;35829:34;35825:1;35817:6;35813:14;35806:58;35689:182;:::o;35877:233::-;36017:34;36013:1;36005:6;36001:14;35994:58;36086:16;36081:2;36073:6;36069:15;36062:41;35877:233;:::o;36116:114::-;;:::o;36236:230::-;36376:34;36372:1;36364:6;36360:14;36353:58;36445:13;36440:2;36432:6;36428:15;36421:38;36236:230;:::o;36472:234::-;36612:34;36608:1;36600:6;36596:14;36589:58;36681:17;36676:2;36668:6;36664:15;36657:42;36472:234;:::o;36712:230::-;36852:34;36848:1;36840:6;36836:14;36829:58;36921:13;36916:2;36908:6;36904:15;36897:38;36712:230;:::o;36948:233::-;37088:34;37084:1;37076:6;37072:14;37065:58;37157:16;37152:2;37144:6;37140:15;37133:41;36948:233;:::o;37187:122::-;37260:24;37278:5;37260:24;:::i;:::-;37253:5;37250:35;37240:63;;37299:1;37296;37289:12;37240:63;37187:122;:::o;37315:120::-;37387:23;37404:5;37387:23;:::i;:::-;37380:5;37377:34;37367:62;;37425:1;37422;37415:12;37367:62;37315:120;:::o;37441:122::-;37514:24;37532:5;37514:24;:::i;:::-;37507:5;37504:35;37494:63;;37553:1;37550;37543:12;37494:63;37441:122;:::o
Swarm Source
ipfs://027935ab32f465578aaf9d92d2bfdaeb29ccacf1075f6cfbf2b255b990b8a84a
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.