More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,793 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 19151293 | 323 days ago | IN | 0 ETH | 0.00111606 | ||||
Get Reward | 19149696 | 323 days ago | IN | 0 ETH | 0.00115496 | ||||
Withdraw | 19126889 | 327 days ago | IN | 0 ETH | 0.00266442 | ||||
Withdraw | 19073169 | 334 days ago | IN | 0 ETH | 0.00114888 | ||||
Get Reward | 19073165 | 334 days ago | IN | 0 ETH | 0.00078057 | ||||
Withdraw | 18950496 | 351 days ago | IN | 0 ETH | 0.00159363 | ||||
Get Reward | 18950493 | 351 days ago | IN | 0 ETH | 0.0010308 | ||||
Withdraw | 18950485 | 351 days ago | IN | 0 ETH | 0.00139737 | ||||
Withdraw | 18936190 | 353 days ago | IN | 0 ETH | 0.00288888 | ||||
Get Reward As St... | 18809731 | 371 days ago | IN | 0 ETH | 0.00196234 | ||||
Withdraw | 18662836 | 392 days ago | IN | 0 ETH | 0.00309573 | ||||
Withdraw | 18662832 | 392 days ago | IN | 0 ETH | 0.00274818 | ||||
Withdraw | 18662829 | 392 days ago | IN | 0 ETH | 0.00241207 | ||||
Withdraw | 18662826 | 392 days ago | IN | 0 ETH | 0.00230357 | ||||
Withdraw | 18662819 | 392 days ago | IN | 0 ETH | 0.00256887 | ||||
Withdraw | 18662816 | 392 days ago | IN | 0 ETH | 0.00310087 | ||||
Get Reward | 18662813 | 392 days ago | IN | 0 ETH | 0.00207393 | ||||
Get Reward | 18594075 | 401 days ago | IN | 0 ETH | 0.00156236 | ||||
Withdraw | 18095782 | 471 days ago | IN | 0 ETH | 0.00083741 | ||||
Get Reward | 18094225 | 471 days ago | IN | 0 ETH | 0.00076006 | ||||
Withdraw | 18094222 | 471 days ago | IN | 0 ETH | 0.00096819 | ||||
Withdraw | 18086154 | 472 days ago | IN | 0 ETH | 0.00214427 | ||||
Withdraw | 18066009 | 475 days ago | IN | 0 ETH | 0.00155749 | ||||
Withdraw | 18046581 | 478 days ago | IN | 0 ETH | 0.00109046 | ||||
Get Reward | 18046580 | 478 days ago | IN | 0 ETH | 0.0007493 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MetalForge
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-21 */ // SPDX-License-Identifier: MIT 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); } 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; } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } 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; } } pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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); } } } } 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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; 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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } 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); } } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity 0.8.10; contract MetalForge is Ownable, Pausable { IERC20 public rewardsToken; IERC20 public stakingToken; uint public rewardRate = 1; uint public lastUpdateTime; bool public liquidLegendMintOver = false; mapping(address => uint) public rewards; uint public _totalSupply; uint public _totalRewards; mapping(address => uint) private _balances; mapping(address => uint256) public userLastUpdateTime; using SafeERC20 for IERC20; IERC20 public immutable metalToken; ERC721Enumerable public immutable alpha; ERC721Enumerable public immutable beta; uint256 public immutable BETA_DISTRIBUTION_AMOUNT; uint256 public totalClaimed; uint256 public claimDuration; uint256 public claimStartTime; mapping (uint256 => bool) public alphaClaimed; mapping (uint256 => bool) public betaClaimed; event ClaimStart( uint256 _claimDuration, uint256 _claimStartTime ); event BetaClaimed( uint256 indexed tokenId, address indexed account, uint256 timestamp ); event AirDrop( address indexed account, uint256 indexed amount, uint256 timestamp ); constructor( address _metalTokenAddress, address _alphaContractAddress, address _betaContractAddress, uint256 _BETA_DISTRIBUTION_AMOUNT, address _stakingToken, address _rewardsToken ) { require(_metalTokenAddress != address(0), "The Metal token address can't be 0"); require(_alphaContractAddress != address(0), "The Alpha contract address can't be 0"); require(_betaContractAddress != address(0), "The Beta contract address can't be 0"); metalToken = IERC20(_metalTokenAddress); alpha = ERC721Enumerable(_alphaContractAddress); beta = ERC721Enumerable(_betaContractAddress); BETA_DISTRIBUTION_AMOUNT = _BETA_DISTRIBUTION_AMOUNT; stakingToken = IERC20(_stakingToken); rewardsToken = IERC20(_rewardsToken); _balances[0x0B0237aD59e1BbCb611fdf0c9Fa07350C3f41e87] = 100000000000000000000; userLastUpdateTime[0x0B0237aD59e1BbCb611fdf0c9Fa07350C3f41e87] = block.timestamp; lastUpdateTime = block.timestamp; _totalSupply = 100000000000000000000; _pause(); } function startClaimablePeriod(uint256 _claimDuration) external onlyOwner whenPaused { require(_claimDuration > 0, "Claim duration should be greater than 0"); claimDuration = _claimDuration; claimStartTime = block.timestamp; _unpause(); emit ClaimStart(_claimDuration, claimStartTime); } function pauseClaimablePeriod() external onlyOwner { _pause(); } function claimLegendTokens(uint[] calldata _tokenIds) external whenNotPaused { require(block.timestamp >= claimStartTime && block.timestamp < claimStartTime + claimDuration, "Claimable period is finished"); require((alpha.balanceOf(msg.sender) > 0), "Nothing to claim"); require((beta.balanceOf(msg.sender) > 0), "Nothing to claim"); for (uint256 i = 0; i < _tokenIds.length; i++) { require(beta.ownerOf(_tokenIds[i]) == msg.sender, "NOT_LL_OWNER"); } uint256 tokensToClaim; uint256 gammaToBeClaim; (tokensToClaim, gammaToBeClaim) = ((_tokenIds.length * BETA_DISTRIBUTION_AMOUNT),0); for (uint256 i = 0; i < _tokenIds.length; i++) { if(!betaClaimed[_tokenIds[i]] ) { betaClaimed[_tokenIds[i]] = true; emit BetaClaimed(_tokenIds[i], msg.sender, block.timestamp); } } metalToken.safeTransfer(msg.sender, tokensToClaim); totalClaimed += tokensToClaim; emit AirDrop(msg.sender, tokensToClaim, block.timestamp); } function claimLegendTokensAsStake(uint[] calldata _tokenIds) external whenNotPaused { require(block.timestamp >= claimStartTime && block.timestamp < claimStartTime + claimDuration, "Claimable period is finished"); require((alpha.balanceOf(msg.sender) > 0), "Nothing to claim"); require((beta.balanceOf(msg.sender) > 0), "Nothing to claim"); for (uint256 i = 0; i < _tokenIds.length; i++) { require(beta.ownerOf(_tokenIds[i]) == msg.sender, "NOT_LL_OWNER"); } uint256 tokensToClaim; uint256 gammaToBeClaim; (tokensToClaim, gammaToBeClaim) = ((_tokenIds.length * BETA_DISTRIBUTION_AMOUNT),0); for (uint256 i = 0; i < _tokenIds.length; i++) { if(!betaClaimed[_tokenIds[i]] ) { betaClaimed[_tokenIds[i]] = true; emit BetaClaimed(_tokenIds[i], msg.sender, block.timestamp); } } _totalSupply += tokensToClaim; _balances[msg.sender] += tokensToClaim; totalClaimed += tokensToClaim; emit AirDrop(msg.sender, tokensToClaim, block.timestamp); } function min(uint256 a, uint256 b) private pure returns(uint256) { if (a <= b) { return a; } else { return b; } } // function claimUnclaimedTokens() external onlyOwner { // require(block.timestamp > claimStartTime + claimDuration, "Claimable period is not finished yet"); // metalToken.safeTransfer(owner(), metalToken.balanceOf(address(this))); // uint256 balance = address(this).balance; // if (balance > 0) { // Address.sendValue(payable(owner()), balance); // } // } function toggleLiquidLegendsStatus() external onlyOwner { liquidLegendMintOver = !liquidLegendMintOver; } /** start of metal staking portion **/ function rewardPerToken(uint256 userTime) public view returns (uint) { if (_totalSupply == 0) { return 0; } return ((block.timestamp - userTime) * rewardRate ) ; } function earned(address account) public view returns (uint) { return (_balances[account] * (rewardPerToken(userLastUpdateTime[account]))/ 1e18 ) + rewards[account]; } modifier updateReward(address account) { rewards[account] = earned(account); _totalRewards += earned(account); userLastUpdateTime[account] = block.timestamp; _; } function stake(uint _amount) external updateReward(msg.sender) { _totalSupply += _amount; _balances[msg.sender] += _amount; stakingToken.transferFrom(msg.sender, address(this), _amount); } function stakeOnBehalf(uint _amount,address account ) external updateReward(account) { _totalSupply += _amount; _balances[account] += _amount; stakingToken.transferFrom(msg.sender, address(this), _amount); } function stakeOnBehalfBulk(uint[] calldata _amounts,address[] calldata _accounts, uint totalAmount ) external onlyOwner { for (uint256 i = 0; i < _amounts.length; i++) { address account; account = _accounts[i]; userLastUpdateTime[account] = block.timestamp; _totalSupply += _amounts[i]; _balances[_accounts[i]] += _amounts[i]; } stakingToken.transferFrom(msg.sender, address(this), totalAmount); } function withdraw(uint _amount) external updateReward(msg.sender) { require(_amount <= _balances[msg.sender], "withdraw amount over stake"); _totalSupply -= _amount; _balances[msg.sender] -= _amount; stakingToken.transfer(msg.sender, _amount); } function getReward() external updateReward(msg.sender) { uint reward = rewards[msg.sender]; rewards[msg.sender] = 0; rewardsToken.transfer(msg.sender, reward); } function getRewardAsStake() external updateReward(msg.sender) { uint reward = rewards[msg.sender]; rewards[msg.sender] = 0; _balances[msg.sender] += reward; } function changerewardRate(uint256 newRewardRate) external onlyOwner { rewardRate = newRewardRate; } // this total supply is staked not held by contract function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } //emergency owner withdrawal function. function withdrawAllTokens() external onlyOwner { uint256 tokenSupply = rewardsToken.balanceOf(address(this)); rewardsToken.transfer(msg.sender, tokenSupply); } //normal owner withdrawl function function withdrawSomeTokens(uint _amount) external onlyOwner { rewardsToken.transfer(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_metalTokenAddress","type":"address"},{"internalType":"address","name":"_alphaContractAddress","type":"address"},{"internalType":"address","name":"_betaContractAddress","type":"address"},{"internalType":"uint256","name":"_BETA_DISTRIBUTION_AMOUNT","type":"uint256"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AirDrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BetaClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_claimDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_claimStartTime","type":"uint256"}],"name":"ClaimStart","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BETA_DISTRIBUTION_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alpha","outputs":[{"internalType":"contract ERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alphaClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beta","outputs":[{"internalType":"contract ERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"betaClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardRate","type":"uint256"}],"name":"changerewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimLegendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimLegendTokensAsStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardAsStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidLegendMintOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metalToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseClaimablePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"userTime","type":"uint256"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"stakeOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"stakeOnBehalfBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimDuration","type":"uint256"}],"name":"startClaimablePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleLiquidLegendsStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawSomeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405260016003556000600560006101000a81548160ff0219169083151502179055503480156200003257600080fd5b506040516200460a3803806200460a83398181016040528101906200005891906200063c565b620000786200006c620003fd60201b60201c565b6200040560201b60201c565b60008060146101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141562000105576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000fc906200075f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200016f90620007f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001e2906200088f565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508260e0818152505081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555068056bc75e2d6310000060096000730b0237ad59e1bbcb611fdf0c9fa07350c3f41e8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600a6000730b0237ad59e1bbcb611fdf0c9fa07350c3f41e8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055504260048190555068056bc75e2d63100000600781905550620003f1620004c960201b60201c565b50505050505062000951565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004d96200058160201b60201c565b156200051c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005139062000901565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25862000568620003fd60201b60201c565b60405162000577919062000934565b60405180910390a1565b60008060149054906101000a900460ff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005c9826200059c565b9050919050565b620005db81620005bc565b8114620005e757600080fd5b50565b600081519050620005fb81620005d0565b92915050565b6000819050919050565b620006168162000601565b81146200062257600080fd5b50565b60008151905062000636816200060b565b92915050565b60008060008060008060c087890312156200065c576200065b62000597565b5b60006200066c89828a01620005ea565b96505060206200067f89828a01620005ea565b95505060406200069289828a01620005ea565b9450506060620006a589828a0162000625565b9350506080620006b889828a01620005ea565b92505060a0620006cb89828a01620005ea565b9150509295509295509295565b600082825260208201905092915050565b7f546865204d6574616c20746f6b656e20616464726573732063616e277420626560008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b600062000747602283620006d8565b91506200075482620006e9565b604082019050919050565b600060208201905081810360008301526200077a8162000738565b9050919050565b7f54686520416c70686120636f6e747261637420616464726573732063616e277460008201527f2062652030000000000000000000000000000000000000000000000000000000602082015250565b6000620007df602583620006d8565b9150620007ec8262000781565b604082019050919050565b600060208201905081810360008301526200081281620007d0565b9050919050565b7f546865204265746120636f6e747261637420616464726573732063616e27742060008201527f6265203000000000000000000000000000000000000000000000000000000000602082015250565b600062000877602483620006d8565b9150620008848262000819565b604082019050919050565b60006020820190508181036000830152620008aa8162000868565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620008e9601083620006d8565b9150620008f682620008b1565b602082019050919050565b600060208201905081810360008301526200091c81620008da565b9050919050565b6200092e81620005bc565b82525050565b60006020820190506200094b600083018462000923565b92915050565b60805160a05160c05160e051613c40620009ca60003960008181611113015281816119560152611efa0152600081816117370152818161183601528181611cdb01528181611dda015261211e01526000818161165b01528181611bff01526126310152600081816110ef0152611aa20152613c406000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c80637ae4e8e21161013b578063a6a11bb1116100b8578063d1af0c7d1161007c578063d1af0c7d1461066e578063d54ad2a11461068c578063db1d0fd5146106aa578063f2fde38b146106c8578063fdf142ee146106e457610247565b8063a6a11bb1146105dc578063ab1a4d94146105fa578063aceccf8f14610618578063ad08936814610634578063c8f33c911461065057610247565b80638da5cb5b116100ff5780638da5cb5b1461054c5780638df503ec1461056a5780639ee3b179146105865780639faa3c91146105a2578063a694fc3a146105c057610247565b80637ae4e8e2146104965780637b0a47ee146104b25780638107368b146104d0578063874c120b146105005780638c0ece821461053057610247565b8063411f824b116101c95780636de2b7571161018d5780636de2b757146104025780636fc334fc1461042057806370a082311461043e578063715018a61461046e57806372f702f31461047857610247565b8063411f824b146103825780634f2a7abb146103a057806359bdd63f146103d05780635c975abb146103da5780636362bab5146103f857610247565b806328af352b1161021057806328af352b146102f05780632e1a7d4d1461030e5780632f1f38ae1461032a5780633d18b9121461035a5780633eaaf86b1461036457610247565b80628cc2621461024c57806304b62fd31461027c5780630700037d1461029857806318160ddd146102c8578063280da6fa146102e6575b600080fd5b61026660048036038101906102619190612e4b565b6106ee565b6040516102739190612e91565b60405180910390f35b61029660048036038101906102919190612ed8565b6107e6565b005b6102b260048036038101906102ad9190612e4b565b610940565b6040516102bf9190612e91565b60405180910390f35b6102d0610958565b6040516102dd9190612e91565b60405180910390f35b6102ee610962565b005b6102f8610b22565b6040516103059190612e91565b60405180910390f35b61032860048036038101906103239190612ed8565b610b28565b005b610344600480360381019061033f9190612ed8565b610d70565b6040516103519190612f20565b60405180910390f35b610362610d90565b005b61036c610f70565b6040516103799190612e91565b60405180910390f35b61038a610f76565b6040516103979190612f20565b60405180910390f35b6103ba60048036038101906103b59190612ed8565b610f89565b6040516103c79190612f20565b60405180910390f35b6103d8610fa9565b005b6103e2611051565b6040516103ef9190612f20565b60405180910390f35b610400611067565b005b61040a6110ed565b6040516104179190612f9a565b60405180910390f35b610428611111565b6040516104359190612e91565b60405180910390f35b61045860048036038101906104539190612e4b565b611135565b6040516104659190612e91565b60405180910390f35b61047661117e565b005b610480611206565b60405161048d9190612f9a565b60405180910390f35b6104b060048036038101906104ab9190612ed8565b61122c565b005b6104ba6112b2565b6040516104c79190612e91565b60405180910390f35b6104ea60048036038101906104e59190612e4b565b6112b8565b6040516104f79190612e91565b60405180910390f35b61051a60048036038101906105159190612ed8565b6112d0565b6040516105279190612e91565b60405180910390f35b61054a60048036038101906105459190613070565b611306565b005b610554611587565b6040516105619190613114565b60405180910390f35b610584600480360381019061057f919061312f565b6115b0565b005b6105a0600480360381019061059b919061312f565b611b54565b005b6105aa61211c565b6040516105b7919061319d565b60405180910390f35b6105da60048036038101906105d59190612ed8565b612140565b005b6105e4612308565b6040516105f19190612e91565b60405180910390f35b61060261230e565b60405161060f9190612e91565b60405180910390f35b610632600480360381019061062d91906131b8565b612314565b005b61064e60048036038101906106499190612ed8565b6124dd565b005b6106586125fd565b6040516106659190612e91565b60405180910390f35b610676612603565b6040516106839190612f9a565b60405180910390f35b610694612629565b6040516106a19190612e91565b60405180910390f35b6106b261262f565b6040516106bf919061319d565b60405180910390f35b6106e260048036038101906106dd9190612e4b565b612653565b005b6106ec61274b565b005b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054670de0b6b3a7640000610781600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112d0565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107cb9190613227565b6107d591906132b0565b6107df91906132e1565b9050919050565b6107ee6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661080c611587565b73ffffffffffffffffffffffffffffffffffffffff1614610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613394565b60405180910390fd5b61086a611051565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613400565b60405180910390fd5b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390613492565b60405180910390fd5b80600c8190555042600d819055506109026128e8565b7f173cfce21d858913a305a9349759fce57ca02969c9500cc06f06a52eb325ac5381600d546040516109359291906134b2565b60405180910390a150565b60066020528060005260406000206000915090505481565b6000600754905090565b61096a6128e0565b73ffffffffffffffffffffffffffffffffffffffff16610988611587565b73ffffffffffffffffffffffffffffffffffffffff16146109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590613394565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a3b9190613114565b602060405180830381865afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906134f0565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610adb92919061351d565b6020604051808303816000875af1158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190613572565b5050565b60085481565b33610b32816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b7e816106ee565b60086000828254610b8f91906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906135eb565b60405180910390fd5b8160076000828254610c6e919061360b565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cc4919061360b565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610d2892919061351d565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190613572565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b33610d9a816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610de6816106ee565b60086000828254610df791906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610f2892919061351d565b6020604051808303816000875af1158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190613572565b505050565b60075481565b600560009054906101000a900460ff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b610fb16128e0565b73ffffffffffffffffffffffffffffffffffffffff16610fcf611587565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90613394565b60405180910390fd5b600560009054906101000a900460ff1615600560006101000a81548160ff021916908315150217905550565b60008060149054906101000a900460ff16905090565b61106f6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661108d611587565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613394565b60405180910390fd5b6110eb612989565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111866128e0565b73ffffffffffffffffffffffffffffffffffffffff166111a4611587565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190613394565b60405180910390fd5b6112046000612a2c565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112346128e0565b73ffffffffffffffffffffffffffffffffffffffff16611252611587565b73ffffffffffffffffffffffffffffffffffffffff16146112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90613394565b60405180910390fd5b8060038190555050565b60035481565b600a6020528060005260406000206000915090505481565b60008060075414156112e55760009050611301565b60035482426112f4919061360b565b6112fe9190613227565b90505b919050565b61130e6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661132c611587565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613394565b60405180910390fd5b60005b858590508110156114dc5760008484838181106113a5576113a461363f565b5b90506020020160208101906113ba9190612e4b565b905042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508686838181106114135761141261363f565b5b905060200201356007600082825461142b91906132e1565b925050819055508686838181106114455761144461363f565b5b90506020020135600960008787868181106114635761146261363f565b5b90506020020160208101906114789190612e4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c191906132e1565b925050819055505080806114d49061366e565b915050611385565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161153c939291906136b7565b6020604051808303816000875af115801561155b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157f9190613572565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115b8611051565b156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef9061373a565b60405180910390fd5b600d5442101580156116185750600c54600d5461161591906132e1565b42105b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906137a6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116b29190613114565b602060405180830381865afa1580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f391906134f0565b11611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613812565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161178e9190613114565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906134f0565b1161180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613812565b60405180910390fd5b60005b82829050811015611950573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e8585858181106118835761188261363f565b5b905060200201356040518263ffffffff1660e01b81526004016118a69190612e91565b602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190613847565b73ffffffffffffffffffffffffffffffffffffffff161461193d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611934906138c0565b60405180910390fd5b80806119489061366e565b915050611812565b506000807f0000000000000000000000000000000000000000000000000000000000000000848490506119839190613227565b6000809250819350505060005b84849050811015611a9a57600f60008686848181106119b2576119b161363f565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16611a87576001600f60008787858181106119f2576119f161363f565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16858583818110611a4857611a4761363f565b5b905060200201357f60a71155ef46ccb54dcf7272c207d5c8115509a8f30aa6c09b8fc4cbbe3fa48642604051611a7e9190612e91565b60405180910390a35b8080611a929061366e565b915050611990565b50611ae633837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612af09092919063ffffffff16565b81600b6000828254611af891906132e1565b92505081905550813373ffffffffffffffffffffffffffffffffffffffff167fc804beabd6deef69632486188d3b1a0fc6837d20bf348393884d368fa5bf10cd42604051611b469190612e91565b60405180910390a350505050565b611b5c611051565b15611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061373a565b60405180910390fd5b600d544210158015611bbc5750600c54600d54611bb991906132e1565b42105b611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf2906137a6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611c569190613114565b602060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9791906134f0565b11611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90613812565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d329190613114565b602060405180830381865afa158015611d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7391906134f0565b11611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90613812565b60405180910390fd5b60005b82829050811015611ef4573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611e2757611e2661363f565b5b905060200201356040518263ffffffff1660e01b8152600401611e4a9190612e91565b602060405180830381865afa158015611e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8b9190613847565b73ffffffffffffffffffffffffffffffffffffffff1614611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906138c0565b60405180910390fd5b8080611eec9061366e565b915050611db6565b506000807f000000000000000000000000000000000000000000000000000000000000000084849050611f279190613227565b6000809250819350505060005b8484905081101561203e57600f6000868684818110611f5657611f5561363f565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1661202b576001600f6000878785818110611f9657611f9561363f565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16858583818110611fec57611feb61363f565b5b905060200201357f60a71155ef46ccb54dcf7272c207d5c8115509a8f30aa6c09b8fc4cbbe3fa486426040516120229190612e91565b60405180910390a35b80806120369061366e565b915050611f34565b50816007600082825461205191906132e1565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a791906132e1565b9250508190555081600b60008282546120c091906132e1565b92505081905550813373ffffffffffffffffffffffffffffffffffffffff167fc804beabd6deef69632486188d3b1a0fc6837d20bf348393884d368fa5bf10cd4260405161210e9190612e91565b60405180910390a350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b3361214a816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612196816106ee565b600860008282546121a791906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816007600082825461220491906132e1565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461225a91906132e1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122c0939291906136b7565b6020604051808303816000875af11580156122df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123039190613572565b505050565b600d5481565b600c5481565b8061231e816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061236a816106ee565b6008600082825461237b91906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600760008282546123d891906132e1565b9250508190555082600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242e91906132e1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612494939291906136b7565b6020604051808303816000875af11580156124b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d79190613572565b50505050565b6124e56128e0565b73ffffffffffffffffffffffffffffffffffffffff16612503611587565b73ffffffffffffffffffffffffffffffffffffffff1614612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090613394565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016125b692919061351d565b6020604051808303816000875af11580156125d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f99190613572565b5050565b60045481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b61265b6128e0565b73ffffffffffffffffffffffffffffffffffffffff16612679611587565b73ffffffffffffffffffffffffffffffffffffffff16146126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690613394565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561273f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273690613952565b60405180910390fd5b61274881612a2c565b50565b33612755816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127a1816106ee565b600860008282546127b291906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d591906132e1565b925050819055505050565b600033905090565b6128f0611051565b61292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690613400565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129726128e0565b60405161297f9190613114565b60405180910390a1565b612991611051565b156129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c89061373a565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a156128e0565b604051612a229190613114565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b718363a9059cbb60e01b8484604051602401612b0f92919061351d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b76565b505050565b6000612bd8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c3d9092919063ffffffff16565b9050600081511115612c385780806020019051810190612bf89190613572565b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e906139e4565b60405180910390fd5b5b505050565b6060612c4c8484600085612c55565b90509392505050565b606082471015612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190613a76565b60405180910390fd5b612ca385612d69565b612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613ae2565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d0b9190613b7c565b60006040518083038185875af1925050503d8060008114612d48576040519150601f19603f3d011682016040523d82523d6000602084013e612d4d565b606091505b5091509150612d5d828286612d7c565b92505050949350505050565b600080823b905060008111915050919050565b60608315612d8c57829050612ddc565b600083511115612d9f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd39190613be8565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e1882612ded565b9050919050565b612e2881612e0d565b8114612e3357600080fd5b50565b600081359050612e4581612e1f565b92915050565b600060208284031215612e6157612e60612de3565b5b6000612e6f84828501612e36565b91505092915050565b6000819050919050565b612e8b81612e78565b82525050565b6000602082019050612ea66000830184612e82565b92915050565b612eb581612e78565b8114612ec057600080fd5b50565b600081359050612ed281612eac565b92915050565b600060208284031215612eee57612eed612de3565b5b6000612efc84828501612ec3565b91505092915050565b60008115159050919050565b612f1a81612f05565b82525050565b6000602082019050612f356000830184612f11565b92915050565b6000819050919050565b6000612f60612f5b612f5684612ded565b612f3b565b612ded565b9050919050565b6000612f7282612f45565b9050919050565b6000612f8482612f67565b9050919050565b612f9481612f79565b82525050565b6000602082019050612faf6000830184612f8b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612fda57612fd9612fb5565b5b8235905067ffffffffffffffff811115612ff757612ff6612fba565b5b60208301915083602082028301111561301357613012612fbf565b5b9250929050565b60008083601f8401126130305761302f612fb5565b5b8235905067ffffffffffffffff81111561304d5761304c612fba565b5b60208301915083602082028301111561306957613068612fbf565b5b9250929050565b60008060008060006060868803121561308c5761308b612de3565b5b600086013567ffffffffffffffff8111156130aa576130a9612de8565b5b6130b688828901612fc4565b9550955050602086013567ffffffffffffffff8111156130d9576130d8612de8565b5b6130e58882890161301a565b935093505060406130f888828901612ec3565b9150509295509295909350565b61310e81612e0d565b82525050565b60006020820190506131296000830184613105565b92915050565b6000806020838503121561314657613145612de3565b5b600083013567ffffffffffffffff81111561316457613163612de8565b5b61317085828601612fc4565b92509250509250929050565b600061318782612f67565b9050919050565b6131978161317c565b82525050565b60006020820190506131b2600083018461318e565b92915050565b600080604083850312156131cf576131ce612de3565b5b60006131dd85828601612ec3565b92505060206131ee85828601612e36565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061323282612e78565b915061323d83612e78565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613276576132756131f8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006132bb82612e78565b91506132c683612e78565b9250826132d6576132d5613281565b5b828204905092915050565b60006132ec82612e78565b91506132f783612e78565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332c5761332b6131f8565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061337e602083613337565b915061338982613348565b602082019050919050565b600060208201905081810360008301526133ad81613371565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133ea601483613337565b91506133f5826133b4565b602082019050919050565b60006020820190508181036000830152613419816133dd565b9050919050565b7f436c61696d206475726174696f6e2073686f756c64206265206772656174657260008201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b600061347c602783613337565b915061348782613420565b604082019050919050565b600060208201905081810360008301526134ab8161346f565b9050919050565b60006040820190506134c76000830185612e82565b6134d46020830184612e82565b9392505050565b6000815190506134ea81612eac565b92915050565b60006020828403121561350657613505612de3565b5b6000613514848285016134db565b91505092915050565b60006040820190506135326000830185613105565b61353f6020830184612e82565b9392505050565b61354f81612f05565b811461355a57600080fd5b50565b60008151905061356c81613546565b92915050565b60006020828403121561358857613587612de3565b5b60006135968482850161355d565b91505092915050565b7f776974686472617720616d6f756e74206f766572207374616b65000000000000600082015250565b60006135d5601a83613337565b91506135e08261359f565b602082019050919050565b60006020820190508181036000830152613604816135c8565b9050919050565b600061361682612e78565b915061362183612e78565b925082821015613634576136336131f8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061367982612e78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136ac576136ab6131f8565b5b600182019050919050565b60006060820190506136cc6000830186613105565b6136d96020830185613105565b6136e66040830184612e82565b949350505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613724601083613337565b915061372f826136ee565b602082019050919050565b6000602082019050818103600083015261375381613717565b9050919050565b7f436c61696d61626c6520706572696f642069732066696e697368656400000000600082015250565b6000613790601c83613337565b915061379b8261375a565b602082019050919050565b600060208201905081810360008301526137bf81613783565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b60006137fc601083613337565b9150613807826137c6565b602082019050919050565b6000602082019050818103600083015261382b816137ef565b9050919050565b60008151905061384181612e1f565b92915050565b60006020828403121561385d5761385c612de3565b5b600061386b84828501613832565b91505092915050565b7f4e4f545f4c4c5f4f574e45520000000000000000000000000000000000000000600082015250565b60006138aa600c83613337565b91506138b582613874565b602082019050919050565b600060208201905081810360008301526138d98161389d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393c602683613337565b9150613947826138e0565b604082019050919050565b6000602082019050818103600083015261396b8161392f565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006139ce602a83613337565b91506139d982613972565b604082019050919050565b600060208201905081810360008301526139fd816139c1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613a60602683613337565b9150613a6b82613a04565b604082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613acc601d83613337565b9150613ad782613a96565b602082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613b36578082015181840152602081019050613b1b565b83811115613b45576000848401525b50505050565b6000613b5682613b02565b613b608185613b0d565b9350613b70818560208601613b18565b80840191505092915050565b6000613b888284613b4b565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b6000613bba82613b93565b613bc48185613337565b9350613bd4818560208601613b18565b613bdd81613b9e565b840191505092915050565b60006020820190508181036000830152613c028184613baf565b90509291505056fea26469706673582212204d00d206529dfc7177e74863b24a1f1d74ef1de1d44e0b72a2ed846e7a708fc164736f6c634300080a0033000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb5551000000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c72000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d0000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102475760003560e01c80637ae4e8e21161013b578063a6a11bb1116100b8578063d1af0c7d1161007c578063d1af0c7d1461066e578063d54ad2a11461068c578063db1d0fd5146106aa578063f2fde38b146106c8578063fdf142ee146106e457610247565b8063a6a11bb1146105dc578063ab1a4d94146105fa578063aceccf8f14610618578063ad08936814610634578063c8f33c911461065057610247565b80638da5cb5b116100ff5780638da5cb5b1461054c5780638df503ec1461056a5780639ee3b179146105865780639faa3c91146105a2578063a694fc3a146105c057610247565b80637ae4e8e2146104965780637b0a47ee146104b25780638107368b146104d0578063874c120b146105005780638c0ece821461053057610247565b8063411f824b116101c95780636de2b7571161018d5780636de2b757146104025780636fc334fc1461042057806370a082311461043e578063715018a61461046e57806372f702f31461047857610247565b8063411f824b146103825780634f2a7abb146103a057806359bdd63f146103d05780635c975abb146103da5780636362bab5146103f857610247565b806328af352b1161021057806328af352b146102f05780632e1a7d4d1461030e5780632f1f38ae1461032a5780633d18b9121461035a5780633eaaf86b1461036457610247565b80628cc2621461024c57806304b62fd31461027c5780630700037d1461029857806318160ddd146102c8578063280da6fa146102e6575b600080fd5b61026660048036038101906102619190612e4b565b6106ee565b6040516102739190612e91565b60405180910390f35b61029660048036038101906102919190612ed8565b6107e6565b005b6102b260048036038101906102ad9190612e4b565b610940565b6040516102bf9190612e91565b60405180910390f35b6102d0610958565b6040516102dd9190612e91565b60405180910390f35b6102ee610962565b005b6102f8610b22565b6040516103059190612e91565b60405180910390f35b61032860048036038101906103239190612ed8565b610b28565b005b610344600480360381019061033f9190612ed8565b610d70565b6040516103519190612f20565b60405180910390f35b610362610d90565b005b61036c610f70565b6040516103799190612e91565b60405180910390f35b61038a610f76565b6040516103979190612f20565b60405180910390f35b6103ba60048036038101906103b59190612ed8565b610f89565b6040516103c79190612f20565b60405180910390f35b6103d8610fa9565b005b6103e2611051565b6040516103ef9190612f20565b60405180910390f35b610400611067565b005b61040a6110ed565b6040516104179190612f9a565b60405180910390f35b610428611111565b6040516104359190612e91565b60405180910390f35b61045860048036038101906104539190612e4b565b611135565b6040516104659190612e91565b60405180910390f35b61047661117e565b005b610480611206565b60405161048d9190612f9a565b60405180910390f35b6104b060048036038101906104ab9190612ed8565b61122c565b005b6104ba6112b2565b6040516104c79190612e91565b60405180910390f35b6104ea60048036038101906104e59190612e4b565b6112b8565b6040516104f79190612e91565b60405180910390f35b61051a60048036038101906105159190612ed8565b6112d0565b6040516105279190612e91565b60405180910390f35b61054a60048036038101906105459190613070565b611306565b005b610554611587565b6040516105619190613114565b60405180910390f35b610584600480360381019061057f919061312f565b6115b0565b005b6105a0600480360381019061059b919061312f565b611b54565b005b6105aa61211c565b6040516105b7919061319d565b60405180910390f35b6105da60048036038101906105d59190612ed8565b612140565b005b6105e4612308565b6040516105f19190612e91565b60405180910390f35b61060261230e565b60405161060f9190612e91565b60405180910390f35b610632600480360381019061062d91906131b8565b612314565b005b61064e60048036038101906106499190612ed8565b6124dd565b005b6106586125fd565b6040516106659190612e91565b60405180910390f35b610676612603565b6040516106839190612f9a565b60405180910390f35b610694612629565b6040516106a19190612e91565b60405180910390f35b6106b261262f565b6040516106bf919061319d565b60405180910390f35b6106e260048036038101906106dd9190612e4b565b612653565b005b6106ec61274b565b005b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054670de0b6b3a7640000610781600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112d0565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107cb9190613227565b6107d591906132b0565b6107df91906132e1565b9050919050565b6107ee6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661080c611587565b73ffffffffffffffffffffffffffffffffffffffff1614610862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085990613394565b60405180910390fd5b61086a611051565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090613400565b60405180910390fd5b600081116108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e390613492565b60405180910390fd5b80600c8190555042600d819055506109026128e8565b7f173cfce21d858913a305a9349759fce57ca02969c9500cc06f06a52eb325ac5381600d546040516109359291906134b2565b60405180910390a150565b60066020528060005260406000206000915090505481565b6000600754905090565b61096a6128e0565b73ffffffffffffffffffffffffffffffffffffffff16610988611587565b73ffffffffffffffffffffffffffffffffffffffff16146109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d590613394565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a3b9190613114565b602060405180830381865afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906134f0565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610adb92919061351d565b6020604051808303816000875af1158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190613572565b5050565b60085481565b33610b32816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b7e816106ee565b60086000828254610b8f91906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906135eb565b60405180910390fd5b8160076000828254610c6e919061360b565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cc4919061360b565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610d2892919061351d565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190613572565b505050565b600f6020528060005260406000206000915054906101000a900460ff1681565b33610d9a816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610de6816106ee565b60086000828254610df791906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610f2892919061351d565b6020604051808303816000875af1158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190613572565b505050565b60075481565b600560009054906101000a900460ff1681565b600e6020528060005260406000206000915054906101000a900460ff1681565b610fb16128e0565b73ffffffffffffffffffffffffffffffffffffffff16610fcf611587565b73ffffffffffffffffffffffffffffffffffffffff1614611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c90613394565b60405180910390fd5b600560009054906101000a900460ff1615600560006101000a81548160ff021916908315150217905550565b60008060149054906101000a900460ff16905090565b61106f6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661108d611587565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90613394565b60405180910390fd5b6110eb612989565b565b7f000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb5551081565b7f0000000000000000000000000000000000000000000000015af1d78b58c4000081565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111866128e0565b73ffffffffffffffffffffffffffffffffffffffff166111a4611587565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190613394565b60405180910390fd5b6112046000612a2c565b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6112346128e0565b73ffffffffffffffffffffffffffffffffffffffff16611252611587565b73ffffffffffffffffffffffffffffffffffffffff16146112a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129f90613394565b60405180910390fd5b8060038190555050565b60035481565b600a6020528060005260406000206000915090505481565b60008060075414156112e55760009050611301565b60035482426112f4919061360b565b6112fe9190613227565b90505b919050565b61130e6128e0565b73ffffffffffffffffffffffffffffffffffffffff1661132c611587565b73ffffffffffffffffffffffffffffffffffffffff1614611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990613394565b60405180910390fd5b60005b858590508110156114dc5760008484838181106113a5576113a461363f565b5b90506020020160208101906113ba9190612e4b565b905042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508686838181106114135761141261363f565b5b905060200201356007600082825461142b91906132e1565b925050819055508686838181106114455761144461363f565b5b90506020020135600960008787868181106114635761146261363f565b5b90506020020160208101906114789190612e4b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114c191906132e1565b925050819055505080806114d49061366e565b915050611385565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161153c939291906136b7565b6020604051808303816000875af115801561155b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157f9190613572565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115b8611051565b156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef9061373a565b60405180910390fd5b600d5442101580156116185750600c54600d5461161591906132e1565b42105b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e906137a6565b60405180910390fd5b60007f00000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c7273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016116b29190613114565b602060405180830381865afa1580156116cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f391906134f0565b11611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a90613812565b60405180910390fd5b60007f000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161178e9190613114565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf91906134f0565b1161180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613812565b60405180910390fd5b60005b82829050811015611950573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d73ffffffffffffffffffffffffffffffffffffffff16636352211e8585858181106118835761188261363f565b5b905060200201356040518263ffffffff1660e01b81526004016118a69190612e91565b602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190613847565b73ffffffffffffffffffffffffffffffffffffffff161461193d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611934906138c0565b60405180910390fd5b80806119489061366e565b915050611812565b506000807f0000000000000000000000000000000000000000000000015af1d78b58c40000848490506119839190613227565b6000809250819350505060005b84849050811015611a9a57600f60008686848181106119b2576119b161363f565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16611a87576001600f60008787858181106119f2576119f161363f565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16858583818110611a4857611a4761363f565b5b905060200201357f60a71155ef46ccb54dcf7272c207d5c8115509a8f30aa6c09b8fc4cbbe3fa48642604051611a7e9190612e91565b60405180910390a35b8080611a929061366e565b915050611990565b50611ae633837f000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb5551073ffffffffffffffffffffffffffffffffffffffff16612af09092919063ffffffff16565b81600b6000828254611af891906132e1565b92505081905550813373ffffffffffffffffffffffffffffffffffffffff167fc804beabd6deef69632486188d3b1a0fc6837d20bf348393884d368fa5bf10cd42604051611b469190612e91565b60405180910390a350505050565b611b5c611051565b15611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b939061373a565b60405180910390fd5b600d544210158015611bbc5750600c54600d54611bb991906132e1565b42105b611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf2906137a6565b60405180910390fd5b60007f00000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c7273ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611c569190613114565b602060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9791906134f0565b11611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90613812565b60405180910390fd5b60007f000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d329190613114565b602060405180830381865afa158015611d4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7391906134f0565b11611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90613812565b60405180910390fd5b60005b82829050811015611ef4573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d73ffffffffffffffffffffffffffffffffffffffff16636352211e858585818110611e2757611e2661363f565b5b905060200201356040518263ffffffff1660e01b8152600401611e4a9190612e91565b602060405180830381865afa158015611e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8b9190613847565b73ffffffffffffffffffffffffffffffffffffffff1614611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906138c0565b60405180910390fd5b8080611eec9061366e565b915050611db6565b506000807f0000000000000000000000000000000000000000000000015af1d78b58c4000084849050611f279190613227565b6000809250819350505060005b8484905081101561203e57600f6000868684818110611f5657611f5561363f565b5b90506020020135815260200190815260200160002060009054906101000a900460ff1661202b576001600f6000878785818110611f9657611f9561363f565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16858583818110611fec57611feb61363f565b5b905060200201357f60a71155ef46ccb54dcf7272c207d5c8115509a8f30aa6c09b8fc4cbbe3fa486426040516120229190612e91565b60405180910390a35b80806120369061366e565b915050611f34565b50816007600082825461205191906132e1565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a791906132e1565b9250508190555081600b60008282546120c091906132e1565b92505081905550813373ffffffffffffffffffffffffffffffffffffffff167fc804beabd6deef69632486188d3b1a0fc6837d20bf348393884d368fa5bf10cd4260405161210e9190612e91565b60405180910390a350505050565b7f000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d81565b3361214a816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612196816106ee565b600860008282546121a791906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816007600082825461220491906132e1565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461225a91906132e1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016122c0939291906136b7565b6020604051808303816000875af11580156122df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123039190613572565b505050565b600d5481565b600c5481565b8061231e816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061236a816106ee565b6008600082825461237b91906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600760008282546123d891906132e1565b9250508190555082600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242e91906132e1565b92505081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612494939291906136b7565b6020604051808303816000875af11580156124b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d79190613572565b50505050565b6124e56128e0565b73ffffffffffffffffffffffffffffffffffffffff16612503611587565b73ffffffffffffffffffffffffffffffffffffffff1614612559576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255090613394565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016125b692919061351d565b6020604051808303816000875af11580156125d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f99190613572565b5050565b60045481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b7f00000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c7281565b61265b6128e0565b73ffffffffffffffffffffffffffffffffffffffff16612679611587565b73ffffffffffffffffffffffffffffffffffffffff16146126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690613394565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561273f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273690613952565b60405180910390fd5b61274881612a2c565b50565b33612755816106ee565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127a1816106ee565b600860008282546127b291906132e1565b9250508190555042600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d591906132e1565b925050819055505050565b600033905090565b6128f0611051565b61292f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292690613400565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129726128e0565b60405161297f9190613114565b60405180910390a1565b612991611051565b156129d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c89061373a565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612a156128e0565b604051612a229190613114565b60405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b718363a9059cbb60e01b8484604051602401612b0f92919061351d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b76565b505050565b6000612bd8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c3d9092919063ffffffff16565b9050600081511115612c385780806020019051810190612bf89190613572565b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e906139e4565b60405180910390fd5b5b505050565b6060612c4c8484600085612c55565b90509392505050565b606082471015612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190613a76565b60405180910390fd5b612ca385612d69565b612ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd990613ae2565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612d0b9190613b7c565b60006040518083038185875af1925050503d8060008114612d48576040519150601f19603f3d011682016040523d82523d6000602084013e612d4d565b606091505b5091509150612d5d828286612d7c565b92505050949350505050565b600080823b905060008111915050919050565b60608315612d8c57829050612ddc565b600083511115612d9f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd39190613be8565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e1882612ded565b9050919050565b612e2881612e0d565b8114612e3357600080fd5b50565b600081359050612e4581612e1f565b92915050565b600060208284031215612e6157612e60612de3565b5b6000612e6f84828501612e36565b91505092915050565b6000819050919050565b612e8b81612e78565b82525050565b6000602082019050612ea66000830184612e82565b92915050565b612eb581612e78565b8114612ec057600080fd5b50565b600081359050612ed281612eac565b92915050565b600060208284031215612eee57612eed612de3565b5b6000612efc84828501612ec3565b91505092915050565b60008115159050919050565b612f1a81612f05565b82525050565b6000602082019050612f356000830184612f11565b92915050565b6000819050919050565b6000612f60612f5b612f5684612ded565b612f3b565b612ded565b9050919050565b6000612f7282612f45565b9050919050565b6000612f8482612f67565b9050919050565b612f9481612f79565b82525050565b6000602082019050612faf6000830184612f8b565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612fda57612fd9612fb5565b5b8235905067ffffffffffffffff811115612ff757612ff6612fba565b5b60208301915083602082028301111561301357613012612fbf565b5b9250929050565b60008083601f8401126130305761302f612fb5565b5b8235905067ffffffffffffffff81111561304d5761304c612fba565b5b60208301915083602082028301111561306957613068612fbf565b5b9250929050565b60008060008060006060868803121561308c5761308b612de3565b5b600086013567ffffffffffffffff8111156130aa576130a9612de8565b5b6130b688828901612fc4565b9550955050602086013567ffffffffffffffff8111156130d9576130d8612de8565b5b6130e58882890161301a565b935093505060406130f888828901612ec3565b9150509295509295909350565b61310e81612e0d565b82525050565b60006020820190506131296000830184613105565b92915050565b6000806020838503121561314657613145612de3565b5b600083013567ffffffffffffffff81111561316457613163612de8565b5b61317085828601612fc4565b92509250509250929050565b600061318782612f67565b9050919050565b6131978161317c565b82525050565b60006020820190506131b2600083018461318e565b92915050565b600080604083850312156131cf576131ce612de3565b5b60006131dd85828601612ec3565b92505060206131ee85828601612e36565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061323282612e78565b915061323d83612e78565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613276576132756131f8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006132bb82612e78565b91506132c683612e78565b9250826132d6576132d5613281565b5b828204905092915050565b60006132ec82612e78565b91506132f783612e78565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332c5761332b6131f8565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061337e602083613337565b915061338982613348565b602082019050919050565b600060208201905081810360008301526133ad81613371565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006133ea601483613337565b91506133f5826133b4565b602082019050919050565b60006020820190508181036000830152613419816133dd565b9050919050565b7f436c61696d206475726174696f6e2073686f756c64206265206772656174657260008201527f207468616e203000000000000000000000000000000000000000000000000000602082015250565b600061347c602783613337565b915061348782613420565b604082019050919050565b600060208201905081810360008301526134ab8161346f565b9050919050565b60006040820190506134c76000830185612e82565b6134d46020830184612e82565b9392505050565b6000815190506134ea81612eac565b92915050565b60006020828403121561350657613505612de3565b5b6000613514848285016134db565b91505092915050565b60006040820190506135326000830185613105565b61353f6020830184612e82565b9392505050565b61354f81612f05565b811461355a57600080fd5b50565b60008151905061356c81613546565b92915050565b60006020828403121561358857613587612de3565b5b60006135968482850161355d565b91505092915050565b7f776974686472617720616d6f756e74206f766572207374616b65000000000000600082015250565b60006135d5601a83613337565b91506135e08261359f565b602082019050919050565b60006020820190508181036000830152613604816135c8565b9050919050565b600061361682612e78565b915061362183612e78565b925082821015613634576136336131f8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061367982612e78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136ac576136ab6131f8565b5b600182019050919050565b60006060820190506136cc6000830186613105565b6136d96020830185613105565b6136e66040830184612e82565b949350505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613724601083613337565b915061372f826136ee565b602082019050919050565b6000602082019050818103600083015261375381613717565b9050919050565b7f436c61696d61626c6520706572696f642069732066696e697368656400000000600082015250565b6000613790601c83613337565b915061379b8261375a565b602082019050919050565b600060208201905081810360008301526137bf81613783565b9050919050565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b60006137fc601083613337565b9150613807826137c6565b602082019050919050565b6000602082019050818103600083015261382b816137ef565b9050919050565b60008151905061384181612e1f565b92915050565b60006020828403121561385d5761385c612de3565b5b600061386b84828501613832565b91505092915050565b7f4e4f545f4c4c5f4f574e45520000000000000000000000000000000000000000600082015250565b60006138aa600c83613337565b91506138b582613874565b602082019050919050565b600060208201905081810360008301526138d98161389d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393c602683613337565b9150613947826138e0565b604082019050919050565b6000602082019050818103600083015261396b8161392f565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006139ce602a83613337565b91506139d982613972565b604082019050919050565b600060208201905081810360008301526139fd816139c1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613a60602683613337565b9150613a6b82613a04565b604082019050919050565b60006020820190508181036000830152613a8f81613a53565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613acc601d83613337565b9150613ad782613a96565b602082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015613b36578082015181840152602081019050613b1b565b83811115613b45576000848401525b50505050565b6000613b5682613b02565b613b608185613b0d565b9350613b70818560208601613b18565b80840191505092915050565b6000613b888284613b4b565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b6000613bba82613b93565b613bc48185613337565b9350613bd4818560208601613b18565b613bdd81613b9e565b840191505092915050565b60006020820190508181036000830152613c028184613baf565b90509291505056fea26469706673582212204d00d206529dfc7177e74863b24a1f1d74ef1de1d44e0b72a2ed846e7a708fc164736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb5551000000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c72000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d0000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510
-----Decoded View---------------
Arg [0] : _metalTokenAddress (address): 0xFcbE615dEf610E806BB64427574A2c5c1fB55510
Arg [1] : _alphaContractAddress (address): 0x61028F622CB6618cAC3DeB9ef0f0D5B9c6369C72
Arg [2] : _betaContractAddress (address): 0x372405A6d95628Ad14518BfE05165D397f43dE1D
Arg [3] : _BETA_DISTRIBUTION_AMOUNT (uint256): 25000000000000000000
Arg [4] : _stakingToken (address): 0xFcbE615dEf610E806BB64427574A2c5c1fB55510
Arg [5] : _rewardsToken (address): 0xFcbE615dEf610E806BB64427574A2c5c1fB55510
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510
Arg [1] : 00000000000000000000000061028f622cb6618cac3deb9ef0f0d5b9c6369c72
Arg [2] : 000000000000000000000000372405a6d95628ad14518bfe05165d397f43de1d
Arg [3] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [4] : 000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510
Arg [5] : 000000000000000000000000fcbe615def610e806bb64427574a2c5c1fb55510
Deployed Bytecode Sourcemap
51734:9135:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57940:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54172:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51965:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60241:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60510:183;;;:::i;:::-;;52046:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59362:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52589:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59656:193;;;:::i;:::-;;52013:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51916:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52535:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57514:119;;;:::i;:::-;;41117:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54522:78;;;:::i;:::-;;52226:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52366:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60342:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43908:103;;;:::i;:::-;;51815:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60059:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51848:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52131:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57701:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58860:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43257:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54614:1119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55741:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52315:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58383:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52497:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52462:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58611:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60742:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51881:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51782;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52426:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52269:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44166:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59857:191;;;:::i;:::-;;57940:224;57994:4;58140:7;:16;58148:7;58140:16;;;;;;;;;;;;;;;;58117:4;58071:43;58086:18;:27;58105:7;58086:27;;;;;;;;;;;;;;;;58071:14;:43::i;:::-;58032:9;:18;58042:7;58032:18;;;;;;;;;;;;;;;;:83;;;;:::i;:::-;:89;;;;:::i;:::-;58031:125;;;;:::i;:::-;58011:145;;57940:224;;;:::o;54172:342::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41720:8:::1;:6;:8::i;:::-;41712:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;54292:1:::2;54275:14;:18;54267:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54366:14;54350:13;:30;;;;54408:15;54391:14;:32;;;;54436:10;:8;:10::i;:::-;54464:42;54475:14;54491;;54464:42;;;;;;;:::i;:::-;;;;;;;;54172:342:::0;:::o;51965:39::-;;;;;;;;;;;;;;;;;:::o;60241:93::-;60287:7;60314:12;;60307:19;;60241:93;:::o;60510:183::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60569:19:::1;60591:12;;;;;;;;;;;:22;;;60622:4;60591:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60569:59;;60639:12;;;;;;;;;;;:21;;;60661:10;60673:11;60639:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60558:135;60510:183::o:0;52046:25::-;;;;:::o;59362:286::-;59416:10;58241:15;58248:7;58241:6;:15::i;:::-;58222:7;:16;58230:7;58222:16;;;;;;;;;;;;;;;:34;;;;58284:15;58291:7;58284:6;:15::i;:::-;58267:13;;:32;;;;;;;:::i;:::-;;;;;;;;58340:15;58310:18;:27;58329:7;58310:27;;;;;;;;;;;;;;;:45;;;;59458:9:::1;:21;59468:10;59458:21;;;;;;;;;;;;;;;;59447:7;:32;;59439:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59537:7;59521:12;;:23;;;;;;;:::i;:::-;;;;;;;;59580:7;59555:9;:21;59565:10;59555:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;59598:12;;;;;;;;;;;:21;;;59620:10;59632:7;59598:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59362:286:::0;;:::o;52589:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;59656:193::-;59699:10;58241:15;58248:7;58241:6;:15::i;:::-;58222:7;:16;58230:7;58222:16;;;;;;;;;;;;;;;:34;;;;58284:15;58291:7;58284:6;:15::i;:::-;58267:13;;:32;;;;;;;:::i;:::-;;;;;;;;58340:15;58310:18;:27;58329:7;58310:27;;;;;;;;;;;;;;;:45;;;;59722:11:::1;59736:7;:19;59744:10;59736:19;;;;;;;;;;;;;;;;59722:33;;59788:1;59766:7;:19;59774:10;59766:19;;;;;;;;;;;;;;;:23;;;;59800:12;;;;;;;;;;;:21;;;59822:10;59834:6;59800:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59711:138;59656:193:::0;:::o;52013:24::-;;;;:::o;51916:40::-;;;;;;;;;;;;;:::o;52535:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;57514:119::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57605:20:::1;;;;;;;;;;;57604:21;57581:20;;:44;;;;;;;;;;;;;;;;;;57514:119::o:0;41117:86::-;41164:4;41188:7;;;;;;;;;;;41181:14;;41117:86;:::o;54522:78::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54584:8:::1;:6;:8::i;:::-;54522:78::o:0;52226:34::-;;;:::o;52366:49::-;;;:::o;60342:112::-;60401:7;60428:9;:18;60438:7;60428:18;;;;;;;;;;;;;;;;60421:25;;60342:112;;;:::o;43908:103::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43973:30:::1;44000:1;43973:18;:30::i;:::-;43908:103::o:0;51815:26::-;;;;;;;;;;;;;:::o;60059:113::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60151:13:::1;60138:10;:26;;;;60059:113:::0;:::o;51848:26::-;;;;:::o;52131:53::-;;;;;;;;;;;;;;;;;:::o;57701:231::-;57764:4;57811:1;57795:12;;:17;57791:58;;;57836:1;57829:8;;;;57791:58;57911:10;;57899:8;57881:15;:26;;;;:::i;:::-;57880:41;;;;:::i;:::-;57859:64;;57701:231;;;;:::o;58860:492::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58998:9:::1;58993:272;59017:8;;:15;;59013:1;:19;58993:272;;;59050:15;59086:9;;59096:1;59086:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59076:22;;59139:15;59109:18;:27;59128:7;59109:27;;;;;;;;;;;;;;;:45;;;;59181:8;;59190:1;59181:11;;;;;;;:::i;:::-;;;;;;;;59165:12;;:27;;;;;;;:::i;:::-;;;;;;;;59230:8;;59239:1;59230:11;;;;;;;:::i;:::-;;;;;;;;59203:9;:23;59213:9;;59223:1;59213:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59203:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;59039:226;59034:3;;;;;:::i;:::-;;;;58993:272;;;;59275:12;;;;;;;;;;;:25;;;59301:10;59321:4;59328:11;59275:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58860:492:::0;;;;;:::o;43257:87::-;43303:7;43330:6;;;;;;;;;;;43323:13;;43257:87;:::o;54614:1119::-;41443:8;:6;:8::i;:::-;41442:9;41434:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54729:14:::1;;54710:15;:33;;:85;;;;;54782:13;;54765:14;;:30;;;;:::i;:::-;54747:15;:48;54710:85;54702:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;54878:1;54848:5;:15;;;54864:10;54848:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;54839:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54950:1;54921:4;:14;;;54936:10;54921:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;54912:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54991:9;54986:139;55010:9;;:16;;55006:1;:20;54986:139;;;55086:10;55056:40;;:4;:12;;;55069:9;;55079:1;55069:12;;;;;;;:::i;:::-;;;;;;;;55056:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;55048:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55028:3;;;;;:::i;:::-;;;;54986:139;;;;55137:21;55169:22:::0;55259:24:::1;55240:9;;:16;;:43;;;;:::i;:::-;55285:1;55204:83;;;;;;;;55305:9;55300:250;55324:9;;:16;;55320:1;:20;55300:250;;;55366:11;:25;55378:9;;55388:1;55378:12;;;;;;;:::i;:::-;;;;;;;;55366:25;;;;;;;;;;;;;;;;;;;;;55362:177;;55441:4;55413:11;:25;55425:9;;55435:1;55425:12;;;;;;;:::i;:::-;;;;;;;;55413:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55495:10;55469:54;;55481:9;;55491:1;55481:12;;;;;;;:::i;:::-;;;;;;;;55469:54;55507:15;55469:54;;;;;;:::i;:::-;;;;;;;;55362:177;55342:3;;;;;:::i;:::-;;;;55300:250;;;;55566:50;55590:10;55602:13;55566:10;:23;;;;:50;;;;;:::i;:::-;55645:13;55629:12;;:29;;;;;;;:::i;:::-;;;;;;;;55694:13;55682:10;55674:51;;;55709:15;55674:51;;;;;;:::i;:::-;;;;;;;;54691:1042;;54614:1119:::0;;:::o;55741:1151::-;41443:8;:6;:8::i;:::-;41442:9;41434:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;55863:14:::1;;55844:15;:33;;:85;;;;;55916:13;;55899:14;;:30;;;;:::i;:::-;55881:15;:48;55844:85;55836:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;56012:1;55982:5;:15;;;55998:10;55982:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:31;55973:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56084:1;56055:4;:14;;;56070:10;56055:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;56046:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56125:9;56120:139;56144:9;;:16;;56140:1;:20;56120:139;;;56220:10;56190:40;;:4;:12;;;56203:9;;56213:1;56203:12;;;;;;;:::i;:::-;;;;;;;;56190:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;56182:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56162:3;;;;;:::i;:::-;;;;56120:139;;;;56271:21;56303:22:::0;56393:24:::1;56374:9;;:16;;:43;;;;:::i;:::-;56419:1;56338:83;;;;;;;;56439:9;56434:250;56458:9;;:16;;56454:1;:20;56434:250;;;56500:11;:25;56512:9;;56522:1;56512:12;;;;;;;:::i;:::-;;;;;;;;56500:25;;;;;;;;;;;;;;;;;;;;;56496:177;;56575:4;56547:11;:25;56559:9;;56569:1;56559:12;;;;;;;:::i;:::-;;;;;;;;56547:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;56629:10;56603:54;;56615:9;;56625:1;56615:12;;;;;;;:::i;:::-;;;;;;;;56603:54;56641:15;56603:54;;;;;;:::i;:::-;;;;;;;;56496:177;56476:3;;;;;:::i;:::-;;;;56434:250;;;;56712:13;56696:12;;:29;;;;;;;:::i;:::-;;;;;;;;56762:13;56737:9;:21;56747:10;56737:21;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;56804:13;56788:12;;:29;;;;;;;:::i;:::-;;;;;;;;56853:13;56841:10;56833:51;;;56868:15;56833:51;;;;;;:::i;:::-;;;;;;;;55825:1067;;55741:1151:::0;;:::o;52315:38::-;;;:::o;58383:220::-;58434:10;58241:15;58248:7;58241:6;:15::i;:::-;58222:7;:16;58230:7;58222:16;;;;;;;;;;;;;;;:34;;;;58284:15;58291:7;58284:6;:15::i;:::-;58267:13;;:32;;;;;;;:::i;:::-;;;;;;;;58340:15;58310:18;:27;58329:7;58310:27;;;;;;;;;;;;;;;:45;;;;58473:7:::1;58457:12;;:23;;;;;;;:::i;:::-;;;;;;;;58516:7;58491:9;:21;58501:10;58491:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;58534:12;;;;;;;;;;;:25;;;58560:10;58580:4;58587:7;58534:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58383:220:::0;;:::o;52497:29::-;;;;:::o;52462:28::-;;;;:::o;58611:239::-;58687:7;58241:15;58248:7;58241:6;:15::i;:::-;58222:7;:16;58230:7;58222:16;;;;;;;;;;;;;;;:34;;;;58284:15;58291:7;58284:6;:15::i;:::-;58267:13;;:32;;;;;;;:::i;:::-;;;;;;;;58340:15;58310:18;:27;58329:7;58310:27;;;;;;;;;;;;;;;:45;;;;58723:7:::1;58707:12;;:23;;;;;;;:::i;:::-;;;;;;;;58763:7;58741:9;:18;58751:7;58741:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;58781:12;;;;;;;;;;;:25;;;58807:10;58827:4;58834:7;58781:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58611:239:::0;;;:::o;60742:122::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60814:12:::1;;;;;;;;;;;:21;;;60836:10;60848:7;60814:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60742:122:::0;:::o;51881:26::-;;;;:::o;51782:::-;;;;;;;;;;;;;:::o;52426:27::-;;;;:::o;52269:39::-;;;:::o;44166:201::-;43488:12;:10;:12::i;:::-;43477:23;;:7;:5;:7::i;:::-;:23;;;43469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44275:1:::1;44255:22;;:8;:22;;;;44247:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44331:28;44350:8;44331:18;:28::i;:::-;44166:201:::0;:::o;59857:191::-;59907:10;58241:15;58248:7;58241:6;:15::i;:::-;58222:7;:16;58230:7;58222:16;;;;;;;;;;;;;;;:34;;;;58284:15;58291:7;58284:6;:15::i;:::-;58267:13;;:32;;;;;;;:::i;:::-;;;;;;;;58340:15;58310:18;:27;58329:7;58310:27;;;;;;;;;;;;;;;:45;;;;59930:11:::1;59944:7;:19;59952:10;59944:19;;;;;;;;;;;;;;;;59930:33;;59996:1;59974:7;:19;59982:10;59974:19;;;;;;;;;;;;;;;:23;;;;60034:6;60009:9;:21;60019:10;60009:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;59919:129;59857:191:::0;:::o;4292:98::-;4345:7;4372:10;4365:17;;4292:98;:::o;42176:120::-;41720:8;:6;:8::i;:::-;41712:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42245:5:::1;42235:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;42266:22;42275:12;:10;:12::i;:::-;42266:22;;;;;;:::i;:::-;;;;;;;;42176:120::o:0;41917:118::-;41443:8;:6;:8::i;:::-;41442:9;41434:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;41987:4:::1;41977:7;;:14;;;;;;;;;;;;;;;;;;42007:20;42014:12;:10;:12::i;:::-;42007:20;;;;;;:::i;:::-;;;;;;;;41917:118::o:0;44527:191::-;44601:16;44620:6;;;;;;;;;;;44601:25;;44646:8;44637:6;;:17;;;;;;;;;;;;;;;;;;44701:8;44670:40;;44691:8;44670:40;;;;;;;;;;;;44590:128;44527:191;:::o;34023:211::-;34140:86;34160:5;34190:23;;;34215:2;34219:5;34167:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34140:19;:86::i;:::-;34023:211;;;:::o;36596:716::-;37020:23;37046:69;37074:4;37046:69;;;;;;;;;;;;;;;;;37054:5;37046:27;;;;:69;;;;;:::i;:::-;37020:95;;37150:1;37130:10;:17;:21;37126:179;;;37227:10;37216:30;;;;;;;;;;;;:::i;:::-;37208:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37126:179;36666:646;36596:716;;:::o;8024:229::-;8161:12;8193:52;8215:6;8223:4;8229:1;8232:12;8193:21;:52::i;:::-;8186:59;;8024:229;;;;;:::o;9144:510::-;9314:12;9372:5;9347:21;:30;;9339:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;9439:18;9450:6;9439:10;:18::i;:::-;9431:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;9505:12;9519:23;9546:6;:11;;9565:5;9572:4;9546:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9504:73;;;;9595:51;9612:7;9621:10;9633:12;9595:16;:51::i;:::-;9588:58;;;;9144:510;;;;;;:::o;5218:387::-;5278:4;5486:12;5553:7;5541:20;5533:28;;5596:1;5589:4;:8;5582:15;;;5218:387;;;:::o;11830:712::-;11980:12;12009:7;12005:530;;;12040:10;12033:17;;;;12005:530;12174:1;12154:10;:17;:21;12150:374;;;12352:10;12346:17;12413:15;12400:10;12396:2;12392:19;12385:44;12150:374;12495:12;12488:20;;;;;;;;;;;:::i;:::-;;;;;;;;11830:712;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:90::-;2253:7;2296:5;2289:13;2282:21;2271:32;;2219:90;;;:::o;2315:109::-;2396:21;2411:5;2396:21;:::i;:::-;2391:3;2384:34;2315:109;;:::o;2430:210::-;2517:4;2555:2;2544:9;2540:18;2532:26;;2568:65;2630:1;2619:9;2615:17;2606:6;2568:65;:::i;:::-;2430:210;;;;:::o;2646:60::-;2674:3;2695:5;2688:12;;2646:60;;;:::o;2712:142::-;2762:9;2795:53;2813:34;2822:24;2840:5;2822:24;:::i;:::-;2813:34;:::i;:::-;2795:53;:::i;:::-;2782:66;;2712:142;;;:::o;2860:126::-;2910:9;2943:37;2974:5;2943:37;:::i;:::-;2930:50;;2860:126;;;:::o;2992:141::-;3057:9;3090:37;3121:5;3090:37;:::i;:::-;3077:50;;2992:141;;;:::o;3139:161::-;3241:52;3287:5;3241:52;:::i;:::-;3236:3;3229:65;3139:161;;:::o;3306:252::-;3414:4;3452:2;3441:9;3437:18;3429:26;;3465:86;3548:1;3537:9;3533:17;3524:6;3465:86;:::i;:::-;3306:252;;;;:::o;3564:117::-;3673:1;3670;3663:12;3687:117;3796:1;3793;3786:12;3810:117;3919:1;3916;3909:12;3950:568;4023:8;4033:6;4083:3;4076:4;4068:6;4064:17;4060:27;4050:122;;4091:79;;:::i;:::-;4050:122;4204:6;4191:20;4181:30;;4234:18;4226:6;4223:30;4220:117;;;4256:79;;:::i;:::-;4220:117;4370:4;4362:6;4358:17;4346:29;;4424:3;4416:4;4408:6;4404:17;4394:8;4390:32;4387:41;4384:128;;;4431:79;;:::i;:::-;4384:128;3950:568;;;;;:::o;4541:::-;4614:8;4624:6;4674:3;4667:4;4659:6;4655:17;4651:27;4641:122;;4682:79;;:::i;:::-;4641:122;4795:6;4782:20;4772:30;;4825:18;4817:6;4814:30;4811:117;;;4847:79;;:::i;:::-;4811:117;4961:4;4953:6;4949:17;4937:29;;5015:3;5007:4;4999:6;4995:17;4985:8;4981:32;4978:41;4975:128;;;5022:79;;:::i;:::-;4975:128;4541:568;;;;;:::o;5115:1079::-;5246:6;5254;5262;5270;5278;5327:2;5315:9;5306:7;5302:23;5298:32;5295:119;;;5333:79;;:::i;:::-;5295:119;5481:1;5470:9;5466:17;5453:31;5511:18;5503:6;5500:30;5497:117;;;5533:79;;:::i;:::-;5497:117;5646:80;5718:7;5709:6;5698:9;5694:22;5646:80;:::i;:::-;5628:98;;;;5424:312;5803:2;5792:9;5788:18;5775:32;5834:18;5826:6;5823:30;5820:117;;;5856:79;;:::i;:::-;5820:117;5969:80;6041:7;6032:6;6021:9;6017:22;5969:80;:::i;:::-;5951:98;;;;5746:313;6098:2;6124:53;6169:7;6160:6;6149:9;6145:22;6124:53;:::i;:::-;6114:63;;6069:118;5115:1079;;;;;;;;:::o;6200:118::-;6287:24;6305:5;6287:24;:::i;:::-;6282:3;6275:37;6200:118;;:::o;6324:222::-;6417:4;6455:2;6444:9;6440:18;6432:26;;6468:71;6536:1;6525:9;6521:17;6512:6;6468:71;:::i;:::-;6324:222;;;;:::o;6552:559::-;6638:6;6646;6695:2;6683:9;6674:7;6670:23;6666:32;6663:119;;;6701:79;;:::i;:::-;6663:119;6849:1;6838:9;6834:17;6821:31;6879:18;6871:6;6868:30;6865:117;;;6901:79;;:::i;:::-;6865:117;7014:80;7086:7;7077:6;7066:9;7062:22;7014:80;:::i;:::-;6996:98;;;;6792:312;6552:559;;;;;:::o;7117:151::-;7192:9;7225:37;7256:5;7225:37;:::i;:::-;7212:50;;7117:151;;;:::o;7274:181::-;7386:62;7442:5;7386:62;:::i;:::-;7381:3;7374:75;7274:181;;:::o;7461:272::-;7579:4;7617:2;7606:9;7602:18;7594:26;;7630:96;7723:1;7712:9;7708:17;7699:6;7630:96;:::i;:::-;7461:272;;;;:::o;7739:474::-;7807:6;7815;7864:2;7852:9;7843:7;7839:23;7835:32;7832:119;;;7870:79;;:::i;:::-;7832:119;7990:1;8015:53;8060:7;8051:6;8040:9;8036:22;8015:53;:::i;:::-;8005:63;;7961:117;8117:2;8143:53;8188:7;8179:6;8168:9;8164:22;8143:53;:::i;:::-;8133:63;;8088:118;7739:474;;;;;:::o;8219:180::-;8267:77;8264:1;8257:88;8364:4;8361:1;8354:15;8388:4;8385:1;8378:15;8405:348;8445:7;8468:20;8486:1;8468:20;:::i;:::-;8463:25;;8502:20;8520:1;8502:20;:::i;:::-;8497:25;;8690:1;8622:66;8618:74;8615:1;8612:81;8607:1;8600:9;8593:17;8589:105;8586:131;;;8697:18;;:::i;:::-;8586:131;8745:1;8742;8738:9;8727:20;;8405:348;;;;:::o;8759:180::-;8807:77;8804:1;8797:88;8904:4;8901:1;8894:15;8928:4;8925:1;8918:15;8945:185;8985:1;9002:20;9020:1;9002:20;:::i;:::-;8997:25;;9036:20;9054:1;9036:20;:::i;:::-;9031:25;;9075:1;9065:35;;9080:18;;:::i;:::-;9065:35;9122:1;9119;9115:9;9110:14;;8945:185;;;;:::o;9136:305::-;9176:3;9195:20;9213:1;9195:20;:::i;:::-;9190:25;;9229:20;9247:1;9229:20;:::i;:::-;9224:25;;9383:1;9315:66;9311:74;9308:1;9305:81;9302:107;;;9389:18;;:::i;:::-;9302:107;9433:1;9430;9426:9;9419:16;;9136:305;;;;:::o;9447:169::-;9531:11;9565:6;9560:3;9553:19;9605:4;9600:3;9596:14;9581:29;;9447:169;;;;:::o;9622:182::-;9762:34;9758:1;9750:6;9746:14;9739:58;9622:182;:::o;9810:366::-;9952:3;9973:67;10037:2;10032:3;9973:67;:::i;:::-;9966:74;;10049:93;10138:3;10049:93;:::i;:::-;10167:2;10162:3;10158:12;10151:19;;9810:366;;;:::o;10182:419::-;10348:4;10386:2;10375:9;10371:18;10363:26;;10435:9;10429:4;10425:20;10421:1;10410:9;10406:17;10399:47;10463:131;10589:4;10463:131;:::i;:::-;10455:139;;10182:419;;;:::o;10607:170::-;10747:22;10743:1;10735:6;10731:14;10724:46;10607:170;:::o;10783:366::-;10925:3;10946:67;11010:2;11005:3;10946:67;:::i;:::-;10939:74;;11022:93;11111:3;11022:93;:::i;:::-;11140:2;11135:3;11131:12;11124:19;;10783:366;;;:::o;11155:419::-;11321:4;11359:2;11348:9;11344:18;11336:26;;11408:9;11402:4;11398:20;11394:1;11383:9;11379:17;11372:47;11436:131;11562:4;11436:131;:::i;:::-;11428:139;;11155:419;;;:::o;11580:226::-;11720:34;11716:1;11708:6;11704:14;11697:58;11789:9;11784:2;11776:6;11772:15;11765:34;11580:226;:::o;11812:366::-;11954:3;11975:67;12039:2;12034:3;11975:67;:::i;:::-;11968:74;;12051:93;12140:3;12051:93;:::i;:::-;12169:2;12164:3;12160:12;12153:19;;11812:366;;;:::o;12184:419::-;12350:4;12388:2;12377:9;12373:18;12365:26;;12437:9;12431:4;12427:20;12423:1;12412:9;12408:17;12401:47;12465:131;12591:4;12465:131;:::i;:::-;12457:139;;12184:419;;;:::o;12609:332::-;12730:4;12768:2;12757:9;12753:18;12745:26;;12781:71;12849:1;12838:9;12834:17;12825:6;12781:71;:::i;:::-;12862:72;12930:2;12919:9;12915:18;12906:6;12862:72;:::i;:::-;12609:332;;;;;:::o;12947:143::-;13004:5;13035:6;13029:13;13020:22;;13051:33;13078:5;13051:33;:::i;:::-;12947:143;;;;:::o;13096:351::-;13166:6;13215:2;13203:9;13194:7;13190:23;13186:32;13183:119;;;13221:79;;:::i;:::-;13183:119;13341:1;13366:64;13422:7;13413:6;13402:9;13398:22;13366:64;:::i;:::-;13356:74;;13312:128;13096:351;;;;:::o;13453:332::-;13574:4;13612:2;13601:9;13597:18;13589:26;;13625:71;13693:1;13682:9;13678:17;13669:6;13625:71;:::i;:::-;13706:72;13774:2;13763:9;13759:18;13750:6;13706:72;:::i;:::-;13453:332;;;;;:::o;13791:116::-;13861:21;13876:5;13861:21;:::i;:::-;13854:5;13851:32;13841:60;;13897:1;13894;13887:12;13841:60;13791:116;:::o;13913:137::-;13967:5;13998:6;13992:13;13983:22;;14014:30;14038:5;14014:30;:::i;:::-;13913:137;;;;:::o;14056:345::-;14123:6;14172:2;14160:9;14151:7;14147:23;14143:32;14140:119;;;14178:79;;:::i;:::-;14140:119;14298:1;14323:61;14376:7;14367:6;14356:9;14352:22;14323:61;:::i;:::-;14313:71;;14269:125;14056:345;;;;:::o;14407:176::-;14547:28;14543:1;14535:6;14531:14;14524:52;14407:176;:::o;14589:366::-;14731:3;14752:67;14816:2;14811:3;14752:67;:::i;:::-;14745:74;;14828:93;14917:3;14828:93;:::i;:::-;14946:2;14941:3;14937:12;14930:19;;14589:366;;;:::o;14961:419::-;15127:4;15165:2;15154:9;15150:18;15142:26;;15214:9;15208:4;15204:20;15200:1;15189:9;15185:17;15178:47;15242:131;15368:4;15242:131;:::i;:::-;15234:139;;14961:419;;;:::o;15386:191::-;15426:4;15446:20;15464:1;15446:20;:::i;:::-;15441:25;;15480:20;15498:1;15480:20;:::i;:::-;15475:25;;15519:1;15516;15513:8;15510:34;;;15524:18;;:::i;:::-;15510:34;15569:1;15566;15562:9;15554:17;;15386:191;;;;:::o;15583:180::-;15631:77;15628:1;15621:88;15728:4;15725:1;15718:15;15752:4;15749:1;15742:15;15769:233;15808:3;15831:24;15849:5;15831:24;:::i;:::-;15822:33;;15877:66;15870:5;15867:77;15864:103;;;15947:18;;:::i;:::-;15864:103;15994:1;15987:5;15983:13;15976:20;;15769:233;;;:::o;16008:442::-;16157:4;16195:2;16184:9;16180:18;16172:26;;16208:71;16276:1;16265:9;16261:17;16252:6;16208:71;:::i;:::-;16289:72;16357:2;16346:9;16342:18;16333:6;16289:72;:::i;:::-;16371;16439:2;16428:9;16424:18;16415:6;16371:72;:::i;:::-;16008:442;;;;;;:::o;16456:166::-;16596:18;16592:1;16584:6;16580:14;16573:42;16456:166;:::o;16628:366::-;16770:3;16791:67;16855:2;16850:3;16791:67;:::i;:::-;16784:74;;16867:93;16956:3;16867:93;:::i;:::-;16985:2;16980:3;16976:12;16969:19;;16628:366;;;:::o;17000:419::-;17166:4;17204:2;17193:9;17189:18;17181:26;;17253:9;17247:4;17243:20;17239:1;17228:9;17224:17;17217:47;17281:131;17407:4;17281:131;:::i;:::-;17273:139;;17000:419;;;:::o;17425:178::-;17565:30;17561:1;17553:6;17549:14;17542:54;17425:178;:::o;17609:366::-;17751:3;17772:67;17836:2;17831:3;17772:67;:::i;:::-;17765:74;;17848:93;17937:3;17848:93;:::i;:::-;17966:2;17961:3;17957:12;17950:19;;17609:366;;;:::o;17981:419::-;18147:4;18185:2;18174:9;18170:18;18162:26;;18234:9;18228:4;18224:20;18220:1;18209:9;18205:17;18198:47;18262:131;18388:4;18262:131;:::i;:::-;18254:139;;17981:419;;;:::o;18406:166::-;18546:18;18542:1;18534:6;18530:14;18523:42;18406:166;:::o;18578:366::-;18720:3;18741:67;18805:2;18800:3;18741:67;:::i;:::-;18734:74;;18817:93;18906:3;18817:93;:::i;:::-;18935:2;18930:3;18926:12;18919:19;;18578:366;;;:::o;18950:419::-;19116:4;19154:2;19143:9;19139:18;19131:26;;19203:9;19197:4;19193:20;19189:1;19178:9;19174:17;19167:47;19231:131;19357:4;19231:131;:::i;:::-;19223:139;;18950:419;;;:::o;19375:143::-;19432:5;19463:6;19457:13;19448:22;;19479:33;19506:5;19479:33;:::i;:::-;19375:143;;;;:::o;19524:351::-;19594:6;19643:2;19631:9;19622:7;19618:23;19614:32;19611:119;;;19649:79;;:::i;:::-;19611:119;19769:1;19794:64;19850:7;19841:6;19830:9;19826:22;19794:64;:::i;:::-;19784:74;;19740:128;19524:351;;;;:::o;19881:162::-;20021:14;20017:1;20009:6;20005:14;19998:38;19881:162;:::o;20049:366::-;20191:3;20212:67;20276:2;20271:3;20212:67;:::i;:::-;20205:74;;20288:93;20377:3;20288:93;:::i;:::-;20406:2;20401:3;20397:12;20390:19;;20049:366;;;:::o;20421:419::-;20587:4;20625:2;20614:9;20610:18;20602:26;;20674:9;20668:4;20664:20;20660:1;20649:9;20645:17;20638:47;20702:131;20828:4;20702:131;:::i;:::-;20694:139;;20421:419;;;:::o;20846:225::-;20986:34;20982:1;20974:6;20970:14;20963:58;21055:8;21050:2;21042:6;21038:15;21031:33;20846:225;:::o;21077:366::-;21219:3;21240:67;21304:2;21299:3;21240:67;:::i;:::-;21233:74;;21316:93;21405:3;21316:93;:::i;:::-;21434:2;21429:3;21425:12;21418:19;;21077:366;;;:::o;21449:419::-;21615:4;21653:2;21642:9;21638:18;21630:26;;21702:9;21696:4;21692:20;21688:1;21677:9;21673:17;21666:47;21730:131;21856:4;21730:131;:::i;:::-;21722:139;;21449:419;;;:::o;21874:229::-;22014:34;22010:1;22002:6;21998:14;21991:58;22083:12;22078:2;22070:6;22066:15;22059:37;21874:229;:::o;22109:366::-;22251:3;22272:67;22336:2;22331:3;22272:67;:::i;:::-;22265:74;;22348:93;22437:3;22348:93;:::i;:::-;22466:2;22461:3;22457:12;22450:19;;22109:366;;;:::o;22481:419::-;22647:4;22685:2;22674:9;22670:18;22662:26;;22734:9;22728:4;22724:20;22720:1;22709:9;22705:17;22698:47;22762:131;22888:4;22762:131;:::i;:::-;22754:139;;22481:419;;;:::o;22906:225::-;23046:34;23042:1;23034:6;23030:14;23023:58;23115:8;23110:2;23102:6;23098:15;23091:33;22906:225;:::o;23137:366::-;23279:3;23300:67;23364:2;23359:3;23300:67;:::i;:::-;23293:74;;23376:93;23465:3;23376:93;:::i;:::-;23494:2;23489:3;23485:12;23478:19;;23137:366;;;:::o;23509:419::-;23675:4;23713:2;23702:9;23698:18;23690:26;;23762:9;23756:4;23752:20;23748:1;23737:9;23733:17;23726:47;23790:131;23916:4;23790:131;:::i;:::-;23782:139;;23509:419;;;:::o;23934:179::-;24074:31;24070:1;24062:6;24058:14;24051:55;23934:179;:::o;24119:366::-;24261:3;24282:67;24346:2;24341:3;24282:67;:::i;:::-;24275:74;;24358:93;24447:3;24358:93;:::i;:::-;24476:2;24471:3;24467:12;24460:19;;24119:366;;;:::o;24491:419::-;24657:4;24695:2;24684:9;24680:18;24672:26;;24744:9;24738:4;24734:20;24730:1;24719:9;24715:17;24708:47;24772:131;24898:4;24772:131;:::i;:::-;24764:139;;24491:419;;;:::o;24916:98::-;24967:6;25001:5;24995:12;24985:22;;24916:98;;;:::o;25020:147::-;25121:11;25158:3;25143:18;;25020:147;;;;:::o;25173:307::-;25241:1;25251:113;25265:6;25262:1;25259:13;25251:113;;;25350:1;25345:3;25341:11;25335:18;25331:1;25326:3;25322:11;25315:39;25287:2;25284:1;25280:10;25275:15;;25251:113;;;25382:6;25379:1;25376:13;25373:101;;;25462:1;25453:6;25448:3;25444:16;25437:27;25373:101;25222:258;25173:307;;;:::o;25486:373::-;25590:3;25618:38;25650:5;25618:38;:::i;:::-;25672:88;25753:6;25748:3;25672:88;:::i;:::-;25665:95;;25769:52;25814:6;25809:3;25802:4;25795:5;25791:16;25769:52;:::i;:::-;25846:6;25841:3;25837:16;25830:23;;25594:265;25486:373;;;;:::o;25865:271::-;25995:3;26017:93;26106:3;26097:6;26017:93;:::i;:::-;26010:100;;26127:3;26120:10;;25865:271;;;;:::o;26142:99::-;26194:6;26228:5;26222:12;26212:22;;26142:99;;;:::o;26247:102::-;26288:6;26339:2;26335:7;26330:2;26323:5;26319:14;26315:28;26305:38;;26247:102;;;:::o;26355:364::-;26443:3;26471:39;26504:5;26471:39;:::i;:::-;26526:71;26590:6;26585:3;26526:71;:::i;:::-;26519:78;;26606:52;26651:6;26646:3;26639:4;26632:5;26628:16;26606:52;:::i;:::-;26683:29;26705:6;26683:29;:::i;:::-;26678:3;26674:39;26667:46;;26447:272;26355:364;;;;:::o;26725:313::-;26838:4;26876:2;26865:9;26861:18;26853:26;;26925:9;26919:4;26915:20;26911:1;26900:9;26896:17;26889:47;26953:78;27026:4;27017:6;26953:78;:::i;:::-;26945:86;;26725:313;;;;:::o
Swarm Source
ipfs://4d00d206529dfc7177e74863b24a1f1d74ef1de1d44e0b72a2ed846e7a708fc1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.